Problem mit RTC DS1337C

OP #626320
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
Angehängte Dateien:
Gast #628686
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
Gast #628889
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.
OP #629029
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
Angehängte Dateien:
Gast #629040
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

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