Pierwszym błędem jest wywołanie funkcji "inicjalizacja" w przerwaniu, która powinna zgodnie ze swoją nazwą być wywołana jednokrotnie przed pętlą główną programu.
Kolejny to zupełnie zbędne ciągłe ustawianie "pull-up'a" (
PORTB = (1<<PD2);) w funkcji "przycisk". Zapewne chodziło o "pull-up" dla PD2, a nie PB2, dlatego tę linię można zupełnie usunąć, gdyż takowa znajduje się już w funkcji "inicjalizacja".
Następnie kolejna uwaga dotycząca ustawiania kierunku portów. Nie wiem jakie było założenie, ale w tym wypadku wszystkie piny oprócz PD2 będą wyjściami:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Nie powinno być w ten sposób?:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Podobnie sytuacja wygląda w głównej pętli "while" programu. Tam również warto użyć maskowania (jeżeli zmianie ma ulec stan jedynie niektórych pinów).
"
SIGNAL(SIG_INTERRUPT0)" jest to przestarzały zapis i lepiej używać: "
ISR(INT0_vect)".
Przechodząc do sedna problemu, przy pierwszym naciśnięciu klawisza wywoływana jest funkcja "tryb2", później "tryb3", a następnie zmianie ulega jedynie zmienna "n" nie wywołując przy tym żadnych akcji. Dobrze byłoby ustawiać jej stan przed instrukcją wyboru "switch". Można to zrobić w dwojaki sposób:
1. Używając reszty z dzielenia
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
2. Używając warunku
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Cały kod przedstawia się następująco:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.