PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Datum einstellen mit Atmega168 und DS1307 funktioniert nicht



bapitz
05.03.2009, 01:32
Hallo,

ich programmiere mit winAVR (Workpad von myAVR mit winAVR-Compiler).

Ich habe folgendes Problem:

Ich kann per I2C den DS1307 ansprechen und die Uhrzeit (Sekunde, Minute, Stunde) ab Adresse 0 programmieren.

Nach Umwandlung der Sekunde, Minute und Stunde nach BCD funktioniert folgender Code:

twiStop();
twiAdr=DevDS1307;
myWait_ms(10);
twiStop();
myWait_ms(5);
twiStart();
myWait_ms(5);
twiWriteByte(DevDS1307,1);
myWait_ms(5);
twiWriteByte(0,1); // Adress-Byte 0 mit Akn
myWait_ms(5);
twiWriteByte(mySeconds1,1); // Adresse 0: Sekunden-Byte mit Akn
myWait_ms(5);
twiWriteByte(myMinute1,1); // Adresse 1: Minuten-Byte mit Akn
myWait_ms(5);
twiWriteByte(myHours1,1); // Adresse 2: Stunden-Byte mit Akn
myWait_ms(5);
twiStop();


Wenn ich die Adresse auf 3 Mit Wochentag bzw. 4 ohne Wochentag einstelle , funktioniert i.d.R. nur das Jahr korrekt. Der Tag und der Monat lassen sich mit Glück auf jeweils 1 einstellen. Höhere Werte werden nicht umgesetzt.

twiAdr=DevDS1307;
myWait_ms(10);
twiStop();
myWait_ms(5);
twiStart();
myWait_ms(5);
twiWriteByte(DevDS1307,1);
myWait_ms(5);
twiWriteByte(3,1); //Adress-Byte 3 mit Akn
myWait_ms(5);
twiWriteByte(3,1); //Adresse 3: Dummy Wochentag mit Akn
myWait_ms(5);
twiWriteByte(myDay1,1); //Adresse 4: Tag-Byte mit Akn
myWait_ms(5);
twiWriteByte(myMonth1,1); //Adresse 5: Monat-Byte mit Akn
myWait_ms(5);
twiWriteByte(myYear1,1); //Adresse 6: Jahr-Byte mit Akn
myWait_ms(5);
//twiWriteByte(0,1); // Statusregister (egal) mit Akn
//myWait_ms(5);
twiStop();

Mit folgenden Werten funktioniert es z.B. nicht.
uint8_t myDay1=4;
uint8_t myMonth1=3;
uint8_t myYear1=9;

Da alle Werte <10 sind, liegen diese folglich bereits im BCD-Format vor.
Die Wartezeiten (myWait_ms(5);) sind nur testweise eingebaut. Ich habe praktisch alles versucht, doch es funktioniert einfach nicht.

So habe ich z.B. die Uhr angehalten (Adresse 0 und Bit 7 auf 1) und dann versucht, das Datum einzustellen. Oder aber statt einer Byte-Adresse eine Word-Adresse angegeben. Alles ohne Erfolg!.


Wenn ich die Uhr auf 23:59:59 stelle, dann springt das Datum automatisch um. Wenn es auf 1.1.2009 war, springt es auf 0.1.2009!!! zurück. Wenn es auf 0.1.2009 stand, springt es auf den 1.1.2009.

Ich habe den DS1307-Chip auch schon gewechselt, doch es half nichts.



Der Chip ist korrekt mit einem Uhrenquarz verbunden und an eine zusätzliche Pufferbatterie mit 3,2 V angeschlossen (natürlich neben der normalen 5V stabilisierten Stromversorgung).

Hat jemand eine Idee, woran es liegen könnte?

Danke für Eure Mühe,

Bernd Apitz

ex535
05.03.2009, 17:07
Hi Bernd,

siehe Beispiel in BASCOM.

Setdate:
_day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)
I2cstart ' Start
I2cwbyte Ds1307w ' DS1307 schreiben
I2cwbyte 4 ' DS1307 Adresszeiger auf 4 (Byte 5) stellen
I2cwbyte _day ' Tag schreiben
I2cwbyte _month ' Monat schreiben
I2cwbyte _year ' Jahr schreiben
I2cstop
Return

Gruß
Kurt

bapitz
05.03.2009, 20:27
Hallo,

danke für die Antwort, aber die hilft mir leider nicht wirklich weiter.

Im Prinzip mache ich es in C++ genauso. In dem von mir angeführten Beispiel schreibe ich noch den Wochentag, jedoch habe ich es auch mit dem Tag beginnend (ab Adresse 4) auch probiert und es half nichts.

An den BCD-Daten kann es eigentlich nicht liegen, da ich es ja mit Dezimalzahlen unter 10 probiert habe.

Vielleicht hat jemand eine Idee, warum der Chip so merkwürdig reagiert (1.1.2009 automatisch nach 0.1.2009), wenn 0 Uhr erreicht wird.

In Erwartung weiterer produktiver Beiträge,

Bernd Apitz :-k :-k

bapitz
20.03.2009, 01:05
Hallo,

ich habe das Problem gelöst.

Das gezeigte Listing ist völlig i.O., jedoch hatte ich 2 Bugs bei der Umcodierung im BCD-Format drin!
](*,)
An Stelle von

0b0... (also Binärformat)

hatte ich versehentlich

0x0... (also Hexadezimalformat)

beim Tag und Monat drin. Das konnte nicht funktionieren.

Danke für die Antworten,

Bernd Apitz

\:D/