Forum: Mikrocontroller und Digitale Elektronik ds1307 uhrenwert und zählerwert zwischenspeichern mit bascom


von andi (Gast)


Lesenswert?

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

von Achim M. (minifloat)


Lesenswert?

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
Noch kein Account? Hier anmelden.