|
Виж темите без отговор | Виж активните теми
Дата и час: Пон Юли 27, 2026 4:12 pm
|
Страница 1 от 1
|
[ 10 мнения ] |
|
Pic16F628A и DS1307-"Часовник с Дата- НЕ тръгва.
| Автор |
Съобщение |
|
stefan01
Ранг: Минаващ
Регистриран на: Вто Май 19, 2015 8:34 pm Мнения: 7
|
 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); } }
|
| Пет Юли 10, 2015 8:46 pm |
|
 |
|
speedblue
Ранг: Ориентиран
Регистриран на: Нед Фев 25, 2007 1:41 am Мнения: 276 Местоположение: София
|
 Re: Pic16F628A и DS1307-"Часовник с Дата- НЕ тръгва.
42 !!!
|
| Съб Юли 11, 2015 12:04 am |
|
 |
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 9:21 pm Мнения: 30684 Местоположение: София
|
 Re: Pic16F628A и DS1307-"Часовник с Дата- НЕ тръгва.
Ами да не ти гледам целия код, ам акато за начало четеш времето от грешни адреси, ако параметъра в read функцията ти е адрес от който четеш навсякъде четеш минутите а за датата четеш секундите. Хубаво е да огледаш и какво пишеш, не съм гледал челия чаршаф но ...
|
| Съб Юли 11, 2015 10:01 am |
|
 |
|
pechkov
Ранг: Напреднал
Регистриран на: Пет Фев 14, 2014 4:45 pm Мнения: 439 Местоположение: Монтана
|
 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" го чета два пъти, защото първия път ще върне "ден от седмицата" от поредния регистър, и се явява ненужна данна в твоя случай. Не си писал четене на годината, но ако ще е нужна - четеш точно след месеца. Пиши после да кажеш какво става.
_________________ Не карай по-бързо от своя ангел-пазител!
|
| Съб Юли 11, 2015 1:10 pm |
|
 |
|
stefan01
Ранг: Минаващ
Регистриран на: Вто Май 19, 2015 8:34 pm Мнения: 7
|
 Re: Pic16F628A и DS1307-"Часовник с Дата- НЕ тръгва.
Благодаря за съветите и информацията. Днес продължавам . Събота и Неделя трябваше да отделя време за по няколко питиета  ...........ще пиша как се развива случая.......
|
| Пон Юли 13, 2015 3:54 pm |
|
 |
|
stefan01
Ранг: Минаващ
Регистриран на: Вто Май 19, 2015 8:34 pm Мнения: 7
|
 Re: Pic16F628A и DS1307-"Часовник с Дата- НЕ тръгва.
Имам още един въпрос . Микроконтролера да го настроя с вътрешен осцилатор или външен и да сложа кристал на пиновете 15, 16 с кондезатори? Какво мислите по въпроса?
|
| Пон Юли 13, 2015 3:58 pm |
|
 |
|
stefan01
Ранг: Минаващ
Регистриран на: Вто Май 19, 2015 8:34 pm Мнения: 7
|
 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); } }
|
| Пон Юли 13, 2015 5:06 pm |
|
 |
|
michev
Ранг: Форумен бог
Регистриран на: Сря Юли 11, 2007 10:16 am Мнения: 1730
|
 Re: Pic16F628A и DS1307-"Часовник с Дата- НЕ тръгва.
Преобразуването на секундите не ти е вярно. В документацията на часовника пише че бит 7 е "CH", или фалг указващ дали работи часовника. Твоя код не се съобразява с това и затова резултата е "80" секунди. А защо не работи? - Вероятно щото бит 7 е 1 
|
| Пон Юли 13, 2015 5:21 pm |
|
 |
|
Cekins
Ранг: Форумен бог
Регистриран на: Сря Апр 20, 2005 12:02 pm Мнения: 9119 Местоположение: Разград
|
 Re: Pic16F628A и DS1307-"Часовник с Дата- НЕ тръгва.
Bit7 го пишат че е в "неустановено" състояние при подаване на захрнване на чипа. Аз обаче не си спомням някой да е тръгвал при включване - демек винаги бит 7 е бил 1.
|
| Пон Юли 13, 2015 7:57 pm |
|
 |
|
stefan01
Ранг: Минаващ
Регистриран на: Вто Май 19, 2015 8:34 pm Мнения: 7
|
 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); } }
|
| Пон Юли 13, 2015 10:07 pm |
|
|
|
Страница 1 от 1
|
[ 10 мнения ] |
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 11 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|