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
|