Forum: Mikrocontroller und Digitale Elektronik Problem mit RTC DS1337C


von Florian M. (skywalker79)


Angehängte Dateien:

Lesenswert?

Hallo,

Ich habe ein Problem beim Beschreiben meiner Maxim RTC vom Typ DS1337C.

Wenn ich versuche, meine RTC zu beschreiben bekomme ich für die Stunden 
immer den Wert 00, für die Minuten den Wert 20 und Sekunden den Wert 10. 
Dabei ist es egal, welche Zeit ich auf die RTC aufspielen möchte. Ab dem 
Wochentag stimmen die eingestellten Werte komischerweise mit den 
programmierten Werten überein.

Als Beispiel zum Verdeutlichen:
ich möchte die Zeit 14:35:15 Freitag 10.08.07 auf die RTC schreiben.
Als Ergebnis nach dem Schreibvorgang liefert mir die RTC 00:20:10 
Freitag 10.08.07

Als Controller verwende ich einen ATMega128.

Im Anhang habe ich mal meinen C-Code für den TWI-Bus angehängt. Im 
Hauptprogramm wird das Beschreiben bzw. Auslesen der RTC einfach durch 
die Funktionen twi_test_schreiben(); bzw twi_test_lesen(); eingebunden.

Ich hoffe das mir jemand von euch bei meinem Problem helfen kann, da ich 
inzwischen schon leicht am Verzweifeln bin.

mit freundlichen Grüßen

Florian

von Florian M. (skywalker79)


Lesenswert?

Hallo,

hat keiner eine Idee?

mfg Florian

von Thorsten (Gast)


Lesenswert?

Was sollen diese Zeilen in "void twi_test_schreiben(void)" bewirken?

i2c_start_wait(adresse+I2C_WRITE);
i2c_write(sek_adresse);
i2c_write(0x0E);
i2c_write(0x20);
i2c_write(0);

Du schreibst 0x0E in die Sekunden (ungültige BCD Zahl, vielleicht wird 
daraus die "10"), 0x20 in die Minuten und 0x00 in die Stunden... Das 
sieht sehr ähnlich aus wie das, was Du wieder ausliest.

Gruss,
Thorsten

von Florian M. (skywalker79)


Lesenswert?

Hallo,

die Zeilen habe ich so aus dem Datenblatt für die RTC.
Aber hast recht, ohne die Zeilen
i2c_write(sek_adresse);
i2c_write(0x0E);
i2c_write(0x20);
funktioniert das schreiben der Zeit so, wie es soll.

Danke

mfg Florian

von Artur Funk (Gast)


Lesenswert?

Bin mir nicht sicher, aber probier mal folgendes:
void twi_test_schreiben(void)
{
  i2c_init();

  i2c_start_wait(adresse+I2C_WRITE);
  i2c_write(0x00);
   i2c_write(0x00);
  i2c_stop();

  i2c_start_wait(adresse+I2C_WRITE);
        i2c_write(0x00); // Adresspointer noch mal auf die Adr. 0 setzen
  i2c_write(sek_adresse);
   i2c_write(bcd_sekunden);
  i2c_write(bcd_minuten);
  i2c_write(bcd_stunden);
  i2c_write(wochentag);
  i2c_write(datum);
  i2c_write(monat);
  i2c_write(jahr);
        i2c_stop();
// Und was soll der Mist hier?
/*
  i2c_start_wait(adresse+I2C_WRITE);
  i2c_write(sek_adresse);
  i2c_write(0x0E);
  i2c_write(0x20);
  i2c_write(0);
*/

}


Außerdem sehe ich nicht, woe die BCD Umrechnung stattfindet. Zudem 
solltest du für den 24h Format vor der BCD Umrechnung das Byte mit 0x3f 
verknüpfen.

von Florian M. (skywalker79)


Angehängte Dateien:

Lesenswert?

Hallo,

Also die Umrechnung der Zeitwerte in BCD erfolgt momentan durch einfache
#define bcd_sekunden 0x00 usw.
einen Funktionstüchtigen Code um aus der über die UART empfangenen Zeit 
die BCD Zeit zu machen habe ich (die Funktion habe ich mit dem Oszi 
kontrolliert).
Der Fehler liegt tatsächlich in dem Teil, den ihr als Mist bezeichnet 
habt.
Dort habe ich fälschlicherweise noch einmal die Sekunden Adresse 
aufgerufen.
Ich habe einmal das Datenblatt angehängt, dass ihr nachvollziehen könnt, 
wieso ich auf diesen Mist gekommen bin.
Der entscheidende Codeteil ist auf Seite 4 unten.

mfg Florian

von Thorsten (Gast)


Lesenswert?

Florian,
der Unterschied zum Code im Datenblatt ist:
i2c_write(sek_adresse);
Du instruierst die RTC, die folgenden Bytes an die Adresse für die 
Sekunden (0x00) zu schreiben. Der Code im Datenblatt hat 0x0e als 
Zieladresse (Control register).
Gruss,
Thorsten

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.