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.
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.
Alles anzeigen
Die 2. Routine ist für einen DS3231 geschrieben und nutzt dessen Eeprom:
Alles anzeigen
LG RoBu
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.
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
- ' Dim So_wi_flag As Byte
- ' Dim Weekday As Byte
- ' Dim Zeit As String * 8
- ' ...
- ' Subroutine Sommer- u. Winterzeit setzen
- ' Vorlage: https://bascomforum.de/index.php?thread/408-die-sommerzeit-naht/&postID=4614#post4614
- So_wi_zeit:
- If _day < 25 Then
- So_wi_flag = 0
- Else
- Weekday = Dayofweek()
- ' Weekday = 6 -> Sonntag
- If _month = 3 And _hour = 02 And Weekday = 6 And So_wi_flag = 0 Then
- _hour = _hour + 1
- So_wi_flag = 1
- Gosub Settime
- ' Zeitausgabe aktualisieren
- Zeit = Time$
- End If
- If _month = 10 And _hour = 03 And Weekday = 6 And So_wi_flag = 0 Then
- _hour = _hour - 1
- So_wi_flag = 1
- Gosub Settime
- ' Zeitausgabe aktualisieren
- Zeit = Time$
- End If
- End If
- Return
Die 2. Routine ist für einen DS3231 geschrieben und nutzt dessen Eeprom:
BASCOM-Quellcode
- On_sommer_winter:
- Gosub On Eeprom_read
- If _hour = 04 And Sw_flag <> 0 Then
- Sw_flag = 0
- Gosub On_eeprom_write
- End If
- If _day => 25 And _month = 3 And _hour = 02 And _weekday = 7 And Sw_flag = 0 Then
- Sw_flag = 1
- _hour = _hour + 1
- Gosub On_eeprom_write
- Gosub Settime
- End If
- If _day => 25 And _month = 10 And _hour = 03 And _weekday = 7 And Sw_flag = 0 Then
- _hour = _hour - 1
- Sw_flag = 1
- Gosub On_eeprom_write
- Gosub Settime
- End If
- '------------------ Eeprom write ------------------
- On_eeprom_write:
- I2cstart 'Start I2C
- I2cwbyte &HAE 'Sende Slave Adresse
- I2cwbyte &H01 'Sende Speicheradresse High
- I2cwbyte &H01 'Sende Speicheradresse LOw
- I2cwbyte Sw_flag 'Sende Wert
- I2cstop 'Stop I2C
- Waitms 10
- Return 'warte 10ms
- '------------------ Eeprom read ------------------
- On_eeprom_read:
- I2cstart 'Start I2C
- I2cwbyte &HAE 'sende Slave Adresse
- I2cwbyte &H01 'sende Speicheradresse High
- I2cwbyte &H01 'sende Speicheradresse Low
- I2cstart 'Start I2C
- I2cwbyte &HAF 'sende Slave Adresse +1 für Lesen
- I2crbyte Sw_flag , Nack 'lese Adresse vom EEprom
- I2cstop
- Waitms 10
- Return
LG RoBu
4.915 mal gelesen