Piszę program na ATmega128 za pomocą edytora AVRSide i kompilatora WinAVR. Program jest juz trochę rozbudowany i zawiły. Jest obsługa przerwań czasowych co mniej więcej 1ms i używane jest sporo zmiennych globalnych. Program obrabia równolegle dwa sygnały A i B z przetwornika A/C. Jeśli sygnał A lub B spełni pewien warunek badany w przerwaniu, w pętli głównej wchodzi w odpowiadającą swojemu kanałowi jedną z dwóch bliźniaczych procedur (dość zawiłych). Jedna ze zmiennych ustawiana jest w menu (wyświetlacz LCD i klawiatura multipleksowana) i przyjmuje wartości 1 lub 0.
Dziwne zjawisko występuje, kiedy program wejdzie w wykonywanie procedury tylko dla kanału B. W trakcie jej wykonywania powoduje samoistne wyzerowanie wspomnianej wcześniej zmiennej. Zmienna ta nie występuje w ogóle w tej procedurze. W całym programie jej wartość może być zmieniana ręcznie tylko w pewnym menu które trzeba specjalnie wywołać sekwencją działań. Podejrzewałem że może jest za mało pamięci RAM (zajętość 83%) i coś zaczyna głupieć. Testowo wywaliłem pewne tabele zajmujące sporo RAM-u i uzyskałem
52% zajętości. Zjawisko się nie zmieniło. Sprawdziłem użycie tablic i nigdzie nie jest przekroczony ich rozmiar.Zmienna nie jest używana w przerwaniach, ale dla próby dałem ją jako volatile - bez poprawy. Szukanie dokładnie miejsca w procedurze w którym następuje zmiana wartości tej zmiennej, to żmudna czasochłonna praca. Procedura jest duża i pokiełbaszona z wieloma rozgałęzieniami typu case. Przydałaby się jakaś wskazówka do szukania winnego.
Co może powodować ingerencję w wartość zmiennej przez procedurę, w której ta zmienna nie występuje?