Forum: Mikrocontroller und Digitale Elektronik Fehlerhafter Stackpointer - Erklärung des Verhaltens


von GeMark (Gast)


Lesenswert?

hallo,

ich habe eine Frage zu folgendem Fehler der mir gerade passiert ist: Ich 
arbeite das avr tutorial durch und habe das Beispielprogramm zum Timer 0 
overflow Interrupt ausprobiert. (fast) 1 zu 1 abgeschrieben. Dieses fast 
was das Problem, denn ich habe 2 mal SPH beschrieben.
Ich sehe ein, daß der Stackpointer dadurch so beschrieben ist, daß in 
SPH folgendes LOW(RAMEND), also vermutlich 0 steht.

Beim Simulieren fiel mir aber auf, daß zunächst der Timer ordnungsgemäß 
zählt und irgendwann der overflow passiert. Dann funktioniert das 
Programm nicht mehr weil ja kein Stack da ist, aber das TCNT0 zählt auch 
nicht mehr weiter sondern immer nur bis 8. Also dauerhafter Einsprung in 
die isr und der Counter bricht bei 8 um. Ich hätte erwartet, daß der 
counter völlig unabhängig davon, ob das Programm Amok läuft hochzählt, 
oder ist es so, daß der dauernde Einsprung in den Interrupt auch den 
counter zurücksetzt? Also sozusagen Ursache und Wirkung vertauscht 
werden?

noch mal das Programm. Hat ja nicht jeder im Kopf ;-)
1
.include "m16def.inc"
2
3
.def tmp   =   r16
4
.def leds  =   r17
5
6
.org 0x0000    rjmp main
7
.org OVF0addr  rjmp timer_isr
8
9
main:
10
    ldi tmp, HIGH(RAMEND)
11
    out SPH, tmp
12
    ldi tmp, LOW(RAMEND)
13
    out SPL, tmp ;hier hatte ich ebenfalls SPH stehen out SPH, tmp
14
    ldi tmp, 0xff
15
    out DDRB,tmp
16
    mov leds,tmp
17
18
    ldi tmp, (1<<CS00)
19
    out TCCR0, tmp
20
    ldi tmp, (1<<TOIE0)
21
    out TIMSK, tmp
22
23
    sei
24
25
loop:  rjmp loop
26
27
timer_isr:
28
    out PORTB, leds
29
    com leds
30
    reti

von (prx) A. K. (prx)


Lesenswert?

GeMark schrieb:

> Ich sehe ein, daß der Stackpointer dadurch so beschrieben ist, daß in
> SPH folgendes LOW(RAMEND), also vermutlich 0 steht.

Mega16: RAMEND = 0x045F. SP(init) = 0x0000.
Bei dir galt also SP = 0x5F00 => da ist nix.

Der ISR wird dann brav jedesmal aufgerufen, nur der korrekte Rückweg ist 
aufgrund des fehlerhaften Stacks versperrt, landet irgendwo im Wald.

> oder ist es so, daß der dauernde Einsprung in den Interrupt auch den
> counter zurücksetzt?

Bei AVRs werden die meisten Interrupt-Flags mit dem Aufruf der ISR 
automatisch zurückgesetzt.

von GeMark (Gast)


Lesenswert?

Was mich wundert ist, daß auch der Zählerstand nciht mehr höher zählt.

von Mark L. (Firma: TH Köln) (m2k10) Benutzerseite


Lesenswert?

GeMark schrieb:
> Was mich wundert ist, daß auch der Zählerstand nciht mehr höher zählt.

Sieht nur im Simulator so aus. Der fehlerhafte Stackpointer führt den PC 
irgendwo in die Pampa, der Simulator zeigt das aber nicht an(bzw. nur 
der Cycle-Counter 'springt'). Wenn du dir die Simulation mal im 
Disassembler ansiehst, siehst du, was der ATmega in jedem Schritt macht, 
auch wenn er irgendwo außerhalb des Programmcodes ist.

Mark

von spess53 (Gast)


Lesenswert?

Hi

>Was mich wundert ist, daß auch der Zählerstand nciht mehr höher zählt.

Das ist ein Simulator. Wenn du dir die 'Known Issues' in der Hilfe dazu 
ansiehst, wirst du feststellen, das das Verhalten nicht 100%-ig der 
Realität entspricht. Und in deinem Fall würde ich das auch nicht für 
blanke Münze nehmen. Dazu müsste man das mit einem ICE am realen 
Controller testen.

MfG Spess

von GeMark (Gast)


Lesenswert?

Aha. Leuchtet irgendwie ein. Danke

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.