| Микроконтролери и електроника http://mcu-bg.com/mcu_site/ |
|
| Pic16F628A и DS1307-"Часовник с Дата- НЕ тръгва. http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=13910 |
Страница 1 от 1 |
| Автор: | stefan01 [ Пет Юли 10, 2015 8:46 pm ] |
| Заглавие: | Pic16F628A и DS1307-"Часовник с Дата- НЕ тръгва. |
//DS1307 RTC Interfacing with PIC16F628A //Coded by Stefan Vasilev //Compiler: mikroC Pro v5.61 //10/07/2015 sbit LCD_RS at RB2_bit; sbit LCD_EN at RB3_bit; sbit LCD_D4 at RB4_bit; sbit LCD_D5 at RB5_bit; sbit LCD_D6 at RB6_bit; sbit LCD_D7 at RB7_bit; sbit LCD_RS_Direction at TRISB2_bit; sbit LCD_EN_Direction at TRISB3_bit; sbit LCD_D4_Direction at TRISB4_bit; sbit LCD_D5_Direction at TRISB5_bit; sbit LCD_D6_Direction at TRISB6_bit; sbit LCD_D7_Direction at TRISB7_bit; sbit Soft_I2C_Scl at RA3_bit; sbit Soft_I2C_Sda at RA4_bit; sbit Soft_I2C_Scl_Direction at TRISA3_bit; sbit Soft_I2C_Sda_Direction at TRISA4_bit; char seconds, minutes, hours, day, month, year; void Read_Time() { Soft_I2C_Start(); Soft_I2C_Write(0xD0); Soft_I2C_Write(2); Soft_I2C_Start(); Soft_I2C_Write(0xD1); seconds = Soft_I2C_Read(1); minutes = Soft_I2C_Read(1); hours = Soft_I2C_Read(1); day = Soft_I2C_Read(1); month = Soft_I2C_Read(0); Soft_I2C_Stop(); } void Transform_Time() { seconds = ((seconds & 0xF0) >> 4)*10 + (seconds & 0x0F); minutes = ((minutes & 0xF0) >> 4)*10 + (minutes & 0x0F); hours = ((hours & 0xF0) >> 4)*10 + (hours & 0x0F); year = (day & 0xC0) >> 6; day = ((day & 0x30) >> 4)*10 + (day & 0x0F); month = ((month & 0x10) >> 4)*10 + (month & 0x0F); } void Display_Time() { Lcd_Chr(1, 6, (day / 10) + 48); Lcd_Chr(1, 7, (day % 10) + 48); Lcd_Chr(1, 9, (month / 10) + 48); Lcd_Chr(1,10, (month % 10) + 48); Lcd_Chr(1,15, year + 56); Lcd_Chr(2, 6, (hours / 10) + 48); Lcd_Chr(2, 7, (hours % 10) + 48); Lcd_Chr(2, 9, (minutes / 10) + 48); Lcd_Chr(2,10, (minutes % 10) + 48); Lcd_Chr(2,12, (seconds / 10) + 48); Lcd_Chr(2,13, (seconds % 10) + 48); } void Init_Main() { CMCON = 0b11111111; TRISB = 0b00000000 ; PORTB = 0; TRISA = 0b11111111; Soft_I2C_Init(); Lcd_Init(); Lcd_Cmd(_LCD_CLEAR); Lcd_Cmd(_LCD_CURSOR_OFF); Lcd_Out(1,1,"Date:"); Lcd_Chr(1,8,':'); Lcd_Chr(1,11,':'); Lcd_Out(2,1,"Time:"); Lcd_Chr(2,8,':'); Lcd_Chr(2,11,':'); Lcd_Out(1,12,"200"); } void main() { Delay_ms(2000); Init_Main(); while (1) { Read_Time(); Transform_Time(); Display_Time(); Delay_ms(1000); } } |
|
| Автор: | speedblue [ Съб Юли 11, 2015 12:04 am ] |
| Заглавие: | Re: Pic16F628A и DS1307-"Часовник с Дата- НЕ тръгва. |
42 !!! |
|
| Автор: | ToHu [ Съб Юли 11, 2015 10:01 am ] |
| Заглавие: | Re: Pic16F628A и DS1307-"Часовник с Дата- НЕ тръгва. |
Ами да не ти гледам целия код, ам акато за начало четеш времето от грешни адреси, ако параметъра в read функцията ти е адрес от който четеш навсякъде четеш минутите а за датата четеш секундите. Хубаво е да огледаш и какво пишеш, не съм гледал челия чаршаф но ... |
|
| Автор: | pechkov [ Съб Юли 11, 2015 1:10 pm ] | ||||||||||||||||||
| Заглавие: | Re: Pic16F628A и DS1307-"Часовник с Дата- НЕ тръгва. | ||||||||||||||||||
Ако, но не е. При Read функцията тази "1" в скобите означава, че ще се иска acknowledge в края на всеки байт. Адреса се задава малко по-горе при Write, и в кода е писал 2, което според документацията на този чип - са часовете. От този регистър започва четенето, и при всяко следващо четене DS1307 връща следващия байт. Част от документацията на чипа: Table 2. Timekeeper Registers 00h = Seconds 01h = Minutes 02h = Hours 03h = Day of week 04h = Date 05h = Month 06h = Year Самата документация на DS1307 можеш да изтеглиш от този линк: DS1307_Rev5.pdf П.П. Сега видях защо е писал четене от регистър 02h. Защото е копирал кода от примерната документация на MikroC. Там е използван друг RTC чип - PCF8583, на който регистрите му са подредени по различен начин. Стефан, пробвай така:
Забележи, че "day" го чета два пъти, защото първия път ще върне "ден от седмицата" от поредния регистър, и се явява ненужна данна в твоя случай. Не си писал четене на годината, но ако ще е нужна - четеш точно след месеца. Пиши после да кажеш какво става. |
|||||||||||||||||||
| Автор: | stefan01 [ Пон Юли 13, 2015 3:54 pm ] |
| Заглавие: | Re: Pic16F628A и DS1307-"Часовник с Дата- НЕ тръгва. |
Благодаря за съветите и информацията. Днес продължавам . Събота и Неделя трябваше да отделя време за по няколко питиета |
|
| Автор: | stefan01 [ Пон Юли 13, 2015 3:58 pm ] |
| Заглавие: | Re: Pic16F628A и DS1307-"Часовник с Дата- НЕ тръгва. |
Имам още един въпрос . Микроконтролера да го настроя с вътрешен осцилатор или външен и да сложа кристал на пиновете 15, 16 с кондезатори? Какво мислите по въпроса? |
|
| Автор: | stefan01 [ Пон Юли 13, 2015 5:06 pm ] |
| Заглавие: | Re: Pic16F628A и DS1307-"Часовник с Дата- НЕ тръгва. |
Схемата на hardware е следната. На RTC DS1307 съм сложил кристал 32KHz....Пин 3 съм го свързал към маса. Микроконтролера съм го настроил на 4 Мгц с външен осцилатор и кристал 4Мгц. с 2 кондензатора от по 10 Пф. Променях програмата по различни начини , но все още не дава признаци на живот. На LCD-то Date and Time не се променят показват само това : Date: 01:01:2008 Time: 00:00:80 в момента програмата е така: Началната част на програмата съм пропуснал кадето са връзките на LCD-то с Микроконтролера. void Read_Time() { Soft_I2C_Start(); Soft_I2C_Write(0xD0); Soft_I2C_Write(0); Soft_I2C_Start(); Soft_I2C_Write(0xD1); seconds = Soft_I2C_Read(1); minutes = Soft_I2C_Read(1); hours = Soft_I2C_Read(1); day = Soft_I2C_Read(1); day = Soft_I2C_Read(1); month = Soft_I2C_Read(0); Soft_I2C_Stop(); } void Transform_Time() { seconds = ((seconds & 0xF0) >> 4)*10 + (seconds & 0x0F); minutes = ((minutes & 0xF0) >> 4)*10 + (minutes & 0x0F); hours = ((hours & 0xF0) >> 4)*10 + (hours & 0x0F); year = (day & 0xC0) >> 6; day = ((day & 0x30) >> 4)*10 + (day & 0x0F); month = ((month & 0x10) >> 4)*10 + (month & 0x0F); } void Display_Time() { Lcd_Chr(1, 6, (day / 10) + 48); Lcd_Chr(1, 7, (day % 10) + 48); Lcd_Chr(1, 9, (month / 10) + 48); Lcd_Chr(1,10, (month % 10) + 48); Lcd_Chr(1,15, year + 56); Lcd_Chr(2, 6, (hours / 10) + 48); Lcd_Chr(2, 7, (hours % 10) + 48); Lcd_Chr(2, 9, (minutes / 10) + 48); Lcd_Chr(2,10, (minutes % 10) + 48); Lcd_Chr(2,12, (seconds / 10) + 48); Lcd_Chr(2,13, (seconds % 10) + 48); } void Init_Main() { CMCON = 0b11111111; TRISB = 0b00000000 ; PORTB = 0; TRISA = 0b11111111; Soft_I2C_Init(); Lcd_Init(); Lcd_Cmd(_LCD_CLEAR); Lcd_Cmd(_LCD_CURSOR_OFF); Lcd_Out(1,1,"Date:"); Lcd_Chr(1,8,':'); Lcd_Chr(1,11,':'); Lcd_Out(2,1,"Time:"); Lcd_Chr(2,8,':'); Lcd_Chr(2,11,':'); Lcd_Out(1,12,"200"); } void main() { Delay_ms(2000); Init_Main(); while (1) { Read_Time(); Transform_Time(); Display_Time(); Delay_ms(1000); } } |
|
| Автор: | michev [ Пон Юли 13, 2015 5:21 pm ] | |||||||||
| Заглавие: | Re: Pic16F628A и DS1307-"Часовник с Дата- НЕ тръгва. | |||||||||
Преобразуването на секундите не ти е вярно. В документацията на часовника пише че бит 7 е "CH", или фалг указващ дали работи часовника. Твоя код не се съобразява с това и затова резултата е "80" секунди. А защо не работи? - Вероятно щото бит 7 е 1
|
||||||||||
| Автор: | Cekins [ Пон Юли 13, 2015 7:57 pm ] |
| Заглавие: | Re: Pic16F628A и DS1307-"Часовник с Дата- НЕ тръгва. |
Bit7 го пишат че е в "неустановено" състояние при подаване на захрнване на чипа. Аз обаче не си спомням някой да е тръгвал при включване - демек винаги бит 7 е бил 1. |
|
| Автор: | stefan01 [ Пон Юли 13, 2015 10:07 pm ] |
| Заглавие: | Re: Pic16F628A и DS1307-"Часовник с Дата- НЕ тръгва. |
Промених програмата , както и хардуеъра и Заработи.......Микроконтролера - вътрешен осцилатор на 4 Мгц. Другото което промених е , че зададох на SQWE изходен сигнал от 1Хц. Също така промених още няколко настройки, но които го интересува ще види в програмата. Следващата стъпка е да направя входове за настройка на часовника. Ето и работещият код засега? //Sample code for //DS1307 RTC Interfacing with PIC16F628A //Coded by Stefan Vasilev //Compiler: mikroC Pro v5.61 //10/07/2015 sbit LCD_RS at RB2_bit; sbit LCD_EN at RB3_bit; sbit LCD_D4 at RB4_bit; sbit LCD_D5 at RB5_bit; sbit LCD_D6 at RB6_bit; sbit LCD_D7 at RB7_bit; sbit LCD_RS_Direction at TRISB2_bit; sbit LCD_EN_Direction at TRISB3_bit; sbit LCD_D4_Direction at TRISB4_bit; sbit LCD_D5_Direction at TRISB5_bit; sbit LCD_D6_Direction at TRISB6_bit; sbit LCD_D7_Direction at TRISB7_bit; sbit Soft_I2C_Scl at RA0_bit; sbit Soft_I2C_Sda at RA7_bit; sbit Soft_I2C_Scl_Direction at TRISA0_bit; sbit Soft_I2C_Sda_Direction at TRISA7_bit; char seconds, minutes, hours, day, month, year; void Read_Time() { Soft_I2C_Start(); Soft_I2C_Write(0xD0); Soft_I2C_Write(0); Soft_I2C_Start(); Soft_I2C_Write(0xD1); seconds = Soft_I2C_Read(1); minutes = Soft_I2C_Read(1); hours = Soft_I2C_Read(1); day = Soft_I2C_Read(1); day = Soft_I2C_Read(1); month = Soft_I2C_Read(1); year = Soft_I2C_Read(0); Soft_I2C_Stop(); } void Transform_Time() { seconds = ((seconds & 0x70) >> 4)*10 + (seconds & 0x0F); minutes = ((minutes & 0xF0) >> 4)*10 + (minutes & 0x0F); hours = ((hours & 0xF0) >> 4)*10 + (hours & 0x0F); year = (day & 0xC0) >> 6; day = ((day & 0x30) >> 4)*10 + (day & 0x0F); month = ((month & 0x10) >> 4)*10 + (month & 0x0F); } void Display_Time() { Lcd_Chr(1, 6, (day / 10) + 48); Lcd_Chr(1, 7, (day % 10) + 48); Lcd_Chr(1, 9, (month / 10) + 48); Lcd_Chr(1,10, (month % 10) + 48); Lcd_Chr(1,15, year + 56); Lcd_Chr(2, 6, (hours / 10) + 48); Lcd_Chr(2, 7, (hours % 10) + 48); Lcd_Chr(2, 9, (minutes / 10) + 48); Lcd_Chr(2,10, (minutes % 10) + 48); Lcd_Chr(2,12, (seconds / 10) + 48); Lcd_Chr(2,13, (seconds % 10) + 48); } void Init_Main() { VRCON = 0x00; CMCON = 0x07; TRISB = 0b00000000 ; TRISA = 0b01100001; Lcd_Init(); Lcd_cmd(_LCD_Clear); Lcd_Cmd(_LCD_CURSOR_OFF); } void I2C() { Soft_I2C_Init(); Soft_I2C_Start(); Soft_I2C_Write(0xD0); Soft_I2C_Write(0); Soft_I2C_Write(0x80); Soft_I2C_Write(0x00); Soft_I2C_Write(0x00); Soft_I2C_Write(1); Soft_I2C_Write(2); Soft_I2C_Write(0); Soft_I2C_Write(0x0F); Soft_I2C_Write(0x10); // SQWE output at 1 Hz. Soft_I2C_Stop(); Soft_I2C_Start(); Soft_I2C_Write(0xD0); Soft_I2C_Write(0); Soft_I2C_Write(0); Soft_I2C_Stop(); } void display_Lcd(){ Lcd_Out(1,1,"Date:"); Lcd_Chr(1,8,':'); Lcd_Chr(1,11,':'); Lcd_Out(2,1,"Time:"); Lcd_Chr(2,8,':'); Lcd_Chr(2,11,':'); Lcd_Out(1,12,"200"); } void main() { Delay_ms(500); Init_Main(); display_Lcd(); I2C(); while (1) { Read_Time(); Transform_Time(); Display_Time(); Delay_ms(1000); } } |
|
| Страница 1 от 1 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|