Folgenden Code habe ich zum testen des Timers verwendet:
Code:#include <avr/io.h> #ifndef F_CPU /* Definiere F_CPU, wenn F_CPU nicht bereits vorher definiert (z.B. durch Übergabe als Parameter zum Compiler innerhalb des Makefiles). Zusätzlich Ausgabe einer Warnung, die auf die "nachträgliche" Definition hinweist */ #warning "F_CPU war noch nicht definiert, wird nun mit 16000000 definiert" #define F_CPU 16000000UL /* Quarz mit 16.0000 Mhz */ #endif #include <util/delay.h> #include <stdlib.h> #include <avr/interrupt.h> #include <inttypes.h> int duration; //****** //ISR //****** ISR (TIMER0_COMPA_vect) { duration++; switch (duration) { case 100: PORTD |= (1 << DDD6 ); break; case 200: PORTD &= ~(1 << DDD6 ); duration=0; break; default: break; } } //****** //INIT //****** void Timer0_init(void) { TCCR0A = (1<<WGM01); // Timer im CTC-Modus TCCR0A |= (1<<CS02) | (0<<CS01) | (1<<CS00); // Prescaler auf 1024 OCR0A = 156; // um ca. 10ms zu erreichen TIMSK0 |= (1<<OCIE0A); // Interrupt "TIMER0_COMPA_vect" aktivieren } //****** //MAIN //****** int main(void) { DDRD = (1 << DDD6) ; Timer0_init(); sei(); while(1) { } }
Wie gesagt, wenn ich den Code aus der ISR zusammen mit nem 10ms delay in die Main kopiere, geht es.
Gruß, Andreas
******EDIT******
Ups, hatte ich vergessen. Es ist ein ATmega644
*****EDIT 2*****
Habe den Fehler gefunden.
Es lag tatsächlich am INIT.
Ich habe geschrieben:
Es muss aber heißen:Code:TCCR0A = (1<<WGM01); // Timer im CTC-Modus TCCR0A |= (1<<CS02) | (0<<CS01) | (1<<CS00); // Prescaler auf 1024
Nun funktioniert es.Code:TCCR0A = (1<<WGM01); // Timer im CTC-Modus TCCR0B |= (1<<CS02) | (0<<CS01) | (1<<CS00); // Prescaler auf 1024







Zitieren

Lesezeichen