'Beispiel für Station mit i/o-Terminal +Sys ' **** kein sinnvolles Hauptprogramm für Heizung ***** 'Demonstration für 'Funktionstasten, LED-Anzeige, Tasten und LEDs des i/o-Terminals und LCD-Anzeige 'Bedienung: ' Station Taste FT1 stellt das AnzeigeBild +1 (siehe LCD-Anzeige) ' mit Taste FT3 bzw. FT4 wird der Anzeige-Wert erhöht bzw. gesenkt ' Tasten des i/o-Terminals Erläuterungen siehe im Programm ' Beispiele für LEDs des i/o-Terminals siehe im Programm '28.12.2003 Wilzeck '*** Definitionen *** define KEY_VAL AD[4]'TASTATUR I/O define T1 AD[5]' Temperatursensor 1 define T2 AD[6]' Temperatursensor 2 define sdio port[5]'DATA INTERFACE ZUM I/O TERMINAL define sclio port[6]'CLOCK define strobe port[4]'STROBE define light port[3]'LAMP LCD <<<<<<<<<<<<<<<<<<<<<<<<<<<<<< löschen define K1 port[7]' Relais K1 Brenner define K2 port[8]' Relais K2 Heizungspumpe define F1 port[9]' Taste F1 Station define F2 port[10] define F3 port[11] define F4 port[12] define LED1 Port[13]' Station LED1 an Port 13 define LED2 Port[14]' LED2 an Port 14 define LED3 Port[15]' LED3 an Port 15 define LED4 Port[16]' LED4 an Port 16 define AnzeigeNr byte'Byte 1 (Bit 1,2,3,4 = Anz.Nr) (Bit 5,6,7,8 = Zwischenspeicher-Bits) define LED_PORT byte'muss 2 sein für Treiber define EXT_PORT byte'muss 3 define CHAR byte'muss 4 (= Pos = Dez) define POS byte[4] define DEZ byte[4] define lcd_data byte'muss 5 define Wert3 byte'6 Zwischenspeicher 3 (Rechenwerte und Zwischenwerte )Bit 41-48 define Wert1 byte'7 Zwischenspeicher 1 (Rechenwerte und Zahlenübergabe)Bit 49-56 define Wert2 byte'8 Zwischenspeicher 2 define Wert12 word[4]'= Byte 7,8 define BrennerStarts byte'9 Byte Schalthäufigkeit Heizung Ein define Schritt byte'10 Byte Schritt-Nummer (Brennzyklus) define Bit81_88 byte'11 (statische Bits)<<(bit 81 bis 88)<<<<<< define key byte'12--- I/O-TASTATURDECODER ------- define xReservewort word' Byte 13,14 define TimerAlt word'15,16 Byte Zykluszeitmessung define SollDiff byte'17 Differenz EIN-AUS define Sollwert byte'18 Sollwert define Betriebszeit byte'19 Ein Dauer in Minuten define Steilheit byte'20 Byte define EinDauer byte'21 Einschaltdauer (Halbe Minuten) define PausenDauer byte'22 Pausendauer(Halbe Minuten) define NachtZeit byte'23 Byte (Uhr Nachtabsenkung) define Wartezeit byte'24 Byte Timer 1 byte (0-255) define ZweiMinPuls Bit[5]' Bit 2-Minuten-Impuls (Bit 5,6,7,8 = Zwischenspeicher-Bits bis LCD-AnzeigeNr) define Sek4puls Bit[6]' Bit 4-Sekunden Impuls (=Zykluszeit) steht bis LCD-AnzeigeNr define Minpuls Bit[7]' Bit Impuls (einmal je Minute)steht bis LCD-AnzeigeNr define HalbMinpuls Bit[8]' Bit Impuls (zweimal je Minute)steht bis LCD-AnzeigeNr define FlankeMinpuls Bit[81]'Flankenbit für Minuten-Takt define FlankeSekpuls Bit[82]'Flankenbit für 4-Sek-Takt define NachtUhr Bit[83]' Nachtabsenkung laut Uhrzeit define NachtSenkung Bit[84]' (Nachtabsenkung laut Uhrzeit oder Hand) define NachtEinHand Bit[85]' Nachtabsenkung von Hand einschalten define NachtAusHand Bit[86] 'Nachtabsenkung gesperrt von Hand define SommerHand Bit[87]'Sommerbetrieb von Hand define Sek2puls Bit[88]' Bit 2-Sekunden Impuls define wert1Bit0 Bit [49]'für bit-Handling des byte wert1 (Zwischenspeicher) define wert1Bit1 Bit [50] define wert1Bit2 Bit [51] define wert1Bit3 Bit [52] define wert1Bit4 Bit [53] define wert1Bit5 Bit [54] define wert1Bit6 Bit [55] define wert1Bit7 Bit [56] '-------------------------------------------------------------------------------------------- define RT1 bit [9] ' zu LED_PORT byte[2] define GRN1 bit [10] define RT2 bit [11] define GRN2 bit [12] define RT3 bit [13] define GRN3 bit [14] define GRN4 bit [15] define GRN5 bit [16] define P1 bit [17]' zu EXT_PORT byte[3] define P2 bit [18] define P3 bit [19] define P4 bit [20] define P5 bit [21] define P6 bit [22] define P7 bit [23] define P8 bit [24] '------------------------- '-- SYSTEM DRIVER ADDR --- '------------------------- '----- LCD SYS ADDR ------ define LCD_CW &H181 'LCD INIT define LCD_CMD &H169 'LCD COMMANDS define LCD_CLR &H138 define LCD_LINE1 &H13D define LCD_POSL1 &H141 define LCD_POSL2 &H145 define LCD_DEZ &H1C0 define LCD_WRT &H163 define LCD_PRINT &H14D '- I/O DRIVER SYS ADDR -- define IO_DRV &H112 '---- vom Original nicht benutzt ------ 'define DIMMER_ON &H101 '-------------------------- '--- PROGRAMM MEMORY ------ '-------------------------- 'define gp byte[6] '--- BIN-DEZIMAL-CONVERTER --- 'define tausender byte[7] 'define hunderter byte[8] 'define zehner byte[9] 'define einer byte[10] 'define counter word[12] '------- KEY DECODER --------- 'define key byte[11] 'define digit byte[12] '-------------------------------------------------------------------------------------------- 'Definition von Konstanten define SollUG1 40 ' Untergrenze Sollwert 1 (z.B. für Tag) define SollUG2 35 ' Untergrenze Sollwert 2 (z.B. für Nacht) define SollUGWW 10 ' Untergrenze Sollwert Warmwasser Aus Sommer define SollWW 50 ' Untergrenze Sollwert Sommer Warmwasser (z.B. ab 6 Uhr) define Basis 200 ' *** Vorbesetzungen und INITIALISIERUNG bei Neuanlauf *** 'LCD strobe=OFF:light=ON:gosub LCD2x8_init:gosub Text_nach_Start:pause 200 :SYS LCD_CLR gosub leds_off:gosub ports_off 'Relais K1 = OFF K2 = ON 'Werte NachtZeit = &H37 ' 3 Stunden vor Mitternacht bis 7 Uhr Key =255 AnzeigeNr = 1 schritt = 0 Pausendauer = 21 '---- Bildschirm Terminal je nach Anwendung ---------- 'put 27: print "[2J"' Bildschirm löschen bei Neuanlauf '********************************************************************** #loop '---- Bildschirm Terminal je nach Anwendung ---------- ' #endeBS '********************************************************************** ' *** 1.) Dauerbearbeitung Steuerungsteile *** '1.0) Allgemein ' *** Zeittakt *** ' Bildung von Zeittakt Sek4puls =OFF : Sek2puls = OFF ' Reset Sekunden-Impulse wert1 = second if wert1Bit1 = FlankeSekpuls then goto EndeSekpuls' Bit 1 wechselt alle 2 Sekunden FlankeSekpuls = wert1Bit1 Sek2puls = ON ' Aufrufbit alle 2 sec Sek4puls = wert1Bit2' Aufrufbit alle 4 sec #EndeSekpuls HalbMinpuls =OFF:Minpuls =OFF:ZweiMinpuls =OFF:' Reset Minutenimpulse if (second > 5)and (second < 20) then goto setz' Impuls halbe Minute, Minuten-, ZweiMinutenImpuls if (second > 35)and (second < 50) then goto HalbMin' halbe Minute FlankeMinpuls = OFF' Reset Flanke Goto Ende10 #setz if (FlankeMinpuls = ON) then goto Ende10 Minpuls = ON ' Aufrufbit einmal je Minute Wert1 = Minute if Wert1Bit0 = ON then ZweiMinpuls = ON ' Zwei-Minuten-Impuls #HalbMin if (FlankeMinpuls = ON) then goto Ende10 FlankeMinpuls = ON ' Setze Flanke HalbMinpuls = ON ' Aufrufbit zweimal je Minute #Ende10 '1.1 *** Temperaturmessung und Normierung *** gosub T2 'Temperatur Rücklauf wert2 = wert1 ' ablegen auf wert2 gosub T1' (T1= -25 bis 102,5 Grad) Vorlauf Istwert liegt in Wert1 '1.2) *** Kesselregelung Vorlauftemperatur *** if (Wartezeit = 0) then goto Schritt 'Wartezeit abgelaufen? ja ---> Schritt if (Sek4puls = OFF) then goto SchrittWartezeit Wartezeit = Wartezeit -1 'Wartezeit - 1x4 sek #SchrittWartezeit' Schrittregister bei Wartezeit läuft if (Schritt <= 1) then goto Schritt1w' Wartezeit abbrechen? Goto Ende12'----------------------------------->>> #Schritt1w wartezeit = 0' Wartezeit abbrechen! Schritt = 2 Goto Ende12'----------------------------------->>> #Schritt ' Schrittregister bei Wartezeit Null if (Schritt = 1) then goto Schritt1' Heizen einschalten? Pumpe ein-aus if (Schritt = 2) then goto Schritt2' Pumpe ein, Wartezeit if (Schritt = 3) then goto Schritt3' Heizen einschalten if (Schritt = 4) then goto Schritt4' Heizen ausschalten? Heizen aus if (Schritt = 5) then goto Schritt5' Pausendauer aus if (Schritt = 6) then goto Schritt6' Nachtabsenkung, Pumpe aus, Wartezeit Schritt = 1 'wenn nicht Schritt 1 bis 6 wartezeit = 15' Einschaltverzögerung 15x4 sec K2 = ON : K1 = OFF Goto Ende12 #Schritt1' Heizen einschalten? Pumpe ein-aus if (Wert1 =< Sollwert) then goto Schrittweiter' Istwert kleiner Sollwert ---> einschalten if(Sommerhand = ON) then goto PumpeAus if (NachtSenkung = ON) then goto Intervall goto PumpeAus' --> Pumpe aus #Intervall if (K2 = ON) then goto Ruhepause 'Intervall Pumpe Wartezeit = 10 :K2 = ON 'Pumpe Ein für 40 sec goto Ende12 #Ruhepause wartezeit = 255 'für 17 Minuten Goto PumpeAus #PumpeAus K2 = OFF ' Pumpe Aus goto Ende12' nicht einschalten #Schritt2 K2 = ON 'Pumpe Ein Wartezeit = 10'x4 sec Wartezeit setzen (Zeitverzögerung für Brenner Ein) Goto Schrittweiter #Schritt3' Heizen ein K1 = ON ' (Brenner Ein) BrennerStarts = BrennerStarts + 1 'ab Beginn Tag EinDauer = 0' Einschaltdauer Null setzen Wartezeit = 7'x4 sec Wartezeit setzen Goto Schrittweiter #Schritt4' Heizen ausschalten? Heizen aus wert3 = Sollwert + SollDiff' Ausschaltwert #Abfrage if (Wert1 < wert3) then goto Ende12' Istwert kleiner Sollwert --> nicht ausschalten #Ausschalten K1 = OFF 'Brenner Aus Wartezeit = 15 'x4 sek Wartezeit setzen (für Lesen der Anzeige) Goto Schrittweiter #Schritt5' PausenDauer (rück)setzen PausenDauer = 2' 2 Halbminuten (Ersatz für Wartezeit Schritt 4) Goto Schrittweiter #Schritt6' Nachtabsenkung und weitere Wartezeiten Restwärme entnehmen if (Wert1 > sollwert +2) then goto Ende12' Istwert > Sollwert + 2Grad --> nicht Pumpe ausschalten Wartezeit = 30 ' K2 = OFF 'Pumpe aus #Schrittweiter Schritt = Schritt + 1 #Ende12 '1.3) *** Betriebsstunden sowie Einschaltdauer und Pausendauer (Brennzyklus) *** if (K1 = OFF)or(ZweiMinpuls = OFF)then goto EinDauer' HalbMinpuls halbe Minuten if (Betriebszeit > 240) then Betriebszeit = 0' nach 8 Std rücksetzen Betriebszeit = Betriebszeit +1' Zwei Minuten Zeitmessung Einschaltdauer Brenner #EinDauer if (HalbMinpuls = OFF)then goto Ende13' HalbMinpuls halbe Minuten if (K1 = OFF)then goto Pause' HalbMinpuls halbe Minuten if (EinDauer > 254) then goto Ende13 EinDauer = EinDauer +1' halbe Minuten Zeitmessung Einschaltdauer Brenner Goto Ende13 #Pause if (PausenDauer > 254) then goto Ende13 PausenDauer = PausenDauer +1' halbe Minuten Zeitmessung Einschaltdauer Brenner #Ende13 '1.4)Nachtabsenkung (und Warmwasser-Sommerbetrieb) if year > 90 then goto Tagbereich ' Funkuhr noch nicht in Betrieb Gosub Nachtzeit ' Nachzeit (z.B. 22 bis 6 Uhr) wird in Wert1 und Wert2 abgelegt if (Hour >= Wert1) or (Hour < Wert2)then goto Absenkung' Uhr Nachtbereich? ja --> goto Tagbereich ' --> #Absenkung ' NachtEinHand = OFF' Reset NachtEinHand, wenn Absenkung laut Uhr NachtUhr = ON ' Nachtabsenkung laut Uhr if NachtAusHand = ON then goto Sperre ' NachtabsenkungAusHand (Sperre) if NachtSenkung = OFF then goto SollNachtAnfang Goto Ende14 #Sperre if NachtSenkung = OFF then goto Ende14 Goto SollNachtEnde ' Sollwert setzen für Ende Nachtabsenkung #Tagbereich if NachtUhr = OFF then goto NachtHand ' (Flanke) NachtUhr = OFF ' (gleichzeitig Flankenauswertung) NachtAusHand = OFF ' Reset NachtabsenkungAusHand Betriebszeit =0 : Brennerstarts = 0 ' Betriebstundenzähler und Brennerstarts Null setzen Goto SollNachtEnde ' Sollwert setzen für Ende Nachtabsenkung #NachtHand ' Vorzeitige Nachtabsenkung von Hand ? if (NachtAusHand = OFF) then goto TasteNachtEinHand ' Nachtabsenkung Sperre von Hand if NachtSenkung = OFF then goto Ende14 Goto SollNachtEnde ' Sollwert setzen für Ende Nachtabsenkung #TasteNachtEinHand if (NachtEinHand = OFF) then goto Ende14 ' nein --> (keine Nachtabsenkung von Hand im Tagbereich) if NachtSenkung = ON then goto Ende14 #SollNachtAnfang ' Sollwert setzen für Anfang Nachtabsenkung einmalig! NachtSenkung = ON' (gleichzeitig Flankenauswertung, Sollwert wird einmalig gesetzt!) if SommerHand = OFF then goto weiter141 Sollwert = SollUGWW '10 Grad (=Aus) #weiter141 Goto NeuStart #SollNachtEnde ' Sollwert setzen für Ende Nachtabsenkung einmalig! NachtSenkung = OFF ' NachtAbsenkung Ende (Flankenauswertung) #NeuStart schritt = 0 :Wartezeit = 0 #Ende14 Goto weiter16' ============>>>>>> '------------------------------------------------------------------------------------------ '1.5 *** Unterprogramme gosub *** '*** Temperatur *** ******************************************************** #T1K ' gosub T1K --> wert1 Grad , wert2 Kommastelle wert2 = (T1-50)mod 2*5 ' Kommastelle zu T1 (halbe Grad) #T1 '' gosub T1 --> wert1 Grad Wert1 = T1/2-25:return' (T1= -25 bis 102,5 Grad) Vorlauf Istwert als Grad #T2K wert2 = (T2-50)mod 2*5 ' Kommastelle zu T2 (halbe Grad) #T2 Wert1 = T2/2-25:return' (T1= -25 bis 102,5 Grad) Rücklauf Istwert als Grad #Nachtzeit ' *** Nachtabsenkung *** Uhrzeit Beginn in Wert1 und Ende in Wert2 'wert1 = 24 - Nachtzeit shr 4 : wert2 = Nachtzeit shl 4 : wert2 = wert2 shr 4 : return wert1 = 24 - Nachtzeit / 16 : wert2 = Nachtzeit mod 16 : return '------------------------------------------------------------------------------------------- #weiter16 ' *** Ein- und Ausgaben *** AnzeigeNr = AnzeigeNr shl 4 :AnzeigeNr = AnzeigeNr shr 4' Maskierung AnzeigeNr (=Reset Bit 5,6,7,8) if sek2puls = ON then gosub Tastatur else gosub LED ' Tastatur 2.) Anzeigen 3.) Goto LCD' Anzeigen 4.) (LCD endet mit goto loop) '------------------------------------------------------------------------------------- #Tastatur ' Bedienung: (Taste mehrere sec. druecken bis LED leuchtet, Quittung) '2.1) Funktionsumschaltung Taste F1 if not F1 then goto AnzeigeNrstellen' Eingabemodus =AnzeigeNr + LED1 = OFF' keine Taste gedrueckt, dann LED aus if not F2 then goto AnzeigeNrMinus' Ein/Aus LED2 = OFF' keine Taste gedrueckt, dann LED aus '2.2) I/O Tastatur Bedienung Nachtabsenkung sperren bzw. Sommerbetrieb gosub key_decode 'Abfrage Taste auf I/O-Terminal gedrückt if key=255 then goto weiter23 '255=keine Taste, 0 bis 9=Ziffer, 10/11/12=F1/F2/F3, 13=clear, 14=return if key =10 then goto NachtEinHand' FT 1 I/O Nachtabsenkung Ein (vorzeitig anstelle Uhr) if key =11 then goto NachtAusHand' FT 2 I/O Keine Nachtabsenkung (anstelle Uhr) if key =12 then goto SommerHand' FT 3 I/O Sommerbetrieb Ein if key =13 then goto Reset 'Taste clear I/O (Reset für Alles) if (key > 9) then weiter23 AnzeigeNr = key : LED1 = ON ' Übernahme Taste 0 bis 9 auf AnzeigeNr mit Tasten-Quittung auf LED 1 #weiter23 '2.3 AnzeigeNrabfragen mit Tasten-Quittung durch LED if (AnzeigeNr = 0) then goto ohneEingabe if (AnzeigeNr = 1) then goto NachtEin' Uhr stellen if (AnzeigeNr = 2) then goto NachtAus' Uhr stellen if (AnzeigeNr = 3) then goto StelleSollwertEin' Sollwert stellen 'if (AnzeigeNr = 4) then goto StelleSollwertAus if (AnzeigeNr = 5) then goto StelleSteilheit if (AnzeigeNr = 9) then goto StelleBetriebszeit if (AnzeigeNr < 11) then goto ohneEingabe '(nur Anzeige) !!! 'if (AnzeigeNr = 8) then goto FT234' Reserve FT2 FT3 FT4 schalten AnzeigeNr = 0' AnzeigeNr Null setzen,wenn keine if-Abfrage #ohneEingabe return' Tastatur fertig, keine Eingabe '------------------------------------------------------- #AnzeigeNrstellen ' Bedienfunktionen LED1 = ON' LED Quittung AnzeigeNr = AnzeigeNr +1 return #AnzeigeNrMinus ' Bedienfunktionen LED2 = ON' LED Quittung AnzeigeNr = AnzeigeNr -1 return #NachtEinHand' Nachtabsenkung von Hand ein NachtAusHand = OFF:NachtEinHand = not NachtEinHand:return #NachtAusHand' Nachtabsenkung von Hand aus NachtEinHand = OFF:NachtAusHand = not NachtAusHand:return #SommerHand 'einschalten SommerHand = not SommerHand:return #Reset AnzeigeNr = 0 : Sollwert = SollUG1 SommerHand = OFF: NachtEinHand = OFF: NachtAusHand = OFF: return #NachtEin if not F3 then goto hour' wenn F3 betätigt, dann.... if not F4 then goto hourminus' wenn F4 betätigt, dann.... LED3 = OFF:LED4 = OFF' keine Taste gedrueckt, dann LED aus return 'keine Taste betätigt #hour 'Stunde einstellen LED3 = ON' LED Quittung NachtZeit = NachtZeit -16 return #hourminus ' einstellen LED4 = ON' LED Quittung NachtZeit = NachtZeit +16 return #NachtAus if not F3 then goto Frueh' wenn F3 betätigt, dann.... if not F4 then goto Fruehminus' wenn F4 betätigt, dann.... LED3 = OFF:LED4 = OFF' keine Taste gedrueckt, dann LED aus return 'keine Taste betätigt #Frueh 'Stunde einstellen LED3 = ON' LED Quittung NachtZeit = NachtZeit +1 return #Fruehminus ' einstellen LED4 = ON' LED Quittung NachtZeit = NachtZeit -1 return #StelleSollwertEin ' Sollwert stellen if not F3 then goto sollplus' wenn F3 betätigt, dann.... if not F4 then goto sollminus' wenn F4 betätigt, dann.... LED3 = OFF:LED4 = OFF' keine Taste gedrueckt, dann LED aus return 'keine Taste betätigt #sollplus 'Sollwert einstellen LED3 = ON' LED Quittung Sollwert = Sollwert + 1:return #sollminus ' einstellen LED4 = ON' LED Quittung Sollwert = Sollwert - 1:return #StelleSollwertAus if not F3 then goto SollAusPlus' wenn F3 betätigt, dann.... if not F4 then goto SollAusMinus' wenn F4 betätigt, dann.... LED3 = OFF:LED4 = OFF' keine Taste gedrueckt, dann LED aus return 'keine Taste betätigt #SollAusPlus 'Solldifferenz einstellen LED3 = ON' LED Quittung SollDiff = SollDiff +10:return #SollAusMinus ' einstellen LED4 = ON' LED Quittung SollDiff = SollDiff -10 : return #StelleSteilheit if not F3 then goto SteilheitPlus' wenn F3 betätigt, dann.... if not F4 then goto SteilheitMinus' wenn F4 betätigt, dann.... LED3 = OFF:LED4 = OFF' keine Taste gedrueckt, dann LED aus return 'keine Taste betätigt #SteilheitPlus 'Steilheit einstellen LED3 = ON' LED Quittung Steilheit = Steilheit +100 : return #SteilheitMinus ' einstellen LED4 = ON' LED Quittung Steilheit = Steilheit -100 :return #StelleBetriebszeit if not F3 then goto ZeitPlus' wenn F3 betätigt, dann.... if not F4 then goto ZeitMinus' wenn F4 betätigt, dann.... LED3 = OFF:LED4 = OFF' keine Taste gedrueckt, dann LED aus return 'keine Taste betätigt #ZeitPlus 'Betriebszeit einstellen LED3 = ON' LED Quittung Betriebszeit = Betriebszeit + 100 :return #ZeitMinus ' einstellen LED4 = ON' LED Quittung Betriebszeit = Betriebszeit - 100 return '-------- Ende Tastatur ---------------------------------------------- #LED '3. **** LED - Anzeigen I/O (LED-Anzeigen Station siehe oben) *** if (NachtEinHand = ON)or (NachtUhr = ON) then gosub 1gnON else gosub 1gnOFF' Nachtabsenkung (Hand oder autom. Uhr) if (NachtAusHand = ON) then gosub 2rtON else gosub 2rtOFF' Keine Nachtabsenkung (anstelle Uhr) if (SommerHand = ON) then gosub 3gnON else gosub 3gnOFF' Sommerbetrieb für Heißwasser 'if (NachtEinHand = ON) then gosub 4gnON else gosub 4gnOFF 'if (Heizbefehl = ON) then gosub 5gnON else gosub 5gnOFF return '------- Ende Unterprogramm LED ----------------------------------- #LCD '4. *** Ausgabe auf LCD I/O-Terminal *** if (AnzeigeNr = 1)then goto Nachtuhr' Zeile 1 Uhr Nacht stellen mit F3(+) und F4(-) if (AnzeigeNr = 2)then goto Nachtuhr' Zeile 2 Uhr Nacht stellen mit F3(+) und F4(-) if (AnzeigeNr = 3)then goto IstSoll' Sollwert stellen mit F3(+) und F4(-) (Anzeige SollEin) if (AnzeigeNr = 4)then goto Wochentag' Anzeige Wochentag if (AnzeigeNr = 5)then goto Steilheit' Ein und Auszeit Anzeigen if (AnzeigeNr = 6)then goto ANrSollIst' AnzeigeNr Ein+Aus Sollwerte anzeigen if (AnzeigeNr = 7)then goto DatumUhr' Datum und Uhr Anzeigen if (AnzeigeNr = 8)then goto EinAusZeit' Ein und Auszeit Anzeigen if (AnzeigeNr = 9)then goto Betriebszeit' Anzeige-Nr + TagNr + Uhr anzeigen if (AnzeigeNr => 10)then goto AnzeigeNr' Anzeige-Nr + TagNr + Uhr anzeigen #Sollist' Grundanzeige Istwert und Sollwert (bei AnzeigeNr 0) gosub setline1 if K1 = ON then goto Sollaus wert1 = sollWert Goto ausg #Sollaus wert1 = sollwert + solldiff #Ausg sys LCD_print: print "soll";: gosub ZAHL2pm :gosub c gosub setline2:sys LCD_print: print "istw ";:gosub T1: gosub ZAHL2 :gosub c:goto ende #Nachtuhr'(1,2) Anzeige für Uhrzeiten der Nachtabsenkung einstellen gosub StartAnzeigeNR:sys LCD_print: print "Uhr ";:gosub Nachtzeit:gosub ZAHL2 gosub setline2:sys LCD_print: print "Nacht ";:wert1 = wert2:gosub ZAHL2:goto ende #IstSoll'(3,4)Anzeige für Sollwerte einstellen gosub StartAnzeigeNR:sys LCD_print: print "ist";:gosub T1:gosub ZAHL2pm gosub setline2:wert1 = Sollwert:gosub ZAHL2 gosub c:gosub Punkt:wert1 =sollwert + Solldiff :gosub ZAHL2:goto ende ' #Wochentag gosub StartAnzeigeNR:sys LCD_print: print " Tag ";:wert1 = DOW:gosub ZAHL1 gosub setline2:sys LCD_print: print " Start ";:wert1 = 5: gosub ZAHL1:goto ende ' #Steilheit'(5) Anzeige der Steilheit gosub StartAnzeigeNR:sys LCD_print: print "Steilh."; gosub setline2:wert1 = (Basis + Steilheit) / 100:gosub ZAHL2 wert1 = (Basis + Steilheit) mod 100:gosub ZAHL2:sys LCD_print: print " x "; :goto Ende #ANrSollIst'(6) gosub StartAnzeigeNR wert1 =sollwert:gosub ZAHL2:gosub c:wert1 =sollwert + solldiff:gosub ZAHL2:gosub c gosub setline2:sys LCD_print: print "istw ";:gosub T1: gosub ZAHL2 :gosub c:goto ende #DatumUhr'(7) Anzeige Uhr und Datum gosub setline1:gosub T:wert1 = DOW:gosub ZAHL1:gosub space wert1 = HOUR:gosub ZAHL2 : gosub DoppelPunkt:wert1 = Minute:gosub ZAHL2 gosub setline2:wert1 = Day: gosub ZAHL2 : gosub Punkt:wert1 = month: gosub ZAHL2:gosub Punkt wert1 = year: gosub ZAHL2 :goto ende #EinAusZeit'(8) Anzeige der Ein- und Pausenzeit gosub StartAnzeigeNR:sys LCD_print: print "EinAus"; gosub setline2:wert1 = EinDauer:gosub ZAHL2pm wert1 = PausenDauer:gosub ZAHL2:sys LCD_print: print "min"; :goto Ende #Betriebszeit'(9) Anzeige der Betriebszeit gosub StartAnzeigeNR:sys LCD_print: print "B-Zeit"; gosub setline2:wert1 = Betriebszeit/10000:gosub ZAHL1 'Ausgabe Zehntausender wert1 = Betriebszeit MOD 10000 / 100:gosub ZAHL2 ' Ausgabe Tausender und Hunderter wert1 = Betriebszeit MOD 100 : gosub ZAHL2 ' Ausgabe Zehner und Einer goto Ende #AnzeigeNr'(10) gosub StartAnzeigeNR :sys LCD_print : print " Tag ";:wert1 = DOW:gosub ZAHL1 gosub setline2:wert1 = HOUR:gosub ZAHL2 : gosub DoppelPunkt:wert1 = Minute:gosub ZAHL2 gosub DoppelPunkt:wert1 = second: gosub ZAHL2 :goto ende #Ende' Ende LCD-Ausgabeprogramm Goto loop 'Ende des Ablaufprogramms, Schleife zurück+++++++++++++++++++++++++++++++++++++++++++++++++++ '------- Text Sonderzeichen und Zahlenausgabe für LCD ---------------- #StartAnzeigeNR gosub setline1:wert1 = AnzeigeNr:gosub Zahl1 #space' (gosub space) gibt 1 space auf LCD aus CHAR=&HA0 #SYS_WRT SYS LCD_WRT : Return #ist'Text bei AnzeigeNr 3 und 4 CHAR=&HC9: SYS LCD_WRT' Ist CHAR=&HF3: SYS LCD_WRT CHAR=&HF4:goto SYS_WRT #c CHAR=&HE3: Goto SYS_WRT ' c (Grad) #T' CHAR=&HD4: Goto SYS_WRT ' T #Komma CHAR=&HAC: Goto SYS_WRT 'Zeichen Komma #Punkt CHAR=&HAE: Goto SYS_WRT 'Zeichen Punkt #DoppelPunkt CHAR=&HBA: Goto SYS_WRT 'Zeichen Punkt #plus CHAR=&HAB: Goto SYS_WRT 'Zeichen + #minus CHAR=&HAD: Goto SYS_WRT 'Zeichen - '--------------------------------------------------- '#ZAHL1' 1 Ziffer 'Wert3=Wert1:goto Ziffer 'Ausgabe 1 Ziffer '#ZAHL2pm' 2 Ziffern plus minus (3 Plätze -99 bis +99) 'if (wert1 < 128) then goto Positiv' Zahl zu groß 'wert1 =256-wert1 'negativ 'gosub Minus : goto Zahl2 '#Positiv 'gosub Plus '#Zahl2' 2 Ziffern (2 Plätze 0 bis 99) 'if (wert1 > 99) then goto ZZ' Zahl zu groß 'Wert3=Wert1/10:gosub Ziffer 'Maskierung Zehner + Ausgabe Ziffer '#Einer 'Wert3=Wert1 Mod 10:goto Ziffer 'Maskierung Einer '#ZZ ' CHAR=&HBF: SYS LCD_WRT' Zeichen(?) ausgeben 'goto Einer' ausgeben '#Ziffer' (gosub Ziffer) gibt 1 Ziffer im Speicher "Wert3" auf LCD aus ' CHAR=Wert3+&HB0: Goto SYS_WRT '#ZAHL1' 1 Ziffer 'Wert3=Wert1:goto Ziffer 'Ausgabe 1 Ziffer #ZAHL2pm' 2 Ziffern plus minus (3 Plätze -99 bis +99) if (wert1 < 128) then goto Positiv' wert1 =256-wert1 'negativ gosub Minus : goto Zahl2 ' Zeichen minus ausgeben #Positiv gosub Plus ' Zeichen + ausgeben #Zahl2' 2 Ziffern (2 Plätze 0 bis 99) if (wert1 > 99) then goto ZZ' Zahl zu groß #Zahl DEZ = wert1 : sys LCD_Dez :return 'Wert3=Wert1/10:gosub Ziffer 'Maskierung Zehner + Ausgabe Ziffer '#Einer 'Wert3=Wert1 Mod 10:goto Ziffer 'Maskierung Einer #ZZ CHAR=&HBF: SYS LCD_WRT' Zeichen(?) ausgeben 'goto Einer' ausgeben #ZAHL1' gibt Einer Ziffer im Speicher auf LCD aus DEZ = wert1 MOD 10 'Einer bleibt übrig CHAR=DEZ +&HB0: Goto SYS_WRT '------------------------------------------------------------------- #Text_nach_Start' Ausgabe 1.Text nach Start SYS LCD_CLR 'LCD clear, start in 1.Zeile sys LCD_print: print "Wilzeck" gosub setline2 'start in 2.Zeile sys LCD_print: print "Heiz V":DEZ = 40: sys LCD_Dez : return '--------------------------------------------- 'IIIIIIIIIIIII UNTERPROGRAMME LED IIIIIIIIIIIIIIIIIIIIIII 'IIIIIIIIII UNTERPROGRAMME LED DRIVER IIIIIIIIIIIIII #leds_off LED_PORT=255:SYS IO_DRV:return #1rton RT1=off:SYS IO_DRV:return #1rtoff RT1=on:SYS IO_DRV:return #1gnon GRN1=off:SYS IO_DRV:return #1gnoff GRN1=on:SYS IO_DRV:return '----------------------------------------------------- #2rton RT2=off:SYS IO_DRV:return #2rtoff RT2=on:SYS IO_DRV:return #2gnon GRN2=off:SYS IO_DRV:return #2gnoff GRN2=on:SYS IO_DRV:return '----------------------------------------------------- #3rton RT3=off:SYS IO_DRV:return #3rtoff RT3=on:SYS IO_DRV:return #3gnon GRN3=off:SYS IO_DRV:return #3gnoff GRN3=on:SYS IO_DRV:return '------------------------------------------------------ #4gnon GRN4=off:SYS IO_DRV:return #4gnoff GRN4=on:SYS IO_DRV:return '------------------------------------------------------ #5gnon GRN5=off:SYS IO_DRV:return #5gnoff GRN5=on:SYS IO_DRV:return 'IIIIIIIIII UNTERPROGRAMME PORT DRIVER IIIIIIIIIIIIIIII #ports_off EXT_PORT=255:sys IO_DRV:return '------------------------------------------------------ '#1off 'P1=on:SYS IO_DRV:return' Port 2 bis 8 noch nicht kopiert <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< '#1on 'P1=off:SYS IO_DRV:return '------------------------------------------------------ '------ Unterprogramme Bildschirm ---------------------------------- #EinAus if (wert1 = 0) then goto printAus put 27:print "[0;4;30;43m";' Farbe print "Ein "; put 27:print "[0m";' Farbe reset return #printAus put 27:print "[0;4;30;45m";' Farbe print "Aus "; put 27:print "[0m";' Farbe reset return 'IIIIIIIIIIIII UNTERPROGRAMME Tastatur IIIIIIIIIIIIIIIIIIIIIII #key_decode 'Umsetzungstabelle empfangene Werte auf normierte Tastencode key=255:if key_val<8 then return 'Sperre (255) setzen, von I/OTerminal empfangener Wert="Keine Taste gedrückt" key=key_val:pause 3' x 20 msec -- STABILIZE KEY_VAL --- if abs(key-key_val)> 5 then goto key_decode if key_val>8 then key=10 'F1 KEY if key_val>25 then key=11 'F2 KEY if key_val>41 then key=12 'F3 KEY if key_val>57 then key=1 ' 1 KEY if key_val>74 then key=2 ' 2 KEY if key_val>90 then key=3 ' 3 KEY if key_val>106 then key=4 ' 4 KEY if key_val>122 then key=5 ' 5 KEY if key_val>138 then key=6 ' 6 KEY if key_val>154 then key=7 ' 7 KEY if key_val>168 then key=9 ' 9 KEY if key_val>185 then key=8 ' 8 KEY if key_val>201 then key=0 ' 0 KEY if key_val>218 then key=13 ' CLEAR if key_val>234 then key=14 ' RETURN return '-------------------------------------------- '----- I/O-TERMINAL LCD BASIC ROUTINES ----- '-------------------------------------------- #setline1 CHAR=&H84:sys LCD_CMD:return #setline2 CHAR=&HC4:sys LCD_CMD:return '#scroll_display_left 'CHAR=&H18:sys LCD_CMD:return '#scroll_display_right 'CHAR=&H1C:sys LCD_CMD:return '--------------------------------------------- #lcd2x8_init sclio=on:sdio=on:sdio=off:sclio=off lcd_data=&H74:sys LCD_CW lcd_data=&H00:sys LCD_CW lcd_data=&H25:sys LCD_CW lcd_data=&H06:sys LCD_CW lcd_data=&H24:sys LCD_CW lcd_data=&H0C:sys LCD_CW lcd_data=&H84:sys LCD_CW sdio=off:sclio=on:sdio=on:return '--------- EINBINDUNG DES TREIBERS ----------- syscode "iotdrv12.s19" ' Nur einmalig übertragen, dann Zeile mit ' auf Kommentar schalten 'Ende