Witam,
Mam problem z poniższym programem. Timer0 odlicza 1ms i generuje przerwanie. W programie obsługi przerwania zmienna "znak" przyjmuje wartość znak=15, a chyba powinna przyjmować wartość znak=34. Dlaczego program nie uwzględnia mi przypisania znak=34, które znajduje się w pętli for?
Pozdrawiam
BTW, nie pokrywaj wektora BADISR_vect, szczególnie w taki sposób, że funkcja nic nie robi. Jak będziesz miał błąd w programie polegajacy na odblokowaniu przerwań do których nie masz handlerów to tego nigdy nie wykryjesz.
Dzięki wielkie! Dodanie volatile przed deklarację zmiennej oczywiście pomogło. Czy to jest błąd kompilatora GCC? W jakich sytuacjach należy używać volatile?
Dodano po 3 [minuty]:
tmf napisał:
BTW, nie pokrywaj wektora BADISR_vect, szczególnie w taki sposób, że funkcja nic nie robi. Jak będziesz miał błąd w programie polegajacy na odblokowaniu przerwań do których nie masz handlerów to tego nigdy nie wykryjesz.
A czy przypadkiem zrobione przeze mnie pokrycie: ISR (BADISR_vect){} nie spowoduje powrotu do programu po generacji niechcianego przerwania? Domyślnie chyba będzie reset procka, a tego chciałbym uniknąć.
Dzięki wielkie! Dodanie volatile przed deklarację zmiennej oczywiście pomogło. Czy to jest błąd kompilatora GCC? W jakich sytuacjach należy używać volatile?
Dzięki wielkie! Dodanie volatile przed deklarację zmiennej oczywiście pomogło. Czy to jest błąd kompilatora GCC? W jakich sytuacjach należy używać volatile?
Tu masz bez zbędnych ozdobników:
http://mikrokontrolery.blogspot.com/2011/04/problemy-c-volatile.html Nie jest to błąd kompilatora, i powiedzmy sobie szczerze - na tym etapie raczej starają się nie używać frazy "błąd kompilatora". Przyjmij raczej, że jeśli coś jest nie tak, to jest to twój błąd
mnih123 napisał:
tmf napisał:
BTW, nie pokrywaj wektora BADISR_vect, szczególnie w taki sposób, że funkcja nic nie robi. Jak będziesz miał błąd w programie polegajacy na odblokowaniu przerwań do których nie masz handlerów to tego nigdy nie wykryjesz.
A czy przypadkiem zrobione przeze mnie pokrycie: ISR (BADISR_vect){} nie spowoduje powrotu do programu po generacji niechcianego przerwania? Domyślnie chyba będzie reset procka, a tego chciałbym uniknąć.
Sytuacja w której masz odblokowane przerwanie bez handlera jest poważnym błędem. To co ty robisz przejmując wektor BADISR to maskowanie problemu. To mniej więcej tak, jakby smród maskować dezodorantem. Lepiej się umyć, prawda? Tu jest tak samo. BADISR wykorzystuje się na etapie testowania programu, odpalenie tego handlera sygnalizuje, że coś jest mocno nie tak. Stąd procedura jego obsługi powinna raczej wypisać coś na LCD, zamigać dziwacznie diodami itd. Nigdy nie wracać po prostu do programu.