W ramach tworzonego programu na AVR MEGA8 wymyśliłem sobie, by opóźnienie niezbędne przy wyłączaniu urządzenia przyciskiem (tak, by z powrotem się zaraz nie włączało) zrealizować poprzez funkcję while i Timer 1, którego przerwanie jest generowane co 1 sekundę.
Fragment kodu w funkcji obsługującej długie naciśnięcie przycisku, która ma wyłączać urządzenie, wygląda tak:
OLED_putString(" Power off! "); g_off_timer=5; while(g_off_timer>1);
i dalej zestaw funkcji powodujących wyłączenie zasilania (zdjęcie stanu wysokiego z odpowiednich pinów)
zmienna g_off_timer jest dekrementowana w ramach obsługi przerwania od Timera 1 w następujący sposób:
if (g_off_timer>0) { g_off_timer--; PORT(TESTOUT_PORT) ^= (1<<TESTOUT); }
i to wiem, że działa prawidłowo bo LED podłączony do wyjścia TESTOUT mruga z częstotliwością 0,5Hz.
Zakładam, że gdy program dojdzie do "while(g_off_timer>1)" to powinien w tym miejscu utknąć w pętli i czekać, aż z kolejnymi wygenerowanymi wywołaniami przerwania od Timera 1 wartość tej zmiennej dojdzie do 1, wówczas warunek w while będzie niespełniony i program poleci dalej. Program jednak utyka na dobre w tym miejscu, mimo iż zmienna g_off_timer osiąga wartość 0 - sprawdziłem to dodając prosty warunek w obsłudze przerwania od Timera 1:
if (g_off_timer==0) { PORT(TESTOUT_PORT) |= (1<<TESTOUT); }
Zgodnie z przewidywaniem, po kilku mrugnięciach LED zapalił się na stałe. Gdzie mam błąd?