Ich habe den Code damals leider aus Versehen gelöscht.
Ich abe mir damals das Grundprogramm runtergeldaen und dieses hätte ich versucht anzupassen und eine Menüführung zu integrieren, und da bin ich halt gescheitert.
Mein Problem war wenn ich in der Schleife sage Wenn Taste "Menü" gedrückt wird dann gehe zu Subroutine Menü und zeige im display Menü.
dann springe ich wieder zurück in die Schleife. Aber die Schleife überschreibt ja dann das Display wieder wenn es wieder die Werte am Display ausgibt.
Es ist bestimmt nur ein Logikfehler von mir.
Hier ist das Grundprogramm auf diesem ich es aufbauen wollte.
(Das Programm gehört Markus Bigiel)Code:define Takt 8 ' Takt in Sekunden bis zum nächsten Prozent '***** GLOBALE VARIABLE ***** define command byte define value byte define LastHour byte define LastMinute byte define TempMin byte define TempMax byte define pHMin byte define pHMax byte define hMin_1 byte define hMax_1 byte define hMin_2 byte define hMax_2 byte define LeitMin byte define LeitMax byte define MinutePumpe byte define LastSecond byte 'global define Lichtproz byte 'global define Lokal byte 'lokal define TaktHilf byte 'global - Lichttakt define TempAuswert byte 'global define pHAuswert byte 'global define LeitAuswert byte 'global define EVG DA[1] define TempMess AD[1] define LeitMess AD[2] define pHMess AD[3] define Wasserstand_oben AD[7] define Wasserstand_unten AD[8] define Licht port[1] define Licht2 port[2] define Pumpe port[3] define CO2 port[4] define UV port[5] define Heizung port[6] define Putzen port[7] define Kati port[8] '***** ASCII-ZEICHENVARIABLE FÜR LCD-DISPLAY ***** define C_ &H43 define D_ &H44 define F_ &H46 define H_ &H48 define L_ &H4C define M_ &H4D define S_ &H53 define V_ &H56 define kA &H61 'a# define PROZ &H25 '%# define kI &H69 'i# define kM &H6D 'm# define kO &H6F 'o# define kP &H70 'p# define kR &H72 'r# define kU &H75 'u# define LEERZ &H20 ' define MINUS &H2D '- define NULL &H30 '0 define GLEICH &H3D '= define DOPPELPUNKT &H3A ': define PUNKT &H2E '. define GRAD &HDF '° 'LCD-Variable define lcd_buf byte define lcd_param byte 'LCD-Ports define lcd_port byteport[2] define lcd_e port[15] '"Enable" control line '***** PROGRAMMPARAMETER INITIALISIEREN UND ZU MESS-SCHLEIFE SPRINGEN **************************** 'Alle Min. / Max. - Werte aus EEProm auslesen. Beim erstmaligen Aufruf sind alle Werte = 0 'Das Endbyte wird nicht mitgelesen open# for read input# TempMin input# TempMax input# pHMin input# pHMax input# LeitMin input# LeitMax input# hMin_1 input# hMax_1 input# hMin_2 input# hMax_2 close# 'Prüfen, ob gültige Konfigurationsdaten vorliegen. Wenn nicht, dann Platzhalter dafür 'anlegen, die alle einen Standartwert bekommen. 'if TempMin + TempMax <> 0 then goto default TempMin = 45 'Standartwerte => 24,5 Grad TempMax = 48 ' => 24,8 Grad pHMin = 148 ' => 6,76 pHMax = 150 ' => 6,80 hMin_1 = 8 hMax_1 = 13 hMin_2 = 15 hMax_2 = 22 LeitMin = 15 LeitMax = 21 hour = 20 'Startuhrzeit minute = 10 year = 2004 : month = 7 : day = 19 'Default Schaltstellungen: #default gosub SaveConfigData #reset licht = on : licht2 = off : heizung = off : co2 = off pumpe = on : uv = off : putzen = off : lastminute=0 TempAuswert = 30 : pHAuswert = 170 : LeitAuswert = 150 Lichtproz = 95 : TaktHilf = Takt 'LCD initialisieren gosub LCD_INIT 'Zur Mess-Schleife springen goto MAINLOOP '***** LCD-ROUTINEN ******************************************************* 'Display zurücksetzen #LCD_INIT 'Organisation: MSB.....LSB 'zuerst im 8-Bit-Modus: lcd_param = &B00111000 : gosub LCD_WRITECMD 'Function Set: 8-Bit-Modus benutzen, mehrzeilig lcd_port = &B00000010 'Function Set: zu 4-Bit-Modus umschalten, einzeilig pulse lcd_e 'ab hier 4-Bit-Modus: lcd_param = &B00101000 : gosub LCD_WRITECMD '4-Bit-Modus, mehrzeilig lcd_param = &B00001000 : gosub LCD_WRITECMD 'Display off lcd_param = &B00001100 : gosub LCD_WRITECMD 'Display on lcd_param = &B00000110 : gosub LCD_WRITECMD 'Entry Mode: Cursor unsichtbar inkrementierend, kein Display Shift gosub LCD_CLS return 'Display löschen, Cursor Home #LCD_CLS lcd_param = &B00000010 : gosub LCD_WRITECMD 'Return Home lcd_param = &B00000001 : gosub LCD_WRITECMD 'Clear Display return 'Zeilenwechsel mit Set CGRAM Adress: (DB7 = 1) #LCD_GOTOLINE 'im 4-Bit Modus mit DB4...DB7, Bit 7 ist immer 1 (N=1) bei Display mit mehr als 1 Zeile if lcd_param = 1 then lcd_param = &B10000000 'Zeile 1 = &H00 if lcd_param = 2 then lcd_param = &B11000000 'Zeile 2 = &H40 if lcd_param = 3 then lcd_param = &B10010000 'Zeile 3 = &H10 if lcd_param = 4 then lcd_param = &B11010000 'Zeile 4 = &H50 goto LCD_WRITECMD 'Kommando senden #LCD_WRITECMD lcd_buf = &B00000000 'Buffer zurücksetzen goto LCD_WRITE 'Zeichen senden an Adresse #LCD_WRITECHAR lcd_buf = &B00100000 'CG RAM-Adresse vor Schreiben mit &B000000 vorbelegen (DB0...DB6) goto LCD_WRITE 'Kommando oder Zeichen im 4-Bit-Modus an LCD senden #LCD_WRITE lcd_port = lcd_buf or (lcd_param shr 4) ' Hi-Nibble pulse lcd_e lcd_port = lcd_buf or (lcd_param and &B00001111) ' Lo-Nibble pulse lcd_e return '***** MESS-SCHLEIFE MIT AUSGABE AN PORTS UND DISPLAY ***** '***** MESSWERTE ERFASSEN ***** #MAINLOOP 'Sekundentakt synchronisieren wait second <> LastSecond LastSecond = second 'während Putzen kann man kalibrieren dafür Takt 1 Sekunde 'if (Putzschalter = off) then takthilf=1 if (Putzen = on) then takthilf=1 'langer "Sonnenuntergang" if (takthilf <> 0) then goto endtakt if (hour <= 18) then takthilf=takt else takthilf=takt*2 #endtakt taktHilf = taktHilf - 1 'Zeile 1 lcd_param = 1 : gosub LCD_GOTOLINE 'Temperatur ------------------------------------------ if (takthilf <> 0) then goto endAuswertung TempAuswert = TempMess '(TempMess/2)+(TempAuswert/2) 'evt.Umrechnung und Korrektur 'Umrechnung für LCD-Anzeige 'Auf LCD anzeigen lcd_param = NULL + 2 if (TempAuswert >= 100) then lcd_param = NULL + 3 : gosub LCD_WRITECHAR lcd_param = NULL + (TempAuswert mod 100) / 10: gosub LCD_WRITECHAR lcd_param = PUNKT : gosub LCD_WRITECHAR lcd_param = NULL + TempAuswert mod 10 : gosub LCD_WRITECHAR lcd_param = GRAD : gosub LCD_WRITECHAR lcd_param = C_ : gosub LCD_WRITECHAR lcd_param = LEERZ : gosub LCD_WRITECHAR lcd_param = LEERZ : gosub LCD_WRITECHAR lcd_param = LEERZ : gosub LCD_WRITECHAR lcd_param = LEERZ : gosub LCD_WRITECHAR 'pH auf LCD anzeigen / Genauigkeit 0,02-------------------- 'pHAuswert = phMess phAuswert = (phMess/2)+(pHAuswert/2) 'evt.Umrechnung und Korrektur lokal = pHAuswert if (lokal < 10) then lokal = lokal + 50 lokal = lokal - 10 lokal = lokal mod 100 if (lokal > 49) then lokal = lokal - 50 lokal = lokal * 2 if(pHAuswert<10) then lcd_param = NULL + 3 if(pHAuswert>= 10) and (pHAuswert< 60) then lcd_param = NULL + 4 if(pHAuswert>= 60) and (pHAuswert<110) then lcd_param = NULL + 5 if(pHAuswert>=110) and (pHAuswert<160) then lcd_param = NULL + 6 if(pHAuswert>=160) and (pHAuswert<210) then lcd_param = NULL + 7 if(pHAuswert>=210) and (pHAuswert<=255) then lcd_param = NULL + 8 gosub LCD_WRITECHAR lcd_param = PUNKT : gosub LCD_WRITECHAR lcd_param = NULL + (Lokal mod 100) / 10 : gosub LCD_WRITECHAR lcd_param = NULL + Lokal mod 10 : gosub LCD_WRITECHAR lcd_param = kP : gosub LCD_WRITECHAR lcd_param = H_ : gosub LCD_WRITECHAR #endAuswertung 'Zeile 2 lcd_param = 2 : gosub LCD_GOTOLINE 'Licht in % 'Auf LCD anzeigen lcd_param = L_ : gosub LCD_WRITECHAR lcd_param = DOPPELPUNKT : gosub LCD_WRITECHAR lcd_param = NULL + (Lichtproz mod 1000) / 100 : gosub LCD_WRITECHAR lcd_param = NULL + (Lichtproz mod 100) / 10 : gosub LCD_WRITECHAR lcd_param = NULL + Lichtproz mod 10 : gosub LCD_WRITECHAR lcd_param = PROZ : gosub LCD_WRITECHAR lcd_param = LEERZ : gosub LCD_WRITECHAR lcd_param = LEERZ : gosub LCD_WRITECHAR lcd_param = LEERZ : gosub LCD_WRITECHAR lcd_param = LEERZ : gosub LCD_WRITECHAR 'Leitwert-Regler if LeitMess < 5 then LeitAuswert = 0 else LeitAuswert = LeitMess LeitAuswert = (LeitMess/2) + (LeitAuswert/2) 'Umrechnung für LCD-Anzeige 'Auf LCD anzeigen lcd_param = NULL + (LeitAuswert mod 1000) / 100 : gosub LCD_WRITECHAR lcd_param = NULL + (LeitAuswert mod 100) / 10 : gosub LCD_WRITECHAR lcd_param = NULL + LeitAuswert mod 10 : gosub LCD_WRITECHAR lcd_param = kU : gosub LCD_WRITECHAR lcd_param = S_ : gosub LCD_WRITECHAR lcd_param = LEERZ : gosub LCD_WRITECHAR lcd_param = LEERZ : gosub LCD_WRITECHAR lcd_param = LEERZ : gosub LCD_WRITECHAR lcd_param = LEERZ : gosub LCD_WRITECHAR lcd_param = LEERZ : gosub LCD_WRITECHAR 'Zeile 4 lcd_param = 4 : gosub LCD_GOTOLINE 'Uhrzeit lcd_param = LEERZ : gosub LCD_WRITECHAR lcd_param = LEERZ : gosub LCD_WRITECHAR lcd_param = LEERZ : gosub LCD_WRITECHAR lcd_param = LEERZ : gosub LCD_WRITECHAR lcd_param = NULL + hour / 10 : gosub LCD_WRITECHAR lcd_param = NULL + hour mod 10 : gosub LCD_WRITECHAR lcd_param = DOPPELPUNKT : gosub LCD_WRITECHAR lcd_param = NULL + minute / 10 : gosub LCD_WRITECHAR lcd_param = NULL + minute mod 10 : gosub LCD_WRITECHAR lcd_param = DOPPELPUNKT : gosub LCD_WRITECHAR lcd_param = NULL + second / 10 : gosub LCD_WRITECHAR lcd_param = NULL + second mod 10 : gosub LCD_WRITECHAR 'Zeitsteuerung der Beleuchtung Lokal=0 if ( hour >= hMin_1 ) and ( hour < hMax_1 ) then Lokal = 1 if ( hour >= hMin_2 ) and ( hour < hMax_2 ) then Lokal = 1 'UV Licht schalten UV = off 'if (hour <> LastHour) and (hour = 14) then UV = on 'if (hour <> LastHour) and (hour = 18) then UV = off 'Steuerung des Datenloggers für Licht an if (hour <> LastHour) and (licht = on) then gosub WriteToLogger if (hour <> LastHour) and (licht = on) then LastHour = Hour 'Relais schalten: 'if (Putzschalter = off) then goto StatusPutzen 'Putzen über Schalter if (Putzen = on) then goto StatusPutzen 'Putzen über PC if (lichtproz <= 10) then evg =255 if (lichtproz = 100) then evg =0 if (lichtproz > 10) and (lichtproz < 100) then evg =25+ lichtproz /2 *5 if (Lokal = 1) and (Lichtproz <>100) then gosub Lichtan if (Lokal = 0) and (LichtProz <> 0) then gosub Lichtaus if (lichtproz = 0) then licht=off else licht=on if (lichtproz = 100) then licht2=on else licht2=off if (hour <> LastHour) then gosub WriteToLogger LastHour = Hour 'Pumpe schalten und x - Minuten aus lassen ------------------- if ( MinutePumpe = 254 ) then MinutePumpe = 100 ' Zähler begrenzen if ( minute <> Lastminute ) then MinutePumpe = MinutePumpe + 1 if ( Wasserstand_unten < 250 ) then goto EndePumpe ' Wasserstand zu tief if ( MinutePumpe = 1) then pumpe = off 'erst beim zweiten Durchlauf schalten, falls 1. Störimpuls wait 10 if ( MinutePumpe = 1) then CO2 = off MinutePumpe = 0 ' Zähler Rücksetzen #EndePumpe if ( Wasserstand_oben < 250 ) then pumpe = on ' Wasserstand zu hoch if ( MinutePumpe = 5 ) then Pumpe = on 'nur ein Mal in der Minute Relais schalten ---------------- if (minute = LastMinute) then goto endRelaisschalten lastminute = minute if (TempAuswert <= TempMin) then Heizung = on if (TempAuswert >= TempMax) then Heizung = off if (LichtProz>=1) and (Lichtproz<=99) then goto phSprung if (pHAuswert >= pHMax) and ( Pumpe = on) then CO2 = on if (pHAuswert <= pHMin) or ( Pumpe = off) then CO2 = off #phSprung goto endRelaisschalten 'überspringe Putzschaltung #StatusPutzen 'Putz - Relais schalten licht = on : licht2 = off : evg = 0 : UV = off Heizung = off : CO2 = off : Pumpe = off #endRelaisschalten 'RxD auf auf Übertragungssignal testen if RXD then gosub TEST_RxD goto MAINLOOP '***** Reaktion auf RxD-Signal ***** #TEST_RxD get command if command = 65 then goto test_RxD 'Dummy if command = 84 then put 87 'wird vom PC geprüft if command = 1 then gosub ReadLogger if Command = 3 then gosub ReadCurrentValues 'aktuelle Meßwerte und Zeit if Command = 4 then gosub ReadConfigData if Command = 5 then gosub GetAndSaveConfigData if Command = 7 then gosub AnzeigeRelaisStatus if command = 6 then goto reset if command = 8 then goto Aus if command = 9 then goto TestRelais if command = 11 then Putzen = on if command = 12 then Putzen = off return ' Unterprogramme ------------------------------------------ #ReadConfigData 'Konfigurationn aus EEPROM lesen und an PC senden (4) open# for read #NextRead input# Value if Value = 254 then goto Ready 'Endbyte für Konfigurationsdaten put Value 'an serielle Schnittstelle übertragen, Endbyte "Z" wird nicht gesendet goto NextRead #Ready close# return #ReadCurrentValues 'Aktuelle Messwerte an PC senden (2). 254 und 255 sind Datensatz-Endbytes put TempAuswert put pHAuswert put LeitAuswert put Lichtproz put year put month put day put hour put minute return #WriteToLogger open# for append 'Loggerdaten an Konfigurationsdaten (Endbyte=254) bzw. an zuletzt geloggte Daten (Endbyte=255) anhängen 'if not filefree then goto OverFlow if TempAuswert > 253 then TempAuswert = 253 'Werte müssen < 254 sein, weil 254 und 255 Endbytes sind print# TempAuswert if pHAuswert > 253 then pHAuswert = 253 print# pHAuswert if LeitAuswert > 253 then LeitAuswert = 253 print# LeitAuswert print# year print# month print# day print# hour if (Licht = on) then print# 1 else print# 0 if (Licht2 = on) then print# 1 else print# 0 if (CO2 = on) then print# 1 else print# 0 if (Heizung = on) then print# 1 else print# 0 print# 255 'Endbyte für jeden Logger-Datenstz = 255 '#OverFlow close# return #ReadLogger gosub ReadCurrentValues gosub AnzeigeRelaisStatus open# for read #Loop 'jetzt alle Konfigurationsdaten (Endbyte=254) und Loggerdaten (Datensatz-Endbyte=255) lesen pause(1) input# Value pause(1) put Value 'an serielle Schnittstelle einschließlich der Datensatz-Endbytes (254 bzw. 255) ausgeben if not eof then goto Loop close# put 255 gosub SaveConfigData return #GetAndSaveConfigData 'Daten von PC empfangen und ins EEPROM schreiben (8) get TempMin get TempMax get pHMin get pHMax get LeitMin get LeitMax get hMin_1 get hMax_1 get hMin_2 get hMax_2 get year get month get day get hour get minute get Lichtproz gosub SaveConfigData 'Daten ins EEPROM schreiben put 255 put 255 return #SaveConfigData open# for write 'Konfigurationswerte ins EEPROM schreiben. Sie dürfen nicht > 253 sein, weil 254 und 255 Endbytes sind. if TempMin > 253 Then TempMin = 253 print# TempMin if TempMax > 253 Then TempMax = 253 print# TempMax if pHMin > 253 Then pHMin = 253 print# pHMin if pHMax > 253 Then pHMax = 253 print# pHMax if LeitMin > 253 Then LeitMin = 253 print# LeitMin if LeitMax > 253 Then LeitMax = 253 print# LeitMax print# hMin_1 print# hMax_1 print# hMin_2 print# hMax_2 print# 254 'Endbyte für Konfigurationsdaten = 254 close# return #AnzeigeRelaisStatus if (Heizung =on) then put 191 else put 192 if (UV =on) then put 193 else put 194 if (Licht =on) then put 195 else put 196 if (Licht2 =on) then put 197 else put 198 if (CO2 =on) then put 199 else put 200 if (Pumpe =on) then put 201 else put 202 if (Putzen =on) then put 203 else put 204 put LichtProz return #Lichtan if (lichtproz = 0) then lichtproz = 1 'damit Logger Anschalten richtig anzeigt if (taktHilf <> 0) then goto ExitLicht1 lichtproz = lichtproz + 1 if lichtproz <> 99 then goto ExitLicht1 gosub LCD_INIT #ExitLicht1 return #Lichtaus if (taktHilf <> 0) then goto ExitLicht2 lichtproz = lichtproz - 1 if lichtproz <> 1 then goto ExitLicht2 if hour < 18 then minute = minute - 7 'Zeitkorrektur der C-Control (Minuten am Tag) gosub LCD_INIT #ExitLicht2 return #TestRelais '(5) #TestWeiter get Value if (value = 15) then Heizung = on if (value = 25) then Heizung = off if (value = 35) then UV = on if (value = 45) then UV = off if (value = 55) then Licht = on if (value = 65) then Licht = off if (value = 75) then Licht2 = on if (value = 85) then Licht2 = off if (value = 95) then Pumpe = on if (value = 105) then Pumpe = off if (value = 115) then CO2 = on if (value = 125) then CO2 = off if (value = 155) then Kati = on if (value = 165) then Kati = off if (value = 20) then goto TestEnde goto TestWeiter #TestEnde gosub LCD_INIT return #Alarm beep 475,5,1 beep 425,5,1 beep 0,0,0 return '***** PROGRAMM BEENDEN ***** #Aus END 'Programmende







Zitieren
Lesezeichen