Forum: Mikrocontroller und Digitale Elektronik Timer2 beim ATmega8 tut nicht richtig


von Philipp Burch (Gast)


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!

von D. W. (dave) Benutzerseite


Lesenswert?

Es geht entweder CTC-Mode oder Overflow.
Dein "Compare Match" heißt ja "Clear Timer On Compare Match".. er
kann also nie überlaufen, da er immer resettet wird.
Deswegen kanns nur den OCR-IRQ geben.

von Philipp Burch (Gast)


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!

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.