Bandi Szasz Postat Mai 12, 2013 Partajează Postat Mai 12, 2013 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
Liviu M Postat Mai 13, 2013 Partajează Postat Mai 13, 2013 Ce-s alea rezistente 'de 5V1'? Link spre comentariu
Bandi Szasz Postat Mai 13, 2013 Autor Partajează Postat Mai 13, 2013 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
costi002 Postat Mai 13, 2013 Partajează Postat Mai 13, 2013 eu stiu ca se pun la vdd, nu la gnd Link spre comentariu
Bandi Szasz Postat Mai 13, 2013 Autor Partajează Postat Mai 13, 2013 Da ai dreptate se conecteaza la Vdd l-am schimbat dar tot nimic imi apare 0 : 00 Link spre comentariu
costi002 Postat Mai 13, 2013 Partajează Postat Mai 13, 2013 si 00:00 nu este val default? ai dat start la counter-ul ds-ului? Link spre comentariu
Bandi Szasz Postat Mai 13, 2013 Autor Partajează Postat Mai 13, 2013 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
costi002 Postat Mai 13, 2013 Partajează Postat Mai 13, 2013 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
nico_2010 Postat Mai 14, 2013 Partajează Postat Mai 14, 2013 Nu stiu ce DS1307 ai tu, insa adresa cipului este "1101000" = 68h si in niciun caz D0h. Cred ca ai citit gresit foaia de catalog. Link spre comentariu
Bandi Szasz Postat Mai 14, 2013 Autor Partajează Postat Mai 14, 2013 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
Liviu M Postat Mai 14, 2013 Partajează Postat Mai 14, 2013 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
nico_2010 Postat Mai 14, 2013 Partajează Postat Mai 14, 2013 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
Bandi Szasz Postat Mai 14, 2013 Autor Partajează Postat Mai 14, 2013 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
Liviu M Postat Mai 14, 2013 Partajează Postat Mai 14, 2013 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
Bandi Szasz Postat Mai 14, 2013 Autor Partajează Postat Mai 14, 2013 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 .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 daca nu mentionai portul digital cred ca ma ma mai chinuiam vro 2 zile daca nu mai mult Link spre comentariu
Postări Recomandate
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 contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum