!!!!die fortsetzung mit dem neuen problem ist weiter unten!!!
ich verwende in einem meiner programme einen timer um eine mikrosekundengenaue pause einzubauen, dafür hab ich den timer2 eines M32 auf PS 1 und FastPWM gesetzt
in der overflow ISR dekrementier ich ne variable um die überläufe zu zählen, ist der wert dann ebi 0 angelangt, schalte ich den interrupt für das OCR register frei, in dem ich n = rest_µS*16 stehen habe ... ist das compare ereignis eingetreten, ist die pause beendet und der timer wird gestoppt
komisch nur, dass mir scheinbar öfters genau ein timerüberlauf verloren geht! der timer beendet manchmal 16µS zu früh und ich komm auf denn teufel nciht drauf WARUM bitte helft mir
Code:
ISR(SIG_OVERFLOW2) // Timer 2
{
if (faktor != 0) faktor--;
cli();
if (faktor == 0){
TIMSK &= ~(1<<TOIE2);
if (TCNT2+10 > OCR2) timeUp2();
else TIMSK |= (1<<OCIE2);
}
sei();
}
ISR(SIG_OUTPUT_COMPARE2)
{
cli();
timeUp2();
sei();
}
ISR(SIG_COMPARATOR)
{
cli();
ACSR &= ~(1<<ACIE); // disable interrupt
STOP;
TCNT2 = 0;
TCCR2 |= (1<<CS20); // enable timer2
TIFR |= (1<<TOV2);
TIMSK |= (1<<TOIE2);
sei();
}
void timeUp2()
{
START;
TIMSK &= ~(1<<OCIE2); // disable timer2 output compare interrupt
TCCR2 &= ~((1<<CS22) | (1<<CS21) | (1<<CS20)); // disable timer2 (clockselect 0)
}
Lesezeichen