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