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.