Hallo, bei dem folgenden Programm liefert die MID-Funktion sporadisch einen String länger als 1 Zeichen. Wenn ich TIMER0 deaktiviere funktioniert es einwandfrei. Woran kann das liegen, oder sollte der Timer bei bestimmten Funktionen generell deaktiviert werden? dani $regfile = "m8def.dat" $crystal = 4915000 On Timer0 Pulse_timer_0 Config Timer0 = Timer , Prescale = 1024 Enable Timer0 Enable Interrupts dim x as string*1 dim i as byte dim t as word dim text as string * 100 text="TestText" for i = 1 to 5 x = mid(text,i,1) next i '.................................................... Pulse_timer_0: Timer0 = 208 If T_net_led < 3000 Then Incr T Else t = 99 End If Return
Was macht dein Programm nach dem for: Rennt es in die Routine Pulse_timer_0 oder resettet sich der µC oder macht das Programm "nix" mehr? Um diese Fragen zu umgehen, würde ich ein DO LOOP END um das FOR NEXT klammern:
1 | $regfile = "m8def.dat" |
2 | $crystal = 4915000 |
3 | |
4 | On Timer0 Pulse_timer_0 |
5 | Config Timer0 = Timer , Prescale = 1024 |
6 | Enable Timer0 |
7 | Enable Interrupts |
8 | |
9 | dim x as string*1 |
10 | dim i as byte |
11 | dim t as word |
12 | dim text as string * 100 |
13 | |
14 | text="TestText" |
15 | DO |
16 | FOR i = 1 TO 5 |
17 | x = MID(text,i,1) |
18 | NEXT i |
19 | LOOP |
20 | END |
21 | |
22 | '.................................................... |
23 | Pulse_timer_0: |
24 | Timer0 = 208 |
25 | If T_net_led < 3000 Then ' <== Variable nicht DIMensioniert! |
26 | Incr T ' <== Variable sonstwo nicht benutzt |
27 | Else |
28 | t = 99 |
29 | End If |
30 | Return |
... das Programm funktioniert nur noch teilweise, die Fehlersymptome sind unterschiedlich, vom Neustart bis zum "Aufhängen" ist alles dabei. MIr ist aufgefallen, dass wenn die MID-Funktion einen String größer 1 Zeichen liefert, das alle restlichen verbleibenden Zeichen von "text" sind.
Nachtrag: (die variable y wird woanders im program verwendet, der quellcode hier ist nur der rest der nicht funktioniert, den rest habe ich schon auskommentiert um den fehler einzugrenzen. $regfile = "m8def.dat" $crystal = 4915000 On Timer0 Pulse_timer_0 Config Timer0 = Timer , Prescale = 1024 Enable Timer0 Enable Interrupts dim x as string*1 dim y as byte dim i as byte dim t as word dim text as string * 100 '.................................................... do text="TestText" gosub unterprogram loop end '................................................... unterprogram: FOR i = 1 TO 5 x = MID(text,i,1) print "x ";x 'hier ist x ab und zu länger als 1 zeichen !? NEXT i return '.................................................... Pulse_timer_0: Timer0 = 208 If T < 3000 Then Incr T Else y = 99 End If Return
Hallo, ich bin immer noch nicht weiter, und eine idee woran es liegen könnte hatte leider bisher auch noch niemand. Deshalb allgemein gefragt, ist es bei manchen Befehlen generell sinnvoll die Timer vorher aus- und danach wieder einzuschalten? schonmal vielen dank, dani
Versuche dem Fehler im BASCOM Simulator auf die Spur zu kommen. Achte dabei darauf, wann dir die Längeninfo der Variable x zerschossen wird. Eine Hilfe beim Debuggen kann http://avrhelp.mcselec.com/memory_usage.htm sein. Experimentiere mit $HWCHECK, $FRAMECHECK, $SOFTCHECK und gebe die verschiedenen Stackgrößen $HWSTACK, $FRAMESIZE und $SWSTACK vor bzw. kontrolliere die Vorgaben in der IDE. Wesentlich dürften $HWSTACK, $FRAMESIZE sein.
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.