Ich hab hier ne PCF8583 Echtzeituhr und würde die gerne an meinem AVR betreiben. Ich habe aber leider keine Ahnung von I2C, und möchte fragen ob jemand infos für einsteiger hat, die Infos sollte halt schon auf der Library von Peter Fleury basieren. Ein gut kommentierter Sourcecode tuts auch schon. Halt irgend was mit dem ich die Funktionsweise begreifen kann.
Hab mir mal folgendes zusammengeschrieben: uint8_t a; i2c_start_wait(0xA0); i2c_write(2); i2c_rep_start(0xA1); for (a=0;a<2;a++){ i2ctime[a] = i2c_readAck(); } i2c_stop(); Die DCB Werte wandle ich mit folgender Funktion um: int bcdtobin(int a) { int erg1; erg1 = a/16; a = a-(erg1 << 4); a = (erg1*10)+a; return a; } Das scheint alles so weit zu funktionieren, bis auf folgendes problem zwischen den richtigen Werten die von der echtzeituhr kommen, ist immer mal wieder ne 3 drin. Woran kann das liegen?
Kann mir keiner helfen, bin hier so langsam am verzweifeln. Das komische ist, ein Speicher der am selben Bus hängt geht ohne Probleme und auch der Ram Bereich von der Uhr lässt sich ohne fehlerhafte werte auslesen. Nur bei der Uhrzeit ist immer abwechselnd der Richtige wert und dann ein anderer(immer der selbe) drinn.
Ich schreibe vor dem Lesen der Uhrzeit erst ein CAPTURE ins control register des PCF8583 um die aktuelle Uhrzeit "einzufrieren". Nach dem Lesen der Zeit/Datum wird wieder eine NULL reingeschrieben. #define CAPTURE 0x40
Mhhhh hab das jetzt so erweitert: void gettime(void) { uint8_t a; i2c_start_wait(0xA0); i2c_write(0); i2c_write(0x40); i2c_stop(); i2c_start_wait(0xA0); i2c_write(2); i2c_rep_start(0xA1); for (a=0;a<3;a++){ i2ctime[a] = i2c_readAck(); } i2c_stop(); i2c_start_wait(0xA0); i2c_write(0); i2c_write(0); i2c_stop(); } es besteht aber leider immer noch das Problem: Beim ersten auslesen ist die Uhrzeit (Stunden) z.B. 0 (richtig) beim 2.Mal 45 dann wieder 0 und dann wieder 45 (könnte auch 145 sein hab da ich meine Urzeit auf 2 Stellen begrenze damit ich ggf ne 0 ranhängen kann) Kann das villeicht an dem Timing von der i2c Library liegen die hab ich durch ein "paar" nops provesorisch an meinen 16Mhz Quarz angepasst: ;*********************************************************************** ** ; delay half period ; For I2C in normal mode (100kHz), use T/2 > 5us ; For I2C in fast mode (400kHz), use T/2 > 1.3us ;*********************************************************************** ** .stabs "",100,0,0,i2c_delay_T2 .stabs "i2cmaster.S",100,0,0,i2c_delay_T2 .func i2c_delay_T2 ; delay 5.0 microsec with 4 Mhz crystal i2c_delay_T2: ; 4 cycles rjmp 1f ; 2 " 1: rjmp 2f ; 2 " 2: rjmp 3f ; 2 " 3: rjmp 4f ; 2 " 4: rjmp 5f ; 2 " 5: rjmp 6f ; 2 " 6: nop ; 1 " nop ; 1 " nop ; 1 " nop ; 1 " nop ; 1 " nop ; 1 " nop ; 1 " nop ; 1 " nop ; 1 " nop ; 1 " nop ; 1 " nop ; 1 " nop ; 1 " nop ; 1 " nop ; 1 " nop ; 1 " nop ; 1 " nop ; 1 " nop ; 1 " nop ; 1 " nop ; 1 " nop ; 1 " nop ; 1 " nop ; 1 " nop ; 1 " nop ; 1 " nop ; 1 " nop ; 1 " nop ; 1 " nop ; 1 " nop ; 1 " nop ; 1 " nop ; 1 " nop ; 1 " nop ; 1 " nop ; 1 " nop ; 1 " nop ; 1 " nop ; 1 " nop ; 1 " nop ; 1 " nop ; 1 " nop ; 1 " nop ; 1 " nop ; 1 " nop ; 1 " nop ; 1 " nop ; 1 " nop ; 1 " nop ; 1 " nop ; 1 " nop ; 1 " nop ; 1 " nop ; 1 " nop ; 1 " nop ; 1 " nop ; 1 " nop ; 1 " nop ; 1 " nop ; 1 " nop ; 1 " ret ; 3 " .endfunc ; total 80 cyles = 5.0 microsec with 16 Mhz crystal * 4 = 80 Es gibt doch bestimmt noch andere i2c Routinen von einem anderen programmierer oder?
Klappt immer noch nicht? Hier meine Testroutinen. Aus verschieden Quellen "zusammengebaut".
>>for (a=0;a<3;a++){ >> i2ctime[a] = i2c_readAck(); >> } Das letzte read muss ein i2c_readNak() sein: i2ctime[0] = i2c_readAck(); i2ctime[1] = i2c_readAck(); i2ctime[2] = i2c_readNak(); Falls du einen ATmega mit hardware-TWI verwendest, kann du auch gegen meine twimaster library linken.
Ahh, danke schon mal ich hoffe das klappt jetzt, werd das später mal testen.
Ok scheint zu gehen. Soll ich Nak immer am schluss nehmen oder ist das nur so ne Eigenart von der Uhr? Bei meinem Speicher scheint das keine Probleme zu machen.
@ peter fleury Was heisst das? Falls du einen ATmega mit hardware-TWI verwendest, kann du auch gegen meine twimaster library linken Besten Dank im Voraus mfg mathias g.
In der Doku zu meiner Lib steht doch alles... http://homepage.sunrise.ch/mysunrise/peterfleury/index.html
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.