Sommer- und Winterzeit

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

Hinweis kann nach Kenntnisnahme deaktiviert werden!

  • Berechnung der Sommer- und Winterzeit mit Bascom
    Wem die Stunde schlägt ...

    Bascom hat zwar Routinen, um Uhrbausteine (z.B. DS1307, DS3231) auszulesen und deren Zeit einzubinden,
    aber die Umstellung auf die Sommerzeit am letzten Sonntag im März
    und Rückstellung am letzten Sonntag im Oktober
    muss man "zu Fuß" erledigen.
    Dazu gab es im Forum eine lebhafte Diskussion.
    2 Routinen als Ergebnis möchte ich hier einstellen.
    Beide sind von "Cable", die erste wurde von mir nur etwas modifiziert.

    a_57_04ef5ee8

    Die erste Routine ist für einen DS1307 geschrieben worden
    und funktioniert auch, wenn das System zwischenzeitlich ausgeschaltet wurde.
    Es müssen keine Flags o.ä. irgendwo dauerhaft gespeichert werden.
    Es wird einfach am letzten Sonntag im März um 2:00 Uhr die Uhrzeit um 1 Std. vorgestellt.
    Entsprechend wird am letzten Sonntag im Oktober um 3:00 Uhr die Uhrzeit um 1 Std. zurückgesetzt.
    Den Wochentag gewinnt man über die BASCOM-Funktion "Dayofweek()".
    Das "So_wi_flag" verhindert (nur) dass die Uhrzeit mehrfach verstellt wird.

    BASCOM-Quellcode

    1. ' Dim So_wi_flag As Byte
    2. ' Dim Weekday As Byte
    3. ' Dim Zeit As String * 8
    4. ' ...
    5. ' Subroutine Sommer- u. Winterzeit setzen
    6. ' Vorlage: https://bascomforum.de/index.php?thread/408-die-sommerzeit-naht/&postID=4614#post4614
    7. So_wi_zeit:
    8. If _day < 25 Then
    9. So_wi_flag = 0
    10. Else
    11. Weekday = Dayofweek()
    12. ' Weekday = 6 -> Sonntag
    13. If _month = 3 And _hour = 02 And Weekday = 6 And So_wi_flag = 0 Then
    14. _hour = _hour + 1
    15. So_wi_flag = 1
    16. Gosub Settime
    17. ' Zeitausgabe aktualisieren
    18. Zeit = Time$
    19. End If
    20. If _month = 10 And _hour = 03 And Weekday = 6 And So_wi_flag = 0 Then
    21. _hour = _hour - 1
    22. So_wi_flag = 1
    23. Gosub Settime
    24. ' Zeitausgabe aktualisieren
    25. Zeit = Time$
    26. End If
    27. End If
    28. Return
    Alles anzeigen


    Die 2. Routine ist für einen DS3231 geschrieben und nutzt dessen Eeprom:

    BASCOM-Quellcode

    1. On_sommer_winter:
    2. Gosub On Eeprom_read
    3. If _hour = 04 And Sw_flag <> 0 Then
    4. Sw_flag = 0
    5. Gosub On_eeprom_write
    6. End If
    7. If _day => 25 And _month = 3 And _hour = 02 And _weekday = 7 And Sw_flag = 0 Then
    8. Sw_flag = 1
    9. _hour = _hour + 1
    10. Gosub On_eeprom_write
    11. Gosub Settime
    12. End If
    13. If _day => 25 And _month = 10 And _hour = 03 And _weekday = 7 And Sw_flag = 0 Then
    14. _hour = _hour - 1
    15. Sw_flag = 1
    16. Gosub On_eeprom_write
    17. Gosub Settime
    18. End If
    19. '------------------ Eeprom write ------------------
    20. On_eeprom_write:
    21. I2cstart 'Start I2C
    22. I2cwbyte &HAE 'Sende Slave Adresse
    23. I2cwbyte &H01 'Sende Speicheradresse High
    24. I2cwbyte &H01 'Sende Speicheradresse LOw
    25. I2cwbyte Sw_flag 'Sende Wert
    26. I2cstop 'Stop I2C
    27. Waitms 10
    28. Return 'warte 10ms
    29. '------------------ Eeprom read ------------------
    30. On_eeprom_read:
    31. I2cstart 'Start I2C
    32. I2cwbyte &HAE 'sende Slave Adresse
    33. I2cwbyte &H01 'sende Speicheradresse High
    34. I2cwbyte &H01 'sende Speicheradresse Low
    35. I2cstart 'Start I2C
    36. I2cwbyte &HAF 'sende Slave Adresse +1 für Lesen
    37. I2crbyte Sw_flag , Nack 'lese Adresse vom EEprom
    38. I2cstop
    39. Waitms 10
    40. Return
    Alles anzeigen

    LG RoBu

    4.755 mal gelesen