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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren