Hallo,
hab den Rat von Wsk8 beherzigt und habe in die Interrupt-Routine einen weiteren Timer eingebaut (ist das so üblich?).

#define F_CPU 1000000UL
#include <avr/io.h>
#include <avr/interrupt.h> //Datei interrupt.h einbinden
#include <util/delay.h>

ISR(TIMER1_COMPA_vect) //Interrupt service routine wenn Vergleichswert erreicht ist
{
static uint16_t swTeiler = 0; //Deklarieren von swTeiler
swTeiler++; //Zählschritt einstellen
if (swTeiler == 30) //Wert bis Interrupt ausgelöst wird
{
swTeiler = 0; //Teiler wieder auf 0 setzen
PORTD |= (1<<PD6); //PortD Strom an
TCCR1B |= (1<<WGM12) | (1<<CS12);
TIMSK |= (1<< OCIE1B);
OCR1B = 3094;
sei();


}
}
ISR (TIMER1_COMPB_vect)
{
static uint8_t vTeiler = 0;
vTeiler++;
if (vTeiler == 4)
{
vTeiler = 0;
PORTD &= ~(1<<PD6);

}
}

int main (void)

{


DDRD |= (1<<PD6); //PD6 als Ausgang deklarieren




//Timer konfigurieren
TCCR1B |= (1<<WGM12) | (1<<CS12); //CTC-Mode und Vorteiler auswählen
//Tabelle

TIMSK |= (1<<OCIE1A); //Timer1 auswählen (Output Compare A Match Interrupt Enable
//Interrupt aufrufen, wenn der Vergleichswert erreicht ist
//Tabelle

OCR1A = 3906; //Vergleichswert zur bestimmung einer Sekunde
//Interrupts aktivieren

sei();


int i = 0; //Schleifenvariable deklariert
while(i<2) //Zwei mal wird die Schleife durchlaufen
{
//Zu beginn des Programmstarts, sollen 2 Schmierungen druchgeführt werden
i++;
PORTD |= (1<<PD6);
_delay_ms(3000); //Schmierzeit
PORTD &= ~(1<<PD6);
_delay_ms(3000); //Untebrechung der Schmierung

}


while(1)
{

}
}
Prinzipiell läuft das Programm, jedoch findet bei jedem zweiten Aufruf der ISR, schon nach ca. einer Sekunde ein Interrupt statt, wodurch PD6 wieder auf Low gesetzt wird.
Sprich bei jedem ungeraden Interrupt findet der Overflow nach 4 Zählschritten statt und bei jedem geraden schon nach einem.
Kann es mir nicht wirklich erklären?

mfg
Damnit