Sari la conținut
ELFORUM - Forumul electronistilor

I2C cu DS1307 in mikroC nu transimte/primeste date.


Bandi Szasz

Postări Recomandate

In final dupa ceva aseptari am primit DS1307 -ul comandat mi-am facut ceva timp sambata sa-l montez langa un PIC16F690. Este alimentat momentan din sursa nu pe baterie. Are quartz montat ,rezistente de 5V1 pe SDA/SCL. Totul bine pana la testare. La pornire se afiseaza un messaj dupa care are trebuii sa primeasca update de la DS1307 la fiecare +/- 15s. Dar aici apare problema dupa afisarea mesajului nucu nu primeste nici un fel de date. Am testat separat functia de display crezand ca acolo apare probelma. Dupa ce am scris niste valori manual unde are trebuii sa intre datele de la RTC ceasul a fost afisat deci problema nu este acolo.

 

 

La minutes,hours,... intra datele de la RTC apoi prin "T2Segment" le descompun in 2 cifre adica daca la minutes intra "25" eu le descompun in t_minutes1=2; t_minutes2=5; pentru a putea trimite datele pentru fiecare segment.

 

// Software I2C connectionssbit Soft_I2C_Scl           at RB6_bit;sbit Soft_I2C_Sda           at RB4_bit;sbit Soft_I2C_Scl_Direction at TRISB6_bit;sbit Soft_I2C_Sda_Direction at TRISB4_bit;// End Software I2C connectionsunsigned short seconds, minutes, hours, week_day, date, month, year;unsigned short ms=59, hr=13, wd=1, dt=11, mh=5, yr=13;  void Read_Time() {  Soft_I2C_Start();                                      // Issue start signal  Soft_I2C_Write(0xD0);                                  // Address ds1307, see ds1307 datasheet  Soft_I2C_Write(0);                                     // Start from address 2  Soft_I2C_Start();                                      // Issue repeated start signal  Soft_I2C_Write(0xD1);                                  // Address ds1307 for reading R/W=1  Seconds  = Bcd2Dec(Soft_I2C_Read(1));                  //uncomment and use later as an alternative to transform time below  minutes  = Bcd2Dec(Soft_I2C_Read(1));                  // Read minutes byte  hours    = Bcd2Dec(Soft_I2C_Read(1));                  // Read hours byte  week_day = Bcd2Dec(Soft_I2C_Read(1));                  // Read day byte  date     = Bcd2Dec(Soft_I2C_Read(1));                  // Read year/day byte  month    = Bcd2Dec(Soft_I2C_Read(1));                  // Read weekday/month byte  year     = Bcd2Dec(Soft_I2C_Read(0));                  // Read weekday/month byte  Soft_I2C_Stop();                // Issue stop signal} void Write_Time(){  ///use BcdToDec conversions for adustments   !!!!!!!!!!!!!!!!!!!!!!!!   Soft_I2C_init();               // initialize full master mode   Soft_I2C_Start();              // issue start signal   Soft_I2C_Write(0xD0);          // address DS1307   Soft_I2C_Write(0);             // !!!!!!!!!!!!!start from word at address   Soft_I2C_Write(0x80);          // write $80 to REG0. (pause counter + 0 sec)   (REG0)   Soft_I2C_Write(Dec2Bcd(ms));   // write bcd_minutes to minutes word to         (REG1)   Soft_I2C_Write(Dec2Bcd(hr));   // write bcd_hours word (24-hours mode)         (REG2)   Soft_I2C_Write(Dec2Bcd(1));    // write wd - to day sun-sat                    (REG3)   Soft_I2C_Write(Dec2Bcd(dt));   // write bcd_date to date word                  (REG4)   Soft_I2C_Write(Dec2Bcd(1));    // write mh to month word                       (REG5)   Soft_I2C_Write(Dec2Bcd(yr));   // write bcd_year to year word                  (REG6)   Soft_I2C_Write(16);            // SQWE output at 1 Hz                          (REG7)   Soft_I2C_Stop();               // issue stop signal   Soft_I2C_Start();              // issue start signal   Soft_I2C_Write(0xD0);          // address DS1307   Soft_I2C_Write(0);             // start from word at address 0   Soft_I2C_Write(0);             // write 0 to REG0 (enable counting + 0 sec)   Soft_I2C_Stop();               // issue stop signal}//~unsigned short  t_minutes1=2,t_minutes2=4, t_hours1=0,t_hours2=3; void T2Segment() {   Read_Time();  if(minutes>9){   t_minutes2=minutes%10;   t_minutes1=minutes/10;   }   else{    t_minutes2=minutes;    t_minutes1=0;    }    if(hours>9){     t_hours2=hours%10;     t_hours1=hours/10;     }     else{     t_hours2=hours;     t_hours1=0;     } }void main(){..... un messaj la pornire. Soft_I2C_init();  Write_Time();while(1){   T2Segment(); // Citirea de la DS apoi descompunerea valorilor in doua   Display(); // functia de afisare care a fost testat introducand manual valori la t_minutes/t_hours. }}
Link spre comentariu
  • Răspunsuri 14
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • Bandi Szasz

    7

  • Liviu M

    3

  • costi002

    3

  • nico_2010

    2

Top autori în acest subiect

Ce-s alea rezistente 'de 5V1'?

sunt 5k1 scz am scris gresit sunt in loc de 4k7 pentru ca nam gasitsunt conectati intre pic si ds1307 legati la Gnd. am vazut ca asa se face
Link spre comentariu

M-am cam saturat sa umblu pe intuneric asa ca mam apucat sa-l fac in Proteus. Dupa mici modificari in soft am ajuns la punctul in care pot programa RTC-ul si sa-l pronesc sa numere. Dar cand vine vorba de citit primesc numai 0 -uri. De vro 2 ore ma tot holbez la el si numi dau seama undei buba ?

 

Scriere: merge perfect cel putin in simulare.

 

Soft_I2C_Start();Soft_I2C_Write(0xd0);Soft_I2C_Write(0x00);Soft_I2C_Write(0x80);Soft_I2C_Write(0x02);   //minuteSoft_I2C_Write(0x15);   //oraSoft_I2C_Write(0x05);Soft_I2C_Write(0x01);Soft_I2C_Write(0x09);Soft_I2C_Write(0x10);Soft_I2C_Stop();Soft_I2C_Start();Soft_I2C_Write(0xd0);Soft_I2C_Write(0x00);Soft_I2C_Write(0x00);Soft_I2C_Stop();

 

Citire : nu merge nici in simulare imi tot trimite 0 :cry:

 

void Transform_Time(char  *sec, char *min, char *hr, char *week_day, char *day, char *mn, char *year) {        *sec  =  ((*sec & 0x70) >> 4)*10 + (*sec & 0x0F);        *min  =  ((*min & 0xF0) >> 4)*10 + (*min & 0x0F);        *hr   =  ((*hr & 0x30) >> 4)*10 + (*hr & 0x0F);        *week_day =(*week_day & 0x07);        *day  =  ((*day & 0xF0) >> 4)*10 + (*day & 0x0F);        *mn   =  ((*mn & 0x10) >> 4)*10 + (*mn & 0x0F);        *year =  ((*year & 0xF0)>>4)*10+(*year & 0x0F);}void Read_Time(char *sec1, char *min1, char *hr1, char *week_day1, char *day1, char *mn1, char *year1) {Soft_I2C_Start(); Soft_I2C_Write(0xD0); Soft_I2C_Write(0); Soft_I2C_Start();Soft_I2C_Write(0xD1); *sec1 =  Soft_I2C_Read(1) ; // Read seconds byte*min1 =  Soft_I2C_Read(1) ; // Read minutes byte*hr1 = Soft_I2C_Read(1) ; // Read hours byte*week_day1  = Soft_I2C_Read(1);*day1 =  Soft_I2C_Read(1); // Read year/day byte*mn1 =  Soft_I2C_Read(1);  // Read weekday/month byte*year1 =  Soft_I2C_Read(0);Soft_I2C_Stop(); // Issue stop signal}unsigned char sec2, min2, hr2, week_day2, day2, mn2, year2;Read_Time(&sec2,&min2,&hr2,&week_day2,&day2,&mn2,&year2);Transform_Time(&sec2,&min2,&hr2,&week_day2,&day2,&mn2,&year2); si in  min2/hr2 ar trebuii sa am valorile in dec. pe care le folosesc in felul  PORTC=numere[min2];
Link spre comentariu

daca citesti 0 nu este ok. atunci cand citesti si ds-ul nu raspunde, trebuie sa receptionezi 1515:1515:1515 care corespunde lui 1111:1111:1111. mai incearca, nu te da batut.

Link spre comentariu

este un DS1307N am observat si eu ca in datasheet este altu dar am gasit niste projecte gata facute si acolo erau 0xD0 si de aia am pus si eu 0xD0 o sa incerc si cu cel mentionat in datasheet.Mersi.

Link spre comentariu

La adresa de 7 biti din data-sheet se adauga pe post de LSB bitul "de operatie" - 0 pentru scriere si 1 pentru citire.Asa ca daca in data-sheet e data adresa 1101000 (0x68), adresa "de scriere" va fi 0xD0 (11010000) iar cea de citire va fi 0xD1 (11010001). Deci la scriere exista numai adrese pare, la citire numai impare. Asta e si motivul pentru care numarul maxim (teoretic) de dispozitive pe un bus i2c e de 127(128?), desi la 8 biti de adrese ar fi putut fi 255 (256?)

Link spre comentariu

La adresa de 7 biti din data-sheet se adauga pe post de LSB bitul "de operatie" - 0 pentru scriere si 1 pentru citire.Asa ca daca in data-sheet e data adresa 1101000 (0x68), adresa "de scriere" va fi 0xD0 (11010000) iar cea de citire va fi 0xD1 (11010001). Deci la scriere exista numai adrese pare, la citire numai impare. Asta e si motivul pentru care numarul maxim (teoretic) de dispozitive pe un bus i2c e de 127(128?), desi la 8 biti de adrese ar fi putut fi 255 (256?)

Mea culpa, nu am citit cu atentie datasheet-ul
Link spre comentariu

DA chiar acuma am aflat si eu despre 0/1 de pe un alt forum.

 

Pai ma cam scoate din sarite I2C ul asta. Am atasat un I2C debugger in Proteus si acolo merge.

 

SD0 A00 ASrD1 A //incepe citirea03 A //03 seunde12 A // 12 minute15 A // ora 1505 A // numarul saptaminei sau ce este (week_day)01 A // ziua09 A //luna10 N //anulP

 

In conlcuzie DS ul trimite toate datele si apoi pic-ul la "int secunde=-1" (sa vad daca face schimbari) imi scrie secunde=0; (in switch intra la 0)

 

Am incercat numeroase functii/metode de convertare din biti (ce trimite RTC) in decibeli (int

secunde) . Acuma ori conversatia face misto de mine ori nu mai am idei.

 

Ma gandesc cum pot afla valoarea citita din RTC la unsigned short sa vad daca acolo este valoarea buna si numai conversiatia se prosteste ori nici la citire numi intra datele calumea.

Link spre comentariu

Esti sigur ca ai conectat totul bine si ai configurat picul cum trebuie?LE Probabil RB4/SDA e ramas ca intrare analogica.

Link spre comentariu

Manacatiasi de port analog. Aia era buba l-am configurat pe digital si a pornit din prima. Trebuie sa ma documentez ce e cu portul asta Analog/Digital :jytuiyu .O mica observatie este ca cand citesc ceasul de pe DS ledurile de la display clipesc (se sting pentru cateva ms destul de multe ca este vizibil cu ochiul in jur de 50-100ms ) mai fac niste experimente ma gandeam sa citesc ceasul din DS la fiecare 15-20s dar cred ca o sal maresc la 30-40s sa reduc din clipirile astea.EDIT: asa am modificat incat sa ceara numai minutele de la DS si cand la minute este 00 atunci sa ceara si ora. Acuma sa mai redus clipirea LED-urilor dar tot este putin vizibil. Cred ca asta este partea negativa a display-urilor din LED.Mersi fain :aplauze :da daca nu mentionai portul digital cred ca ma ma mai chinuiam vro 2 zile daca nu mai mult

Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări