Danke, du hast mir sehr geholfen.

Der Overflow-Timer wird nun brav in der richtigen Frequenz aufgerufen.

Allerdings habe ich ein neues Problem! Wenn ich im Interrupt-Handler auf globale Variablen zugreife, vergessen diese ihren Zustand beim nächsten Call. Die Variablen sind als volatile deklariert:

Code:
#ifndef MCU             
#define __AVR_ATmega8515__
#endif

#ifndef F_CPU           
#define F_CPU 4000000UL
#endif

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/portpins.h>
#include <util/delay.h>
#include <inttypes.h>

volatile uint8_t frequencyAdjustmentCounter = 0;
volatile uint8_t frequencyAdjustmentThreshold = 14;

ISR(TIMER0_OVF_vect)
{
	frequencyAdjustmentCounter++;  //ist nach durchlaufen des handlers wieder 0 ohne Port C zu schalten!
	if(frequencyAdjustmentCounter == frequencyAdjustmentThreshold)
	{
		PORTC = ~PORTC;
		frequencyAdjustmentCounter = 0;
	}
}

int main()
{
  DDRA   =  0xff;
  PORTA   =   0x0f;
 
  DDRC  =   0xff;
  PORTC   =   0x0f;
 
  TIMSK  |=  (1 << TOIE0);                //overflow timer einschalten
  TCCR0   =  (1 << CS02) | (0 << CS01) | (1 << CS00);  //prescaler auf 1024
 
  sei();     
 
  while(1)
  {
    PORTA = ~PORTA;
    _delay_ms(500);
  }
}
Die Variable "frequencyAdjustmentCounter" gilt komischerweise nur im Scope des Interrupt-Handlers!

Den Compiler-Aufruf habe ich auf das äußerste simplifiziert, es wird praktisch nur das mmcu Argument angegeben.

Woran kann das denn liegen?