Hallo allerseits! Ich habe eine Frage bzgl des Overflow Interrupts beim Timer/Counter0 des ATMega324A. Ich habe den unten aufgeführten Code. Ich hab diesen zunächst nur mit Hilfe des Datenblatts erstellt. Dieser scheint mir aber korrekt, da in den Threads, die ich hier im Forum gefunden hab, es genauso gemacht wurde. Nun mal zur genauen Problembeschreibung. Ich will Timer0 im "Phase correct PWM mode" betreiben. Gemäß des Datenblatts wird jedes mal wenn der Timer wieder den BOTTOM-Wert erreicht hat das Timer/Counter Overflow Flag gesetzt, wodurch der Interrupt ausgelöst werden kann. In der ISR möchte ich dann den Wert des OCR von Timer2 ändern. Timer2 wird im CTC Mode betrieben. Leider passiert nichts. Die Werte ändern sich nicht und bleiben auf den Initialisierten Werten. Folglich wird der Overflow Interrupt des Timer0 nicht aufgerufen. Komischerweise funktioniert aber der Compare Match Interrupt, wenn ich ihn für Timer0 implementiere (also TIMSK0 = 1<<OCIE0A mit entsprechender ISR). Im AVR-Studio habe ich auch darauf geachtet, dass das richtige Device ausgewählt ist. Ich wäre euch sehr denkbar, wenn Ihr mich auf Fehler hinweisen könntet bzw wisst, woran es liegen könnte.
1 | #ifndef F_CPU
|
2 | #define F_CPU 16000000UL // or whatever may be your frequency
|
3 | #endif
|
4 | |
5 | #include <asf.h> |
6 | #include <avr/io.h> |
7 | #include <avr/interrupt.h> |
8 | #include <stdint.h> |
9 | |
10 | int main (void) { |
11 | |
12 | DDRA = 0xFF; |
13 | PORTA = 0x00; |
14 | DDRB = (1<<PB3) | (1<<PB4); |
15 | DDRD = (1<<PD6) | (1<<PD7); |
16 | DDRC = 0xFF; |
17 | PORTC = 0x00; |
18 | PORTC |= (1<<PC1); |
19 | |
20 | |
21 | // Timer0: Enable Phase correct PWM(non-inverted), prescaler = 8
|
22 | TCCR0A = (1<<WGM02) | (0<<WGM01) | (1<<WGM00) | (1<< COM0A1) | (0<< COM0A0); |
23 | TCCR0B = (0<<CS02) | (1<<CS01) | (0<<CS00); |
24 | |
25 | TCNT0 = 0; //Anfangswert 0 |
26 | |
27 | TIMSK0 |= 1<<TOIE0; // Enable Overflow Interrupt |
28 | |
29 | //Timer2: Enable CTC Mode, Toggle Compare Output at Compare Match, prescaler = 8
|
30 | TCCR2A = (0<<WGM22) | (1<<WGM21) | (0<<WGM20) | (0<< COM2A1) | (1<< COM2A0); |
31 | TCCR2B = (0<<CS22) | (1<<CS21) | (0<<CS20); |
32 | TIMSK2 = (1<<OCIE2A); //Enable Compare Match Interrupt |
33 | |
34 | //Init OC-registers
|
35 | OCR0A = 155; |
36 | OCR0B = 0; |
37 | OCR2A = 79; |
38 | OCR2B = 0; |
39 | |
40 | sei(); |
41 | |
42 | while(1) |
43 | {
|
44 | |
45 | }
|
46 | |
47 | return 0; |
48 | }
|
49 | |
50 | ISR (TIMER0_OVF_vect) |
51 | {
|
52 | OCR2A+=10; |
53 | if(OCR2A >=254) |
54 | OCR2A = 0; |
55 | }
|