Hallo Lisbeth2010,
Du rufst aus dem Interrupt-Context die delay() Funktion auf! Da es sich um einen Timer-IRQ handelt, kann während des delays ein weiterer IRQ ausgelöst werden - das gibt Chaos auf dem Stack....
Es ist sicherer im Timer-IRQ nur ein Flag zu setzen, und in der main-Funktion auf dieses Flag zu warten um von dort die laufstall() Funktion aufzurufen.
Das Flag muss dabei volatile definiert werden, da ansonsten der Optimizer die Zugriffe aus der main Funktion auf die Variable wegoptimiert.
Interrupt-Programmierung hat so seine Tücken!
Code:
volatile uint8_t timer_flag;
...
ISR(TIMER2_OVF_vect) { // timer2 overflow
...
counter_2ms++;
if (counter_2ms >= WHILE_1_TIME_GRID) {
timer_flag = 1;
counter_2ms = 0;
}
}
...
int main() {
...
while (1) {
if (timer_flag) {
floor_measure_iw();
laufstall();
timer_flag=0;
}
}
}
Lesezeichen