Real Time Clock

Gast #173134
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
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
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
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
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
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
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

Eine eigene Frage? Dieser Thread ist über 21 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.