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:
Code:
TCCR0A = (1<<WGM01); // Timer im CTC-Modus
TCCR0A |= (1<<CS02) | (0<<CS01) | (1<<CS00); // Prescaler auf 1024
Es muss aber heißen:
Code:
TCCR0A = (1<<WGM01); // Timer im CTC-Modus
TCCR0B |= (1<<CS02) | (0<<CS01) | (1<<CS00); // Prescaler auf 1024
Nun funktioniert es.
Lesezeichen