Микроконтролери и електроника
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-"Часовник с Дата- НЕ тръгва.

ToHu написа:
... ако параметъра в read функцията ти е адрес ...


Ако, но не е. При 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, на който регистрите му са подредени по различен начин.

Стефан, пробвай така:

Код:
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();
}


Забележи, че "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 :)
Код:
..
seconds = ((seconds & 0x70) >> 4)*10 + (seconds & 0x0F);
..

Автор:  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/