Hallo, ich möchte mit einem at mega 168 und einem ds1307 clock modul die uhrzeit laufen lassen. weiterhin möchte ich das die uhrzeit immer im ds1307 zwischengespeichert wird, damit im falle eines spannungsabfalles alles gesichert ist. außerdem möchte ich noch einen Zählerwert zwischenspeichern. der ds ist mit einer 3v pufferbatterie ausgestattet. hier schonmal mein bascom programm, läuft soweit aber ich kriegs nicht hin, den wert zu speichern. habt ihr vielleicht irgendwelche tipps danke gruß andi $regfile = "m168def.dat" 'es ist ein AtMega 168 Mikroprozessor $crystal = 8000000 'Taktgeschwindigkeit des internen Oszillators beträgt 8Mhz $baud = 19200 'Baudrate beträgt 19200 Config Sda = Portc.4 'Adresse I2C bus festlegen Config Scl = Portc.5 Dim _weekday As Byte 'Wochentag als Byte definieren Dim _day As Byte 'Tag als Byte definieren Dim _month As Byte 'Monat als Byte definieren Dim _year As Byte 'Jahr als Byte definieren Dim _sec As Byte 'Sekunden als Byte definieren Dim _min As Byte 'Minuten als Byte definieren Dim _hour As Byte 'Stunden als Byte definieren Dim Ds1307w As Byte 'Schreibadresse als Byte festlegen Dim Ds1307r As Byte 'Leseadresse als Byte festlegen Ds1307w = &B11010000 'Adressbyte zum schreiben definieren Ds1307r = &B11010001 'Adressbyte zum lesen definieren _day = 25 'Die Tagesvariable wird mit Zahlenwerten festgelegt _month = 10 'Die Monatsvariable wird mit Zahlenwerten festgelegt _year = 10 'Die Jahresvariable wird mit Zahlenwerten festgelegt _sec = 00 'Die Sekundenvariable wird mit Zahlenwerten festgelegt _min = 03 'Die Minutenvariable wird mit Zahlenwerten festgelegt _hour = 11 'Die Stundenvariable wird mit Zahlenwerten festgelegt _sec = Makebcd(_sec) 'Dezimalzahl in BCD Format konvertieren _min = Makebcd(_min) _hour = Makebcd(_hour) I2cstart I2cwbyte Ds1307w I2cwbyte 0 'Uhr auf Null stellen! I2cwbyte _sec I2cwbyte _min I2cwbyte _hour I2cstop _day = Makebcd(_day) _month = Makebcd(_month) _year = Makebcd(_year) I2cstart I2cwbyte Ds1307w I2cwbyte 3 I2cwbyte _weekday I2cwbyte _day I2cwbyte _month I2cwbyte _year I2cstop Do Rem Datum und Zeit holen I2cstart I2cwbyte Ds1307w I2cwbyte 0 I2cstop I2cstart I2cwbyte Ds1307r I2crbyte _sec , Ack I2crbyte _min , Ack I2crbyte _hour , Ack I2crbyte _weekday , Ack I2crbyte _day , Ack I2crbyte _month , Ack I2crbyte _year , Nack I2cstop _day = Makedec(_day) _month = Makedec(_month) _year = Makedec(_year) _sec = Makedec(_sec) _min = Makedec(_min) _hour = Makedec(_hour) Print _day ; "/" ; _month ; "/" ; _year Print _hour ; "/" ; _min ; "/" ; _sec Print "-----------------------------------------" Waitms 1000 Loop
Die 1307 fängt nicht immer bei internem Pointer=0 an zu schreiben. Das erste geschriebene Byte ist die Position des Pointers. Also zuerst eine 0 schreiben, dann die Sekunden, dann die Minuten usw. So kann man z.B. nur den DayOfWeek mit Hilfe der richtigen Pointer-Adresse ändern ohne Uhrzeit, Datum, Monat und Jahr zu verändern. Müsste also soweit bei dir gehen... Was machst du mit dem 12h/24h-Bit in den Stunden? andi schrieb: > I2cstart > I2cwbyte Ds1307w > I2cwbyte 0 > I2cstop <==diesen stop mal raus werfen, damits ein repeated Start ist > > I2cstart > I2cwbyte Ds1307r mfg mf
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.