'##############################################################################
' ConvCtrl.BAS:                                                Stand 11.12.2008
' -------------                                                (C) Markus Fulde
'
' Gesamtsoftware Steuerprogramm für Wintergartensteuerung ConvCtrl
'
' Das Projekt ConvCtrl verfügt über die folgenden einzelnen Funktions- und
' Teilkomponenten:
'     - Spannungsversorgung für +5V und +12V
'     - Mikrocontroller ATmega32 oder ATmega128 (inkl. ISP, RS232 und Reset)
'     - LCD-Display 3x16 (inkl. Rahmen mit "Scheibe")
'     - Tastatur und Schalter
'     - LED-Anzeigen für Status- und Funktionsanzeige
'     - Windmesser (pro Tick = 2,5m/sec Windgeschwindigkeit)
'     - Regensensor (ja/nein Detektion inkl. Detektorheizung)
'     - Temperatursensor (Anschluss über I2C Bus)
'     - Luftfeuchtigkeit (Anschluss über I2C Bus)
'     - Dimmungssteuerung für Beleuchtung (inkl. ein/aus Relais)
'     - Motorsteuerung für Beschattung (inkl. Verriegelung und Relais-Timeout)
'     - Gehäusebelüftung mit Option Lüftersteuerung über ATmega
'     - Datenspeicher / Datenlogger über EEPROM (Anschluss über I2C Bus)
'     - DCF77 Funkuhrempfang (Conrad)
'     - Passendes Selbstbaugehäuse aus Aluminium und rauchgläserner Front
'     - Helligkeitsmessung (Licht -> DC-Wandler mit OPAmp)
'     - Anzeige von Zeit- und Datumsinformationen
'     - Akustisches Feedback über Piezo Schallwandler
'     - Selbstcheck bei StartUp und ggf. Ausgabe von Warnmeldungen und Signalen
'     - Timersteuerung zeitkritischer Applikationen (Dimmer, LCD-Helligkeit,..)
'
'##############################################################################

'------------------------------------------------------------------------------
' Compilerinstruktionen und Compilerdirektiven
'------------------------------------------------------------------------------
$regfile = "m128def.dat"                                    ' Definitionsdatei für ATmega128 laden
$crystal = 16000000                                         ' Quarzfrequenz für 16 MHz festlegen
$hwstack = 128                                              ' HW-Stack auf 128 Bytes erweitern
$swstack = 64                                               ' SW-Stack auf 64 Bytes erweitern
$framesize = 80                                             ' Framesize auf 80 Byte festlegen

' Serielle Schnittstelle wird für Tracedatenausgabe verwendet
$baud = 38400                                               ' Baudrate für RS232 auf 38400 Bauf festlegen

' Einbinden der I2C-Library für das Hardware-Interface des ATmega
$lib "i2c_twi.lbx"                                          ' we do not use software emulated I2C but the TWI

'------------------------------------------------------------------------------
' Definition von Ressourcen
'------------------------------------------------------------------------------

' ----- TRACE:  Trace-Jumper
Trace_pin Alias Pinb.7                                      ' für Trace-Jumper-Abfrage (für DDR oder Input)
Trace Alias Portb.7                                         ' für Trace-Jumper-Abfrage (für Output oder PullUp)

' ----- SOUND:  Piezo Soundausgabe -----
' Port und Pin für Soundsteuerung
Sound_pin Alias Pind.5                                      ' für Piezo-Sound (für DDR oder Input)
Sound_dataout Alias Portd.5                                 ' für Piezo-Sound (für Output oder PullUp)

' ----- LCD: Display -----
' Port und Pin für LCD Display einschalten
Lcd_on_pin Alias Ping.1                                     ' um LCD einzuschalten (Transistorstufe) (für DDR oder Input)
Lcd_on_dataout Alias Portg.1                                ' um LCD einzuschalten (Transistorstufe) (für Output oder PullUp)

' ----- KEY: Tastatur -----
' Zeilen
Key_zeile_1_pin Alias Pina.0                                ' PortA.0 ist Zeile 1 (für DDR oder Input)
Key_zeile_2_pin Alias Pina.1                                ' PortA.1 ist Zeile 2 (für DDR oder Input)
Key_zeile_3_pin Alias Pina.2                                ' PortA.2 ist Zeile 3 (für DDR oder Input)

Key_zeile_1_port Alias Porta.0                              ' PortA.0 ist Zeile 1 (für Output oder PullUp)
Key_zeile_2_port Alias Porta.1                              ' PortA.1 ist Zeile 2 (für Output oder PullUp)
Key_zeile_3_port Alias Porta.2                              ' PortA.2 ist Zeile 3 (für Output oder PullUp)

' Spalten
Key_spalte_1_pin Alias Pinf.1                               ' PortF.1 ist Spalte 1 (für DDR oder Input)
Key_spalte_2_pin Alias Pinf.2                               ' PortF.2 ist Spalte 2 (für DDR oder Input)
Key_spalte_3_pin Alias Pinf.3                               ' PortF.3 ist Spalte 3 (für DDR oder Input)

Key_spalte_1_port Alias Portf.1                             ' PortF.1 ist Spalte 1 (für Output oder PullUp)
Key_spalte_2_port Alias Portf.2                             ' PortF.2 ist Spalte 2 (für Output oder PullUp)
Key_spalte_3_port Alias Portf.3                             ' PortF.3 ist Spalte 3 (für Output oder PullUp)

' ----- REL: Licht und Relais -----
' REL: Alias für Port und PIN der Relais-Steuerung
Out_auf Alias Pinc.6                                        ' Relais Beschattung auf (für DDR oder Input)
Out_zu Alias Pinc.7                                         ' Relais Beschattung zu (für DDR oder Input)
Out_licht Alias Ping.0                                      ' Relais Licht an (für DDR oder Input)
Out_dauerlicht Alias Pine.2                                 ' Relais Dauerlicht an (für DDR oder Input)

Rel_auf_on Alias Portc.6                                    ' Relais Beschattung auf (für Output oder PullUp)
Rel_zu_on Alias Portc.7                                     ' Relais Beschattung zu (für Output oder PullUp)
Rel_licht_on Alias Portg.0                                  ' Relais Licht an (für Output oder PullUp)
Rel_dauerlicht_on Alias Porte.2                             ' Relais Dauerlicht an (für Output oder PullUp)

' DIM: Alias für Dimmer_Steuerung
Null_detect Alias Pine.5                                    ' für Input-PIN (für DDR oder Input)
Null_detect_pin Alias Porte.5                               ' für PullUp (für Output oder PullUp)

Ignition Alias Pind.4                                       ' für Triac-Zündung (für DDR oder Input)
Triac_start Alias Portd.4                                   ' für Triac-Zündung (für Output oder PullUp)

' ----- LED:  Stand-Alone-LED's und LED Array -----
' Stand-Alone-LED's
Alive_led_pin Alias Pinb.0                                  ' GPIO für Alive-LED (für DDR oder Input)
Alive_led Alias Portb.0                                     ' GPIO für Alive-LED (für Output oder PullUp)

Sectick_led_pin Alias Pinb.6                                ' GPIO für Sekundentakt-LED (für DDR oder Input)
Sectick_led Alias Portb.6                                   ' GPIO für Sekundentakt-LED (für Output oder PullUp)
'Anmerkung: LED wird über SECTIC getoggelt. Frequenz ist damit 0,5 Hz!

' ----- RAIN: Regensensor -----
Rain_sensor Alias Ping.3                                    ' Anschluss an PinG.3 (für DDR oder Input)
' Anmerkung: Regensensor wird über Schmitt-Rigger geleitet. PullUp ist prinzipiell nicht notwendig.
'            Pull ist aber nach Reset und Input-Config via Default aktiv!

' ----- SHT71:  Temperatur- und Luftfeuchtigkeit -----
' Ressourcen für Zugriff (Nachbildung für I2C Bus
Sht71_sck Alias Portd.7                                     ' Sck PortD.7 (für Output oder PullUp)
Sht71_dataout Alias Portd.6                                 ' Data PortD.6 Output (für Output oder PullUp)
Sht71_datain Alias Pind.6                                   ' Data PortD.6 Input (für DDR oder Input)

' Ressourcen für Konfiguration
Temp_sck Alias Pind.7                                       ' Sck PortD.7 (für DDR oder Input)
Temp_data Alias Pind.6                                      ' Data PortD.6 (für DDR oder Input)

' ----- MEGA: Controller-Spezialitäten
' Interrupt-Flag-Register (relevant für Tastatureingabe)
External_interrupt_flag_register Alias Eifr                 ' Um Register zurück zu setzen

' TWI-Bus Hardware für RTC und EEPROM
Sda_port Alias Portd.1                                      ' TWI Data = SDA-Pin (für Output oder PullUp)
Scl_port Alias Portd.0                                      ' TWI Clock = SCL-Pin (für Output oder PullUp)

' ----- LED:  LED-Array -----
' Port Input Pin Adress für Datenbits
Led_bit0_pin Alias Pina.3                                   ' PortA.3 ist Daten-Bit0 (für DDR oder Input)
Led_bit1_pin Alias Pina.4                                   ' PortA.4 ist Daten-Bit1 (für DDR oder Input)
Led_bit2_pin Alias Pina.5                                   ' PortA.5 ist Daten-Bit2 (für DDR oder Input)
Led_bit3_pin Alias Pina.6                                   ' PortA.6 ist Daten-Bit3 (für DDR oder Input)

' Port Data Register für Datenbits
Led_bit0_port Alias Porta.3                                 ' PortA.3 ist Daten-Bit0 (für Output oder PullUp)
Led_bit1_port Alias Porta.4                                 ' PortA.4 ist Daten-Bit1 (für Output oder PullUp)
Led_bit2_port Alias Porta.5                                 ' PortA.5 ist Daten-Bit2 (für Output oder PullUp)
Led_bit3_port Alias Porta.6                                 ' PortA.6 ist Daten-Bit3 (für Output oder PullUp)

' Port Input Pin Adress für Adressbits
Led_adr0_pin Alias Pina.7                                   ' PortA.7 ist Adressen-Bit 0 (für DDR oder Input)
Led_adr1_pin Alias Ping.2                                   ' PortG.2 ist Adressen-Bit 1 (für DDR oder Input)

' Port Data Register für Adressbits
Led_adr0_port Alias Porta.7                                 ' PortA.7 ist Adressen-Bit 0 (für Output oder PullUp)
Led_adr1_port Alias Portg.2                                 ' PortG.2 ist Adressen-Bit 1 (für Output oder PullUp)

' Bemerkung:
' Durch die Verteilung der Adressen auf zwei Ports und damit nicht zusammenhängende
' Bits kommt es bei der Umschaltung der Adresse &B01 nach &B10 zu "Flackereffekten"
' bei denen entweder Adresse &B00 oder &B11 betroffen sind. Es ist im Einzelfall
' zu enscheiden ob zuerst Bit 0 auf LOW oder Bit 1 auf HIGH gezogen wird.
' Dieser Effekt ist nur dadurch zu vermeiden, indem beide Adressen in einem Port
' zusammengefasst werden. Der Zugriff darf dann nicht mit SET oder RESET erfolgen,
' sondern durch direkte Port-Ausgaben bei denen die 2-Bit-Adresse direkt gesetzt wird.

' Port Input Pin Adress für Latch Clear
Led_clr_pin Alias Ping.4                                    ' PortG.4 ist Latch Clear (für DDR oder Input)

' Port Data Register für Latch Clear
Led_clr_port Alias Portg.4                                  ' PortG.4 ist Latch Clear (für Output oder PullUp)

' Alias Namen für einzelne LED's im LED-Array
Led_01_sw1 Alias Led_array.0                                ' Bit 0 - LED1
Led_02_sw2 Alias Led_array.1                                ' Bit 1 - LED2
Led_03_sw3 Alias Led_array.2                                ' Bit 2 - LED3
Led_04_sw4 Alias Led_array.3                                ' Bit 3 - LED4
Led_05_sw5 Alias Led_array.4                                ' Bit 4 - LED5
Led_06_sw6 Alias Led_array.5                                ' Bit 5 - LED6
Led_07_sw7 Alias Led_array.6                                ' Bit 6 - LED7
Led_08_sw8 Alias Led_array.7                                ' Bit 7 - LED8
Led_09_sw9 Alias Led_array.8                                ' Bit 8 - LED9
Led_10_mem_full Alias Led_array.9                           ' Bit 9 - LED10
Led_11_open_time Alias Led_array.10                         ' Bit 10 - LED11
Led_12_open_light Alias Led_array.11                        ' Bit 11 - LED12
Led_13_open_rain Alias Led_array.12                         ' Bit 12 - LED13
Led_14_open_wind Alias Led_array.13                         ' Bit 13 - LED14
Led_15_close_time Alias Led_array.14                        ' Bit 14 - LED15
Led_16_close_temp Alias Led_array.15                        ' Bit 15 - LED16

'------------------------------------------------------------------------------
' Definition von Konstaten
'------------------------------------------------------------------------------

' Hinweis:
' Zur Ausgabe von Traces wurde auf der PCB1 der Wintergartensteuerung ein
' Jumper mit Kontroll-LED implementiert welcher abgefragt werden kann. Dieser
' Jumper ist in der bisherigen Systemimplementierung jedoch nicht berücksichtigt.
' Er wird initialisiert und abefragt und steht über die globale Variable
' TRACE_JUMPER_STATUS mit den Werten True und False zur Verfügung. Die bisherigen
' Implementierungen basieren jedoch auf definierten Konstanten.
' Weiter wurde in den Einstellungen auch eine im EEPROM ablegbare Variable
' Ee_data_debug vorgesehen und implementiert. Auch diese Variable wird aktuell
' nicht verwendet.

' ----- Für Testumgebung bzw. Traceausgaben -----
Const Main_testmodus = 0                                    ' Flag für Testmodus Allgemeinsystem
Const Lcd_testmodus = 0                                     ' Flag für Testmodus LCD-Dispaly
Const Fan_testmodus = 0                                     ' Flag für Testmodus Lüfter
Const Sound_testmodus = 0                                   ' Flag für Testmodus Piezo Sound
Const Key_testmodus = 0                                     ' Flag für Testmodus der Tastatur
Const Menue_testmodus = 0                                   ' Flag für Testmodus der Menüs
Const Dcf77_testmodus = 0                                   ' Testmodus für DCF77
Const Rtc_testmodus = 0                                     ' Testmodus für RTC DS1307
Const Dimmer_testmodus = 0                                  ' Testmodus für Dimmer
Const Sequencer_testmodus = 0                               ' Testmodus für Sequencer (Scheduler)
Const Relais_testmodus = 0                                  ' Testmodus für Relaisfunktionen
Const Rain_testmodus = 0                                    ' Testmodus für Regensensor
Const Wind_testmodus = 0                                    ' Testmodus Projekt 1 = aktiv
Const Sht71_testmodus = 0                                   ' Für Trace-Output über RS232
Const Light_testmodus = 0                                   ' Testmodus für Produktiv-Traceausgabe
Const Led_testmodus = 0                                     ' Flag für Testmodus
Const Eeprom_testmodus = 0                                  ' Testmodus für EEPROM
Const Datalogging_testmodus = 0                             ' Testmodus für Datalogging
Const Tracejumper_testmodus = 0                             ' Testmodus für Tracejumper
Const Timer_testmodus = 0                                   ' Testmodus für Timerfunktionen
Const Screensaver_testmodus = 0                             ' Testmodus für Screensaver
Const Shortcut_testmodus = 0                                ' Testmodus für ShortCut-Funktion
Const Flashmode_testmodus = 0                               ' Testmodus für Flashmode

' ----- LCD:  Für LCD-Display -----

' LCD: Konstanten für LCD-Helligkeit (Range 0-255 / 8 Bit)
Const Lcd_schrittweite_helligkeit = 5                       ' Schrittweite für Einzelschritte
Const Lcd_helligkeit_min = 0                                ' minimale Helligkeit
Const Lcd_helligkeit_max = 255                              ' maximale Helligkeit
Const Lcd_default_helligkeit = 60                           ' Default Helligkeit empirisch ermittelt
Const Lcd_helligkeit_aus = 255                              ' Bytewert für LCD-Aus

' LCD: Konstanten für LCD-Kontrast (Range 0-63 / 6 Bit)
Const Lcd_kontrast_min = 0                                  ' minimaler kontrast
Const Lcd_kontrast_max = 63                                 ' maximaler Kontrast
Const Lcd_kontrast_default = 12                             ' Default Kontrast empirisch ermittelt

Const Lcd_screensaver_default = 0                           ' Defaultwert für Screensaver
Const Lcd_screensaver_delay = 60                            ' 60 Sekunden Delay für Screensaver

' ----- FAN:  Für Lüfter -----

' FAN: Konstaten für FAN-Geschwindigkeit (Range 0-255 / 8 Bit)
Const Fan_schrittweite_geschwindigkeit = 5                  ' Schrittweite für Einzelschritte
Const Fan_geschwindigkeit_min = 100                         ' minimale Geschwindigkeit
Const Fan_geschwindigkeit_max = 255                         ' maximale Geschwindigkeit
Const Fan_default_geschwindigkeit = 200                     ' Default Geschwindigkeit
Const Fan_anlaufgeschwindigkeit = 130                       ' Anlaufgeschwindigkeit
Const Fan_belueftung_aus = 0                                ' Bytewert für Belüftung aus

' FAN: PWM-Werte für Lüftersteuerung
' Anmerkung: Geschwindigkeitswerte sind nicht errechnet sondern empirisch ermittelt
Const Fan_speed_25 = 120                                    ' Geschwindigkeitskonstante für 25% Lüfter
Const Fan_speed_50 = 165                                    ' Geschwindigkeitskonstante für 50% Lüfter
Const Fan_speed_75 = 210                                    ' Geschwindigkeitskonstante für 75% Lüfter
Const Fan_speed_100 = 255                                   ' Geschwindigkeitskonstante für 100% Lüfter

' FAN: Temperaturgrenzwerte für Lüfterstufen
Const Fan_25_default = 20                                   ' 25% Lüftung ab 20 °C
Const Fan_50_default = 35                                   ' 50% Lüftung ab 35 °C
Const Fan_75_default = 50                                   ' 75% Lüftung ab 50 °C
Const Fan_100_default = 65                                  ' 100% Lüftung ab 65 °C

' FAN: Temperaturgrenzen für Menüeinstellungen
Const Fan_min_temp = 0                                      ' niedrigste Temperatur für Lüftersteuerung in °C
Const Fan_max_temp = 99                                     ' höchste Temperatur für Lüftersteuerung in °C

' ----- SOUND:  Piezo Soundausgabe -----
Const Sound_beep_time_const = 100                           ' Festlegung auf 100 ms
Const Sound_beep_time_short = 50                            ' Festlegung auf 50 ms
Const Sound_flag_default = 1                                ' Sound via Default eingeschaltet

' ----- KEY:  Tastatur -----
Const Key_zeilen_pullup = &B00000111                        ' PullUp Definition für PORTA
'                                |||
'                                ||+--- PullUp für PortA.0 Zeile 1
'                                |+---- PullUp für PortA.1 Zeile 2
'                                +----- PullUp für PortA.2 Zeile 3

Const Key_spalten_ddrf = &B00001110                         ' Definition für Data Direction
'                              |||
'                              ||+--- DDR für PortF.1 Spalte 1
'                              |+---- DDR für PortF.2 Spalte 2
'                              +----- DDR für PortF.3 Spalte 3

Const Key_interrupt_mask = &B0111111                        ' Interrupt Mask für Bit7
Const Key_waiting = 50                                      ' Konstante in ms für Entprellung

Const Key_shortcut_status_default = 0                       ' Konstante für Shortcut-Default

' ----- MENUE:  Menue -----
' Die Menüsteuerung erfolgt nur über die Tasten Hoch | Runter | Links | Rechts | Enter
' Für die Funktionen Heller | Dunkler und Auf | Zu werden ShortCut-Funktionen implementiert
Const Key_buttons = 5                                       'Anzahl der Tasten für das Menü

' Die logische Zustands-NULL für das Menue
Const Key_null = 0                                          'keine Taste gedrückt

' Wartezeit von Scr03 vor Einstieg in Hauptmenue
Const Menue_scr03_delay = 3                                 ' Delay-Time 3 Sekunden

' ----- RTC:   DS1307 -----
' RTC:  Steuerkommandos für die exerne RTC DS1307
Const Rtc_address_write = &B11010000                        ' Adresse des DS1307 = &HD0 (schreiben)
Const Rtc_address_read = &B11010001                         ' Adresse des DS1307 = &HD1 (lesen)

' RTC:  Adressen für die exerne RTC DS1307
Const Rtc_address_seconds = &H00                            ' Adresse der Sekunden im RTC-Speicher
Const Rtc_address_minutes = &H01                            ' Adresse der Minuten im RTC-Speicher
Const Rtc_address_hours = &H02                              ' Adresse der Stunden im RTC-Speicher
Const Rtc_address_day = &H03                                ' Adresse der Wochentag im RTC-Speicher
Const Rtc_address_date = &H04                               ' Adresse der Tag im RTC-Speicher
Const Rtc_address_month = &H05                              ' Adresse der Monat im RTC-Speicher
Const Rtc_address_year = &H06                               ' Adresse der Jahr im RTC-Speicher
Const Rtc_address_control = &H07                            ' Adresse der Controllregister im RTC-Speicher
' Anmerkung: Die Adressen können einzeln übergeben werden. Durch Block-Lesen
' können aber alle weiteren Daten hintereinander ausgelesen werden. Ein neues
' Adressieren ist nicht notwendig. Gestartet wird üblich mit Rtc_address_seconds

' ----- REL:  Relais -----
Const Passiv = 0                                            ' Definition Boolscher Zustand Passiv
Const Aktiv = 1                                             ' Definition Boolscher Zustand Aktiv

Const Rel_beschattung_min = 1                               ' Minimale Antriebs-Delay-Zeit in sec
Const Rel_beschattung_max = 200                             ' Maximale Antriebs-Delay-Zeit in sec

Const Rel_auf_dunkelheit_default = 5                        ' Grenzdunkelheit [0..15]
Const Rel_auf_dunkelheit_min = 1                            ' Einstellbare Helligkeit Minimum
Const Rel_auf_dunkelheit_max = 15                           ' Einstellbare Helligkeit Maximum

Const Rel_zu_temperatur_default = 20                        ' Grenztemperatur in °C
Const Rel_zu_temperatur_min = 1                             ' Einstellbare Temperatur Minimum °C
Const Rel_zu_temperatur_max = 99                            ' Einstellbare Temperatur Maximum °C

Const Rel_delay_default = 30                                ' Default-Wert für Antriebszeitüberwachung in sec
' Anmerkung: Rel_beschattung_delay ist die Zeitverzögerung mit der der Antrieb
' automatisch wieder abgeschaltet wird. Der Antrieb selbst verfügt über einen
' "Endanschlag" der den Antrieb selbst abschaltet. Hier geht es nur noch darum
' nicht dauerhaft Spannung auf den Leitungen und Antrieben zu haben.

' ----- DIM:  Dimmer und Lichtfunktionen -----
' für Betrieb
Const Dim_helligkeit_default = 16                           ' Standardwert für Dimmerhelligkeit [1..32]
Const Dim_helligkeitstabellenwerte = 32                     ' Anzahl an Dimmerstufen
Const Dim_helligkeit_min_default = 3                        ' kleinste Dimmerhelligkeit
Const Dim_helligkeit_max_default = 30                       ' hellste Dimmerhelligkeit
Const Dim_flash_grenzhelligkeit = 10                        ' Grenzhelligkeit für Flash-Mode [0..15]

' für Einstellungen
Const Dim_helligkeit_set_min = 1                            ' unterste einstellbare Grenze [1..32]
Const Dim_helligkeit_set_max = 32                           ' oberste einstellbare Grenze [1..32]

' ----- RAIN:  Regensensor -----
Const Rain_no = 0                                           ' Boolsche Variable für NO
Const Rain_yes = 1                                          ' Boolsche Variable für YES

' ----- WIND:  Windsensor -----
Const Wind_auswertung_default = 3                           ' Default Auswerteintervall in Sekunden
Const Wind_auswertung_min = 1                               ' Auswerteinterval untere Grenze in sec
Const Wind_auswertung_max = 30                              ' Auswerteinterval obere Grenze in sec
Const Wind_impuls_geschwindigkeit = 2.5                     ' Ein Impuls entspricht 2,5 m/sec Wind

Const Wind_beschattung_auf_default = 15                     ' Beschattung auf bei 15 km/h
Const Wind_beschattung_min = 1                              ' kleinste Windgeschwindigkeit in km/h
Const Wind_beschattung_max = 50                             ' größte Windgeschwindigkeit in km/h

' ----- LIGHT:  Lichtsensor -----
Const Light_auswertung_default = 10                         ' Default Auswerteintervall in Sekunden
Const Light_messwert_zahl = 5                               ' Anzahl wie of Light für Mittelwert gemessen werden soll

' ----- SHT71:  Temperatur- und Luftfeuchtigkeit -----

' SHT71: Konstanten für Messungssteuerung
Const Sht71_auswertung_default = 15                         ' Default Auswerteintervall in Sekunden
Const Sht71_auswertung_min = 1                              ' Auswerteintervall untere Grenze
Const Sht71_auswertung_max = 30                             ' Auswerteinterval obere Grenze

' SHT71: Kommandocodes für SHT71-Befehle                      adr command r/w
Const Sht71_status_reg_write = &H06                         ' 000  0011    0
Const Sht71_status_reg_read = &H07                          ' 000  0011    1
Const Sht71_measure_temp = &H03                             ' 000  0001    1
Const Sht71_measure_humi = &H05                             ' 000  0010    1
Const Sht71_reset = &H1E                                    ' 000  1111    0

' SHT71: Konstanten für die Berechnung von Luftfeuchtigkeit und Temperatur

' SHT71: Konstante für Berechung von RHlinear
Const Sht71_c1 = -4                                         ' Parameter C1 für 12 Bit
Const Sht71_c2 = 0.0405                                     ' Parameter C2 für 12 Bit
Const Sht71_c3 = -0.0000028                                 ' Parameter C3 für 12 Bit
' Const Sht71_c1 = -4                                         ' Parameter C1 für 8 Bit
' Const Sht71_c2 = 0.648                                     ' Parameter C2 für 8 Bit
' Const Sht71_c3 = -0.00072                                   ' Parameter C3 für 8 Bit

' SHT71: Konstanten für Temperaturberechnung
Const Sht71_d1 = -40.00                                     ' Parameter D1 für 5V und °C
'Const Sht71_d1 = -39.75                                     ' Parameter D1 für 4V und °C
'Const Sht71_d1 = -39.66                                     ' Parameter D1 für 3.5V und °C
'Const Sht71_d1 = -39.60                                     ' Parameter D1 für 3V und °C
'Const Sht71_d1 = -39.55                                     ' Parameter D1 für 2.5V und °C
Const Sht71_d2 = 0.01                                       ' Parameter D2 für 14 Bit und °C
'Const Sht71_d2 = 0.04                                       ' Parameter D2 für 12 Bit und °C

' SHT71: Konstanten für Berechung von RHtrue
Const Sht71_t1 = 0.01                                       ' Parameter T1 für 8 und 12 Bit
Const Sht71_t2 = 0.00008                                    ' Parameter T2 für 12 Bit
'Const Sht71_t2 = 0.00008                                    ' Parameter T2 für 8 Bit

' SHT71: Konstanten zur Berechnung des Taupunktes
Const Sht71_tn = 243.12                                     ' Wert lambda für Taupunktberechnung
Const Sht71_m = 17.62                                       ' Wert BETA für Taupunktberechnung
Const Sht71_alpha = 0.4343                                  ' Parameter für Logaritmusberechnung

' SHT71: Sonstige Konstanten
Const Sht71_acknowledge = 1                                 ' Positive Quittierung = Weiter
Const Sht71_noacknowledge = 0                               ' Negative Quittierung = Ende

Const Sht71_modus_humi = 1                                  ' Parameter für measure Modus Luftfeuchtigkeit
Const Sht71_modus_temp = 2                                  ' Parameter für measure Modus Temperatur

Const Sht71_communication_wait = 11                         ' 11 ms nach PowerUp/Reset warten

Const Sht71_response_wait = &H0004FFFF                      ' bei ATmega128 mit 16Mhz ca. 1,5 sec.

Const Crc_ok = 0                                            ' CRC-Ergebnisse OK
Const Crc_nok = 1                                           ' CRC-Ergebnis nicht OK

' SHT71: Konstanten für Beschattungssteuerung
Const Sht71_hysterese = 5                                   ' Implementierung einer 5° Hysterese

' ----- LED:  LED-Array -----
Const Led_key_mask = &B1111111000000000                     ' Maske um alle Tasten-LED's abzuschalten

' ----- EE: internes & externes EEPROM -----
Const Ee_auswertung_default = 600                           ' Default Auswerteintervall = 10 Minuten
Const Ee_auswertung_min = 60                                ' Auswerteinterval untere Grenze = 1 Min
Const Ee_auswertung_max = 1800                              ' Auswerteinterval obere Grenze = 30 Min

' Versionsverwaltung der Datenstrukturen
Const Akt_internal_ee_version = &H05                        ' Aktuelle EEPROM-Datenstruktur intern
Const Akt_external_ee_version = &H02                        ' Aktuelle EEPROM-Datenstruktur extern
' Hinweis: Über die Versionsverwaltung der Datenstrukturen wird vermieden, dass
' ablegete Daten Missinterpretiert werden. Auf diesem Weg können die Daten an
' jeder Stelle und zu jeder Zeit geändert werden. Bei jeder Änderung muss die
' Konstante erhöht werden. Bei Systemstart wird geprüft ob Initialisierung noch
' stimmt. Wenn neun werden alle Daten mit Default-Werten neu geladen.

' EE: Konstanten für Datenlogging (externes EEPROM)
Const Ee_data_version_extern_adress = &H0000                ' Byte-Variable: Datenversion
Const Ee_data_count_adress = &H0001                         ' Word-Variable: Anzahl Datenpakete
Const Ee_data_overrun_adress = &H0003                       ' Byte-Variable: Überlaufzähler
Const Ee_data_loging_start_adress = &H0008                  ' Word-Variable: Startadresse für Ringbuffer
Const Ea_data_loging_length = 8                             ' Anzahl der Datenbytes in einem Daten-Record
Const Ea_data_loging_endadress = &H1FFF                     ' = 8191
'Const Ea_data_loging_endadress = &H000A                     ' = 10 for Test

Const Ee_data_count_default = &H0000                        ' Startwert für Ringbufferzähler
Const Ee_data_overrun_default = &H00                        ' Startwert für Überlaufzähler

' EE:  Adressen für das exerne EEPROM
Const Address_write = &B10100000                            ' Adresse des 24C512 = &HA0 (schreiben)
Const Address_read = &B10100001                             ' Adresse des 24C512 = &HA1 (lesen)

' ----- Timer: Timer -----

' Konstanten für Defaultwerte
Const Timer_open_flag_default = 0                           ' Funktion automatisches Öffnen ist Default AUS
Const Timer_close_flag_default = 0                          ' Funktion automatisches Schließen ist Default AUS

' ----- Allgemeine Konstanten -----
' Boolsche Variablen
Const True = 1                                              ' Boolsche Variable TRUE
Const False = 0                                             ' Boolsche Variable FALSE

' Variablen zur Klassifizierung ob Funktion über Menue oder Hot_Key ausgelöst
Const Menue_activated = &H01                                ' Funktion über Menü ausgelöst
Const Hotkey_activated = &H02                               ' Funktion über Hotkey ausgelöst

'------------------------------------------------------------------------------
' Definition von Variablen und Datentypen
'------------------------------------------------------------------------------

' ----- TRACE:  Trace-Jumper -----
Dim Trace_jumper_value As Byte                              ' globales Trace-Flag

' ----- LCD:  Für LCD-Display -----

' Variable für Helligkeits-PWM deklarieren und mit Defaultwert laden
Dim Lcd_pwmwert As Byte                                     ' Dimwert für LCD-Helligkeit
Dim Lcd_pwmwert_buffer As Byte                              ' Speicherung des eingestellten Helligkeitswerts

Dim Lcd_screensaver As Byte                                 ' Flag für Screen-Saver-Modus
Dim Lcd_screensaver_counter As Word                         ' Sectic counter für Screensaver
Dim Lcd_screensaver_aktiv As Byte                           ' Flag ob Screensaver aktiv ist

' Variablen für Lcd_kontrastwerte deklarieren und mit Default laden
Dim Lcd_kontrastwert As Byte                                ' Kontrastwert für LCD-Display
Dim Lcd_helligkeit As Byte                                  ' Helligkeitswert is Einerkomplement von Lcd_pwmwert!

' ----- FAN:  Für Lüfter -----

' Variablen für Geschwindigkeits-PWM deklarieren und mit Defaultwert laden
Dim Fan_pwmwert As Byte                                     ' Geschwindigkeitswert für Lüfter
Dim Fan_sw_betrieb As Byte                                  ' Flag ob Fan via SW gesteuert werden soll
Dim Fan_25_temperatur As Byte                               ' Temperaturvariable für 25% Lüftung
Dim Fan_50_temperatur As Byte                               ' Temperaturvariable für 50% Lüftung
Dim Fan_75_temperatur As Byte                               ' Temperaturvariable für 75% Lüftung
Dim Fan_100_temperatur As Byte                              ' Temperaturvariable für 100% Lüftung

' ----- SOUND:  Piezo Soundausgabe -----
Dim Sound_beep_time As Word                                 ' Dauer eines Beep
Dim Sound_flag As Byte                                      ' Flag ob Töne ausgegeben werden sollen

' ----- KEY:  Tastatur -----
Dim Key_keypressed As Byte                                  ' Globale Variable zur Tastensignalisierung

Dim Key_taste As Byte                                       ' Variable enthält Tastennummer
Dim Key_taste_buffer As Byte                                ' Buffer für verstätete Tastenauswertung
Dim Key_spalte As Byte                                      ' Variable für Spalten
Dim Key_spalten_index As Byte                               ' Variable für Spaltenindex Tastenrechung
Dim Key_zeile As Byte                                       ' Variable für Zeilen

' Hinweis:
' In verschiedenen Menüs ist es notwendig die Taste zu kennen welche betätigt
' wurde. Aus diesem grund wird unabhängig von der Menüsteuerung jeder Tasten-
' druck in der Buffer-Variable Key_taste_buffer gespeichert.

' ----- MENUE:  Menue -----
' Tastencodes
Dim Key_codes(key_buttons) As Byte                          ' Array für Tastencodes
Dim Key_shortcut_status As Byte                             ' Statusflag für Short-Cut Modus

' Textausgaben
Dim Menue_lcd_textbuffer(3) As String * 17                  ' Auslesebuffer für die Menü-Strings
Dim Menue_ausgabeflags As Byte                              ' Ausgabeflags wie viele Zeilen

' Zustandsvariablen
Dim Menue_state As Word                                     ' aktueller State
Dim Menue_state_buffer As Word                              ' gebufferter Menüstatus
Dim Menue_state_renew As Byte                               ' Flag
Dim Menue_state_gosub As Word                               ' aktuelles Unterprogramm

Dim Menue_indimmenue_flag As Byte                           ' Flag für Dimmermenü wegen Shortcuts
Dim Menue_inrelmenue_flag As Byte                           ' Flag für Beschattungsmenue wegen Shortcuts
Dim Menue_insensmenue_flag As Byte                          ' Flag für zyklisches Update von Menüs

' Arbeitsvariablen für universelles Zeit-Einstellmenue
Dim Menue_time_sekunde As Byte                              ' Sekunde
Dim Menue_time_minute As Byte                               ' Minute
Dim Menue_time_stunde As Byte                               ' Stunde

' Arbeitsvariablen für universelles Datum-Einstellmenue
Dim Menue_date_tag As Byte                                  ' Tag
Dim Menue_date_monat As Byte                                ' Monat
Dim Menue_date_jahr As Byte                                 ' Jahr

' Sonstige Arbeitsvariablen
Dim Menue_tagesanzahl As Byte                               ' Globale Variable für Bufferung von Tagen im Monat
Dim Menue_datenuebernahme_flag As Byte                      ' Datenübernahmeflag für Time und Date
Dim Menue_data_changed_flag As Byte                         ' Flag für Datenübernahme in Settings

' ----- DCF77:  Funkuhr -----
Dim Dcf77_hour As Byte                                      ' Globale Stundenvariable
Dim Dcf77_min As Byte                                       ' Globale Minutenvariable
Dim Dcf77_sec As Byte                                       ' Globale Sekundenvariable

Dim Dcf77_weekday As Byte                                   ' Globaler Wochentag

Dim Dcf77_day As Byte                                       ' Globale Tagvariable
Dim Dcf77_month As Byte                                     ' Globale Monatsvariable
Dim Dcf77_year As Byte                                      ' Globale Jahresvariable

Dim Sectic_count As Word                                    ' Globaler SecTic (für Scheduler)
Dim Dcf_sync_count As Byte                                  ' Zähler für Anzahl der Syncs

' ----- REL: Relais und Licht -----
Dim Beschattung_auf_flag As Byte                            ' Flag ob Beschattung auf aktiv
Dim Beschattung_zu_flag As Byte                             ' Flag ob Beschattung zu aktiv
Dim Beschattung_auf_counter As Word                         ' Sectic-Counter für Abschaltung auf
Dim Beschattung_zu_counter As Word                          ' Sectic-Counter für Abschaltung zu

Dim Rel_beschattung_delay As Byte                           ' Gloable Varaible für Beschattungsdelay

Dim Rel_auf_dunkel_flag As Byte                             ' Flag ob automatisches Auffahren bei Dunkelheit
Dim Rel_auf_dunkelheit As Byte                              ' Variable für Dunkelheitswert

Dim Rel_zu_temp_flag As Byte                                ' Flag ob automatisches Zufahren bei Temperatur
Dim Rel_zu_temperatur As Byte                               ' Variable für Grenztemperatur

' ----- DIM:  Dimmer -----
Dim Triac_zuenszeitpunkte(32) As Byte                       ' Array für Triac Zündzeitpunkte
Dim Dim_helligkeitsstufe As Byte                            ' Globale Variable für Dimmerhelligkeit
Dim Dim_index_counter As Byte                               ' Indexvariable für Auslesen der Zündzeitpunkte
Dim Free_running_flag As Byte                               ' Flag ob Dimmer als single shot oder free running
Dim Beleuchtung_flag As Byte                                ' Flag für Beleuchtungsrelais
Dim Dauerlicht_flag As Byte                                 ' Flag für Dauerlicht-Relais
Dim Dim_flash_mode As Byte                                  ' Flag für Flash-Mode
Dim Dim_flash_mode_locked As Byte                           ' Flag für Verriegelung des Flash-Mode
Dim Dim_helligkeit_min As Byte                              ' Aktuelle minimale Helligkeit
Dim Dim_helligkeit_max As Byte                              ' Aktuelle maximale Helligkeit
' Anmerkung: Der Flasmode beschreibt das automatische Anfahren des Dimmers bis
' zur aktuell eingestellten Dimmerstufe bei absinkender Raumhelligkeit

' ----- WIND:  Windsensor -----
Dim Wind_sensorimpulse As Byte                              ' Zähler für Windimpulse
Dim Wind_geschwindigkeit_kmh As Single                      ' Variable für Windgeschwindigkeit in km/h
Dim Wind_kmh_max As Single                                  ' Maximale gemessene Windgeschwindigkeit
Dim Wind_geschwindigkeit_ms As Single                       ' Variable für Windgeschwindigkeit in m/s
Dim Wind_erfassung As Byte                                  ' Globale Variable zum Status der Erfassung
                                                            ' True = Erfassung Wind läuft, False = Abgeschaltet
Dim Wind_auswertung As Byte                                 ' Einstellung für Auswerteintervall (Zeit)
Dim Wind_erfassungs_counter As Word                         ' Globaler Zähler für Windauswertung

Dim Wind_beschattung_auf As Byte                            ' Globale Varible für kritische Windgeschwindigkeit

Dim Wind_autoauffahren As Byte                              ' Globales Flag für automatisches Auffahren

' ----- SHT71:  Temperatur- und Luftfeuchtigkeit -----
Dim Sht71_erfassung As Byte                                 ' Globale Variable zum Status der Erfassung
                                                            ' True = Erfassung Wind läuft, False = Abgeschaltet
Dim Sht71_auswertung As Byte                                ' Einstellung für Auswerteintervall (Zeit)
Dim Sht71_erfassungs_counter As Word                        ' Globaler Zähler für Temp&Hum

' globale Hilfsvariablen
Dim Sht71_transceive_struct(3) As Byte                      ' Sende-Datenstruktur für SHT71
Dim Sht71_temp_byte1 As Byte                                ' Temporäre Arbeitsvariable Byte für SHT71
Dim Sht71_humi_word As Word                                 ' Rohdatenwert (16-Bit) für Luftfeuchtigkeit
Dim Sht71_temp_word As Word                                 ' Rohdatenwert (16-Bit) für Temperatur
Dim Sht71_checksum As Byte                                  ' Arbeitsvariable für SHT71 Checksummenrechnung
Dim Sht71_error_result As Byte                              ' Arbeitsvariable für SHT71 Fehlerbehandlung

' globale Variable für Temperatur, Luftfeuchtigkeit und Taupunkt
Dim Sht71_rhlinear As Single                                ' Luftfeuchtigkeit linear
Dim Sht71_rhtrue As Single                                  ' Luftfeuchtigkeit mit Korrektur (real)
Dim Sht71_rhtrue_min As Single                              ' Minimaler gemessener Feuchtigkeitswert
Dim Sht71_rhtrue_max As Single                              ' Maximaler gemessener Feuchtigkeitswert
Dim Sht71_dewpoint As Single                                ' Taupunkt
Dim Sht71_t As Single                                       ' Temperatur
Dim Sht71_t_min As Single                                   ' Minimale gemessene Temperatur
Dim Sht71_t_max As Single                                   ' Maximale gemessene Temperatur

Dim Sht71_autozufahren As Byte                              ' Globales Flag für automatisches Zufahren
Dim Sht71_autozufahren_locked As Byte                       ' Verriegelung gegen erneutes Zufahren

' ----- LIGHT:  Lichtsensor -----
Dim Light_channel As Byte                                   ' Variable für ADC-Kanal festlegen
Dim Light_erfassung As Byte                                 ' Globale Variable zum Status der Erfassung
                                                            ' True = Erfassung Licht läuft, False = Abgeschaltet
Dim Light_erfassungs_counter As Word                        ' Globaler Zähler für Lichtwerterfassung
Dim Light_value As Byte                                     ' Globaler Lichtmesswert
Dim Light_update_flag As Byte                               ' Flag für Werteupdate (Wird bei Flash benötigt)

Dim Light_autoauffahren As Byte                             ' Globales Flag für automatisches Auffahren
Dim Light_autoauffahren_locked As Byte                      ' Verriegelung gegen erneutes Auffahren bei Dunkelheit

' ----- RAIN:  Regensensor -----
Dim Rain_autoauffahren As Byte                              ' Globales Flag für automatisches Auffahren

' ----- LED:  LED-Array -----
Dim Led_array As Word                                       ' Globale Variable für LED's
Dim Led_array_save As Word                                  ' Buffer um Änderungen zu tracken
' Der Zugriff auf das Array erfolgt Bitweise. Übertragen wird das gesamte Word
' in das Latch!
Dim Led_key_flag As Byte                                    ' Flag zur Steuerung der LED-Überwachung
Dim Led_key_counter As Word                                 ' Merker für aktuellen SecTic

' ----- EE: internes & externes EEPROM -----

' generelle Einstellungen für Datenlogging und Auswertungsintervall
Dim Ee_datalogging_flag As Byte                             ' Globales Flag ob Daten gelogged werden sollen
Dim Ee_auswertung As Word                                   ' Zeitintervall für Loggingdaten

Dim Ee_erfassungs_counter As Word                           ' Globaler Zähler für Logging-Daten schreiben

' EE: EEPROM Datenstruktur internes EEPROM - Setting-Daten
Dim Ee_data_version_intern As Eram Byte At &H0000           ' Speicherstelle für Datenversion
Dim Ee_data_debug As Eram Byte At &H0001                    ' Byte-Variable: Test_debug_flag
Dim Ee_data_lcd_helligkeit As Eram Byte At &H0002           ' Byte-Variable: Lcd_helligkeit
Dim Ee_data_lcd_kontrast As Eram Byte At &H0003             ' Byte-Variable: Lcd_kontrastwert
Dim Ee_data_lcd_saver As Eram Byte At &H0004                ' Byte-Variable: Lcd_screensaver
Dim Ee_data_wind_intervall As Eram Byte At &H0005           ' Byte-Variable: Wind_auswertung
Dim Ee_data_wind_speed As Eram Byte At &H0006               ' Byte-Variable: Wind_beschattung_auf
Dim Ee_data_temp_intervall As Eram Byte At &H0007           ' Byte-Variable: Sht71_auswertung
Dim Ee_data_dimmer As Eram Byte At &H0008                   ' Byte-Variable: Dim_flash_mode
Dim Ee_data_dim_min As Eram Byte At &H0009                  ' Byte-Variable: Dim_helligkeit_min
Dim Ee_data_dim_max As Eram Byte At &H000A                  ' Byte-Variable: Dim_helligkeit_max
Dim Ee_data_sound As Eram Byte At &H000B                    ' Byte-Variable: Sound_flag
Dim Ee_data_logging_flag As Eram Byte At &H000C             ' Byte-Variable: Ee_datalogging_flag
Dim Ee_data_logging_intervall As Eram Word At &H000D        ' Byte-Variable: Ee_auswertung
Dim Ee_data_conv_timeout As Eram Byte At &H000F             ' Byte-Variable: Rel_beschattung_delay
Dim Ee_data_conv_temp_flag As Eram Byte At &H0010           ' Byte-Variable: Rel_zu_temp_flag
Dim Ee_data_conv_temperatur As Eram Byte At &H0011          ' Byte-Variable: Rel_zu_temperatur
Dim Ee_data_conv_light_flag As Eram Byte At &H0012          ' Byte-Variable: Rel_auf_dunkel_flag
Dim Ee_data_conv_lichtwert As Eram Byte At &H0013           ' Byte-Variable: Rel_auf_dunkelheit
Dim Ee_data_conv_hotkey As Eram Byte At &H0014              ' Byte-Variable: Key_shortcut_status
Dim Ee_data_fan As Eram Byte At &H0015                      ' Byte-Variable: Fan_sw_betrieb
Dim Ee_data_fan_25_temp As Eram Byte At &H0016              ' Byte-Variable: Fan_25_temperatur
Dim Ee_data_fan_50_temp As Eram Byte At &H0017              ' Byte-Variable: Fan_50_temperatur
Dim Ee_data_fan_75_temp As Eram Byte At &H0018              ' Byte-Variable: Fan_75_temperatur
Dim Ee_data_fan_100_temp As Eram Byte At &H0019             ' Byte-Variable: Fan_100_temperatur
Dim Ee_data_dimmer_aktuell As Eram Byte At &H0020           ' Byte-Variable: Dim_helligkeitsstufe
Dim Ee_data_sht71_t_min As Eram Single At &H0021            ' Single-Variable: Sht71_t_min
Dim Ee_data_sht71_t_max As Eram Single At &H0025            ' Single-Variable: Sht71_t_max
Dim Ee_data_sht71_rhtrue_min As Eram Single At &H0029       ' Single-Variable: Sht71_rhtrue_min
Dim Ee_data_sht71_rhtrue_max As Eram Single At &H002D       ' Single-Variable: Sht71_rhtrue_max
Dim Ee_data_wind_kmh_max As Eram Single At &H0031           ' Single-Variable: Wind_kmh_max

' EE: EEPROM Datenstruktur externes EEPROM - Datenlogging
Dim Ee_data_version_extern As Byte                          ' Datenversion für externe Daten
Dim Ee_data_count As Word                                   ' Zähler abgelegter Daten
Dim Ee_data_overrun As Byte                                 ' Überlaufzähler

' Aufbau Loggingdaten-Record
' Byte(1) Ee_data_hour
' Byte(2) Ee_data_minute
' Byte(3) Ee_data_day
' Byte(4) Ee_data_month [Bit7..4]
' Byte(4) Ea_data_light [Bit3..0]
' Byte(5) Ee_data_year
' Byte(6) Ee_data_rain  [Bit7]
' Byte(6) Ee_data_wind  [Bit6..0]
' Byte(7) Ee_data_temp
' Byte(8) Ee_data_humidity
Dim Ee_data_logging_struct(8) As Byte                       ' Datenstruktur

Dim Ee_output_flag As Byte                                  ' Ausgabeflag der Loggingdaten
Dim Ee_output_counter As Word                               ' Ausgabezähler
Dim Ee_output_endadress As Word                             ' Endadresse für Ausgabe

' Anmerkung: Damit während der Ausgabe der Daten die normale Bearbeitung des
' Programms möglich ist, werden die einzelnen Datenpakete über den Sequencer
' ausgegeben.

' ----- Timer: Timer -----

' generelle Einstellungen für automatischen Öffnen und Schließen -----
Dim Timer_open_flag As Byte                                 ' Flag für Funktion automatisches Öffnen
Dim Timer_close_flag As Byte                                ' Flag für Funktion automatisches Schließen

' Variablen für Zeit und Datumsinformationen
Dim Timer_open_sekunde As Byte                              ' Sekundenvariable für Öffnungszeit
Dim Timer_open_minute As Byte                               ' Minutenvariable für Öffnungszeit
Dim Timer_open_stunde As Byte                               ' Stundenvariable für Öffnungszeit

Dim Timer_open_tag As Byte                                  ' Tagvariable  für Öffnungszeit
Dim Timer_open_monat As Byte                                ' Monatsvariable für Öffnungszeit
Dim Timer_open_jahr As Byte                                 ' Jahresvariable für Öffnungszeit

Dim Timer_close_sekunde As Byte                             ' Sekundenvraiable für Schließungszeit
Dim Timer_close_minute As Byte                              ' Minutenvariable für Schließungszeit
Dim Timer_close_stunde As Byte                              ' Stundenvariable für Schließungszeit

Dim Timer_close_tag As Byte                                 ' Tagesvariable für Schließungszeit
Dim Timer_close_monat As Byte                               ' Monatsvariable für Schließungszeit
Dim Timer_close_jahr As Byte                                ' Jahresvariable für Schließungszeit

' ----- Allgemeine systembedingte globale Variablen -----

' temporäre globale Arbeitsvariablen
Dim Temp_byte_1 As Byte                                     ' Temporäre Byte-Variable 1
Dim Temp_byte_2 As Byte                                     ' Temporäre Byte-Variable 2
Dim Temp_byte_3 As Byte                                     ' Temporäre Byte-Variable 3

Dim Temp_word_1 As Word                                     ' Temporäre Word-Variable 1
Dim Temp_word_2 As Word                                     ' Temporäre Word-Variable 2

Dim Temp_integer_1 As Integer                               ' Temporäre Integer Variable 1

Dim Temp_string_1 As String * 20                            ' Temporäre String Variable 1
Dim Temp_string_2 As String * 20                            ' Temporäre String Variable 2

Dim Temp_single_1 As Single                                 ' Temporäre Single Variable 1

' Globale Variablen für Testzwecke bei Traceausgaben
Dim Test_int_counter As Word                                ' Testcounter für Tasteninterrupts
Dim Test_debug_flag As Byte

'------------------------------------------------------------------------------
' Prototyping
'------------------------------------------------------------------------------

' ========== Subroutinen ==========

' ----- LCD:  Für LCD-Display -----
Declare Sub Lcd_set_helligkeit(byval Value As Byte)

Declare Sub Lcd_writesingleline(byval Line1 As Byte , Text1 As String)
Declare Sub Lcd_writedoubleline(byval Line1 As Byte , Byval Line2 As Byte , Text1 As String , Text2 As String)
Declare Sub Lcd_writetrippleline(text1 As String , Text2 As String , Text3 As String)

' ----- FAN:  Für Lüfter -----
Declare Sub Fan_set_geschwindigkeit(byval Value As Byte)

' ----- SOUND: Piezo Soundausgabe -----
Declare Sub Sound_beep(byval Time_value As Word)

' ----- SHT71: Temperatur- und Luftfeuchtigkeit -----
Declare Sub Sht71_calc_measurements()

' ----- EEPROM (intern und extern) -----
Declare Sub Ee_write_eeprom_byte(byval Adress As Word , Byval Value As Byte)
Declare Sub Ee_write_eeprom_word(byval Adress As Word , Byval Value As Word)

Declare Sub Ee_write_eeprom_struct(byval Adress As Word)
Declare Sub Ee_read_eeprom_struct(byval Adress As Word)

' ========== Funktionen ==========

' ----- KEY:  Tastatur -----
Declare Function Key_query_matrix() As Byte

' ----- RAIN:  Regensensor -----
Declare Function Rain_measurement() As Byte

' ----- SHT71: Temperatur- und Luftfeuchtigkeit -----
Declare Function Sht71_write_byte(byval Value As Byte) As Byte
Declare Function Sht71_read_byte(byval Acknowledge As Byte) As Byte
Declare Function Sht71_softreset() As Byte
Declare Function Sht71_read_statusregister(byref P_value As Byte , Byref P_checksum As Byte) As Byte
Declare Function Sht71_write_statusregister(byref P_value As Byte) As Byte
Declare Function Sht71_measure(byref P_value As Word , Byref P_checksum As Byte , Byval Modus As Byte) As Byte
Declare Function Sht71_crc_check(byval Value As Word , Byval Crc As Byte , Byval Modus As Byte) As Byte

' ----- LIGHT:  Lichtsensor -----
Declare Function Light_measurement(byval Value As Byte) As Byte

' ----- EEPROM (intern und extern) -----
Declare Function Ee_read_eeprom_byte(byval Adress As Word) As Byte
Declare Function Ee_read_eeprom_word(byval Adress As Word) As Word

' ----- Allgemeine Funktionen -----
Declare Function Byte2string(byval Value As Byte , Byval Character As Byte) As String
Declare Function Time2string(byval Value1 As Byte , Byval Value2 As Byte , Byval Value3 As Byte , Byval Character As Byte) As String
Declare Function Schaltjahr(byval Value As Word) As Byte

'------------------------------------------------------------------------------
' Konfiguration und Basiseinstellungen (Projekt und Testumgebung)
'------------------------------------------------------------------------------

' ----- vorgezogene wichtige Gosub's (der Rest erfolgt hinten) -----

' SOUND: Routine und Einstellungen
   Gosub Sound_konfig

' ----- CONFIG -----

' Device COM2 mounten und im System zur Verfügung stellen
   Config Com2 = 38400 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
   Open "com2:" For Binary As #2

   ' Systemstart auf jeden Fall auf RS232 ausgeben
   Print #2 , "** Iginiton sequence start **"

' LCD-Display konfigurieren

   ' Port G.1 als Ausgang definieren und Display einschalten
   Config Lcd_on_pin = Output
   Lcd_on_dataout = 1

   ' Konfiguration LCD Display
   Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , E = Portc.4 , Rs = Portc.5
   Config Lcd = 16 * 3 , Chipset = Dogm163v5                ' DOG-M Treiber laden
   Config Lcdbus = 4                                        ' LCD arbeitet über 4-Bit
   Initlcd                                                  ' LCD initialisieren
   Waitms 100                                               ' 100ms nach Init warten
   Cursor Off Noblink                                       ' Blinkenden Cursor abschalten
   Cls                                                      ' Clear Screen

   ' Definition benutzerdefinierter Zeichen
   ' Benutzerdefiniertes LCD-Zeichen Pfeil Hoch
   Deflcdchar 1 , 4 , 14 , 31 , 21 , 4 , 4 , 4 , 32
   ' Benutzerdefiniertes LCD-Zeichen Pfeil Runter
   Deflcdchar 2 , 4 , 4 , 4 , 21 , 31 , 14 , 4 , 32
   ' Benutzerdefiniertes LCD-Zeichen Pfeil Links
   Deflcdchar 3 , 32 , 6 , 12 , 31 , 12 , 6 , 32 , 32
   ' Benutzerdefiniertes LCD-Zeichen Pfeil Rechts
   Deflcdchar 4 , 32 , 12 , 6 , 31 , 6 , 12 , 32 , 32
   ' Benutzerdefiniertes LCD-Zeichen Enter
   Deflcdchar 5 , 32 , 14 , 17 , 21 , 17 , 14 , 32 , 32

   ' Erstes Lebenszeichen auf Display schreiben
   Locate 1 , 7 : Lcd "***"
   Locate 2 , 5 : Lcd "ConvCtrl"
   Locate 3 , 7 : Lcd "***"
   Wait 2                                                   ' 2 Sec warten
   Cls                                                      ' Clear Screen
   Locate 1 , 1 : Lcd "Initialisierung!"
   Locate 2 , 7 : Lcd "****"
   Locate 3 , 3 : Lcd "Bitte warten"

' Konfiguration Timer 3 für Hardware-PWM an OC3A (E.3) und OC3B (E.4)
   ' Konfiguration muss global geschehen da mit einem Timer zwei PWM realisiert
   Config Timer3 = Pwm , Pwm = 8 , Prescale = 256 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up

'Konfiguration Timer2 für Zündung TRIAC nach Vorgabe bzw. Nulldurchgang
   Config Timer2 = Timer , Prescale = 1024
   On Timer2 Dimmer_triac_irq                               ' ISR festlegen
   Enable Timer2

' DCF77: Routinen und Einstellungen

   '  CONFIG DCF77 = pin , timer = timer [ INVERTED=inv, CHECK=check, UPDATE=upd, UPDATETIME=updtime , TIMER1SEC=tmr1sec, SWITCHPOWER=swpwr, POWERPIN=pin, POWERLEVEL = pwrlvl , SECONDTICKS=sectick ,DEBUG=dbg , GOSUB = Sectic ]
   '  PIN          = input pin that is connected to the DCF-77 signal
   '  TIMER        = The timer that is used to generate the compare interrupts
   '  INVERTED     = This value is 0 by default. When you specify 1, the compiler will assume you use an inverted DCF signal.
   '  CHECK        = The DCF-77 parity bits are checked
   '  UPDATE       = Upd determines how often the internal date/time variables are updated with the DCF received values.
   '  UPDATETIME   = This value depends on the used UPDATE parameter.
   '  TIMER1SEC    = 16 bit timers with the right crystal value can generate a precise interrupt that fires every second.
   '                 Wichtig: Wird der Parameter TIMER1SEC = 1 gesetzt, wird während der synchronisationsfreien Zeit der Compare-Wert so verändert, dass nur mehr 1 Interrupt pro Sekunde ausgelöst wird.
   '  SWITCHPOWER  = This option can be used to turn on/off the DCF-77 module with the control of a port pin.
   '  POWERPIN     = The name of a pin like pinB.2 that will be used to turn on/off the DCF module.
   '  POWERLEVEL   = This option controls the level of the output pin that will result in a power ON for the module.
   '  SECONDTICKS  = The number of times that the DCF signal state is read.
   '  DEBUG        = Optional value to fill 2 variables with debug info.
   '  GOSUB        = The Sectic option will call a label in the main program every second.

   ' Config mit stündlichem Update
   ' Config Dcf77 = Pinb.2 , Timer = 1 , Inverted = 0 , Check = 1 , Update = 1 , Updatetime = 59 , Timer1sec = 1 , Debug = 1 , Gosub = Sectic

   ' Config mit kontinuierlichem Update
   ' Config Dcf77 = Pinb.2 , Timer = 1 , Inverted = 0 , Check = 1 , Update = 0 , Timer1sec = 1 , Debug = 1 , Gosub = Sectic

   Config Dcf77 = Pinb.2 , Timer = 1 , Inverted = 0 , Check = 1 , Update = 2 , Updatetime = 12 , Timer1sec = 1 , Debug = 1 , Gosub = Sectic
   '               |        |           |               |          |            |                 |               |            |
   ' Use PinB.2 ---+        |           |               |          |            |                 |               |            |
   ' Timer 1 is default ----+           |               |          |            |                 |               |            |
   ' DCF77 signal wird nicht invertiert +               |          |            |                 |               |            |
   ' Vergleich akt. Minutes mit vorheriger Minute ------+          |            |                 |               |            |
   ' Perform Update einmal am Tag ---------------------------------+            |                 |               |            |
   ' Zielzeit für Zeitresynchronistion ist 12:00 Uhr ---------------------------+                 |               |            |
   ' Updatetime ist nicht relevant da Update = 0 ------------------+                              |               |            |
   ' Timer1sec = 1 verändert in sync. freier Zeit den Compare Wert auf nur -----------------------+               |            |
   '               Interrupt pro Sekunde = Reduktion der Prozessor-Last!!!                                        |            |
   ' Switchpower, Powerpin und Powerlevel wird nicht benutzt da Interface nicht vorhanden!                        |            |
   ' Secondticks wird dem Compiler überlassen und nicht neu gesetzt!                                              |            |
   ' Debug für die Variablen  bDCF_Pause und bDCF_Impuls ist aktiv -----------------------------------------------+            |
   ' Jede Sekunde wird Gosub-Routine Dcf77_sectic angesprungen ----------------------------------------------------------------+

   ' Datumsformat einstellen
   Config Date = Dmy , Separator = .                        ' German  dd.mm.yy

' LIGHT: Lichtsensor
   ' Konfiguration ADC Single-Mode und automatische Prescaler Setting
   ' Der Single-Mode wir bei BASCOM in Verbindung mit der Funktion GETADC() verwendet
   ' Der Prescaler teilt den internen Tackt durch 2, 4, 8,16,32,64 or 128 da der ADC
   ' einen Takt zwischen 50-200 kHz benötigt.
   ' Das AUTO Feature von BASCOM, setzt automatisch die höchste mögliche Taktrate
   Config Adc = Single , Prescaler = Auto , Reference = Avcc

' ----- Port's und Pin's -----

' Konfiguration des Trace-Jumpers
   Config Trace_pin = Input                                 ' Trace-Jumper soll gelesen werden
   Trace = 0                                                ' Widerstand abschalten

' Konfiguration der Tastenmatrix
   ' Konfiguration Port A Zeilen (Reihen)
   Config Key_zeile_1_pin = Input                           ' Zeile 1 ist Eingang
   Config Key_zeile_2_pin = Input                           ' Zeile 2 ist Eingang
   Config Key_zeile_3_pin = Input                           ' Zeile 3 ist Eingang
   Porta = Key_zeilen_pullup                                ' PullUp aktiv für PA0-PA2

   ' Konfiguration Port F Spalten
   Config Key_spalte_1_pin = Output                         ' Spalte 1 ist Ausgang
   Config Key_spalte_2_pin = Output                         ' Spalte 2 ist Ausgang
   Config Key_spalte_3_pin = Output                         ' Spalte 3 ist Ausgang

   ' Basis-Initialisierung der Spalten-PINs (alle Spalten auf LOW)
   ' Dies ist nach Systemstart normalerweise Default, aber man weis ja nie :-)
   Reset Key_spalte_1_port                                  ' Spalte 1 auf LOW
   Reset Key_spalte_2_port                                  ' Spalte 2 auf LOW
   Reset Key_spalte_3_port                                  ' Spalte 3 auf LOW

   ' Alternative Konfiguration für die Spalten
   ' Ddrf = Key_spalten_ddrf                                    ' Alle Spalten auf einen Schlag
   ' Nachteil dieser Lösung ist, dass gesamtes Register geladen wird. Im Gesamtprojekt
   ' haben aber die anderen BIT's andere Aufgaben und Bedeutung. Daher explizites Setzen
   ' gewählt.

' Konfiguration I2C-Bus
   Config Sda = Sda_port                                    ' TWI SDA = Data
   Config Scl = Scl_port                                    ' TWI SCL = Clock

   I2cinit                                                  ' we need to set the pins in the proper state

   ' Achtung: gemäß Datenblatt kann der DS1307 nur eine max frequency von 100 kHz
   Config Twi = 100000                                      ' Taktfrequenz 100 kBaud

   ' TWI gleich einschalten, das macht BASCOM ansonsten erst beim I2CStart
   Twcr = &B00000100                                        ' nur TWEN setzen

   ' Optionale Einstellungen für TWI Kommunikation die nicht zwingend erforderliche sind
   ' Twsr = 0                                                 ' Status und Prescaler Register
   ' Twbr = 152                                               ' Bit Rate Register, 72 = 100kHz   152 = 50kHz(0 bis 255)
   ' Config I2cdelay = 40

' Stand-Alone-LED's
   Config Alive_led_pin = Output                            ' Ausgang definieren
   Alive_led = 0                                            ' LED ausschalten

   Config Sectick_led_pin = Output                          ' Ausgang definieren
   Sectick_led = 0                                          ' LED ausschalten

' RAIN: Regensensor konfigurieren
   Config Rain_sensor = Input                               ' Eingang definieren

' SHT71 Sensor
   Config Temp_sck = Output                                 ' Clock für SHT71
   Config Temp_data = Output                                ' Data für SHT71
   ' Anmerkung: Der SHT71 besitz eine TWI Interface welches sich aber nicht nach
   ' Spezifikation verhält. Aus diesem Grund kann nicht das HW TWI des Mega
   ' verwenden werden sondern die Ansteuerung muss von Hand implementiert werden.

' LED: LED-Array
   ' Konfiguration der Ausgänge für Datenbits, Adressbits und Latch Clear
   Config Led_bit0_pin = Output                             ' Daten-Bit 0 ist Ausgang
   Config Led_bit1_pin = Output                             ' Daten-Bit 1 ist Ausgang
   Config Led_bit2_pin = Output                             ' Daten-Bit 2 ist Ausgang
   Config Led_bit3_pin = Output                             ' Daten-Bit 3 ist Ausgang

   Config Led_adr0_pin = Output                             ' Adress-Bit 0 ist Ausgang
   Config Led_adr1_pin = Output                             ' Adress-Bit 1 ist Ausgang

   Config Led_clr_pin = Output                              ' Latch Clear ist Ausgang

   ' Basis-Initialisierung aller Signalleitungen auf LOW
   ' Dies ist nach Systemstart normalerweise Default, aber man weiss ja nie :-)
   Reset Led_bit0_port                                      ' Datenbit 0 auf Low
   Reset Led_bit1_port                                      ' Datenbit 1 auf Low
   Reset Led_bit2_port                                      ' Datenbit 2 auf Low
   Reset Led_bit3_port                                      ' Datenbit 3 auf Low

   Reset Led_adr0_port                                      ' Adressbit 0 auf Low
   Reset Led_adr1_port                                      ' Adressbit 1 auf Low

   Reset Led_clr_port                                       ' Latch-Clear auf Low

   ' Funktionstabelle des Latch:
   ' +--------------------------------------+
   ' | Inputs:     ENABLE          | OUTPUT |
   ' |    _____    __  __          |        |
   ' |    CLEAR    C1  C2    DATA  |  Q     |
   ' |======================================|
   ' |      H      L   L      L    |  L     |
   ' |      H      L   L      H    |  H     |
   ' |      H      x   H      x    |  Qo    |
   ' |      H      H   x      x    |  Qo    |
   ' |      L      x   x      x    |  L     |
   ' +--------------------------------------+

' ----- Variablen und Werte -----

' Hinweis:
' Alle Variablen werden in diesem Abschnitt zunächste mit Default-Werten geladen.
' Zu einem Späteren Zeitpuntk wird geprüft, ob die im Flash abgelegten Daten-
' sturkturen passen, neu initialisiert werden müssen oder ob die hier vorgenom-
' menen Default-Einstellungen durch User-Settings aus dem EEPROM überschrieben
' werden können.

' TRACE:  Trace Jumper
   Trace_jumper_value = Trace_pin                           ' Bitwert von Port/Pin lesen
   Trace_jumper_value = Trace_jumper_value Xor &B00000001   ' Bit invertieren

' LCD:  LCD-Display
   Lcd_pwmwert = Lcd_default_helligkeit                     ' Dimmwert mit Default laden
   Lcd_helligkeit = 255 - Lcd_pwmwert                       ' Inhalte umdrehen
   Lcd_kontrastwert = Lcd_kontrast_default                  ' Kontrastwert
   Lcd_screensaver = Lcd_screensaver_default                ' Screensaver auf AUS setzen

   Lcd_screensaver_aktiv = False                            ' Screensaver ist nicht aktiv

' FAN:  Lüfter
   Fan_pwmwert = Fan_default_geschwindigkeit                ' PWM-Wert für Lüfter laden
   Fan_sw_betrieb = True                                    ' SW Steuerung eingeschaltet

   Fan_25_temperatur = Fan_25_default                       ' Variable für 25% mit default laden
   Fan_50_temperatur = Fan_50_default                       ' Variable für 50% mit default laden
   Fan_75_temperatur = Fan_75_default                       ' Variable für 75% mit default laden
   Fan_100_temperatur = Fan_100_default                     ' Variable für 100% mit default laden

' SOUND:  Piezo-Sound
   Sound_beep_time = Sound_beep_time_const                  ' Beep Zeitkonstante laden
   Sound_flag = Sound_flag_default                          ' Sound-Flag mit Default-Variable vorbelegen

' MENUE: Strukturen und Variablen
   ' Tastencodes
   Key_codes(1) = 12                                        ' Taste Hoch
   Key_codes(2) = 42                                        ' Taste Runter
   Key_codes(3) = 41                                        ' Taste Links
   Key_codes(4) = 44                                        ' Taste Rechts
   Key_codes(5) = 22                                        ' Taste Enter

   Key_keypressed = False                                   ' Vorinitialisierung

   'Initial state variables
   Menue_state = Loadlabel(men1)                            ' Startbildschirm
   Menue_state_renew = 1                                    ' Menüstatus wurde geändert
   Key_taste = Key_null                                     ' keine Taste gedrückt
   Key_shortcut_status = Key_shortcut_status_default        ' Shortcutstatus auf Default setzen

   ' Erkennung für ShortCut ob Display auf Dimmer-Menues steht damit Werte
   ' korrigiert / ergänzt werden können
   ' +-----------------------------------------------+
   ' | Wert |  Bedeutung                             |
   ' |======|========================================|
   ' |  0   |  Menü nicht in relevanten Dimmer-Menüs |
   ' |  1   |  Menü steht auf Dimmer heller          |
   ' |  2   |  Menü steht auf Dimmer dunkler         |
   ' |  3   |  Menü steht auf Dimmer aus             |
   ' |  4   |  Menü steht auf Dimmerstufenanzeige    |
   ' +-----------------------------------------------+
   Menue_indimmenue_flag = 0                                ' Flag für Dimmermenü wegen Shortcuts

   ' Erkennung für ShortCut ob Display auf Beschattungs-Menues steht damit Werte
   ' korrigiert / ergänzt werden können
   ' +-----------------------------------------------+
   ' | Wert |  Bedeutung                             |
   ' |======|========================================|
   ' |  0   |  Menü nicht in relevanten Relais-Menüs |
   ' |  1   |  Menü steht auf Beschattung auf        |
   ' |  2   |  Menü steht auf Beschattung zu         |
   ' |  3   |  Menü steht auf Beschattung stopp      |
   ' +-----------------------------------------------+
   Menue_inrelmenue_flag = 0                                ' Flag für Beschattungs-Menue wegen Shortcuts

   ' +-----------------------------------------------+
   ' | Wert |  Bedeutung                             |
   ' |======|========================================|
   ' |  0   |  Kein zyklische Update von Menüdaten   |
   ' |  1   |  Update von Windgeschwindigkeit        |
   ' |  2   |  Update zustand Regensensor            |
   ' |  3   |  Update Innentemperatur                |
   ' |  4   |  Update Luftfeuchtigkeit               |
   ' |  5   |  Update Lichintensität                 |
   ' |  6   |  Update Uhrzeit von DCF77 Empfänger    |
   ' |  7   |  Update DCF77 Statusbits und Infos     |
   ' +-----------------------------------------------+
   Menue_insensmenue_flag = 0                               ' Flag für zyklisches Update Menüdaten

   Menue_datenuebernahme_flag = 0                           ' Datenübernahmeflag initialisieren
   Menue_data_changed_flag = 0                              ' Flag ob sich Daten wirklich geändert haben
   ' Anmerkung: Mittels Menue_data_change_flag soll unnötiges Schreiben in das
   '            EEPROM verhindert werden.

' DCF77: Voreinstelung Sectic_counter und Sync_counter
   Sectic_count = 0                                         ' Counter mit NULL vorinitialisieren
   Dcf_sync_count = 0                                       ' Synchronisationszähler auf NULL

' DIM: Voreinstellung für Dimmer. Bei Free_running_flag = passiv ist Dimmer aus!
   Free_running_flag = Passiv                               ' Dimmer auf passiv schalten
   Beleuchtung_flag = Passiv                                ' Statusflag für Beleuchtung Relais passiv
   Dauerlicht_flag = Passiv                                 ' Statusflag für Dauerlich-Relais passiv
   Dim_flash_mode = Passiv                                  ' Flash-Mode erstmal passiv
   Dim_flash_mode_locked = False                            ' Flas-Mode-Verriegelung false
   Dim_helligkeit_min = Dim_helligkeit_min_default          ' Dimmerhelligkeit MIN erstmal mit Default laden
   Dim_helligkeit_max = Dim_helligkeit_max_default          ' Dimmerhelligkeit MAX erstmal mit Default laden

' LIGHT: Lichtsensor
   Light_channel = 0                                        ' TSL250R hängt an ADC0
   Light_erfassungs_counter = 0                             ' Globaler Zähler vorinitialisieren
   Light_erfassung = False                                  ' Lichtwerterfassung AUS
   Light_value = 15                                         ' Lichtwert initialisieren
   Light_update_flag = False                                ' Update Flag
   Light_autoauffahren = 0                                  ' Globales Lichtflag initialisieren
   Light_autoauffahren_locked = 0                           ' Verriegelung zunächste auf 0 initialisieren

' WIND:  Windsensor
   Wind_autoauffahren = 0                                   ' Globales Windflag initialisieren

' RAIN:  Regensesnor
   Rain_autoauffahren = 0                                   ' Globales Regenflag initialisieren

' LED-Array
   Led_array = 0                                            ' Vorinitialisierung des 16-Bit LED-Array
   Led_key_flag = False                                     ' Zeitüberwachung aus

' SHT71: Sensor
   Sht71_auswertung = Sht71_auswertung_default              ' Zeitintervall für SHT71 auf Default
   Sht71_t_min = 0.0                                        ' Minimale Temperatur initialisieren
   Sht71_t_max = 0.0                                        ' Maximale Temperatur initialisieren
   Sht71_rhtrue_min = 0.0                                   ' Minimale Feuchtigkeit initialisieren
   Sht71_rhtrue_max = 0.0                                   ' Maximale Feuchtigkeit initialisieren
   Sht71_autozufahren = False                               ' Globales Temperaturflag initialisieren
   Sht71_autozufahren_locked = False                        ' Globales verriegeln, erst Hysterese

' EE: externes EEPROM
   Ee_datalogging_flag = True                               ' Datenlogging in externes EEPROM default EIN
   Ee_auswertung = Ee_auswertung_default                    ' Zeitintervall auf default setzen

   Ee_output_flag = False                                   ' Ausgabeflag initialisieren

' Timer: Timer
   Timer_open_flag = Timer_open_flag_default                ' Default-Wert für Funktion automatisches Öffnen laden
   Timer_close_flag = Timer_close_flag_default              ' Default-Wert für Funktion automatisches Schließen laden

   Timer_open_sekunde = 0                                   ' Sekundenvariable für Öffnungszeit initialisieren
   Timer_open_minute = 0                                    ' Minutenvariable für Öffnungszeit initialisieren
   Timer_open_stunde = 0                                    ' Stundenvariable für Öffnungszeit initialisieren

   Timer_open_tag = 1                                       ' Tagvariable  für Öffnungszeit initialisieren
   Timer_open_monat = 1                                     ' Monatsvariable für Öffnungszeit initialisieren
   Timer_open_jahr = 8                                      ' Jahresvariable für Öffnungszeit initialisieren

   Timer_close_sekunde = 0                                  ' Sekundenvraiable für Schließungszeit initialisieren
   Timer_close_minute = 0                                   ' Minutenvariable für Schließungszeit initialisieren
   Timer_close_stunde = 0                                   ' Stundenvariable für Schließungszeit initialisieren

   Timer_close_tag = 1                                      ' Tagesvariable für Schließungszeit initialisieren
   Timer_close_monat = 1                                    ' Monatsvariable für Schließungszeit initialisieren
   Timer_close_jahr = 8                                     ' Jahresvariable für Schließungszeit initialisieren

' Sonstiges
   Test_debug_flag = False                                  ' Globales test-Debug-Flag
   ' Anmerkung: Test_debug_flag wird als globales Steuerungsflag für Testausgaben
   ' vorgesehen, findet aber aktuell keine Verwendung da Steuerung von Traceausgaben
   ' über if-endif-Konstrukt mit globalen Konstanten erfolgt!

' ----- Gosub's -----

' LCD: Routinen und Einstellungen
   Gosub Lcd_konfig                                         ' Beleuchtung und der Rest
   Gosub Lcd_kontrastset                                    ' Kontrast noch einstellen

' FAN: Routinen und Einstellungen
   Gosub Fan_konfig                                         ' Konfiguration für Belüftung fertig

' LCD: Startwert für Dimmung festlegen und Dimmung starten
   Gosub Lcd_beleuchtung_an                                 ' LCD-Beleuchtung einschalten

' FAN: Startwert für Lüfteranlauf festlegen und Lüfter starten
   Gosub Fan_lueftung_aus                                   ' Lüfter ausschalten

' DCF77: Softclock gemäß RTC einstellen
   Gosub Rtc_set_softclock                                  ' Softclock aus RTC laden

' REL: Routinen und Einstellungen
   Gosub Relais_konfig                                      ' Relais fertig konfigurieren

' DIM: Interrupt für Nulldurchgangserkennung konfigurieren
   Gosub Dimmer_konfig                                      ' Dimmer fertig konfigurieren

' WIND: Windsensensor konfigurieren
   Gosub Wind_konfig                                        ' Windsensor fertig konfigurieren

' SHT71: Temperatur- und Luftfeuchtigkeit
' Grundkonfiguration
   Gosub Sht71_connection_reset_sequence                    ' SHT71 initialisieren

' LED:  LED-Array initialisieren
   Gosub Led_clearlatch_set                                 ' Latch aktivieren
   Led_array = &HFFFF                                       ' Globale Variable setzen (alle LED an!)
   Gosub Led_update_array                                   ' Latch updaten

' EE:  Internes EEPROM
   Gosub Ee_init_internal_eeprom                            ' Internes EEPROM konfigurieren

' EE:  externes EEPROM
   Gosub Ee_init_external_eeprom                            ' Externes I2C EEPROM konfigurieren

' ----- Interrupts -----

' Konfiguration der Interrupts für die Tastenabfrage
   On Int7 Key_isr_routine                                  ' Definition ISR
   Test_int_counter = &H0000                                ' Testcounter vorinitialisieren
   Enable Int7                                              ' INT7 freigeben
   Config Int7 = Falling                                    ' INT bei falling Edge

' INT5 konfigurieren für Dimmer-Nulldurchgangserkennung
   Config Int5 = Rising                                     ' Trigger bei steigender Flanke
   On Int5 Dimmer_null_irq                                  ' Springe zur Interrupt-Routine Dimmer_irq
   Enable Int5                                              ' Interrupt5 freigeben

' INT6 konfiguriert für Windimpulserfassung des Schalenkreuzanemometers
   Config Int6 = Rising                                     ' Trigger bei steigender Flanke
   On Int6 Wind_irq                                         ' Springe zur Interrupt-Routine Wind_irq

   Enable Interrupts                                        ' Alle Interrupts aktivieren

'-- Timer0 sofort anhalten und erst über SW anstossen
   ' Hinweis: Timer 2 wird zur Zündung des Triac verwendet.
   Stop Timer2

' #############################################################################
'
'                             Hauptprogramm ConvCtrl
'
' #############################################################################

' Controll-Output schreiben und los's gehts
#if Main_testmodus                                          ' Trace
   Print #2 , ""
   Print #2 , "** Enter MainLoop **"
   Print #2 , ""
#endif                                                      ' Trace

' Wenn Konstante gesetzt Trace Output schreiben
#if Tracejumper_testmodus                                   ' Trace
   Select Case Trace_jumper_value
      Case True:
         Print #2 , "Trace-Jumper ist gesetzt"
      Case False:
         Print #2 , "Trace-Jumper ist NICHT gesetzt"
   End Select                                               ' Trace-Jumper
#endif                                                      ' Trace

' Globales Test-Debug-Flag überprüfen und ggf. Traceoutput schreiben
If Test_debug_flag = True Then
   Print #2 , "Globales Test-Debug-Flag ist gesetzt!!"
End If                                                      ' Test-Debug-Flag

' Alive-LED einschalten
Alive_led = 1

' Eintritt in Hauptprogramm durch 2xBeep signalisieren wenn Soundflag gesetzt
If Sound_flag = True Then

   Call Sound_beep(sound_beep_time)                         ' Soubroutine Beep aufrufen
   Waitms 100                                               ' 100 ms warten
   Call Sound_beep(sound_beep_time)                         ' Soubroutine Beep aufrufen

End If                                                      ' Sound-Flag

' Display löschen
Cls                                                         ' Clear Screen

' Anzeige des Startbildschirms mit Uhrzeit und Datum
For Temp_byte_1 = 1 To Menue_scr03_delay

   ' Überschrift
   Locate 1 , 2 : Lcd "System bereit!"

   ' Uhrzeit und Tag ausgeben
   Locate 2 , 1 : Lcd Time$
   Locate 2 , 15 : Lcd Lookupstr(_weekday , Wochentag)

   ' Datum ausgeben
   Locate 3 , 1 : Lcd Date$

   ' Anzahl der erfolgten Synchronisationen auf LCD ausgeben
   Temp_byte_2 = Makebcd(dcf_sync_count)
   Locate 3 , 11 : Lcd Bcd(temp_byte_2)

   ' Zeitzone ausgeben
   Locate 3 , 16 : Lcd Dcf77timezone()

   ' Eine Sekunde warten!
   Wait 1

Next Temp_byte_1

' Display löschen
Cls                                                         ' Clear Screen

' LED-Array initialisieren
   ' Alle LED's des LED-Arrays aussschalten
   Led_array = 0

   ' ggf. MEM-Full-LED bereits setzen
   If Ee_data_overrun > 0 Then
      ' Externes EEPROM mindestens 1x übergelaufen => LED einschalten
      Set Led_10_mem_full
   End If                                                   ' Überlaufzähler

   ' LED-Array updaten
   Gosub Led_update_array

' Display auf richtigen Bildschirm schalten
Gosub Menue_change_state_by_sub

' Auswertung der Umweltdaten starten

' Auswertung für Wind starten
Gosub Wind_erfassung_an                                     ' Interrupts freigeben und los gehts
Wind_erfassungs_counter = Sectic_count + Wind_auswertung    ' Auswerteintervall neu setzen

' Auswertung für Temperatur und Luftfeuchtigkeit starten
Sht71_erfassung = True                                      ' Auswertung Sht71 zulassen
Sht71_erfassungs_counter = Sectic_count + Sht71_auswertung  ' Auswerteintervall neu setzen

' ggf. Auswertung der Data-Logging-Methode starten
If Ee_datalogging_flag = True Then
   Ee_erfassungs_counter = Sectic_count + Ee_auswertung     ' Auswerteintervall neu setzen
End If                                                      ' Data-Logging-Flag

' Abhängig von den Einstellungen Lichtauswertung starten
If Rel_auf_dunkel_flag = True Then

   ' Licht einmalig erfassen
   Light_value = Light_measurement(light_messwert_zahl )

   ' zyklisches Update aktivieren
   Light_erfassung = True

   ' Auswerteintervall setzen
   Light_erfassungs_counter = Sectic_count + Light_auswertung_default

End If                                                      ' Automatisch auf bei Dunkelheit

' Abhängig von den Einstellung ggf. Screensaver starten
If Lcd_screensaver = True Then
   Lcd_screensaver_counter = Sectic_count + Lcd_screensaver_delay
   Lcd_pwmwert_buffer = Lcd_pwmwert                         ' Helligkeit buffern
End If                                                      ' Screensaver

' ----------------------------------------------
' ----- Hier ist die Programmhauptschleife -----
' ----------------------------------------------

Do

   ' ----- Tastatur abfragen und auswerten -----
   '
   ' +----+                        +----+
   ' | 11 |SW1                     | 14 |SW7
   ' +----+LED1                    +----+LED3
   ' +----+                        +----+
   ' | 21 |SW2      +----+         | 24 |SW8
   ' +----+LED2     | 12 |SW4      +----+LED4
   '                +----+LED7
   '    +----+      +----+      +----+
   '    | 41 |SW3   | 22 |SW5   | 44 |SW9
   '    +----+LED5  +----+LED9  +----+LED6
   '                +----+
   '                | 42 |SW6
   '                +----+LED8

   Led_array_save = Led_array                               ' LED-Array-Inhalt retten

   If Key_keypressed = True Then
      ' 50ms Zeit soll das Betätigen von zwei Tasten gleichzeitig vereinfachen
      ' -> wird benötigt für "Beschattung stopp" und "Licht aus"
      ' Außerdem dient die Zeit zum Entprellen der Tasten!!
      Waitms Key_waiting
      ' Tastenmatrix auslesen (Achtung, gleichzeigiges Betätigen innerhalb Reihe problematisch)
      Key_taste = Key_query_matrix()                        ' Abfrage der Tastaturmatrix
      Key_taste_buffer = Key_taste                          ' Taste buffern

      ' Ggf. Signalton ausgeben
      If Sound_flag = True Then
         Call Sound_beep(sound_beep_time_short)             ' Subroutine Beep aufrufen
      End If                                                ' Signalton

      ' **** Auswertung der Tastatur und Ausgabe ****

      ' Wenn Konstante gesetzt Trace Output schreiben
      #if Key_testmodus                                     ' Trace
         Print #2 , "Taste " ; Key_taste                    ' Anzeige der gelesenen Taste
      #endif                                                ' Trace

      ' Prüfung ob aktuell Screensaver verwendet
      If Lcd_screensaver = True Then
         ' JA, Screensaver ist eingeschaltet

         ' Zunächste Zeitintervall neu setzen
         Lcd_screensaver_counter = Sectic_count + Lcd_screensaver_delay

         ' Prüfen ob Screensaver aktiv oder nicht
         If Lcd_screensaver_aktiv = True Then
            ' JA, Screensaver ist aktiv

            ' Ggf. Trace ausgeben
            #if Screensaver_testmodus                       ' Trace
               Print #2 , "Screensaver wird passiv"
            #endif                                          ' Trace

            ' Taste ignorieren, zunächste Display einschalten
            Key_taste = 0

            ' Screensaver deaktivieren
            Lcd_screensaver_aktiv = False

            ' Helligkeit einstellen
            Call Lcd_set_helligkeit(lcd_pwmwert_buffer)

            ' Display einschalten
            Gosub Lcd_display_on

         End If                                             ' Screensaver aktiv
      End If                                                ' Screensaver eingeschaltet

      ' LED's für die jeweiligen Tasten einschalten
      Select Case Key_taste
         Case 11:                                           ' Taste "Beschattung auf"
            Set Led_01_sw1
         Case 21:                                           ' Taste "Beschattung zu"
            Set Led_02_sw2
         Case 41:                                           ' Taste Link
            Set Led_05_sw5
         Case 12:                                           ' Taste Hoch
            Set Led_07_sw7
         Case 22:                                           ' Taste Enter
            Set Led_09_sw9
         Case 42:                                           ' Taste Runter
            Set Led_08_sw8
         Case 14:                                           ' Taste "Licht heller"
            Set Led_03_sw3
         Case 24:                                           ' Taste "Licht dunkler"
            Set Led_04_sw4
         Case 44:                                           ' Taste Rechts
            Set Led_06_sw6
         Case 32:                                           ' Tastenkombination Beschattung Stopp
            Set Led_01_sw1
            Set Led_02_sw2
         Case 38:                                           ' Tastenkombination Licht Aus
            Set Led_03_sw3
            Set Led_04_sw4
      End Select                                            ' Key_taste

      Gosub Led_update_array
      Led_key_flag = True
      Led_key_counter = Sectic_count

      ' Hot-Keys prüfen
      Select Case Key_taste

         ' ### Tastencodes für Beschattung ###

         ' Beschattung auf betätigt
         Case 11:
            Key_taste = 0

            ' Prüfen auf Regen
            Temp_byte_1 = Rain_measurement()
            If Temp_byte_1 = Rain_no Then

               ' Es regnet nicht, also weiter

               ' Prüfen ob maximale Windgeschwindigkeit erreicht
               Temp_byte_2 = Wind_geschwindigkeit_kmh
               If Temp_byte_2 < Wind_beschattung_auf Then

                  ' Es windet nicht also weiter

                  Gosub Relais_beschattung_auf

                  If Menue_inrelmenue_flag <> 0 Then
                     Menue_state = Loadlabel(men2211)
                     Gosub Menue_change_state_by_sub
                  End If                                    ' Menüüberprüfung

               End If                                       ' Ende Windprüfung
            End If                                          ' Ende Regenprüfung

         ' Beschattung zu betätigt
         Case 21:
            Key_taste = 0

            ' Prüfen auf Regen
            Temp_byte_1 = Rain_measurement()
            If Temp_byte_1 = Rain_no Then

               ' Es regnet nicht, also weiter

               ' Prüfen ob maximale Windgeschwindigkeit erreicht
               Temp_byte_2 = Wind_geschwindigkeit_kmh
               If Temp_byte_2 < Wind_beschattung_auf Then

                  ' Es windet nicht also weiter

                  Gosub Relais_beschattung_zu

                  If Menue_inrelmenue_flag <> 0 Then
                     Menue_state = Loadlabel(men2221)
                     Gosub Menue_change_state_by_sub
                  End If                                    ' Menüüberprüfung

               End If                                       ' Ende Windprüfung
            End If                                          ' Ende Regenprüfung

         ' Beschattung auf/zu betätigt = Stop
         Case 32:
            Key_taste = 0

            ' Prüfen auf Regen
            Temp_byte_1 = Rain_measurement()
            If Temp_byte_1 = Rain_no Then

               ' Es regnet nicht, also weiter

               ' Prüfen ob maximale Windgeschwindigkeit erreicht
               Temp_byte_2 = Wind_geschwindigkeit_kmh
               If Temp_byte_2 < Wind_beschattung_auf Then

                  ' Es windet nicht also weiter

                  Gosub Relais_beschattung_stop

                  If Menue_inrelmenue_flag <> 0 Then
                     Menue_state = Loadlabel(men2231)
                     Gosub Menue_change_state_by_sub
                  End If                                    ' Menüüberprüfung

               End If                                       ' Ende Windprüfung
            End If                                          ' Ende Regenprüfung

         ' ### Tastencodes für Dimmer ###

         ' Licht heller betätigt
         Case 14:
            Key_taste = 0

            ' Wegen manuellem Eingriff in Licht Flashmode verriegeln
            Dim_flash_mode_locked = True

            ' Prüfen ob Beleuchtung bereits eingeschaltet
            If Beleuchtung_flag = Passiv Then
               ' Beleuchtung läuft noch nicht => Beleuchtung einschalten
               Gosub Beleuchtung_ein
               Gosub Beleuchtung_dauerlicht_aus
               ' Dimmer frei laufen lasse
               Free_running_flag = Aktiv
            Else                                            ' Beleuchtungsflag
               ' Dimmer heller schalten und gegen Endwert prüfen
               If Dim_helligkeitsstufe < Dim_helligkeit_max Then
                  ' Helligkeitsstufe erhöhen
                  Incr Dim_helligkeitsstufe
               End If                                       ' Überprüfung Helligkeit
            End If                                          ' Beleuchtungsflag

            If Menue_indimmenue_flag <> 0 Then

               Select Case Menue_indimmenue_flag
                  Case 1 To 3:
                     Menue_state = Loadlabel(men3221)       'Bildschirm Dimmer heller
                     Gosub Menue_change_state_by_sub
                     Gosub Lcd_print
                     Gosub Menue_men3221
                     Menue_state_renew = 0
                  Case 4:
                     Gosub Menue_men312
               End Select                                   ' Überprüfung Dimmermenü

             End If                                         ' Menüüberprüfung

         ' Licht dunkler betätigt
         Case 24:
            Key_taste = 0

            ' Wegen manuellem Eingriff in Licht Flashmode verriegeln
            Dim_flash_mode_locked = True

            ' Prüfen ob Beleuchtung bereits eingeschaltet
            If Beleuchtung_flag = Passiv Then
               ' Beleuchtung läuft noch nicht => Beleuchtung einschalten
               Gosub Beleuchtung_ein
               Gosub Beleuchtung_dauerlicht_aus
               ' Dimmer frei laufen lasse
               Free_running_flag = Aktiv
            Else                                            ' Beleuchtungsflag
               ' Dimmer dunkler schalten und gegen Endwert prüfen
               If Dim_helligkeitsstufe > Dim_helligkeit_min Then
                  ' Helligkeitsstufe veringern
                  Decr Dim_helligkeitsstufe
               End If                                       ' Überprüfung Helligkeit
            End If                                          ' Beleuchtungsflag

            If Menue_indimmenue_flag <> 0 Then

               Select Case Menue_indimmenue_flag
                  Case 1 To 3:
                     Menue_state = Loadlabel(men3231)       'Bildschirm Dimmer dunkler
                     Gosub Menue_change_state_by_sub
                     Gosub Lcd_print
                     Gosub Menue_men3231
                     Menue_state_renew = 0
                  Case 4:
                     Gosub Menue_men312
               End Select                                   ' Überprüfung Dimmermenü

             End If                                         ' Menüüberprüfung

         ' Licht heller/dunkler betätigt = Aus
         Case 38:
            Key_taste = 0

            ' Wegen manuellem Eingriff in Licht Flashmode verriegeln
            Dim_flash_mode_locked = True

            ' Dimmer ausschalten
            Free_running_flag = Passiv
            If Dauerlicht_flag = Passiv Then
               Gosub Beleuchtung_dauerlicht_ein
               Gosub Beleuchtung_aus
            End If                                          ' Überprüfung Dauerlicht

            If Menue_indimmenue_flag <> 0 Then

               Select Case Menue_indimmenue_flag
                  Case 1 To 3:
                     Menue_state = Loadlabel(men3241)       'Startbildschirm
                     Gosub Menue_change_state_by_sub
                     Gosub Lcd_print
                     Menue_state_renew = 0
               End Select                                   ' Überprüfung Dimmermenü

            End If                                          ' Menüüberprüfung

            ' Dimmer wurde sauber ausgeschaltet => aktueller Helligkeitswert speichern

            ' Prüfung ob sich Werte (geseichert / aktuell) unterscheiden
            Temp_byte_1 = Ee_data_dimmer_aktuell
            If Temp_byte_1 <> Dim_helligkeitsstufe Then
               ' Es wird nur in das EEPROM geschrieben, wenn sich die aktuellen
               ' Werte von den gespeicherten unterscheiden!
               Ee_data_dimmer_aktuell = Dim_helligkeitsstufe
            End If                                          ' EEPROM-Zellenprüfung

      End Select                                            ' Key_taste

      ' Prüfung auf ShortCut-Funktion
      If Key_shortcut_status = True Then
         ' JA, ShortCut soll aktiv sein

         ' Ggf. Trace ausgeben
         #if Shortcut_testmodus                             ' Trace
            Print #2 , "ShortCut ist aktiv!"
         #endif                                             ' Trace

         If Key_taste = 22 Then

            ' Beschattung aktuell aktiv
            Temp_byte_1 = Beschattung_auf_flag + Beschattung_zu_flag
            If Temp_byte_1 <> 0 Then
               ' JA, Beschattung wird aktuell entweder auf oder zu gefahren und
               ' kann damit gestopt werden.

               ' Ggf. Trace ausgeben
               #if Shortcut_testmodus                       ' Trace
                  Print #2 , "Beschattung ist aktiv"
               #endif                                       ' Trace

               Key_taste = 0

               ' Prüfen auf Regen
               Temp_byte_1 = Rain_measurement()
               If Temp_byte_1 = Rain_no Then

                  ' Es regnet nicht, also weiter

                  ' Prüfen ob maximale Windgeschwindigkeit erreicht
                  Temp_byte_2 = Wind_geschwindigkeit_kmh
                  If Temp_byte_2 < Wind_beschattung_auf Then

                     ' Es windet nicht also weiter

                     Gosub Relais_beschattung_stop

                     If Menue_inrelmenue_flag <> 0 Then
                        Menue_state = Loadlabel(men2231)
                        Gosub Menue_change_state_by_sub
                     End If                                 ' Menüüberprüfung

                  End If                                    ' Ende Windprüfung
               End If                                       ' Ende Regenprüfung

            Else                                            ' Regenüberprüfung
               ' Prüfen ob aktuell Dimmer arbeitet
               If Free_running_flag = True Then
                  ' JA, Dimmer ist aktuell aktiv

                  ' Ggf. Trace ausgeben
                  #if Shortcut_testmodus                    ' Trace
                     Print #2 , "Dimmer ist aktiv"
                  #endif                                    ' Trace

                  Key_taste = 0
                  ' Dimmer ausschalten
                  Free_running_flag = Passiv
                  If Dauerlicht_flag = Passiv Then
                     Gosub Beleuchtung_dauerlicht_ein
                     Gosub Beleuchtung_aus
                  End If                                    ' Überprüfung Dauerlicht

                  If Menue_indimmenue_flag <> 0 Then

                     Select Case Menue_indimmenue_flag
                        Case 1 To 3:
                           Menue_state = Loadlabel(men3241) 'Startbildschirm
                           Gosub Menue_change_state_by_sub
                           Gosub Lcd_print
                           Menue_state_renew = 0
                     End Select                             ' Überprüfung Dimmermenü

                  End If                                    ' Menüüberprüfung

                  ' Dimmer wurde sauber ausgeschaltet => aktueller Helligkeitswert speichern
                  Ee_data_dimmer_aktuell = Dim_helligkeitsstufe

               End If                                       ' Dimmer
            End If                                          ' Beschattung
         End If                                             ' Enter
      End If                                                ' Shortcut Funktion

      ' Wenn Taste noch nicht durch Hot-Key abgefangen dann Menü
      If Key_taste <> 0 Then

         'Menüeintrag und Tastencodes finden und ggf. State wechseln
         'hier nur Tastendruck auswerten
         Gosub Menue_change_state

         'Pointer nach Statuswechsel neu setzen
         If Menue_state_renew = 1 Then
            Gosub Menue_change_state
         End If                                             ' Menü-Update angefordert

         ' Bereits schon LCD refresh auslösen bevor Unterprogramm angesprungen
         ' wird da im unterprogramm ggf. noch Inhalte ergänzt werden.
         If Menue_state_renew = 1 Then
            Menue_state_renew = 0
            Gosub Lcd_print
         End If                                             ' Erneutes Menü-Update prüfen

         'Unterprogramm des aktuellen State anspringen
         Gosub Menue_call_subroutine

      End If                                                ' Menüsteuerung

      ' globales Flag für Signalisierung zurücksetzen da Auswertung jetzt durchgeführt
      Key_keypressed = False

      ' Nach Auswertung Tastatur für erneute Eingabe wieder freigeben
      Gosub Key_enable_keyinterrupt

   End If                                                   ' Tastatureingabe

   ' Nochmals LCD refresh falls Menü von außen verändert
   If Menue_state_renew = 1 Then
      Menue_state_renew = 0
      Gosub Lcd_print
   End If                                                   ' Menü-Update angefordert

   '----- Ende Menue-modul -----

   ' ----- DCF77-Modul zur Behandlung von Synchronisationen -----
   ' DCF77 Statusbits abfragen und maskieren
   Temp_byte_1 = Dcf_status And &H80

   ' Prüfung ob SoftClock durch DCF77 synchronisiert (Bit 7 aus Statusbyte)
   If Temp_byte_1 = &H80 Then

      ' Trace-Output schreiben
      #if Dcf77_testmodus                                   ' Trace
         Print #2 , "SYNC: SoftClock wurde durch DCF77 synchronisiert!"
      #endif                                                ' Trace

      ' Sync-Counter erhöhen
      Incr Dcf_sync_count

      ' Zur Kontrolle bei erfolgreichem SYNC Status-Bit zurücksetzen
      Reset Dcf_status.7

      ' DS1307 synchronisieren
      Gosub Rtc_set_rtc_clock

   End If                                                   ' Synchronisation erfolgt?

   ' ----- Ende DCF77-Modul  -----

   ' ===== SW-Timer-Funktionen =====
   Gosub Sw_timer_sequencer

   ' ===== Steuerungs- und Regelfunktionen =====

   ' [1] Prüfung auf Regen und ggf. Beschattung auffahren und verriegeln
   Temp_byte_3 = Rain_measurement()                         ' Rain_no / Rain_yes
   If Temp_byte_3 = Rain_yes Then

      ' Regen aktuell erkannt
      If Rain_autoauffahren = Passiv Then

         ' Bisher hatte es noch nicht geregnet aber Regen wurde jetzt erkannt
         Rain_autoauffahren = Aktiv                         ' Regenflag setzen
         Set Led_13_open_rain                               ' Regen-LED setzen

         ' Beschattung auffahren
         Gosub Relais_beschattung_auf

         If Menue_inrelmenue_flag <> 0 Then
            Menue_state = Loadlabel(men2211)
            Gosub Menue_change_state_by_sub
         End If                                             ' Menüflag

         ' Ggf. Signalton ausgeben
         If Sound_flag = True Then
            Call Sound_beep(sound_beep_time_short)          ' Subroutine Beep aufrufen
            Waitms 40
            Call Sound_beep(sound_beep_time_short)          ' Subroutine Beep aufrufen
            Waitms 40
            Call Sound_beep(sound_beep_time_short)          ' Subroutine Beep aufrufen
         End If                                             ' Signalton
      End If                                                ' Regen-Auffahr-Flag
   Else                                                     ' Regenmessung
      ' Es regnet nicht mehr => Auffahrgrund existiert nicht mehr
      Reset Led_13_open_rain                                ' Regen-LED zurücksetzen
   End If                                                   ' Regenmessung

   ' [2] Prüfung auf Windgrenze und ggf. Beschattung auffahren und verriegeln
   Temp_byte_1 = Wind_geschwindigkeit_kmh
   If Temp_byte_1 >= Wind_beschattung_auf Then

      ' Aktuell zu starker Wind erkannt, Grenzwert erreicht
      If Wind_autoauffahren = Passiv Then

         ' Bisher Windgrenze noch nicht rreicht aber nur Grenzwert überschritten
         Wind_autoauffahren = Aktiv                         ' Windflag setzen
         Set Led_14_open_wind                               ' Wind-LED setzen

         ' Beschattung auffahren
         Gosub Relais_beschattung_auf

         If Menue_inrelmenue_flag <> 0 Then
            Menue_state = Loadlabel(men2211)
            Gosub Menue_change_state_by_sub
         End If                                             ' Menüflag

         ' Ggf. Signalton ausgeben
         If Sound_flag = True Then
            Call Sound_beep(sound_beep_time_short)          ' Subroutine Beep aufrufen
            Waitms 40
            Call Sound_beep(sound_beep_time_short)          ' Subroutine Beep aufrufen
            Waitms 40
            Call Sound_beep(sound_beep_time_short)          ' Subroutine Beep aufrufen
         End If                                             ' Signalton

      End If                                                ' Wind-Auffahr-Flag
   Else                                                     ' Windmessung

      ' Wind ist kleiner als Grenzwert => Auffahrgrund existiert nicht mehr
      Reset Led_14_open_wind                                ' Wind-LED zurücksetzen

   End If                                                   ' Windmessung

   ' [3] Prüfen auf abgelaufenen OPEN Timer
   If Timer_open_flag = Aktiv Then
      ' Timerüberwachung ist aktiv, es kann geprüft werden ob Uhrzeit erreicht
      Temp_string_1 = Date$

      ' Prüfen ob Datum korrekt

      ' Datum für Vergleich zusammenbauen
      Temp_byte_1 = Makebcd(timer_open_tag)
      Temp_byte_2 = Makebcd(timer_open_monat)
      Temp_byte_3 = Makebcd(timer_open_jahr)

      ' Anscheinend kann BASCOM nun auch verschachtelte Operationen :-)
      Temp_string_2 = Bcd(temp_byte_1) + "." + Bcd(temp_byte_2) + "." + Bcd(temp_byte_3)
      ' Sonst:
      'Temp_string_2 = Temp_string_2 + Bcd(temp_byte_2)
      'Temp_string_2 = Temp_string_2 + "."
      'Temp_string_2 = Temp_string_2 + Bcd(temp_byte_3)

      ' Ggf. Trace ausgeben
      #if Timer_testmodus                                   ' Trace
         Print #2 , "Systemdatum : " ; Temp_string_1
         Print #2 , "Timer Open  : " ; Temp_string_2
      #endif                                                ' Trace

      If Temp_string_1 = Temp_string_2 Then

         ' Ja, Datum ist korrekt => prüfen ob Zeit korrekt

         Temp_string_1 = Time$

         ' Zeit zum Vergleich zusammenbauen
         Temp_byte_1 = Makebcd(timer_open_stunde)
         Temp_byte_2 = Makebcd(timer_open_minute)
         Temp_byte_3 = Makebcd(timer_open_sekunde)

         ' Verschachtelten String zusammenbauen

         Temp_string_2 = Bcd(temp_byte_1) + ":" + Bcd(temp_byte_2) + ":" + Bcd(temp_byte_3)

         ' Ggf. Trace ausgeben
         #if Timer_testmodus                                ' Trace
            Print #2 , "Systemzeit : " ; Temp_string_1
            Print #2 , "Timer Open : " ; Temp_string_2
         #endif                                             ' Trace

         If Temp_string_1 = Temp_string_2 Then

            ' JA, Zeit ist auch korrekt => geplante Aktion kann ausgeführt werden

            ' Ggf. Trace ausgeben
            #if Timer_testmodus                             ' Trace
               Print #2 , "Timer OPEN aktiv => Beschattung auffahren"
            #endif                                          ' Trace

            ' Anmerkung: Unabhängg davon, das jederzeit aufgefahren werden kann
            ' soll durch die Überprüfung von Wind und Regen sichergestellt werden,
            ' dass die Antriebe unnötig nochmal durch den OPEN-Timer bestromt
            ' werden, obwohl dieser schon geöffnet ist.

            ' Prüfen auf Regen
            Temp_byte_1 = Rain_measurement()
            If Temp_byte_1 = Rain_no Then

               ' Es regnet nicht, also weiter

               ' Prüfen ob maximale Windgeschwindigkeit erreicht
               Temp_byte_2 = Wind_geschwindigkeit_kmh
               If Temp_byte_2 < Wind_beschattung_auf Then

                  ' Es windet nicht also weiter

                  Gosub Relais_beschattung_auf

                  ' ggf. Menü anpassen
                  If Menue_inrelmenue_flag <> 0 Then
                     Menue_state = Loadlabel(men2211)
                     Gosub Menue_change_state_by_sub
                  End If                                    ' Menü-Update                           '

                  ' Ggf. Signalton ausgeben
                  If Sound_flag = True Then
                     Call Sound_beep(sound_beep_time_short) ' Subroutine Beep aufrufen
                     Waitms 40
                     Call Sound_beep(sound_beep_time_short) ' Subroutine Beep aufrufen
                     Waitms 40
                     Call Sound_beep(sound_beep_time_short) ' Subroutine Beep aufrufen
                  End If                                    ' Signalton

                  ' Status LED setzen
                  Set Led_11_open_time

               End If                                       ' Ende Windprüfung
            End If                                          ' Ende Regenprüfung

            ' Timer flag zurücksetzen da Aktion nur einmal ausgeführt werden soll
            Timer_open_flag = Passiv

         End If                                             ' Zeit
      End If                                                ' Datum
   End If                                                   ' Timer_open_flag

   ' [4] Prüfen auf abgelaufenen CLOSE Timer
   If Timer_close_flag = Aktiv Then
      ' Timerüberwachung ist aktiv, es kann geprüft werden ob Uhrzeit erreicht
      Temp_string_1 = Date$

      ' Prüfen ob Datum korrekt

      ' Datum für Vergleich zusammenbauen
      Temp_byte_1 = Makebcd(timer_close_tag)
      Temp_byte_2 = Makebcd(timer_close_monat)
      Temp_byte_3 = Makebcd(timer_close_jahr)

      ' Anscheinend kann BASCOM nun auch verschachtelte Operationen :-)
      Temp_string_2 = Bcd(temp_byte_1) + "." + Bcd(temp_byte_2) + "." + Bcd(temp_byte_3)

      ' Ggf. Trace ausgeben
      #if Timer_testmodus                                   ' Trace
         Print #2 , "Systemdatum : " ; Temp_string_1
         Print #2 , "Timer Close : " ; Temp_string_2
      #endif                                                ' Trace

      If Temp_string_1 = Temp_string_2 Then

         ' Ja, Datum ist korrekt => prüfen ob Zeit korrekt

         Temp_string_1 = Time$

         ' Zeit zum Vergleich zusammenbauen
         Temp_byte_1 = Makebcd(timer_close_stunde)
         Temp_byte_2 = Makebcd(timer_close_minute)
         Temp_byte_3 = Makebcd(timer_close_sekunde)

         ' Verschachtelten String zusammenbauen

         Temp_string_2 = Bcd(temp_byte_1) + ":" + Bcd(temp_byte_2) + ":" + Bcd(temp_byte_3)

         ' Ggf. Trace ausgeben
         #if Timer_testmodus                                ' Trace
            Print #2 , "Systemzeit : " ; Temp_string_1
            Print #2 , "Timer Close: " ; Temp_string_2
         #endif                                             ' Trace

         If Temp_string_1 = Temp_string_2 Then

            ' JA, Zeit ist auch korrekt => geplante Aktion kann ausgeführt werden

            ' Ggf. Trace ausgeben
            #if Timer_testmodus                             ' Trace
               Print #2 , "Timer CLOSE aktiv => Beschattung zufahren"
            #endif                                          ' Trace

            ' Prüfen auf Regen
            Temp_byte_1 = Rain_measurement()
            If Temp_byte_1 = Rain_no Then

               ' Es regnet nicht, also weiter

               ' Prüfen ob maximale Windgeschwindigkeit erreicht
               Temp_byte_2 = Wind_geschwindigkeit_kmh
               If Temp_byte_2 < Wind_beschattung_auf Then

                  ' Es windet nicht also weiter

                  ' Beschattung zufahren
                  Gosub Relais_beschattung_zu

                  ' ggf. Menü anpassen
                  If Menue_inrelmenue_flag <> 0 Then
                     Menue_state = Loadlabel(men2221)
                     Gosub Menue_change_state_by_sub
                  End If                                    ' Menüanpassung

                  ' Ggf. Signalton ausgeben
                  If Sound_flag = True Then
                     Call Sound_beep(sound_beep_time_short) ' Subroutine Beep aufrufen
                     Waitms 40
                     Call Sound_beep(sound_beep_time_short) ' Subroutine Beep aufrufen
                     Waitms 40
                     Call Sound_beep(sound_beep_time_short) ' Subroutine Beep aufrufen
                  End If                                    ' Signalton

                  ' Status LED setzen
                  Set Led_15_close_time

               End If                                       ' Ende Windprüfung
            End If                                          ' Ende Regenprüfung

            ' Timer flag zurücksetzen da Aktion nur einmal ausgeführt werden soll
            Timer_close_flag = Passiv

         End If                                             ' Zeit
      End If                                                ' Datum
   End If                                                   ' Timer_close_flag

   ' [5] Prüfen auf Licht für automatisches Auffahren
   If Rel_auf_dunkel_flag = True Then
      ' Helligkeitsüberprüfung ist aktiv, es kann geprüft werden ob Dunkelheit erreicht

      ' Gedanken zum lichtgesteuerten Zufahren:
      ' - Zufahren nur erlaubt wenn Lichtfunktionen deaktiv (kein Dimmer eingeschaltet)
      ' - Fuktion darf nur pro Tag einmal "auffahren" auslösen

      ' Prüfen ob Dunkelheitssteuerung nicht verriegelt
      If Light_autoauffahren_locked = False Then

         ' Prüfen ob künstliche Beleuchtung eingeschaltet
         If Beleuchtung_flag = False Then

            ' NEIN, künstliche Beleuchtung welche messung stören würde ist nicht
            ' eingeschaltet, somit kann Routine fortgesetzt werden.

            ' Prüfen ob Dunkelheitsgrenze unterschritten
            If Light_value <= Rel_auf_dunkelheit Then
               ' JA, Beschattung auffahren

               ' Anmerkung: Unabhängg davon, das jederzeit aufgefahren werden kann
               ' soll durch die Überprüfung von Wind und Regen sichergestellt werden,
               ' dass die Antriebe unnötig nochmal durch den OPEN-Timer bestromt
               ' werden, obwohl dieser schon geöffnet ist.

               ' Prüfen auf Regen
               Temp_byte_1 = Rain_measurement()
               If Temp_byte_1 = Rain_no Then

                  ' Es regnet nicht, also weiter

                  ' Prüfen ob maximale Windgeschwindigkeit erreicht
                  Temp_byte_2 = Wind_geschwindigkeit_kmh
                  If Temp_byte_2 < Wind_beschattung_auf Then

                     ' Es windet nicht also weiter

                     ' Beschattung auffahren
                     Gosub Relais_beschattung_auf

                     ' ggf. Menü anpassen
                     If Menue_inrelmenue_flag <> 0 Then
                        Menue_state = Loadlabel(men2211)
                        Gosub Menue_change_state_by_sub
                     End If                                 ' Menüanpassung

                     ' Ggf. Signalton ausgeben
                     If Sound_flag = True Then
                        Call Sound_beep(sound_beep_time_short)       ' Subroutine Beep aufrufen
                        Waitms 40
                        Call Sound_beep(sound_beep_time_short)       ' Subroutine Beep aufrufen
                        Waitms 40
                        Call Sound_beep(sound_beep_time_short)       ' Subroutine Beep aufrufen
                     End If                                 ' Signalton

                     ' Status-LED einschalten
                     Set Led_12_open_light

                     ' Zustand für Menü richtig setzen
                     Light_autoauffahren = Aktiv

                  End If                                    ' Ende Windprüfung
               End If                                       ' Ende Regenprüfung

               ' Verriegelung gegen erneutes Auffahren setzen
               Light_autoauffahren_locked = True

            End If                                          ' Licht
         End If                                             ' Künstliche Beleuchtung
      End If                                                ' Verriegelung
   End If                                                   ' Dunkel flag

   ' [6] Prüfen auf Temperatur für automatisches Zufahren
   If Rel_zu_temp_flag = True Then
      ' Temperaturüberprüfung ist aktiv, es kann geprüft werden ob Temperatur erreicht
      ' ACHTUNG: Nur zufahren bei kein Regen und kein Wind!

      ' Gedanken zum temperaturgesteuerten Zufahren:
      ' - Für Funktion wird Hysterese implementiert mit der "toggeln" verhindert
      '   werden soll

      ' Prüfen ob Temperatursteuerung nicht verriegelt
      If Sht71_autozufahren_locked = False Then
         ' JA, Beschattung kann zugefahren werden

         Temp_byte_1 = Sht71_t                              ' Casting von Single in Byte
         ' Prüfen ob Temperaturgrenze überschritten
         If Temp_byte_1 >= Rel_zu_temperatur Then

            'Ja, Temperaturgrenze erreicht

            ' Prüfen auf Regen
            Temp_byte_1 = Rain_measurement()
            If Temp_byte_1 = Rain_no Then

               ' Es regnet nicht, also weiter

               ' Prüfen ob maximale Windgeschwindigkeit erreicht
               Temp_byte_2 = Wind_geschwindigkeit_kmh
               If Temp_byte_2 < Wind_beschattung_auf Then

                  ' Es windet nicht also weiter

                  ' Beschattung zufahren
                  Gosub Relais_beschattung_zu

                  ' ggf. Menü anpassen
                  If Menue_inrelmenue_flag <> 0 Then
                     Menue_state = Loadlabel(men2221)
                     Gosub Menue_change_state_by_sub
                  End If                                    ' Menüanpassung

                  ' Ggf. Signalton ausgeben
                  If Sound_flag = True Then
                     Call Sound_beep(sound_beep_time_short) ' Subroutine Beep aufrufen
                     Waitms 40
                     Call Sound_beep(sound_beep_time_short) ' Subroutine Beep aufrufen
                     Waitms 40
                     Call Sound_beep(sound_beep_time_short) ' Subroutine Beep aufrufen
                  End If                                    ' Signalton

                  ' Status-LED einschalten
                  Set Led_16_close_temp

                  ' Zustand für Menü richtig setzen
                  Sht71_autozufahren = Aktiv

               End If                                       ' Ende Windprüfung
            End If                                          ' Ende Regenprüfung

            ' Verriegelung gegen erneutes Zufahren setzen
            Sht71_autozufahren_locked = True

         End If                                             ' Temperatur
      End If                                                ' Verriegelung
   End If                                                   ' Temp Flag

   ' [7] Prüfen ob Verriegelung für lichtgesteuertes Auffahren zurückgesetzt werden kann

   ' Anmerkung: Das Flag für die Dunkelheitssteuerung soll verhindern, dass bei
   ' Helligkeitsschwankungen oder bei Einschalten der künstlichen Beleuchtung
   ' und bei erneutem Unterschreiten der eingestellten Helligkeitsschwelle das
   ' Relais erneut anspricht.
   ' Die Lösung sieht vor, ggf. erst ab erreichen der Uhrzeit 12:00 Uhr das Flag
   ' erneut für die Steuerung der Beschattung zuzulassen.

   If Light_autoauffahren_locked = True Then
      ' JA, lockflag ist gesetzt

      ' Prüfen on Uhrzeit 12:00 Uhr Mittags, dann lockbit zurücksetzen
      If _hour = 12 Then
         ' Ja, 12 Uhr Mittag erreicht

         ' Flag für Dunkelheitseinstellung zurücksetzen
         Light_autoauffahren_locked = False

         ' Status-LED ausschalten
         Reset Led_12_open_light

      End If                                                ' Uhrzeitprüfung
   End If                                                   ' Flagüberprüfung

   ' [8] Prüfug ob Verriegelung für temperaturgesteuertes Zufahren zurückgesetzt werden kann

   If Sht71_autozufahren_locked = True Then
      ' Ja, lockflag ist gesetzt

      Temp_byte_1 = Rel_zu_temperatur - Sht71_hysterese
      Temp_byte_2 = Sht71_t                                 ' Casting Single to Byte
      If Temp_byte_2 < Temp_byte_1 Then
         ' Ja, hysterese ist unterschritten

         ' Flag für Temperatur zurücksetzen
         Sht71_autozufahren_locked = False

         ' Status-LED ausschalten
         Reset Led_16_close_temp

      End If                                                ' Temperaturprüfung
   End If                                                   ' Flagüberprüfung

   ' [9] Prüfung ob Lüftersteuerung und Lüfter einregeln

   If Fan_sw_betrieb = True Then
      ' JA, Lüfter soll via SW gesteuert werden

      ' Geschwindigkeitsintervalle festlegen
      Temp_byte_1 = Sht71_t                                 ' Casting Single to Byte

      ' Ggf. Trace ausgeben
      #if Main_testmodus                                    ' Trace
         Print #2 , "Lueftersteuerung via SW"
         Print #2 , "Bezugstemperatur : " ; Temp_byte_1
      #endif                                                ' Trace

      If Temp_byte_1 >= Fan_100_temperatur Then
         Call Fan_set_geschwindigkeit(fan_speed_100)

         ' Ggf. Trace ausgeben
         #if Main_testmodus                                 ' Trace
            Print #2 , "Lueftergeschwindigkeit 100%"
         #endif                                             ' Trace
      Else                                                  ' Stufe 100%
         If Temp_byte_1 >= Fan_75_temperatur Then
            Call Fan_set_geschwindigkeit(fan_speed_75)

            ' Ggf. Trace ausgeben
            #if Main_testmodus                              ' Trace
               Print #2 , "Lueftergeschwindigkeit 75%"
            #endif                                          ' Trace
         Else                                               ' Stufe 75%
            If Temp_byte_1 >= Fan_50_temperatur Then
               Call Fan_set_geschwindigkeit(fan_speed_50)

               ' Ggf. Trace ausgeben
               #if Main_testmodus                           ' Trace
                  Print #2 , "Lueftergeschwindigkeit 50%"
               #endif                                       ' Trace
            Else                                            ' Stufe 50%
               If Temp_byte_1 >= Fan_25_temperatur Then
                  Call Fan_set_geschwindigkeit(fan_speed_25)

                  ' Ggf. Trace ausgeben
                  #if Main_testmodus                        ' Trace
                     Print #2 , "Lueftergeschwindigkeit 25%"
                  #endif                                    ' Trace
               Else                                         ' Stufe 25%
                  Call Fan_set_geschwindigkeit(fan_belueftung_aus)

                  ' Ggf. Trace ausgeben
                  #if Main_testmodus                        ' Trace
                     Print #2 , "Lueftergeschwindigkeit NULL"
                  #endif                                    ' Trace
               End If                                       ' Stufe 25%
            End If                                          ' Stufe 50%
         End If                                             ' Stufe 75%
      End If                                                ' Stufe 100%
   End If                                                   ' Flag für SW Lüfterbetrieb

   ' [10] Flashmode

   ' Gedanken und Anmerkungen zur Implementierung des Flash-Mode:
   ' Der Flashmode beschreibt die Funktion, dass bei fortschreitender Dunkelheit
   ' der Dimmer auf kleinster Stufe eingeschaltet und "angefahren" wird, bis
   ' der Lichtsensor wieder seinen Maximalwert liefert.
   ' Folgende Regel sollen dabei gelten:
   ' - Flashmode erst ab Uhrzeit 15:00 Uhr aktiv
   ' - Manueller Eingriff über Tasten oder Menü deaktiiert sofort Flashmode
   ' - Helligkeitsrampe Flashmode ersetzt die bisherige Helligkeitseinstellung
   ' - Helligkeitswert der Lampe kann durch Flashmode nur erhöht aber nicht
   '   verringert werden!
   ' - Flashmode kann nur aktiv werden wenn Beleuchtung noch aus.

   ' Prüfen ob Flashmode aktiv
   If Dim_flash_mode = Aktiv Then
      ' JA, Flashmode ist aktiv

      ' Prüfen ob Flash-Mode nicht durch manuellen Eingriff verriegelt
      If Dim_flash_mode_locked = False Then
         ' NEIN, Flashmode ist nicht veriegelt

         ' Prüfen ob Zeit nach 15:00 Uhr
         Temp_byte_1 = _hour
         If Temp_byte_1 > 15 Then
            ' JA, es ist nach 15:00 Uhr

            ' Ggf. Trace Output schreiben
            #if Flashmode_testmodus                         ' Trace
               Print #2 , "Alle Bedingungen für Flashmode sind erfuellt!"
            #endif                                          ' Trace

            ' Prüfen ob Update auf Licht-Wert stattgefunden hat
            If Light_update_flag = True Then
               ' Helligkeitswert überwachen
               If Light_value < Dim_flash_grenzhelligkeit Then
                  ' JA, definierte Grenzhelligkeit ist unterschritten

                  ' Prüfen ob Beleuchtung noch aus
                  If Beleuchtung_flag = Passiv Then

                     ' Ja, Beleuchtung ist noch aus

                     ' Für Flash-Mode mit kleinster Einstellung starten
                     Dim_helligkeitsstufe = Dim_helligkeit_min

                     ' Beleuchtung läuft noch nicht => Beleuchtung einschalten
                     Gosub Beleuchtung_ein
                     Gosub Beleuchtung_dauerlicht_aus
                     ' Dimmer frei laufen lasse
                     Free_running_flag = Aktiv

                  Else                                      ' Überprüfung Beleuchtung

                     ' So lange über Algorithmus Helligkeit der Dimmund erhöhen bis
                     ' entweder Maximalwert erreicht oder Helligkeit ausreichend

                     ' Ist Maximalwert schon erreicht?
                     If Dim_helligkeitsstufe < Dim_helligkeit_max Then
                        Incr Dim_helligkeitsstufe
                     End If                                 ' Maximale Helligkeitsstufe

                  End If                                    ' Beleuchtung

                  ' Flag wieder zurücksetzen
                  Light_update_flag = False

               End If                                       ' Update Lichtwert
            End If                                          ' Grenzhelligkeit
         End If                                             ' 15:00 Uhr Grenze
      End If                                                ' Verriegelung Flash-Mode
   End If                                                   ' Flag für Flashmode

   ' [11] Prüfen ob Flash-Mode-Verriegelung entriegelt werden kann
   ' Prüfen ob Flashmode aktiv
   If Dim_flash_mode = Aktiv Then
      ' JA, Flashmode ist aktiv

      ' Prüfen ob Zeit gleich 15:00 Uhr
      Temp_byte_1 = _hour
      If Temp_byte_1 = 15 Then
         ' JA, es ist 15:00 Uhr

         ' Prüfen ob Beleuchtung noch aus
         If Beleuchtung_flag = False Then
            ' Ja, Beleuchtung ist noch aus

            ' Verriegelung des Flash-Mode aufheben
            Dim_flash_mode_locked = False

            ' Ggf. Trace Output schreiben
            #if Flashmode_testmodus                         ' Trace
               Print #2 , "Verriegelung Flashmode wurde aufgehoben"
            #endif                                          ' Trace

         End If                                             ' Beleuchtung
      End If                                                ' 15:00 Uhr Grenze
   End If                                                   ' Flag für Flashmode

   ' ===== Restarbeiten =====

   ' Prüfen ob LED-Array upgedated werden muss
   If Led_array_save <> Led_array Then
      Gosub Led_update_array                                ' LED-Anzeige updaten
   End If                                                   ' Array updaten
Loop

'## End Hauptprogramm #########################################################

'******************************************************************************
' Interruptroutinen
'******************************************************************************

'------------------------------------------------------------------------------
' Interrupt-Service-Routine (INT7): Key_isr_routine
'
'------------------------------------------------------------------------------
Key_isr_routine:

   ' INT7 sperren damit keine weitere Tasteneingabe mehr ausgelöst wird.
   Disable Int7
   ' globales Flag für Tasteeingabe setzen
   Key_keypressed = True

   ' Ggf. Trace Output schreiben
   #if Key_testmodus                                        ' Trace
      ' Interrupt-Counter erhöhen
      Incr Test_int_counter
      Print #2 , "* " ; Test_int_counter
   #endif                                                   ' Trace

Return
'-- End Key_isr_routine -------------------------------------------------------

'------------------------------------------------------------------------------
' Service-Routine DCF77_sectic für DCF77 Softclock
' Routine wird als Parameter bei Config DCF77 übergeben und automatisch jede
' Sekunde ausgeführt. Damit ist SekundenTick für Gesamtsystem ohne zusätzlichen
' Timer möglich.
'------------------------------------------------------------------------------
Sectic:

   ' Sectic_counter ist Zähler für Scheduler / Sequencer -> zählt immer weiter
   Incr Sectic_count

   ' Sectic-LED toggelt mit einer Frequenz von 0,5 Hz
   Toggle Sectick_led

   ' Wenn Konstante gesetzt Trace Output schreiben
   #if Dcf77_testmodus                                      ' Trace
      Print #2 , ""
      Print #2 , "tic :" ; Sectic_count
      Print #2 , ""
   #endif                                                   ' Trace

Return
'-- End Dcf77_sectic ----------------------------------------------------------

'------------------------------------------------------------------------------
' Interrupt-Service-Routine (INT5): Dimmer_null_irq
' Routine zur Nulldurchgangserkennung des Sinussignals
'------------------------------------------------------------------------------
Dimmer_null_irq:

   ' In dieser IRQ-Routine wird wegen Geschwindigkeit auf Ausgaben verzichtet
   If Free_running_flag = Aktiv Then
      Start Timer2
      Timer2 = Triac_zuenszeitpunkte(dim_helligkeitsstufe)
   End If                                                   ' Dimmer aktiv?

Return
'-- End Dimmer_null_irq -------------------------------------------------------

'------------------------------------------------------------------------------
' Interrupt-Service-Routine (Timer0): Dimmer_triac_irq
' Routine zum Zünden des TRIAC
'------------------------------------------------------------------------------
Dimmer_triac_irq:

   Stop Timer2
   Triac_start = 1
   Waitus 20
   Triac_start = 0

Return
'-- End Dimmer_triac_irq ------------------------------------------------------

'------------------------------------------------------------------------------
' Interrupt-Service-Routine (INT6): Wind_irq
' Routine zur Auswertung des INT6 Interrupts für Impulseingang Windsensor
'------------------------------------------------------------------------------
Wind_irq:

   ' Impulszähler erhöhen
   Incr Wind_sensorimpulse

Return
'-- End Timer_irq -------------------------------------------------------------

'******************************************************************************
' Subroutinen
'******************************************************************************

' ********************
' * LCD:  Display    *
' ********************

'------------------------------------------------------------------------------
' LCD - Subroutine: Lcd_set_helligkeit
' Subroutine setzt den als Übergabeparameter übergebenen Bytewert als
' LCD Helligkeitswert
'
' Parameter:    Value = Bytewert für LCD Helligkeit
' Rückgabewert: keine
'------------------------------------------------------------------------------
Sub Lcd_set_helligkeit(byval Value As Byte)

   ' Wenn Konstante gesetzt Trace Output schreiben
   #if Lcd_testmodus                                        ' Trace
      Print #2 , "Enter Lcd_set_helligkeit"
   #endif                                                   ' Trace

   ' PWM-Wert setzen und Variable in Timer-Count-Register laden
   Lcd_pwmwert = Value
   Pwm3a = Lcd_pwmwert

End Sub
'-- End Lcd_set_helligkeit ----------------------------------------------------

'------------------------------------------------------------------------------
' LCD - Sub-Routine: Lcd_writesingleline
' Gibt einen einzeiligen Texte auf dem LCD-Display aus.
' Parameter: line1 = Zeile in der die Ausgabe erfolgen soll
'            text1 = Text der ausgegeben werden soll
'------------------------------------------------------------------------------
Sub Lcd_writesingleline(line1 As Byte , Text1 As Sring)

   Cls                                                      ' Bildschirm löschen
   Locate Line1 , 1 : Lcd Text1                             ' Ausgabe Zeil 1

End Sub
'-- End Lcd_writesingleline ---------------------------------------------------

'------------------------------------------------------------------------------
' LCD - Sub-Routine: Lcd_writedoubleline
' Gibt einen zweizeiligen Texte auf dem LCD-Display aus.
' Die Reihenfolge und die Textposition kann frei gewählt werden
' Parameter: line1 = 1. Zeile in der die 1. Ausgabe erfolgen soll
'            line2 = 2. Zeile in der die 2. Ausgabe erfolgen soll
'            text1 = 1. Text der auf 1. Position ausgegeben werden soll
'            text2 = 2. Text der auf 2. Position ausgegeben werden soll
'------------------------------------------------------------------------------
Sub Lcd_writedoubleline(line1 As Byte , Line2 As Byte , Text1 As String , Text2 As String)

   Cls                                                      ' Bildschirm löschen
   Locate Line1 , 1 : Lcd Text1                             ' Ausgabe Zeil 1
   Locate Line2 , 1 : Lcd Text2                             ' Ausgabe Zeile 2

End Sub
'-- End Lcd_writedoubleline ---------------------------------------------------

'------------------------------------------------------------------------------
' LCD - Sub-Routine: Lcd_writetrippleline
' Gibt einen dreizeiligen Texte auf dem LCD-Display aus.
' Parameter: text1 = 1. Text der in Zeile 1 ausgegeben werden soll
'            text2 = 2. Text der in Zeile 2 ausgegeben werden soll
'            text3 = 3. Text der in Teile 3 ausgegeben werden soll
'------------------------------------------------------------------------------
Sub Lcd_writetrippleline(text1 As String , Text2 As String , Text3 As String)

   ' Variablen für Positionierung definieren und festlegen
   ' Hinweis: Interessanter Weise funktioniert Ausgabe nicht bei direkter Zuweisung!
   Dim Line1 As Byte , Line2 As Byte , Line3 As Byte
   Line1 = 1
   Line2 = 2
   Line3 = 3

   ' Ausgabe der Texte
   Cls                                                      ' Bildschirm löschen
   Locate Line1 , 1 : Lcd Text1                             ' Ausgabe Zeile 1
   Locate Line2 , 1 : Lcd Text2                             ' Ausgabe Zeile 2
   Locate Line3 , 1 : Lcd Text3                             ' Ausgabe Zeile 3

End Sub
'-- End Lcd_writetrippleline --------------------------------------------------

' ********************
' * FAN:  Lüfter     *
' ********************

'------------------------------------------------------------------------------
' FAN - Subroutine: Fan_set_geschwindigkeit
' Subroutine setzt den als Übergabeparameter übergebenen Bytewert als Ge-
' schwindigkeitswert für die Lüftergeschwindigkeit.
' Kleinere Bytewerte als die Minimalgeschwindigkeit werden auf MIN begrenzt.
'
' Parameter:    Value = Bytewert für Lüftergeschwindigkeit
' Rückgabewert: keine
'------------------------------------------------------------------------------
Sub Fan_set_geschwindigkeit(byval Value As Byte)

   ' Wenn Konstante gesetzt Trace Output schreiben
   #if Fan_testmodus                                        ' Trace
      Print #2 , "Enter Fan_set_geschwindigkeit"
   #endif                                                   ' Trace

   ' Prüfung ob Bytewert zu klein, wenn ja auf MIN begrenzen
   ' If Value <= Fan_geschwindigkeit_min Then
   '   Value = Fan_geschwindigkeit_min
   ' End If
   ' Anmerkung: Prüfung wird in Praxis nicht gemachtda auch abgeschaltet werden
   ' soll.

   ' PWM-Wert setzen und Variable in Timer-Count-Register laden
   Fan_pwmwert = Value
   Pwm3b = Fan_pwmwert

End Sub
'-- End Fan_set_geschwindigkeit -----------------------------------------------

' ********************
' * SOUND: Piezo     *
' ********************

'------------------------------------------------------------------------------
' SOUND - Subroutine: Sound_beep
' Subroutine gibt für die in ms übergebene Zeit einen Signalton aus
' Achtung, Routine wartet so lange bis Ton ausgegeben ist!
'
' Parameter:    time_value = Zeit in ms die der Beepton ausgegeben werden soll
' Rückgabewert: keine
'------------------------------------------------------------------------------
Sub Sound_beep(time_value As Word)

   ' Wenn Konstante gesetzt Trace Output schreiben
   #if Sound_testmodus = 1                                  ' Trace
      Print #2 , "Enter Sound_beep mit Wartezeit " ; Time_value ; " ms"
   #endif                                                   ' Trace

   Gosub Sound_an                                           ' Ton einschalten
   Waitms Time_value                                        ' warten
   Gosub Sound_aus                                          ' Ton ausschalten

End Sub
'-- End Sound_beep ------------------------------------------------------------

' ********************
' * SHT71:  Sensor   *
' ********************

'------------------------------------------------------------------------------
' SHT71 - Subroutine: Sht71_calc_measurements
' Subroutine kalkuliert aus den Rohdaten in den globalen Variablen die tat-
' sächlichen Messwerte und legt diese erneut in globalen Enddaten-Variablen ab.
'
' Parameter:    keine
' Rückgabewert: keine
'------------------------------------------------------------------------------
Sub Sht71_calc_measurements()

   ' ----- locale Variablen -----
   Local Local_resultstring As String * 20

   Local Local_temp_single1 As Single
   Local Local_temp_single2 As Single
   Local Local_temp_single3 As Single

   ' ----- Programmcode -----

   ' Wenn Konstante gesetzt Trace Output schreiben
   #if Sht71_testmodus = 1                                  ' Trace
      Print #2 , "Enter Sht71_calc_measurements"
   #endif                                                   ' Trace

   ' ----- Berechnung der Temperatur T -----

   ' Formula temperature:
   ' Temperature = d1 + d2 * SOt
   Local_temp_single1 = Sht71_d2 * Sht71_temp_word
   Local_temp_single1 = Local_temp_single1 + Sht71_d1

   ' Wenn Konstante gesetzt Trace Output schreiben
   #if Sht71_testmodus = 1                                  ' Trace
      Local_resultstring = Fusing(local_temp_single1 , "###.##")
      Print #2 , "Data " ; Hex(sht71_temp_word) ; " " ; Sht71_temp_word
      Print #2 , "Temp " ; Local_resultstring ; "C"
   #endif                                                   ' Trace

   ' gerechneter Temperaturwert an globale Variable übergeben
   Sht71_t = Local_temp_single1

   ' ----- Berechnung der Feuchtigkeit RHlinear -----

   ' Formula relative humidity:
   ' RHlinear = c1 + c2 * SOrh + c3 * SOrh^2

   Local_temp_single1 = Sht71_c2 * Sht71_humi_word

   Local_temp_single2 = Sht71_humi_word * Sht71_humi_word
   Local_temp_single2 = Sht71_c3 * Local_temp_single2

   Local_temp_single3 = Sht71_c1 + Local_temp_single1
   Local_temp_single3 = Local_temp_single3 + Local_temp_single2

   ' Wenn Konstante gesetzt Trace Output schreiben
   #if Sht71_testmodus = 1                                  ' Trace
      Local_resultstring = Fusing(local_temp_single3 , "###.##")
      Print #2 , "Data " ; Hex(sht71_humi_word) ; " " ; Sht71_humi_word
      Print #2 , "RHlinear " ; Local_resultstring ; "%"
   #endif                                                   ' Trace

   ' gerechneter Feuchtigkeitswert RHlinear an globale Variable übergeben
   Sht71_rhlinear = Local_temp_single3

   ' ----- Berechnung der Feuchtigkeit RHtrue -----

   ' Formula humidity / temperature compensation:
   ' RHtrue = (Temperature - 25) * (t1 + t2 * SOrh) + RHlinear
   Local_temp_single1 = Sht71_t - 25

   Local_temp_single2 = Sht71_t2 * Sht71_humi_word
   Local_temp_single2 = Local_temp_single2 + Sht71_t1

   Local_temp_single3 = Local_temp_single1 * Local_temp_single2
   Local_temp_single3 = Local_temp_single3 + Sht71_rhlinear

   ' Wenn Konstante gesetzt Trace Output schreiben
   #if Sht71_testmodus = 1                                  ' Trace
      Local_resultstring = Fusing(local_temp_single3 , "###.##")
      Print #2 , "RHtrue " ; Local_resultstring ; "%"
   #endif                                                   ' Trace

   ' gerechneter Feuchtigkeitswert RHtrue an globale Variable übergeben
   Sht71_rhtrue = Local_temp_single3

   ' ----- Berechnung des Taupunktes -----

   ' Formulas for Dew Point calculation:
   ' H = (log10(RHtrue) - 2) / alpha + (m * Temperature) / (tn + Temperature)
   ' Dp = tn * H / (m - H) // this is the dew point in Celsius
   Local_temp_single1 = Log10(sht71_rhtrue)
   Local_temp_single1 = Local_temp_single1 - 2
   Local_temp_single1 = Local_temp_single1 / Sht71_alpha

   Local_temp_single2 = Sht71_m * Sht71_t
   Local_temp_single3 = Sht71_tn + Sht71_t
   Local_temp_single2 = Local_temp_single2 / Local_temp_single3

   Local_temp_single3 = Local_temp_single1 + Local_temp_single2

   Local_temp_single1 = Sht71_tn * Local_temp_single3
   Local_temp_single2 = Sht71_m - Local_temp_single3

   Local_temp_single3 = Local_temp_single1 / Local_temp_single2

   ' Wenn Konstante gesetzt Trace Output schreiben
   #if Sht71_testmodus = 1                                  ' Trace
      Local_resultstring = Fusing(local_temp_single3 , "###.##")
      Print #2 , "Dewpoint " ; Local_resultstring ; "C"
   #endif                                                   ' Trace

   ' gerechneter Taupunkt an globale Variable übergeben
   Sht71_dewpoint = Local_temp_single3

End Sub
'-- End Sht71_calc_measurements -----------------------------------------------

' **********************
' * EE:  EEPROM extern *
' **********************

'------------------------------------------------------------------------------
' EE - Subroutine: Ee_write_eeprom_byte
' Subroutine um ein einzelnes Byte an eine bestimmte Speicheradresse in das
' EEPROM zu schreiben.
'
' Parameter:   Adress = Adresse (Word) an die geschrieben werden soll
'              Value  = Bytevariable die geschrieben werden soll
'------------------------------------------------------------------------------
Sub Ee_write_eeprom_byte(byval Adress As Word , Byval Value As Byte)

   ' ----- Lokale Variable definieren -----
   Local Ee_adrl As Byte
   Local Ee_adrh As Byte

   ' ----- Programmcode -----

   ' Adresse in High-Byte und Low-Byte zerlegen
   Ee_adrl = Low(adress)
   Ee_adrh = High(adress)

   ' Kommunikation über I2C-Bus
   I2cstart                                                 ' START-Sequenze senden
   I2cwbyte Address_write                                   ' Daten schreiben initiieren
   I2cwbyte Ee_adrh                                         ' High-Byte der Adresse übertragen
   I2cwbyte Ee_adrl                                         ' Low-Byte der Adresse übertragen
   I2cwbyte Value                                           ' Byte-Variable übertragen
   I2cstop                                                  ' STOP-Sequenz

End Sub
'-- End Ee_write_eeprom_byte --------------------------------------------------

'------------------------------------------------------------------------------
' EE - Subroutine: Ee_write_eeprom_word
' Subroutine um ein zwei Bytes (Word) an eine bestimmte Speicheradresse in das
' EEPROM zu schreiben.
'
' Parameter:   Adress = Adresse (Word) an die geschrieben werden soll
'              Value  = Wordvariable die geschrieben werden soll
'------------------------------------------------------------------------------
Sub Ee_write_eeprom_word(byval Adress As Word , Byval Value As Word)

   ' ----- Lokale Variable definieren -----
   Local Ee_adrl As Byte
   Local Ee_adrh As Byte

   Local Ee_datal As Byte
   Local Ee_datah As Byte

   ' ----- Programmcode -----

   ' Adresse in High-Byte und Low-Byte zerlegen
   Ee_adrl = Low(adress)
   Ee_adrh = High(adress)

   ' Word in einzelne Bytes zerlegen
   Ee_datal = Low(value)
   Ee_datah = High(value)

   ' Wenn Konstante gesetzt Trace Output schreiben
   #if Eeprom_testmodus                                     ' Trace
      Print #2 , "Data high: " ; Hex(ee_datah)
      Print #2 , "Data low:  " ; Hex(ee_datal)
   #endif                                                   ' Trace

   ' Kommunikation über I2C-Bus
   I2cstart                                                 ' START-Sequenze senden
   I2cwbyte Address_write                                   ' Daten schreiben initiieren
   I2cwbyte Ee_adrh                                         ' High-Byte der Adresse übertragen
   I2cwbyte Ee_adrl                                         ' Low-Byte der Adresse übertragen
   I2cwbyte Ee_datah                                        ' High-Byte aus Variable übertragen
   I2cwbyte Ee_datal                                        ' Low-byte aus Variable übertragen
   I2cstop                                                  ' STOP-Sequenz

End Sub
'-- End Ee_write_eeprom_word --------------------------------------------------

'------------------------------------------------------------------------------
' EE - Subroutine: Ee_write_eeprom_loggingstruct
' Subroutine schreibt die 8 Byte Loggingdaten an die übergebene Adresse
'
' Parameter: Adress        = Adresse (Word) ab der die Daten geschrieben werden
'------------------------------------------------------------------------------
Sub Ee_write_eeprom_struct(byval Adress As Word)

   ' ----- Lokale Variable definieren -----
   Local Ee_adrl As Byte
   Local Ee_adrh As Byte

   ' ----- Programmcode -----

   ' Wenn Konstante gesetzt Trace Output schreiben
   #if Eeprom_testmodus                                     ' Trace
      Print #2 , "EE-write Adresse " ; Hex(adress)
   #endif                                                   ' Trace

   ' Adresse in High-Byte und Low-Byte zerlegen
   Ee_adrl = Low(adress)
   Ee_adrh = High(adress)

   ' Wenn Konstante gesetzt Trace Output schreiben
   #if Eeprom_testmodus                                     ' Trace
      Print #2 , "EE-write low  Adresse " ; Hex(ee_adrl)
      Print #2 , "EE-write high Adresse " ; Hex(ee_adrh)
      Print #2 , "Daten-Struct : " ;
      Print #2 , Hex(ee_data_logging_struct(1)) ; " " ;
      Print #2 , Hex(ee_data_logging_struct(2)) ; " " ;
      Print #2 , Hex(ee_data_logging_struct(3)) ; " " ;
      Print #2 , Hex(ee_data_logging_struct(4)) ; " " ;
      Print #2 , Hex(ee_data_logging_struct(5)) ; " " ;
      Print #2 , Hex(ee_data_logging_struct(6)) ; " " ;
      Print #2 , Hex(ee_data_logging_struct(7)) ; " " ;
      Print #2 , Hex(ee_data_logging_struct(8))
   #endif                                                   ' Trace

   ' Kommunikation über I2C-Bus
   I2cstart                                                 ' START-Sequenze senden
   I2cwbyte Address_write                                   ' Daten schreiben initiieren
   I2cwbyte Ee_adrh                                         ' High-Byte der Adresse übertragen
   I2cwbyte Ee_adrl                                         ' Low-Byte der Adresse übertragen
   I2cwbyte Ee_data_logging_struct(1)                       ' Byte 1 übertragen
   I2cwbyte Ee_data_logging_struct(2)                       ' Byte 2 übertragen
   I2cwbyte Ee_data_logging_struct(3)                       ' Byte 3 übertragen
   I2cwbyte Ee_data_logging_struct(4)                       ' Byte 4 übertragen
   I2cwbyte Ee_data_logging_struct(5)                       ' Byte 5 übertragen
   I2cwbyte Ee_data_logging_struct(6)                       ' Byte 6 übertragen
   I2cwbyte Ee_data_logging_struct(7)                       ' Byte 7 übertragen
   I2cwbyte Ee_data_logging_struct(8)                       ' Byte 8 übertragen
   I2cstop                                                  ' STOP-Sequenz

End Sub
'-- End Ee_write_eeprom_loggingstruct -----------------------------------------

'------------------------------------------------------------------------------
' EE - Subroutine: Ee_read_eeprom_loggingstruct
' Subroutine liest die 8 Byte Loggingdaten von der übergebene Adresse
'
' Parameter: Adress        = Adresse (Word) von der die Daten gelesen werden
'------------------------------------------------------------------------------
Sub Ee_read_eeprom_struct(byval Adress As Word)

   ' ----- Lokale Variable definieren -----
   Local Ee_adrl As Byte
   Local Ee_adrh As Byte

   ' ----- Programmcode -----
   ' Adresse in High-Byte und Low-Byte zerlegen
   Ee_adrl = Low(adress)
   Ee_adrh = High(adress)

   ' Kommunikation über I2C-Bus
   I2cstart                                                 ' START-Sequenz senden
   I2cwbyte Address_write                                   ' Daten schreiben initiieren
   I2cwbyte Ee_adrh                                         ' High-Byte der Adresse übertragen
   I2cwbyte Ee_adrl                                         ' Low-Byte der Adresse übertragen

   I2cstart                                                 ' START-Sequenz erneut senden
   I2cwbyte Address_read                                    ' Daten lesen initiieren
   I2crbyte Ee_data_logging_struct(1) , Ack                 ' Byte 1 lesen
   I2crbyte Ee_data_logging_struct(2) , Ack                 ' Byte 2 lesen
   I2crbyte Ee_data_logging_struct(3) , Ack                 ' Byte 3 lesen
   I2crbyte Ee_data_logging_struct(4) , Ack                 ' Byte 4 lesen
   I2crbyte Ee_data_logging_struct(5) , Ack                 ' Byte 5 lesen
   I2crbyte Ee_data_logging_struct(6) , Ack                 ' Byte 6 lesen
   I2crbyte Ee_data_logging_struct(7) , Ack                 ' Byte 7 lesen
   I2crbyte Ee_data_logging_struct(8) , Nack                ' Byte 8 lesen
   I2cstop                                                  ' STOP-Sequenz

End Sub
'-- End Ee_write_eeprom_loggingstruct -----------------------------------------

'******************************************************************************
' Funktionen
'******************************************************************************

' ********************
' * KEY:  Tastatur   *
' ********************

'------------------------------------------------------------------------------
' KEY - Funktion: Key_query_matrix()
' Funktion zur Abfrage der einzelnen Tasten innerhalb der Matrix.
' Die Abfrage erfolgt über zwei Schleifenkonstrukte welche die einzelnen Spal-
' ten und darin die einzelnen Zeilen einer Spalte auf eine gedrückte Taste
' absucht.
'
' Parameter:    keine
' Rückgabewert: Bytewert = Summe aller erkannten Tastencodes
'                          Tastencode ist wie folgt aufgebaut (Ty.x):
'                          T1.1 = 11     T1.2 = 12      T1.3 = 14
'                          T2.1 = 21     T2.2 = 22      T2.3 = 24
'                          T3.1 = 41     T3.2 = 42      T3.3 = 44
'------------------------------------------------------------------------------
Function Key_query_matrix() As Byte

   ' Ggf. Trace Output schreiben
   #if Key_testmodus                                        ' Trace
      Print #2 , "Enter Key_query_matrix"
   #endif                                                   ' Trace

   ' Taste NIX vorbelegen
   Key_taste = 0

   ' Spaltenabfragen (Spalte für Spalte durchklappern)
   For Key_spalte = 0 To 2

      ' ----- Einzelnes "abklappern" der Spalten -----
      ' Spalte 1 auf LOW und Spaltenindex für Tastencoderechung setzen
      If Key_spalte = 0 Then
         Reset Key_spalte_1_port
         Set Key_spalte_2_port
         Set Key_spalte_3_port
         Key_spalten_index = 1
      End If                                                ' Spalte 0 geprüft

      ' Spalte 2 auf LOW und Spaltenindex für Tastencoderechung setzen
      If Key_spalte = 1 Then
         Set Key_spalte_1_port
         Reset Key_spalte_2_port
         Set Key_spalte_3_port
         Key_spalten_index = 2
      End If                                                ' Spalte 1 geprüft

      ' Spalte 3 auf LOW und Spaltenindex für Tastencoderechung setzen
      If Key_spalte = 2 Then
         Set Key_spalte_1_port
         Set Key_spalte_2_port
         Reset Key_spalte_3_port
         Key_spalten_index = 4
      End If                                                ' Spalte 2 geprüft

     ' Zeilenabfragen (Zeile für Zeile durchklappern)
     ' In der Ursprünglichen Version wurde die Abfrage der Zeilen über den
     ' BASCOM-Befehl debounce realisiert. Das Problem hier ist, das Debounce
     ' wartet bis eine "Taste=Zeile" wieder losgelassen wurde. Damit ist die
     ' Abfrage von mehreren Tasten einer gleichen Zeile nicht möglich!
     ' Die Entprellung der Tasten erfolgt durch die Zeitkonstante Key_waiting
     For Key_zeile = 1 To 3
       Select Case Key_zeile

         ' Prüfung für Zeile 1 vornehmen und ggf. Tastencodes rechen
         Case 1 :
            ' Debounce Key_zeile_1_pin , 0 , Key_calc_taste , Sub
            If Key_zeile_1_pin = 0 Then
               Temp_byte_1 = Key_spalten_index + 10
               Key_taste = Key_taste + Temp_byte_1
            End If                                          ' Zeile 1 geprüft

         ' Prüfung für Zeile 2 vornehmen und ggf. Tastencodes rechen
         Case 2 :
            ' Debounce Key_zeile_2_pin , 0 , Key_calc_taste , Sub
            If Key_zeile_2_pin = 0 Then
               Temp_byte_1 = Key_spalten_index + 20
               Key_taste = Key_taste + Temp_byte_1
            End If                                          ' Zeile 2 geprüft

         ' Prüfung für Zeile 3 vornehmen und ggf. Tastencodes rechen
         Case 3 :
            ' Debounce Key_zeile_3_pin , 0 , Key_calc_taste , Sub
            If Key_zeile_3_pin = 0 Then
               Temp_byte_1 = Key_spalten_index + 40
               Key_taste = Key_taste + Temp_byte_1
            End If                                          ' Zeile 3 geprüft

       End Select                                           ' Zeilenprüfung
     Next Key_zeile                                         ' Zeile
   Next Key_spalte                                          ' Spalte

   ' Urspungszustand wie bei Init wieder herstellen damit Interruptsteuerung
   ' wieder möglich wird.
   Reset Key_spalte_1_port
   Reset Key_spalte_2_port
   Reset Key_spalte_3_port

   ' Tastencode an Rückgabewert übergeben
   Key_query_matrix = Key_taste

End Function
'-- End Key_Query_matrix ------------------------------------------------------

' *********************
' * RAIN: Regensensor *
' *********************

'------------------------------------------------------------------------------
' RAIN - Function: Rain_measurement
' Funktion liest den Zustand des PINs zurück an dem der Regensensor ange-
' schlossen ist und liefert den Wert als Rückgabewert
'
' Parameter:    keiner
' Rückgabewert: Bytewert &H00 = kein Regen
'                        &H01 = Regen vom Sensor erkannt
'------------------------------------------------------------------------------
Function Rain_measurement() As Byte

   ' ----- lokale Variablen -----
   Local Temp_value As Byte

   ' ----- Programmcode -----

   ' Wenn Konstante gesetzt Trace Output schreiben
   #if Rain_testmodus                                       ' Trace
      Print #2 , "Enter Rain_measurement"
      ' Direkte Auswertung des PINs für Trace
      If Rain_sensor = 0 Then
         Print #2 , "PinG.3 - NO"
      Else
         Print #2 , "PinG.3 - YES"
      End If
   #endif                                                   ' Trace

   ' Status Regensensor von Pin einlesen
   Temp_value = Rain_sensor

   ' Wenn Konstante gesetzt Trace Output schreiben
   #if Rain_testmodus                                       ' Trace
      Print #2 , "Zustand PIN Regensensor = " ; Temp_value
   #endif                                                   ' Trace

   ' temporäre Variable in Rückgabewert übergeben
   Rain_measurement = Temp_value

End Function
'-- End Rain_measurement ------------------------------------------------------

' ********************
' * SHT71:  Sensor   *
' ********************

'------------------------------------------------------------------------------
' SHT71 - Function: Sht71_write_byte
' Funktion schreibt ein Byte auf den Sensibus und überpruft das Acknowledge
'
' Parameter:    Value = Byte welches zum SHT71 gesendet werden soll
' Rückgabewert: Rückgabewert error = 1 im Fall das kein Acknowledge gesendet
'------------------------------------------------------------------------------
Function Sht71_write_byte(byval Value As Byte) As Byte

   ' ----- locale Variable -----
   Local Error As Byte

   ' ----- Programmcode -----

   ' Sicherstellen das Pin DATA auf Output
   Config Sht71_datain = Output

   ' Datenbyte senden
   ' MSB shifted out first when clock goes high
   Shiftout Sht71_dataout , Sht71_sck , Value , 1

   ' Release DATA-line
   Set Sht71_dataout

   ' Data auf Eingabe umschalten
   Config Sht71_datain = Input

   ' clk #9 für ACK absenden und Datain PIN auswerten
   Set Sht71_sck
   Error = Sht71_datain
   Reset Sht71_sck

   ' Rückgabewerte error = 1 wenn kein Acknowledge empfangen
   Sht71_write_byte = Error                                 ' Rückgabewert zuweisen

End Function
'-- End Sht71_write_byte ------------------------------------------------------

'------------------------------------------------------------------------------
' SHT71 - Function: Sht71_read_byte
' Funktion liest ein Byte vom Sensibus und sende ein Acknowledge in Form von
' "ack=1"
'
' Parameter:    Acknowledge = Variable die als Acknowledge gesendet wird
' Rückgabewert: Bytewert des vom Sensibus gelesenen Bytes
'------------------------------------------------------------------------------
Function Sht71_read_byte(byval Acknowledge As Byte) As Byte

   ' ----- locale Variable -----
   Local Databyte As Byte

   ' ----- Programmcode -----

   ' release DATA-line
   Config Sht71_datain = Output
   Set Sht71_dataout
   Config Sht71_datain = Input

   ' Datenbyte einlesen
   ' MSB shifted in first when clock goes high
   Shiftin Sht71_datain , Sht71_sck , Databyte , 1

   ' Acknowledge senden
   Config Sht71_datain = Output

   If Acknowledge = Sht71_acknowledge Then
      ' Botschaft mit ACK quittieren (Pegel = low)
      Reset Sht71_dataout
   Else                                                     ' I2C-Acknowledge?
      ' Botschaft mit noACK quittieren (Pegel = high)
      Set Sht71_dataout
   End If                                                   ' I2C-Acknowledge?

   ' clk #9 für ACK absenden
   Set Sht71_sck
   $asm : Nop : Nop : Nop : $end Asm
   Reset Sht71_sck

   ' Release DATA-line
   Set Sht71_dataout

   ' Rückgabewert Databyte zuweisen
   Sht71_read_byte = Databyte

End Function
'-- End Sht71_read_byte -------------------------------------------------------

'------------------------------------------------------------------------------
' SHT71 - Function: Sht71_softreset
' Funktion resetet den sensor durch einen softreset
'
' Parameter:    keiner
' Rückgabewert: Rückgabewert error = 1 falls Sensor nicht antwortet
'------------------------------------------------------------------------------
Function Sht71_softreset() As Byte

   ' ----- locale Variable -----
   Local Error As Byte

   ' ----- Programmcode -----

   ' Reset Communication
   Gosub Sht71_connection_reset_sequence

   ' Send RESET-Command an den Sensor
   Error = Sht71_write_byte(sht71_reset)

   ' Rückgabewerte zuweisen
   Sht71_softreset = Error

End Function
'-- End Sht71_softreset -------------------------------------------------------

'------------------------------------------------------------------------------
' SHT71 - Function: Sht71_read_statusregister
' Funktion liest das Statusregister des Sht71 aus (inkl. 8 Bit Checksumme)
'
' Parameter:    P_Value    = Inhalt des Statusregister wird über
'                            "call by reference" zurückgegeben
'               P_Checksum = Cheksummenbyte wird über "call by reference"
'                            zurückgegeben
' Rückgabewert: Rückgabewert error = 1 falls Sensor nicht antwortet
'------------------------------------------------------------------------------
Function Sht71_read_statusregister(byref P_value As Byte , Byref P_checksum As Byte) As Byte

   ' ----- locale Variable -----
   Local Error As Byte

   ' ----- Programmcode -----

   ' Transmission start
   Gosub Sht71_transmission_start

   ' Kommando für Statusregister auslesen senden
   Error = Sht71_write_byte(sht71_status_reg_read)
   P_value = Sht71_read_byte(sht71_acknowledge)             ' Read Statusregister (8-bit)
   P_checksum = Sht71_read_byte(sht71_noacknowledge)        ' Read Checksum (8-bit)

   ' Rückgabewert zuweisen
   Sht71_read_statusregister = Error

End Function
'-- End Sht71_read_statusregister ---------------------------------------------

'------------------------------------------------------------------------------
' SHT71 - Function: Sht71_write_statusregister
' Funktion schreibt in das Statusregister des Sht71 den übergebenen Bytewert
'
' Parameter:    P_Value    = Bytewert der in das Statusregister geschrieben
'                            werden soll. Achtung: "call by reference"
' Rückgabewert: Rückgabewert error = 1 falls Sensor nicht antwortet
'------------------------------------------------------------------------------
Function Sht71_write_statusregister(byref P_value As Byte) As Byte

   ' ----- locale Variable -----
   Local Error As Byte

   ' ----- Programmcode -----

   ' Transmission start
   Gosub Sht71_transmission_start

   ' Kommando für Statusregister auslesen senden
    Error = Sht71_write_byte(sht71_status_reg_write)

   ' Datenbyte senden
   Sht71_temp_byte1 = Sht71_write_byte(p_value)
   Error = Error + Sht71_temp_byte1

   ' Rückgabewert zuweisen
   Sht71_write_statusregister = Error

End Function
'-- End Sht71_write_statusregister --------------------------------------------

'------------------------------------------------------------------------------
' SHT71 - Function: Sht71_measure
' Funktion liest je nach Modus Temperature- oder Feuchtigkeitsdaten aus dem
' Sensor aus und übergibt die Messwerte an die jeweiligen Funktionen
'
' Parameter:    P_Value    = Word für 14 Bit Temperatur oder 12 Bit Feuchtigkeit
'                            Achtung: "call by reference"
'               P_checksum = Cheksummenbyte wird über "call by reference"
'                            zurück
'               Modus      = Parameter ob Temperatur oder Feuchtigkeit
' Rückgabewert: Rückgabewert error = 1 falls Sensor nicht antwortet
'------------------------------------------------------------------------------
Function Sht71_measure(byref P_value As Word , Byref P_checksum As Byte , Byval Modus As Byte) As Byte

   ' ----- locale Variable -----
   Local Error As Byte
   Local Local_temp_byte1 As Byte
   Local Local_temp_byte2 As Byte
   Local Local_temp_word As Word
   Local Local_temp_long1 As Long

   ' ----- Programmcode -----

   ' Transmission start
   Gosub Sht71_transmission_start

   Select Case Modus
      Case Sht71_modus_humi : Error = Sht71_write_byte(sht71_measure_humi)
      Case Sht71_modus_temp : Error = Sht71_write_byte(sht71_measure_temp)
   End Select

   ' Wenn Konstante gesetzt Trace Output schreiben
   #if Sht71_testmodus = 1                                  ' Trace
      Print #2 , "Fehler write command : " ; Error
   #endif                                                   ' Trace

   ' Umschalten auf Eingabe
   Config Sht71_datain = Input

   ' So und nun warten bis PIN zappelt
   'Bitwait Sht71_datain , Reset                             ' Problem, Routine wartet ggf. unendlich!

   ' Umsetzung hier über FOR-Schleife mit Timeout
   Local_temp_byte1 = False
   For Local_temp_long1 = 0 To Sht71_response_wait
      If Sht71_datain = 0 Then
         ' Reaktion des SHT71 erkannt, FOR abbrechen und weiter
         Local_temp_byte1 = True
         Exit For
      End If                                                ' Noch Warten
   Next Local_temp_long1                                    ' Warteschleife

   ' Wenn Konstante gesetzt Trace Output schreiben
   #if Sht71_testmodus = 1                                  ' Trace
      Print #2 , "Biterkennung = " ; Local_temp_byte1
   #endif                                                   ' Trace

   ' Wenn PIN zappelt weiter mit Einlesen ansonsten Fehler setzen und fertig
   If Local_temp_byte1 = True Then

      Local_temp_byte1 = Sht71_read_byte(sht71_acknowledge) ' read the first byte (MSB)
      Local_temp_byte2 = Sht71_read_byte(sht71_acknowledge) ' read the second byte (LBS)
      P_checksum = Sht71_read_byte(sht71_noacknowledge)     ' read checksum
      Local_temp_word = Local_temp_byte1
      Shift Local_temp_word , Left , 8
      Local_temp_word = Local_temp_word And &HFF00
      Local_temp_word = Local_temp_word + Local_temp_byte2
      P_value = Local_temp_word

   Else                                                     ' Einlesen
      Incr Error
   End If                                                   ' Einlesen

   ' Rückgabewert zuweisen
   Sht71_measure = Error

   ' Wenn Konstante gesetzt Trace Output schreiben
   #if Sht71_testmodus = 1                                  ' Trace
      Print #2 , "Endergebnis : " ; Error
   #endif                                                   ' Trace

End Function
'-- End Sht71_measure ---------------------------------------------------------

'------------------------------------------------------------------------------
' SHT71 - Function: Sht71_crc_check
' Funktion prüft mit dem Übergebenen Daten-Word und der Checksumme ob CRC für
' Datenübertragung korrekt oder fehlerbehaftet.
' Im Fehlerfall wird empfohlen einen Reset auf den Sensor durchzuführen.
'
' Parameter:    Value    = Word für 14 Bit Temperatur oder 12 Bit Feuchtigkeit
'               Crc      = Cheksummenbyte
' Rückgabewert: Bytewert Crc_ok oder Crc_nok
'------------------------------------------------------------------------------
Function Sht71_crc_check(byval Value As Word , Byval Crc As Byte , Byval Modus As Byte) As Byte

   ' ----- Locale Variablen -----
   Local Crc_reversed As Byte
   Local Local_temp_byte1 As Byte
   Local Local_temp_byte2 As Byte
   Local Local_temp_byte3 As Byte
   Local Crc_register As Byte
   Local Table_index As Byte

   ' ----- Programmcode -----
   ' Vorgaben zur CRC-Rechung aus Application Note CRC Sensirion
   '
   ' Perform the following operations:
   ' 1. Initialize the CRC register with the value of the lower nibble of the
   '    value of the status register (reversed (s0s1s2s3‘0000)).
   '    (default ‘00000000’ = 0)
   ' 2. XOR each (transmitted and received) byte with the previous CRC value.
   '    The result is the new byte that you need to calculate the CRC value from.
   ' 3. Use this value as the index to the table to obtain the new CRC value.
   ' 4. Repeat from 2.) until you have passed all bytes through the process.
   ' 5. The last byte retrieved from the table is the final CRC value.
   ' 6. The CRC value retrieved from the SHTxx must be reversed
   '    (bit 0 = bit 7, bit 1=bit 6..bit 7 = bit 0) and can then be compared to
   '    the final CRC value.(2)

   ' Wenn Konstante gesetzt Trace Output schreiben
   #if Sht71_testmodus = 1                                  ' Trace
      Print #2 , "Enter CRC-Pruefung"
   #endif                                                   ' Trace

   ' Zur CRC-Prüfung muss das vom SHT71 empfangene CRC-Byte "gedreht" werden.
   ' bit 0 = bit 7, bit 1 = bit 6 ... bit 7 = bit 0
   Local_temp_byte1 = 0
   Local_temp_byte2 = 7
   Do
      Crc_reversed.local_temp_byte1 = Crc.local_temp_byte2
      Incr Local_temp_byte1
      Decr Local_temp_byte2
   Loop Until Local_temp_byte1 = 8                          ' Byte spiegeln

   ' Ab jetzt gilt zur Berechung das "gedrehte CRC-Byte Crc_reversed

   ' Initialisierung des Crc_registers mit dem lower nibble des Status-Registers
   ' hier werden Konstanten angenommen da Default = &B00000000 = 0 ist.
   ' (reversed(s0 s1 s2 s3 0 0 0))
   Crc_register = 0

   ' Jedes gesendete und empfangene Byte muss nun verarbeitet werden.
   ' Hierzu wird Datenstruktur aufgebaut

   Select Case Modus
      Case Sht71_modus_humi : Sht71_transceive_struct(1) = 5
      Case Sht71_modus_temp : Sht71_transceive_struct(1) = 3
   End Select                                               ' Modusauswahl

   Sht71_transceive_struct(2) = High(value)
   Sht71_transceive_struct(3) = Low(value)

   ' Nun kann CRC gerechnet werden
   For Local_temp_byte1 = 1 To 3

      ' Lese Byte aus Datenstruktur für Tabellenzugriff aus
      Local_temp_byte2 = Sht71_transceive_struct(local_temp_byte1)

      ' Setzte den Zeiger auf den Anfang des DATA-Statement Sht71_Crc_table
      Restore Sht71_crc_table

      ' Zugriff und Berechnung
      Table_index = Crc_register Xor Local_temp_byte2
      If Local_temp_byte2 = 0 Then
         Table_index = 3
      End If                                                ' Auswahl Tabellenindex

      For Local_temp_byte3 = 0 To Table_index
         Read Crc_register
      Next Local_temp_byte3                                 ' Datenwerte lesen

   Next Local_temp_byte1                                    ' CRC-Wert rechnen

   ' Wenn Konstante gesetzt Trace Output schreiben
   #if Sht71_testmodus = 1                                  ' Trace
      Print #2 , "Befehl :    " ; Hex(sht71_transceive_struct(1))
      Print #2 , "Datenwort : " ; Hex(value)
      Print #2 , "CRC :       " ; Hex(crc_reversed)
   #endif                                                   ' Trace

   If Crc_register = Crc_reversed Then
      Local_temp_byte1 = Crc_ok

      ' Wenn Konstante gesetzt Trace Output schreiben
      #if Sht71_testmodus = 1                               ' Trace
         Print #2 , "CRC - OK"
         Print #2 , ""
      #endif                                                ' Trace
   Else                                                     ' CRC-Prüfung
      Local_temp_byte1 = Crc_nok

      ' Wenn Konstante gesetzt Trace Output schreiben
      #if Sht71_testmodus = 1                               ' Trace
         Print #2 , "CRC - NOK"
         Print #2 , ""
      #endif                                                ' Trace
   End If                                                   ' CRC-Prüfung

   ' Rückgabeparameter an Funktionswert übergeben
   Sht71_crc_check = Local_temp_byte1

End Function
'-- End Sht71_crc_check -------------------------------------------------------

' **********************
' * LIGHT: Lichtsensor *
' **********************

'------------------------------------------------------------------------------
' LIGHT - Function: Light_measurement
' Funktion liefert einen normierten Lichtwert im Wertebereich zwischen 0-15
' zurück welcher proportional der aktuell vom TAOS gelieferten Lichtintensität
' entspricht.
'
' Parameter:    Value    = Byte für Anzahl der durchzuführenden Messungen
' Rückgabewert: Bytewert 0 - 16 für Helligkeit
'------------------------------------------------------------------------------
Function Light_measurement(byval Value As Byte) As Byte

   ' ----- lokale Variablen -----
   Local Result_word As Word                                ' Arbeitsvariable für Akkumulierte Messwerte
   Local Temp_word As Word                                  ' Arbeitsvariable für ADC-Messwert
   Local Temp_byte As Byte                                  ' Teporäre Byte-Arbeitsvariable

   ' ----- Programmcode -----

   ' 5.11.2008: Modifikation
   ' Es zeigt sich, dass der Messwert Aufgrund des Quantisierungsrauschens
   ' sehr schnell / stark schwanken kann. Aus diesem Grund wird die Funktion
   ' um einen Parameter ergänzt der angiebt, wie oft die Messung durchgeführt
   ' und gemittelt werden soll.

   ' Wenn Konstante gesetzt Trace Output schreiben
   #if Light_testmodus                                      ' Trace
      Print #2 , "Enter Light_measurement"
      Print #2 , "Anzahl der Messungen : " ; Value
   #endif                                                   ' Trace

   ' akkumulierte Arbeitsvariable auf NULL setzen
   Result_word = 0

   ' Die Spannungsversorgung für den ADC einschalten und den ADC starten
   Start Adc

   ' Schleife über Anzahl an Messwerten fahren
   For Temp_byte = 1 To Value

      ' Single-Shot für ADC-Wert (Licht sampeln)
      Temp_word = Getadc(light_channel)

      ' Wenn Konstante gesetzt Trace Output schreiben
      #if Light_testmodus                                   ' Trace
         Print #2 , "ADC-Wert " ; Temp_byte ; " : " ; Temp_word
      #endif                                                ' Trace

      ' ----- Normierung durchfühen auf Wertebereich 0-15 -----

      ' ADC0 im ATmega128 arbeitet mit 10-Bit Auflösung = 0..1023
      ' Normierung auf 0-15 (4-Bit) = ADC / 64 bedeutet ShiftRight um 6 Bit
      Shift Temp_word , Right , 6

      ' Messwerte akumulieren
      Result_word = Result_word + Temp_word

      ' Wenn Konstante gesetzt Trace Output schreiben
      #if Light_testmodus                                   ' Trace
         Print #2 , "Normiert : " ; Temp_word
      #endif                                                ' Trace

   Next Temp_byte                                           ' Messwertsummation

   ' Wenn Konstante gesetzt Trace Output schreiben
   #if Light_testmodus                                      ' Trace
      Print #2 , "Gesamt   : " ; Result_word
   #endif                                                   ' Trace

   ' Mit STOP ADC kann die Spannung abgeschaltet und der ADC gestopped werden
   Stop Adc

   ' Messwerte mitteln
   Temp_word = Result_word / Value
   Temp_byte = Temp_word And &H000F

   ' Trace output
   #if Light_testmodus                                      ' Trace
      Print #2 , "Ergebnis " ; Temp_byte
   #endif                                                   ' Trace

   ' Updateflag setzen
   Light_update_flag = True

   ' Messwert in Rückgabewert übergeben
   Light_measurement = Temp_byte

End Function
'-- End Light_measurement -----------------------------------------------------

' **********************
' * EE:  EEPROM extern *
' **********************

'------------------------------------------------------------------------------
' EE - Funktion: Ee_read_eeprom_byte
' Funktion um ein einzelnes Byte von einer bestimmten Speicheradresse aus dem
' EEPROM zu lesen.
'
' Parameter:     Adress = Adresse (Word) von der das Byte gelesen werden soll
'
' Rückgabewert:  Bytevariable die von der Adresse ausgelesen wurde.
'------------------------------------------------------------------------------
Function Ee_read_eeprom_byte(byval Adress As Word) As Byte

   ' ----- Lokale Variable definieren -----
   Local Ee_adrl As Byte
   Local Ee_adrh As Byte
   Local Temp_byte As Byte

   ' ----- Programmcode -----

   ' Adresse in High-Byte und Low-Byte zerlegen
   Ee_adrl = Low(adress)
   Ee_adrh = High(adress)

   ' Kommunikation über I2C-Bus
   I2cstart                                                 ' START-Sequenz senden
   I2cwbyte Address_write                                   ' Daten schreiben initiieren
   I2cwbyte Ee_adrh                                         ' High-Byte der Adresse übertragen
   I2cwbyte Ee_adrl                                         ' Low-Byte der Adresse übertragen

   I2cstart                                                 ' START-Sequenz erneut senden
   I2cwbyte Address_read                                    ' Daten lesen initiieren
   I2crbyte Temp_byte , Nack                                ' Byte auslesen und quittieren
   I2cstop                                                  ' STOP-Sequenz

   ' Temporäre Variable als Rückgabewert übergeben
   Ee_read_eeprom_byte = Temp_byte

End Function
'-- End Ee_read_eeprom_byte ---------------------------------------------------

'------------------------------------------------------------------------------
' EE - Funktion: Ee_read_eeprom_word
' Funktion um ein zwei Bytes (Word) von einer bestimmten Speicheradresse aus
' dem EEPROM zu lesen.
'
' Parameter:     Adress = Adresse (Word) von der das Word gelesen werden soll
'
' Rückgabewert:  Wordvariable die von der Adresse ausgelesen wurde.
'------------------------------------------------------------------------------
Function Ee_read_eeprom_word(byval Adress As Word) As Word

   ' ----- Lokale Variable definieren -----
   Local Ee_adrl As Byte
   Local Ee_adrh As Byte

   Local Ee_datal As Byte
   Local Ee_datah As Byte

   Local Temp_word As Word

   ' ----- Programmcode -----

   ' Adresse in High-Byte und Low-Byte zerlegen
   Ee_adrl = Low(adress)
   Ee_adrh = High(adress)

   ' Kommunikation über I2C-Bus
   I2cstart                                                 ' START-Sequenz senden
   I2cwbyte Address_write                                   ' Daten schreiben initiieren
   I2cwbyte Ee_adrh                                         ' High-Byte der Adresse übertragen
   I2cwbyte Ee_adrl                                         ' Low-Byte der Adresse übertragen

   I2cstart                                                 ' START-Sequenz erneut senden
   I2cwbyte Address_read                                    ' Daten lesen initiieren
   I2crbyte Ee_datah , Ack                                  ' High-Byte auslesen und weiter
   I2crbyte Ee_datal , Nack                                 ' Low-Byte auslesen und Ende
   I2cstop                                                  ' STOP-Sequenz

   ' Wenn Konstante gesetzt Trace Output schreiben
   #if Eeprom_testmodus                                     ' Trace
      Print #2 , "Data high: " ; Hex(ee_datah)
      Print #2 , "Data low:  " ; Hex(ee_datal)
   #endif                                                   ' Trace

   ' Temporäre Variable als Rückgabewert übergeben
   Temp_word = Ee_datah
   Shift Temp_word , Left , 8
   Temp_word = Temp_word And &HFF00
   Temp_word = Temp_word + Ee_datal

   ' Rückgabeparameter an Funktionswert übergeben
   Ee_read_eeprom_word = Temp_word

End Function
'-- End Ee_read_eeprom_byte ---------------------------------------------------

' *************************
' * Allgemeine Funktionen *
' *************************

'------------------------------------------------------------------------------
' Function: Byte2string
' Funktion liefert als Ergebnis eine "rechtsbündig" formatierten String einer
' übergebenen Byte-Variablen. Der String ist max. 3 Zeichen groß und beinhaltet
' ggf. bei kleineren Zahlen das übergebene Character als Füllzeichen von links
' führend aufgefüllt.
'
' Parameter:    Value     = Byte das als SString formatiert werden soll
'               Character = ASCII-Wert des Zeichens mit dem ggf. aufgefüllt
'               werden soll.
' Rückgabewert: String der Byte-Variablen inkl. Füllzeichen
'------------------------------------------------------------------------------
Function Byte2string(byval Value As Byte , Byval Character As Byte) As String

   ' ----- lokale Variablen -----
   Local String_length As Byte
   Local Process_string As String * 4

   ' ----- Programmcode -----

   ' Basis-String anlegen
   Process_string = Str(value)
   ' Länge ermitteln
   String_length = Len(process_string)

   ' Abhängig von Länge Füllzeichen ergänzen
   Select Case String_length
      Case 1:
         ' Wenn Länge 1 müssen zwei Füllzeichen links ergänzt werden
         Process_string = Chr(character) + Process_string
         Process_string = Chr(character) + Process_string
      Case 2:
         ' Wenn Länge 2 muss ein Füllzeichen links ergänzt werden
         Process_string = Chr(character) + Process_string
   End Select                                               ' Stringlänge

   ' Bearbeiteter String an Übergabeparameter übergeben
   Byte2string = Process_string

End Function
'-- End Byte2string -----------------------------------------------------------

'------------------------------------------------------------------------------
' Function: Time2string
' Funktion liefert als Ergebnis einen formatierten String welcher die drei
' übergebenen Zeitinformationen durch den übergebenen Character getrennt
' beinhaltet.
'
' Parameter:    Value1    = Zeitparameter 1 (Byte-Wert)
'               Value2    = Zeitparameter 2 (Byte-Wert)
'               Value3    = Zeitparameter 3 (Byte-Wert)
'               Character = ASCII-Wert des Zeichens mit dem getrennt werden soll
' Rückgabewert: String der Zeitinformation
'------------------------------------------------------------------------------

Function Time2string(byval Value1 As Byte , Byval Value2 As Byte , Byval Value3 As Byte , Byval Character As Byte) As String

   ' ----- lokale Variablen -----
   Local Process_string As String * 20
   Local Byte_temp_1 As Byte
   Local Byte_temp_2 As Byte
   Local Byte_temp_3 As Byte

   ' ----- Programmcode -----

   ' Zunächste alles in schönes BCD-Format wandeln
   Byte_temp_1 = Makebcd(value1)
   Byte_temp_2 = Makebcd(value2)
   Byte_temp_3 = Makebcd(value3)

   ' Dann String nach Muster xx?yy?zz zusammebauen. z.B. 12.34.56 oder 12:34:56
   Process_string = Bcd(byte_temp_1) + Chr(character) + Bcd(byte_temp_2) + Chr(character) + Bcd(byte_temp_3)

   ' Process_string = Bcd(byte_temp_1) + Chr(character)
   ' Process_string = Process_string + Bcd(byte_temp_2)
   ' Process_string = Process_string + Chr(character)
   ' Process_string = Process_string + Bcd(byte_temp_3)

   ' Bearbeiteter String an Übergabeparameter übergeben
   Time2string = Process_string

End Function
'-- End Time2string -----------------------------------------------------------

'------------------------------------------------------------------------------
' Function: Schaltjahr
' Funktion überprüft ob übergebenes Jahr ein Schaltjahr ist.
' Das Jahr muss als vollständiges Jahr z.B. 2008 übergeben werden.
'
' Parameter:    Value    = Jahr welches überprüft werden soll (Word-Wert)
' Rückgabewert: Bytevariable mit True (&H01) oder False (&H00)
'------------------------------------------------------------------------------
Function Schaltjahr(byval Value As Word) As Byte

   ' ----- lokale Variablen -----
   Local Word_temp_1 As Word
   Local Result_value As Byte

   ' ----- Programmcode -----

   ' Regel für Schaltjahre:
   ' Das Jahr ist durch vier teilbar.
   ' Das Jahr darf nicht durch 100 teilbar sein,
   ' ausser es ist durch 400 teilbar.

   ' Prüfung ob Jahr durch vier teilbar
   Word_temp_1 = Value Mod 4

   If Word_temp_1 = 0 Then
      ' Ja, Jahr könnte Schaltjahr sein
      ' Prüfung ob Jahr durch 100 teilbar
      Word_temp_1 = Value Mod 100
      If Word_temp_1 = 0 Then
         ' Jahr ist durch 100 teilbar
         ' Prüfung ob Jahr durch 400 teilbar
         Word_temp_1 = Value Mod 400
         If Word_temp_1 = 0 Then
            Result_value = True
         Else                                               ' Jahr durch 400 teilbar?
            Result_value = False
         End If                                             ' Jahr durch 400 teilbar?
      Else                                                  ' Jahr durch 100 teilbar?
         ' Jahr ist nicht durch 100 teilbar
         Result_value = True
      End If                                                ' Jahr durch 100 teilbar?
   Else                                                     ' Jahr durch 4 teilbar?
      ' Jahr ist definitiv kein Schaltjahr
      Result_value = False
   End If                                                   ' Jahr durch 4 teilbar?

   ' Rückgabeparameter an Funktionswert übergeben
   Schaltjahr = Result_value

End Function
'-- End Schaltjahr ------------------------------------------------------------

'******************************************************************************
' GOSubroutinen
'******************************************************************************

' ********************
' * LCD:  Display    *
' ********************

'------------------------------------------------------------------------------
' LCD - Gosub-Routine: Lcd_konfig
' Subroutine zur Konfiguration des LCD-Display inkl. der dafür
' notwendigen Timer.
'------------------------------------------------------------------------------
Lcd_konfig:

   ' Wenn Konstante gesetzt Trace Output schreiben
   #if Lcd_testmodus                                        ' Trace
      Print #2 , "Enter Lcd_konfig"
   #endif                                                   ' Trace

   '----- Konfiguration LCD-Helligkeit (PWM) -----
   'Variable für Helligkeit in Timerregister laden
   Pwm3a = Lcd_pwmwert

   'Port E.3 ist Timer-Ausgang OC3A
   Config Pine.3 = Output

Return
'-- End Lcd_konfig ------------------------------------------------------------

'------------------------------------------------------------------------------
' LCD - Gosub-Routine: Lcd_display_an
' Routine schaltet die Spannungsversorgung für das Display an
'------------------------------------------------------------------------------
Lcd_display_an:

   ' Wenn Konstante gesetzt Trace Output schreiben
   #if Lcd_testmodus                                        ' Trace
      Print #2 , "Enter Lcd_display_an"
   #endif                                                   ' Trace

   Lcd_on_dataout = 1

Return
'-- End Lcd_display_an --------------------------------------------------------

'------------------------------------------------------------------------------
' LCD - Gosub-Routine: Lcd_display_aus
' Routine schaltet die Spannungsversorgung für das Display aus
'------------------------------------------------------------------------------
Lcd_display_aus:

   ' Wenn Konstante gesetzt Trace Output schreiben
   #if Lcd_testmodus                                        ' Trace
      Print #2 , "Enter Lcd_display_aus"
   #endif                                                   ' Trace

   Lcd_on_dataout = 0

Return
'-- End Lcd_display_aus -------------------------------------------------------

'------------------------------------------------------------------------------
' LCD - Gosub-Routine: Lcd_beleuchtung_an
' Routine schaltet die Beleuchtung ein
'------------------------------------------------------------------------------
Lcd_beleuchtung_an:

   ' Wenn Konstante gesetzt Trace Output schreiben
   #if Lcd_testmodus                                        ' Trace
      Print #2 , "Enter Lcd_beleuchtung_an"
   #endif                                                   ' Trace

   ' PWM-Wert in Timerregister laden
   Pwm3a = Lcd_pwmwert

Return
'-- End Lcd_beleuchtung_an ----------------------------------------------------

'------------------------------------------------------------------------------
' LCD - Gosub-Routine: Lcd_beleuchtung_aus
' Routine schaltet die Beleuchtung aus
'------------------------------------------------------------------------------
Lcd_beleuchtung_aus:

   ' Wenn Konstante gesetzt Trace Output schreiben
   #if Lcd_testmodus                                        ' Trace
      Print #2 , "Enter Lcd_beleuchtung_aus"
   #endif                                                   ' Trace

   ' PWM-Wert in Timerregister laden
   Pwm3a = Lcd_helligkeit_aus

Return
'-- End Lcd_beleuchtung_aus ---------------------------------------------------

'------------------------------------------------------------------------------
' LCD - Gosub-Routine: Lcd_display_ein
' Routine schaltet das gesamte Display ein
'------------------------------------------------------------------------------
Lcd_display_on:

   ' Wenn Konstante gesetzt Trace Output schreiben
   #if Lcd_testmodus                                        ' Trace
      Print #2 , "Enter Lcd_display_ein"
   #endif                                                   ' Trace

   ' Instruction Display ON/OFF gemäß LCD Befehlskatalog
   _temp1 = &B00001100
   !Call _Lcd_control

Return
'-- End Lcd_display_ein -------------------------------------------------------

'------------------------------------------------------------------------------
' LCD - Gosub-Routine: Lcd_display_aus
' Routine schaltet das gesamte Display aus
'------------------------------------------------------------------------------
Lcd_display_off:

   ' Wenn Konstante gesetzt Trace Output schreiben
   #if Lcd_testmodus                                        ' Trace
      Print #2 , "Enter Lcd_display_aus"
   #endif                                                   ' Trace

   ' Instruction Display ON/OFF gemäß LCD Befehlskatalog
   _temp1 = &B00001000
   !Call _Lcd_control

Return
'-- End Lcd_display_ein -------------------------------------------------------

'------------------------------------------------------------------------------
' LCD - Gosub-Routine: Lcd_contrastset
' Routine berechnen neue Kontrastwerte und steuert direkt den
' Kontroller des Display an.
'------------------------------------------------------------------------------
Lcd_kontrastset:                                            ' Kontrasteinstellung Display

   ' Wenn Konstante gesetzt Trace Output schreiben
   #if Lcd_testmodus                                        ' Trace
      Print #2 , "Enter Lcd_kontrastset" ; Lcd_kontrastwert
   #endif                                                   ' Trace

   ' Verarbeitung des Kontrastwertes für High-Byte und Low-Byte
   Temp_byte_1 = Lcd_kontrastwert And &B00001111
   Temp_byte_1 = Temp_byte_1 + &B01110000

   Temp_byte_2 = Lcd_kontrastwert
   Shift Temp_byte_2 , Right , 4
   Temp_byte_2 = Temp_byte_2 And &B00000011
   Temp_byte_2 = Temp_byte_2 + &B01010100

   ' Achtung: rCall muss durch Call ersetzen werden. rCall ist ein relavtiver
   ' Sprung welcher nur über 2kByte Zeilen geht. Die LCD-Lib liegt aber Auf-
   ' grund der Code-Größe außerhalb des Bereichs und kann deshalb nicht mehr
   ' angesprungen werden.
   ' Error 220: Forward jump out of range

   ' Instruction Table 1 einstellen [0,1]
   _temp1 = &B00101001
   '!rCall _Lcd_control
   !Call _Lcd_control

   ' Tempvar_1 = &B0111xxxx für Kontrast Set Instruction Table 1 - Low Byte
   _temp1 = Temp_byte_1
   '!rCall _Lcd_control
   !Call _Lcd_control

   ' Temovar_2 = &B010101xx für Kontrast Set Instruction Table 1 - High Byte
   _temp1 = Temp_byte_2
   '!rCall _Lcd_control
   !Call _Lcd_control

   ' Zurückschalten auf Instruction Table 0 [0,0]
   _temp1 = &B00101000
   '!rCall _Lcd_control
   !Call _Lcd_control

Return
'-- End Lcd_kontrastset -------------------------------------------------------

'------------------------------------------------------------------------------
' LCD - Gosub-Routine: Lcd_print
' Die Routine gibt den Lcd_textbuffer für das Menü auf dem LCD-Display aus
'Result:     LCD
'------------------------------------------------------------------------------
Lcd_print:

   ' Wenn Konstante gesetzt Trace Output schreiben
   #if Lcd_testmodus                                        ' Trace
      Print #2 , "Enter Lcd_print"
   #endif                                                   ' Trace

   Cls                                                      ' Clear Screen

   Select Case Menue_ausgabeflags
      Case 1:
         ' Nur 1. Zeile ausgaben
         ' Locate 1 , 1 : Lcd Menue_lcd_textbuffer(1)
         Call Lcd_writesingleline(1 , Menue_lcd_textbuffer(1))
      Case 2:
         ' Nur 2. Zeile ausgaben
         ' Locate 2 , 1 : Lcd Menue_lcd_textbuffer(2)
         Call Lcd_writesingleline(2 , Menue_lcd_textbuffer(2))
      Case 4:
         ' Nur 3. Zeile ausgaben
         ' Locate 3 , 1 : Lcd Menue_lcd_textbuffer(3)
         Call Lcd_writesingleline(3 , Menue_lcd_textbuffer(3))
      Case 3:
         ' 1. und 2. Zeile ausgeben
         ' Locate 1 , 1 : Lcd Menue_Lcd_textbuffer(1)
         ' Locate 2 , 1 : Lcd Menue_Lcd_textbuffer(2)
         Call Lcd_writedoubleline(1 , 2 , Menue_lcd_textbuffer(1) , Menue_lcd_textbuffer(2) )
      Case 5:
         ' 1. und 3. Zeile ausgeben
         ' Locate 1 , 1 : Lcd Menue_Lcd_textbuffer(1)
         ' Locate 3 , 1 : Lcd Menue_Lcd_textbuffer(3)
         Call Lcd_writedoubleline(1 , 3 , Menue_lcd_textbuffer(1) , Menue_lcd_textbuffer(3) )
      Case 6:
         ' 2. und 3. Zeile ausgeben
         ' Locate 2 , 1 : Lcd Menue_Lcd_textbuffer(2)
         ' Locate 3 , 1 : Lcd Menue_Lcd_textbuffer(3)
         Call Lcd_writedoubleline(2 , 3 , Menue_lcd_textbuffer(2) , Menue_lcd_textbuffer(3) )
      Case 7:
         ' Alle Zeilen ausgeben
         ' Locate 1 , 1 : Lcd Menue_Lcd_textbuffer(1)
         ' Locate 2 , 1 : Lcd Menue_Lcd_textbuffer(2)
         ' Locate 3 , 1 : Lcd Menue_Lcd_textbuffer(3)
         Call Lcd_writetrippleline(menue_lcd_textbuffer(1) , Menue_lcd_textbuffer(2) , Menue_lcd_textbuffer(3) )
   End Select                                               ' Menüausgabeflag

   Menue_state_renew = 0

Return
'-- End Lcd_print -------------------------------------------------------------

' ********************
' * FAN:  Lüfter     *
' ********************

'------------------------------------------------------------------------------
' FAN - Gosub-Routine: Fan_konfig
' Subroutine zur Konfiguration der PWM für die Lüftersteuerung
'------------------------------------------------------------------------------
Fan_konfig:

   ' Wenn Konstante gesetzt Trace Output schreiben
   #if Fan_testmodus                                        ' Trace
      Print #2 , "Enter Fan_konfig"
   #endif                                                   ' Trace

   '----- Konfiguration FAN-Geschwindigkeit (PWM) -----
   'Variable für Geschwindgkeit in Timerregister laden
   Pwm3b = Fan_pwmwert

   'Port E.4 ist Timer-Ausgang OC3B
   Config Pine.4 = Output

Return
'-- End Lcd_konfig ------------------------------------------------------------

'------------------------------------------------------------------------------
' FAN - Gosub-Routine: Fan_an
' Routine schaltet den Lüfter ein
'------------------------------------------------------------------------------
Fan_lueftung_an:

   ' Wenn Konstante gesetzt Trace Output schreiben
   #if Fan_testmodus                                        ' Trace
      Print #2 , "Enter Fan_an"
      Print #2 , "Setze PWM-Wert " ; Fan_pwmwert
   #endif                                                   ' Trace

   ' PWM-Wert in Timerregister laden
   Pwm3b = Fan_pwmwert

Return
'-- End Lcd_beleuchtung_an ----------------------------------------------------

'------------------------------------------------------------------------------
' FAN - Gosub-Routine: Fan_aus
' Routine schaltet den Lüfter aus
'------------------------------------------------------------------------------
Fan_lueftung_aus:

   ' Wenn Konstante gesetzt Trace Output schreiben
   #if Fan_testmodus                                        ' Trace
      Print #2 , "Enter Fan_aus"
   #endif                                                   ' Trace

   ' PWM-Wert in Timerregister laden
   Pwm3b = Fan_belueftung_aus

Return
'-- End Fan_aus ---------------------------------------------------------------

' ********************
' * SOUND: Piezo     *
' ********************

'------------------------------------------------------------------------------
' SOUND - Gosub-Routine: Sound_konfig
' Konfiguration der notwendigen PIN's und Ports für die Ansteuerung des Piezo-
' Schwingkreises.
'------------------------------------------------------------------------------
Sound_konfig:

   ' Wenn Konstante gesetzt Trace Output schreiben
   #if Sound_testmodus = 1                                  ' Trace
      Print #2 , "Enter Sound_konfig"
   #endif                                                   ' Trace

   Config Sound_pin = Output                                ' PortD.5 als Output

Return
'-- End Sound_konfig ----------------------------------------------------------

'------------------------------------------------------------------------------
' SOUND - Gosub-Routine: Sound_an
' Routinen schaltet die Ausgabe des Signaltons ein.
'------------------------------------------------------------------------------
Sound_an:

   ' Wenn Konstante gesetzt Trace Output schreiben
   #if Sound_testmodus = 1                                  ' Trace
      Print #2 , "Enter Sound_an"
   #endif                                                   ' Trace

   Set Sound_dataout                                        ' Bit setzen

Return
'-- End Sound_an --------------------------------------------------------------

'------------------------------------------------------------------------------
' SOUND - Gosub-Routine: Sound_aus
' Routinen schaltet die Ausgabe des Signaltons aus.
'------------------------------------------------------------------------------
Sound_aus:

   ' Wenn Konstante gesetzt Trace Output schreiben
   #if Sound_testmodus = 1                                  ' Trace
      Print #2 , "Enter Sound_aus"
   #endif                                                   ' Trace

   Reset Sound_dataout                                      ' Bit rücksetzen

Return
'-- End Sound_aus -------------------------------------------------------------

' ********************
' * KEY: Tastatur    *
' ********************

'------------------------------------------------------------------------------
' KEY - Gosub-Routine: Test_enable_keyinterrupt
' Routine aktiviert den INT7 für die Tastaturereigniserfassung erneut. Zuvor
' wird jedoch das Bit für INT7 im External-Interrupt-Flag-Register gelöscht
' da bereits (durch prellen der Tasten) ein neuer Interrupt anstehen kann.
'------------------------------------------------------------------------------
Key_enable_keyinterrupt:

   ' Wenn Konstante gesetzt Trace Output schreiben
   #if Key_testmodus                                        ' Trace
      Print #2 , "Enter Test_enable_keyinterrupt"
      Print #2 , "ORIG EIFR : " ; Bin(eifr)
   #endif                                                   ' Trace

   ' Dieses Bit wird gesetzt, wenn am INT7-Pin eine Interrupt-Kondition,
   ' entsprechend der Konfiguration, erkannt wird. Wenn das External  Enable
   ' Interrupt Flag gesetzt ist, wird die Interruptroutine angesprungen.
   ' Das Flag wird automatisch gelöscht , wenn die Interruptroutine beendet ist.
   ' Alternativ kann das Flag gelöscht werden , indem der Wert 1(!)
   ' eingeschrieben wird. ACHTUNG: Wert 1 !!!!!

   ' Lösche Flankeninterrupt INT7 wenn bereits mehrfach aufgetreten.
   Eifr.intf7 = 1

   ' Wenn Konstante gesetzt Trace Output schreiben
   #if Key_testmodus                                        ' Trace
      Print #2 , "RST EIFR  : " ; Bin(eifr)
   #endif                                                   ' Trace

   ' Interrupt wieder freigeben
   Enable Int7

Return
'-- End Key_enable_keyinterrupt -----------------------------------------------

' ********************
' * MENUE:  Menue    *
' ********************

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_change_state
' Routine stellt den Status der Menue-State-Machine fest und führt ggf. Wechsel
' durch. Hierbei werden die Pointer auf die States neu befüllt und die notwen-
' digen Variablen neu gesetzt.
'------------------------------------------------------------------------------
Menue_change_state:

   ' Wenn Konstante gesetzt Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_change_state"
   #endif                                                   ' Trace

   ' 16-Bit-Adresse des aktuellen Labels / Menüzustandes laden
   lds R8, {Menue_State}
   lds R9, {Menue_State + 1}

   ' Mittels Schleife über das Tastatur-Array Verzweigung prüfen
   For Temp_byte_1 = 1 To Key_buttons
      ' Ansprungsadresse laden
      Read Temp_word_1
      ' Prüfen ob zugehörige Taste betätigt
      If Key_taste = Key_codes(temp_byte_1) Then
         ' Wenn Taste betätigt dann prüfen ob Ansprungziel gültig
         If Temp_word_1 <> Loadlabel(null) Then
            ' Menü muss erneuert werden - Flag setzen
            Menue_state_renew = 1
            ' Tastenstatus zurücksetzen um Einfluss von GOSUBs zu verhindern
            Key_taste = Key_null
            ' Neuer Menüstatus in Zustandsmaschine laden
            Menue_state = Temp_word_1
         End If                                             ' Ansprungziel
      End If                                                ' gültige Taste
   Next Tempb_byte_1                                        ' Array mit Tasten-Codes

   ' Adresse des anzuspringenden Unterprogramms einlesen
   Read Menue_state_gosub

   ' Ausgabeflags einlesen
   Read Menue_ausgabeflags

   ' Textzeilen für LCD-Ausgabe einlesen
   Read Menue_lcd_textbuffer(1)                             'read LCD text
   Read Menue_lcd_textbuffer(2)                             'read LCD text
   Read Menue_lcd_textbuffer(3)                             'read LCD text

Return
'-- End Menue_chane_state -----------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_changes_state_by_sub
' Routine wird von Subroutinen aufgerufen falls eine Menüänderungen händisch
' erzwungen werden soll.
' Hier wird die Statemachine auf einen neuen Zustand umgeschaltet. Der Zustand
' kann in der Variablen Menue_state hinterlegt werden.
'------------------------------------------------------------------------------
Menue_change_state_by_sub:

   ' Wenn Konstante gesetzt Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_change_state_by_sub"
   #endif                                                   ' Trace

   ' Menü muss erneuert werden - Flag setzen
   Menue_state_renew = 1

   ' Eigentliche Menüänderung durchführen
   Gosub Menue_change_state

Return
'-- End Menue_chane_state_by_sub ----------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_call_subroutine
' Routine liest aus aktuellem Menue-State den Sprungadresse und springt angege-
' benes Ziel an.
'------------------------------------------------------------------------------
Menue_call_subroutine:

         LDS R31, {Menue_State_gosub+1}                     'High see Bascom-Doc Mixing ASM and BASIC
         LDS R30, {Menue_State_gosub}                       'Low
         LSR R31                                            'Division durch 2 (Alternativ ADR verwenden)
         ROR R30
         'Call zum Sub
         ICALL

Return
'-- End Menue_call_subroutine -------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men2 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men2:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men2"
   #endif                                                   ' Trace

   ' Menue befndet sich außerhalb der anzeigepflichtigen Untermenüs
   Menue_inrelmenue_flag = 0

Return
'-- End Menue_men2 ------------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men211 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men211:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men211"
   #endif                                                   ' Trace

   ' Zeitsteuerung Timeout ausgeben

   Temp_string_1 = Byte2string(rel_beschattung_delay , &H30 )       ' 0 als Auffüllzeichen verwenden
   Locate 3 , 10 : Lcd Temp_string_1 ; " sec"

Return
'-- End Menue_men211 ----------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men212 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men212:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men212"
   #endif                                                   ' Trace

   ' Zeitsteuerung Uhrzeit AUF ausgeben
   Temp_byte_1 = Makebcd(timer_open_stunde)
   Temp_byte_2 = Makebcd(timer_open_minute)
   Locate 3 , 6 : Lcd Bcd(temp_byte_1) ; ":" ; Bcd(temp_byte_2) ; "h"

   Locate 3 , 13
   Select Case Timer_open_flag
      Case Aktiv:
         Lcd "  JA"
      Case Passiv:
         Lcd "NEIN"
   End Select                                               ' Timer-Open-Flag

Return
'-- End Menue_men212 ----------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men213 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men213:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men213"
   #endif                                                   ' Trace

   ' Zeitsteuerung Uhrzeit ZU ausgeben
   Temp_byte_1 = Makebcd(timer_close_stunde)
   Temp_byte_2 = Makebcd(timer_close_minute)
   Locate 3 , 6 : Lcd Bcd(temp_byte_1) ; ":" ; Bcd(temp_byte_2) ; "h"

   Locate 3 , 13
   Select Case Timer_close_flag
      Case Aktiv:
         Lcd "  JA"
      Case Passiv:
         Lcd "NEIN"
   End Select                                               ' Timer-Open-Flag

Return
'-- End Menue_men213 ----------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men214 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men214:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men214"
   #endif                                                   ' Trace

   ' Auffahrgrund Wind ja/nein ausgeben
   Temp_string_1 = Byte2string(wind_beschattung_auf , &H30)
   Locate 3 , 7 : Lcd Temp_string_1
   Locate 3 , 13
   Select Case Wind_autoauffahren
      Case True:
         Lcd "  JA"
      Case False:
         Lcd "NEIN"
   End Select                                               ' Wind-Auffahren-Flag

Return
'-- End Menue_men214 ----------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men215 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men215:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men215"
   #endif                                                   ' Trace

   ' Auffahrgrund Regen ja/nein ausgeben
   Locate 3 , 13
   Select Case Rain_autoauffahren
      Case True:
         Lcd "  JA"
      Case False:
         Lcd "NEIN"
   End Select                                               ' Regen-Auffahren-Flag

Return
'-- End Menue_men215 ----------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men216 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men216:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men216"
   #endif                                                   ' Trace

   ' Auffahrgrund Licht Helligkeit und ja/nein ausgeben
   Temp_byte_1 = Makebcd(rel_auf_dunkelheit)
   Locate 3 , 7 : Lcd Bcd(temp_byte_1)

   Locate 3 , 13
   Select Case Light_autoauffahren
      Case True:
         Lcd "  JA"
      Case False:
         Lcd "NEIN"
   End Select                                               ' Licht-Auffahren-Flag

Return
'-- End Menue_men216 ----------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men217 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men217:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men217"
   #endif                                                   ' Trace

   ' Zufahrgrund Temperatur ausgeben
   Temp_string_1 = Byte2string(rel_zu_temperatur , &H30)
   Locate 3 , 7 : Lcd Temp_string_1
   Locate 3 , 13
   Select Case Sht71_autozufahren
      Case True:
         Lcd "  JA"
      Case False:
         Lcd "NEIN"
   End Select                                               ' Temperatur-Zufahren-Flag

Return
'-- End Menue_men217 ----------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men221 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men221:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men221"
   #endif                                                   ' Trace

   ' Flag für Dimmermenü wegen Shortcuts
   Menue_inrelmenue_flag = 0

Return
'-- End Menue_men221 ----------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men2211 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men2211:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men2211"
   #endif                                                   ' Trace

   ' Prüfen ob es Regnet
   Temp_byte_1 = Rain_measurement()
   If Temp_byte_1 = Rain_no Then

   ' NEIN, es Regnet nicht, Funktion kann ausgeführt werden

      ' Prüfen ob maximale Windgeschwindigkeit erreicht
      Temp_byte_2 = Wind_geschwindigkeit_kmh
      If Temp_byte_2 < Wind_beschattung_auf Then

         ' NEIN, Windgeschwindigkeit ist noch unterhalb kritischem Wert

         ' Steuerung Antrieb Auf
         Gosub Relais_beschattung_auf

      Else                                                  ' Windgeschwindigkeit

         Cls
         Locate 2 , 4 : Lcd "Windmodus"

      End If                                                ' Ende Wind
   Else                                                     ' Regen

      Cls
      Locate 2 , 4 : Lcd "Regenmodus"

   End If                                                   ' Ende Regen

   ' Menue befndet sich außerhalb der anzeigepflichtigen Untermenüs
   Menue_inrelmenue_flag = 1

Return
'-- End Menue_men2211 ---------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men222 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men222:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men222"
   #endif                                                   ' Trace

   ' Flag für Dimmermenü wegen Shortcuts
   Menue_inrelmenue_flag = 0

Return
'-- End Menue_men222 ----------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men2221 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men2221:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men2221"
   #endif                                                   ' Trace

   ' Prüfen ob es Regnet
   Temp_byte_1 = Rain_measurement()
   If Temp_byte_1 = Rain_no Then

      ' NEIN, es Regnet nicht, Funktion kann ausgeführt werden

      ' Prüfen ob maximale Windgeschwindigkeit erreicht
      Temp_byte_2 = Wind_geschwindigkeit_kmh
      If Temp_byte_2 < Wind_beschattung_auf Then

         ' NEIN, Windgeschwindigkeit ist noch unterhalb kritischem Wert

         ' Steuerung Antrieb Zu
         Gosub Relais_beschattung_zu

      Else                                                  ' Windgeschwindigkeit

         Cls
         Locate 2 , 4 : Lcd "Windmodus"

      End If                                                ' Ende Wind
   Else                                                     ' Regen

      Cls
      Locate 2 , 4 : Lcd "Regenmodus"

   End If                                                   ' Ende Regen

   ' Menue befndet sich außerhalb der anzeigepflichtigen Untermenüs
   Menue_inrelmenue_flag = 2

Return
'-- End Menue_men2221 ---------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men223 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men223:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men223"
   #endif                                                   ' Trace

   ' Flag für Dimmermenü wegen Shortcuts
   Menue_inrelmenue_flag = 0

Return
'-- End Menue_men223 ----------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men2211 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men2231:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men2231"
   #endif                                                   ' Trace

   ' Prüfen ob es Regnet
   Temp_byte_1 = Rain_measurement()
   If Temp_byte_1 = Rain_no Then

   ' NEIN, es Regnet nicht, Funktion kann ausgeführt werden

      ' Prüfen ob maximale Windgeschwindigkeit erreicht
      Temp_byte_2 = Wind_geschwindigkeit_kmh
      If Temp_byte_2 < Wind_beschattung_auf Then

         ' NEIN, Windgeschwindigkeit ist noch unterhalb kritischem Wert

         ' Steuerung Antrieb Stopp
         Gosub Relais_beschattung_stop

      Else                                                  ' Windgeschwindigkeit

         Cls
         Locate 2 , 4 : Lcd "Windmodus"

      End If                                                ' Ende Wind
   Else                                                     ' Regen

      Cls
      Locate 2 , 4 : Lcd "Regenmodus"

   End If                                                   ' Ende Regen

   ' Menue befndet sich außerhalb der anzeigepflichtigen Untermenüs
   Menue_inrelmenue_flag = 3

Return
'-- End Menue_men2231 ---------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men3 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men3:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men3"
   #endif                                                   ' Trace

   ' Flag für Dimmermenü wegen Shortcuts
   Menue_indimmenue_flag = 0

Return
'-- End Menue_men3 ------------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men31 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men31:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men31"
   #endif                                                   ' Trace

   ' Flag für Dimmermenü wegen Shortcuts
   Menue_indimmenue_flag = 0

Return
'-- End Menue_men31 -----------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men311 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men311:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men311"
   #endif                                                   ' Trace

   ' Ausgabe von Dauerlicht und Flashmode
   Locate 2 , 13
   If Beleuchtung_flag = False Then
      Lcd "NEIN"
   Else                                                     ' Beleuchtung
      Select Case Dauerlicht_flag
         Case Aktiv : Lcd "  JA"
         Case Passiv : Lcd "NEIN"
      End Select
   End If                                                   ' Beleuchtung

   Locate 3 , 13
   Select Case Dim_flash_mode
      Case Aktiv : Lcd "  JA"
      Case Passiv : Lcd "NEIN"
   End Select                                               ' Flash-Mode

Return
'-- End Menue_men311 ----------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men312 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men312:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men312"
   #endif                                                   ' Trace

   ' Ausgabe von Dimmerstufe und Dimmergrenzen
   Temp_byte_1 = Makebcd(dim_helligkeitsstufe)
   Locate 2 , 15 : Lcd Bcd(temp_byte_1)

   Temp_byte_1 = Makebcd(dim_helligkeit_min)
   Locate 3 , 6 : Lcd Bcd(temp_byte_1)

   Temp_byte_1 = Makebcd(dim_helligkeit_max)
   Locate 3 , 15 : Lcd Bcd(temp_byte_1)

   ' Flag für Dimmermenü wegen Shortcuts
   Menue_indimmenue_flag = 4

Return
'-- End Menue_men312 ----------------------------------------------------------

' Erläuterung zur Relaissteuerung
'  ---------------------------------------------------------------------
'  |    Relais 1    |      Relais 2         |         Funktion         |
'  |(Licht EIN/AUS) |  (Dauerlicht EIN/AUS) |                          |
'  |================|=======================|==========================|
'  |    abgefallen  |     abgefallen        |      Licht aus           |
'  |    abgefallen  |     angezogen         |      Licht aus           |
'  |    angezogen   |     abgefallen        |      Licht auf Dauerlicht|
'  |    angezogen   |     angezogen         |      Licht von Dimmer    |
'  ---------------------------------------------------------------------
'  Achtung: Bei Dimmer wird Free-Running benötigt!

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men3211 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men3211:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men3211"
   #endif                                                   ' Trace

   ' Ausgabe ob Dauerlicht JA/NEIN

   Locate 2 , 7

   If Beleuchtung_flag = Aktiv Then
      Select Case Dauerlicht_flag
         Case Aktiv :
            Lcd "AN "
         Case Passiv :
            Lcd "AUS"
      End Select
   Else                                                     ' Beleuchtung
      Lcd "AUS"
   End If                                                   ' Beleuchtung

Return
'-- End Menue_men3211 ---------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men32111 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men32111:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men32111"
   #endif                                                   ' Trace

   ' Wegen manuellem Eingriff in Licht Flashmode verriegeln
   Dim_flash_mode_locked = True

   ' Ausgabe ob Dauerlicht JA/NEIN inkl. Umschaltung

   ' Prüfung ob Beleuchtung überhaupt eingeschaltet
   If Beleuchtung_flag = Passiv Then

      ' Beleuchtung ist nicht eingeschaltet und läuft auch nicht auf Dimmer
      ' => Beleuchtung einschalten und Dauerlicht aktivieren
      Gosub Beleuchtung_ein
      Gosub Beleuchtung_dauerlicht_ein

   Else                                                     ' Beleuchtung

      ' Beleuchtung läuft bereits, entweder als Dimmer oder bereits im Dauerlicht

      ' Prüfen ob Dimmer im Hintergrund aktiv
      If Free_running_flag = Passiv Then

         ' NEIN, Dimmer läuft nicht => Beleuchtung aus und Relais auf NULL
         Gosub Beleuchtung_aus
         Gosub Beleuchtung_dauerlicht_ein

      Else                                                  ' Dimmer aktiv
         ' Ja, Free-Running ist aktiv und damit ist Dimmer aktiv
         ' => prüfen ob Dauerlicht an oder aus
         If Dauerlicht_flag = Aktiv Then
            Gosub Beleuchtung_dauerlicht_aus
         Else                                               ' Dauerlicht
            Gosub Beleuchtung_dauerlicht_ein
         End If                                             ' Dauerlicht
      End If                                                ' Dimmer aktiv
   End If                                                   ' Beleuchtung

   Locate 2 , 7
   If Beleuchtung_flag = Aktiv Then
      Select Case Dauerlicht_flag
         Case Aktiv :
            Lcd "AN "
         Case Passiv :
            Lcd "AUS"
      End Select                                            ' Dauerlicht
   Else                                                     ' Beleuchtung
      Lcd "AUS"
   End If                                                   ' Beleuchtung

Return
'-- End Menue_men32111 --------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men322 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men322:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men322"
   #endif                                                   ' Trace

   ' Flag für Dimmermenü wegen Shortcuts
   Menue_indimmenue_flag = 0

Return
'-- End Menue_men322 -----------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men3221 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men3221:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men3221"
   #endif                                                   ' Trace

   ' Wegen manuellem Eingriff in Licht Flashmode verriegeln
   Dim_flash_mode_locked = True

   ' Dimmerhelligkeit ausgeben (Dimmer heller)

   ' Flag für Dimmermenü wegen Shortcuts
   Menue_indimmenue_flag = 1

   ' Prüfen ob Beleuchtung bereits eingeschaltet
   If Beleuchtung_flag = Passiv Then

      ' Beleuchtung läuft noch nicht => Beleuchtung einschalten
      Gosub Beleuchtung_ein
      Gosub Beleuchtung_dauerlicht_aus

      ' Dimmer frei laufen lasse
      Free_running_flag = Aktiv

   End If                                                   ' Beleuchtung

   ' Helligkeitsstufe auf Display ausgeben
   Locate 2 , 8
   Temp_byte_1 = Makebcd(dim_helligkeitsstufe)
   Lcd Bcd(temp_byte_1)

Return
'-- End Menue_men3221 ---------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men32211 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men32211:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men32211"
   #endif                                                   ' Trace

   ' Dimmer heller
   ' Dimmerhelligkeit ausgeben und Helligkeit um eins erhöhen bis Grenze erreicht

   ' Dimmer heller schalten und gegen Endwert prüfen
   If Dim_helligkeitsstufe < Dim_helligkeit_max Then
      Incr Dim_helligkeitsstufe
   End If                                                   ' Helligkeitsstufe

   ' Helligkeitsstufe auf Display ausgeben
   Locate 2 , 8
   Temp_byte_1 = Makebcd(dim_helligkeitsstufe)
   Lcd Bcd(temp_byte_1)

Return
'-- End Menue_men32211 --------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men323 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men323:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men323"
   #endif                                                   ' Trace

   ' Flag für Dimmermenü wegen Shortcuts
   Menue_indimmenue_flag = 0

Return
'-- End Menue_men323 ----------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men3231 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men3231:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men3231"
   #endif                                                   ' Trace

   ' Wegen manuellem Eingriff in Licht Flashmode verriegeln
   Dim_flash_mode_locked = True

   ' Dimmerhelligkeit ausgeben (Dimmer dunkler)

   ' Flag für Dimmermenü wegen Shortcuts
   Menue_indimmenue_flag = 2

   ' Prüfen ob Beleuchtung bereits eingeschaltet
   If Beleuchtung_flag = Passiv Then

      ' Beleuchtung läuft noch nicht => Beleuchtung einschalten
      Gosub Beleuchtung_ein
      Gosub Beleuchtung_dauerlicht_aus

      ' Dimmer frei laufen lasse
      Free_running_flag = Aktiv

   End If                                                   ' Beleuchtung

   ' Helligkeitsstufe auf Display ausgeben
   Locate 2 , 8
   Temp_byte_1 = Makebcd(dim_helligkeitsstufe)
   Lcd Bcd(temp_byte_1)

Return
'-- End Menue_men3231 ---------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men32311 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men32311:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men32311"
   #endif                                                   ' Trace

   ' Dimmer dunkler
   ' Dimmerhelligkeit ausgeben und Helligkeit um eins verringern bis Grenze erreicht

   ' Dimmer dunkler schalten und gegen Endwert prüfen
   If Dim_helligkeitsstufe > Dim_helligkeit_min Then
      Decr Dim_helligkeitsstufe
   End If                                                   ' Helligkeitsstufe

   ' Helligkeitsstufe auf Display ausgeben
   Locate 2 , 8
   Temp_byte_1 = Makebcd(dim_helligkeitsstufe)
   Lcd Bcd(temp_byte_1)

Return
'-- End Menue_men32311 --------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men324 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men324:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men324"
   #endif                                                   ' Trace

   ' Flag für Dimmermenü wegen Shortcuts
   Menue_indimmenue_flag = 0

Return
'-- End Menue_men324 -----------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men3241 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men3241:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men3241"
   #endif                                                   ' Trace

   ' Wegen manuellem Eingriff in Licht Flashmode verriegeln
   Dim_flash_mode_locked = True

   ' Dimmer ausschalten

   ' Flag für Dimmermenü wegen Shortcuts
   Menue_indimmenue_flag = 3

   ' Dimmerfreilauf beenden
   Free_running_flag = Passiv

   ' Relais ggf. abschalten bzw. umschalten
   If Dauerlicht_flag = Passiv Then
      Gosub Beleuchtung_dauerlicht_ein
      Gosub Beleuchtung_aus
   End If                                                   ' Dauerlicht

Return
'-- End Menue_men3241 ---------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men4 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men4:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men4"
   #endif                                                   ' Trace

   ' Zeitüberwachung aus Untermenüs abschalten damit Menüs nicht mehr zyklisch
   ' aufgerufen werden.

   ' Flag für zeitlich upzudatendes Menue zurücksetzen
   Menue_insensmenue_flag = 0

   ' Abhängig vom Flash-Mode und von der Funktion lichtgesteuert zuzufahren
   ' Lichterfassung ausschalten
   If Dim_flash_mode = Passiv Then
      If Rel_auf_dunkel_flag = False Then
         Light_erfassung = False
      End If                                                ' Lichtfunktion Beschattung AUF
   End If                                                   ' Flash-Mode

Return
'-- End Menue_men4 ------------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men41 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men41:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men41"
   #endif                                                   ' Trace

   ' Zeitüberwachung aus Untermenüs abschalten damit Menüs nicht mehr zyklisch
   ' aufgerufen werden.

   ' Flag für zeitlich upzudatendes Menue zurücksetzen
   Menue_insensmenue_flag = 0

Return
'-- End Menue_men41 -----------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men411 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men411:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men411"
   #endif                                                   ' Trace

   ' Zeitüberwachung aus Untermenüs einschalten damit Menüs zyklisch
   ' aufgerufen werden.

   ' Windgeschwindigkeit ausgeben!

   ' Flag für zeitlich upzudatendes Menue setzen
   Menue_insensmenue_flag = 1

   Temp_string_1 = Fusing(wind_geschwindigkeit_kmh , "###.##")
   Locate 3 , 1 : Lcd Temp_string_1 ; " km/h   "

   ' Achtung: 3 Leerezeichen bei der Ausgabe verhindern das Stehenbleiben von
   ' einzenen Buchstaben bei großen Schwankungen der Windgeschwindigkeit in
   ' einer Zeile. Auf diese Weise kan auf das Löschen der vorhergehenden Zeile
   ' verzichtet werden.

Return
'-- End Menue_men411 ----------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men42 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men42:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men42"
   #endif                                                   ' Trace

   ' Zeitüberwachung aus Untermenüs abschalten damit Menüs nicht mehr zyklisch
   ' aufgerufen werden.

   ' Flag für zeitlich upzudatendes Menue zurücksetzen
   Menue_insensmenue_flag = 0

Return
'-- End Menue_men42 -----------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men421 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men421:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men421"
   #endif                                                   ' Trace

   ' Zeitüberwachung aus Untermenüs einschalten damit Menüs zyklisch
   ' aufgerufen werden.
   ' Status Regensensor ausgeben!

   ' Flag für zeitlich upzudatendes Menue setzen
   Menue_insensmenue_flag = 2

   ' Funktion zur Abfrage des Regensensors aufrufen
   ' Rückgabewert: &H00 = kein Regen
   '               &H01 = Regen vom Sensor erkannt
   Temp_byte_1 = Rain_measurement();

   Locate 3 , 1

   ' Variable auswerten und Ausgabetext anzeigen
   Select Case Temp_byte_1
      Case &H00 : Lcd "trocken    "
      Case &H01 : Lcd "nass/feucht"
   End Select                                               ' Regensensorwert

Return
'-- End Menue_men421 ----------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men4 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men43:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men43"
   #endif                                                   ' Trace

   ' Zeitüberwachung aus Untermenüs abschalten damit Menüs nicht mehr zyklisch
   ' aufgerufen werden.

   ' Flag für zeitlich upzudatendes Menue zurücksetzen
   Menue_insensmenue_flag = 0

Return
'-- End Menue_men43 -----------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men431 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men431:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men431"
   #endif                                                   ' Trace

   ' Zeitüberwachung aus Untermenüs einschalten damit Menüs zyklisch
   ' aufgerufen werden.
   ' Temperatur und Taupunkt ausgeben!

   ' Flag für zeitlich upzudatendes Menue setzen
   Menue_insensmenue_flag = 3

   ' Ausgabe der Temperatur
   Locate 2 , 7
   Temp_string_1 = Fusing(sht71_t , "###.##")
   Lcd Temp_string_1 ; "{223}C  "

   ' Ausgabe des Taupunktes
   Locate 3 , 7
   Temp_string_1 = Fusing(sht71_dewpoint , "###.##")
   Lcd Temp_string_1 ; "{223}C  "

Return
'-- End Menue_men431 ----------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men44 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men44:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men44"
   #endif                                                   ' Trace

   ' Zeitüberwachung aus Untermenüs abschalten damit Menüs nicht mehr zyklisch
   ' aufgerufen werden.

   ' Flag für zeitlich upzudatendes Menue zurücksetzen
   Menue_insensmenue_flag = 0

Return
'-- End Menue_men44 -----------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men441 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men441:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men441"
   #endif                                                   ' Trace

   ' Zeitüberwachung aus Untermenüs einschalten damit Menüs zyklisch
   ' aufgerufen werden.
   ' Luftfeuchtigkeit ausgeben!

   ' Abhängig vom Flash-Mode und von der Funktion lichtgesteuert zuzufahren
   ' Lichterfassung ausschalten
   If Dim_flash_mode = Passiv Then
      If Rel_auf_dunkel_flag = False Then
         Light_erfassung = False
      End If                                                ' Lichtfunktion Beschattung AUF
   End If                                                   ' Flash-Mode

   ' Flag für zeitlich upzudatendes Menue setzen
   Menue_insensmenue_flag = 4

   ' Ausgabe der relativen Luftfeuchtigkeit
   Locate 3 , 1
   Temp_string_1 = Fusing(sht71_rhtrue , "###.##")
   Lcd Temp_string_1 ; " %RH"

Return
'-- End Menue_men441 ----------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men45 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men45:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men45"
   #endif                                                   ' Trace

   ' Zeitüberwachung aus Untermenüs abschalten damit Menüs nicht mehr zyklisch
   ' aufgerufen werden.

   ' Flag für zeitlich upzudatendes Menue zurücksetzen
   Menue_insensmenue_flag = 0

   ' Abhängig vom Flash-Mode und von der Funktion lichtgesteuert zuzufahren
   ' Lichterfassung ausschalten
   If Dim_flash_mode = Passiv Then
      If Rel_auf_dunkel_flag = False Then
         Light_erfassung = False
      End If                                                ' Lichtfunktion Beschattung AUF
   End If                                                   ' Flash-Mode

Return
'-- End Menue_men45 -----------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men451 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men451:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men451"
   #endif                                                   ' Trace

   ' Zeitüberwachung aus Untermenüs einschalten damit Menüs zyklisch
   ' aufgerufen werden.
   ' Helligkeitswert ausgeben

   ' Flag für zeitlich upzudatendes Menue setzen
   Menue_insensmenue_flag = 5

   ' Prüfen ob Lichterfassung ausgeschaltet
   If Light_erfassung = False Then
      ' JA, Lichterfassung ist aus

      ' Licht einmalig erfassen
      Light_value = Light_measurement(light_messwert_zahl )

      ' zyklisches Update aktivieren
      Light_erfassung = True

      ' Auswerteintervall setzen
      Light_erfassungs_counter = Sectic_count + Light_auswertung_default
   End If                                                   ' Lichterfassung

   ' Ausgabe der vom Sensor TAOS gemessenen Helligkeit normiert auf 0-15
   Temp_byte_1 = Makebcd(light_value)
   Locate 2 , 15 : Lcd Bcd(temp_byte_1)

Return
'-- End Menue_men451 ----------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men461 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men461:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men461"
   #endif                                                   ' Trace

   ' Maximale gemessene Windgeschwindigkeit ausgeben

   ' Flag für zeitlich upzudatendes Menue zurücksetzen
   ' Anmerkung: Aufruf könnte von Men451 mit Zeitüberwachung sein.
   Menue_insensmenue_flag = 0

   ' Ausgabe der aktuell gespeicherten maximalen Windgeschwindigkeit
   Temp_string_1 = Fusing(wind_kmh_max , "###.#")
   Locate 3 , 1 : Lcd Temp_string_1 ; " km/h"

Return
'-- End Menue_men461 ----------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men462 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men462:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men462"
   #endif                                                   ' Trace

   ' Minimale und maximale gemessene Temperaturen ausgeben

   ' Ausgabe der minimalen Temperatur
   Temp_string_1 = Fusing(sht71_t_min , "###.#")
   Locate 2 , 10 : Lcd Temp_string_1 ; "{223}C"

   ' Ausgabe der maximalen Temperatur
   Temp_string_1 = Fusing(sht71_t_max , "###.#")
   Locate 3 , 10 : Lcd Temp_string_1 ; "{223}C"

Return
'-- End Menue_men462 ----------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men463 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men463:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men463"
   #endif                                                   ' Trace

   ' Minimale und maximale gemessene Lufttfeuchtigkeit ausgeben

   ' Ausgabe der minimalen relativen Luftfeuchtigkeit
   Temp_string_1 = Fusing(sht71_rhtrue_min , "###.#")
   Locate 2 , 12 : Lcd Temp_string_1 ; "%"

   ' Ausgabe der maximalen relativen Luftfeuchtigkeit
   Temp_string_1 = Fusing(sht71_rhtrue_max , "###.#")
   Locate 3 , 12 : Lcd Temp_string_1 ; "%"

Return
'-- End Menue_men463 ----------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men5 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men5:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men5"
   #endif                                                   ' Trace

   ' Zeitüberwachung aus Untermenüs ausschalten damit Menüs nicht mehr zyklisch
   ' aufgerufen werden.

   ' Flag für zeitlich upzudatendes Menue zurücksetzen
   Menue_insensmenue_flag = 0

Return
'-- End Menue_men5 ------------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men51 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men51:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men51"
   #endif                                                   ' Trace

   ' Zeitüberwachung aus Untermenüs einschalten damit Menüs zyklisch
   ' aufgerufen werden.

   ' Flag für zeitlich upzudatendes Menue setzen
   Menue_insensmenue_flag = 6

   ' Zeit und Datumsinformationen zyklisch ausgeben
   ' Uhrzeit und Tag ausgeben
   Locate 2 , 1 : Lcd Time$
   Locate 2 , 15 : Lcd Lookupstr(_weekday , Wochentag)

   ' Wenn Zeit synchronisiert wurde dann * ausgeben
   If Dcf_sync_count > 0 Then
      Locate 2 , 11 : Lcd "*"
   End If                                                   ' Zeit synchronisiert?

   ' Datum ausgeben
   Locate 3 , 1 : Lcd Date$

   ' Anzahl der erfolgten Synchronisationen auf LCD ausgeben
   Temp_byte_2 = Makebcd(dcf_sync_count)
   Locate 3 , 11 : Lcd Bcd(temp_byte_2)

   ' Zeitzone ausgeben
   Locate 3 , 16 : Lcd Dcf77timezone()

   ' Eine Sekunde warten!
   ' Wait 1 ' nicht hier!!

Return
'-- End Menue_men51 -----------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men6111 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men6111:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men6111"
   #endif                                                   ' Trace

   ' Ausgabe der Datenversion Internes EEPROM

   Temp_word_1 = Akt_internal_ee_version
   Locate 3 , 1 : Lcd "&H" ; Hex(temp_word_1)

Return
'-- End Menue_men6111 ---------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men6121 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men6121:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men6121"
   #endif                                                   ' Trace

   ' Ausgabe der Datenversion Externes EEPROM
   Temp_word_1 = Akt_external_ee_version
   Locate 3 , 1 : Lcd "&H" ; Hex(temp_word_1)

Return
'-- End Menue_men6121 ---------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men6122 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men6122:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men6122"
   #endif                                                   ' Trace

   ' Ausgabe Datencounter in externem EEPROM
   Locate 3 , 1 : Lcd "&H" ; Hex(ee_data_count) ; " = " ; Ee_data_count

Return
'-- End Menue_men6122 ---------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men6123 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men6123:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men6123"
   #endif                                                   ' Trace

   ' Ausgabe Überlaufzähler externes EEPROM
   Locate 3 , 1 : Lcd "&H" ; Hex(ee_data_overrun) ; " = " ; Ee_data_overrun

Return
'-- End Menue_men6123 ---------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men6124 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men6124:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men6124"
   #endif                                                   ' Trace

   ' Ausgabe der aktuellen Adresse im externen EEPROM

   Temp_word_1 = Ea_data_loging_length * Ee_data_count
   Temp_word_1 = Temp_word_1 + Ee_data_loging_start_adress

   Locate 3 , 1 : Lcd "&H" ; Hex(temp_word_1) ; " = " ; Temp_word_1

Return
'-- End Menue_men6124 ---------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men621 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men621:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men621"
   #endif                                                   ' Trace

   ' Loggingdaten übertragen

   Print #2 , "Logging-Daten ConvCtrl V1.0"
   Print #2 , "Uebertragung :;" ; Date$ ; ";" ; Time$
   Print #2 , ""
   Print #2 , "Datenversion :;" ; Hex(ee_data_version_extern)
   Print #2 , "Data Count :;" ; Ee_data_count
   Print #2 , "Data Overrun :;" ; Ee_data_overrun
   Print #2 , ""
   Print #2 , "Lfd.-Nr.;Datum;Zeit;Licht;Regen;Wind;Temperatur;Luftfeuchtigkeit"

   ' Gelesene Daten interpretieren und ausgeben
   ' Format: nr;day.month.year;hour:minute;light;rain;wind;temp;hum

   ' Prüfen auf Überlauf, wenn ja maximale Adresse annehmen
   If Ee_data_overrun > 0 Then
      Ee_output_endadress = Ea_data_loging_endadress - 1
   Else                                                     ' Überlauf
      Ee_output_endadress = Ee_data_count
   End If                                                   ' Überlauf

   ' Anmerkung: Wenn Überlauf stattgefunden hat kann gesamtes EEPROM ausgegeben
   ' werden. Andernfalls wird nur von Adress NULL bis zum aktuellen Datenzeiger
   ' ausgegeben.

   ' Prüfen ob überhaupt Daten im EEPROM abgelegt und wenn ja ausgeben
   If Ee_output_endadress > 0 Then

      ' Ausgabeflag setzen
      Ee_output_flag = True

      ' Ausgabecounter setzen
      Ee_output_counter = Ee_data_count_default

   Else                                                     ' Daten im EEPROM?

      Print #2 , "*** Fehler! keine Daten enthalten ***"
      Print #2 , "Ende der Daten"

   End If                                                   ' Daten im EEPROM?

Return
'-- End Menue_men621 ----------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men7111 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men7111:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men7111"
   #endif                                                   ' Trace

   ' Timerstatus für Öffnung ausgeben
   Locate 2 , 7

   Select Case Timer_open_flag
      Case Aktiv :
         Lcd "AN "
      Case Passiv :
         Lcd "AUS"
   End Select                                               ' Timer-Open-Flag

Return
'-- End Menue_men7111 ---------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men71111 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men71111:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men71111"
   #endif                                                   ' Trace

   ' Timerstatus für Öffnung ausgeben und Status umschalten
   Locate 2 , 7

   Select Case Timer_open_flag
      Case Aktiv :
         Timer_open_flag = Passiv
         Lcd "AUS"
      Case Passiv :
         Timer_open_flag = Aktiv
         Lcd " AN"
   End Select                                               ' Timer-Open-Flag

Return
'-- End Menue_men71111 --------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men7121 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men7121:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men7121"
   #endif                                                   ' Trace

   ' Timerstatus für Schließung ausgeben
   Locate 2 , 7

   Select Case Timer_close_flag
      Case Aktiv :
         Lcd "AN "
      Case Passiv :
         Lcd "AUS"
   End Select                                               ' Timer-Close-Flag

Return
'-- End Menue_men7121 ---------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men71211 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men71211:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men71211"
   #endif                                                   ' Trace

   ' Timerstatus für Schließung ausgeben und Status umschalten
   Locate 2 , 7

   Select Case Timer_close_flag
      Case Aktiv :
         Timer_close_flag = Passiv
         Lcd "AUS"
      Case Passiv :
         Timer_close_flag = Aktiv
         Lcd " AN"
   End Select                                               ' Timer-Close-Flag

Return
'-- End Menue_men71211 --------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men7211 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men7211:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men7211"
   #endif                                                   ' Trace

   ' ggf. Zeitwerte aus Unterfunktion übernehmen - Öffnungszeiten

   If Menue_datenuebernahme_flag = True Then

      ' Flag zurücksetzen
      Menue_datenuebernahme_flag = False

      ' Daten üebernehmen
      Timer_open_sekunde = Menue_time_sekunde               ' Interne Sekundenvariable
      Timer_open_minute = Menue_time_minute                 ' Interne Minutenvariable
      Timer_open_stunde = Menue_time_stunde                 ' Interne Stundenvariable

   End If                                                   ' Datenübernahme?

Return
'-- End Menue_men7211 ---------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men72111 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men72111:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men72111"
   #endif                                                   ' Trace

   ' Einstellen der Uhrzeit vorbereiten und relevante Variablen laden

   ' Uhrzeit laden wurde von Menü MEN7211 aufgerufen. Es geht hier um Öffnungszeit

   ' Hilfvariablen für Time-Menü laden

   Menue_time_sekunde = Timer_open_sekunde                  ' Interne Sekundenvariable
   Menue_time_minute = Timer_open_minute                    ' Interne Minutenvariable
   Menue_time_stunde = Timer_open_stunde                    ' Interne Stundenvariable

   ' Rücksprung-Ziel festlegen
   Menue_state_buffer = Loadlabel(men7211)                  ' Uhrzeit einstellen Menü 7-2-1-1

   ' Menü neu laden und einspringen
   Menue_state = Loadlabel(time1)                           ' Einsprung in erstes Einstellfenster
   Gosub Menue_change_state_by_sub
   Gosub Lcd_print
   Menue_state_renew = 0
   Gosub Menue_time1                                        ' zugehörige Unterfunktiona anspringen

Return
'-- End Menue_men72111 --------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men7212 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men7212:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men7212"
   #endif                                                   ' Trace

   ' ggf. Datumswert aus Unterfunktion übernehmen - Öffnungszeiten
   If Menue_datenuebernahme_flag = True Then

      ' Flag zurücksetzen
      Menue_datenuebernahme_flag = False

      ' Daten üebernehmen
      Timer_open_tag = Menue_date_tag                       ' Interne Tagvariable
      Timer_open_monat = Menue_date_monat                   ' Interne Monatsvariable
      Timer_open_jahr = Menue_date_jahr                     ' Interne Jahresvariable

   End If                                                   ' Datenübernahme

Return
'-- End Menue_men7212 ---------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men72121 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men72121:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men72121"
   #endif                                                   ' Trace

   ' Einstellen des Datums vorbereiten und relevante Variablen laden

   ' Datum laden wurde von Menü MEN7212 aufgerufen. Es geht hier um Öffnungszeit

   ' Hilfvariablen für Time-Menü laden

   Menue_date_tag = Timer_open_tag                          ' Interne Tagvariable der SoftClock
   Menue_date_monat = Timer_open_monat                      ' Interne Monatsvariable der SoftClock
   Menue_date_jahr = Timer_open_jahr                        ' Interne Jahresvariable der Softclock

   ' Rücksprung-Ziel festlegen
   Menue_state_buffer = Loadlabel(men7212)                  ' Datum einstellen Menü 7-2-1-2

   ' Menü neu laden und einspringen
   Menue_state = Loadlabel(date1)                           ' Einsprung in erstes Einstellfenster
   Gosub Menue_change_state_by_sub
   Gosub Lcd_print
   Menue_state_renew = 0
   Gosub Menue_date1                                        ' zugehörige Unterfunktion anspringen

Return
'-- End Menue_men72121 --------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men7221 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men7221:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men7221"
   #endif                                                   ' Trace

   ' ggf. Zeitwerte aus Unterfunktion übernehmen - Schließungszeiten
      If Menue_datenuebernahme_flag = True Then

      ' Flag zurücksetzen
      Menue_datenuebernahme_flag = False

      ' Daten üebernehmen
      Timer_close_sekunde = Menue_time_sekunde              ' Interne Sekundenvariable
      Timer_close_minute = Menue_time_minute                ' Interne Minutenvariable
      Timer_close_stunde = Menue_time_stunde                ' Interne Stundenvariable

   End If                                                   ' Datenübernahme

Return
'-- End Menue_men7221 ---------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men72211 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men72211:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men72211"
   #endif                                                   ' Trace

   ' Einstellen der Uhrzeit vorbereiten und relevante Variablen laden

   ' Uhrzeit laden wurde von Menü MEN7221 aufgerufen. Es geht hier um Schließungszeit

   ' Hilfvariablen für Time-Menü laden

   Menue_time_sekunde = Timer_close_sekunde                 ' Interne Sekundenvariable
   Menue_time_minute = Timer_close_minute                   ' Interne Minutenvariable
   Menue_time_stunde = Timer_close_stunde                   ' Interne Stundenvariable

   ' Rücksprung-Ziel festlegen
   Menue_state_buffer = Loadlabel(men7221)                  ' Uhrzeit einstellen Menü 7-2-2-1

   ' Menü neu laden und einspringen
   Menue_state = Loadlabel(time1)                           ' Einsprung in erstes Einstellfenster
   Gosub Menue_change_state_by_sub
   Gosub Lcd_print
   Menue_state_renew = 0
   Gosub Menue_time1                                        ' zugehörige Unterfunktion anspringen

Return
'-- End Menue_men72211 --------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men7222 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men7222:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men7222"
   #endif                                                   ' Trace

   ' ggf. Datumswert aus Unterfunktion übernehmen - Schließungszeiten
   If Menue_datenuebernahme_flag = True Then

      ' Flag zurücksetzen
      Menue_datenuebernahme_flag = False

      ' Daten üebernehmen
      Timer_close_tag = Menue_date_tag                      ' Interne Tagvariable
      Timer_close_monat = Menue_date_monat                  ' Interne Monatsvariable
      Timer_close_jahr = Menue_date_jahr                    ' Interne Jahresvariable

   End If                                                   ' Datenübernahme

Return
'-- End Menue_men7222 ---------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men72221 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men72221:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men72221"
   #endif                                                   ' Trace

   ' Einstellen des Datums vorbereiten und relevante Variablen laden

   ' Datum laden wurde von Menü MEN882 aufgerufen. Es geht hier um Schließungszeit

   ' Hilfvariablen für Time-Menü laden

   Menue_date_tag = Timer_close_tag                         ' Interne Tagvariable
   Menue_date_monat = Timer_close_monat                     ' Interne Monatsvariable
   Menue_date_jahr = Timer_close_jahr                       ' Interne Jahresvariable

   ' Rücksprung-Ziel festlegen
   Menue_state_buffer = Loadlabel(men7222)                  ' Datum einstellen Menü 7-2-2-2

   ' Menü neu laden und einspringen
   Menue_state = Loadlabel(date1)                           ' Einsprung in erstes Einstellfenster
   Gosub Menue_change_state_by_sub
   Gosub Lcd_print
   Menue_state_renew = 0
   Gosub Menue_date1                                        ' zugehörige Unterfunktion anspringen

Return
'-- End Menue_men72121 --------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men81 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men81:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men81"
   #endif                                                   ' Trace

   ' Ggf. Dimmereinstellungen in EEPROM zurückspeichern

   If Menue_data_changed_flag = True Then

      ' Änderungs-Flag zurücksetzen
      Menue_data_changed_flag = False

      ' Daten aus Dimmermenü in EEPROM zurückschreiben
      Ee_data_dimmer = Dim_flash_mode
      Ee_data_dim_min = Dim_helligkeit_min
      Ee_data_dim_max = Dim_helligkeit_max

      ' Speicherung durch EE auf Display anzeigen
      Locate 3 , 8 : Lcd "EE"

   End If                                                   ' Datenänderung

Return
'-- End Menue_men81 -----------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men8111 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men8111:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men8111"
   #endif                                                   ' Trace

   ' Zustand Lightfloating ausgeben
   ' Wertebereich AN/AUS

   Locate 2 , 7
   Select Case Dim_flash_mode
      Case Aktiv:
         Lcd "AN"
      Case Passiv:
         Lcd "AUS"
   End Select                                               ' Flash-Mode

Return
'-- End Menue_men8111 ---------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men81111 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men81111:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men81111"
   #endif                                                   ' Trace

   ' Zustand Lightfloating umschalten und Zustand ausgeben
   ' Wertebereich AN/AUS

   Menue_data_changed_flag = True

   Locate 2 , 7
   Select Case Dim_flash_mode
      Case Aktiv:
         Dim_flash_mode = Passiv
         Lcd "AUS"
      Case Passiv:
         Dim_flash_mode = Aktiv
         Lcd "AN"
   End Select                                               ' Flash-Mode

Return
'-- End Menue_men81111 --------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men81211 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men81211:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men81211"
   #endif                                                   ' Trace

   ' Dimmer untere Grenze ausgeben
   ' Wertebereich 01-32

   Temp_byte_1 = Makebcd(dim_helligkeit_min)
   Locate 2 , 8 : Lcd Bcd(temp_byte_1)

Return
'-- End Menue_men81211 --------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men812111 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men812111:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men812111"
   #endif                                                   ' Trace

   ' Dimmer untere Grenze berechnen und neu ausgeben
   ' Wertebereich 01-32 aber gegen obere Grenze verriegelt

   Menue_data_changed_flag = True

   ' Tasten auswerten welche betätigt wurden
   Select Case Key_taste_buffer

      Case 12:
         ' hoch = erhöhen
         Temp_byte_1 = Dim_helligkeit_max - 1
         If Dim_helligkeit_min < Temp_byte_1 Then
            Incr Dim_helligkeit_min
         End If                                             ' Helligkeitsstufe

      Case 42:
         ' runter = erniedrigen
         If Dim_helligkeit_min > Dim_helligkeit_set_min Then
            Decr Dim_helligkeit_min
         End If                                             ' Helligkeitsstufe

      Case 44:
         'rechts = erhöhen und bei null anfangen
         Incr Dim_helligkeit_min
         If Dim_helligkeit_min >= Dim_helligkeit_max Then
            Dim_helligkeit_min = Dim_helligkeit_set_min
         End If                                             ' Helligkeitsstufe

   End Select                                               ' Tastenauswertung

   ' Neuen Helligkeitswert ausgeben
   Temp_byte_1 = Makebcd(dim_helligkeit_min)
   Locate 2 , 8 : Lcd Bcd(temp_byte_1)

   ' Prüfen ob aktuell eingestellter Helligkeitswert verschoben werden muss
   ' => ggf. Ausgabe eines Sternchens!

   ' Prüfen ob Verschiebung bei unterer Grenze?
   If Dim_helligkeitsstufe < Dim_helligkeit_min Then
      ' eingestellte Helligkeit auf untere Grenze setzen
      Dim_helligkeitsstufe = Dim_helligkeit_min
      ' Stern zur Kennzeichnug ausgeben
      Locate 2 , 16 : Lcd "*"
   End If                                                   ' Helligkeitsstufen

Return
'-- End Menue_men812111 -------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men81221 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men81221:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men81221"
   #endif                                                   ' Trace

   ' Dimmer obere Grenze ausgeben
   ' Wertebereich 01-32

   Temp_byte_1 = Makebcd(dim_helligkeit_max)
   Locate 2 , 8 : Lcd Bcd(temp_byte_1)

Return
'-- End Menue_men81221 --------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men812211 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men812211:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men812211"
   #endif                                                   ' Trace

   ' Dimmer obere Grenze berechnen und neu ausgeben
   ' Wertebereich 01-32 aber gegen untere Grenze verriegelt.

   Menue_data_changed_flag = True

   ' Tasten auswerten welche betätigt wurden
   Select Case Key_taste_buffer

      Case 12:
         ' hoch = erhöhen
         If Dim_helligkeit_max < Dim_helligkeit_set_max Then
            Incr Dim_helligkeit_max
         End If                                             ' Helligkeitsstufe

      Case 42:
         ' runter = erniedrigen
         Temp_byte_1 = Dim_helligkeit_min + 1
         If Dim_helligkeit_max > Temp_byte_1 Then
            Decr Dim_helligkeit_max
         End If                                             ' Helligkeitsstufe

      Case 44:
         'rechts = erhöhen und bei null anfangen
         Incr Dim_helligkeit_max
         If Dim_helligkeit_max > Dim_helligkeit_set_max Then
            Dim_helligkeit_max = Dim_helligkeit_min + 1
         End If                                             ' Helligkeitsstufe

   End Select                                               ' Tastenauswertung

   ' Neuen Helligkeitswert ausgeben
   Temp_byte_1 = Makebcd(dim_helligkeit_max)
   Locate 2 , 8 : Lcd Bcd(temp_byte_1)

   ' Prüfen ob aktuell eingestellter Helligkeitswert verschoben werden muss
   ' => ggf. Ausgabe eines Sternchens!

   ' Prüfen ob Verschiebung bei oberer Grenze?
   If Dim_helligkeitsstufe > Dim_helligkeit_max Then
      ' eingestellte Helligkeit auf obere Grenze setzen
      Dim_helligkeitsstufe = Dim_helligkeit_max
      ' Stern zur Kennzeichnug ausgeben
      Locate 2 , 16 : Lcd "*"
   End If                                                   ' Helligkeitsstufe

Return
'-- End Menue_men812211 -------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men82 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men82:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men82"
   #endif                                                   ' Trace

   ' Ggf. Tastatureinstellungen in EEPROM zurückspeichern

   If Menue_data_changed_flag = True Then

      ' Änderungsflag zurücksetzen
      Menue_data_changed_flag = False

      ' Einstellungen aus Tastatur-Menü in EEPROM schreiben
      Ee_data_conv_hotkey = Key_shortcut_status

      ' Speicherung durch EE auf Display anzeigen
      Locate 3 , 8 : Lcd "EE"

   End If                                                   ' Daten verändert?

Return
'-- End Menue_men82 -----------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men8211 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men8211:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men8211"
   #endif                                                   ' Trace

   ' Status Enter ShortCut ausgeben
   ' Wertebereich EIN/AUS

   Locate 2 , 8
   Select Case Key_shortcut_status
      Case Aktiv:
         Lcd "AN"
      Case Passiv:
         Lcd "AUS"
   End Select                                               ' Short_Cut aktiv?

Return
'-- End Menue_men8211 ---------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men82111 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men82111:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men82111"
   #endif                                                   ' Trace

   ' Status Enter ShortCut umschalten und Status ausgeben
   ' Wertebereich EIN/AUS

   Menue_data_changed_flag = True

   Locate 2 , 8
   Select Case Key_shortcut_status
      Case Aktiv:
         Key_shortcut_status = Passiv
         Lcd "AUS"
      Case Passiv:
         Key_shortcut_status = Aktiv
         Lcd "AN"
   End Select                                               ' Short-Cut aktiv?

Return
'-- End Menue_men82111 --------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men83 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men83:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men83"
   #endif                                                   ' Trace

   ' Ggf. Displayeinstellungen in EEPROM zurückspeichern

   If Menue_data_changed_flag = True Then

      ' Änderungsflag zurücksetzen
      Menue_data_changed_flag = False

      ' Einstellungen aus Display-Menü in EEPROM schreiben
      Ee_data_lcd_helligkeit = Lcd_helligkeit
      Ee_data_lcd_kontrast = Lcd_kontrastwert
      Ee_data_lcd_saver = Lcd_screensaver

      ' Speicherung durch EE auf Display anzeigen
      Locate 3 , 8 : Lcd "EE"

   End If                                                   ' Daten verändert?

Return
'-- End Menue_men83 -----------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men8311 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men8311:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men8311"
   #endif                                                   ' Trace

   ' Status ScreenSaver ausgeben
   ' Wertebereich EIN/AUS

   Locate 2 , 8
   Select Case Lcd_screensaver
      Case True:
         Lcd "AN"
      Case False:
         Lcd "AUS"
   End Select                                               ' Screensaver aktiv?

Return
'-- End Menue_men8311 --------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men83111 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men83111:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men83111"
   #endif                                                   ' Trace

   ' Status ScreenSaver umschalten und ausgeben
   ' Wertebereich EIN/AUS

   Menue_data_changed_flag = True

   Locate 2 , 8
   Select Case Lcd_screensaver

      Case True:
         Lcd_screensaver = False
         Lcd "AUS"
         Lcd_screensaver_aktiv = False

         ' Ggf. Trace ausgeben
         #if Screensaver_testmodus                          ' Trace
            Print #2 , "Screensaver ausgeschaltet"
         #endif                                             ' Trace

      Case False:
         Lcd_screensaver = True
         Lcd "AN"
         Lcd_screensaver_counter = Sectic_count + Lcd_screensaver_delay

         ' Ggf. Trace ausgeben
         #if Screensaver_testmodus                          ' Trace
            Print #2 , "Screensaver eingeschaltet"
         #endif                                             ' Trace

   End Select                                               ' Screensaver aktiv

Return
'-- End Menue_men83111 -------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men8321 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men8321:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men8321"
   #endif                                                   ' Trace

   ' Eingestellter Kontrast für LCD-Display ausgeben
   ' Wertebereich 00-64

   ' Kontrast auf Display ausgeben
   Temp_byte_1 = Makebcd(lcd_kontrastwert)
   Locate 2 , 8 : Lcd Bcd(temp_byte_1)

Return
'-- End Menue_men8321 --------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men83211 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men83211:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men83211"
   #endif                                                   ' Trace

   ' Eingestellter Kontrast für LCD-Display ändern und ausgeben
   ' Wertebereich 00-64

   Menue_data_changed_flag = True

   ' Tasten auswerten welche betätigt wurden
   Select Case Key_taste_buffer

      Case 12:
         ' hoch = erhöhen
         If Lcd_kontrastwert < Lcd_kontrast_max Then
            Incr Lcd_kontrastwert
         End If                                             ' Kontrastwert

      Case 42:
         ' runter = erniedrigen
         If Lcd_kontrastwert > Lcd_kontrast_min Then
            Decr Lcd_kontrastwert
         End If                                             ' Kontrastwert

      Case 44:
         'rechts = erhöhen und bei null anfangen
         Incr Lcd_kontrastwert
         If Lcd_kontrastwert > Lcd_kontrast_max Then
            Lcd_kontrastwert = Lcd_kontrast_min
         End If                                             ' Kontrastwert

   End Select                                               ' Tastenauswertung

   ' Kontrast neu setzen
   Gosub Lcd_kontrastset

   ' Kontrast auf Display ausgeben
   Temp_byte_1 = Makebcd(lcd_kontrastwert)
   Locate 2 , 8 : Lcd Bcd(temp_byte_1)

Return
'-- End Menue_men83211 -------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men8331 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men8331:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men8331"
   #endif                                                   ' Trace

   ' Eingestellte Helligkeit für LCD-Display ausgeben
   ' Wertebereich 000-255

   ' Helligkeit des Display aisgeben
   Temp_string_1 = Byte2string(lcd_helligkeit , &H30 )      ' String mit 0 auffüllen
   Locate 2 , 8 : Lcd Temp_string_1

Return
'-- End Menue_men8331 --------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men83311 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men83311:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men83311"
   #endif                                                   ' Trace

   ' Eingestellte Helligkeit für LCD-Display ändern ausgeben
   ' Wertebereich 000-255

   Menue_data_changed_flag = True

   ' Tasten auswerten welche betätigt wurden
   Select Case Key_taste_buffer

      Case 12:
         ' hoch = heller
         If Lcd_pwmwert > Lcd_helligkeit_min Then
            Lcd_pwmwert = Lcd_pwmwert - Lcd_schrittweite_helligkeit
         End If                                             ' LCD Helligkeit

      Case 42:
         ' runter = dunkler
         If Lcd_pwmwert < Lcd_helligkeit_max Then
            Lcd_pwmwert = Lcd_pwmwert + Lcd_schrittweite_helligkeit
         End If                                             ' LCD-Helligkeit

      Case 44:
         'rechts = heller und bei null anfangen
         If Lcd_pwmwert > Lcd_helligkeit_min Then
            Lcd_pwmwert = Lcd_pwmwert - Lcd_schrittweite_helligkeit
         Else                                               ' LCD-Helligkeit
            Lcd_pwmwert = Lcd_helligkeit_max
         End If                                             ' LCD-Helligkeit

   End Select                                               ' Tastenauswertung

   ' PWM-Wert in Timerregister laden
   Pwm3a = Lcd_pwmwert
   Lcd_helligkeit = 255 - Lcd_pwmwert

   ' Helligkeit des Display aisgeben
   Temp_string_1 = Byte2string(lcd_helligkeit , &H30 )      ' String mit 0 auffüllen
   Locate 2 , 8 : Lcd Temp_string_1

Return
'-- End Menue_men83311 -------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men84 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men84:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men84"
   #endif                                                   ' Trace

   ' Ggf. Lüftereinstellungen in EEPROM zurückspeichern

   If Menue_data_changed_flag = True Then

      ' Änderungsflag zurücksetzen
      Menue_data_changed_flag = False

      ' Einstellungen aus Lüftermenu in EEPROM schreiben
      Ee_data_fan = Fan_sw_betrieb
      Ee_data_fan_25_temp = Fan_25_temperatur
      Ee_data_fan_50_temp = Fan_50_temperatur
      Ee_data_fan_75_temp = Fan_75_temperatur
      Ee_data_fan_100_temp = Fan_100_temperatur

      ' Speicherung durch EE auf Display anzeigen
      Locate 3 , 8 : Lcd "EE"

   End If                                                   ' Daten geändert?

Return
'-- End Menue_men84 -----------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men8411 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men8411:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men8411"
   #endif                                                   ' Trace

   ' Status Lüfter Betriebsmodus ausgeben
   ' Wertebereich AN / AUS

   Locate 2 , 8

   Select Case Fan_sw_betrieb
      Case True:
         Lcd "AN"
      Case False:
         Lcd "AUS"
   End Select                                               ' Lüfterbetrieb?

Return
'-- End Menue_men8411 ---------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men84111 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men84111:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men84111"
   #endif                                                   ' Trace

   ' Status Lüfter Betriebsmodus umschalten und ausgeben
   ' Wertebereich AN / AUS

   Menue_data_changed_flag = True

   Locate 2 , 8
   Select Case Fan_sw_betrieb

      Case True:
         Fan_sw_betrieb = False
         Lcd "AUS"
         ' Auf jeden Fall PWM-Wert auf AUS setzen!
         Call Fan_set_geschwindigkeit(fan_belueftung_aus)

      Case False:
         Fan_sw_betrieb = True
         Lcd "AN"

   End Select                                               ' Lüfterbetrieb?

Return
'-- End Menue_men84111 --------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men8421 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men8421:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men8421"
   #endif                                                   ' Trace

   ' Temperatureinstellung für Lüfter 25% ausgeben
   ' Wertebereich 0 bis 100 °C

   ' Temperatur ausgeben
   Locate 2 , 7
   Temp_byte_1 = Makebcd(fan_25_temperatur)
   Lcd Bcd(temp_byte_1) ; "{223}C"

Return
'-- End Menue_men8421 ---------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men84211 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men84211:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men84211"
   #endif                                                   ' Trace

   ' Temperatureinstellung für Lüfter 25% verändern, auf Grenzen prüfen und
   ' ausgeben. Wertebereich 0 bis 100 °C

   Menue_data_changed_flag = True

   ' Tasten auswerten welche betätigt wurden
   Temp_byte_1 = Fan_50_temperatur - 1

   Select Case Key_taste_buffer

      Case 12:
         ' hoch = erhöhen
         If Fan_25_temperatur < Temp_byte_1 Then
            Incr Fan_25_temperatur
         End If                                             ' Temperatur 25%

      Case 42:
         ' runter = erniedrigen
         If Fan_25_temperatur > Fan_min_temp Then
            Decr Fan_25_temperatur
         End If                                             ' Temperatur 25%

      Case 44:
         'rechts = erhöhen und bei null anfangen
         Incr Fan_25_temperatur
         If Fan_25_temperatur > Temp_byte_1 Then
            Fan_25_temperatur = Fan_min_temp
         End If                                             ' Temperatur 25%

   End Select                                               ' Tastenauswertung

   ' Temperatur ausgeben
   Locate 2 , 7
   Temp_byte_1 = Makebcd(fan_25_temperatur)
   Lcd Bcd(temp_byte_1) ; "{223}C"

Return
'-- End Menue_men84211 --------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men8431 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men8431:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men8431"
   #endif                                                   ' Trace

   ' Temperatureinstellung für Lüfter 50% ausgeben
   ' Wertebereich 0 bis 100 °C

   ' Temperatur ausgeben
   Locate 2 , 7
   Temp_byte_1 = Makebcd(fan_50_temperatur)
   Lcd Bcd(temp_byte_1) ; "{223}C"

Return
'-- End Menue_men8431 ---------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men84311 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men84311:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men84311"
   #endif                                                   ' Trace

   ' Temperatureinstellung für Lüfter 50% verändern, auf Grenzen prüfen und
   ' ausgeben. Wertebereich 0 bis 100 °C

   Menue_data_changed_flag = True

   ' Tasten auswerten welche betätigt wurden
   Temp_byte_1 = Fan_25_temperatur + 1
   Temp_byte_2 = Fan_75_temperatur - 1

   Select Case Key_taste_buffer

      Case 12:
         ' hoch = erhöhen
         If Fan_50_temperatur < Temp_byte_2 Then
            Incr Fan_50_temperatur
         End If                                             ' Temperatur 50%

      Case 42:
         ' runter = erniedrigen
         If Fan_50_temperatur > Temp_byte_1 Then
            Decr Fan_50_temperatur
         End If                                             ' Temperatur 50%

      Case 44:
         'rechts = erhöhen und bei null anfangen
         Incr Fan_50_temperatur
         If Fan_50_temperatur > Temp_byte_2 Then
            Fan_50_temperatur = Temp_byte_1
         End If                                             ' Temperatur 50%

   End Select                                               ' Tastenauswertung

   ' Temperatur ausgeben
   Locate 2 , 7
   Temp_byte_1 = Makebcd(fan_50_temperatur)
   Lcd Bcd(temp_byte_1) ; "{223}C"

Return
'-- End Menue_men84311 --------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men8441 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men8441:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men8441"
   #endif                                                   ' Trace

   ' Temperatureinstellung für Lüfter 75% ausgeben
   ' Wertebereich 0 bis 100 °C

   ' Temperatur ausgeben
   Locate 2 , 7
   Temp_byte_1 = Makebcd(fan_75_temperatur)
   Lcd Bcd(temp_byte_1) ; "{223}C"

Return
'-- End Menue_men8441 ---------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men84411 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men84411:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men84411"
   #endif                                                   ' Trace

   ' Temperatureinstellung für Lüfter 75% verändern, auf Grenzen prüfen und
   ' ausgeben. Wertebereich 0 bis 100 °C

   Menue_data_changed_flag = True

   ' Tasten auswerten welche betätigt wurden
   Temp_byte_1 = Fan_50_temperatur + 1
   Temp_byte_2 = Fan_100_temperatur - 1

   Select Case Key_taste_buffer

      Case 12:
         ' hoch = erhöhen
         If Fan_75_temperatur < Temp_byte_2 Then
            Incr Fan_75_temperatur
         End If                                             ' Temperatur 75%

      Case 42:
         ' runter = erniedrigen
         If Fan_75_temperatur > Temp_byte_1 Then
            Decr Fan_75_temperatur
         End If                                             ' Temperatur 75%

      Case 44:
         'rechts = erhöhen und bei null anfangen
         Incr Fan_75_temperatur
         If Fan_75_temperatur > Temp_byte_2 Then
            Fan_75_temperatur = Temp_byte_1
         End If                                             ' Temperatur 75%

   End Select                                               ' Tastenauswertung

   ' Temperatur ausgeben
   Locate 2 , 7
   Temp_byte_1 = Makebcd(fan_75_temperatur)
   Lcd Bcd(temp_byte_1) ; "{223}C"

Return
'-- End Menue_men84411 --------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men8451 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men8451:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men8451"
   #endif                                                   ' Trace

   ' Temperatureinstellung für Lüfter 100% ausgeben
   ' Wertebereich 0 bis 100 °C

   ' Temperatur ausgeben
   Locate 2 , 7
   Temp_byte_1 = Makebcd(fan_100_temperatur)
   Lcd Bcd(temp_byte_1) ; "{223}C"

Return
'-- End Menue_men8451 ---------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men84511 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men84511:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men84511"
   #endif                                                   ' Trace

   ' Temperatureinstellung für Lüfter 100% verändern, auf Grenzen prüfen und
   ' ausgeben. Wertebereich 0 bis 100 °C

   Menue_data_changed_flag = True

   ' Tasten auswerten welche betätigt wurden
   Temp_byte_1 = Fan_75_temperatur + 1

   Select Case Key_taste_buffer

      Case 12:
         ' hoch = erhöhen
         If Fan_100_temperatur < Fan_max_temp Then
            Incr Fan_100_temperatur
         End If                                             ' Temperatur 100%

      Case 42:
         ' runter = erniedrigen
         If Fan_100_temperatur > Temp_byte_1 Then
            Decr Fan_100_temperatur
         End If                                             ' Temperatur 100%

      Case 44:
         'rechts = erhöhen und bei null anfangen
         Incr Fan_100_temperatur
         If Fan_100_temperatur > Fan_max_temp Then
            Fan_100_temperatur = Temp_byte_1
         End If                                             ' Temperatur 100%

   End Select                                               ' Tastenauswertung

   ' Temperatur ausgeben
   Locate 2 , 7
   Temp_byte_1 = Makebcd(fan_100_temperatur)
   Lcd Bcd(temp_byte_1) ; "{223}C"

Return
'-- End Menue_men84511 --------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men85 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men85:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men85"
   #endif                                                   ' Trace

   ' Ggf. Windeinstellungen in EEPROM zurückspeichern

   If Menue_data_changed_flag = True Then

      ' Änderungsflag zurücksetzen
      Menue_data_changed_flag = False

      ' Einstellungen aus Windmenü in EEPROM schreiben
      Ee_data_wind_intervall = Wind_auswertung
      Ee_data_wind_speed = Wind_beschattung_auf

      ' Speicherung durch EE auf Display anzeigen
      Locate 3 , 8 : Lcd "EE"

   End If                                                   ' Daten geändert?

Return
'-- End Menue_men85 -----------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men8511 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men8511:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men8511"
   #endif                                                   ' Trace

   ' Einstellung Windgeschwindigkeit für automatisches Auffahren ausgeben
   ' Wertebereich 1-50 km/h

   ' Windgeschwindigkeit bei der die Beschattung automatisch geöffnet wird ausgeben
   Temp_byte_1 = Makebcd(wind_beschattung_auf)
   Locate 2 , 5 : Lcd ">" ; Bcd(temp_byte_1) ; " km/h"

Return
'-- End Menue_men8511 ---------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men85111 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men85111:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men85111"
   #endif                                                   ' Trace

   ' Einstellung Windgeschwindigkeit für automatisches Auffahren eingeben
   ' und ausgeben. Wertebereich 1-50 km/h

   Menue_data_changed_flag = True

   Select Case Key_taste_buffer

      Case 12:
         ' hoch = erhöhen
         If Wind_beschattung_auf < Wind_beschattung_max Then
            Incr Wind_beschattung_auf
         End If                                             ' Windgeschwindigkeit

      Case 42:
         ' runter = erniedrigen
         If Wind_beschattung_auf > Wind_beschattung_min Then
            Decr Wind_beschattung_auf
         End If                                             ' Windgeschwindigkeit

      Case 44:
         'rechts = erhöhen und bei null anfangen
         Incr Wind_beschattung_auf
         If Wind_beschattung_auf > Wind_beschattung_max Then
            Wind_beschattung_auf = Wind_beschattung_min
         End If                                             ' Windgeschwindigkeit

   End Select                                               ' Tastenauswertung

   ' Windgeschwindigkeit bei der die Beschattung automatisch geöffnet wird ausgeben
   Temp_byte_1 = Makebcd(wind_beschattung_auf)
   Locate 2 , 5 : Lcd ">" ; Bcd(temp_byte_1) ; " km/h"

Return
'-- End Menue_men85111 --------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men8521 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men8521:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men8521"
   #endif                                                   ' Trace

   ' Einstellung Messintervall für Windgeschwindigkeit ausgeben.
   ' Wertebereich 1 bis 30 Sekunden.

   ' Messintervall für Windgeschwindigkeit ausgeben
   Temp_byte_1 = Makebcd(wind_auswertung)
   Locate 2 , 6 : Lcd Bcd(temp_byte_1) ; " sec"

Return
'-- End Menue_men8521 ---------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men85211 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men85211:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men85211"
   #endif                                                   ' Trace

   ' Einstellung Messintervall für Windgeschwindigkeit verändern und ausgeben.
   ' Wertebereich 1 bis 30 Sekunden.

   Menue_data_changed_flag = True

   Select Case Key_taste_buffer

      Case 12:
         ' hoch = erhöhen
         If Wind_auswertung < Wind_auswertung_max Then
            Incr Wind_auswertung
         End If                                             ' Windgeschwindigkeit

      Case 42:
         ' runter = erniedrigen
         If Wind_auswertung > Wind_auswertung_min Then
            Decr Wind_auswertung
         End If                                             ' Windgeschwindigkeit

      Case 44:
         'rechts = erhöhen und bei null anfangen
         Incr Wind_auswertung
         If Wind_auswertung > Wind_auswertung_max Then
            Wind_auswertung = Wind_auswertung_min
         End If                                             ' Windgeschwindigkeit

   End Select                                               ' Tastenauswertung

   ' Messintervall für Windgeschwindigkeit ausgeben
   Temp_byte_1 = Makebcd(wind_auswertung)
   Locate 2 , 6 : Lcd Bcd(temp_byte_1) ; " sec"

Return
'-- End Menue_men85211 --------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men86 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men86:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men86"
   #endif                                                   ' Trace

   ' Ggf. Temperatureinstellungen in EEPROM zurückspeichern

   If Menue_data_changed_flag = True Then

      ' Änderungsflag zurücksetzen
      Menue_data_changed_flag = False

      ' Einstellungen aus Temperaturmenü in EEPROM schreiben
      Ee_data_temp_intervall = Sht71_auswertung

      ' Speicherung durch EE auf Display anzeigen
      Locate 3 , 8 : Lcd "EE"

   End If                                                   ' Daten geändert?

Return
'-- End Menue_men86 -----------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men8611 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men8611:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men8611"
   #endif                                                   ' Trace

   ' Einstellung Messintervall für Temperaturmessungen ausgeben.
   ' Wertebereich 1 bis 30 Sekunden.

   ' Auswerteintervall für Temperatur und Luftfeuchtigkeit ausgeben
   Temp_byte_1 = Makebcd(sht71_auswertung)
   Locate 2 , 6 : Lcd Bcd(temp_byte_1) ; " sec"

Return
'-- End Menue_men8611 ---------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men86111 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men86111:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men86111"
   #endif                                                   ' Trace

   ' Einstellung Messintervall für Temperaturmessungen verändern und ausgeben.
   ' Wertebereich 1 bis 30 Sekunden.

   Menue_data_changed_flag = True

   Select Case Key_taste_buffer

      Case 12:
         ' hoch = erhöhen
         If Sht71_auswertung < Sht71_auswertung_max Then
            Incr Sht71_auswertung
         End If                                             ' Auswerteintervall

      Case 42:
         ' runter = erniedrigen
         If Sht71_auswertung > Sht71_auswertung_min Then
            Decr Sht71_auswertung
         End If                                             ' Auswerteintervall

      Case 44:
         'rechts = erhöhen und bei null anfangen
         Incr Sht71_auswertung
         If Sht71_auswertung > Sht71_auswertung_max Then
            Sht71_auswertung = Sht71_auswertung_min
         End If                                             ' Auswerteintervall

   End Select                                               ' Tastenauswertung

   ' Auswerteintervall für Temperatur und Luftfeuchtigkeit ausgeben
   Temp_byte_1 = Makebcd(sht71_auswertung)
   Locate 2 , 6 : Lcd Bcd(temp_byte_1) ; " sec"

Return
'-- End Menue_men86111 --------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men87 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men87:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men87"
   #endif                                                   ' Trace

   ' Ggf. Signaltoneinstellungen in EEPROM zurückspeichern

   If Menue_data_changed_flag = True Then

      ' Änderungsflag zurücksetzen
      Menue_data_changed_flag = False

      ' Änderungen aus Signaltonmenü in EEPROM schreiben
      Ee_data_sound = Sound_flag

      ' Speicherung durch EE auf Display anzeigen
      Locate 3 , 8 : Lcd "EE"

   End If                                                   ' Daten geändert?

Return
'-- End Menue_men87 -----------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men8711 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men8711:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men8711"
   #endif                                                   ' Trace

   ' Einstellung Signaltöne ausgeben.
   ' Wertebereich AN/AUS.

   Locate 2 , 8

   Select Case Sound_flag
      Case True:
         Lcd "AN"
      Case False:
         Lcd "AUS"
   End Select                                               ' Soundausgabe?

Return
'-- End Menue_men8711 ---------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men87111 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men87111:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men87111"
   #endif                                                   ' Trace

   ' Einstellung Signaltöne verändern und ausgeben.
   ' Wertebereich AN/AUS.

   Menue_data_changed_flag = True

   Locate 2 , 8
   Select Case Sound_flag
      Case True:
         Sound_flag = False
         Lcd "AUS"
      Case False:
         Sound_flag = True
         Lcd "An"
   End Select                                               ' Soundausgabe

Return
'-- End Menue_men87111 --------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men88 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men88:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men88"
   #endif                                                   ' Trace

   ' Ggf. zeitliche Überwachung von Menue MEN881 abschalten

   ' Flag für zeitlich upzudatendes Menue setzen
   Menue_insensmenue_flag = 0

Return
'-- End Menue_men88 -----------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men881 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men881:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men881"
   #endif                                                   ' Trace

   ' Ggf. zeitliche Überwachung von Menue MEN881 abschalten

   ' ggf. Zeitwerte aus Unterfunktion übernehmen
   If Menue_datenuebernahme_flag = True Then

      ' Flag zurücksetzen
      Menue_datenuebernahme_flag = False

      ' Daten üebernehmen
      _sec = Menue_time_sekunde                             ' Interne Sekundenvariable der SoftClock
      _min = Menue_time_minute                              ' Interne Minutenvariable der SoftClock
      _hour = Menue_time_stunde                             ' Interne Stundenvariable der Softclock

   End If                                                   ' Datenübernahme

Return
'-- End Menue_men881 ----------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men8811 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men8811:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men8811"
   #endif                                                   ' Trace

   ' Einstellen der Uhrzeit vorbereiten und relevante Variablen laden

   ' Uhrzeit laden wurde von Menü MEN881 aufgerufen. Es geht hier um Systemzeit

   ' Hilfvariablen für Time-Menü laden

   Menue_time_sekunde = _sec                                ' Interne Sekundenvariable der SoftClock
   Menue_time_minute = _min                                 ' Interne Minutenvariable der SoftClock
   Menue_time_stunde = _hour                                ' Interne Stundenvariable der Softclock

   ' Rücksprung-Ziel festlegen
   Menue_state_buffer = Loadlabel(men881)                   ' Uhrzeit einstellen Menü 8-8-1

   ' Menü neu laden und einspringen
   Menue_state = Loadlabel(time1)                           ' Einsprung in erstes Einstellfenster
   Gosub Menue_change_state_by_sub
   Gosub Lcd_print
   Menue_state_renew = 0
   Gosub Menue_time1                                        ' zugehörige Unterfunktiona anspringen

Return
'-- End Menue_men8811 ----------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men882 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men882:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men882"
   #endif                                                   ' Trace

   ' Einstellen des Datum vorbereiten und relevante Variablen laden

   ' ggf. Datumswerte aus Unterfunktion übernehmen
   If Menue_datenuebernahme_flag = True Then

      ' Flag zurücksetzen
      Menue_datenuebernahme_flag = False

      ' Daten üebernehmen
      _day = Menue_date_tag                                 ' Interne Tagvariable der SoftClock
      _month = Menue_date_monat                             ' Interne Monatsvariable der SoftClock
      _year = Menue_date_jahr                               ' Interne Jahresvariable der Softclock

   End If                                                   ' Datenübernahme

Return
'-- End Menue_men882 ----------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men8821 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men8821:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men8821"
   #endif                                                   ' Trace

   ' Einstellen des Datums vorbereiten und relevante Variablen laden

   ' Datum laden wurde von Menü MEN882 aufgerufen. Es geht hier um Systemzeit

   ' Hilfvariablen für Time-Menü laden

   Menue_date_tag = _day                                    ' Interne Tagvariable der SoftClock
   Menue_date_monat = _month                                ' Interne Monatsvariable der SoftClock
   Menue_date_jahr = _year                                  ' Interne Jahresvariable der Softclock

   ' Rücksprung-Ziel festlegen
   Menue_state_buffer = Loadlabel(men882)                   ' Datum einstellen Menü 8-8-2

   ' Menü neu laden und einspringen
   Menue_state = Loadlabel(date1)                           ' Einsprung in erstes Einstellfenster
   Gosub Menue_change_state_by_sub
   Gosub Lcd_print
   Menue_state_renew = 0
   Gosub Menue_date1                                        ' zugehörige Unterfunktiona anspringen

Return
'-- End Menue_men8821 ----------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men883 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men883:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men883"
   #endif                                                   ' Trace

   ' ggf. zyklisches Updta der DCF77 Statusausgabe deaktivieren

   ' Flag für zeitlich upzudatendes Menue setzen
   Menue_insensmenue_flag = 0

Return
'-- End Menue_men883 ----------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men8831 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men8831:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men8831"
   #endif                                                   ' Trace

   ' DCF77 Statusbits ausgeben

   ' Flag für zeitlich upzudatendes Menue setzen
   Menue_insensmenue_flag = 7

   Temp_byte_1 = Makebcd(bdcf_impuls)
   Temp_byte_2 = Makebcd(bdcf_pause)

   ' Impuls und Pause ausgeben
   Locate 1 , 1
   Lcd "Imp: " ; Bcd(temp_byte_1) ; " " ; "Paus: " ; Bcd(temp_byte_2)

   Locate 2 , 1 : Lcd "Status:"
   Locate 2 , 9 : Lcd "Bits:"

   ' Statusbits und DCF-Bits auf LCD ausgeben
   Locate 3 , 1
   Lcd Bin(dcf_status)                                      ' Position 1 - 8
   Lcd Bin(dcf_bits)                                        ' Position 9 - 16

Return
'-- End Menue_men8831 ---------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men89 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men89:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men89"
   #endif                                                   ' Trace

   ' Ggf. Loggingeinstellungen in EEPROM zurückspeichern

   If Menue_data_changed_flag = True Then

      ' Änderungsflag zurücksetzen
      Menue_data_changed_flag = False

      ' Einstellungen aus Logging-Menü in EEPROM zurückschreiben
      Ee_data_logging_flag = Ee_datalogging_flag
      Ee_data_logging_intervall = Ee_auswertung

      ' Speicherung durch EE auf Display anzeigen
      Locate 3 , 8 : Lcd "EE"

   End If                                                   ' Datenübernahme

Return
'-- End Menue_men89 -----------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men8911 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men8911:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men8911"
   #endif                                                   ' Trace

   ' Betriebsmodus für Datenlogging ausgeben
   ' Wertebereich AN/AUS

   Locate 2 , 8

   Select Case Ee_datalogging_flag
      Case True:
         Lcd "AN"
      Case False:
         Lcd "AUS"
   End Select                                               ' Datenlogging

Return
'-- End Menue_men8911 ---------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men89111 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men89111:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men89111"
   #endif                                                   ' Trace

   ' Betriebsmodus für Datenlogging umschalten und ausgeben
   ' Wertebereich AN/AUS

   Menue_data_changed_flag = True

   Locate 2 , 8
   Select Case Ee_datalogging_flag
      Case True:
         Ee_datalogging_flag = False
         Lcd "AUS"
      Case False:
         Lcd "AN"
         Ee_datalogging_flag = True
         Ee_erfassungs_counter = Sectic_count + Ee_auswertung
   End Select                                               ' Datenlogging

Return
'-- End Menue_men89111 --------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men8921 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men8921:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men8921"
   #endif                                                   ' Trace

   ' Zeitintervall für Daten-Logging ausgeben
   ' Wertebereich 1 - 30 minuten

   Temp_word_1 = Ee_auswertung / 60                         ' Wert auf Minuten hochrechnen
   Temp_byte_1 = Temp_word_1

   ' Wenn Konstante gesetzt Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Ee_auswertung : " ; Ee_auswertung
      Print #2 , "Temp_word_1   : " ; Temp_word_1
      Print #2 , "Temp_byte_1   : " ; Temp_byte_1
   #endif                                                   ' Trace

   Temp_byte_1 = Makebcd(temp_byte_1)                       ' In BCD umformatieren
   Locate 2 , 6 : Lcd Bcd(temp_byte_1) ; " min"             ' Auf LCD ausgeben

Return
'-- End Menue_men8921 ---------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men89211 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men89211:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men89211"
   #endif                                                   ' Trace

   ' Zeitintervall für Daten-Logging verändern und ausgeben
   ' Wertebereich 1 - 30 minuten

   Menue_data_changed_flag = True

   Select Case Key_taste_buffer

      Case 12:
         ' hoch = erhöhen
         If Ee_auswertung < Ee_auswertung_max Then
            Ee_auswertung = Ee_auswertung + 60
         End If                                             ' Auswerteintervall

      Case 42:
         ' runter = erniedrigen
         If Ee_auswertung > Ee_auswertung_min Then
            Ee_auswertung = Ee_auswertung - 60
         End If                                             ' Auswerteintervall

      Case 44:
         'rechts = erhöhen und bei null anfangen
         Ee_auswertung = Ee_auswertung + 60
         If Ee_auswertung > Ee_auswertung_max Then
            Ee_auswertung = Ee_auswertung_min
         End If                                             ' Auswerteintervall

   End Select                                               ' Tastenauswertung

   Temp_word_1 = Ee_auswertung / 60                         ' Wert auf Minuten hochrechnen
   Temp_byte_1 = Temp_word_1

   ' Wenn Konstante gesetzt Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
     Print #2 , "Ee_auswertung : " ; Ee_auswertung
     Print #2 , "Temp_word_1   : " ; Temp_word_1
     Print #2 , "Temp_byte_1   : " ; Temp_byte_1
   #endif                                                   ' Trace

   Temp_byte_1 = Makebcd(temp_byte_1)                       ' In BCD umformatieren
   Locate 2 , 6 : Lcd Bcd(temp_byte_1) ; " min"             ' Auf LCD ausgeben

Return
'-- End Menue_men89211 --------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men8931 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men8931:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men8931"
   #endif                                                   ' Trace

   ' EEPROM mit Loggingdaten löschen und neu initialisieren

   ' Datenstruktur externes EEPROM entspricht nicht dem aktuellen Stand
   ' => Datenstruktur neu anlegen bzw. neue Defaultwerte setzen.

   Ee_data_count = Ee_data_count_default
   Ee_data_overrun = Ee_data_overrun_default

   Call Ee_write_eeprom_word(ee_data_count_adress , Ee_data_count_default)
   Waitms 10                                                'Wartezeit für sicheres Schreiben
   Call Ee_write_eeprom_byte(ee_data_overrun_adress , Ee_data_overrun_default)

   ' Datenlöschen durch 2xBeep signalisieren wenn Soundflag gesetzt
   If Sound_flag = True Then
      Call Sound_beep(sound_beep_time)                      ' Soubroutine Beep aufrufen
      Waitms 100                                            ' 100 ms warten
      Call Sound_beep(sound_beep_time)                      ' Soubroutine Beep aufrufen
   End If                                                   ' Soundflag

   ' Menü neu laden und einspringen
   Menue_state = Loadlabel(men893)                          ' Einsprung in erstes Einstellfenster
   Gosub Menue_change_state_by_sub

Return
'-- End Menue_men8931 ---------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men8a (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men8a:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men8a"
   #endif                                                   ' Trace

   ' Ggf. Beschattungseinstellungen in EEPROM zurückspeichern

   If Menue_data_changed_flag = True Then

      ' Änderungsflag zurücksetzen
      Menue_data_changed_flag = False

      ' Einstellungen aus Beschattungsmenü in EEPROM schreiben
      Ee_data_conv_timeout = Rel_beschattung_delay
      Ee_data_conv_temp_flag = Rel_zu_temp_flag
      Ee_data_conv_temperatur = Rel_zu_temperatur
      Ee_data_conv_light_flag = Rel_auf_dunkel_flag
      Ee_data_conv_lichtwert = Rel_auf_dunkelheit

      ' Speicherung durch EE auf Display anzeigen
      Locate 3 , 8 : Lcd "EE"

   End If                                                   ' Daten geändert?

Return
'-- End Menue_men8a -----------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men8a11 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men8a11:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men8a11"
   #endif                                                   ' Trace

   ' Beschattugstimeout ausgeben
   ' Wertebereich 1 bis 200 Sekunden

   ' String ausgeben
   Temp_string_1 = Byte2string(rel_beschattung_delay , &H30)       ' Mit 0 füllen
   Locate 2 , 5 : Lcd Temp_string_1 ; " sec"

Return
'-- End Menue_men8a11 ---------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men8a111 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men8a111:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men8a111"
   #endif                                                   ' Trace

   ' Beschattugstimeout verändern und ausgeben
   ' Wertebereich 1 bis 200 Sekunden

   Menue_data_changed_flag = True

   Select Case Key_taste_buffer

      Case 12:
         ' hoch = erhöhen
         If Rel_beschattung_delay < Rel_beschattung_max Then
            Incr Rel_beschattung_delay
         End If                                             ' Delayzeit

      Case 42:
         ' runter = erniedrigen
         If Rel_beschattung_delay > Rel_beschattung_min Then
            Decr Rel_beschattung_delay
         End If                                             ' Delayzeit

      Case 44:
         'rechts = erhöhen und bei null anfangen
         Incr Rel_beschattung_delay
         If Rel_beschattung_delay > Rel_beschattung_max Then
            Rel_beschattung_delay = Rel_beschattung_min
         End If                                             ' Delayzeit

   End Select                                               ' Tastenauswertung

   ' String ausgeben
   Temp_string_1 = Byte2string(rel_beschattung_delay , &H30)       ' Mit 0 füllen
   Locate 2 , 5 : Lcd Temp_string_1 ; " sec"

Return
'-- End Menue_men8a111 --------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men8a211 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men8a211:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men8a211"
   #endif                                                   ' Trace

   ' Status "Auffahren bei Dunkelheit" ausgeben
   ' Wertebereich JA/NEIN

   Locate 2 , 8

   Select Case Rel_auf_dunkel_flag
      Case True:
         Lcd "An"
      Case False:
         Lcd "Aus"
   End Select                                               ' Auffahren bei Dunkelheit?

Return
'-- End Menue_men8a211 --------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men8a2111 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men8a2111:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men8a2111"
   #endif                                                   ' Trace

   ' Status "Auffahren bei Dunkelheit" umschalten und ausgeben
   ' Wertebereich JA/NEIN

   Menue_data_changed_flag = True

   Locate 2 , 8
   Select Case Rel_auf_dunkel_flag
      Case True:
         Rel_auf_dunkel_flag = False
         Lcd "Aus"

         ' zyklisches Update deaktivieren
         Light_erfassung = False

      Case False:
         Rel_auf_dunkel_flag = True
         Lcd "An"

         ' Licht einmalig erfassen
         Light_value = Light_measurement(light_messwert_zahl )
         ' zyklisches Update aktivieren
         Light_erfassung = True
         ' Auswerteintervall setzen
         Light_erfassungs_counter = Sectic_count + Light_auswertung_default

   End Select                                               ' Auffahren bei Dunkelheit

Return
'-- End Menue_men8a2111 -------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men8a221 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men8a221:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men8a221"
   #endif                                                   ' Trace

   ' Grenzdunkelheit ausgeben
   ' Wertebereich 1 bis 15

   Temp_byte_1 = Makebcd(rel_auf_dunkelheit)
   Locate 2 , 8 : Lcd Bcd(temp_byte_1)

Return
'-- End Menue_men8a221 --------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men8a2111 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men8a2211:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men8a2211"
   #endif                                                   ' Trace

   ' Grenzdunkelheit ändern und ausgeben
   ' Wertebereich 1 bis 15

   Menue_data_changed_flag = True

   Select Case Key_taste_buffer

      Case 12:
         ' hoch = erhöhen
         If Rel_auf_dunkelheit < Rel_auf_dunkelheit_max Then
            Incr Rel_auf_dunkelheit
         End If                                             ' Dunkelheit

      Case 42:
         ' runter = erniedrigen
         If Rel_auf_dunkelheit > Rel_auf_dunkelheit_min Then
            Decr Rel_auf_dunkelheit
         End If                                             ' Dunkelheit

      Case 44:
         'rechts = erhöhen und bei null anfangen
         Incr Rel_auf_dunkelheit
         If Rel_auf_dunkelheit > Rel_auf_dunkelheit_max Then
            Rel_auf_dunkelheit = Rel_auf_dunkelheit_min
         End If                                             ' Dunkelheit

   End Select                                               ' Tastenauswertung

   Temp_byte_1 = Makebcd(rel_auf_dunkelheit)
   Locate 2 , 8 : Lcd Bcd(temp_byte_1)

Return
'-- End Menue_men8a2211 -------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men8a311 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men8a311:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men8a311"
   #endif                                                   ' Trace

   ' Status "Zufahren bei Temperatur" ausgeben
   ' Wertebereich JA/NEIN

   Locate 2 , 8

   Select Case Rel_zu_temp_flag
      Case True:
         Lcd "An"
      Case False:
         Lcd "Aus"
   End Select                                               ' Zufahren bei Temperatur

Return
'-- End Menue_men8a311 --------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men8a3111 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men8a3111:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men8a3111"
   #endif                                                   ' Trace

   ' Status "Zufahren bei Temperatur" ändern und ausgeben
   ' Wertebereich JA/NEIN

   Menue_data_changed_flag = True

   Locate 2 , 8
   Select Case Rel_zu_temp_flag
      Case True:
         Rel_zu_temp_flag = False
         Lcd "Aus"
      Case False:
         Rel_zu_temp_flag = True
         Lcd "An"
   End Select                                               ' Zufahren bei Temperatur

Return
'-- End Menue_men8a3111 -------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men8a321 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men8a321:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men8a321"
   #endif                                                   ' Trace

   ' Grenztemperatur ausgeben
   ' Wertebereich 1 bis 99°C

   Temp_byte_1 = Makebcd(rel_zu_temperatur)
   Locate 2 , 8 : Lcd Bcd(temp_byte_1)

Return
'-- End Menue_men8a321 --------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men8a3211 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men8a3211:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men8a3211"
   #endif                                                   ' Trace

   ' Grenztemperatur ändern und ausgeben
   ' Wertebereich 1 bis 99°C

   Menue_data_changed_flag = True

   Select Case Key_taste_buffer

      Case 12:
         ' hoch = erhöhen
         If Rel_zu_temperatur < Rel_zu_temperatur_max Then
            Incr Rel_zu_temperatur
         End If                                             ' Temperatur

      Case 42:
         ' runter = erniedrigen
         If Rel_zu_temperatur > Rel_zu_temperatur_min Then
            Decr Rel_zu_temperatur
         End If                                             ' Temperatur

      Case 44:
         'rechts = erhöhen und bei null anfangen
         Incr Rel_zu_temperatur
         If Rel_zu_temperatur > Rel_zu_temperatur_max Then
            Rel_zu_temperatur = Rel_zu_temperatur_min
         End If                                             ' Temperatur

   End Select

   Temp_byte_1 = Makebcd(rel_zu_temperatur)
   Locate 2 , 8 : Lcd Bcd(temp_byte_1)

Return
'-- End Menue_men8a3211 -------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_men8b11 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_men8b11:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_men8b11"
   #endif                                                   ' Trace

   ' Min- und Maxwerte in globalen Variablen löschen
   Sht71_t_min = 0.0
   Sht71_t_max = 0.0

   Sht71_rhtrue_min = 0.0
   Sht71_rhtrue_max = 0.0

   Wind_kmh_max = 0.0

   ' Min- und Maxwerte in internem EEPROM löschen
   Ee_data_sht71_t_min = 0.0
   Ee_data_sht71_t_max = 0.0

   Ee_data_sht71_rhtrue_min = 0.0
   Ee_data_sht71_rhtrue_max = 0.0

   Ee_data_wind_kmh_max = 0.0

   ' Datenlöschen durch 2xBeep signalisieren wenn Soundflag gesetzt
   If Sound_flag = True Then
      Call Sound_beep(sound_beep_time)                      ' Soubroutine Beep aufrufen
      Waitms 100                                            ' 100 ms warten
      Call Sound_beep(sound_beep_time)                      ' Soubroutine Beep aufrufen
   End If                                                   ' Soundausgabe

   ' Menü neu laden und einspringen
   Menue_state = Loadlabel(men8b1)                          ' Einsprung in erstes Einstellfenster
   Gosub Menue_change_state_by_sub

Return
'-- End Menue_men8b11 ---------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_time1 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_time1:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_time1"
   #endif                                                   ' Trace

   ' Stunden ausgeben

   ' Zeitstring mit ":" aufbauen
   Temp_string_1 = Time2string(menue_time_stunde , Menue_time_minute , Menue_time_sekunde , &H3A)
   ' Zeitstring ausgeben
   Locate 3 , 9 : Lcd Temp_string_1

Return
'-- End Menue_time1 -----------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_time11 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_time11:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_time11"
   #endif                                                   ' Trace

   ' Stunden erhöhen und ausgeben

   Incr Menue_time_stunde
   If Menue_time_stunde > 23 Then Menue_time_stunde = 0

   ' Zeitstring mit ":" aufbauen
   Temp_string_1 = Time2string(menue_time_stunde , Menue_time_minute , Menue_time_sekunde , &H3A)
   ' Zeitstring ausgeben
   Locate 3 , 9 : Lcd Temp_string_1

Return
'-- End Menue_time11 ----------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_time12 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_time12:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_time12"
   #endif                                                   ' Trace

   ' Stunden verringern und ausgeben

   Decr Menue_time_stunde
   If Menue_time_stunde = 255 Then Menue_time_stunde = 23

   ' Zeitstring mit ":" aufbauen
   Temp_string_1 = Time2string(menue_time_stunde , Menue_time_minute , Menue_time_sekunde , &H3A)
   ' Zeitstring ausgeben
   Locate 3 , 9 : Lcd Temp_string_1

Return
'-- End Menue_time12 ----------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_time2 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_time2:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_time2"
   #endif                                                   ' Trace

   ' Minuten ausgeben

   ' Zeitstring mit ":" aufbauen
   Temp_string_1 = Time2string(menue_time_stunde , Menue_time_minute , Menue_time_sekunde , &H3A)
   ' Zeitstring ausgeben
   Locate 3 , 9 : Lcd Temp_string_1

Return
'-- End Menue_time2 -----------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_time21 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_time21:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_time21"
   #endif                                                   ' Trace

   ' Minuten erhöhen und ausgeben

   Incr Menue_time_minute
   If Menue_time_minute > 59 Then Menue_time_minute = 0

   ' Zeitstring mit ":" aufbauen
   Temp_string_1 = Time2string(menue_time_stunde , Menue_time_minute , Menue_time_sekunde , &H3A)
   ' Zeitstring ausgeben
   Locate 3 , 9 : Lcd Temp_string_1

Return
'-- End Menue_time21 ----------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_time22 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_time22:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_time22"
   #endif                                                   ' Trace

   ' Minuten verringern und ausgeben

   Decr Menue_time_minute
   If Menue_time_minute = 255 Then Menue_time_minute = 59

   ' Zeitstring mit ":" aufbauen
   Temp_string_1 = Time2string(menue_time_stunde , Menue_time_minute , Menue_time_sekunde , &H3A)
   ' Zeitstring ausgeben
   Locate 3 , 9 : Lcd Temp_string_1

Return
'-- End Menue_time22 ----------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_time3 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_time3:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_time3"
   #endif                                                   ' Trace

   ' Sekunden ausgeben

   ' Zeitstring mit ":" aufbauen
   Temp_string_1 = Time2string(menue_time_stunde , Menue_time_minute , Menue_time_sekunde , &H3A)
   ' Zeitstring ausgeben
   Locate 3 , 9 : Lcd Temp_string_1

Return
'-- End Menue_time3 -----------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_time31 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_time31:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_time31"
   #endif                                                   ' Trace

   ' Sekunden erhöhen und ausgeben

   Incr Menue_time_sekunde
   If Menue_time_sekunde > 59 Then Menue_time_sekunde = 0

   ' Zeitstring mit ":" aufbauen
   Temp_string_1 = Time2string(menue_time_stunde , Menue_time_minute , Menue_time_sekunde , &H3A)
   ' Zeitstring ausgeben
   Locate 3 , 9 : Lcd Temp_string_1

Return
'-- End Menue_time31 ----------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_time32 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_time32:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_time32"
   #endif                                                   ' Trace

   ' Sekunden verringern und ausgeben

   Decr Menue_time_sekunde
   If Menue_time_sekunde = 255 Then Menue_time_sekunde = 59

   ' Zeitstring mit ":" aufbauen
   Temp_string_1 = Time2string(menue_time_stunde , Menue_time_minute , Menue_time_sekunde , &H3A)
   ' Zeitstring ausgeben
   Locate 3 , 9 : Lcd Temp_string_1

Return
'-- End Menue_time32 ----------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_time_ende (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_time_ende:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_time_ende"
   #endif                                                   ' Trace

   ' Rücksprung in relevantes Menü
   Menue_datenuebernahme_flag = True

   ' Menüstatus zurückschalten
   Menue_state = Menue_state_buffer

   Gosub Menue_change_state_by_sub
   Gosub Lcd_print
   Menue_state_renew = 0
   Gosub Menue_call_subroutine

Return
'-- End Menue_time_ende -------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_date1 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_date1:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_date1"
   #endif                                                   ' Trace

   ' Für Date11 und Date12 bereits schon die Anzahl der Tage im Monat
   ' berechnen und den aktuellen Tag ausgeben

   ' Anzahl der Tages des aktiven Monats aus Tabelle auslesen
   Menue_tagesanzahl = Lookup(menue_date_monat , Monate)

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Aktiver Monat : " ; Menue_date_monat
      Print #2 , "Tageszahl     : " ; Menue_tagesanzahl
   #endif                                                   ' Trace

   ' Ist der aktuelle Monat Februar
   If Menue_date_monat = 2 Then
      ' JA -> es könnte ein Schaltjahr sein!

      ' Jahr auf volles Jahr z.B. 2008 ergänzen
      Temp_word_1 = 2000 + Menue_date_jahr
      ' Schaltjahr prüfen
      Temp_byte_2 = Schaltjahr(temp_word_1)

      ' Trace Output schreiben
      #if Menue_testmodus                                   ' Trace
         Select Case Temp_byte_2
            Case True:
               Print #2 , "Jahr ist Schaltjahr"
            Case False:
               Print #2 , "Jahr ist kein Schaltjahr"
         End Seclect
      #endif                                                ' Trace

      ' Ist aktuelles Jahr ein Schaltjahr
      If Temp_byte_2 = True Then
         ' JA, dann Tagesanzahl auf 29 setzen
         Menue_tagesanzahl = 29
      End If                                                ' Schaltjahr

   End If                                                   ' Februar?

   ' Aktuelle Tagesanzahl steht in Variable Temp_byte_1!

   ' Datumstring mit "." aufbauen
   Temp_string_1 = Time2string(menue_date_tag , Menue_date_monat , Menue_date_jahr , &H2E)
   ' Datumstring ausgeben
   Locate 3 , 9 : Lcd Temp_string_1

Return
'-- End Menue_date1 -----------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_date11 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_date11:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_date11"
   #endif                                                   ' Trace

   ' Tag erhöhen und ausgeben

   Incr Menue_date_tag
   If Menue_date_tag > Menue_tagesanzahl Then Menue_date_tag = 1

   ' Datumstring mit "." aufbauen
   Temp_string_1 = Time2string(menue_date_tag , Menue_date_monat , Menue_date_jahr , &H2E)
   ' Datumstring ausgeben
   Locate 3 , 9 : Lcd Temp_string_1

Return
'-- End Menue_date11 ----------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_date12 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_date12:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_date12"
   #endif                                                   ' Trace

   ' Tag verringern und ausgeben

   Decr Menue_date_tag
   If Menue_date_tag = 0 Then Menue_date_tag = Menue_tagesanzahl

   ' Datumstring mit "." aufbauen
   Temp_string_1 = Time2string(menue_date_tag , Menue_date_monat , Menue_date_jahr , &H2E)
   ' Datumstring ausgeben
   Locate 3 , 9 : Lcd Temp_string_1

Return
'-- End Menue_date12 ----------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_date2 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_date2:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_date2"
   #endif                                                   ' Trace

   ' Monat ausgeben

   ' Datumstring mit "." aufbauen
   Temp_string_1 = Time2string(menue_date_tag , Menue_date_monat , Menue_date_jahr , &H2E)
   ' Datumstring ausgeben
   Locate 3 , 9 : Lcd Temp_string_1

Return
'-- End Menue_date2 -----------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_date21 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_date21:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_date21"
   #endif                                                   ' Trace

   ' Monat erhöhen und ausgeben

   Incr Menue_date_monat
   If Menue_date_monat > 12 Then Menue_date_monat = 1

   ' Datumstring mit "." aufbauen
   Temp_string_1 = Time2string(menue_date_tag , Menue_date_monat , Menue_date_jahr , &H2E)
   ' Datumstring ausgeben
   Locate 3 , 9 : Lcd Temp_string_1

Return
'-- End Menue_date21 ----------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_date22 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_date22:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_date22"
   #endif                                                   ' Trace

   ' Monat verringern und ausgeben

   Decr Menue_date_monat
   If Menue_date_monat = 0 Then Menue_date_monat = 12

   ' Datumstring mit "." aufbauen
   Temp_string_1 = Time2string(menue_date_tag , Menue_date_monat , Menue_date_jahr , &H2E)
   ' Datumstring ausgeben
   Locate 3 , 9 : Lcd Temp_string_1

Return
'-- End Menue_date22 ----------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_date3 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_date3:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_date3"
   #endif                                                   ' Trace

   ' Jahr ausgeben

   ' Datumstring mit "." aufbauen
   Temp_string_1 = Time2string(menue_date_tag , Menue_date_monat , Menue_date_jahr , &H2E)
   ' Datumstring ausgeben
   Locate 3 , 9 : Lcd Temp_string_1

Return
'-- End Menue_date3 -----------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_date31 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_date31:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_date31"
   #endif                                                   ' Trace

   ' Jahr erhöhen und ausgeben

   Incr Menue_date_jahr
   If Menue_date_jahr > 99 Then Menue_date_jahr = 1

   ' Datumstring mit "." aufbauen
   Temp_string_1 = Time2string(menue_date_tag , Menue_date_monat , Menue_date_jahr , &H2E)
   ' Datumstring ausgeben
   Locate 3 , 9 : Lcd Temp_string_1

Return
'-- End Menue_date31 ----------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_date32 (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_date32:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_date32"
   #endif                                                   ' Trace

   ' Jahr verringern und ausgeben

   Decr Menue_date_jahr
   If Menue_date_jahr = 0 Then Menue_date_jahr = 99

   ' Datumstring mit "." aufbauen
   Temp_string_1 = Time2string(menue_date_tag , Menue_date_monat , Menue_date_jahr , &H2E)
   ' Datumstring ausgeben
   Locate 3 , 9 : Lcd Temp_string_1

Return
'-- End Menue_date32 ----------------------------------------------------------

'------------------------------------------------------------------------------
' MENUE - Gosub-Routine: Menue_date_ende (Menue-Unterstützung-Routine)
' Routine wird von Menue-State-Machine bei eintritt in Menue aufgerufen.
' Funktion dient zum Errechnen von Werten, Ausgeben von Informationsn usw. die
' ergänzend zum jeweiligen Menueschritt benötigt werden.
'------------------------------------------------------------------------------
Menue_date_ende:

   ' Trace Output schreiben
   #if Menue_testmodus                                      ' Trace
      Print #2 , "Enter Menue_date_ende"
   #endif                                                   ' Trace

   ' Alle Arbeitsvariablen zurückschreiben und Date neu setzen

   ' Rücksprung in relevantes Menü
   Menue_datenuebernahme_flag = True

   ' Menüstatus zurückschalten
   Menue_state = Menue_state_buffer

   Gosub Menue_change_state_by_sub
   Gosub Lcd_print
   Menue_state_renew = 0
   Gosub Menue_call_subroutine

Return
'-- End Menue_date_ende -------------------------------------------------------

' ********************
' * RTC:  Echtzeit   *
' ********************

'------------------------------------------------------------------------------
' RTC - Gosub-Routine: Rtc_set_rtc_clock
' Subroutine übernimmt bei erfolgreicher Synchronisation durch DCF77 die
' aktuellen Zeit und Datumsinformationen in die RTC DS1307
'------------------------------------------------------------------------------
Rtc_set_rtc_clock:

   ' Wenn Konstante gesetzt Trace Output schreiben
   #if Rtc_testmodus                                        ' Trace
      Print #2 , "Enter Rcf_set_rtc_clock"
   #endif                                                   ' Trace

   ' Daten zum Speichern in BCD Format aufbereiten
   Dcf77_hour = Makebcd(_hour)
   Dcf77_min = Makebcd(_min)
   Dcf77_sec = Makebcd(_sec)
   Dcf77_weekday = Makebcd(_weekday)
   Dcf77_day = Makebcd(_day)
   Dcf77_month = Makebcd(_month)
   Dcf77_year = Makebcd(_year)

   ' Wenn Konstante gesetzt Trace Output schreiben
   #if Rtc_testmodus                                        ' Trace
      Print #2 , "Schreibe Zeitinformationen in DS1307:"
      Print #2 , "Stunde    : " ; Bcd(dcf77_hour)
      Print #2 , "Minute    : " ; Bcd(dcf77_min)
      Print #2 , "Sekunde   : " ; Bcd(dcf77_sec)
      Print #2 , "Wochentag : " ; Bcd(dcf77_weekday)
      Print #2 , "Tag       : " ; Bcd(dcf77_day)
      Print #2 , "Monat     : " ; Bcd(dcf77_month)
      Print #2 , "Jahr      : " ; Bcd(dcf77_year)
   #endif                                                   ' Trace

   ' RTC DS1307 synchronisieren
   I2cstart                                                 ' START-Sequenz senden
   I2cwbyte Rtc_address_write                               ' Daten schreiben initiieren
   I2cwbyte Rtc_address_seconds                             ' Adresse übertragen = &H00

   I2cwbyte Dcf77_sec                                       ' Byte 1 übertragen
   I2cwbyte Dcf77_min                                       ' Byte 2 übertragen
   I2cwbyte Dcf77_hour                                      ' Byte 3 übertragen
   I2cwbyte Dcf77_weekday                                   ' Byte 4 übertragen
   I2cwbyte Dcf77_day                                       ' Byte 5 übertragen
   I2cwbyte Dcf77_month                                     ' Byte 6 übertragen
   I2cwbyte Dcf77_year                                      ' Byte 7 übertragen
   I2cstop                                                  ' STOP-Sequenz

Return
'-- End Rtc_set_rtc_clock -----------------------------------------------------

'------------------------------------------------------------------------------
' RTC - Gosub-Routine: Rtc_set_softclock
' Subroutine übernimmt bei Aufruf der Routine die in der RTC "mitlaufenden"
' Zeitinformationen in die SoftClock.
' Damit kann bereits zu Systemstart ohne DCF77 Empfang mit "realer" Zeit
' gestartet werden.
'------------------------------------------------------------------------------
Rtc_set_softclock:

   ' Wenn Konstante gesetzt Trace Output schreiben
   #if Rtc_testmodus                                        ' Trace
      Print #2 , "Enter Rcf_set_softclock"
   #endif                                                   ' Trace

   ' RTC DS1307 auslesen
   I2cstart                                                 ' START-Sequenz senden
   I2cwbyte Rtc_address_write                               ' Daten schreiben initiieren
   I2cwbyte Rtc_address_seconds                             ' Adresse übertragen = &H00
   ' I2cstop                                                ' STOP-Sequenz wird nicht zwingend benötigt

   I2cstart                                                 ' START-Sequenz erneut senden
   I2cwbyte Rtc_address_read                                ' Daten lesen initiieren
   I2crbyte Dcf77_sec , Ack                                 ' Byte 1 lesen
   I2crbyte Dcf77_min , Ack                                 ' Byte 2 lesen
   I2crbyte Dcf77_hour , Ack                                ' Byte 3 lesen
   I2crbyte Dcf77_weekday , Ack                             ' Byte 4 lesen
   I2crbyte Dcf77_day , Ack                                 ' Byte 5 lesen
   I2crbyte Dcf77_month , Ack                               ' Byte 6 lesen
   I2crbyte Dcf77_year , Nack                               ' Byte 7 lesen und fertig (NACK)
   I2cstop                                                  ' STOP-Sequenz

   ' Wenn Konstante gesetzt Trace Output schreiben
   #if Rtc_testmodus                                        ' Trace
      Print #2 , "Lese Zeitinformationen aus DS1307:"
      Print #2 , "Stunde    : " ; Bcd(dcf77_hour)
      Print #2 , "Minute    : " ; Bcd(dcf77_min)
      Print #2 , "Sekunde   : " ; Bcd(dcf77_sec)
      Print #2 , "Wochentag : " ; Bcd(dcf77_weekday)
      Print #2 , "Tag       : " ; Bcd(dcf77_day)
      Print #2 , "Monat     : " ; Bcd(dcf77_month)
      Print #2 , "Jahr      : " ; Bcd(dcf77_year)
   #endif                                                   ' Trace

   ' ausgelesene Daten in SoftClock Variablen übernehmen
   _hour = Makedec(dcf77_hour)
   _min = Makedec(dcf77_min)
   _sec = Makedec(dcf77_sec)
   _weekday = Makedec(dcf77_weekday)
   _day = Makedec(dcf77_day)
   _month = Makedec(dcf77_month)
   _year = Makedec(dcf77_year)

Return
'-- End Rtc_set_softclock -----------------------------------------------------

' ********************
' * REL:  Relais     *
' ********************

'------------------------------------------------------------------------------
' REL - Gosub-Routine: Relais_konfig
' Subroutine zur Konfiguration der Relais
'------------------------------------------------------------------------------
Relais_konfig:

   ' Wenn Konstante gesetzt Trace Output schreiben
   #if Relais_testmodus                                     ' Trace
      Print #2 , "Enter Relais_konfig"
   #endif                                                   ' Trace

   '----- Konfiguration Relais [AUF/ZU/Licht] (Transistorstufe) -----
   'Port G.0 (Licht) als Ausgang definieren und Relais ausschalten
   Config Out_licht = Output
   Rel_licht_on = 0

   'Port E.2 (Dauer-Licht) als Ausgang definieren und Relais ausschalten
   Config Out_dauerlicht = Output
   Rel_dauerlicht_on = 0

   'Port C.6 (AUF) als Ausgang definieren und Relais ausschalten
   Config Out_auf = Output
   Rel_auf_on = 0

   'Port C.7 (ZU) als Ausgang definieren und Relais ausschalten
   Config Out_zu = Output
   Rel_zu_on = 0

   ' Variablen initialisieren
   Rel_beschattung_delay = Rel_delay_default                ' Globale Variable mit Default lasen

   Rel_auf_dunkel_flag = False                              ' Flag mit Default-Wert laden
   Rel_zu_temp_flag = False                                 ' Flag mit Default-Wert laden

   Rel_auf_dunkelheit = Rel_auf_dunkelheit_default          ' Globale Vaiable mit Default laden
   Rel_zu_temperatur = Rel_zu_temperatur_default

Return
'-- End Relais_konfig ---------------------------------------------------------

'------------------------------------------------------------------------------
' REL - Gosub-Routine: Relais_auf_an
' Subroutine zum Eimschalten des Relais AUF
'------------------------------------------------------------------------------
Relais_auf_an:

   ' Wenn Konstante gesetzt Trace Output schreiben
   #if Relais_testmodus                                     ' Trace
      Print #2 , "Enter Relais_auf_an"
   #endif                                                   ' Trace

   Rel_auf_on = 1                                           ' Relais AUF einschalten

Return
'-- End Relais_auf_an ---------------------------------------------------------

'------------------------------------------------------------------------------
' REL - Gosub-Routine: Relais_auf_aus
' Subroutine zum Ausschalten des Relais AUF
'------------------------------------------------------------------------------
Relais_auf_aus:

   ' Wenn Konstante gesetzt Trace Output schreiben
   #if Relais_testmodus                                     ' Trace
      Print #2 , "Enter Relais_auf_aus"
   #endif                                                   ' Trace

   Rel_auf_on = 0                                           ' Relais AUF ausschalten

Return
'-- End Relais_auf_aus --------------------------------------------------------

'------------------------------------------------------------------------------
' REL - Gosub-Routine: Relais_zu_an
' Subroutine zum Eimschalten des Relais ZU
'------------------------------------------------------------------------------
Relais_zu_an:

   ' Wenn Konstante gesetzt Trace Output schreiben
   #if Relais_testmodus                                     ' Trace
      Print #2 , "Enter Relais_zu_an"
   #endif                                                   ' Trace

   Rel_zu_on = 1                                            ' Relais ZU einschalten

Return
'-- End Relais_zu_an ---------------------------------------------------------

'------------------------------------------------------------------------------
' REL - Gosub-Routine: Relais_zu_aus
' Subroutine zum Ausschalten des Relais ZU
'------------------------------------------------------------------------------
Relais_zu_aus:

   ' Wenn Konstante gesetzt Trace Output schreiben
   #if Relais_testmodus                                     ' Trace
      Print #2 , "Enter Relais_zu_aus"
   #endif                                                   ' Trace

   Rel_zu_on = 0                                            ' Relais ZU ausschalten

Return
'-- End Relais_zu_aus --------------------------------------------------------

'------------------------------------------------------------------------------
' REL - Gosub-Routine: Relais_licht_an
' Subroutine zum Eimschalten des Relais LICHT
'------------------------------------------------------------------------------
Relais_licht_an:

   ' Wenn Konstante gesetzt Trace Output schreiben
   #if Relais_testmodus                                     ' Trace
      Print #2 , "Enter Relais_licht_an"
   #endif                                                   ' Trace

   Rel_licht_on = 1                                         ' Relais LICHT einschalten

Return
'-- End Relais_licht_an -------------------------------------------------------

'------------------------------------------------------------------------------
' REL - Gosub-Routine: Relais_licht_aus
' Subroutine zum Ausschalten des Relais LICHT
'------------------------------------------------------------------------------
Relais_licht_aus:

   ' Wenn Konstante gesetzt Trace Output schreiben
   #if Relais_testmodus                                     ' Trace
      Print #2 , "Enter Relais_licht_aus"
   #endif                                                   ' Trace

   Rel_licht_on = 0                                         ' Relais LICHT ausschalten

Return
'-- End Relais_licht_aus ------------------------------------------------------

'------------------------------------------------------------------------------
' REL - Gosub-Routine: Relais_dauerlicht_an
' Subroutine zum Eimschalten des Relais LICHT
'------------------------------------------------------------------------------
Relais_dauerlicht_an:

   ' Wenn Konstante gesetzt Trace Output schreiben
   #if Relais_testmodus                                     ' Trace
      Print #2 , "Enter Relais_dauerlicht_an"
   #endif                                                   ' Trace

   Rel_dauerlicht_on = 1                                    ' Relais LICHT einschalten

Return
'-- End Relais_dauerlicht_an --------------------------------------------------

'------------------------------------------------------------------------------
' REL - Gosub-Routine: Relais_dauerlicht_aus
' Subroutine zum Ausschalten des Relais LICHT
'------------------------------------------------------------------------------
Relais_dauerlicht_aus:

   ' Wenn Konstante gesetzt Trace Output schreiben
   #if Relais_testmodus                                     ' Trace
      Print #2 , "Enter Relais_dauerlicht_aus"
   #endif                                                   ' Trace

   Rel_dauerlicht_on = 0                                    ' Relais LICHT ausschalten

Return
'-- End Relais_dauerlicht_aus -------------------------------------------------

'------------------------------------------------------------------------------
' REL - Gosub-Routine: Rel_beschattung_auf
' Subroutine zum kompletten Auffahren der Beschattung mit Richtungsumschaltung
'------------------------------------------------------------------------------
Relais_beschattung_auf:

   ' Wenn Konstante gesetzt Trace Output schreiben
   #if Relais_testmodus                                     ' Trace
      Print #2 , "Enter Relais_beschattung_auf"
   #endif                                                   ' Trace

   ' Prüfung ob Antrieb sich aktuell in ZU-Richtung bewegt
   If Beschattung_zu_flag = Aktiv Then
      ' Wenn JA Antrieb abschalten und Flag zurücksetzen
      Beschattung_zu_flag = Passiv
      Gosub Relais_zu_aus
      Waitms 500                                            ' Zum Schutz des Antriebs 500 ms warten
   End If                                                   ' Beschattung zu aktiv

   ' Antriebe AUF einschalten und Timerüberwachung aktivieren
   Gosub Relais_auf_an
   Beschattung_auf_flag = Aktiv
   Beschattung_auf_counter = Sectic_count + Rel_beschattung_delay

   Sht71_autozufahren = Passiv                              ' Flag zurücksetzen

   Reset Led_15_close_time

Return
'-- End Relais_beschattung_auf ------------------------------------------------

'------------------------------------------------------------------------------
' REL - Gosub-Routine: Relais_beschattung_zu
' Subroutine zum kompletten Zufahren der Beschattung mit Richtungsumschaltung
'------------------------------------------------------------------------------
Relais_beschattung_zu:

   ' Wenn Konstante gesetzt Trace Output schreiben
   #if Relais_testmodus                                     ' Trace
      Print #2 , "Enter Relais_beschattung_zu"
   #endif                                                   ' Trace

   ' Prüfung ob Antrieb sich aktuell in AUF-Richtung bewegt
   If Beschattung_auf_flag = Aktiv Then
      ' Wenn JA Antrieb abschalten und Flag zurücksetzen
      Beschattung_auf_flag = Passiv
      Gosub Relais_auf_aus
      Waitms 500                                            ' Zum Schutz des Antriebs 500 ms warten
   End If                                                   ' Beschattung auf aktiv

   ' Antriebe ZU einschalten und Timerüberwachung aktivieren
   Gosub Relais_zu_an
   Beschattung_zu_flag = Aktiv
   Beschattung_zu_counter = Sectic_count + Rel_beschattung_delay

   Rain_autoauffahren = Passiv                              ' globales Flag zurücksetzen
   Wind_autoauffahren = Passiv                              ' globales Flag zurücksetzen
   Light_autoauffahren = Passiv                             ' globales Flag zurücksetzen

   Reset Led_11_open_time

Return
'-- End Relais_beschattung_zu -------------------------------------------------

'------------------------------------------------------------------------------
' REL - Gosub-Routine: Relais_beschattung_stopp
' Subroutine zum Anhalten des aktuell Fahrvorgangs
'------------------------------------------------------------------------------
Relais_beschattung_stop:

   ' Wenn Konstante gesetzt Trace Output schreiben
   #if Relais_testmodus                                     ' Trace
      Print #2 , "Enter Relais_beschattung_stop"
   #endif                                                   ' Trace

   ' Antrieb ZU anhalten und Timerüberwachung zurücksetzen
   Beschattung_zu_flag = Passiv
   Gosub Relais_zu_aus

   ' Antrieb AUF anhalten und Timerüberwachung zurücksetzen
   Beschattung_auf_flag = Passiv
   Gosub Relais_auf_aus

Return
'-- End Relais_beschattung_stopp ----------------------------------------------

'------------------------------------------------------------------------------
' Gosub-Routine: Beleuchtung_ein
' Subroutine schaltet Beleuchtung ein
'------------------------------------------------------------------------------
Beleuchtung_ein:

   ' Wenn Konstante gesetzt Trace Output schreiben
   #if Relais_testmodus                                     ' Trace
      Print #2 , "Enter Beleuchtung_ein"
   #endif                                                   ' Trace

   ' Relais einschalten
   Gosub Relais_licht_an

   ' Flag setzen
    Beleuchtung_flag = Aktiv

Return
'-- End Beleuchtung_ein -------------------------------------------------------

'------------------------------------------------------------------------------
' Gosub-Routine: Beleuchtung_aus
' Subroutine schaltet Beleuchtung aus
'------------------------------------------------------------------------------
Beleuchtung_aus:

   ' Wenn Konstante gesetzt Trace Output schreiben
   #if Relais_testmodus                                     ' Trace
      Print #2 , "Enter Beleuchtung_aus"
   #endif                                                   ' Trace

   ' Relais einschalten
   Gosub Relais_licht_aus

   ' Flag setzen
    Beleuchtung_flag = Passiv

Return
'-- End Beleuchtung_aus -------------------------------------------------------

'------------------------------------------------------------------------------
' Gosub-Routine: Beleuchtung_dauerlicht_ein
' Subroutine schaltet Dauerlicht ein
'------------------------------------------------------------------------------
Beleuchtung_dauerlicht_ein:

   ' Wenn Konstante gesetzt Trace Output schreiben
   #if Relais_testmodus                                     ' Trace
      Print #2 , "Enter Beleuchtung_dauerlicht_ein"
   #endif                                                   ' Trace

   ' Bemerkung: Dauerlicht ist eingeschaltet, wenn Relais nicht angezongen!!!!!

   ' Relais ausschalten
   Gosub Relais_dauerlicht_aus

   ' Flag setzen
   Dauerlicht_flag = Aktiv

Return
'-- End Beleuchtung_ein -------------------------------------------------------

'------------------------------------------------------------------------------
' Gosub-Routine: Beleuchtung_dauerlicht_aus
' Subroutine schaltet Dauerlicht ein
'------------------------------------------------------------------------------
Beleuchtung_dauerlicht_aus:

   ' Wenn Konstante gesetzt Trace Output schreiben
   #if Relais_testmodus                                     ' Trace
      Print #2 , "Enter Beleuchtung_dauerlicht_aus"
   #endif                                                   ' Trace

   ' Bemerkung: Dauerlicht ist eingeschaltet, wenn Relais nicht angezongen!!!!!

   ' Relais ausschalten
   Gosub Relais_dauerlicht_an

   ' Flag setzen
   Dauerlicht_flag = Passiv

Return
'-- End Beleuchtung_aus -------------------------------------------------------

'------------------------------------------------------------------------------
' Gosub-Routine: Sw_timer_sequencer
' Subroutine Abprüfen der in RUNNING befindlichen SW-Timer für Beschattung auf
' oder zu
'------------------------------------------------------------------------------
Sw_timer_sequencer:

   ' *** Sequence [1] ***
   ' Überprüfung ob Timerüberwachung für Beschattung ZU aktiv
   If Beschattung_zu_flag = Aktiv Then

      ' Prüfung ob Timer abgelaufen
      If Sectic_count = Beschattung_zu_counter Then

         ' Traceausgabe wenn Sequencer Aufgabe [6] ausführt
         #if Sequencer_testmodus                            ' Trace
            Print #2 , "[1] Automatische Abschaltung ZU"
         #endif                                             ' Trace

         ' Wenn ja Beschattung ZU abschalten und Timerüberwachung deaktivieren
         Beschattung_zu_flag = Passiv
         Gosub Relais_zu_aus

         ' Ggf. Signalton ausgeben
         If Sound_flag = True Then
            Call Sound_beep(sound_beep_time_short)          ' Subroutine Beep aufrufen
            Waitms 40
            Call Sound_beep(sound_beep_time_short)          ' Subroutine Beep aufrufen
         End If                                             ' Signalton

         ' Prüfung von wo Funktions ausgeführt
         If Menue_inrelmenue_flag <> 0 Then
            ' Wenn Funktion von Menue ausgeführt an Umschaltung auf Stopbildschirm
            Menue_state = Loadlabel(men2231)                ' Stopbildschirm
            Menue_state_renew = 1
            Gosub Menue_change_state_by_sub
         End If                                             ' Menü-Update

      End If                                                ' Timer abgelaufen?
   End If                                                   ' Beschattung zu?

   ' *** Sequence [2] ***
   ' Überprüfung ob Timerüberwachung für Beschattung AUF aktiv
   If Beschattung_auf_flag = Aktiv Then

      ' Prüfung ob Timer abgelaufen
      If Sectic_count = Beschattung_auf_counter Then

         ' Traceausgabe wenn Sequencer Aufgabe [6] ausführt
         #if Sequencer_testmodus                            ' Trace
            Print #2 , "[2] Automatische Abschaltung AUF"
         #endif                                             ' Trace

         ' Wenn ja Beschattung AUF abschalten und Timerüberwachung deaktivieren
         Beschattung_auf_flag = Passiv
         Gosub Relais_auf_aus

         ' Ggf. Signalton ausgeben
         If Sound_flag = True Then
            Call Sound_beep(sound_beep_time_short)          ' Subroutine Beep aufrufen
            Waitms 40
            Call Sound_beep(sound_beep_time_short)          ' Subroutine Beep aufrufen
         End If                                             ' Signalton

         ' Prüfung von wo Funktions ausgeführt
         If Menue_inrelmenue_flag <> 0 Then
            Menue_state = Loadlabel(men2231)                'Startbildschirm
            Menue_state_renew = 1
            Gosub Menue_change_state_by_sub
         End If                                             ' Menü-Update

      End If                                                ' Timer abgelaufen?
   End If                                                   ' Beschattung auf?

   ' *** Sequence [3] ***
   ' Überprüfung ob Timerüberwachung für Windsensor aktiv
   If Wind_erfassung = True Then

      ' Überprüfung ob Zeitintervall abgelaufen
      If Sectic_count = Wind_erfassungs_counter Then

         ' Traceausgabe wenn Sequencer Aufgabe [6] ausführt
         #if Sequencer_testmodus                            ' Trace
            Print #2 , "[3] Wind messen"
         #endif                                             ' Trace

         ' Windgeschwindigkeit berechnen
         Gosub Wind_measurement

         ' Überprüfung auf maximale Windgeschwindigkeit
         If Wind_geschwindigkeit_kmh > Wind_kmh_max Then
            ' Maximale Windgeschwindigkeit neu setzen
            Wind_kmh_max = Wind_geschwindigkeit_kmh
            ' Werte im EEPROM updaten
            Ee_data_wind_kmh_max = Wind_kmh_max
         End If                                             ' Windgeschwindigkeit

         ' Auswerteintervall neu setzen
         Wind_erfassungs_counter = Wind_erfassungs_counter + Wind_auswertung

      End If                                                ' Timer abgelaufen?
   End If                                                   ' Winderfassung

   ' *** Sequence [4] ***
   ' Überprüfung ob Timerüberwachung für SHT71 aktiv
   If Sht71_erfassung = True Then

      ' Überprüfung on Zeitintercall abgelaufen
      If Sectic_count = Sht71_erfassungs_counter Then

         ' Traceausgabe wenn Sequencer Aufgabe [6] ausführt
         #if Sequencer_testmodus                            ' Trace
            Print #2 , "[4] Temp&Hum messen"
         #endif                                             ' Trace

         ' Temperatur und Luftfeuchtigkeit berechnen und in globalen Variablen ablegen
         Gosub Sht71_perform_measurement
         Call Sht71_calc_measurements()

         ' Prüfung Temperatur-Wert auf Minimum
         If Sht71_t < Sht71_t_min Then
            Sht71_t_min = Sht71_t                           ' Gobale Variable zuweisen
            Ee_data_sht71_t_min = Sht71_t_min               ' Wert in Eeprom speichern

            ' Ggf. Trace ausgeben
            #if Sequencer_testmodus                         ' Trace
               Print #2 , "- Update Sht71_t_min"
            #endif                                          ' Trace

         End If                                             ' Temperatur Minimum

         ' Prüfung Temperatur-Wert auf Maximum
         If Sht71_t > Sht71_t_max Then
            Sht71_t_max = Sht71_t                           ' Gobale Variable zuweisen
            Ee_data_sht71_t_max = Sht71_t_max               ' Wert in Eeprom speichern

            ' Ggf. Trace ausgeben
            #if Sequencer_testmodus                         ' Trace
               Print #2 , "- Update Sht71_t_max"
            #endif                                          ' Trace

         End If                                             ' Temperatur Maximum

         ' Prüfung Feuchtigkeits-Wert auf Minimum
         If Sht71_rhtrue < Sht71_rhtrue_min Then
            Sht71_rhtrue_min = Sht71_rhtrue                 ' Gobale Variable zuweisen
            Ee_data_sht71_rhtrue_min = Sht71_rhtrue_min     ' Wert in Eeprom speichern

            ' Ggf. Trace ausgeben
            #if Sequencer_testmodus                         ' Trace
               Print #2 , "- Update Sht71_rhtrue_min"
            #endif                                          ' Trace

         End If                                             ' Feuchtigkeit Minimum

         ' Prüfung Feuchtigkeits-Wert auf Maximum
         If Sht71_rhtrue > Sht71_rhtrue_max Then
            Sht71_rhtrue_max = Sht71_rhtrue                 ' Gobale Variable zuweisen
            Ee_data_sht71_rhtrue_max = Sht71_rhtrue_max     ' Wert in Eeprom speichern

            ' Ggf. Trace ausgeben
            #if Sequencer_testmodus                         ' Trace
               Print #2 , "- Update Sht71_rhtrue_max"
            #endif                                          ' Trace

         End If                                             ' Feuchtigkeit Maximum

         ' Prüfung auf Urinitialisierung
         If Sht71_rhtrue_min = 0.0 Then
            If Sht71_t_min = 0.0 Then
               ' JA; beiden Werte sind noch nicht initialisiert, stehen auf NULL
               Sht71_t_min = Sht71_t_max                    ' Min-Wert = Max-Wert setzen
               Ee_data_sht71_t_min = Sht71_t_min            ' Wert in Eeprom speichern
               Sht71_rhtrue_min = Sht71_rhtrue_max          ' Min-Wert = Max-Wert setzen
               Ee_data_sht71_rhtrue_min = Sht71_rhtrue_min  ' Wert in Eeprom speichern

               ' Ggf. Trace ausgeben
               #if Sequencer_testmodus                      ' Trace
                  Print #2 , "- Update aller Min-Werte"
               #endif                                       ' Trace

            End If                                          ' Urinitialisierung Temperatur
         End If                                             ' Urinitialisierung Feuchtigkeit

         ' Auswerteintervall neu setzen
         Sht71_erfassungs_counter = Sht71_erfassungs_counter + Sht71_auswertung

      End If                                                ' Timer abgelaufen
   End If                                                   ' Temp und Feuchtigkeit

   ' *** Sequence [5] ***
   ' Überprüfung ob ein Menüinhalt upgedated werden muss
   If Menue_insensmenue_flag <> 0 Then

      ' Traceausgabe wenn Sequencer Aufgabe [5] ausführt
      #if Sequencer_testmodus                               ' Trace
         Print #2 , "[5] Menue aktualisieren"
      #endif                                                ' Trace

      ' JA, es gibt einen aktiven Inhalt => Inhalt anzeigen durch Aufruf Subroutine
      Gosub Menue_call_subroutine

   End If                                                   ' Menü-Update

   ' *** Sequence [6] ***
   ' Überprüfung ob Licht gemessen werden soll
   If Light_erfassung = True Then
      ' JA, das Statusflag ist auf EIN geschaltet

      ' Überprüfen on Zeitintervall für Messwerterfassung abgelaufen ist
      If Sectic_count = Light_erfassungs_counter Then
         ' JA, Counter ist abgelaufen

         ' Traceausgabe wenn Sequencer Aufgabe [6] ausführt
         #if Sequencer_testmodus                            ' Trace
            Print #2 , "[6] Licht messen"
         #endif                                             ' Trace

         ' Licht messen und in globale Varible übertragen
         Light_value = Light_measurement(light_messwert_zahl)

         ' Auswerteintervall neu setzen
         Light_erfassungs_counter = Light_erfassungs_counter + Light_auswertung_default
      End If                                                ' Timer abgelaufen
   End If                                                   ' Lichterfassung

   ' *** Sequence [7] ***
   ' Überprüfen ob LED's für Tasten zurückgesetzt werden müssen
   If Led_key_flag = True Then
      ' JA, Flag ist True

      ' Prüfen ob auch Counter
      If Sectic_count > Led_key_counter Then

         ' Traceausgabe wenn Sequencer Aufgabe [7] ausführt
         #if Sequencer_testmodus                            ' Trace
            Print #2 , "[7] Led's zuruecksetzen"
         #endif                                             ' Trace

         ' LED's für Tasten wieder abschalten
         Led_array = Led_array And Led_key_mask
         ' Gosub Led_update_array                             ' LED-Update erfolgt zentral in Hauptschleife

         ' Überwachungsflag wieder zurücksetzen
         Led_key_flag = False

      End If                                                ' Timer abgelaufen
   End If                                                   ' LED

   ' *** Sequence [8] ***
   ' Überwachung des Datalogging-Mechanismus

   ' Überrüfung ob Datalogging überhaupt aktiv
   If Ee_datalogging_flag = True Then
      ' JA, Flag ist True

      ' Prüfen ob Counter auch abgelaufen bzw. erreicht
      If Sectic_count = Ee_erfassungs_counter Then
         ' JA, Count ist abgelaufen

         ' Traceausgabe wenn Sequencer Aufgabe [8] ausführt
         #if Sequencer_testmodus                            ' Trace
            Print #2 , "[8] Data-Logging"
         #endif                                             ' Trace

         Ee_erfassungs_counter = Sectic_count + Ee_auswertung       ' Auswerteintervall neu setzen

         ' Wenn Konstante gesetzt Trace Output schreiben
         #if Datalogging_testmodus                          ' Trace
            Print #2 , "Ueberwachung Datalogging:"
            Print #2 , "  aktueller Sectic :      " ; Sectic_count
            Print #2 , "  neu gesetzter Counter : " ; Ee_erfassungs_counter
         #endif                                             ' Trace

         ' Prüfen ob Datenüberlauf und ggf. Variable zurücksetzen und Overrun erhöhen
         If Ee_data_count = Ea_data_loging_endadress Then

            Ee_data_count = 0                               ' Counter auf Anfangsadresse setzen
            Incr Ee_data_overrun                            ' Overrun-Zähler erhöhen

            ' Ggf. Trace ausgeben
            #if Eeprom_testmodus                            ' Trace
               Print #2 , "Speicherueberlauf!"
               Print #2 , "Setzte Data Count auf " ; Hex(ee_data_count)
               Print #2 , "Erhoehen Overrun auf " ; Hex(ee_data_overrun)
            #endif                                          ' Trace

            ' Overrun-Zähler gleich speichern
            Call Ee_write_eeprom_byte(ee_data_overrun_adress , Ee_data_overrun)

         End If                                             ' Datenüberlauf

         ' Adresse zum Schreiben berechnen
         Temp_word_1 = Ea_data_loging_length * Ee_data_count
         Temp_word_1 = Temp_word_1 + Ee_data_loging_start_adress

         ' Ggf. Trace ausgeben
         #if Eeprom_testmodus                               ' Trace
            Print #2 , "Berechnete Speicheradresse : " ; Hex(temp_word_1)
         #endif                                             ' Trace

         ' Anzahl gespeicherter Daten um ein erhöhen
         Incr Ee_data_count

         ' Ggf. Trace ausgeben
         #if Eeprom_testmodus                               ' Trace
            Print #2 , "Erhoehe Data Count auf " ; Hex(ee_data_count)
         #endif                                             ' Trace

         ' Datenstruktur zum Speichern vorbereiten

         ' Byte(1) Ee_data_hour
         Ee_data_logging_struct(1) = _hour

         ' Byte(2) Ee_data_minute
         Ee_data_logging_struct(2) = _min

         ' Byte(3) Ee_data_day
         Ee_data_logging_struct(3) = _day

         ' Byte(4) Ee_data_month [Bit7..4]
         ' Byte(4) Ea_data_light [Bit3..0]
         Temp_byte_1 = _month
         Shift Temp_byte_1 , Left , 4
         Temp_byte_1 = Temp_byte_1 And &B11110000
         Temp_byte_2 = Light_measurement(light_messwert_zahl)
         Temp_byte_2 = Temp_byte_2 And &B00001111
         Ee_data_logging_struct(4) = Temp_byte_1 + Temp_byte_2

         ' Byte(5) Ee_data_year
         Temp_byte_1 = _year
         Ee_data_logging_struct(5) = Temp_byte_1

         ' Byte(6) Ee_data_rain  [Bit7]
         ' Byte(6) Ee_data_wind  [Bit6..0]
         Temp_byte_1 = Wind_geschwindigkeit_kmh             ' Casting von Single auf Byte
         Temp_byte_1 = Temp_byte_1 And &B01111111
         Temp_byte_2 = Rain_measurement()
         If Temp_byte_2 = Rain_yes Then
            Set Temp_byte_1.7                               ' Setzte Bit 7 auf "1"
         End If                                             ' Regen
         Ee_data_logging_struct(6) = Temp_byte_1

         ' Byte(7) Ee_data_temp
         Temp_integer_1 = Sht71_t                           ' Casting von Single auf Integer
         Ee_data_logging_struct(7) = Low(temp_integer_1)

         ' Byte(8) Ee_data_humidity
         Temp_byte_1 = Sht71_rhtrue                         ' Casting von Single auf Byte
         Ee_data_logging_struct(8) = Temp_byte_1

         ' Ggf. Trace ausgeben
         #if Eeprom_testmodus                               ' Trace
            Print #2 , "Daten-Struct : " ;
            Print #2 , Hex(ee_data_logging_struct(1)) ; " " ;
            Print #2 , Hex(ee_data_logging_struct(2)) ; " " ;
            Print #2 , Hex(ee_data_logging_struct(3)) ; " " ;
            Print #2 , Hex(ee_data_logging_struct(4)) ; " " ;
            Print #2 , Hex(ee_data_logging_struct(5)) ; " " ;
            Print #2 , Hex(ee_data_logging_struct(6)) ; " " ;
            Print #2 , Hex(ee_data_logging_struct(7)) ; " " ;
            Print #2 , Hex(ee_data_logging_struct(8))
         #endif                                             ' Trace

         ' Datenstruktur speichern
         Call Ee_write_eeprom_struct(temp_word_1)

         ' aktuellen Data Count speichern
         Call Ee_write_eeprom_word(ee_data_count_adress , Ee_data_count)

         ' Ggf. Signalton ausgeben
         If Sound_flag = True Then
            Call Sound_beep(sound_beep_time_short)          ' Subroutine Beep aufrufen
         End If                                             ' Signalton

      End If                                                ' Timer abgelaufen?
   End If                                                   ' Datenlogging

   ' *** Sequence [9] ***
   ' Datenlogging ausgeben

   ' Überprüfung ob Datenlogging ausgegeben werden muss
   If Ee_output_flag = True Then
      ' JA, Datenlogging-Ausgabe wurde angefordert

      ' Traceausgabe wenn Sequencer Aufgabe [9] ausführt
      #if Sequencer_testmodus                               ' Trace
         Print #2 , "[9] Logging-Data Output"
      #endif                                                ' Trace

      ' Überprüfen ob Ende der Daten schon erreicht ist
      If Ee_output_counter < Ee_output_endadress Then
         ' NEIN, Ende ist noch nicht erreicht

         ' Adresse zum Lesen berechnen
         Temp_word_2 = Ea_data_loging_length * Ee_output_counter
         Temp_word_2 = Temp_word_2 + Ee_data_loging_start_adress

         ' Indizierte Datenstruktur aus EEPROM lesen
         Call Ee_read_eeprom_struct(temp_word_2)

         ' Ggf. Trace ausgeben
         #if Eeprom_testmodus                               ' Trace
            Print #2 , "Lese von Adresse " ; Hex(temp_word_2)
            Print #2 , "Daten-Struct : " ;
            Print #2 , Hex(ee_data_logging_struct(1)) ; " " ;
            Print #2 , Hex(ee_data_logging_struct(2)) ; " " ;
            Print #2 , Hex(ee_data_logging_struct(3)) ; " " ;
            Print #2 , Hex(ee_data_logging_struct(4)) ; " " ;
            Print #2 , Hex(ee_data_logging_struct(5)) ; " " ;
            Print #2 , Hex(ee_data_logging_struct(6)) ; " " ;
            Print #2 , Hex(ee_data_logging_struct(7)) ; " " ;
            Print #2 , Hex(ee_data_logging_struct(8))
         #endif                                             ' Trace

         ' Gelesene Daten interpretieren und ausgeben

         ' Format: nr;day.month.year;hour:minute;light;rain;wind;temp;hum
         Temp_word_2 = Ee_output_counter + 1
         Print #2 , Temp_word_2 ; ";" ;

         ' Byte(3) Ee_data_day
         Print #2 , Ee_data_logging_struct(3) ; "." ;

         ' Byte(4) Ee_data_month [Bit7..4]
         Temp_byte_1 = Ee_data_logging_struct(4)
         Shift Temp_byte_1 , Right , 4
         Temp_byte_1 = Temp_byte_1 And &B00001111
         Print #2 , Temp_byte_1 ; "." ;

         ' Byte(5) Ee_data_year
         Temp_word_2 = Ee_data_logging_struct(5) + 2000
         Print #2 , Temp_word_2 ; ";" ;

         ' Byte(1) Ee_data_hour
         Print #2 , Ee_data_logging_struct(1) ; ":" ;

         ' Byte(2) Ee_data_minute
         Print #2 , Ee_data_logging_struct(2) ; ";" ;

         ' Byte(4) Ea_data_light [Bit3..0]
         Temp_byte_1 = Ee_data_logging_struct(4) And &B00001111
         Print #2 , Temp_byte_1 ; ";" ;

         ' Byte(6) Ee_data_rain  [Bit7]
         Temp_byte_1 = Ee_data_logging_struct(6)
         Shift Temp_byte_1 , Right , 7
         Temp_byte_1 = Temp_byte_1 And &B00000001
         Print #2 , Temp_byte_1 ; ";" ;

         ' Byte(6) Ee_data_wind  [Bit6..0]
         Temp_byte_1 = Ee_data_logging_struct(6) And &B01111111
         Print #2 , Temp_byte_1 ; ";" ;

         ' Byte(7) Ee_data_temp
         Temp_byte_1 = Ee_data_logging_struct(7)
         If Temp_byte_1 > 127 Then
            Temp_word_2 = Temp_byte_1 + &HFF00
         Else
            Temp_word_2 = Temp_byte_1
         End If
         Temp_integer_1 = Temp_word_2
         Print #2 , Temp_integer_1 ; ";" ;

         ' Byte(8) Ee_data_humidity
         Print #2 , Ee_data_logging_struct(8)

         ' Ausgabezähler erhöhen
         Incr Ee_output_counter

      Else                                                  ' Logging-Counter

         ' JA, Ende erreicht. Noch Endzeile ausgeben und fertig
         Print #2 , "Ende der Daten"
         Ee_output_flag = False

         ' Ggf. Signalton ausgeben
         If Sound_flag = True Then
            Call Sound_beep(sound_beep_time_short)          ' Subroutine Beep aufrufen
            Waitms 40
            Call Sound_beep(sound_beep_time_short)          ' Subroutine Beep aufrufen
         End If                                             ' Signalton

      End If                                                ' Logging-Counter
   End If                                                   ' Daten ausgeben

   ' *** Sequence [10] ***
   ' Screensaver überprüfen

   ' Überprüfung ob Screensaver eigeschaltet
   If Lcd_screensaver = True Then
      ' JA, Screensaver ist eingeschaltet

      ' Prüfen ob der Screen bereits aktiv ist
      If Lcd_screensaver_aktiv = False Then
         ' Nein, Screensaver ist noch nicht abgelaufen

         ' Ist es Zeit für den Screensaver zu handeln?
         If Lcd_screensaver_counter = Sectic_count Then
            ' JA, Zeit abgelaufen

            ' Traceausgabe wenn Sequencer Aufgabe [10] ausführt
            #if Sequencer_testmodus                         ' Trace
               Print #2 , "[10] Screensaver"
            #endif                                          ' Trace

            ' Helligkeitswert retten
            Lcd_pwmwert_buffer = Lcd_pwmwert

            ' LCD dunkel
            Call Lcd_set_helligkeit(lcd_helligkeit_aus)

            ' Display ausschalten
            Gosub Lcd_display_off

            ' Flag setzen
            Lcd_screensaver_aktiv = True

            ' Ggf. Trace ausgeben
            #if Screensaver_testmodus                       ' Trace
               Print #2 , "PWM-Wert        : " ; Lcd_pwmwert
               Print #2 , "PWM-Wert Buffer : " ; Lcd_pwmwert_buffer
               Print #2 , "LCD Screensaver aktiv"
            #endif                                          ' Trace

         End If                                             ' Timer abgelaufen
      End If                                                ' Screensaver aktiv
   End If                                                   ' Screensaver eingeschaltet

Return
'-- End Sw_timer_sequencer ----------------------------------------------------

' ********************
' * DIM:  Dimmer     *
' ********************

'------------------------------------------------------------------------------
' DIM - Gosub-Routine: Dimmer_konfig
' Subroutine zur Konfiguration des Dimmers
'------------------------------------------------------------------------------
Dimmer_konfig:

   ' Wenn Konstante gesetzt Trace Output schreiben
   #if Dimmer_testmodus                                     ' Trace
      Print #2 , "Enter Dimmer_konfig"
   #endif                                                   ' Trace

   ' PortE.5 als Eingang mit aktivem PullUp konfigurieren
   Config Null_detect = Input
   Null_detect_pin = 1

   ' PortD.4 als Ausgang definieren und Triac ausschalten
   Config Ignition = Output
   Triac_start = 0

   ' Der Interrupt selbst kann nicht in der Gosub-Routine initialisiert werden
   ' sondern muss im Rumpf des Gesamtprogramms initialisiert werden.

   ' Dimmerhelligkeit auf Default einstellen
   Dim_helligkeitsstufe = Dim_helligkeit_default

   ' Triac Zündzeitpunkte aus Tabelle in Datenstruktur laden
   Restore Triac_zuendtabelle
   For Dim_index_counter = 1 To Dim_helligkeitstabellenwerte

      Read Triac_zuenszeitpunkte(dim_index_counter)

      ' Wenn Konstante gesetzt Trace Output schreiben
      #if Dimmer_testmodus                                  ' Trace
         Print #2 , "Zuendwert " ; Dim_index_counter ; " : " ; Triac_zuenszeitpunkte(dim_index_counter)
      #endif                                                ' Trace

   Next Dim_index_counter                                   ' Helligkeitsindex

Return
'-- End Dimmer_konfig ---------------------------------------------------------

'------------------------------------------------------------------------------
' DIM - Gosub-Routine: Dimmer_heller
' Subroutine zum Erhöhen der Dimmerhelligkeit, Verschiebung Index Zündzeitpunkt
'------------------------------------------------------------------------------
Dimmer_heller:

   ' Wenn Konstante gesetzt Trace Output schreiben
   #if Dimmer_testmodus                                     ' Trace
      Print #2 , "Enter Dimmer_heller"
   #endif                                                   ' Trace

   If Dim_helligkeitsstufe < Dim_helligkeit_max Then
      Incr Dim_helligkeitsstufe
   End If                                                   ' Helligkeitsstufe

   ' Wenn Konstante gesetzt Trace Output schreiben
   #if Dimmer_testmodus                                     ' Trace
      Print #2 , "Helligkeit ist : " ; Dim_helligkeitsstufe
   #endif                                                   ' Trace

Return
'-- End Dimmer_heller ---------------------------------------------------------

'------------------------------------------------------------------------------
' DIM - Gosub-Routine: Dimmer_dunkler
' Subroutine zum reduzieren der Dimmerhelligkeit, Verschiebung Index
' Zündzeitpunkt
'------------------------------------------------------------------------------
Dimmer_dunkler:

   ' Wenn Konstante gesetzt Trace Output schreiben
   #if Dimmer_testmodus                                     ' Trace
      Print #2 , "Enter Dimmer_dunkler"
   #endif                                                   ' Trace

   If Dim_helligkeitsstufe > Dim_helligkeit_min Then
      Decr Dim_helligkeitsstufe
   End If                                                   ' Helligkeitsstufe

   ' Wenn Konstante gesetzt Trace Output schreiben
   #if Dimmer_testmodus                                     ' Trace
      Print #2 , "Helligkeit ist : " ; Dim_helligkeitsstufe
   #endif                                                   ' Trace

Return
'-- End Dimmer_dunkler --------------------------------------------------------

'------------------------------------------------------------------------------
' Gosub-Routine: Dimmer_free_running
' Subroutine zum Setzen von Parametern für freien Dimmerlauf, gesteuert über
' Nulldurchgangskennung
'------------------------------------------------------------------------------
Dimmer_free_running:

   ' Wenn Konstante gesetzt Trace Output schreiben
   #if Dimmer_testmodus                                     ' Trace
      Print #2 , "Enter Dimmer_free_running"
   #endif                                                   ' Trace

   ' Prüfung ob free_running aktiv
   If Free_running_flag = Passiv Then
      ' JA, Free_runing ist aus und wird eingeschaltet
      Free_running_flag = Aktiv

      ' Wenn Konstante gesetzt Trace Output schreiben
      #if Dimmer_testmodus                                  ' Trace
         Print #2 , "Free Running ist aktiv"
      #endif                                                ' Trace

   Else                                                     ' Dimmer aktiv
      ' NEIN, Free_running ist ein und wird ausgeschaltet
      Free_running_flag = Passiv

      ' Wenn Konstante gesetzt Trace Output schreiben
      #if Dimmer_testmodus                                  ' Trace
         Print #2 , "Free Running ist passiv"
      #endif                                                ' Trace

   End If                                                   ' Dimmer aktiv

Return
'-- End Dimmer_free_running ---------------------------------------------------

' ********************
' * WIND: Windsensor *
' ********************

'------------------------------------------------------------------------------
' WIND - Gosub-Routine: Wind_konfig
' Subroutine zur Konfiguration der für die Windmessung notwendigen Datenstruk-
' turen, Timer usw.
'------------------------------------------------------------------------------
Wind_konfig:

   ' Wenn Konstante gesetzt Trace Output schreiben
   #if Wind_testmodus                                       ' Trace
      Print #2 , "Enter Wind_konfig"
   #endif                                                   ' Trace

   Wind_sensorimpulse = 0                                   ' Anzahl Sensorimpulse auf 0
   Wind_auswertung = Wind_auswertung_default                ' Auswerteintervall mit Defaultwert laden
   Wind_kmh_max = 0.0                                       ' Maximaler Wind initialisieren

   ' Kritische Windgeschwindigkeit mit Default-Wert laden
   Wind_beschattung_auf = Wind_beschattung_auf_default

Return
'-- End Wind_konfig -----------------------------------------------------------

'------------------------------------------------------------------------------
' WIND - Gosub-Routine: Wind_measurement
' Subroutine zur Berechung der aktuellen Windgeschwindigkeit im Auswerteinter-
' vall für km/ ud m/s.
' Die Ablage der errechneten Werte erfolgt in globalen Variablen
'------------------------------------------------------------------------------
Wind_measurement:

   ' Traceausgabe schreiben wenn Testmodus gesetzt ist
   #if Wind_testmodus                                       ' Trace
      Print #2 , "Enter Wind_measurement"
      Print #2 , ""
      Print #2 , "Erfassung     : " ; Wind_erfassung
      Print #2 , "Sectic_count  : " ; Sectic_count
      Print #2 , "Sensorimpulse : " ; Wind_sensorimpulse
   #endif                                                   ' Trace

   ' Interrupt während Auslesen von Zähler wegen "Kollisionsgefahr" sperren
   Disable Int6                                             ' Interrupt 6 sperren

   Temp_byte_1 = Wind_sensorimpulse                         ' Variable auslesen
   Wind_sensorimpulse = 0                                   ' Variable zurücksetzen

   ' Interrupt nur freigeben wenn Erfassung auch gewünscht
   If Wind_erfassung = True Then
      Enable Int6                                           ' Interrupt 6 wieder freigeben
   End If                                                   ' Winderfassung

   ' Berechung der Windgeschwindigkeit in km/h

   ' Messwert über Zeit auf eine Sekunde normieren
   Wind_geschwindigkeit_kmh = Temp_byte_1 / Wind_auswertung
   Wind_geschwindigkeit_kmh = Wind_geschwindigkeit_kmh * Wind_impuls_geschwindigkeit

   ' Umrechung von km/h in m/s: Wert * 1000 / 3600 => Wert / 3,6
   Wind_geschwindigkeit_ms = Wind_geschwindigkeit_kmh / 3.6

   ' Traceausgabe schreiben wenn Testmodus gesetzt ist
   #if Wind_testmodus                                       ' Trace

      ' Windgeschwindigkeit in km/h ausgeben
      Temp_string_1 = Fusing(wind_geschwindigkeit_kmh , "###.##")
      Print #2 , "Wind in km/h  : " ; Temp_string_1

      ' Windgeschwindigkeit in m/s ausgeben
      Temp_string_1 = Fusing(wind_geschwindigkeit_ms , "###.##")
      Print #2 , "Wind in m/s   : " ; Temp_string_1

      Print #2 , ""
   #endif                                                   ' Trace

Return
'-- End Wind_measurement ------------------------------------------------------

'------------------------------------------------------------------------------
' WIND - Gosub-Routine: Wind_erfassung_an
' Subroutine aktiviert den Interrupt zur Erfassung der "Windimpulse"
'------------------------------------------------------------------------------
Wind_erfassung_an:

   ' Wenn Konstante gesetzt Trace Output schreiben
   #if Wind_testmodus                                       ' Trace
      Print #2 , "Enter Wind_erfassung_an"
   #endif                                                   ' Trace

   ' Interrupt freigeben -> Erfassung aktiv
   Enable Int6
   Wind_erfassung = True
   Wind_sensorimpulse = 0

Return
'-- End Wind_erfassung_an -----------------------------------------------------

'------------------------------------------------------------------------------
' WIND - Gosub-Routine: Wind_erfassung_aus
' Subroutine deaktiviert den Interrupt zur Erfassung der "Windimpulse"
'------------------------------------------------------------------------------
Wind_erfassung_aus:

   ' Wenn Konstante gesetzt Trace Output schreiben
   #if Wind_testmodus                                       ' Trace
      Print #2 , "Enter Wind_erfassung_aus"
   #endif                                                   ' Trace

   ' Interrupt sperren -> Erfassung ausgeschaltet
   Disable Int6
   Wind_erfassung = False
   Wind_sensorimpulse = 0

Return
'-- End Wind_erfassung_an -----------------------------------------------------

' ********************
' * SHT71:  Sensor   *
' ********************

'------------------------------------------------------------------------------
' SHT71 - Gosub-Routine: Sht71_connection_reset_sequence
' Bei StartUp, Verbindungsverlust, Reset und CRC-Fehler muss das serielle
' Interface zurückgesetzt werden. Hierzu dient diese Routine.
' Die Routine sende die Im Datenblatt beschriebene connection reset sequence.
' Hierzu wird während DATA=high SCK mindestens 9 Mal getoggelt. Anschließend
' wird eine Transmission Start Sequenz gesendet.
'------------------------------------------------------------------------------
Sht71_connection_reset_sequence:

   ' Absicherung dass DATA und SCK Pin's auf Output stehen da Vorgeschichte unbekannt
   Config Temp_sck = Output
   Config Temp_data = Output

   ' Initial State
   Set Sht71_dataout
   Reset Sht71_sck

   ' Connection Reset Sequence
   '       _____________________________________________________________         _______
   ' Data:                                                              |_______|
   '          __    __    __    __    __    __    __    __    __       ___     ___
   ' SCK:  __|  |__|  |__|  |__|  |__|  |__|  |__|  |__|  |__|  |_____|   |___|   |_____

   For Sht71_temp_byte1 = 1 To 9
      Set Sht71_sck
      ' Waitus 2
      Reset Sht71_sck
      ' Waitus 2
   Next Sht71_temp_byte1                                    ' Bitcounter

   Gosub Sht71_transmission_start

Return
'-- End Sht71_connection_reset_sequence ---------------------------------------

'------------------------------------------------------------------------------
' SHT71 - Gosub-Routine: Sht71_transmission_start
' Diese Routine initiiert das Senden von Kommandos an den SHT71. Jede Aussen-
' dung von Daten vom ATmega zum SHT71 muss mit dieser Sequenz eingeleitet
' werden
'------------------------------------------------------------------------------
Sht71_transmission_start:

   ' Absicherung dass DATA und SCK Pin's auf Output stehen da Vorgeschichte unbekannt
   Config Temp_sck = Output
   Config Temp_data = Output

   ' Initial state
   Set Sht71_dataout
   Reset Sht71_sck
   $asm : Nop : $end Asm

   ' Transmission Start Sequence
   '       _____         _______
   ' Data:      |_______|
   '           ___     ___
   ' SCK:  ___|   |___|   |_____
   '
   Set Sht71_sck
   $asm : Nop : $end Asm
   Reset Sht71_dataout
   $asm : Nop : $end Asm
   Reset Sht71_sck
   $asm : Nop : Nop : Nop : $end Asm
   Set Sht71_sck
   $asm : Nop : $end Asm
   Set Sht71_dataout
   $asm : Nop : $end Asm
   Reset Sht71_sck

Return
'-- End Sht71_transmission_start ----------------------------------------------

'------------------------------------------------------------------------------
' SHT71 - Gosub-Routine: Sht71_perform_measurement
' Diese Routine liest Luftfeuchtigkeit und Temperatur aus dem Sensor aus. Die
' Rohdaten werden in den entsprechenden globalen Variablen gespeichert.
' Anschließend wird eine Checksumme-Überprüfung durchgeführt.
'------------------------------------------------------------------------------
Sht71_perform_measurement:

   ' Wenn Konstante gesetzt Trace Output schreiben
   #if Sht71_testmodus = 1                                  ' Trace
      Print #2 , "Enter Sht71_perform_measurement"
   #endif                                                   ' Trace

   ' globales Fehler-Gesamtergebnis zurücksetzen
   Sht71_error_result = 0

   ' Da die Temperatur für die Rechnung der relativen Luftfeuchtigkeit Basis ist
   ' wird diese zuerst ausgelesen und in den globalen Variablen abgelegt.

   ' Temperatur auslesen
   Sht71_temp_byte1 = Sht71_measure(sht71_temp_word , Sht71_checksum , Sht71_modus_temp)

   ' Prüfung ob ein Fehler bei der Kommunikation aufgetreten ist.
   If Sht71_temp_byte1 = 0 Then
      ' NEIN

      ' CRC-Prüfung der Temperaturmessdaten
      Sht71_temp_byte1 = Sht71_crc_check(sht71_temp_word , Sht71_checksum , Sht71_modus_temp)

      ' Prüfung ob CRC NOK
      If Sht71_temp_byte1 = Crc_nok Then

         ' JA, Messung wahr fehlerhaft -> Fehlerzähler erhöhen
         Incr Sht71_error_result

         ' Wenn Konstante gesetzt Trace Output schreiben
         #if Sht71_testmodus = 1                            ' Trace
            Print #2 , "CRC-Fehler TEMP"
         #endif                                             ' Trace

      End If                                                ' CRC NOK
   Else                                                     ' Fehlerprüfung
      ' JA -> Fehlerzähler erhöhen
      Incr Sht71_error_result

      ' Wenn Konstante gesetzt Trace Output schreiben
      #if Sht71_testmodus = 1                               ' Trace
         Print #2 , "Kommunikationsfehler TEMP"
      #endif                                                ' Trace
   End If                                                   ' Fehlerprüfung

   ' Luftfeuchtigkeit auslesen
   Sht71_temp_byte1 = Sht71_measure(sht71_humi_word , Sht71_checksum , Sht71_modus_humi)

   ' Prüfung ob ein Fehler bei der Kommunikation aufgetreten ist.
   If Sht71_temp_byte1 = 0 Then
      ' NEIN

      ' CRC-Prüfung der Luftfeuchtigkeitsmessdaten
      Sht71_temp_byte1 = Sht71_crc_check(sht71_humi_word , Sht71_checksum , Sht71_modus_humi)

      ' Prüfung ob CRC NOK
      If Sht71_temp_byte1 = Crc_nok Then

         ' JA, Messung wahr fehlerhaft -> Fehlerzähler erhöhen
         Incr Sht71_error_result

         ' Wenn Konstante gesetzt Trace Output schreiben
         #if Sht71_testmodus = 1                            ' Trace
            Print #2 , "CRC-Fehler HUMI"
         #endif                                             ' Trace

      End If                                                ' CRC NOK
   Else                                                     ' Fehlerprüfung
      ' JA -> Fehlerzähler erhöhen
      Incr Sht71_error_result

      ' Wenn Konstante gesetzt Trace Output schreiben
      #if Sht71_testmodus = 1                               ' Trace
         Print #2 , "Kommunikationsfehler HUMI"
      #endif                                                ' Trace
   End If                                                   ' Fehlerprüfung

   ' Wenn ein Fehler aufgetreten ist dann Sensor zurücksetzen
   If Sht71_error_result > 0 Then

      ' Wenn Konstante gesetzt Trace Output schreiben
      #if Sht71_testmodus = 1                               ' Trace
         Print #2 , "Perform Sensor Reset wegen Fehlern"
      #endif                                                ' Trace

      ' Softreset mit Kommunikations-Restart durchführen
      Sht71_temp_byte1 = Sht71_softreset()

      ' Zeit "Sht71_communication_wait" warten nach Reset / PowerUp
      Waitms Sht71_communication_wait

      ' Nach Reset Kommunikation erneut starten
      Gosub Sht71_connection_reset_sequence

   End If                                                   ' Fehlerprüfung

Return
'-- End Sht71_perform_measurement ---------------------------------------------

' ********************
' * LED:  LED-Array  *
' ********************

'------------------------------------------------------------------------------
' LED-Gosub-Routine: Led_clearlatch_set
' Subroutine setzt das Clear Latch Bit am Ausgang. Clear Input überschreibt
' unabhängig von den Input-Pins die Output-PIN's mit Low.
'
' Bemerkung:
' Das Clear Latch Bit muss auf HIGH gesetzt werden, damit überhaupt mit dem
' Latch gearbeitet werden kann! Beim Übergang von LOW auf HIGH werden die
' angelegten Datenbits auf dem jeweilig adressierten Nibble sofort aktiv und
' Sichtbar. Ggf. sollte ein korrektes Datenmuster und eine Adresse vor dem
' "loslassen" des Clear Latch Bits erfolgen.
'------------------------------------------------------------------------------
Led_clearlatch_set:

   ' Ggf. Trace ausgeben
   #if Main_testmodus                                       ' Trace
      Print #2 , "Enter Led_clearlatch_set"
   #endif                                                   ' Trace

   ' Clear Latch auf HIGH setzen
   Set Led_clr_port

Return
'-- End Led_clearlatch_set ----------------------------------------------------

'------------------------------------------------------------------------------
' LED-Gosub-Routine: Led_clearlatch_reset
' Subroutine setzt das Clear Latch Bit am Ausgang zurück. Clear Input
' überschreibt unabhängig von den Input-Pins die Output-PIN's mit Low.
'
' Bemerkung:
' Wird das Clear Latch auf LOW gesetzt so werden alle Ausgänge LOW. Die zuvor
' gespeicherten (gelatchten) Inhalte gehen verloren!
'------------------------------------------------------------------------------
Led_clearlatch_reset:

   ' Ggf. Trace ausgeben
   #if Main_testmodus                                       ' Trace
      Print #2 , "Enter Led_clearlatch_reset"
   #endif                                                   ' Trace

   ' Clear Latch auf LOW setzen
   Reset Led_clr_port

Return
'-- End Led_clearlatch_reset --------------------------------------------------

'------------------------------------------------------------------------------
' LED-Gosub-Routine: Led_reset_array
' Subroutine löscht alle Dateninhalte und damit alle LED, setzt den Datenbus
' auf &B0000 und setzt Adresse &B00 für das Low-Nibble. Das Clear Latch Bit
' wird nach der Löschung automatisch auf HIGH und damit auf Normalbetrieb
' geschaltet.
' Achtung: Alle gelatchten Dateninhalte gehen verloren
'------------------------------------------------------------------------------
Led_reset_array:

   ' Ggf. Trace ausgeben
   #if Main_testmodus                                       ' Trace
      Print #2 , "Enter Led_reset_array"
   #endif                                                   ' Trace

   ' Clear Latch auf LOW setzen und damit alle Dateninhalte löschen
   Reset Led_clr_port

   ' Daten auf 0000
   Reset Led_bit0_port : Reset Led_bit1_port : Reset Led_bit2_port : Reset Led_bit3_port

   ' Adresse &B00 einstellen
   Reset Led_adr0_port : Reset Led_adr1_port

   ' Clear Latch auf HIGH setzen und damit Normalbetrieb freigeben
   Set Led_clr_port

Return
'-- End Led_reset_array -------------------------------------------------------

'------------------------------------------------------------------------------
' LED-Gosub-Routine: Led_update_array
' Subroutine übertrag die globale Array-Variable Led_array in das Latch und
' gibt damit den aktuellen Inhalt aus.
'------------------------------------------------------------------------------
Led_update_array:

   ' Ggf. Trace ausgeben
   #if Main_testmodus                                       ' Trace
      Print #2 , "Enter Led_update_array"
   #endif                                                   ' Trace

   ' Löschen aller LED's, zurücksetzen Datenbits und Adresse auf &B00 stellen
   Gosub Led_reset_array

   ' LED-Array zur weiteren Verarbeitung in temp. Variable laden
   Temp_word_1 = Led_array

   ' Schleife über alle 4 Nibbles des LED-Arrays
   For Temp_byte_1 = 1 To 4

      ' Adresse für jeweiliges Nibble sinstellen. &B00 ist bereits durch Reset
      ' eingestellt, daher keine Veränderung
      Select Case Temp_byte_1
         Case 2:
            ' Setzte Adresse &B01
            Set Led_adr0_port
         Case 3:
            ' Setzte Adresse &B10
            Set Led_adr1_port : Reset Led_adr0_port
            ' Achtung: Reihenfolge Bits setzen für Adresse hat ggf. Einfluss auf
            ' niedrigeres oder höherwertiges Nibble da Adressengleichheit!!!
         Case 4:
            ' Setzte Adresse &B11
            Set Led_adr0_port

      End Select                                            ' Nibble-Adresse

      ' Extrahiere jeweiliges Nibble aus 16-Bit LED-Array
      Temp_byte_2 = Temp_word_1 And &H000F

      ' Verschiebe extrahiertes Nibble auf korrekte Datenposition für Port-Byte
      Shift Temp_byte_2 , Left , 3

      ' Hole aktuelles Portregister inkl. aktuell eingesteller Adresse und
      ' maskiere Datenbits für Nibble aus
      Temp_byte_3 = Porta And &B10000111
      ' Addiere oben extrahiertes Nibble in Portbyte zur Ausgabe udn Portbyte
      ' schreiben -> Ausgabe der jeweiligen LED's erfolgt
      Porta = Temp_byte_3 + Temp_byte_2

      ' Verschiebe nächstes Nibble in 16-Bit LED-Array auf Arbeitsposition
      Shift Temp_word_1 , Right , 4

   Next Temp_byte_1                                         ' Schleife ggf. wiederholen

Return
'-- End Led_update_array ------------------------------------------------------

' *********************************
' * EE: EEPROM (intern und extern *
' *********************************

'------------------------------------------------------------------------------
' EE-Gosubroutine: Ee_init_internal_eeprom
' Subroutine überprüft die Datenkonsitenz aufgrund des verwendeten Versions-
' Index und führt ggf. eine Grundinitialisierung der Datenstrukturen durch.
' Die Settingdaten werden aus dem internen EEPROM ausgelesen.
'------------------------------------------------------------------------------
Ee_init_internal_eeprom:

   ' Wenn Konstante gesetzt Trace Output schreiben
   #if Eeprom_testmodus                                     ' Trace
      Print #2 , "Enter Ee_init_internal_eeprom"
   #endif                                                   ' Trace

   ' Zur Vollständigkeit hier nochmals die Datendefinitionen:
   ' Dim Ee_data_version_intern As Eram Byte At &H0000           ' Speicherstelle für Datenversion
   ' Dim Ee_data_debug As Eram Byte At &H0001                    ' Byte-Variable: Test_debug_flag
   ' Dim Ee_data_lcd_helligkeit As Eram Byte At &H0002           ' Byte-Variable: Lcd_helligkeit
   ' Dim Ee_data_lcd_kontrast As Eram Byte At &H0003             ' Byte-Variable: Lcd_kontrastwert
   ' Dim Ee_data_lcd_saver As Eram Byte At &H0004                ' Byte-Variable: Lcd_screensaver
   ' Dim Ee_data_wind_intervall As Eram Byte At &H0005           ' Byte-Variable: Wind_auswertung
   ' Dim Ee_data_wind_speed As Eram Byte At &H0006               ' Byte-Variable: Wind_beschattung_auf
   ' Dim Ee_data_temp_intervall As Eram Byte At &H0007           ' Byte-Variable: Sht71_auswertung
   ' Dim Ee_data_dimmer As Eram Byte At &H0008                   ' Byte-Variable: Dim_flash_mode
   ' Dim Ee_data_dim_min As Eram Byte At &H0009                  ' Byte-Variable: Dim_helligkeit_min
   ' Dim Ee_data_dim_max As Eram Byte At &H000A                  ' Byte-Variable: Dim_helligkeit_max
   ' Dim Ee_data_sound As Eram Byte At &H000B                    ' Byte-Variable: Sound_flag
   ' Dim Ee_data_logging_flag As Eram Byte At &H000C             ' Byte-Variable: Ee_datalogging_flag
   ' Dim Ee_data_logging_intervall As Eram Word At &H000D        ' Word-Variable: Ee_auswertung
   ' Dim Ee_data_conv_timeout As Eram Byte At &H000F             ' Byte-Variable: Rel_beschattung_delay
   ' Dim Ee_data_conv_temp_flag As Eram Byte At &H0010           ' Byte-Variable: Rel_zu_temp_flag
   ' Dim Ee_data_conv_temperatur As Eram Byte At &H0011          ' Byte-Variable: Rel_auf_dunkelheit
   ' Dim Ee_data_conv_light_flag As Eram Byte At &H0012          ' Byte-Variable: Rel_auf_dunkel_flag
   ' Dim Ee_data_conv_lichtwert As Eram Byte At &H0013           ' Byte-Variable: Rel_zu_temperatur
   ' Dim Ee_data_conv_hotkey As Eram Byte At &H0014              ' Byte-Variable: Key_shortcut_status
   ' Dim Ee_data_fan As Eram Byte At &H0015                      ' Byte-Variable: Fan_sw_betrieb
   ' Dim Ee_data_fan_25_temp As Eram Byte At &H0016              ' Byte-Variable: Fan_25_temperatur
   ' Dim Ee_data_fan_50_temp As Eram Byte At &H0017              ' Byte-Variable: Fan_50_temperatur
   ' Dim Ee_data_fan_75_temp As Eram Byte At &H0018              ' Byte-Variable: Fan_75_temperatur
   ' Dim Ee_data_fan_100_temp As Eram Byte At &H0019             ' Byte-Variable: Fan_100_temperatur
   ' Dim Ee_data_dimmer_aktuell As Eram Byte At %H0020           ' Byte-Variable: Dim_helligkeitsstufe
   ' Dim Ee_data_sht71_t_min As Eram Single At &H0021            ' Single-Variable: Sht71_t_min
   ' Dim Ee_data_sht71_t_max As Eram Single At &H0025            ' Single-Variable: Sht71_t_max
   ' Dim Ee_data_sht71_rhtrue_min As Eram Single At &H0029       ' Single-Variable: Sht71_rhtrue_min
   ' Dim Ee_data_sht71_rhtrue_max As Eram Single At &H002D       ' Single-Variable: Sht71_rhtrue_max
   ' Dim Ee_data_wind_kmh_max As Eram Single At &H0031           ' Single-Variable: Wind_kmh_max

   ' Aktuelle Datenversion des internen EEPROM lesen
   Temp_byte_1 = Ee_data_version_intern

   ' Ist die Datenversion korrekt
   If Temp_byte_1 <> Akt_internal_ee_version Then

      ' NEIN, aktuelle Daten neu speichern

      ' Wenn Konstante gesetzt Trace Output schreiben
      #if Eeprom_testmodus                                  ' Trace
         Print #2 , "Datenversion intern stimmt nicht"
         Print #2 , "Initialisiere internes EEPROM neu!"
      #endif                                                ' Trace

      ' Datenstruktur internes EEPROM entspricht nicht dem aktuellen Stand
      ' => Datenstruktur neu anlegen bzw. neue Defaultwerte setzen.
      Gosub Ee_save_data_internal_eeprom

    Else                                                    ' Datenversion?

      ' JA, gespeicherte Werte laden und Variablen initialisieren

      ' Wenn Konstante gesetzt Trace Output schreiben
      #if Eeprom_testmodus                                  ' Trace
         Print #2 , "Datenversion intern stimmt"
         Print #2 , "Initialisiere Variablen aus internem EEPROM"
      #endif                                                ' Trace

      Gosub Ee_load_data_internal_eeprom

   End If                                                   ' Datenversion?

   ' Wenn Konstante gesetzt Trace Output schreiben
   #if Eeprom_testmodus                                     ' Trace
      Print #2 , "Setting-Daten internes EEPROM:"
      Print #2 , "=============================="

      ' Wert 01
      Temp_byte_1 = Ee_data_version_intern
      Print #2 , "Version Datenstruktur :      " ; Hex(temp_byte_1)

      ' Wert 02
      Temp_byte_1 = Ee_data_debug
      Print #2 , "Debug-Modus (Flag) :         " ; Hex(temp_byte_1)

      ' Wert 03
      Temp_byte_1 = Ee_data_lcd_helligkeit
      Print #2 , "LCD Helligkeit :             " ; Temp_byte_1

      ' Wert 04
      Temp_byte_1 = Ee_data_lcd_kontrast
      Print #2 , "LCD Kontrast :               " ; Temp_byte_1

      ' Wert 05
      Temp_byte_1 = Ee_data_lcd_saver
      Print #2 , "LCD Screen Saver :           " ; Hex(temp_byte_1)

      ' Wert 06
      Temp_byte_1 = Ee_data_wind_intervall
      Print #2 , "Auswerteintervall Wind :     " ; Temp_byte_1

      ' Wert 07
      Temp_byte_1 = Ee_data_wind_speed
      Print #2 , "Grenzgeschwindigkeit Wind :  " ; Temp_byte_1

      ' Wert 08
      Temp_byte_1 = Ee_data_temp_intervall
      Print #2 , "Auswerteintervall SHT71 :    " ; Temp_byte_1

      ' Wert 09
      Temp_byte_1 = Ee_data_dimmer
      Print #2 , "Flash-Mode Dimmer :          " ; Hex(temp_byte_1)

      ' Wert 10
      Temp_byte_1 = Ee_data_dim_min
      Print #2 , "Dimmer Min-Helligkeit :      " ; Temp_byte_1

      ' Wert 11
      Temp_byte_1 = Ee_data_dim_max
      Print #2 , "Dimmer Max-Helligkeit :      " ; Temp_byte_1

      ' Wert 12
      Temp_byte_1 = Ee_data_sound
      Print #2 , "Soundausgabe :               " ; Hex(temp_byte_1)

      ' Wert 13
      Temp_byte_1 = Ee_data_logging_flag
      Print #2 , "Logginwerte schreiben :      " ; Hex(temp_byte_1)

      ' Wert 14
      Temp_word_1 = Ee_data_logging_intervall
      Print #2 , "Zeitintervall Loggingdaten : " ; Temp_word_1

      ' Wert 15
      Temp_byte_1 = Ee_data_conv_timeout
      Print #2 , "Motorabschaltung :           " ; Temp_byte_1

      ' Wert 16
      Temp_byte_1 = Ee_data_conv_temp_flag
      Print #2 , "Autom. ZU bei Temperatur :   " ; Hex(temp_byte_1)

      ' Wert 17
      Temp_byte_1 = Ee_data_conv_temperatur
      Print #2 , "Grenztemperatur :            " ; Temp_byte_1

      ' Wert 18
      Temp_byte_1 = Ee_data_conv_light_flag
      Print #2 , "Autom. Auf bei Licht :       " ; Hex(temp_byte_1)

      ' Wert 19
      Temp_byte_1 = Ee_data_conv_lichtwert
      Print #2 , "Grenzhelligkeit :            " ; Temp_byte_1

      ' Wert 20
      Temp_byte_1 = Ee_data_conv_hotkey
      Print #2 , "Hotkey Kreuztasten :         " ; Hex(temp_byte_1)

      ' Wert 21
      Temp_byte_1 = Ee_data_fan
      Print #2 , "Luefter ueber ATmega :       " ; Hex(temp_byte_1)

      ' Wert 22
      Temp_byte_1 = Ee_data_fan_25_temp
      Print #2 , "Temp. fuer 25% Luefter :     " ; Temp_byte_1

      ' Wert 23
      Temp_byte_1 = Ee_data_fan_50_temp
      Print #2 , "Temp. fuer 50% Luefter :     " ; Temp_byte_1

      ' Wert 24
      Temp_byte_1 = Ee_data_fan_75_temp
      Print #2 , "Temp. fuer 75% Luefter :     " ; Temp_byte_1

      ' Wert 25
      Temp_byte_1 = Ee_data_fan_100_temp
      Print #2 , "Temp. fuer 100% Luefter :    " ; Temp_byte_1

      ' Wert 26
      Temp_byte_1 = Ee_data_dimmer_aktuell
      Print #2 , "Aktuelle Helligkeitsstufe :  " ; Temp_byte_1

      ' Wert 27
      Temp_single_1 = Ee_data_sht71_t_min
      Temp_string_1 = Fusing(temp_single_1 , "###.##")
      Print #2 , "Minimale Temperatur :        " ; Temp_string_1

      ' Wert 28
      Temp_single_1 = Ee_data_sht71_t_max
      Temp_string_1 = Fusing(temp_single_1 , "###.##")
      Print #2 , "Maximale Temperatur :        " ; Temp_string_1

      ' Wert 29
      Temp_single_1 = Ee_data_sht71_rhtrue_min
      Temp_string_1 = Fusing(temp_single_1 , "###.##")
      Print #2 , "Minimale Feuchtigkeit :      " ; Temp_string_1

      ' Wert 30
      Temp_single_1 = Ee_data_sht71_rhtrue_max
      Temp_string_1 = Fusing(temp_single_1 , "###.##")
      Print #2 , "Maximale Feuchtigkeit :      " ; Temp_string_1

      ' Wert 31
      Temp_single_1 = Ee_data_wind_kmh_max
      Temp_string_1 = Fusing(temp_single_1 , "###.##")
      Print #2 , "Max. Windgeschwindigkeit :   " ; Temp_string_1

   #endif                                                   ' Trace

Return
'-- End Ee_init_internal_eeprom -----------------------------------------------

'------------------------------------------------------------------------------
' EE-Gosubroutine: Ee_save_data_internal_eeprom
' Subroutine speichert alle Arbeitsvariablen in die angelegte Struktur des
' internen EEPROMs.
'------------------------------------------------------------------------------
Ee_save_data_internal_eeprom:

   ' Wenn Konstante gesetzt Trace Output schreiben
   #if Eeprom_testmodus                                     ' Trace
      Print #2 , "Enter Ee_save_data_internal_eeprom"
   #endif                                                   ' Trace

   Ee_data_version_intern = Akt_internal_ee_version
   Ee_data_debug = Test_debug_flag
   Ee_data_lcd_helligkeit = Lcd_helligkeit
   Ee_data_lcd_kontrast = Lcd_kontrastwert
   Ee_data_lcd_saver = Lcd_screensaver
   Ee_data_wind_intervall = Wind_auswertung
   Ee_data_wind_speed = Wind_beschattung_auf
   Ee_data_temp_intervall = Sht71_auswertung
   Ee_data_dimmer = Dim_flash_mode
   Ee_data_dim_min = Dim_helligkeit_min
   Ee_data_dim_max = Dim_helligkeit_max
   Ee_data_sound = Sound_flag
   Ee_data_logging_flag = Ee_datalogging_flag
   Ee_data_logging_intervall = Ee_auswertung
   Ee_data_conv_timeout = Rel_beschattung_delay
   Ee_data_conv_temp_flag = Rel_zu_temp_flag
   Ee_data_conv_temperatur = Rel_zu_temperatur
   Ee_data_conv_light_flag = Rel_auf_dunkel_flag
   Ee_data_conv_lichtwert = Rel_auf_dunkelheit
   Ee_data_conv_hotkey = Key_shortcut_status
   Ee_data_fan = Fan_sw_betrieb
   Ee_data_fan_25_temp = Fan_25_temperatur
   Ee_data_fan_50_temp = Fan_50_temperatur
   Ee_data_fan_75_temp = Fan_75_temperatur
   Ee_data_fan_100_temp = Fan_100_temperatur
   Ee_data_dimmer_aktuell = Dim_helligkeitsstufe
   Ee_data_sht71_t_min = Sht71_t_min
   Ee_data_sht71_t_max = Sht71_t_max
   Ee_data_sht71_rhtrue_min = Sht71_rhtrue_min
   Ee_data_sht71_rhtrue_max = Sht71_rhtrue_max
   Ee_data_wind_kmh_max = Wind_kmh_max

Return
'-- End Ee_save_data_internal_eeprom ------------------------------------------

'------------------------------------------------------------------------------
' EE-Gosubroutine: Ee_load_data_internal_eeprom
' Subroutine lädt alle Arbeitsvariablen aus den angelegte Struktur des
' internen EEPROMs.
'------------------------------------------------------------------------------
Ee_load_data_internal_eeprom:

   ' Wenn Konstante gesetzt Trace Output schreiben
   #if Eeprom_testmodus                                     ' Trace
      Print #2 , "Enter Ee_load_data_internal_eeprom"
   #endif                                                   ' Trace

   Test_debug_flag = Ee_data_debug
   Lcd_helligkeit = Ee_data_lcd_helligkeit
   Lcd_kontrastwert = Ee_data_lcd_kontrast
   Lcd_screensaver = Ee_data_lcd_saver
   Wind_auswertung = Ee_data_wind_intervall
   Wind_beschattung_auf = Ee_data_wind_speed
   Sht71_auswertung = Ee_data_temp_intervall
   Dim_flash_mode = Ee_data_dimmer
   Dim_helligkeit_min = Ee_data_dim_min
   Dim_helligkeit_max = Ee_data_dim_max
   Sound_flag = Ee_data_sound
   Ee_datalogging_flag = Ee_data_logging_flag
   Ee_auswertung = Ee_data_logging_intervall
   Rel_beschattung_delay = Ee_data_conv_timeout
   Rel_zu_temp_flag = Ee_data_conv_temp_flag
   Rel_zu_temperatur = Ee_data_conv_temperatur
   Rel_auf_dunkel_flag = Ee_data_conv_light_flag
   Rel_auf_dunkelheit = Ee_data_conv_lichtwert
   Key_shortcut_status = Ee_data_conv_hotkey
   Fan_sw_betrieb = Ee_data_fan
   Fan_25_temperatur = Ee_data_fan_25_temp
   Fan_50_temperatur = Ee_data_fan_50_temp
   Fan_75_temperatur = Ee_data_fan_75_temp
   Fan_100_temperatur = Ee_data_fan_100_temp
   Dim_helligkeitsstufe = Ee_data_dimmer_aktuell
   Sht71_t_min = Ee_data_sht71_t_min
   Sht71_t_max = Ee_data_sht71_t_max
   Sht71_rhtrue_min = Ee_data_sht71_rhtrue_min
   Sht71_rhtrue_max = Ee_data_sht71_rhtrue_max
   Wind_kmh_max = Ee_data_wind_kmh_max

Return
'-- End Ee_load_data_internal_eeprom ------------------------------------------

'------------------------------------------------------------------------------
' EE-Subroutine: Ee_init_external_eeprom
' Subroutine überprüft die Datenkonsitenz aufgrund des verwendeten Versions-
' Index und führt ggf. eine Grundinitialisierung der Datenstrukturen durch.
' Die für das Datenlogging notwendigen Basisdaten werden in globale Variablen
' geladen
'------------------------------------------------------------------------------
Ee_init_external_eeprom:

   ' Wenn Konstante gesetzt Trace Output schreiben
   #if Eeprom_testmodus                                     ' Trace
      Print #2 , "Enter Ee_init_external_eeprom"
   #endif                                                   ' Trace

   ' EEPROM-Version auslesen
   Ee_data_version_extern = Ee_read_eeprom_byte(ee_data_version_extern_adress)

   ' Prüfen ob gelesene Version der aktuellen Version entspricht
   If Ee_data_version_extern <> Akt_external_ee_version Then
      ' NEIN, EEPROM-Version ist ungleich aktueller Version

     ' Wenn Konstante gesetzt Trace Output schreiben
     #if Eeprom_testmodus                                   ' Trace
         Print #2 , "Datenversion extern stimmt nicht"
         Print #2 , "Initialisiere externes EEPROM neu"
      #endif                                                ' Trace

      ' Datenstruktur externes EEPROM entspricht nicht dem aktuellen Stand
      ' => Datenstruktur neu anlegen bzw. neue Defaultwerte setzen.

      Ee_data_version_extern = Akt_external_ee_version
      Ee_data_count = Ee_data_count_default
      Ee_data_overrun = Ee_data_overrun_default

      Call Ee_write_eeprom_byte(ee_data_version_extern_adress , Akt_external_ee_version)
      Waitms 10                                             'Wartezeit für sicheres Schreiben
      Call Ee_write_eeprom_word(ee_data_count_adress , Ee_data_count_default)
      Waitms 10                                             'Wartezeit für sicheres Schreiben
      Call Ee_write_eeprom_byte(ee_data_overrun_adress , Ee_data_overrun_default)

   Else                                                     ' Datenversion
      ' JA, Daten entsprechen den aktuellen Versionen

      ' Wenn Konstante gesetzt Trace Output schreiben
      #if Eeprom_testmodus                                  ' Trace
         Print #2 , "Datenversion extern stimmt"
         Print #2 , "Initialisiere Daten aus externem EEPROM"
      #endif                                                ' Trace

      ' Datenversion aus externem EEPROM auslesen
      Ee_data_version_extern = Ee_read_eeprom_byte(ee_data_version_extern_adress)
      ' Data-Counter auslesen
      Ee_data_count = Ee_read_eeprom_word(ee_data_count_adress)
      ' Overrun-Counter auslesen
      Ee_data_overrun = Ee_read_eeprom_byte(ee_data_overrun_adress)

   End If                                                   ' Datenversion

   ' Wenn Konstante gesetzt Trace Output schreiben
   #if Eeprom_testmodus                                     ' Trace
      Print #2 , "Setting-Daten externes EEPROM:"
      Print #2 , "=============================="
      Print #2 , "Version Datenstruktur : " ; Hex(ee_data_version_extern)
      Print #2 , "Datencounter  :         " ; Hex(ee_data_count)
      Print #2 , "Overrun-Zaehler :       " ; Hex(ee_data_overrun)
   #endif                                                   ' Trace

Return
'-- End Ee_init_external_eeprom -----------------------------------------------

'------------------------------------------------------------------------------
' Devices schließend und ggf. "Terminate Programm execution"
'------------------------------------------------------------------------------
Close #2
End                                                         'end program

'------------------------------------------------------------------------------
' Definition von globalen Konstantenfeldern
'------------------------------------------------------------------------------

'------------------------------------------------------------------------------
' DATA:           Bedatung der Wochentage für DCF77 und Softclock
' Rückgabewerte:  Zeiger auf Wochentage
'------------------------------------------------------------------------------

Wochentag:
Data "  " , "Mo" , "Di" , "Mi" , "Do" , "Fr" , "Sa" , "So"

'----- Ende Wochentag ---------------------------------------------------------

'------------------------------------------------------------------------------
' DATA:           Bedatung der Tagesanzahl innerhalb der Monate
' Rückgabewerte:  Zeiger auf Tagesanzahl
'------------------------------------------------------------------------------

Monate:
Data 0 , 31 , 28 , 31 , 30 , 31 , 30 , 31 , 31 , 30 , 31 , 30 , 31

'----- Ende Wochentag ---------------------------------------------------------

'------------------------------------------------------------------------------
' DATA:           Bedatung der Triac-Zündtabelle
' Rückgabewerte:  Zeiger auf Zündzeitpunkte des Dimmers
'------------------------------------------------------------------------------
Triac_zuendtabelle:
' Tabelle mit Originalwerten
' Data 156 , 139 , 131 , 125 , 120 , 116 , 111 , 108
' Data 103 , 100 , 95 , 92 , 89 , 86 , 83 , 80
' Data 77 , 73 , 70 , 67 , 64 , 61 , 56 , 53,
' Data 50 , 45 , 41 , 36 , 31 , 25 , 17 , 0
' Für Timer0 werden Einerkompliment-Werte (255-Wert) benötigt
Data 99 , 116 , 124 , 130 , 135 , 139 , 144 , 147
Data 152 , 155 , 160 , 163 , 166 , 169 , 172 , 175
Data 178 , 182 , 185 , 188 , 191 , 194 , 199 , 202
Data 205 , 210 , 214 , 219 , 224 , 230 , 238 , 250
'----- Ende Triac_zuendtabelle ------------------------------------------------

'------------------------------------------------------------------------------
' DATA:           Bedatung der SHT71 Checksummen
' Rückgabewerte:  Zeiger auf CRC-Checksummen
'------------------------------------------------------------------------------
Sht71_crc_table:
Data 0 , 49 , 98 , 83 , 196 , 245 , 166 , 151 , 185 , 136 , 219 , 234 , 125 , 76 , 31 , 46,
Data 67 , 114 , 33 , 16 , 135 , 182 , 229 , 212 , 250 , 203 , 152 , 169 , 62 , 15 , 92 , 109,
Data 134 , 183 , 228 , 213 , 66 , 115 , 32 , 17 , 63 , 14 , 93 , 108 , 251 , 202 , 153 , 168,
Data 197 , 244 , 167 , 150 , 1 , 48 , 99 , 82 , 124 , 77 , 30 , 47 , 184 , 137 , 218 , 235,
Data 61 , 12 , 95 , 110 , 249 , 200 , 155 , 170 , 132 , 181 , 230 , 215 , 64 , 113 , 34 , 19,
Data 126 , 79 , 28 , 45 , 186 , 139 , 216 , 233 , 199 , 246 , 165 , 148 , 3 , 50 , 97 , 80,
Data 187 , 138 , 217 , 232 , 127 , 78 , 29 , 44 , 2 , 51 , 96 , 81 , 198 , 247 , 164 , 149,
Data 248 , 201 , 154 , 171 , 60 , 13 , 94 , 111 , 65 , 112 , 35 , 18 , 133 , 180 , 231 , 214,
Data 122 , 75 , 24 , 41 , 190 , 143 , 220 , 237 , 195 , 242 , 161 , 144 , 7 , 54 , 101 , 84,
Data 57 , 8 , 91 , 106 , 253 , 204 , 159 , 174 , 128 , 177 , 226 , 211 , 68 , 117 , 38 , 23,
Data 252 , 205 , 158 , 175 , 56 , 9 , 90 , 107 , 69 , 116 , 39 , 22 , 129 , 176 , 227 , 210,
Data 191 , 142 , 221 , 236 , 123 , 74 , 25 , 40 , 6 , 55 , 100 , 85 , 194 , 243 , 160 , 145,
Data 71 , 118 , 37 , 20 , 131 , 178 , 225 , 208 , 254 , 207 , 156 , 173 , 58 , 11 , 88 , 105,
Data 4 , 53 , 102 , 87 , 192 , 241 , 162 , 147 , 189 , 140 , 223 , 238 , 121 , 72 , 27 , 42,
Data 193 , 240 , 163 , 146 , 5 , 52 , 103 , 86 , 120 , 73 , 26 , 43 , 188 , 141 , 222 , 239,
Data 130 , 179 , 224 , 209 , 70 , 119 , 36 , 21 , 59 , 10 , 89 , 104 , 255 , 206 , 157 , 172
'----- Ende SHT71_Checksummen -------------------------------------------------

'------------------------------------------------------------------------------
' DATA:           Bedatung der Menue-State-Machine
' Rückgabewerte:  Zeiger auf Zustände , Unterprogramme, Displaytexte, usw.
' Beschreibung:   1. Zeile: für jede Taste genau eine Verzeigung ADR2
'                           (siehe auch Anzahl der Tasten (Key_buttons = xx))
'                           Reihenfolge der Tasten in Zeile 1:
'                                Hoch | Runter | Links | Rechts | Enter
'                 2. Zeile: Sprunglabel als ADR2 für ein ggf. anzuspringendes
'                           Unterprogramm
'                 3. Zeile: Binaermuster für Ausgabeflag von LCD-Zeile 1-3
'                 4. Zeile: Displaytext für LCD-Zeile 1 des akt. Status als DATA Feld
'                 5. Zeile: Displaytext für LCD-Zeile 2 des akt. Status als DATA Feld
'                 6. Zeile: Displaytext für LCD-Zeile 3 des akt. Status als DATA Feld
' Hinweis:        wenn nichts passieren soll wird das Label NULL eingetragen
'------------------------------------------------------------------------------

' Null ist ein Dummy-Flag für Zustand und Gosub -> tue nichts
Null:
         Return

' Menü MEN1 - Hauptmenue ConvCtrl
Men1:
         ' Hoch       Runter      Links       Rechts      Enter
         Adr2 Men8 : Adr2 Men2 : Adr2 Null : Adr2 Men11 : Adr2 Null
         Adr2 Null
         Data &B00000111
         '     1234567890123456
         Data "1            1/8"
         Data "   Hauptmenue"
         Data "    ConvCtrl"

Men11:
            ' Hoch       Runter      Links       Rechts      Enter
            Adr2 Null : Adr2 Null : Adr2 Men1 : Adr2 Null : Adr2 Men1
            Adr2 Null
            Data &B00000111
            '     1234567890123456
            Data "1-1"
            Data "ConvCtrl    V1.0"
            Data "(C) M.Fulde 2008"

' Menü MEN2 - Beschattung
Men2:
         ' Hoch       Runter      Links       Rechts       Enter
         Adr2 Men1 : Adr2 Men3 : Adr2 Null : Adr2 Men21 : Adr2 Null
         Adr2 Menue_men2
         Data &B00000011
         '     1234567890123456
         Data "2            2/8"
         Data "  Beschattung"
         Data ""

Men21:
            ' Hoch        Runter       Links       Rechts        Enter
            Adr2 Men22 : Adr2 Men22 : Adr2 Men2 : Adr2 Men211 : Adr2 Men2
            Adr2 Null
            Data &B00000111
            '     1234567890123456
            Data "2-1          1/2"
            Data "Betriebszustand "
            Data "   anzeigen"

Men211:
               ' Hoch         Runter        Links        Rechts      Enter
               Adr2 Men217 : Adr2 Men212 : Adr2 Men21 : Adr2 Null : Adr2 Men2
               Adr2 Menue_men211
               Data &B00000111
               '     1234567890123456
               Data "2-1-1        1/7"
               Data " Zeitsteuerung"
               Data "Timeout:"

Men212:
               ' Hoch         Runter        Links        Rechts      Enter
               Adr2 Men211 : Adr2 Men213 : Adr2 Men21 : Adr2 Null : Adr2 Men2
               Adr2 Menue_men212
               Data &B00000111
               '     1234567890123456
               Data "2-1-2        2/7"
               Data " Zeitsteuerung"
               Data "Auf:"

Men213:
               ' Hoch         Runter        Links        Rechts      Enter
               Adr2 Men212 : Adr2 Men214 : Adr2 Men21 : Adr2 Null : Adr2 Men2
               Adr2 Menue_men213
               Data &B00000111
               '     1234567890123456
               Data "2-1-3        3/7"
               Data " Zeitsteuerung"
               Data "Zu:"

Men214:
               ' Hoch         Runter        Links        Rechts      Enter
               Adr2 Men213 : Adr2 Men215 : Adr2 Men21 : Adr2 Null : Adr2 Men2
               Adr2 Menue_men214
               Data &B00000111
               '     1234567890123456
               Data "2-1-4        4/7"
               Data " Auffahrgrund"
               Data "Wind:"

Men215:
               ' Hoch         Runter        Links        Rechts      Enter
               Adr2 Men214 : Adr2 Men216 : Adr2 Men21 : Adr2 Null : Adr2 Men2
               Adr2 Menue_men215
               Data &B00000111
               '     1234567890123456
               Data "2-1-5        5/7"
               Data " Auffahrgrund"
               Data "Regen:"

Men216:
               ' Hoch         Runter        Links        Rechts      Enter
               Adr2 Men215 : Adr2 Men217 : Adr2 Men21 : Adr2 Null : Adr2 Men2
               Adr2 Menue_men216
               Data &B00000111
               '     1234567890123456
               Data "2-1-6        6/7"
               Data " Auffahrgrund"
               Data "Licht:"

Men217:
               ' Hoch         Runter        Links        Rechts      Enter
               Adr2 Men216 : Adr2 Men211 : Adr2 Men21 : Adr2 Null : Adr2 Men2
               Adr2 Menue_men217
               Data &B00000111
               '     1234567890123456
               Data "2-1-7        7/7"
               Data "  Zufahrgrund"
               Data "Temp:"

Men22:
            ' Hoch        Runter       Links       Rechts        Enter
            Adr2 Men21 : Adr2 Men21 : Adr2 Men2 : Adr2 Men221 : Adr2 Men2
            Adr2 Null
            Data &B00000011
            '     1234567890123456
            Data "2-2          2/2"
            Data "    Antrieb"
            Data ""

Men221:
               ' Hoch         Runter        Links        Rechts         Enter
               Adr2 Men223 : Adr2 Men222 : Adr2 Men22 : Adr2 Men2211 : Adr2 Men2
               Adr2 Menue_men221
               Data &B00000011
               '     1234567890123456
               Data "2-2-1        1/3"
               Data "   Auffahren"
               Data ""

Men2211:
                  ' Hoch       Runter         Links         Rechts      Enter
                  Adr2 Null : Adr2 Men2221 : Adr2 Men221 : Adr2 Null : Adr2 Men2231
                  Adr2 Menue_men2211
                  Data &B00000101
                  '     1234567890123456
                  Data "   Auf  aktiv"
                  Data ""
                  Data "{002}=Zu      {005}=Stop"

Men222:
               ' Hoch         Runter        Links        Rechts         Enter
               Adr2 Men221 : Adr2 Men223 : Adr2 Men22 : Adr2 Men2221 : Adr2 Men2
               Adr2 Menue_men222
               Data &B00000011
               '     1234567890123456
               Data "2-2-2        2/3"
               Data "    Zufahren"
               Data ""

Men2221:
                  ' Hoch          Runter      Links         Rechts      Enter
                  Adr2 Men2211 : Adr2 Null : Adr2 Men222 : Adr2 Null : Adr2 Men2231
                  Adr2 Menue_men2221
                  Data &B00000101
                  '     1234567890123456
                  Data "    Zu aktiv"
                  Data ""
                  Data "{001}=Auf     {005}=Stop"

Men223:
               ' Hoch         Runter        Links        Rechts         Enter
               Adr2 Men222 : Adr2 Men221 : Adr2 Men22 : Adr2 Men2231 : Adr2 Men2
               Adr2 Menue_men223
               Data &B00000011
               '     1234567890123456
               Data "2-2-3        3/3"
               Data "  Antrieb Stop"
               Data ""

Men2231:
                  ' Hoch          Runter         Links         Rechts      Enter
                  Adr2 Men2211 : Adr2 Men2221 : Adr2 Men223 : Adr2 Null : Adr2 Men2
                  Adr2 Menue_men2231
                  Data &B00000101
                  '     1234567890123456
                  Data "   Stop aktiv"
                  Data ""
                  Data "{001}=Auf       {002}=Zu"

' Menü MEN3 - Dimmer
Men3:
         ' Hoch       Runter      Links       Rechts      Enter
         Adr2 Men2 : Adr2 Men4 : Adr2 Null : Adr2 Men31 : Adr2 Null
         Adr2 Menue_men3
         Data &B00000011
         '     1234567890123456
         Data "3            3/8"
         Data "     Dimmer"
         Data ""

Men31:
            ' Hoch        Runter      Links       Rechts        Enter
            Adr2 Men32 : Adr2 Men32 : Adr2 Men3 : Adr2 Men311 : Adr2 Men3
            Adr2 Null
            Data &B00000111
            '     1234567890123456
            Data "3-1          1/2"
            Data "Betriebszustand"
            Data "    anzeigen"

Men311:
               ' Hoch         Runter        Links        Rechts      Enter
               Adr2 Men312 : Adr2 Men312 : Adr2 Men31 : Adr2 Null : Adr2 Men3
               Adr2 Menue_men311
               Data &B00000111
               '     1234567890123456
               Data "3-1-1        1/2"
               Data "Dauerlicht:"
               Data "Flashmode:"

Men312:
               ' Hoch         Runter        Links        Rechts      Enter
               Adr2 Men311 : Adr2 Men311 : Adr2 Men31 : Adr2 Null : Adr2 Men3
               Adr2 Menue_men312
               Data &B00000111
               '     1234567890123456
               Data "3-1-2        2/2"
               Data "Dimmerstufe:"
               Data "Min:     Max:"

Men32:
            ' Hoch        Runter       Links       Rechts        Enter
            Adr2 Men31 : Adr2 Men31 : Adr2 Men3 : Adr2 Men321 : Adr2 Men3
            Adr2 Null
            Data &B00000011
            '     1234567890123456
            Data "3-2          2/2"
            Data "  Beleuchtung"
            Data ""

Men321:
               ' Hoch         Runter       Links        Rechts         Enter
               Adr2 Men324 : Adr2 Men322 : Adr2 Men32 : Adr2 Men3211 : Adr2 Men3
               Adr2 Null
               Data &B00000011
               '     1234567890123456
               Data "3-2-1        1/4"
               Data "   Dauerlicht"
               Data ""

Men3211:
               ' Hoch           Runter          Links         Rechts          Enter
               Adr2 Men32111 : Adr2 Men32111 : Adr2 Men321 : Adr2 Men32111 : Adr2 Men3
               Adr2 Menue_men3211
               Data &B00000101
               '     1234567890123456
               Data "   Dauerlicht"
               Data ""
               Data "{003}=Back  {004}{001}{002}=Fkt."

Men32111:
                  ' Hoch           Runter          Links         Rechts          Enter
                  Adr2 Men32111 : Adr2 Men32111 : Adr2 Men321 : Adr2 Men32111 : Adr2 Men3
                  Adr2 Menue_men32111
                  Data &B00000101
                  '     1234567890123456
                  Data "   Dauerlicht"
                  Data ""
                  Data "{003}=Back  {004}{001}{002}=Fkt."

Men322:
            ' Hoch         Runter        Links        Rechts         Enter
            Adr2 Men321 : Adr2 Men323 : Adr2 Men32 : Adr2 Men3221 : Adr2 Men3
            Adr2 Menue_men322
            Data &B00000011
            '     1234567890123456
            Data "3-2-2        2/4"
            Data " Dimmer heller"
            Data ""

Men3221:
               ' Hoch           Runter           Links         Rechts          Enter
               Adr2 Men32211 : Adr2 Men32311 : Adr2 Men322 : Adr2 Men32211 : Adr2 Men3241
               Adr2 Menue_men3221
               Data &B00000101
               '     1234567890123456
               Data " Dimmer heller"
               Data ""
               Data "{001}{002}{004}=Licht  {005}=Aus"

Men32211:
                  ' Hoch           Runter           Links         Rechts          Enter
                  Adr2 Men32211 : Adr2 Men32311 : Adr2 Men322 : Adr2 Men32211 : Adr2 Men3241
                  Adr2 Menue_men32211
                  Data &B00000101
                  '     1234567890123456
                  Data " Dimmer heller"
                  Data ""
                  Data "{001}{002}{004}=Licht  {005}=Aus"

Men323:
            ' Hoch         Runter        Links        Rechts         Enter
            Adr2 Men322 : Adr2 Men324 : Adr2 Men32 : Adr2 Men3231 : Adr2 Men3
            Adr2 Menue_men323
            Data &B00000011
            '     1234567890123456
            Data "3-2-3        3/4"
            Data " Dimmer dunkler"
            Data ""

Men3231:
               ' Hoch           Runter           Links         Rechts          Enter
               Adr2 Men32211 : Adr2 Men32311 : Adr2 Men323 : Adr2 Men32311 : Adr2 Men3241
               Adr2 Menue_men3231
               Data &B00000101
               '     1234567890123456
               Data " Dimmer dunkler"
               Data ""
               Data "{001}{002}{004}=Licht  {005}=Aus"

Men32311:
                  ' Hoch           Runter           Links         Rechts          Enter
                  Adr2 Men32211 : Adr2 Men32311 : Adr2 Men323 : Adr2 Men32311 : Adr2 Men3241
                  Adr2 Menue_men32311
                  Data &B00000101
                  '     1234567890123456
                  Data " Dimmer dunkler"
                  Data ""
                  Data "{001}{002}{004}=Licht  {005}=Aus"

Men324:
            ' Hoch         Runter        Links        Rechts         Enter
            Adr2 Men323 : Adr2 Men321 : Adr2 Men32 : Adr2 Men3241 : Adr2 Men3
            Adr2 Menue_men324
            Data &B00000011
            '     1234567890123456
            Data "3-2-4        4/4"
            Data "   Dimmer aus"
            Data ""

Men3241:
               ' Hoch          Runter         Links         Rechts         Enter
               Adr2 Men3221 : Adr2 Men3231 : Adr2 Men324 : Adr2 Men3241 : Adr2 Men3
               Adr2 Menue_men3241
               Data &B00000110
               '     1234567890123456
               Data ""
               Data "   Dimmer aus"
               Data "{002}=dunkel  {001}=hell"

' Menü MEN4 - Umweltdaten
Men4:
         ' Hoch       Runter      Links       Rechts       Enter
         Adr2 Men3 : Adr2 Men5 : Adr2 Null : Adr2 Men41 : Adr2 Null
         Adr2 Menue_men4
         Data &B00000011
         '     1234567890123456
         Data "4            4/8"
         Data "  Umweltdaten"
         Data ""

Men41:
            ' Hoch        Runter       Links       Rechts        Enter
            Adr2 Men46 : Adr2 Men42 : Adr2 Men4 : Adr2 Men411 : Adr2 Men4
            Adr2 Menue_men41
            Data &B00000011
            '     1234567890123456
            Data "4-1          1/6"
            Data "      Wind"
            Data ""

Men411:
               ' Hoch       Runter        Links        Rechts        Enter
               Adr2 Null : Adr2 Men421 : Adr2 Men41 : Adr2 Null : Adr2 Men4
               Adr2 Menue_men411
               Data &B00000011
               '     1234567890123456
               Data "4-1-1        1/1"
               Data "Geschwindigkeit:"
               Data ""

Men42:
            ' Hoch        Runter       Links       Rechts        Enter
            Adr2 Men41 : Adr2 Men43 : Adr2 Men4 : Adr2 Men421 : Adr2 Men4
            Adr2 Menue_men42
            Data &B00000011
            '     1234567890123456
            Data "4-2          2/6"
            Data "      Regen"
            Data ""

Men421:
               ' Hoch         Runter        Links        Rechts        Enter
               Adr2 Men411 : Adr2 Men431 : Adr2 Men42 : Adr2 Null : Adr2 Men4
               Adr2 Menue_men421
               Data &B00000011
               '     1234567890123456
               Data "4-2-1        1/1"
               Data "Regensensor:"
               Data ""

Men43:
            ' Hoch        Runter       Links       Rechts        Enter
            Adr2 Men42 : Adr2 Men44 : Adr2 Men4 : Adr2 Men431 : Adr2 Men4
            Adr2 Menue_men43
            Data &B00000011
            '     1234567890123456
            Data "4-3          3/6"
            Data "Innentemperatur"
            Data ""

Men431:
               ' Hoch         Runter        Links        Rechts        Enter
               Adr2 Men421 : Adr2 Men441 : Adr2 Men43 : Adr2 Null : Adr2 Men4
               Adr2 Menue_men431
               Data &B00000111
               '     1234567890123456
               Data "4-3-1        1/1"
               Data "Temp:"
               Data "TauP:"

Men44:
            ' Hoch       Runter        Links       Rechts        Enter
            Adr2 Men43 : Adr2 Men45 : Adr2 Men4 : Adr2 Men441 : Adr2 Men4
            Adr2 Menue_men44
            Data &B00000011
            '     1234567890123456
            Data "4-4          4/6"
            Data "Luftfeuchtigkeit"
            Data ""

Men441:
               ' Hoch         Runter        Links        Rechts        Enter
               Adr2 Men431 : Adr2 Men451 : Adr2 Men44 : Adr2 Null : Adr2 Men4
               Adr2 Menue_men441
               Data &B00000011
               '     1234567890123456
               Data "4-4-1        1/1"
               Data "Feuchtigkeit:"
               Data ""

Men45:
            ' Hoch        Runter       Links       Rechts        Enter
            Adr2 Men44 : Adr2 Men46 : Adr2 Men4 : Adr2 Men451 : Adr2 Men4
            Adr2 Menue_men45
            Data &B00000011
            '     1234567890123456
            Data "4-5          5/6"
            Data "Lichtintensit{132}t"
            Data ""

Men451:
               ' Hoch         Runter        Links        Rechts        Enter
               Adr2 Men441 : Adr2 Men461 : Adr2 Men45 : Adr2 Null : Adr2 Men4
               Adr2 Menue_men451
               Data &B00000011
               '     1234567890123456
               Data "4-5-1        1/1"
               Data "Helligkeit:"
               Data ""

Men46:
            ' Hoch        Runter       Links       Rechts        Enter
            Adr2 Men45 : Adr2 Men41 : Adr2 Men4 : Adr2 Men461 : Adr2 Men4
            Adr2 Null
            Data &B00000011
            '     1234567890123456
            Data "4-6          6/6"
            Data "  Min/Max-Werte"
            Data ""

Men461:
               ' Hoch         Runter        Links        Rechts      Enter
               Adr2 Men451 : Adr2 Men462 : Adr2 Men46 : Adr2 Null : Adr2 Men4
               Adr2 Menue_men461
               Data &B00000011
               '     1234567890123456
               Data "4-6-1        1/3"
               Data "Geschwindigkeit:"
               Data ""

Men462:
               ' Hoch         Runter        Links        Rechts      Enter
               Adr2 Men461 : Adr2 Men463 : Adr2 Men46 : Adr2 Null : Adr2 Men4
               Adr2 Menue_men462
               Data &B00000111
               '     1234567890123456
               Data "4-6-2        2/3"
               Data "MinTemp:"
               Data "MaxTemp:"

Men463:
               ' Hoch         Runter      Links        Rechts      Enter
               Adr2 Men462 : Adr2 Null : Adr2 Men46 : Adr2 Null : Adr2 Men4
               Adr2 Menue_men463
               Data &B00000111
               '     1234567890123456
               Data "4-6-3        3/3"
               Data "MinFeucht:"
               Data "MaxFeucht:"

' Menü MEN5 - Uhrzeit&Datum
Men5:
         ' Hoch       Runter      Links       Rechts       Enter
         Adr2 Men4 : Adr2 Men6 : Adr2 Null : Adr2 Men51 : Adr2 Null
         Adr2 Menue_men5
         Data &B00000011
         '     1234567890123456
         Data "5            5/8"
         Data "Uhrzeit & Datum"
         Data ""

Men51:
            ' Hoch       Runter      Links       Rechts      Enter
            Adr2 Null : Adr2 Null : Adr2 Men5 : Adr2 Null : Adr2 Men5
            Adr2 Menue_men51
            Data &B00000001
            '     1234567890123456
            Data "5-1          1/1"
            Data ""
            Data ""

' Menü MEN6 - Datalogging
Men6:
         ' Hoch       Runter      Links       Rechts       Enter
         Adr2 Men5 : Adr2 Men7 : Adr2 Null : Adr2 Men61 : Adr2 Null
         Adr2 Null
         Data &B00000011
         '     1234567890123456
         Data "6            6/8"
         Data "  Data-Logging"
         Data ""

Men61:
            ' Hoch        Runter       Links       Rechts        Enter
            Adr2 Men62 : Adr2 Men62 : Adr2 Men6 : Adr2 Men611 : Adr2 Men6
            Adr2 Null
            Data &B00000111
            '     1234567890123456
            Data "6-1          1/2"
            Data "  Loggingdaten"
            Data "    anzeigen"

Men611:
               ' Hoch         Runter        Links        Rechts         Enter
               Adr2 Men612 : Adr2 Men612 : Adr2 Men61 : Adr2 Men6111 : Adr2 Men6
               Adr2 Null
               Data &B00000011
               '     1234567890123456
               Data "6-1-1        1/2"
               Data "Internes EEPROM"
               Data ""

Men6111:
                  ' Hoch       Runter      Links         Rechts      Enter
                  Adr2 Null : Adr2 Null : Adr2 Men611 : Adr2 Null : Adr2 Men6
                  Adr2 Menue_men6111
                  Data &B00000011
                  '     1234567890123456
                  Data "6-1-1-1      1/1"
                  Data "Datenversion"
                  Data ""

Men612:
               ' Hoch         Runter        Links        Rechts         Enter
               Adr2 Men611 : Adr2 Men611 : Adr2 Men61 : Adr2 Men6121 : Adr2 Men6
               Adr2 Null
               Data &B00000011
               '     1234567890123456
               Data "6-1-2        2/2"
               Data "Externes EEPROM"
               Data ""

Men6121:
                  ' Hoch          Runter         Links         Rechts      Enter
                  Adr2 Men6124 : Adr2 Men6122 : Adr2 Men612 : Adr2 Null : Adr2 Men6
                  Adr2 Menue_men6121
                  Data &B00000011
                  '     1234567890123456
                  Data "6-1-2-1      1/4"
                  Data "Datenversion"
                  Data ""

Men6122:
                  ' Hoch          Runter         Links         Rechts      Enter
                  Adr2 Men6121 : Adr2 Men6123 : Adr2 Men612 : Adr2 Null : Adr2 Men6
                  Adr2 Menue_men6122
                  Data &B00000011
                  '     1234567890123456
                  Data "6-1-2-2      2/4"
                  Data "Datencounter"
                  Data ""

Men6123:
                  ' Hoch          Runter         Links         Rechts      Enter
                  Adr2 Men6122 : Adr2 Men6124 : Adr2 Men612 : Adr2 Null : Adr2 Men6
                  Adr2 Menue_men6123
                  Data &B00000011
                  '     1234567890123456
                  Data "6-1-2-3      3/4"
                  Data "{154}berlaufz{132}hler"
                  Data ""

Men6124:
                  ' Hoch          Runter         Links         Rechts      Enter
                  Adr2 Men6123 : Adr2 Men6121 : Adr2 Men612 : Adr2 Null : Adr2 Men6
                  Adr2 Menue_men6124
                  Data &B00000011
                  '     1234567890123456
                  Data "6-1-2-4      4/4"
                  Data "Aktuelle Adresse"
                  Data ""

Men62:
            ' Hoch        Runter       Links       Rechts        Enter
            Adr2 Men61 : Adr2 Men61 : Adr2 Men6 : Adr2 Men621 : Adr2 Men6
            Adr2 Null
            Data &B00000111
            '     1234567890123456
            Data "6-2          2/2"
            Data "  Loggingdaten"
            Data "   {129}bertragen"

Men621:
               ' Hoch        Runter     Links       Rechts      Enter
               Adr2 Null : Adr2 Null : Adr2 Null : Adr2 Null : Adr2 Null
               Adr2 Menue_men621
               Data &B00000111
               '     1234567890123456
               Data "  Loggingdaten"
               Data "werden  gesendet"
               Data " Bitte warten!!"

' Menü MEN7 - Timer
Men7:
         ' Hoch       Runter      Links       Rechts      Enter
         Adr2 Men6 : Adr2 Men8 : Adr2 Null : Adr2 Men71 : Adr2 Null
         Adr2 Null
         Data &B00000011
         '     1234567890123456
         Data "7            7/8"
         Data "     Timer"
         Data ""

Men71:
            ' Hoch        Runter       Links       Rechts       Enter
            Adr2 Men72 : Adr2 Men72 : Adr2 Men7 : Adr2 Men711 : Adr2 Men7
            Adr2 Null
            Data &B00000011
            '     1234567890123456
            Data "7-1          1/2"
            Data "   Aktivieren"
            Data ""

Men711:
               ' Hoch         Runter        Links        Rechts         Enter
               Adr2 Men712 : Adr2 Men712 : Adr2 Men71 : Adr2 Men7111 : Adr2 Men7
               Adr2 Null
               Data &B00000011
               '     1234567890123456
               Data "7-1-1        1/2"
               Data "     {153}ffnen"
               Data ""

Men7111:
                  ' Hoch           Runter          Links         Rechts          Enter
                  Adr2 Men71111 : Adr2 Men71111 : Adr2 Men711 : Adr2 Men71111 : Adr2 Men7
                  Adr2 Menue_men7111
                  Data &B00000101
                  '     1234567890123456
                  Data "     {153}ffnen"
                  Data ""
                  Data "{003}=Back  {004}{001}{002}=Fkt."

Men71111:
                     ' Hoch           Runter          Links         Rechts          Enter
                     Adr2 Men71111 : Adr2 Men71111 : Adr2 Men711 : Adr2 Men71111 : Adr2 Men7
                     Adr2 Menue_men71111
                     Data &B00000101
                     '     1234567890123456
                     Data "     {153}ffnen"
                     Data ""
                     Data "{003}=Back  {004}{001}{002}=Fkt."

Men7121:
                  ' Hoch           Runter          Links         Rechts          Enter
                  Adr2 Men71211 : Adr2 Men71211 : Adr2 Men712 : Adr2 Men71211 : Adr2 Men7
                  Adr2 Menue_men7121
                  Data &B00000101
                  '     1234567890123456
                  Data "   Schliessen"
                  Data ""
                  Data "{003}=Back  {004}{001}{002}=Fkt."

Men71211:
                     ' Hoch           Runter          Links         Rechts          Enter
                     Adr2 Men71211 : Adr2 Men71211 : Adr2 Men712 : Adr2 Men71211 : Adr2 Men7
                     Adr2 Menue_men71211
                     Data &B00000101
                     '     1234567890123456
                     Data "   Schliessen"
                     Data ""
                     Data "{003}=Back  {004}{001}{002}=Fkt."

Men712:
               ' Hoch         Runter        Links        Rechts         Enter
               Adr2 Men711 : Adr2 Men711 : Adr2 Men71 : Adr2 Men7121 : Adr2 Men7
               Adr2 Null
               Data &B00000011
               '     1234567890123456
               Data "7-1-2        2/2"
               Data "  Schliessen"
               Data ""

Men72:
            ' Hoch        Runter       Links       Rechts       Enter
            Adr2 Men71 : Adr2 Men71 : Adr2 Men7 : Adr2 Men721 : Adr2 Men7
            Adr2 Null
            Data &B00000011
            '     1234567890123456
            Data "7-2          2/2"
            Data "   Einstellen"
            Data ""

Men721:
               ' Hoch         Runter        Links        Rechts         Enter
               Adr2 Men722 : Adr2 Men722 : Adr2 Men72 : Adr2 Men7211 : Adr2 Men7
               Adr2 Null
               Data &B00000111
               '     1234567890123456
               Data "7-2-1        1/2"
               Data " Programmierung"
               Data "  {153}ffnungszeit"

Men7211:
                  ' Hoch          Runter         Links         Rechts      Enter
                  Adr2 Men7212 : Adr2 Men7212 : Adr2 Men721 : Adr2 Men72111 : Adr2 Men7
                  Adr2 Menue_men7211
                  Data &B00000111
                  '     1234567890123456
                  Data "7-2-1-1      1/2"
                  Data "    Uhrzeit"
                  Data "{003}=Back  {004}{001}{002}=Fkt."

Men72111:
                  ' Hoch       Runter      Links       Rechts      Enter
                  Adr2 Null : Adr2 Null : Adr2 Null : Adr2 Null : Adr2 Null
                  Adr2 Menue_men72111
                  Data &B00000000
                  '     1234567890123456
                  Data ""
                  Data ""
                  Data ""

Men7212:
                  ' Hoch          Runter         Links         Rechts      Enter
                  Adr2 Men7211 : Adr2 Men7211 : Adr2 Men721 : Adr2 Men72121 : Adr2 Men7
                  Adr2 Menue_men7212
                  Data &B00000111
                  '     1234567890123456
                  Data "7-2-1-2      2/2"
                  Data "     Datum"
                  Data "{003}=Back  {004}{001}{002}=Fkt."

Men72121:
                  ' Hoch       Runter      Links       Rechts      Enter
                  Adr2 Null : Adr2 Null : Adr2 Null : Adr2 Null : Adr2 Null
                  Adr2 Menue_men72121
                  Data &B00000000
                  '     1234567890123456
                  Data ""
                  Data ""
                  Data ""

Men722:
               ' Hoch         Runter        Links        Rechts         Enter
               Adr2 Men721 : Adr2 Men721 : Adr2 Men72 : Adr2 Men7221 : Adr2 Men7
               Adr2 Null
               Data &B00000111
               '     1234567890123456
               Data "7-2-2        2/2"
               Data " Programmierung"
               Data "Schliessungszeit"

Men7221:
                  ' Hoch          Runter         Links         Rechts      Enter
                  Adr2 Men7222 : Adr2 Men7222 : Adr2 Men722 : Adr2 Men72211 : Adr2 Men7
                  Adr2 Menue_men7221
                  Data &B00000111
                  '     1234567890123456
                  Data "7-2-2-1      1/2"
                  Data "    Uhrzeit"
                  Data "{003}=Back  {004}{001}{002}=Fkt."

Men72211:
                  ' Hoch       Runter      Links       Rechts      Enter
                  Adr2 Null : Adr2 Null : Adr2 Null : Adr2 Null : Adr2 Null
                  Adr2 Menue_men72211
                  Data &B00000000
                  '     1234567890123456
                  Data ""
                  Data ""
                  Data ""

Men7222:
                  ' Hoch          Runter         Links         Rechts      Enter
                  Adr2 Men7221 : Adr2 Men7221 : Adr2 Men722 : Adr2 Men72221 : Adr2 Men7
                  Adr2 Menue_men7222
                  Data &B00000111
                  '     1234567890123456
                  Data "7-2-2-2      2/2"
                  Data "     Datum"
                  Data "{003}=Back  {004}{001}{002}=Fkt."

Men72221:
                  ' Hoch       Runter      Links       Rechts      Enter
                  Adr2 Null : Adr2 Null : Adr2 Null : Adr2 Null : Adr2 Null
                  Adr2 Menue_men72221
                  Data &B00000000
                  '     1234567890123456
                  Data ""
                  Data ""
                  Data ""

' Menü MEN8 - Einstellungen
Men8:
         ' Hoch       Runter      Links       Rechts      Enter
         Adr2 Men7 : Adr2 Men1 : Adr2 Null : Adr2 Men81 : Adr2 Null
         Adr2 Null
         Data &B00000011
         '     1234567890123456
         Data "8            8/8"
         Data " Einstellungen"
         Data ""

Men81:
            ' Hoch        Runter       Links       Rechts        Enter
            Adr2 Men8b : Adr2 Men82 : Adr2 Men8 : Adr2 Men811 : Adr2 Men8
            Adr2 Menue_men81
            Data &B00000011
            '     1234567890123456
            Data "8-1         1/11"
            Data "     Dimmer"
            Data ""

Men811:
               ' Hoch         Runter        Links        Rechts         Enter
               Adr2 Men812 : Adr2 Men812 : Adr2 Men81 : Adr2 Men8111 : Adr2 Men81
               Adr2 Null
               Data &B00000011
               '     1234567890123456
               Data "8-1-1        1/2"
               Data " Light-Floating"
               Data ""

Men8111:
                  ' Hoch           Runter          Links         Rechts          Enter
                  Adr2 Men81111 : Adr2 Men81111 : Adr2 Men811 : Adr2 Men81111 : Adr2 Men81
                  Adr2 Menue_men8111
                  Data &B00000101
                  '     1234567890123456
                  Data " Light-Floating"
                  Data ""
                  Data "{003}=Back  {004}{001}{002}=Fkt."

Men81111:
                  ' Hoch           Runter          Links         Rechts          Enter
                  Adr2 Men81111 : Adr2 Men81111 : Adr2 Men811 : Adr2 Men81111 : Adr2 Men81
                  Adr2 Menue_men81111
                  Data &B00000101
                  '     1234567890123456
                  Data " Light-Floating"
                  Data ""
                  Data "{003}=Back  {004}{001}{002}=Fkt."

Men812:
               ' Hoch         Runter        Links        Rechts         Enter
               Adr2 Men811 : Adr2 Men811 : Adr2 Men81 : Adr2 Men8121 : Adr2 Men81
               Adr2 Null
               Data &B00000011
               '     1234567890123456
               Data "8-1-2        2/2"
               Data "   Grenzwerte"
               Data ""

Men8121:
                  ' Hoch          Runter         Links         Rechts          Enter
                  Adr2 Men8122 : Adr2 Men8122 : Adr2 Men812 : Adr2 Men81211 : Adr2 Men81
                  Adr2 Null
                  Data &B00000111
                  '     1234567890123456
                  Data "8-1-2-1      1/2"
                  Data "Min- / Maxwerte"
                  Data " Untere Grenze"

Men81211:
                  ' Hoch            Runter           Links          Rechts           Enter
                  Adr2 Men812111 : Adr2 Men812111 : Adr2 Men8121 : Adr2 Men812111 : Adr2 Men81
                  Adr2 Menue_men81211
                  Data &B00000101
                  '     1234567890123456
                  Data " Untere Grenze"
                  Data ""
                  Data "{003}=Back  {004}{001}{002}=Fkt."

Men812111:
                     ' Hoch            Runter           Links          Rechts           Enter
                     Adr2 Men812111 : Adr2 Men812111 : Adr2 Men8121 : Adr2 Men812111 : Adr2 Men81
                     Adr2 Menue_men812111
                     Data &B00000101
                     '     1234567890123456
                     Data " Untere Grenze"
                     Data ""
                     Data "{003}=Back  {004}{001}{002}=Fkt."

Men81221:
                  ' Hoch            Runter           Links          Rechts           Enter
                  Adr2 Men812211 : Adr2 Men812211 : Adr2 Men8122 : Adr2 Men812211 : Adr2 Men81
                  Adr2 Menue_men81221
                  Data &B00000101
                  '     1234567890123456
                  Data "  Obere Grenze"
                  Data ""
                  Data "{003}=Back  {004}{001}{002}=Fkt."

Men812211:
                     ' Hoch            Runter           Links          Rechts           Enter
                     Adr2 Men812211 : Adr2 Men812211 : Adr2 Men8122 : Adr2 Men812211 : Adr2 Men81
                     Adr2 Menue_men812211
                     Data &B00000101
                     '     1234567890123456
                     Data "  Obere Grenze"
                     Data ""
                     Data "{003}=Back  {004}{001}{002}=Fkt."

Men8122:
                  ' Hoch          Runter         Links         Rechts          Enter
                  Adr2 Men8121 : Adr2 Men8121 : Adr2 Men812 : Adr2 Men81221 : Adr2 Men81
                  Adr2 Null
                  Data &B00000111
                  '     1234567890123456
                  Data "8-1-2-2      2/2"
                  Data "Min- / Maxwerte"
                  Data "  Obere Grenze"

Men82:
            ' Hoch        Runter       Links       Rechts        Enter
            Adr2 Men81 : Adr2 Men83 : Adr2 Men8 : Adr2 Men821 : Adr2 Men8
            Adr2 Menue_men82
            Data &B00000011
            '     1234567890123456
            Data "8-2         2/11"
            Data "    Tastatur"
            Data ""

Men821:
              ' Hoch       Runter      Links        Rechts         Enter
              Adr2 Null : Adr2 Null : Adr2 Men82 : Adr2 Men8211 : Adr2 Men82
              Adr2 Null
              Data &B00000111
              '     1234567890123456
              Data "8-2-1        1/1"
              Data "   Enter-Taste"
              Data "    ShortCut"

Men8211:
                  ' Hoch           Runter          Links         Rechts          Enter
                  Adr2 Men82111 : Adr2 Men82111 : Adr2 Men821 : Adr2 Men82111 : Adr2 Men82
                  Adr2 Menue_men8211
                  Data &B00000101
                  '     1234567890123456
                  Data " Enter ShortCut"
                  Data ""
                  Data "{003}=Back  {004}{001}{002}=Fkt."

Men82111:
            ' Hoch           Runter          Links         Rechts          Enter
            Adr2 Men82111 : Adr2 Men82111 : Adr2 Men821 : Adr2 Men82111 : Adr2 Men82
            Adr2 Menue_men82111
            Data &B00000101
            '     1234567890123456
            Data " Enter ShortCut"
            Data ""
            Data "{003}=Back  {004}{001}{002}=Fkt."

Men83:
            ' Hoch        Runter       Links       Rechts        Enter
            Adr2 Men82 : Adr2 Men84 : Adr2 Men8 : Adr2 Men831 : Adr2 Men8
            Adr2 Menue_men83
            Data &B00000011
            '     1234567890123456
            Data "8-3         3/11"
            Data "    Display"
            Data ""

Men831:
               ' Hoch         Runter        Links        Rechts         Enter
               Adr2 Men833 : Adr2 Men832 : Adr2 Men83 : Adr2 Men8311 : Adr2 Men83
               Adr2 Null
               Data &B00000011
               '     1234567890123456
               Data "8-3-1        1/3"
               Data "  Screen-Saver"
               Data ""

Men8311:
                  ' Hoch           Runter          Links         Rechts          Enter
                  Adr2 Men83111 : Adr2 Men83111 : Adr2 Men831 : Adr2 Men83111 : Adr2 Men83
                  Adr2 Menue_men8311
                  Data &B00000101
                  '     1234567890123456
                  Data "  Screen-Saver"
                  Data ""
                  Data "{003}=Back  {004}{001}{002}=Fkt."

Men83111:
                  ' Hoch           Runter          Links         Rechts          Enter
                  Adr2 Men83111 : Adr2 Men83111 : Adr2 Men831 : Adr2 Men83111 : Adr2 Men83
                  Adr2 Menue_men83111
                  Data &B00000101
                  '     1234567890123456
                  Data "  Screen-Saver"
                  Data ""
                  Data "{003}=Back  {004}{001}{002}=Fkt."

Men832:
               ' Hoch         Runter        Links        Rechts         Enter
               Adr2 Men831 : Adr2 Men833 : Adr2 Men83 : Adr2 Men8321 : Adr2 Men83
               Adr2 Null
               Data &B00000011
               '     1234567890123456
               Data "8-3-2        2/3"
               Data "    Kontrast"
               Data ""

Men8321:
                  ' Hoch           Runter          Links         Rechts          Enter
                  Adr2 Men83211 : Adr2 Men83211 : Adr2 Men832 : Adr2 Men83211 : Adr2 Men83
                  Adr2 Menue_men8321
                  Data &B00000101
                  '     1234567890123456
                  Data "    Kontrast"
                  Data ""
                  Data "{003}=Back  {004}{001}{002}=Fkt."

Men83211:
                  ' Hoch           Runter          Links         Rechts          Enter
                  Adr2 Men83211 : Adr2 Men83211 : Adr2 Men832 : Adr2 Men83211 : Adr2 Men83
                  Adr2 Menue_men83211
                  Data &B00000101
                  '     1234567890123456
                  Data "    Kontrast"
                  Data ""
                  Data "{003}=Back  {004}{001}{002}=Fkt."

Men833:
               ' Hoch         Runter        Links        Rechts         Enter
               Adr2 Men832 : Adr2 Men831 : Adr2 Men83 : Adr2 Men8331 : Adr2 Men83
               Adr2 Null
               Data &B00000011
               '     1234567890123456
               Data "8-3-3        3/3"
               Data "   Helligkeit"
               Data ""

Men8331:
                  ' Hoch           Runter          Links         Rechts          Enter
                  Adr2 Men83311 : Adr2 Men83311 : Adr2 Men833 : Adr2 Men83311 : Adr2 Men83
                  Adr2 Menue_men8331
                  Data &B00000101
                  '     1234567890123456
                  Data "   Helligkeit"
                  Data ""
                  Data "{003}=Back  {004}{001}{002}=Fkt."

Men83311:
                  ' Hoch           Runter          Links         Rechts          Enter
                  Adr2 Men83311 : Adr2 Men83311 : Adr2 Men833 : Adr2 Men83311 : Adr2 Men83
                  Adr2 Menue_men83311
                  Data &B00000101
                  '     1234567890123456
                  Data "   Helligkeit"
                  Data ""
                  Data "{003}=Back  {004}{001}{002}=Fkt."

Men84:
            ' Hoch        Runter       Links       Rechts        Enter
            Adr2 Men83 : Adr2 Men85 : Adr2 Men8 : Adr2 Men841 : Adr2 Men8
            Adr2 Menue_men84
            Data &B00000011
            '     1234567890123456
            Data "8-4         4/11"
            Data "     L{129}fter"
            Data ""

Men841:
               ' Hoch         Runter        Links        Rechts         Enter
               Adr2 Men845 : Adr2 Men842 : Adr2 Men84 : Adr2 Men8411 : Adr2 Men84
               Adr2 Null
               Data &B00000111
               '     1234567890123456
               Data "8-4-1        1/5"
               Data "Betriebsmodus SW"
               Data " Aktiv / Passiv"

Men8411:
                  ' Hoch           Runter          Links         Rechts          Enter
                  Adr2 Men84111 : Adr2 Men84111 : Adr2 Men841 : Adr2 Men84111 : Adr2 Men84
                  Adr2 Menue_men8411
                  Data &B00000101
                  '     1234567890123456
                  Data "Betriebsmodus SW"
                  Data ""
                  Data "{003}=Back  {004}{001}{002}=Fkt."

Men84111:
                     ' Hoch           Runter          Links         Rechts          Enter
                     Adr2 Men84111 : Adr2 Men84111 : Adr2 Men841 : Adr2 Men84111 : Adr2 Men84
                     Adr2 Menue_men84111
                     Data &B00000101
                     '     1234567890123456
                     Data "Betriebsmodus SW"
                     Data ""
                     Data "{003}=Back  {004}{001}{002}=Fkt."

Men842:
               ' Hoch         Runter        Links        Rechts         Enter
               Adr2 Men841 : Adr2 Men843 : Adr2 Men84 : Adr2 Men8421 : Adr2 Men84
               Adr2 Null
               Data &B00000111
               '     1234567890123456
               Data "8-4-2        2/5"
               Data "   L{129}fter 25%"
               Data "   Temperatur"

Men8421:
                  ' Hoch           Runter          Links         Rechts          Enter
                  Adr2 Men84211 : Adr2 Men84211 : Adr2 Men842 : Adr2 Men84211 : Adr2 Men84
                  Adr2 Menue_men8421
                  Data &B00000101
                  '     1234567890123456
                  Data "     25% bei"
                  Data ""
                  Data "{003}=Back  {004}{001}{002}=Fkt."

Men84211:
                     ' Hoch           Runter          Links         Rechts          Enter
                     Adr2 Men84211 : Adr2 Men84211 : Adr2 Men842 : Adr2 Men84211 : Adr2 Men84
                     Adr2 Menue_men84211
                     Data &B00000101
                     '     1234567890123456
                     Data "     25% bei"
                     Data ""
                     Data "{003}=Back  {004}{001}{002}=Fkt."

Men843:
               ' Hoch         Runter        Links        Rechts         Enter
               Adr2 Men842 : Adr2 Men844 : Adr2 Men84 : Adr2 Men8431 : Adr2 Men84
               Adr2 Null
               Data &B00000111
               '     1234567890123456
               Data "8-4-3        3/5"
               Data "   L{129}fter 50%"
               Data "   Temperatur"

Men8431:
                  ' Hoch           Runter          Links         Rechts          Enter
                  Adr2 Men84311 : Adr2 Men84311 : Adr2 Men843 : Adr2 Men84311 : Adr2 Men84
                  Adr2 Menue_men8431
                  Data &B00000101
                  '     1234567890123456
                  Data "     50% bei"
                  Data ""
                  Data "{003}=Back  {004}{001}{002}=Fkt."

Men84311:
                     ' Hoch           Runter          Links         Rechts          Enter
                     Adr2 Men84311 : Adr2 Men84311 : Adr2 Men843 : Adr2 Men84311 : Adr2 Men84
                     Adr2 Menue_men84311
                     Data &B00000101
                     '     1234567890123456
                     Data "     50% bei"
                     Data ""
                     Data "{003}=Back  {004}{001}{002}=Fkt."

Men844:
               ' Hoch         Runter        Links        Rechts         Enter
               Adr2 Men843 : Adr2 Men845 : Adr2 Men84 : Adr2 Men8441 : Adr2 Men84
               Adr2 Null
               Data &B00000111
               '     1234567890123456
               Data "8-4-4        4/5"
               Data "   L{129}fter 75%"
               Data "   Temperatur"

Men8441:
                  ' Hoch           Runter          Links         Rechts          Enter
                  Adr2 Men84411 : Adr2 Men84411 : Adr2 Men844 : Adr2 Men84411 : Adr2 Men84
                  Adr2 Menue_men8441
                  Data &B00000101
                  '     1234567890123456
                  Data "     75% bei"
                  Data ""
                  Data "{003}=Back  {004}{001}{002}=Fkt."

Men84411:
                     ' Hoch           Runter          Links         Rechts          Enter
                     Adr2 Men84411 : Adr2 Men84411 : Adr2 Men844 : Adr2 Men84411 : Adr2 Men84
                     Adr2 Menue_men84411
                     Data &B00000101
                     '     1234567890123456
                     Data "     75% bei"
                     Data ""
                     Data "{003}=Back  {004}{001}{002}=Fkt."

Men845:
               ' Hoch         Runter        Links        Rechts         Enter
               Adr2 Men844 : Adr2 Men841 : Adr2 Men84 : Adr2 Men8451 : Adr2 Men84
               Adr2 Null
               Data &B00000111
               '     1234567890123456
               Data "8-4-5        5/5"
               Data "   L{129}fter 100%"
               Data "   Temperatur"

Men8451:
                  ' Hoch           Runter          Links         Rechts          Enter
                  Adr2 Men84511 : Adr2 Men84511 : Adr2 Men845 : Adr2 Men84511 : Adr2 Men84
                  Adr2 Menue_men8451
                  Data &B00000101
                  '     1234567890123456
                  Data "    100% bei"
                  Data ""
                  Data "{003}=Back  {004}{001}{002}=Fkt."

Men84511:
                     ' Hoch           Runter          Links         Rechts          Enter
                     Adr2 Men84511 : Adr2 Men84511 : Adr2 Men845 : Adr2 Men84511 : Adr2 Men84
                     Adr2 Menue_men84511
                     Data &B00000101
                     '     1234567890123456
                     Data "    100% bei"
                     Data ""
                     Data "{003}=Back  {004}{001}{002}=Fkt."

Men85:
            ' Hoch        Runter       Links       Rechts        Enter
            Adr2 Men84 : Adr2 Men86 : Adr2 Men8 : Adr2 Men851 : Adr2 Men8
            Adr2 Menue_men85
            Data &B00000011
            '     1234567890123456
            Data "8-5         5/11"
            Data "      Wind"
            Data ""

Men851:
               ' Hoch         Runter        Links        Rechts         Enter
               Adr2 Men852 : Adr2 Men852 : Adr2 Men85 : Adr2 Men8511 : Adr2 Men85
               Adr2 Null
               Data &B00000111
               '     1234567890123456
               Data "8-5-1        1/2"
               Data "   Windgrenze"
               Data "Beschattung auf"

Men8511:
                  ' Hoch           Runter          Links         Rechts          Enter
                  Adr2 Men85111 : Adr2 Men85111 : Adr2 Men851 : Adr2 Men85111 : Adr2 Men85
                  Adr2 Menue_men8511
                  Data &B00000101
                  '     1234567890123456
                  Data "Geschwindigkeit"
                  Data ""
                  Data "{003}=Back  {004}{001}{002}=Fkt."

Men85111:
                     ' Hoch           Runter          Links         Rechts          Enter
                     Adr2 Men85111 : Adr2 Men85111 : Adr2 Men851 : Adr2 Men85111 : Adr2 Men85
                     Adr2 Menue_men85111
                     Data &B00000101
                     '     1234567890123456
                     Data "Geschwindigkeit"
                     Data ""
                     Data "{003}=Back  {004}{001}{002}=Fkt."

Men852:
               ' Hoch         Runter        Links        Rechts        Enter
               Adr2 Men851 : Adr2 Men851 : Adr2 Men85 : Adr2 Men8521 : Adr2 Men85
               Adr2 Null
               Data &B00000011
               '     1234567890123456
               Data "8-5-2        2/2"
               Data "  Messintervall"
               Data ""

Men8521:
                  ' Hoch           Runter          Links         Rechts          Enter
                  Adr2 Men85211 : Adr2 Men85211 : Adr2 Men852 : Adr2 Men85211 : Adr2 Men85
                  Adr2 Menue_men8521
                  Data &B00000101
                  '     1234567890123456
                  Data " Messintervall"
                  Data ""
                  Data "{003}=Back  {004}{001}{002}=Fkt."

Men85211:
                     ' Hoch           Runter          Links         Rechts          Enter
                     Adr2 Men85211 : Adr2 Men85211 : Adr2 Men852 : Adr2 Men85211 : Adr2 Men85
                     Adr2 Menue_men85211
                     Data &B00000101
                     '     1234567890123456
                     Data " Messintervall"
                     Data ""
                     Data "{003}=Back  {004}{001}{002}=Fkt."

Men86:
            ' Hoch        Runter       Links       Rechts        Enter
            Adr2 Men85 : Adr2 Men87 : Adr2 Men8 : Adr2 Men861 : Adr2 Men8
            Adr2 Menue_men86
            Data &B00000011
            '     1234567890123456
            Data "8-6         6/11"
            Data "   Temperatur"
            Data ""

Men861:
               ' Hoch       Runter      Links        Rechts         Enter
               Adr2 Null : Adr2 Null : Adr2 Men86 : Adr2 Men8611 : Adr2 Men86
               Adr2 Null
               Data &B00000011
               '     1234567890123456
               Data "8-6-1        1/1"
               Data "  Messintervall"
               Data ""

Men8611:
                  ' Hoch           Runter          Links         Rechts          Enter
                  Adr2 Men86111 : Adr2 Men86111 : Adr2 Men861 : Adr2 Men86111 : Adr2 Men86
                  Adr2 Menue_men8611
                  Data &B00000101
                  '     1234567890123456
                  Data " Messintervall"
                  Data ""
                  Data "{003}=Back  {004}{001}{002}=Fkt."

Men86111:
                     ' Hoch           Runter          Links         Rechts          Enter
                     Adr2 Men86111 : Adr2 Men86111 : Adr2 Men861 : Adr2 Men86111 : Adr2 Men86
                     Adr2 Menue_men86111
                     Data &B00000101
                     '     1234567890123456
                     Data " Messintervall"
                     Data ""
                     Data "{003}=Back  {004}{001}{002}=Fkt."

Men87:
            ' Hoch        Runter       Links       Rechts        Enter
            Adr2 Men86 : Adr2 Men88 : Adr2 Men8 : Adr2 Men871 : Adr2 Men8
            Adr2 Menue_men87
            Data &B00000011
            '     1234567890123456
            Data "8-7         7/11"
            Data "   Signalt{148}ne"
            Data ""

Men871:
               ' Hoch       Runter      Links        Rechts         Enter
               Adr2 Null : Adr2 Null : Adr2 Men87 : Adr2 Men8711 : Adr2 Men87
               Adr2 Null
               Data &B00000011
               '     1234567890123456
               Data "8-1-1        1/1"
               Data "   Signalton"
               Data ""

Men8711:
                  ' Hoch           Runter          Links         Rechts          Enter
                  Adr2 Men87111 : Adr2 Men87111 : Adr2 Men871 : Adr2 Men87111 : Adr2 Men87
                  Adr2 Menue_men8711
                  Data &B00000101
                  '     1234567890123456
                  Data "    Signalton"
                  Data ""
                  Data "{003}=Back  {004}{001}{002}=Fkt."

Men87111:
                     ' Hoch           Runter          Links         Rechts          Enter
                     Adr2 Men87111 : Adr2 Men87111 : Adr2 Men871 : Adr2 Men87111 : Adr2 Men87
                     Adr2 Menue_men87111
                     Data &B00000101
                     '     1234567890123456
                     Data "    Signalton"
                     Data ""
                     Data "{003}=Back  {004}{001}{002}=Fkt."

Men88:
            ' Hoch        Runter       Links       Rechts        Enter
            Adr2 Men87 : Adr2 Men89 : Adr2 Men8 : Adr2 Men881 : Adr2 Men8
            Adr2 Menue_men88
            Data &B00000011
            '     1234567890123456
            Data "8-8         8/11"
            Data "Uhrzeit & Datum"
            Data ""

Men881:
               ' Hoch         Runter        Links        Rechts         Enter
               Adr2 Men883 : Adr2 Men882 : Adr2 Men88 : Adr2 Men8811 : Adr2 Men88
               Adr2 Menue_men881
               Data &B00000111
               '     1234567890123456
               Data "8-8-1        1/3"
               Data "    Uhrzeit"
               Data "   einstellen"

Men8811:
                  ' Hoch       Runter      Links       Rechts      Enter
                  Adr2 Null : Adr2 Null : Adr2 Null : Adr2 Null : Adr2 Null
                  Adr2 Menue_men8811
                  Data &B00000000
                  '     1234567890123456
                  Data ""
                  Data ""
                  Data ""

Men882:
               ' Hoch         Runter        Links        Rechts         Enter
               Adr2 Men881 : Adr2 Men883 : Adr2 Men88 : Adr2 Men8821 : Adr2 Men88
               Adr2 Menue_men882
               Data &B00000111
               '     1234567890123456
               Data "8-8-2        2/3"
               Data "     Datum"
               Data "   einstellen"

Men8821:
                  ' Hoch       Runter      Links       Rechts      Enter
                  Adr2 Null : Adr2 Null : Adr2 Null : Adr2 Null : Adr2 Null
                  Adr2 Menue_men8821
                  Data &B00000000
                  '     1234567890123456
                  Data ""
                  Data ""
                  Data ""

Men883:
               ' Hoch         Runter        Links        Rechts         Enter
               Adr2 Men882 : Adr2 Men881 : Adr2 Men88 : Adr2 Men8831 : Adr2 Men88
               Adr2 Menue_men883
               Data &B00000011
               '     1234567890123456
               Data "8-8-3        3/3"
               Data "  Status DCF77"
               Data ""

Men8831:
               ' Hoch       Runter      Links         Rechts      Enter
               Adr2 Null : Adr2 Null : Adr2 Men883 : Adr2 Null : Adr2 Men88
               Adr2 Menue_men8831
               Data &B00000000
               '     1234567890123456
               Data ""
               Data ""
               Data ""

Men89:
            ' Hoch        Runter       Links       Rechts        Enter
            Adr2 Men88 : Adr2 Men8a : Adr2 Men8 : Adr2 Men891 : Adr2 Men8
            Adr2 Menue_men89
            Data &B00000011
            '     1234567890123456
            Data "8-9         9/11"
            Data "  Data-Logging"
            Data ""

Men891:
               ' Hoch         Runter        Links        Rechts         Enter
               Adr2 Men893 : Adr2 Men892 : Adr2 Men89 : Adr2 Men8911 : Adr2 Men89
               Adr2 Null
               Data &B00000111
               '     1234567890123456
               Data "8-9-1        1/3"
               Data " Betriebsmodus"
               Data "   Ein / Aus"

Men8911:
                  ' Hoch           Runter          Links         Rechts          Enter
                  Adr2 Men89111 : Adr2 Men89111 : Adr2 Men891 : Adr2 Men89111 : Adr2 Men89
                  Adr2 Menue_men8911
                  Data &B00000101
                  '     1234567890123456
                  Data " Betriebsmodus"
                  Data ""
                  Data "{003}=Back  {004}{001}{002}=Fkt."

Men89111:
                  ' Hoch           Runter          Links         Rechts          Enter
                  Adr2 Men89111 : Adr2 Men89111 : Adr2 Men891 : Adr2 Men89111 : Adr2 Men89
                  Adr2 Menue_men89111
                  Data &B00000101
                  '     1234567890123456
                  Data " Betriebsmodus"
                  Data ""
                  Data "{003}=Back  {004}{001}{002}=Fkt."

Men892:
               ' Hoch         Runter        Links        Rechts         Enter
               Adr2 Men891 : Adr2 Men893 : Adr2 Men89 : Adr2 Men8921 : Adr2 Men89
               Adr2 Null
               Data &B00000011
               '     1234567890123456
               Data "8-9-2        2/3"
               Data " Zeitintervall"
               Data ""

Men8921:
                  ' Hoch           Runter          Links         Rechts          Enter
                  Adr2 Men89211 : Adr2 Men89211 : Adr2 Men892 : Adr2 Men89211 : Adr2 Men89
                  Adr2 Menue_men8921
                  Data &B00000101
                  '     1234567890123456
                  Data "  Zeitintervall"
                  Data ""
                  Data "{003}=Back  {004}{001}{002}=Fkt."

Men89211:
                     ' Hoch           Runter          Links         Rechts          Enter
                     Adr2 Men89211 : Adr2 Men89211 : Adr2 Men892 : Adr2 Men89211 : Adr2 Men89
                     Adr2 Menue_men89211
                     Data &B00000101
                     '     1234567890123456
                     Data "  Zeitintervall"
                     Data ""
                     Data "{003}=Back  {004}{001}{002}=Fkt."

Men893:
               ' Hoch         Runter        Links        Rechts         Enter
               Adr2 Men892 : Adr2 Men891 : Adr2 Men89 : Adr2 Men8931 : Adr2 Men89
               Adr2 Null
               Data &B00000111
               '     1234567890123456
               Data "8-9-3        3/3"
               Data "  Loggingdaten"
               Data "   l{148}schen"

Men8931:
                  ' Hoch       Runter      Links       Rechts      Enter
                  Adr2 Null : Adr2 Null : Adr2 Null : Adr2 Null : Adr2 Null
                  Adr2 Menue_men8931
                  Data &B00000111
                  '     1234567890123456
                  Data "  Loggingdaten"
                  Data "werden  gel{148}scht"
                  Data " Bitte warten !"

Men8a:
            ' Hoch        Runter       Links       Rechts        Enter
            Adr2 Men89 : Adr2 Men8b : Adr2 Men8 : Adr2 Men8a1 : Adr2 Men8
            Adr2 Menue_men8a
            Data &B00000011
            '     1234567890123456
            Data "8-10       10/11"
            Data "  Beschattung"
            Data ""

Men8a1:
               ' Hoch         Runter        Links        Rechts         Enter
               Adr2 Men8a3 : Adr2 Men8a2 : Adr2 Men8a : Adr2 Men8a11 : Adr2 Men8a
               Adr2 Null
               Data &B00000011
               '     1234567890123456
               Data "8-10-1       1/3"
               Data "    Timeout"
               Data ""

Men8a11:
                  ' Hoch           Runter          Links         Rechts          Enter
                  Adr2 Men8a111 : Adr2 Men8a111 : Adr2 Men8a1 : Adr2 Men8a111 : Adr2 Men8a
                  Adr2 Menue_men8a11
                  Data &B00000101
                  '     1234567890123456
                  Data "    Timeout"
                  Data ""
                  Data "{003}=Back  {004}{001}{002}=Fkt."

Men8a111:
                     ' Hoch           Runter          Links         Rechts          Enter
                     Adr2 Men8a111 : Adr2 Men8a111 : Adr2 Men8a1 : Adr2 Men8a111 : Adr2 Men8a
                     Adr2 Menue_men8a111
                     Data &B00000101
                     '     1234567890123456
                     Data "    Timeout"
                     Data ""
                     Data "{003}=Back  {004}{001}{002}=Fkt."

Men8a2:
               ' Hoch         Runter        Links        Rechts         Enter
               Adr2 Men8a1 : Adr2 Men8a3 : Adr2 Men8a : Adr2 Men8a21 : Adr2 Men8a
               Adr2 Null
               Data &B00000011
               '     1234567890123456
               Data "8-10-2       2/3"
               Data "    Auffahren"
               Data ""

Men8a21:
                  ' Hoch          Runter         Links         Rechts          Enter
                  Adr2 Men8a22 : Adr2 Men8a22 : Adr2 Men8a2 : Adr2 Men8a211 : Adr2 Men8a
                  Adr2 Null
                  Data &B00000111
                  '     1234567890123456
                  Data "8-10-2-1     1/2"
                  Data " Auffahren bei"
                  Data "  Dunkelheit"

Men8a211:
                     ' Hoch            Runter           Links          Rechts           Enter
                     Adr2 Men8a2111 : Adr2 Men8a2111 : Adr2 Men8a21 : Adr2 Men8a2111 : Adr2 Men8a
                     Adr2 Menue_men8a211
                     Data &B00000101
                     '     1234567890123456
                     Data "   Dunkelheit"
                     Data ""
                     Data "{003}=Back  {004}{001}{002}=Fkt."

Men8a2111:
                        ' Hoch            Runter           Links          Rechts           Enter
                        Adr2 Men8a2111 : Adr2 Men8a2111 : Adr2 Men8a21 : Adr2 Men8a2111 : Adr2 Men8a
                        Adr2 Menue_men8a2111
                        Data &B00000101
                        '     1234567890123456
                        Data "   Dunkelheit"
                        Data ""
                        Data "{003}=Back  {004}{001}{002}=Fkt."

Men8a22:
                  ' Hoch          Runter         Links         Rechts          Enter
                  Adr2 Men8a21 : Adr2 Men8a21 : Adr2 Men8a2 : Adr2 Men8a221 : Adr2 Men8a
                  Adr2 Null
                  Data &B00000011
                  '     1234567890123456
                  Data "8-10-2-2     2/2"
                  Data "Grenzdunkelheit"
                  Data ""

Men8a221:
                     ' Hoch            Runter           Links          Rechts           Enter
                     Adr2 Men8a2211 : Adr2 Men8a2211 : Adr2 Men8a22 : Adr2 Men8a2211 : Adr2 Men8a
                     Adr2 Menue_men8a221
                     Data &B00000101
                     '     1234567890123456
                     Data "Grenzdunkelheit"
                     Data ""
                     Data "{003}=Back  {004}{001}{002}=Fkt."

Men8a2211:
                        ' Hoch            Runter           Links          Rechts           Enter
                        Adr2 Men8a2211 : Adr2 Men8a2211 : Adr2 Men8a22 : Adr2 Men8a2211 : Adr2 Men8a
                        Adr2 Menue_men8a2211
                        Data &B00000101
                        '     1234567890123456
                        Data "Grenzdunkelheit"
                        Data ""
                        Data "{003}=Back  {004}{001}{002}=Fkt."

Men8a3:
               ' Hoch         Runter        Links        Rechts         Enter
               Adr2 Men8a2 : Adr2 Men8a1 : Adr2 Men8a : Adr2 Men8a31 : Adr2 Men8a
               Adr2 Null
               Data &B00000011
               '     1234567890123456
               Data "8-10-3       3/3"
               Data "    Zufahren"
               Data ""

Men8a31:
                  ' Hoch          Runter         Links         Rechts          Enter
                  Adr2 Men8a32 : Adr2 Men8a32 : Adr2 Men8a3 : Adr2 Men8a311 : Adr2 Men8a
                  Adr2 Null
                  Data &B00000111
                  '     1234567890123456
                  Data "8-10-3-1     1/2"
                  Data "  Zufahren bei"
                  Data "   Temperatur"

Men8a311:
                     ' Hoch            Runter           Links          Rechts           Enter
                     Adr2 Men8a3111 : Adr2 Men8a3111 : Adr2 Men8a31 : Adr2 Men8a3111 : Adr2 Men8a
                     Adr2 Menue_men8a311
                     Data &B00000101
                     '     1234567890123456
                     Data "   Temperatur"
                     Data ""
                     Data "{003}=Back  {004}{001}{002}=Fkt."

Men8a3111:
                        ' Hoch            Runter           Links          Rechts           Enter
                        Adr2 Men8a3111 : Adr2 Men8a3111 : Adr2 Men8a31 : Adr2 Men8a3111 : Adr2 Men8a
                        Adr2 Menue_men8a3111
                        Data &B00000101
                        '     1234567890123456
                        Data "   Temperatur"
                        Data ""
                        Data "{003}=Back  {004}{001}{002}=Fkt."

Men8a32:
                  ' Hoch          Runter         Links         Rechts          Enter
                  Adr2 Men8a31 : Adr2 Men8a31 : Adr2 Men8a3 : Adr2 Men8a321 : Adr2 Men8a
                  Adr2 Null
                  Data &B00000011
                  '     1234567890123456
                  Data "8-10-3-2     2/2"
                  Data "Grenztemperatur"
                  Data ""

Men8a321:
                     ' Hoch            Runter           Links          Rechts           Enter
                     Adr2 Men8a3211 : Adr2 Men8a3211 : Adr2 Men8a32 : Adr2 Men8a3211 : Adr2 Men8a
                     Adr2 Menue_men8a321
                     Data &B00000101
                     '     1234567890123456
                     Data "Grenztemperatur"
                     Data ""
                     Data "{003}=Back  {004}{001}{002}=Fkt."

Men8a3211:
                        ' Hoch            Runter           Links          Rechts           Enter
                        Adr2 Men8a3211 : Adr2 Men8a3211 : Adr2 Men8a32 : Adr2 Men8a3211 : Adr2 Men8a
                        Adr2 Menue_men8a3211
                        Data &B00000101
                        '     1234567890123456
                        Data "   Temperatur"
                        Data ""
                        Data "{003}=Back  {004}{001}{002}=Fkt."

Men8b:
            ' Hoch        Runter       Links       Rechts        Enter
            Adr2 Men8a : Adr2 Men81 : Adr2 Men8 : Adr2 Men8b1 : Adr2 Men8
            Adr2 Null
            Data &B00000011
            '     1234567890123456
            Data "8-11       11/11"
            Data "  Min/Max-Werte"
            Data ""

Men8b1:
               ' Hoch       Runter      Links        Rechts         Enter
               Adr2 Null : Adr2 Null : Adr2 Men8b : Adr2 Men8b11 : Adr2 Men8b
               Adr2 Null
               Data &B00000111
               '     1234567890123456
               Data "8-11-1       1/1"
               Data "  Min/Max-Werte"
               Data "   l{148}schen"

Men8b11:
                  ' Hoch       Runter      Links       Rechts      Enter
                  Adr2 Null : Adr2 Null : Adr2 Null : Adr2 Null : Adr2 Null
                  Adr2 Menue_men8b11
                  Data &B00000111
                  '     1234567890123456
                  Data "  Min/Max-Werte"
                  Data "werden  gel{148}scht"
                  Data " Bitte warten !"

'-- Bedatung von wiederverwendbaren Spezialmenüs ------------------------------

' Statemachine für universelle Zeiteingabe
Time1:
         ' Hoch         Runter        Links             Rechts       Enter
         Adr2 Time11 : Adr2 Time12 : Adr2 Time_ende : Adr2 Time2 : Adr2 Time_ende
         Adr2 Menue_time1
         Data &B00000111
         '     1234567890123456
         Data "     Stunden"
         Data "Eingabe HH"
         Data "Zeit:"

Time11:
         ' Hoch         Runter        Links             Rechts       Enter
         Adr2 Time11 : Adr2 Time12 : Adr2 Time_ende : Adr2 Time2 : Adr2 Time_ende
         Adr2 Menue_time11
         Data &B00000111
         '     1234567890123456
         Data "     Stunden"
         Data "Eingabe HH"
         Data "Zeit:"

Time12:
         ' Hoch         Runter        Links             Rechts       Enter
         Adr2 Time11 : Adr2 Time12 : Adr2 Time_ende : Adr2 Time2 : Adr2 Time_ende
         Adr2 Menue_time12
         Data &B00000111
         '     1234567890123456
         Data "     Stunden"
         Data "Eingabe HH"
         Data "Zeit:"

Time2:
         ' Hoch         Runter        Links        Rechts       Enter
         Adr2 Time21 : Adr2 Time22 : Adr2 Time1 : Adr2 Time3 : Adr2 Time_ende
         Adr2 Menue_time2
         Data &B00000111
         '     1234567890123456
         Data "     Minuten"
         Data "Eingabe    MM"
         Data "Zeit:"

Time21:
         ' Hoch         Runter        Links        Rechts       Enter
         Adr2 Time21 : Adr2 Time22 : Adr2 Time1 : Adr2 Time3 : Adr2 Time_ende
         Adr2 Menue_time21
         Data &B00000111
         '     1234567890123456
         Data "     Minuten"
         Data "Eingabe    MM"
         Data "Zeit:"

Time22:
         ' Hoch         Runter        Links        Rechts       Enter
         Adr2 Time21 : Adr2 Time22 : Adr2 Time1 : Adr2 Time3 : Adr2 Time_ende
         Adr2 Menue_time22
         Data &B00000111
         '     1234567890123456
         Data "     Minuten"
         Data "Eingabe    MM"
         Data "Zeit:"

Time3:
         ' Hoch         Runter        Links        Rechts      Enter
         Adr2 Time31 : Adr2 Time32 : Adr2 Time2 : Adr2 Null : Adr2 Time_ende
         Adr2 Menue_time3
         Data &B00000111
         '     1234567890123456
         Data "    Sekunden"
         Data "Eingabe       SS"
         Data "Zeit:"

Time31:
         ' Hoch         Runter        Links        Rechts      Enter
         Adr2 Time31 : Adr2 Time32 : Adr2 Time2 : Adr2 Null : Adr2 Time_ende
         Adr2 Menue_time31
         Data &B00000111
         '     1234567890123456
         Data "    Sekunden"
         Data "Eingabe       SS"
         Data "Zeit:"

Time32:
         ' Hoch         Runter        Links        Rechts      Enter
         Adr2 Time31 : Adr2 Time32 : Adr2 Time2 : Adr2 Null : Adr2 Time_ende
         Adr2 Menue_time32
         Data &B00000111
         '     1234567890123456
         Data "    Sekunden"
         Data "Eingabe       SS"
         Data "Zeit:"

Time_ende:
         ' Hoch       Runter      Links       Rechts      Enter
         Adr2 Null : Adr2 Null : Adr2 Null : Adr2 Null : Adr2 Null
         Adr2 Menue_time_ende
         Data &B00000000
         '     1234567890123456
         Data ""
         Data ""
         Data ""

' Statemachine für universelle Datumeingabe
Date1:
         ' Hoch         Runter        Links             Rechts       Enter
         Adr2 Date11 : Adr2 Date12 : Adr2 Date_ende : Adr2 Date2 : Adr2 Date_ende
         Adr2 Menue_date1
         Data &B00000111
         '     1234567890123456
         Data "       Tag"
         Data "Eingabe TT"
         Data "Datum:"

Date11:
         ' Hoch         Runter        Links             Rechts       Enter
         Adr2 Date11 : Adr2 Date12 : Adr2 Date_ende : Adr2 Date2 : Adr2 Date_ende
         Adr2 Menue_date11
         Data &B00000111
         '     1234567890123456
         Data "       Tag"
         Data "Eingabe TT"
         Data "Datum:"

Date12:
         ' Hoch         Runter        Links             Rechts       Enter
         Adr2 Date11 : Adr2 Date12 : Adr2 Date_ende : Adr2 Date2 : Adr2 Date_ende
         Adr2 Menue_date12
         Data &B00000111
         '     1234567890123456
         Data "       Tag"
         Data "Eingabe TT"
         Data "Datum:"

Date2:
         ' Hoch         Runter        Links        Rechts       Enter
         Adr2 Date21 : Adr2 Date22 : Adr2 Date1 : Adr2 Date3 : Adr2 Date_ende
         Adr2 Menue_date2
         Data &B00000111
         '     1234567890123456
         Data "      Monat"
         Data "Eingabe    MM"
         Data "Datum:"

Date21:
         ' Hoch         Runter        Links        Rechts       Enter
         Adr2 Date21 : Adr2 Date22 : Adr2 Date1 : Adr2 Date3 : Adr2 Date_ende
         Adr2 Menue_date21
         Data &B00000111
         '     1234567890123456
         Data "      Monat"
         Data "Eingabe    MM"
         Data "Datum:"

Date22:
         ' Hoch         Runter        Links        Rechts       Enter
         Adr2 Date21 : Adr2 Date22 : Adr2 Date1 : Adr2 Date3 : Adr2 Date_ende
         Adr2 Menue_date22
         Data &B00000111
         '     1234567890123456
         Data "      Monat"
         Data "Eingabe    MM"
         Data "Datum:"

Date3:
         ' Hoch         Runter        Links        Rechts      Enter
         Adr2 Date31 : Adr2 Date32 : Adr2 Date2 : Adr2 Null : Adr2 Date_ende
         Adr2 Menue_date3
         Data &B00000111
         '     1234567890123456
         Data "      Jahr"
         Data "Eingabe       JJ"
         Data "Datum:"

Date31:
         ' Hoch         Runter        Links        Rechts      Enter
         Adr2 Date31 : Adr2 Date32 : Adr2 Date2 : Adr2 Null : Adr2 Date_ende
         Adr2 Menue_date31
         Data &B00000111
         '     1234567890123456
         Data "      Jahr"
         Data "Eingabe       JJ"
         Data "Datum:"

Date32:
         ' Hoch         Runter        Links        Rechts      Enter
         Adr2 Date31 : Adr2 Date32 : Adr2 Date2 : Adr2 Null : Adr2 Date_ende
         Adr2 Menue_date32
         Data &B00000111
         '     1234567890123456
         Data "      Jahr"
         Data "Eingabe       JJ"
         Data "Datum:"

Date_ende:
         ' Hoch       Runter      Links       Rechts      Enter
         Adr2 Null : Adr2 Null : Adr2 Null : Adr2 Null : Adr2 Null
         Adr2 Menue_date_ende
         Data &B00000000
         '     1234567890123456
         Data ""
         Data ""
         Data ""

'-- End Bedatung der Menue-State-Machine --------------------------------------

'###################################### END ###################################

'################################### Historie #################################
' 09.12.2008 : Version 1.0
'              Erste offizielle und vollständig umgesetzte Produktivsoftware
'------------------------------------------------------------------------------
' 11.12.2008 : Version 1.1
'              Kommentare und Traceausgaben im gesamten Code ergänzt
'##############################################################################