- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 5 von 5

Thema: Auswertung Uhrzeit

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

    Auswertung Uhrzeit

    Anzeige

    Powerstation Test
    Guten Morgen an alle hier!

    Vor paar Tagen hatte ich wegen der Auswertung des Wochentages (RTC 1307) hier eine Frage gestellt und auch eine Lösung bekommen, die auch teilweise funktioniert. Eins geht jedoch nicht. Da ich nicht weiß ob ich einen Fehler gemacht habe, hier meine Frage.

    Ich verwende im Prinzip folgenden Code für die RTC. Abhängig vom Wochentag mochte ich etwas bestimmtes starten. z.B.

    if _weekday = 7 then
    Print Bcd(_day) ; "/" ; Bcd(_month) ; "/" ; Bcd(_year)
    LCD _weekday[/color]
    endif

    Diese If-Schleife habe ich in meinen Code eingebaut (zwichen "****").
    Mache ich da was falsch bei der If-Abfrage da ich beim bei mDatum setzen "_weekday = Makebcd(_weekday" verwendet habe?


    $regfile = "m8def.dat"
    $crystal = 8000000
    $baud = 9600

    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 = 23
    _month = 6
    _year = 05
    _sec = 10
    _min = 10
    _hour = 13
    _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


    Do

    Rem Datum und Zeit holen
    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


    Print Bcd(_hour) ; "/" ; Bcd(_min) ; "/" ; Bcd(_sec)
    Print "---------------------------------------"

    Waitms 1000
    '**************************************
    if _weekday = 7 then
    Print Bcd(_day) ; "/" ; Bcd(_month) ; "/" ; Bcd(_year)
    LCD _weekday[/color]
    endif
    '*****************************************
    Loop

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Hallo Martin,

    für _weekday brauchst du keine BCD-Umwandlung, weil der Wochentag nicht mehr als 4 Bit belegt. Du kannst _weekday also ohne Umwandlung in die RTC schreiben oder aus ihr lesen.

    Gruß Dirk

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    22.12.2006
    Beiträge
    109
    Hallo Dirk,

    irgendwie klappt das nicht. Ich habe folgendes gemacht. Wenn ich _hour auf dem Display anzeigen lasse, steht auf dem Display 33. Warum 33 wenn es beim Test 21 "Uhr" war. Hat das irgendwas mit BCD zu tun?

    $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

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    22.12.2006
    Beiträge
    109
    Ich habs!

    Ich muss _hour wieder in Dec. umwandeln mit

    Uhrzeit= MAKEDEC(_hour)
    Danke für die Hilfe Dirk

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Ich muss _hour wieder in Dec. umwandeln mit ...
    Genau! Ich würde das BCD-Umwandeln dann aber nicht bei der LCD-Ausgabe, sondern im Unterprogramm "Datum_zeit_einlesen:" machen. Dann hast du im ganzen Programm die Zeit in Dezimalform vorliegen (falls du Zeitabfragen auch für andere Steuerungszwecke brauchst, z.B. jede Stunde ...).
    Das "_weekday = Makebcd(_weekday)" brauchst du nicht. Da ist eh DEZ und BCD identisch.

    Gruß Dirk

Berechtigungen

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

LiFePO4 Speicher Test