- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 10 von 10

Thema: DS1307 einige Fragen

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    26.03.2006
    Beiträge
    361

    DS1307 einige Fragen

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Mein erstes Programm mit dem DS1307 läuft soweit ganz gut. Die Anzeige bei einstelligen Uhrzeiten sieht aber nicht wirklich nach Uhr aus.

    z.B. Uhrzeit "13:03:09" wird mir so dargestellt "13:3:9"

    Wie kann ich die 0 vor einstelligen Zahlen erzwingen?

    Dieses Uhrenprogramm möchte ich dann später (sobald alles einwandfrei läuft) in meine Haussteuerung integrieren. Es sollten dann z.B. alle verpassten Türklingelversuche protokolliert werden... oder halt zumindest die letzten 10. Allerdings weiß ich noch nicht so ganz wie ich das bewerkstelligen soll. Bin für jeden Tip dankbar.

    Hier mein Code:

    $regfile = "m8def.dat"
    $framesize = 32
    $swstack = 32
    $hwstack = 32
    $crystal = 400000

    Config Lcd = 20 * 4
    Config Lcdpin = Pin , Rs = Portc.5 , E = Portc.4 , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0
    Config Lcdbus = 4
    Waitms 20

    '+++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++
    ' Uhrdemo für DS1307 1007
    '+++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++

    Cls
    Config Sda = Portd.1
    Config Scl = Portd.0

    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 Monat As String * 3

    Dim Ds1307w As Byte
    Dim Ds1307r As Byte

    Ds1307w = &B11010000
    Ds1307r = &B11010001

    _day = 10
    _month = 10
    _year = 07
    _sec = 30
    _min = 13
    _hour = 15

    _sec = Makebcd(_sec)
    _min = Makebcd(_min)
    _hour = Makebcd(_hour)
    I2cstart
    I2cwbyte Ds1307w
    I2cwbyte 0
    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

    Losgehts:
    Do

    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
    _sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour)
    _day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year)


    If _month = 1 Then
    Monat = "Jan"
    End If
    If _month = 2 Then
    Monat = "Feb"
    End If
    If _month = 3 Then
    Monat = "Mar"
    End If
    If _month = 4 Then
    Monat = "Apr"
    End If
    If _month = 5 Then
    Monat = "Mai"
    End If
    If _month = 6 Then
    Monat = "Jun"
    End If
    If _month = 7 Then
    Monat = "Jul"
    End If
    If _month = 8 Then
    Monat = "Aug"
    End If
    If _month = 9 Then
    Monat = "Sep"
    End If
    If _month = 10 Then
    Monat = "Okt"
    End If
    If _month = 11 Then
    Monat = "Nov"
    End If
    If _month = 12 Then
    Monat = "Dez"
    End If

    Cls
    Locate 1 , 2
    Lcd _hour ; ":" ; _min ; ":" ; _sec ; " " ; _day ; "-" ; Monat ; "-" ; _year
    Cursor Off

    Waitms 500
    Loop

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

    Zeitdarstellung

    Hallo Accenter,
    Wie kann ich die 0 vor einstelligen Zahlen erzwingen?
    In Bascom am einfachsten durch: Lcd Time$ und Lcd Date$.
    Wenn du mit _hour, _sec ... arbeiten willst: If _hour < 10 then Lcd "0"

    Gruß Dirk

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    26.03.2006
    Beiträge
    361
    Danke für den Tip! Ich hab allerding keine Ahung wie ich in meinem Beispiel Date$ und Time$ anwende. Hat jemand einige Zeilen Programmcode für mich als Beispiel?

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803

    Zeitausgabe

    Ich hab allerding keine Ahung wie ich in meinem Beispiel Date$ und Time$ anwende.
    Probier doch einfach 'mal "Lcd Time$" anstelle von "Lcd _hour ; ":" ; _min ; ":" ; _sec" aus!

    Gruß Dirk

  5. #5
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    26.03.2006
    Beiträge
    361
    Hab ich soeben probiert, das klappt so leider nicht.

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803

    Formatierte Ausgabe

    Hallo Accenter,

    sorry, habe nicht gesehen, dass du _sec, _min usw. selbst definiert hast!

    Dann kann das mit Time$ nicht klappen. Dafür müßtest du mit CONFIG CLOCK = xyz (siehe Bascom-Hilfe!) die Uhr aktiviert haben. Danach gibt es dann die selben Variablen (_sec, usw).

    Da du aber die Variablen selbst definiert hast, gibt es 2 Möglichkeiten:
    1. If _hour < 10 Then Lcd "0";
    Lcd _hour; usw.
    2. Dim Hour_str As String * 2. Mit der Funktion Hour_str = str(_hour) die Stunde in einen String umwandeln.
    Diesen String dann formatiert zweistellig ausgeben:
    Hour_str = Format(Hour_str , "00")
    Lcd Hour_str

    Sieh dir die Hilfe unter str und format an!

    Gruß Dirk

  7. #7
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    26.03.2006
    Beiträge
    361
    Danke Dirk für deine tolle Hilfe!!
    Ich hab jetzt fast alles am laufen so wie es sein soll jedoch tritt ein merkwürdiges Phänomen auf sobald ich die variable "hour_str" im spiel habe.

    Es werden mir dann nur noch die Sekunden und der Doppelpunkt davor dargestellt (minuten und stunden werden komplett verschluckt). Wenn ich in der Zeile bei der LCD Ausgabe die Stunden weglasse (hour_str) sehe ich die Minuten und auch die Sekunden wieder. Ich kann mir das nicht erklären.

    Hier mein Code:

    Dim Sec_str As String * 2
    Dim Min_str As String * 2
    Dim Hour_str As String * 2

    Sec_str = Str(_sec)
    Sec_str = Format(sec_str , "00")
    Min_str = Str(_min)
    Min_str = Format(min_str , "00")
    Hour_str = Str(_hour)
    Hour_str = Format(hour_str , "00")
    Year_str = Str(_year)
    Year_str = Format(year_str , "00")


    Cls
    Locate 1 , 1
    Lcd " " ; Hour_str ; ":" ; Min_str ; ":" ; Sec_str
    Cursor Off

  8. #8
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    26.03.2006
    Beiträge
    361
    Wenn ich ein "INITLCD" einbaue wird alles korrekt dargestellt. Die Anzeige flackert dann jedoch leicht, das sich das Display im Loop immer wieder initialisiert. Es ist also ein Anzeigeproblem. Hat dieses Problem schonmal jemand gehabt?

  9. #9
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803

    LCD flackert

    Hallo Accenter,

    drei Maßnahmen helfen gegen Flackern:

    1. LCD nur neu beschreiben, wenn sich der Inhalt ändert. Bei einer Uhr kann man die letzte ausgegebene Sekunde speichern und mit der aktuell aus der RTC gelesenen Sekunde vergleichen. Sind beide noch gleich, kann die LCD-Ausgabe übersprungen werden.

    2. Kein CLS verwenden, sondern Inhalte an der selben Stelle überschreiben.

    3. Nicht zu schnell auf das LCD schreiben.

    Gruß Dirk

  10. #10
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    26.03.2006
    Beiträge
    361
    Danke Dirk, du hast mir extrem weitergeholfen! Es läuft nun alles wie es soll. Ich hab das CLS entfernt.

    Eine letzte Frage hätte ich noch.

    Wie kann ich die komplette Zeit und das Datum in eine Variable bekommen um das dann abspeichern zu können?

    Speichern ist vielleicht in diesem Zusammenhang das falsche Wort. Ich möchte einfach protokollieren wann jemand in meiner Abwesenheit an der Tür geklingelt hat.

Berechtigungen

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

Labornetzteil AliExpress