-
-
Erfahrener Benutzer
Fleißiges Mitglied
Nochmal Uhrzeit
Guten an alle im Forum!
Das mit der Uhrzeit habe ich soweit hinbekommen mit Dirs hilfe. Nun aber ein weiteres Problem. Wenn ich den Controller resete dann durchläuft das Programm auch wieder den Teil, in dem die Uhr gestellt wird. Das ist nun aber nicht mehr die aktuelle Zeit. Was kann man den tun, um nicht jedesmal die Uhrzeit nach einem Reset (aber auch nach einem neuen Flash) neu eingeben zu müssen. Die "1 Sekunde" durch den Reset wo die Uhr falsch geht ist für meine Anwendung nicht wichtig. DCF77 möchte ich nicht nicht verwenden, da die Steuerung im Keller steht und der Empfang nicht ausreichend ist.
Danke für die Hilfe
Martin
$regfile = "m8def.dat"
$crystal = 3686400
$hwstack = 256
$swstack = 256
$framesize = 256
'*************Config RTC*************************************
Config Sda = Portc.4
Config Scl = Portc.5
Dim _weekday As Byte
Dim _day As Byte
Dim _month As Byte
Dim _year As Byte
Dim _sec As Byte
Dim _min As Byte
Dim _hour As Byte
Dim Ds1307w As Byte
Dim Ds1307r As Byte
Ds1307w = &B11010000
Ds1307r = &B11010001
_day = 31
_month = 10
_year = 07
_sec = 10
_min = 05
_hour = 21
_weekday = 1
Rem Zeitsetzen
_sec = Makebcd(_sec)
_min = Makebcd(_min)
_hour = Makebcd(_hour)
I2cstart
I2cwbyte Ds1307w
I2cwbyte 0
I2cwbyte _sec
I2cwbyte _min
I2cwbyte _hour
I2cstop
Rem Datumsetzen
_day = Makebcd(_day)
_month = Makebcd(_month)
_year = Makebcd(_year)
_weekday = Makebcd(_weekday)
I2cstart
I2cwbyte Ds1307w
I2cwbyte 3
'I2cwbyte _weekday
I2cwbyte _day
I2cwbyte _month
I2cwbyte _year
I2cstop
'************Funktionen LCD-Display****************************
Config Lcd = 40 * 4
Config Lcdpin = Pin , Rs = Portb.0 , Db4 = Portd.5 , Db5 = Portd.4 , Db6 = Portd.3 , Db7 = Portd.2 , E = Portd.6 , E2 = Portd.7
Config Lcdbus = 4
Config Lcdmode = Port
Dim ___lcdno As Byte
___lcdno = 0
Initlcd
Cursor Off
Cls
___lcdno = 1
Initlcd
Cursor Off
Cls
Do
Gosub Datum_zeit_einlesen
Waitms 1000
___lcdno = 1
Locate 1 , 1
Lcd Bcd(_hour) ; "/" ; Bcd(_min) ; "/" ; Bcd(_sec)
Locate 2 , 15
lcd _hour ' hier wird 33 ausgegeben und nicht 21 (es war beim Test 21
If _hour = 21 Then
Lcd _weekday
End If
Loop
Datum_zeit_einlesen:
I2cstart
I2cwbyte Ds1307w
I2cwbyte 0
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
Return
-
Erfahrener Benutzer
Roboter Genie
Hallo Martin,
der Sinn von einer autarken RTC ist doch, dass die Uhrzeit weiterläuft, egal was mit deinem Controller passiert.
Deswegen musst du als erstes nach dem Booten die Zeit aus der RTC laden, also Gosub Datum_zeit_einlesen. Danach kommt dann deine Main-Loop.
Anschließend kannst du dann intern weiterzählen, und die RTC nur zum Abgleich benutzen, weil deren Zeitbasis besser ist als die des µCs.
Gruß
Rolf
-
Erfahrener Benutzer
Fleißiges Mitglied
Danke für die Hilfe!
Eigentlich ganz klar, dass das so gehen muss. Nur selbst drauf kommen, da muss ich noch was tun.
Martin
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- Anhänge hochladen: Nein
- Beiträge bearbeiten: Nein
-
Foren-Regeln
Lesezeichen