Guten Abend, Ich habe für mein Jugend Forscht Projekt eine Steuerung entwickelt und gebaut. Sie besteht aus 3 Tastern(Hoch, Runter, Enter) mit denen man durch ein Menü sich bewegt und dort Soll Werte verändern kann. Die solle Werte werden mit den zugehörigen Sensorwerten verglichen und je nachdem ob der Wert über bzw. unterschritten wurde, werden Relais geschaltet. Zusätzlich wird über einen Timer eine Pumpe geregelt, über einen Counter eine Ausleseelektronik erfasst, und eine Spule geschaltet. Nun zu meinem Problem. Wenn ich das Display nicht vor jedem neuen beschreibung neu initalisieren würde, würden irgendwelche Asiatische Zeichen auf Display erscheinen(vlt. weil es aus China kommt, ka;-)). Wie kann es dazu kommen? Zuerst tippte ich auf einen Interrupt, der die Datenübertragung unterbricht. Interrupt disable und enable vorher und nach dem beschreiben brachte aber keine Besserung. Unten findet ihr meinen Quellcode, ich weiß er ist 360 Zeilen lang, aber ich hoffe dass er ganz gut kommentiert ist. Ich bin offen für jede Kritik, was Struktur und Time Management angeht, sowie die Art und Weise, wie das Menü realisiert wurde.Gebt einfach euren Senf dazu ab. Auf Wunsch kann ich auch noch den Schaltplan hochladen. $regfile = "m32def.dat" $crystal = 8000000 $baud = 19200 'IO Konfiguration Ddrd.4 = 1 Ddrd.5 = 1 Ddrd.6 = 1 Ddrd.7 = 1 'Pwm Ddrb.1 = 1 Ddrb.3 = 1 'Alias Relaisalkoholpumpe Alias Portd.4 Relaiskuehlung Alias Portd.5 Relaisalkoholheizung Alias Portd.6 Relaiskammerheizung Alias Portb.3 Relaishelmholtz Alias Portb.1 'Pullups für die Eingänge Portd.2 = 1 Portd.3 = 1 Portb.2 = 1 'Taster Config Int0 = Falling Config Int1 = Falling Config Int2 = Falling 'Sprünge für Interrupts On Int0 Taster_enter On Int1 Taster_hoch On Int2 Taster_runter Enable Int0 'Tasterinterrupts aktivieren Enable Int1 Enable Int2 'Variablen 'Menü Dim Menue As Byte , Change As Bit 'Temperatursollwerte Dim Sollkuehlung As Integer , Sollalkohol As Integer , Sollkammer As Integer , Adcwert As Word Dim Localtemp As Integer 'Momentanen Temperaturwerte Dim Tempkuehlung As Integer , Tempalkohol As Integer , Tempkammer As Integer , I As Byte 'Helmholtzspule Dim Helmholtzschalter As Bit 'Pumpe Alkohol Dim Pumpentimer As Byte , Alkoholanzeit As Byte , Alkoholhelp As Byte , Uhrhelp As Byte 'Szintillationszähler Dim Szintischalter As Bit , Uhr As Word 'Programmdefinitionen 'LC-Display Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5 , E = Portc.6 , Rs = Portc.7 Config Lcd = 16 * 2 'Temperatursensor Config Adc = Single , Prescaler = Auto , Reference = Avcc Start Adc 'Menü+Uhr+Pumpe Config Timer1 = Timer , Prescale = 256 Enable Timer1 On Timer1 Uhr Start Timer1 'Szint. Detektor Config Timer0 = Counter , Edge = Rising Enable Timer0 On Timer0 Szintillationscounter Start Timer0 'Prozeduren und Funktionen Declare Sub Init Declare Sub Menue_show Declare Function Check(byval Channel As Byte) As Byte Declare Sub Steuerung_kuehlung Declare Sub Steuerung_alkohol Declare Sub Steuerung_kammer Declare Sub Runter Declare Sub Hoch Declare Sub Enter Declare Sub Serial0charmatch Declare Sub Serial0_logger Declare Sub Steuerung_pumpe '#########################Hauptschleife################################# #############' Main: Call Init 'Initalisierung aufrufen Enable Interrupts '''''''''''''''''''''''Auslesen des Temperatursensors und umrechnen in Celsius in einer Endlos Schleife''''''''' Do Adcwert = Getadc(i) 'ADC Wert besorgen Localtemp = Adcwert - 460 ' 460 = Analogwert bei 0 Grad und 1 kOhm Vorwiderst Localtemp = Localtemp / 2 ' pro Grad 2 AD-Schritte Select Case I Case 0 : Tempkuehlung = Localtemp Case 1 : Tempalkohol = Localtemp Case 2 : Tempkammer = Localtemp End Select Incr I If I = 2 Then I = 0 Loop End '''''''''''''''''''''''''''''''''''''''''''''Timer'''''''''''''''''''''' ''''''''''''''' Szintillationscounter: Timer0 = 0 Return 'dies ist die Hauptsteuerung Uhr: Timer1 = 49910 Incr Uhrhelp If Uhrhelp = 2 Then Incr Pumpentimer Uhrhelp = 0 End If Call Steuerung_kuehlung 'Steueraufgaben Call Steuerung_alkohol Call Steuerung_kammer Call Steuerung_pumpe Initlcd Cursor Off Noblink Call Menue_show Return Sub Steuerung_pumpe Alkoholhelp = Alkoholanzeit + 10 If Pumpentimer = Alkoholanzeit Then 'An-Periode erreicht, Pumpe aus Relaisalkoholpumpe = 0 End If If Pumpentimer = Alkoholhelp Then 'Wartezeit(10 sec) vorbei, Pumpe an Relaisalkoholpumpe = 1 Pumpentimer = 0 End If End Sub '''''''''''''''''''''''''''''''''''''''''Initalisierung''''''''''''''''' '''''''''''''''''''''''' Sub Init 'hier werden die Startwerte geladen Local Test As Byte Timer1 = 49910 'Timer1 startet mit 49910(Halbe Sekunde)62410, damit im 100stel Sekundentakt gezählt wird Timer0 = 0 'Szintillationscounter zählt von 0 Pumpentimer = 0 'Pumpe zählt von 0 Uhrhelp = 0 Szintischalter = 1 'Szintillationscounter ist an Helmholtzschalter = 0 Menue = 1 'der erste Reiter des Menüs ist ausgewählt Change = 0 'das Anzeigemenü wird dargestellt I = 0 'die For Variable für Main Readeeprom Sollkuehlung , 0 'die Einstellungen werden aus dem Internen EEprom geladen Readeeprom Sollalkohol , 2 Readeeprom Sollkammer , 4 Readeeprom Alkoholanzeit , 6 Cls Cursor Off Noblink Locate 1 , 1 'check ob die Temperatur im grünen Bereich oder ob ein Fehler vorliegt For I = 0 To 2 Adcwert = Getadc(i) 'ADC Wert besorgen Localtemp = Adcwert - 460 ' 460 = Analogwert bei 0 Grad und 1 kOhm Vorwiderst Localtemp = Localtemp / 2 ' pro Grad 2 AD-Schritte Select Case I Case 0 : Tempkuehlung = Localtemp Case 1 : Tempalkohol = Localtemp Case 2 : Tempkammer = Localtemp End Select Next I = 0 If Check(0) = 1 Then 'bloß ein kleiner Test, ob die Temperaturwerte im Rahmen liegen If Check(1) = 1 Then If Check(2) = 1 Then Lcd "Check OK" Test = 1 Else Test = 0 End If Else Test = 0 End If Else Test = 0 End If If Test = 0 Then Lcd "Check failed" Wait 1 End Sub Function Check(byval Channel As Byte) As Byte 'wird bloß beim Start aufgerufen Select Case Channel Case 0 : Localtemp = Tempkuehlung Case 1 : Localtemp = Tempalkohol Case 2 : Localtemp = Tempkammer End Select If Tempkuehlung > -80 Then If Tempkuehlung < 80 Then Check = 1 Else Check = 0 End If Else Check = 0 End If End Function ''''''''''''''''''''''''''''Hier wird das Menü verwaltet und dargestellt''''''''''''''' Sub Menue_show Locate 1 , 1 If Change = 0 Then 'das Anzeigemenü wird dargestellt Select Case Menue Case 1 : Lcd "1:Temp Kuehlung:" Locate 2 , 1 Lcd Str(tempkuehlung) ; " C(" ; Str(sollkuehlung) ; " C) " Case 2 : Lcd "2:Temp Alkohol: " Locate 2 , 1 Lcd Str(tempalkohol) + " C(" + Str(sollalkohol) + " C) " Case 3 : Lcd "3:Temp Kammer: " Locate 2 , 1 Lcd Str(tempkammer) + " C(" + Str(sollkammer) + " C) " Case 4 : Lcd "4:Szint. Zaehler" Locate 2 , 1 Lcd Str(timer0) ; " " Case 5 : Lcd "5:Alkoh. Zeit an" Locate 2 , 1 Lcd Str(alkoholanzeit) ; " " Case 6 : Lcd "6:Helmholtz: " Locate 2 , 1 If Helmholtzschalter = 0 Then Lcd "aus " Else Lcd "an " Case Else : Menue = 1 'wieder zurück zu Reiter 1 End Select Else Select Case Menue Case 1 : Lcd "Soll Kuehlung: " Locate 2 , 1 Lcd "(" + Str(sollkuehlung) ; " C) " Case 2 : Lcd "Soll Alkohol: " Locate 2 , 1 Lcd "(" + Str(sollalkohol) ; " C) " Case 3 : Lcd "Soll Kammer: " Locate 2 , 1 Lcd "(" + Str(sollkammer) ; " C) " Case 4 : Lcd "Szinti an? " Locate 2 , 1 If Szintischalter = 0 Then Lcd "aus " Else Lcd "an " Case 5 : Lcd "Soll Pumpe " Locate 2 , 1 Lcd Str(alkoholanzeit) ; " " Case 6 : Lcd "Helmholtz an? " Locate 2 , 1 If Helmholtzschalter = 0 Then Lcd "aus " Else Lcd "an " End Select End If End Sub ''''''''''''''''''''''''''Steuerungen der Heizungen bzw. Kühlungen''''''''''''''''''''' Sub Steuerung_kuehlung If Tempkuehlung > Sollkuehlung Then 'wenn wärmer als Sollwert Relaiskuehlung = 1 'dann die Kühlung einschalten Else Relaiskuehlung = 0 'wenn wärmer, dann einschalten End If End Sub Sub Steuerung_alkohol If Tempalkohol < Sollalkohol Then 's.u. Relaisalkoholheizung = 1 Else Relaisalkoholheizung = 0 End If End Sub Sub Steuerung_kammer 'wenn kälter als Sollwert, If Tempkammer < Sollkammer Then Relaiskammerheizung = 1 'dann die Heizung der Kammer anschalten Else Relaiskammerheizung = 0 'wenn wärmer,dann ausschalten End If End Sub ''''''''''''''''''''''''''''''''''''''''''TASTER'''''''''''''''''''''''' ''''''''''''''' 'Taster Enter + Entprellen Taster_enter: Debounce Pind.2 , 0 , Enter , Sub Return Sub Enter Change = Not Change End Sub 'Taster Hoch + Entprellen Taster_hoch: Debounce Pind.3 , 0 , Hoch , Sub Return Sub Hoch If Change = 1 Then Select Case Menue Case 1 : Incr Sollkuehlung Writeeeprom Sollkuehlung , 0 Case 2 : Incr Sollalkohol Writeeeprom Sollalkohol , 2 Case 3 : Incr Sollkammer Writeeeprom Sollkammer , 4 Case 4 : If Szintischalter = 0 Then Szintischalter = 1 Start Timer0 Else Szintischalter = 0 Stop Timer0 End If Case 5 : Incr Alkoholanzeit Writeeeprom Alkoholanzeit , 6 Case 6 : If Helmholtzschalter = 0 Then Helmholtzschalter = 1 Else Helmholtzschalter = 0 End If Toggle Relaishelmholtz End Select Else Incr Menue End If End Sub 'Taster Runter + Entprellen Taster_runter: Debounce Pinb.2 , 0 , Runter , Sub Return Sub Runter If Change = 1 Then Select Case Menue Case 1 : Decr Sollkuehlung Writeeeprom Sollkuehlung , 0 Case 2 : Decr Sollalkohol Writeeeprom Sollalkohol , 2 Case 3 : Decr Sollkammer Writeeeprom Sollkammer , 4 Case 4 : If Szintischalter = 0 Then Szintischalter = 1 Start Timer0 Else Szintischalter = 0 Stop Timer0 End If Case 5 : Decr Alkoholanzeit Writeeeprom Alkoholanzeit , 6 Case 6 : If Helmholtzschalter = 0 Then Helmholtzschalter = 1 Else Helmholtzschalter = 0 End If Toggle Relaishelmholtz End Select Else Decr Menue End If End Sub
Irgendwie fehlt ein Config Lcdbus = 4, aber dann käme nix raus :-) Der Rest sieht richtig aus, CLS ist dabei ich würde aber immer 32 Zeichen pro LCD-Aufruf ausgeben, um den Rest dahinter gerantiert zu überschreiben.
Bascom ist Standardmäßig auf LCDBus=4 eingestellt... zur Sicherheit machs ich trotzdem rein. Das mit den 32 Zeichen meinst du dass jetzt für jede Reihe, also insgesammt 64, oder eher das ich die ganzen Leerstellen auch mit übertrage(das tue ich schon)
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.