mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Real Time Clock


Autor: Boris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Boris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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();
      };

Autor: A.K. (Gast)
Datum:
Angehängte Dateien:
  • rtc.cc (2,11 KB, 154 Downloads)

Bewertung
0 lesenswert
nicht 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.

Autor: Boris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wäre super

mail: boris-bobele@web.de

Boris

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lesen musst Du schon selber... hängt doch dran.

Autor: A.K. (Gast)
Datum:
Angehängte Dateien:
  • rtc2.cc (114 Bytes, 97 Downloads)

Bewertung
0 lesenswert
nicht lesenswert
Hoppla, da fehlte noch was

Autor: Boris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oh, sorry hatte ich überlesen...

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

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Boris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke!

Autor: Boris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hätte da noch eine Frage:
Was bezwecktst Du mit der Doppelzeile

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

Gruß
Boris

Autor: A.K. (Gast)
Datum:

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

Autor: Boris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Boris (Gast)
Datum:

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

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 %.

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.