-         

Ergebnis 1 bis 3 von 3

Thema: Nochmal Uhrzeit

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    22.12.2006
    Beiträge
    109

    Nochmal Uhrzeit

    Anzeige

    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

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.112
    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

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    22.12.2006
    Beiträge
    109
    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
  •