Real Time Clock

Gast #173134
Lesenswert?
• ▲
▼
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
Gast #173135
Lesenswert?
• ▲
▼
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.
Gast #173136
Lesenswert?
• ▲
▼
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();
      };
Gast #173142
Lesenswert?
• ▲
▼
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.
Gast #173146
Lesenswert?
• ▲
▼
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
Gast #173148
Lesenswert?
• ▲
▼
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 %.
Gast #173149
Lesenswert?
• ▲
▼
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.