Mega8 TIMER0 isr vs. MID()

Gast #2666480
Lesenswert?

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
Gast #2666657
Lesenswert?

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
Gast #2667009
Lesenswert?

... 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.
Gast #2667016
Lesenswert?

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
Gast #2667507
Lesenswert?

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
Gast #2667548
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren