Forum: Mikrocontroller und Digitale Elektronik Mega8 TIMER0 isr vs. MID()


von dani (Gast)


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

von Krapao (Gast)


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

von dani (Gast)


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.

von dani (Gast)


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

von dani (Gast)


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

von Krapao (Gast)


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.

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
Noch kein Account? Hier anmelden.