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
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.
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
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