Hallo Ich habe in Bascom folgende kleine Software geschrieben siehe Anhang Sie läuft einwandfrei für ca. 2-5 Minuten, selbst die Bedienung per PC läuft in dieser zeit anstandslos, aber leider kommt es dann dazu, das sich der µC auf hängt und auf dem LCD nur noch müll steht, ich bin jetzt schon seid gestern am suchen... aber habe keine Idee mehr. Vielleicht möchte sich ja mal einer von euch erbarmen und einmal drüber schauen mfg Markus Anhang: $regfile = "m88pdef.dat" $crystal = 20000000 $hwstack = 80 $swstack = 60 $framesize = 40 $baud = 19200 Enable Interrupts '' RS232 Krams Dim Akey As Byte Dim Inputstring As String * 32 Dim Korr As Single Dim Lm As Word Dim Volt As Single Dim Temp As Single Dim Ceversion As String * 8 Ceversion = "0.2" Config Pind.2 = Input Config Pind.3 = Input Config Pind.4 = Input Config Pinb.0 = Input Config Pind.5 = Output Config Pinb.2 = Output Config Pinb.1 = Output Config Portd.6 = Output Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5 'Display Parameter Config Lcd = 20 * 4 'config LCD Cursor Off Config Timer2 = Pwm , Compare A Pwm = Clear Up , Prescale = 1 Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 1 Config Timer0 = Pwm , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 8 Config Watchdog = 2048 'Timeout = 2 Sekunden Start Watchdog Do 'Command to station Print #1 , "*"; Waitms 10 'Read 7 pieces of data terminated by CR For I = 1 To 7 : Input #2 , S(i) : Next I ..... Reset Watchdog Tup Alias Pind.3 Config Tup = Input Tup = 1 Tdown Alias Pind.4 Config Tdown = Input Tdown = 1 Tesc Alias Pinb.0 Config Tesc = Input Tesc = 1 Tenter Alias Pind.2 Config Tenter = Input Tenter = 1 Waitms 20 Config Adc = Single , Prescaler = Auto , Reference = Avcc Start Adc Dim Softtimer As Long Softtimer = 0 Dim Softtimer2 As Long Softtimer2 = 0 Dim Softtimer3 As Long Softtimer3 = 0 Dim Softtimer4 As Long Softtimer4 = 0 Dim Softtimer5 As Long Softtimer5 = 0 Dim Softtimer6 As Long Softtimer6 = 0 Dim Softtimer7 As Long Softtimer7 = 0 Dim Displaytimer As Long Displaytimer = 100000 Dim Command_a As String * 1 Dim Command_b As String * 3 Dim Pwmtmp As Byte Dim Tmp As Long Dim Tmp2 As Integer Dim Tmp3 As Byte Dim Ee_ersterstart As Eram Byte Dim Ee_kuehlung As Eram Byte Dim Ee_heizung As Eram Byte Dim Ee_luefter As Eram Byte Dim Ee_kontrast As Eram Byte Dim Ee_ledback As Eram Byte Tmp3 = Ee_ersterstart If Tmp3 > 100 Then Ee_kontrast = 150 Ee_ledback = 100 Ee_kuehlung = 0 Ee_heizung = 0 Ee_luefter = 0 Ee_ersterstart = 0 End If Tmp3 = Ee_kontrast Pwm0b = Tmp3 'Kontrast PWM auf 150 (max.255 / min 0 ) Tmp3 = Ee_ledback Pwm1b = Tmp3 'LED Hintergrundbeleuchtung 0 - 100 Tmp3 = Ee_kuehlung Pwm1a = Tmp3 'Peltier PWM 0-255 Tmp3 = Ee_heizung Pwm0a = Tmp3 'Heizung PWM 0-255 Tmp3 = Ee_luefter Pwm2a = Tmp3 ' Lüfter PWM 0-255 Dim Lastval_kuehlung As Byte Dim Lastval_heizung As Byte Dim Lastval_luefter As Byte Dim Lastval_kontrast As Byte Dim Lastval_ledback As Byte Lastval_kontrast = Ee_kontrast Lastval_kuehlung = Ee_kuehlung Lastval_ledback = Ee_ledback Lastval_heizung = Ee_heizung Lastval_luefter = Ee_luefter ' Programm-State steuert den allgemeinen Programmzustand ' Dabei ist State 1 für die Anzeige vorgesehen während ' State 2 für eine zu erwartende Eingabe ist Dim State As Byte State = 1 Dim Aktivevalue As Byte Aktivevalue = 0 ' Displaystate steuert die aktuelle Bildschirmanzeige Dim Displaystate As Byte Displaystate = 1 Dim Displaysaved As Bit Displaysaved = 0 Cls Locate 1 , 1 Lcd " Cooled EOS " Locate 2 , 1 Lcd " Manager " Locate 3 , 1 Lcd " " Locate 4 , 1 Lcd " www.themilkyway.de " Waitms 1500 Cls Locate 1 , 1 Lcd " Hallo Markus " Locate 2 , 1 Lcd " Clear Sky :) " Locate 4 , 1 Lcd " www.themilkyway.de " Waitms 2500 Cls ' Endlosschleife Start Do ' FTDI Kommunikation. mit jedem Prozessortick wird ' geschaut, ob ein CHAR im Eingang der RS232 Schnittstelle ' wartet. Solange es nicht 13 (ENTER) ist, wird das empfangene ' Char an Inputstring angehangen. Kommt irgendwann 13 (ENTER), ' so wird die Eingabe geparsed. Akey = Inkey() If Akey <> 0 Then ' ENTER empfangen If Akey = 13 Then ' Überschüssige Zeichen (Leerzeichen, ...) abfangen Inputstring = Ltrim(inputstring) Inputstring = Rtrim(inputstring) ' Hi - Handshake If Inputstring = "hi" Then Print "TMWCEM1" Cls Softtimer2 = 0 Displaystate = 3 Displaytimer = 1000001 Print "Z" ; Lastval_kuehlung ; ";" ; Lastval_heizung ; ";" ; Lastval_luefter ; ";" ; Lastval_kontrast ; ";" ; Lastval_ledback Elseif Inputstring = "sv" Then Ee_kuehlung = Lastval_kuehlung Ee_heizung = Lastval_heizung Ee_luefter = Lastval_luefter Ee_kontrast = Lastval_kontrast Ee_ledback = Lastval_ledback ' Sonderbefehl 'dimm' dimmt das Display Elseif Inputstring = "di" Then Softtimer4 = 1 ' Sonderbefehl 'show' blendet das Display ein Elseif Inputstring = "sh" Then Softtimer5 = 1 ' Sonderbefehl "Version" gibt die Version (Ceversion) zurück. Elseif Inputstring = "ve" Then Print "V" ; Ceversion Elseif Inputstring = "gT" Then Lm = Getadc(07) Volt = Lm * 40 ' 5 ist die Spannung des uControllers Volt = Volt / 8192 ' Umrechnung des ADV Ports in Volt Korr = 0 Temp = Volt - 3.75 ' Volt Umrechnung in Temperatur Temp = Temp / 0.01 Temp = Temp + 100 Temp = Temp + Korr Tmp2 = Temp Print "T" ; Tmp2 Else ' Erster Buchstabe des Empfangenen ist der Befehl Command_a = Left(inputstring , 1) ' Folgender Teil des Empfangenen ist ein Parameter / eine Value Command_b = Mid(inputstring , 2 , 3) Command_b = Ltrim(command_b) Command_b = Rtrim(command_b) ' Bei Befehl K (Kühlung) diese auf VALUE setzen If Command_a = "K" Then Pwmtmp = Val(command_b) Lastval_kuehlung = Pwmtmp Pwm1a = Pwmtmp ' Bei Befehl H (Heizung) diese auf VALUE setzen Elseif Command_a = "H" Then Pwmtmp = Val(command_b) Lastval_heizung = Pwmtmp Pwm0a = Pwmtmp ' Bei Befehl L (Lüftung) diese auf VALUE setzen Elseif Command_a = "L" Then Pwmtmp = Val(command_b) Lastval_luefter = Pwmtmp Pwm2a = Pwmtmp ' Bei Befehl O (Kontrast) diese auf VALUE setzen Elseif Command_a = "O" Then Pwmtmp = Val(command_b) Lastval_kontrast = Pwmtmp Pwm0b = Pwmtmp ' Bei Befehl B (LED Backlight) diese auf VALUE setzen Elseif Command_a = "B" Then Pwmtmp = Val(command_b) Lastval_ledback = Pwmtmp Pwm1b = Pwmtmp ' Update - Alles Values zurücksenden Elseif Command_a = "U" Then Print "Z" ; Lastval_kuehlung ; ";" ; Lastval_heizung ; ";" ; Lastval_luefter ; ";" ; Lastval_kontrast ; ";" ; Lastval_ledback ' Konnte endgültig kein Befehl erkannt werden, wird ' eine Fehlermeldung zurückgegeben. Else Print "UNKNOWN '" ; Inputstring ; "'" End If End If ' Empfangsvariable wieder leeren Inputstring = "" ' Es wurde KEIN ENTHER empfangen Else ' Empfangenes Zeichen der Empfangsvariable anhängen Inputstring = Inputstring + Chr(akey) End If End If ' Displaytimer regelt vernünftige Displayausgaben If Displaytimer > 100000 Then ' Diese Displayausgabe nur im State 1 If State = 1 Then ' Ausgabe Kühlung bei Displaystate 1 If Displaystate = 1 Then Tmp = Lastval_kuehlung * 100 Tmp = Tmp / 255 Locate 1 , 1 Lcd "Kuehlung:"; Locate 2 , 1 Lcd " " ; Tmp ; " % " ' Ausgabe Heizung bei Displaystate 1 Tmp = Lastval_heizung * 100 Tmp = Tmp / 255 Locate 1 , 10 Lcd " Heizung:"; Locate 2 , 10 Lcd " " ; Tmp ; " % " ' Ausgabe Lüftung bei Displaystate 1 Tmp = Lastval_luefter * 100 Tmp = Tmp / 255 Locate 3 , 1 Lcd "Lueftung:"; Locate 4 , 1 Lcd " " ; Tmp ; " % " ' Ausgabe Temp bei Displaystate 1 Lm = Getadc(07) Volt = Lm * 40 ' 5 ist die Spannung des uControllers Volt = Volt / 8192 ' Umrechnung des ADV Ports in Volt Korr = 0 Temp = Volt - 3.75 ' Volt Umrechnung in Temperatur Temp = Temp / 0.01 Temp = Temp + 100 Temp = Temp + Korr Tmp2 = Temp Locate 3 , 10 Lcd " Temp:" Locate 4 , 10 Lcd " " ; Tmp2 ; " C " ' Ausgabe Werbung bei Displaystate 2 ' und zurücksetzen auf erstes Displaystate Elseif Displaystate = 2 Then Locate 1 , 1 Lcd " Coolead EOS " Locate 2 , 1 Lcd " Manager " Locate 3 , 1 Lcd " " Locate 4 , 1 Lcd " www.themilkyway.de " ' Ausgabe Verbindungsinfo Elseif Displaystate = 3 Then Locate 2 , 1 Lcd " Mit Computer " Locate 3 , 1 Lcd " verbunden.. " End If Elseif State = 2 Then Locate 1 , 1 Lcd "Einstellen: " If Aktivevalue = 1 Then Tmp = Lastval_kuehlung * 100 Tmp = Tmp / 255 Locate 2 , 1 Lcd "Kuehlung - " ; Tmp ; " % " Elseif Aktivevalue = 2 Then Tmp = Lastval_heizung * 100 Tmp = Tmp / 255 Locate 2 , 1 Lcd "Heizung - " ; Tmp ; " % " Elseif Aktivevalue = 3 Then Tmp = Lastval_luefter * 100 Tmp = Tmp / 255 Locate 2 , 1 Lcd "Lueftung - " ; Tmp ; " % " Elseif Aktivevalue = 4 Then Tmp = Lastval_kontrast * 100 Tmp = Tmp / 255 Locate 2 , 1 Lcd "Kontrast - " ; Tmp ; " % " Elseif Aktivevalue = 5 Then Tmp = Lastval_ledback Locate 2 , 1 Lcd "LED-Backlight " Locate 3 , 1 Lcd " " ; Tmp ; " % " Elseif Aktivevalue = 6 And Displaysaved = 0 Then Locate 1 , 17 Lcd " Ja" Locate 3 , 1 Lcd "als Standard " Locate 4 , 1 Lcd " speichern? " Locate 4 , 16 Lcd "Nein" Elseif Displaysaved = 1 Then Locate 1 , 17 Lcd " " Locate 2 , 1 Lcd " Erfolgreich " Locate 3 , 1 Lcd " gespeichert! " End If End If Displaytimer = 0 End If ''''''''''''' TODOOO '''''''''''''''''''''''''''''''''''''''''''''''' ' Hier muss auf Eingabe durch die Buttons geprüft werden. ' Sobald ein Button gedrückt wird, wird State 2 aktiv. ' Der Displaystate bleibt bestehen und ändert sich nicht, ' bis Softtimer3, der durch State 2 aktiviert wurde, ' tickt. Bei jeder weiteren Eingabe muss Softtimer3 und Displaytimer ' auf 0 zurückgesetzt werden. Wenn Softtimer 3 tickt, ' wechselt die Anwendung wieder auf State 1 und wechselt ' wieder das Display durch. ' Mögliche implementierung: UP und DOWN ändern Displaystate ' LEFT und RIGHT ändern Value entsprechend ' des Displaystates. ''''''''''''' TODOOO '''''''''''''''''''''''''''''''''''''''''''''''' ' Button-Erkennung... mehr als 100 ticks gedrückt = Aktion If Tup = 0 Or Tdown = 0 Or Tesc = 0 Or Tenter = 0 Then Incr Softtimer6 If Softtimer6 > 5000 Then Softtimer7 = 0 ' Button wurde lange genug gedrückt für eine einzige Aktion '' Wird ESC gedrückt, wird der Einstellungsmodus verlassen '' Rückkehr zu Displaystate 1 und so If Tesc = 0 Then 'Displaystate = 1 State = 1 Aktivevalue = 0 Cls Displaytimer = 100000 Displaysaved = 0 ' Update an den PC senden Print "Z" ; Lastval_kuehlung ; ";" ; Lastval_heizung ; ";" ; Lastval_luefter ; ";" ; Lastval_kontrast ; ";" ; Lastval_ledback End If '' Wird Enter gedrückt, wird der aktive Wert gewechselt If Tenter = 0 Then Incr Aktivevalue If Aktivevalue > 6 Then Aktivevalue = 1 End If State = 2 Cls Displaytimer = 100000 Displaysaved = 0 ' Display auslösen End If If Tup = 0 Or Tdown = 0 Then ' Kühlung If Aktivevalue = 1 Then Pwmtmp = Pwm1a If Tup = 0 Then If Pwmtmp < 255 Then Pwmtmp = Pwmtmp + 5 If Pwmtmp > 255 Then Pwmtmp = 255 End If End If Elseif Tdown = 0 Then If Pwmtmp > 0 Then Pwmtmp = Pwmtmp - 5 If Pwmtmp < 0 Then Pwmtmp = 0 End If End If End If Lastval_kuehlung = Pwmtmp Pwm1a = Pwmtmp Displaytimer = 100000 ' Heizung Elseif Aktivevalue = 2 Then Pwmtmp = Pwm0a If Tup = 0 Then If Pwmtmp < 255 Then Pwmtmp = Pwmtmp + 5 If Pwmtmp > 255 Then Pwmtmp = 255 End If End If Elseif Tdown = 0 Then If Pwmtmp > 0 Then Pwmtmp = Pwmtmp - 5 If Pwmtmp < 0 Then Pwmtmp = 0 End If End If End If Lastval_heizung = Pwmtmp Pwm0a = Pwmtmp Displaytimer = 100000 ' Lüftung Elseif Aktivevalue = 3 Then Pwmtmp = Pwm2a If Tup = 0 Then If Pwmtmp < 255 Then Pwmtmp = Pwmtmp + 5 If Pwmtmp > 255 Then Pwmtmp = 255 End If End If Elseif Tdown = 0 Then If Pwmtmp > 0 Then Pwmtmp = Pwmtmp - 5 If Pwmtmp < 0 Then Pwmtmp = 0 End If End If End If Lastval_luefter = Pwmtmp Pwm2a = Pwmtmp Displaytimer = 100000 ' Kontrast Elseif Aktivevalue = 4 Then Pwmtmp = Pwm0b If Tup = 0 Then If Pwmtmp < 255 Then Pwmtmp = Pwmtmp + 5 If Pwmtmp > 255 Then Pwmtmp = 255 End If End If Elseif Tdown = 0 Then If Pwmtmp > 0 Then Pwmtmp = Pwmtmp - 5 If Pwmtmp < 0 Then Pwmtmp = 0 End If End If End If Lastval_kontrast = Pwmtmp Pwm0b = Pwmtmp Displaytimer = 100000 ' LED Backlight Elseif Aktivevalue = 5 Then ' Max 100 Pwmtmp = Pwm1b If Tup = 0 Then If Pwmtmp < 100 Then Pwmtmp = Pwmtmp + 5 If Pwmtmp > 100 Then Pwmtmp = 100 End If End If Elseif Tdown = 0 Then If Pwmtmp > 0 Then Pwmtmp = Pwmtmp - 5 If Pwmtmp < 0 Then Pwmtmp = 0 End If End If End If Lastval_ledback = Pwmtmp Pwm1b = Pwmtmp Displaytimer = 100000 ' Speichern Elseif Aktivevalue = 6 Then If Tup = 0 Then Ee_kuehlung = Lastval_kuehlung Ee_heizung = Lastval_heizung Ee_luefter = Lastval_luefter Ee_kontrast = Lastval_kontrast Ee_ledback = Lastval_ledback Displaysaved = 1 Displaytimer = 100000 Cls Elseif Tdown = 0 Then 'Displaystate = 1 State = 1 Aktivevalue = 0 Cls Displaytimer = 100000 Displaysaved = 0 Print "Z" ; Lastval_kuehlung ; ";" ; Lastval_heizung ; ";" ; Lastval_luefter ; ";" ; Lastval_kontrast ; ";" ; Lastval_ledback End If Displaytimer = 100000 End If End If '' Wird UP gedrückt, wird ein entsprechender Wert Incrementiert '' Wird Down gedrückt, wir ein entsprechender Wert decrementiert Softtimer6 = 0 End If Else Softtimer6 = 0 End If ' Nach langer Pause Tastendruck wieder zurückstellen If State = 2 Then Incr Softtimer7 If Softtimer7 > 200000 Then State = 1 Aktivevalue = 0 Displaysaved = 0 Cls Displaytimer = 100000 Print "Z" ; Lastval_kuehlung ; ";" ; Lastval_heizung ; ";" ; Lastval_luefter ; ";" ; Lastval_kontrast ; ";" ; Lastval_ledback End If End If ' Softtimer 1 auslösung - Werbung einblenden If Softtimer > 3004000 Then Softtimer = 0 Softtimer2 = 0 Displaystate = 2 Displaytimer = 1000001 End If ' Softtimer2 setzt den Displaystate wieder zurück If Softtimer2 > 200000 Then If Displaystate <> 1 Then Displaystate = 1 Displaytimer = 100001 Cls End If Softtimer2 = 0 End If ' Softtimer3 setzt den STATE nach kurzer Zeit auf 1 zurück If Softtimer3 > 4000000 Then State = 1 Softtimer3 = 0 End If ' Softtimer4 dimmt das Display If Softtimer4 > 100 Then Pwmtmp = Pwm1b If Pwmtmp > 0 Then Decr Pwmtmp Pwm1b = Pwmtmp Softtimer4 = 1 Else Softtimer4 = 0 End If Lastval_ledback = Pwmtmp End If ' Softtimer5 blendet das Display ein If Softtimer5 > 100 Then Pwmtmp = Pwm1b If Pwmtmp < 100 Then Incr Pwmtmp Pwm1b = Pwmtmp Softtimer5 = 1 Else Softtimer5 = 0 End If Lastval_ledback = Pwmtmp End If ' Softtimer 1 und 2 und Displaytimer zählen die ganze Zeit Incr Softtimer Incr Softtimer2 Incr Displaytimer ' Wenn State 2 aktiv ist, zählt der Softtimer hoch If State = 2 Then Incr Softtimer3 End If ' Wenn Softtimer 4 aktiviert wurde, erhöhen If Softtimer4 > 0 Then Incr Softtimer4 End If ' Wenn Softtimer 5 aktiviert wurde, erhöhen If Softtimer5 > 0 Then Incr Softtimer5 End If Loop End
@ Markus B. (Firma: Home) (sukramb) Hast Du im Abschnitt 'Wichtige Regeln - erst lesen, dann posten!' den Teil: 'Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang' nicht gelesen oder ihn nicht verstanden??? Oh man oh man...
kann es sein dass du den Watchdog in der Main Loop nicht mehr resetest? und warum gibt es 2x Do EDIT: Nachdem der Watchdog wohl zurückgesetzt wird vermute ich einen Stack overflow wegen der zwei "Do"
:
Bearbeitet durch User
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.