Forum: Mikrocontroller und Digitale Elektronik Problem mit Timer Compare Interrupt


von H. G. (ledi)


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
}

von Stefan E. (sternst)


Lesenswert?

H. G. schrieb:
> Was mache ich falsch?

Uns eine grundlegende Information vorzuenthalten, nämlich um welchen µC 
es konkret geht.

von H. G. (ledi)


Lesenswert?

Stefan Ernst schrieb:
> H. G. schrieb:
>> Was mache ich falsch?
>
> Uns eine grundlegende Information vorzuenthalten, nämlich um welchen µC
> es konkret geht.

Ach ja...

AT90PWM316

von Peter D. (peda)


Lesenswert?

H. G. schrieb:
> OCR0A = 100;            // alle 12,5 us ein interrupt

Der Kommentar ist falsch, es sind 12,625µs.

101 Zyklen ist schon sportlich. Dein kleiner Interrupt braucht etwa 30 
Zyklen, kostet also schon 30% CPU-Last.


Peter

von Peter D. (peda)


Lesenswert?

H. G. schrieb:
> TCCR0A |= (1<<WGM01)|(1<<WGM00);  // Fast PWM (mode 3)

PWM benutzt doch gerade, um keinen Interrupt zu brauchen.
Die Interrupts verhalten sich oft auch etwas anders.


Peter

von Stefan E. (sternst)


Lesenswert?

H. G. schrieb:
> AT90PWM316

Und wie kommst du dann auf TIM0_COMPA_vect?

PS: Und warum ignorierst du die diesbezügliche Warnung des Compilers?

von H. G. (ledi)


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
}

von H. G. (ledi)


Lesenswert?

H. G. schrieb:

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

Die Warnung ist nun weg. Es war der AT90PWM216 anstatt 90PWM316 
eingestellt!
Aber die ISR wird noch immer nicht ausgeführt!

von HildeK (Gast)


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.

von H. G. (ledi)


Lesenswert?

Toll, das wars!

Wobei der Compiler bei TIMER0_COMPA_vect keine Warnung mehr geschrieben 
hat!

Im Headerfile nachzusehen, daran hab ich gar nicht gedacht! Danke für 
den Tip!

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.