Mega8 TIMER0 isr vs. MID()

Gast #2666480
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
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
... 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
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
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
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

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.