-         

Ergebnis 1 bis 4 von 4

Thema: Datum einstellen mit Atmega168 und DS1307 funktioniert nicht

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    31.05.2006
    Alter
    57
    Beiträge
    5

    Datum einstellen mit Atmega168 und DS1307 funktioniert nicht

    Anzeige

    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

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    27.08.2006
    Alter
    69
    Beiträge
    83

    DS1307

    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

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    31.05.2006
    Alter
    57
    Beiträge
    5
    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

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    31.05.2006
    Alter
    57
    Beiträge
    5
    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

    \/

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •