Problem mit Timer Compare Interrupt

OP #2808501
Lesenswert?

Hallo,

ich habe ein Problem mit dem Timer Interrupt (Output Compare Modus).
Die Interrupt-Routine wird nicht ausgeführt.
Was mache ich falsch?
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3

4

5
#define F_CPU 8000000          // T system clock = 1 / 8MHz = 0,125us
6

7

8
int main(void)
9
{
10
  //DDRD |= (1<<PD3);          // PD3 (OC0A) = Ausgang
11
  DDRB |= (1<<PB2);          // PB2 = Ausgang
12

13

14
  TCCR0A |= (1<<COM0A1);        // clear OC0A on compare match
15
  TCCR0A |= (1<<WGM01)|(1<<WGM00);  // Fast PWM (mode 3)
16

17
  TCCR0B |= (1<<CS00);        // Kein Vorteiler 
18

19
  OCR0A = 100;            // alle 12,5 us ein interrupt          
20

21
  TIMSK0 |= (1<<OCIE0A);        // compare match interrupt
22

23
  sei();                // Interrupts enable
24

25
  while(1)
26
  {
27
    asm ("NOP");
28
  }
29
  return 0;
30
}
31

32
ISR(TIM0_COMPA_vect)
33
{
34
  PORTB ^= (1 << PB2);  // Portpin toggeln
35
}
OP #2809034
Lesenswert?

Ich habe die ISR jetzt lt. Datenblatt ausgebessert:
1
ISR (TIMER0_COMPA_vect)

Die Warnung erhalte ich aber noch immer!
warning: 'TIMER0_COMPA_vect' appears to be a misspelled signal handler

Auch habe ich den Code etwas umgeschrieben aber die ISR wird noch immer 
nicht ausgeführt!
Wo ist der Wurm drinnen?
1
//Controller: ATMEL AT90PWM316
2
#include <avr/io.h>
3
#include <avr/interrupt.h>
4

5
#define F_CPU 8000000          // T system clock = 1 / 8MHz = 0,125us
6

7
int main(void)
8
{
9
  DDRB |= (1<<PB2);          // PB2 = Ausgang
10

11
  TCCR0A |= (1<<COM0A1);        // clear OC0A on compare match
12
  TCCR0A |= (1<<WGM01);        // Mode CTC
13

14
  TCCR0B |= (1<<CS01);        // Prescaler = 8 
15

16
  OCR0A = 99;              // alle 100 us ein interrupt          
17

18
  TIMSK0 |= (1<<OCIE0A);        // compare match interrupt
19

20
  sei();                // Interrupts enable
21

22
  while(1)
23
  {
24
    asm ("NOP");
25
  }
26
  return 0;
27
}
28

29
ISR (TIMER0_COMPA_vect)
30
{
31
  PORTB ^= (1 << PB2);
32
}
Gast #2809054
Lesenswert?

In der io90pwm316.h steht drin:
1
/* Timer/Counter0 Compare Match A */
2
#define TIMER0_COMP_A_vect _VECTOR(16)

Nenne deinen ISR-Vektor einfach mal TIMER0_COMP_A_vect

Die Fehlermeldung sagt doch deutlich, dass der Name "TIMER0_COMPA_vect" 
nicht bekannt ist. Also muss man suchen - auf dem eigenen Rechner. 
Dauert keine Minute.

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