Timer Interrupt

Gast #2084473
Lesenswert?

Hallo,

ich möchte für einen ATmega32 einen Timer mit Interrupt programmieren. 
Der 8bit Timer0 soll im CTC-Modus arbeiten.
1
#include <avr/io.h>;
2
#include <avr/interrupt.h>
3

4
void init(void) {
5

6
  // LED auf PD1
7
  DDRD |= 0x01;
8
  PORTD |= 0x01;
9

10
  /* CTC aktivieren */
11
  TCCR0 &= ~(1<<WGM00);
12
  TCCR0 |= (1<<WGM01);
13

14
  /* prescaler 1*/
15
  TCCR0 |= (1<<CS00);
16
  TCCR0 &= ~(1<<CS01);
17
  TCCR0 &= ~(1<<CS02);
18

19
  OCR0 = 100;
20
        TIMSK |= (1 << OCIE0);
21

22
  sei();
23
}
24

25
ISR(TIMER0_COMP_vect) {
26
  PORTD &= ~0x01;
27
}
28

29
int main(void) {
30

31
  init();
32
  while(1) {
33
  }  
34

35
}
Da die LED nicht ausgeschaltet wird, gehe ich davon aus, dass die 
Interruptroutine nicht ausgeführt wird. Kann mich vielleicht jemand 
helfen und sagen wo mein Fehler bei der Timerinitialisierung ist? Oder 
was ich sonst falsch gemacht habe?
Vielen Dank schon mal im Voraus!
Mike
#2084759
Lesenswert?

@  Axel Düsendieb (axel_jeromin) Benutzerseite

>> /* CTC aktivieren */
>>   TCCR0 &= ~(1<<WGM00);
>>   TCCR0 |= (1<<WGM01);
>
>   /* prescaler 1*/
>>   TCCR0 |= (1<<CS00);
>>   TCCR0 &= ~(1<<CS01);
>>   TCCR0 &= ~(1<<CS02);

>die ledtzten beiden Zeilen killen alle Veroderungen dadrüber

Nö, die löschen gezielt Bits, auch wenn die nach dem Reset sowieso 
gelösht sind. Siehe Bitmanipulation. Man beachte das "~"

MFG
Falk
Gast #2084852
Lesenswert?

also die LED hängt an PD0 (hab vorhin ausversehen PD1 geschrieben). Das 
ändert aber nichts an der Tatsache, dass der Interrupt nicht 
funktioniert. Zu Testzwecken, ob mein Interrupt ausgelöst wird, wollt 
ich die LED beim ersten Interrupt ausschalten. Sie bleibt aber an. 
Daraus schließe ich, dass bei der Timerinitialisierung irgendwo ein 
Fehler ist.

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