Hi, habe einen µC 80C517A der mit Keil µVision in C programmiert wurde... was soweit auch alles funktioniert. Der eingesetzte Zeitenbaustein PCF8583 von Philips ist geht auch soweit, bis auf eine Funktion: Das Jahr, da zeigt mir das System immer Müll an. Mit der Uhrzeit und dem Tag/Monat gibt es kein Probleme! Kann mir mit der Jahresprogrammierung jemand weiterhelfen? Gruß, Boris
Der hat kein komplettes Feld für's Jahr, er hat davon nur die unteren 2 Bits, also 0..3, um das Schaltjahr spitzzukriegen. Was man für die nächsten gut 90 Jahre halt so braucht. Für den Rest musst Du selber sorgen.
Danke für die Info, aber das war mir klar. Leider hab ich irgendeinen Fehler im Prog: i2c_start(); //anfang jahr i2c_schreiben(0xa0); i2c_schreiben(0x2f); i2c_start(); i2c_schreiben(0xa1); temp=i2c_lesen(1); i2c_stop(); temp1=temp; i2c_start(); i2c_schreiben(0xa0); i2c_schreiben(0x30); i2c_start(); i2c_schreiben(0xa1); temp=i2c_lesen(1); i2c_stop(); temp2=temp; i2c_start(); i2c_schreiben(0xa0); i2c_schreiben(0x31); i2c_start(); i2c_schreiben(0xa1); temp=i2c_lesen(1); i2c_stop(); temp3=temp; t_jahr=(temp1*100)+temp2; if (temp3==jahrtemp) t->jahr=t_jahr; else { t_jahr++; t->jahr=t_jahr; temp2=t_jahr%100; temp1=t_jahr/100; i2c_start(); i2c_schreiben(0xa0); i2c_schreiben(0x2f); i2c_schreiben(temp1); i2c_schreiben(temp2); i2c_schreiben(jahrtemp); i2c_stop(); };
Statt dass ich mich jetzt durch diese Codewurst quäle, überlass ich lieber dir die Arbeit und poste den relevanten Teil von meinen Code.
Oh, sorry hatte ich überlesen... Frage zu Deinem Code: - wo initialisierst du die Uhr? - wo liest die Zeit/Datum aus?
sec100...year kannst Du der Einfachheit halber als globale Systemvariablen ansehen. from_rtc liest den Inhalt des PCF8583 in diese Variablen und korrigiert nebenbei das in Position 8 gespeicherte Jahr. Muss mindestens einmal im Jahr ausgeführt werden, sonst klappt das nicht. to_rtc setzt die RTC. Mein I2C-Code schaut natürlich etwas anders aus. Ich neige dazu, I2C-Transaktionen als Einheit zu sehen.
Hätte da noch eine Frage: Was bezwecktst Du mit der Doppelzeile > static uint8_t > bcd2bin(uint8_t val) > { > ........ > } Gruß Boris
Was irritiert dich daran? Die Funktion, die Syntax, die Deklaration, der Stil? Ist eine stinknormale Funktionsdefinition.
Mein Compiler meckert... (Keil µVision) ihm fehlt hinter "bcd2bin(uint8_t val)" das ; aber das kann ich ja nicht machen... super wäre auch wenn du mir noch sagen könntest wo bei dir die jahresüberprüfung stattfindet (bzgl. anredeadressen) Gruß, Boris
Außerdem fehlen dem Compiler viel Deklerationen (val, month,..) und kennt auch einige befehle nicht (div...)
Alles nehme ich dir nicht ab, das war als Beispiel für die RTC gedacht, nicht fix und fertig zum Übersetzen. Ist ja auch nur ein Schnipsel aus grösseren (C++) Code. div() liefert beide Ergebnisse der Division in einem Rutsch. Gibt's per stdlib.h, jedenfalls in ANSI und WinAVR. Geht auch anders, per / und %.
Mag sein, dass Keil den Typ uint8_t nicht kennt. Abkürzung von "unsigned char". Für das Jahr habe ich ein Register des unbenutzten Alarm-Teils der RTC verwendet. Zusammengemixt wird das mit if (((ybuf[0] + 1) & 0x03) == (buf[RTC_YEARDATE] >> 6)) { ybuf[0] += 1; i2c_write(PCF8583, &addr, 1, ybuf, 1); } Dieser Code kontrolliert, ob die zwei echten Jahr-Bits der RTC schon eins weiter sind als dieses synthetisches Jahr und korrigiert entsprechend.
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.