Отговори на тема  [ 10 мнения ] 
Pic16F628A и DS1307-"Часовник с Дата- НЕ тръгва. 
Автор Съобщение
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Вто Май 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
Профил
Ранг: Ориентиран
Ранг: Ориентиран

Регистриран на: Нед Фев 25, 2007 1:41 am
Мнения: 276
Местоположение: София
Мнение Re: Pic16F628A и DS1307-"Часовник с Дата- НЕ тръгва.
42 !!!


Съб Юли 11, 2015 12:04 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 9:21 pm
Мнения: 30685
Местоположение: София
Мнение Re: Pic16F628A и DS1307-"Часовник с Дата- НЕ тръгва.
Ами да не ти гледам целия код, ам акато за начало четеш времето от грешни адреси, ако параметъра в read функцията ти е адрес от който четеш навсякъде четеш минутите а за датата четеш секундите. Хубаво е да огледаш и какво пишеш, не съм гледал челия чаршаф но ...


Съб Юли 11, 2015 10:01 am
Профил
Ранг: Напреднал
Ранг: Напреднал
Аватар

Регистриран на: Пет Фев 14, 2014 4:45 pm
Мнения: 439
Местоположение: Монтана
Мнение 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" го чета два пъти, защото първия път ще върне "ден от седмицата" от поредния регистър, и се явява ненужна данна в твоя случай. Не си писал четене на годината, но ако ще е нужна - четеш точно след месеца.

Пиши после да кажеш какво става.

_________________
Не карай по-бързо от своя ангел-пазител!


Съб Юли 11, 2015 1:10 pm
Профил ICQ
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Вто Май 19, 2015 8:34 pm
Мнения: 7
Мнение Re: Pic16F628A и DS1307-"Часовник с Дата- НЕ тръгва.
Благодаря за съветите и информацията. Днес продължавам . Събота и Неделя трябваше да отделя време за по няколко питиета :-)...........ще пиша как се развива случая.......


Пон Юли 13, 2015 3:54 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Вто Май 19, 2015 8:34 pm
Мнения: 7
Мнение Re: Pic16F628A и DS1307-"Часовник с Дата- НЕ тръгва.
Имам още един въпрос . Микроконтролера да го настроя с вътрешен осцилатор или външен и да сложа кристал на пиновете 15, 16 с кондезатори? Какво мислите по въпроса?


Пон Юли 13, 2015 3:58 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Вто Май 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
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Сря Юли 11, 2007 10:16 am
Мнения: 1730
Мнение Re: Pic16F628A и DS1307-"Часовник с Дата- НЕ тръгва.
Преобразуването на секундите не ти е вярно. В документацията на часовника пише че бит 7 е "CH", или фалг указващ дали работи часовника.
Твоя код не се съобразява с това и затова резултата е "80" секунди. А защо не работи? - Вероятно щото бит 7 е 1 :)
Код:
..
seconds = ((seconds & 0x70) >> 4)*10 + (seconds & 0x0F);
..


Пон Юли 13, 2015 5:21 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 20, 2005 12:02 pm
Мнения: 9119
Местоположение: Разград
Мнение Re: Pic16F628A и DS1307-"Часовник с Дата- НЕ тръгва.
Bit7 го пишат че е в "неустановено" състояние при подаване на захрнване на чипа. Аз обаче не си спомням някой да е тръгвал при включване - демек винаги бит 7 е бил 1.


Пон Юли 13, 2015 7:57 pm
Профил ICQ
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Вто Май 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
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 10 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 0 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни