Forum: Mikrocontroller und Digitale Elektronik Real Time Clock


von Boris (Gast)


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

von A.K. (Gast)


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.

von Boris (Gast)


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();
      };

von A.K. (Gast)


Angehängte Dateien:

Lesenswert?

Statt dass ich mich jetzt durch diese Codewurst quäle, überlass ich
lieber dir die Arbeit und poste den relevanten Teil von meinen Code.

von Boris (Gast)


Lesenswert?

wäre super

mail: boris-bobele@web.de

Boris

von A.K. (Gast)


Lesenswert?

Lesen musst Du schon selber... hängt doch dran.

von A.K. (Gast)


Angehängte Dateien:

Lesenswert?

Hoppla, da fehlte noch was

von Boris (Gast)


Lesenswert?

Oh, sorry hatte ich überlesen...

Frage zu Deinem Code:
- wo initialisierst du die Uhr?
- wo liest die Zeit/Datum aus?

von A.K. (Gast)


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.

von Boris (Gast)


Lesenswert?

Danke!

von Boris (Gast)


Lesenswert?

Hätte da noch eine Frage:
Was bezwecktst Du mit der Doppelzeile

> static uint8_t
> bcd2bin(uint8_t val)
> {
> ........
> }

Gruß
Boris

von A.K. (Gast)


Lesenswert?

Was irritiert dich daran? Die Funktion, die Syntax, die Deklaration, der
Stil? Ist eine stinknormale Funktionsdefinition.

von Boris (Gast)


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

von Boris (Gast)


Lesenswert?

Außerdem fehlen dem Compiler viel Deklerationen (val, month,..) und
kennt auch einige befehle nicht (div...)

von A.K. (Gast)


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 %.

von A.K. (Gast)


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.

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
Noch kein Account? Hier anmelden.