Hi liebe Gemeinde! Ich proge in C und habe mich mal an den PCF 8583 gewagt. Klappt alles schön mit dem beschreiben der Uhrzeit und dem Auslesen.Probleme hab ich jedoch beim Datum. Das Setzen des Datums geht und ich kann mir am Display auch anschauen welches Datum ich zuvor eingeschrieben habe.Das Problem ist jedoch,dass weiterzählen. Die Tage werden richtig inkrementiert aber bei den Monaten macht er mir "irgendwas". Schreib ich z.B. das Datum 12/12 so bekomme ich beim Überlauf 13/32 er. Bei z.B. 6/8 kommt dann 7/28er.er adiiert mir immer 20 hinzu und erhöht die Monate aber nicht. Habt ihr vielleicht ne Idee was das sein kann? wie machst es ihr? Wäre echt froh wenn ihr weiterhelfen könntet. Mfg Cri
Zwei schnelle Vermutungen ... ohne Datenblatt im Zugriff und ohne deinen Code zu kennen ... A) Der PCF8583 erwartet/liefert BCD (daran kann ich mich erinnern). Du musst also vor dem setzten des Datums deine binären Werte in (Packed-) BCD wandeln, und nach dem Auslesen von BCD nach Binär. Datum dezimal 12. Dezember -> Binär: 0x0C + 0x0C -> wandeln nach BCD 0x12 + 0x12 B) Der Monat muss "Monate seit dem 1.1." angegeben werden. d.H. Januar = 0, Februar = 1, ...; Damit ist der Wert 12 ungültig und das Verhalten des Bausteines undefiniert. A) + B)
Hi Werner! Danke erstmal! Ahm... Punkt A ist klar.Ich übergebe bei setzen des Datums auch 0x12,0x12 und das kann ich dann am Display auch sehen aber beim Auslesen NAHC dem inkrementieren des Datums kommt halt das genannte Problem. Punkt B versteh ich nicht so gut...wie müsste ich den das programm gestallten um das Datum richtig auszulesen? mfg Cri
Ist wirklich nur eine Vermutung.... Der PCF verwaltet den Monat als index, ähnlich eines Arrays in C. Hier greift man auf das erste Element (in unserem Fall "Januar") ünder den index 0 (NULL) zu. Also steht für den PCF die 0 für den Januar und analog die 11 für den Dezember; Damit gäbe es keinen Monat 12, und nicht die 1 (wie für uns Menschen). Das muss aber im Datenblatt stehen.... habe gerde nachgesehen... vergiss es. Andere Vermutung: Maskierst du nach dem lesen den Wochentag aus? Pseudocode: monat = lesen_location_6(PCF) & 0x1F; wochentag = (lesen_location_6(PCF) & 0xE0) >> 5; Das würde den 20-iger Sprung erklären, weil der Wochentag von 0 auf 1 springt.
meinst du das mask flag im CTRL-Register? Das hab ich ausgeschaltet(aber auch schon mit log 1 probiert->vergebens). so lese ich den PCF aus: uchar rec_byte_8583(void) { unsigned char i,zeich = 0; unsigned char mask = 0x80; for(i=0;i<8;i++) { SCL = 0; wait(op_time); zeich = (int)SDA? (mask | zeich) : zeich; mask >>= 1; wait(op_time); SCL = 1; wait(op_time); } return(zeich); } und das Datum dann so: void get_date(void) { start_cond(); wr_byte_8583(0xA0); // Adresse des PCF R/W = 0 wr_byte_8583(0x05); // Adresse des Jahre/Datums-Registers start_cond(); wr_byte_8583(0xA1); // R/W = 1 (= LESEN) day = rec_byte_8583(); stop_cond(); start_cond(); wr_byte_8583(0xA0); // Adresse des PCF R/W = 0 wr_byte_8583(0x06); // Adresse des W-Tage/Monate-Registers start_cond(); wr_byte_8583(0xA1); // R/W = 1 (= LESEN) mon = rec_byte_8583(); stop_cond(); sprintf(get_value2,"DATE:%2x/%2x",(int)day,(int)mon); print_lcd(1,1,get_value2); }
Nein, ich meine damit dass nur die unteren 5 Bit des Bytes bei Offset 6 im PCF dem Monat gehören. Die oberen 3 Bit gehören dem Wochentag. Den musst du erst wegschneiden. Damit sollte es gehen
1 | ...
|
2 | mon = rec_byte_8583(); |
3 | stop_cond(); |
4 | |
5 | mon &= 0x1F; /* Maskiere Monat aus DOW/MON */ |
6 | |
7 | sprintf(get_value2,"DATE:%2x/%2x",(int)day,(int)mon); |
8 | print_lcd(1,1,get_value2); |
9 | }
|
Vielen Dank Werner!!! Jetzt kapier ich auch was du meinst! der AHA - Effekt :) Ist eigentlich klar,dass die Bits ausmaskiert werden müssen aber ich war zu blöd um es zu sehen. Ich werd das dann probieren...vielleicht gehts sichs heute noch aus. Ich schreib dann ob es geklappt hat oder nicht. Danke nochmals für deine Hilfe! Mfg Cri (hoffe du hilfst mir dann weiter falls es noch hängt ;) )
Hi Werner!! Danke für deine schnellen Antworten. Habe es gerade geändert und nun funzt es richtig!!! Mfg Cri
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.