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.