Timer2 beim ATmega8 tut nicht richtig

Gast #211846
Lesenswert?

Hallo Leute,

ich hab' ein Prob mit dem Timer/Counter2 bei meinem ATmega8. Bei der
Simulation im AVR-Studio wird zwar der Interrupt beim Compare-Match
aufgerufen, nicht aber der Overflow-Handler. Ich hab' mal geguckt, was
mit dem TOV2-Bit passiert, wenn es einen Überlauf gibt und siehe da - es
wird auch nicht gesetzt. Woran kann sowas liegen? Auch wenn ich das
Programm auf den µC lade scheint der Interrupt nicht aufgerufen zu
werden.

Hier mal den relevanten Code:
1
.org 0x0000                  ;Kommt ganz an den Anfang des Speichers
2
rjmp RESET                  ;Interruptvektoren überspringen
3
                      ;und zum Hauptprogramm
4
rjmp EXT_INT0                ;IRQ0 Handler
5
reti ;rjmp EXT_INT1              ;IRQ1 Handler
6
rjmp TIM2_COMP                ;Timer2 Compare Handler
7
rjmp TIM2_OVF                ;Timer2 Overflow Handler
8

9

10
;--- weiteres Zeugs ---
11

12

13
RESET:
14

15
;Stackpointer initialisieren
16
ldi temp, LOW(RAMEND)
17
out SPL, temp
18
ldi temp, HIGH(RAMEND)
19
out SPH, temp
20

21
;Interrupt 0 bei steigender Flanke aufrufen
22
ldi temp, 1 << ISC00 ^ 1 << ISC01
23
out MCUCR, temp
24
;Interrupt 0 aktivieren
25
in temp, GIMSK
26
sbr temp, 1 << INT0
27
out GIMSK, temp
28

29
;Timer/Counter2 wird als PWM-Generator für den Motor verwendet
30
(Vorteiler auf 1024)
31
ldi temp, 1 << WGM21 ^ 1 << CS21 ^ 1 << CS22
32
out TCCR2, temp
33

34
;Bei wahrem Vergleich und Überlauf einen Interrupt auslösen
35
ldi temp, 1 << OCIE2 ^ 1 << TOIE2
36
out TIMSK, temp
37

38
;--- weiteres Zeugs ---
39

40
;Interrupts global aktivieren
41
sei
42

43
mainloop:
44
  sbic PINC, PC_KeyPlus
45
  rjmp mainloop_b
46
    cbr State, 1 << ST_Motor_Direction
47
    ldi temp, 100
48
    out OCR2, temp
49

50
  mainloop_b:
51

52
  sbic PINC, PC_KeyMinus
53
  rjmp mainloop_a
54
    sbr State, 1 << ST_Motor_Direction
55
    ldi temp, 100
56
    out OCR2, temp
57

58
  mainloop_a:
59

60
rjmp mainloop                ;Endlosschleife
61

62
;--- weiteres Zeugs ---
63

64
TIM2_COMP:
65
  ;Statusregister sichern
66
  in temp, SREG
67
  push temp
68
  ;Timer2 Compare-Interrupt
69
  ;Motor ausschalten
70
  sbi PORTC, PC_Motor0
71
  sbi PORTC, PC_Motor1
72

73
  pop temp
74
  out SREG, temp
75
reti
76

77
TIM2_OVF:
78
  ;Verwendete Register sichern
79
  push temp
80
  ;Statusregister sichern
81
  in temp, SREG
82
  push temp
83

84
  ;Timer2 Overflow-Interrupt
85
  ;Motor einschalten (Wenn er laufen soll)
86
  in temp, Motor_Speed
87
  breq TIM2_OVF_a
88
    mov temp, state
89
    andi temp, 1 << ST_Motor_Direction
90
    breq TIM2_OVF_b
91
      ;Motor läuft rückwärts
92
      sbi PORTC, PC_Motor0
93
      cbi PORTC, PC_Motor1
94

95
    rjmp TIM2_OVF_a
96

97
    TIM2_OVF_b:
98
      ;Motor läuft vorwärts
99
      cbi PORTC, PC_Motor0
100
      sbi PORTC, PC_Motor1
101

102
  TIM2_OVF_a:
103

104
  pop temp
105
  out SREG, temp
106
  pop temp
107
reti

Wer kann mir helfen?

Danke im Voraus!
Gast #211848
Lesenswert?

Axo, na wenn ich das gewusst hätte... Hab's jetzt gerade auf
Normal-Mode umgestellt und jetzt klappt's freu. Irgendwie hab' ich
das einfach falsch verstanden, was im Datenblatt steht... Naja, jetzt
tut's ja!

Danke dir!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren