Uczę się programowania ATMegi8 z książki Pawła Borkowskiego: "AVR8 i ARM7. Programowanie mikrokontrolerów dla każdego.". Moje ćwiczenie wygląda następująco:
Mówiąc w skrócie: Po naciśnięciu przycisku układ budzi się, mryga 10 razy i zasypia. Przy naciśnięciu podczas mrugania ma ono zacząć się od początku. Dany układ wygląda następująco:
Do rozwiązania problemu postanowiłem wykorzystać ustawienie timera w tryb CTC. Dzięki temu mogę ustawić miganie w rytmie dokładnie równym pół sekundy. Zanim jednak przedstawię program, mam pytanie:
[?] Które rejestry timera należy zerować przed uśpieniem mikrokontrolera?
Pytam dlatego że przy wybudzaniu na nowo je ustawiam, choć nie wiem czy jest taka potrzeba.
Oto mój program, który jak się domyślacie nie działa... Aby szybciej widzieć co się dzieje, ustawiłem na razie 5 mrugnięć. W oryginalnej postaci nic się nie działo, po zakomentowaniu skoku do uśpienia program działa dziwnie. Chodzi o to, że po pierwszym naciśnięciu mryga 6 razy (dlaczego?), a potem w ogóle. Tak więc mam dwa problemy:
[?] Gdy tylko program skoczy do etykiety z usypianiem, mikrokontroler przestaje mrygać
[?] Jeżeli usunę usypianie od razu po ustawieniu wszystkich rejestrów to za pierwszym razem dioda mruga o 1 raz za dużo
Zauważyłem, że ten "1 raz za dużo" pojawia się od razu po naciśnięciu przycisku - mimo że pierwsze mrygnięcie powinno pojawić się dopiero po połowie sekundy.
To są moje obserwacje, ale nie znam ich przyczyny. Bardzo proszę o pomoc w rozwiązaniu problemów.
Cytat:W celu maksymalnego oszczędzania energii w telefonach komórkowych po kilkunastu sekundach bezczynności następuje automatyczne przejście w tryb zmniejszonego poboru energii. Ten fakt zaobserwowaliśmy na pewno niejednokrotnie, gdy spieszyliśmy z naciśnięciem dowolnego klawisza w celu uaktywnienia wyświetlacza LCD. Projektowany program ma zachowywać się podobnie: należy obsłużyć układ z rysunku 8.17 tak, aby po dziesięciokrotnym mrugnięciu diody D1 (w odstępach półsekundowych) mikrokontroler przeszedł w tryb uśpienia. Jeśli zostanie wykryte wciśnięcie przycisku S1, liczenie mrugnięć należy zacząć od początku. Także wyjście z trybu uśpienia ma nastąpić w wyniku wykrycia tego przycisku.
Mówiąc w skrócie: Po naciśnięciu przycisku układ budzi się, mryga 10 razy i zasypia. Przy naciśnięciu podczas mrugania ma ono zacząć się od początku. Dany układ wygląda następująco:
Do rozwiązania problemu postanowiłem wykorzystać ustawienie timera w tryb CTC. Dzięki temu mogę ustawić miganie w rytmie dokładnie równym pół sekundy. Zanim jednak przedstawię program, mam pytanie:
[?] Które rejestry timera należy zerować przed uśpieniem mikrokontrolera?
Pytam dlatego że przy wybudzaniu na nowo je ustawiam, choć nie wiem czy jest taka potrzeba.
Oto mój program, który jak się domyślacie nie działa... Aby szybciej widzieć co się dzieje, ustawiłem na razie 5 mrugnięć. W oryginalnej postaci nic się nie działo, po zakomentowaniu skoku do uśpienia program działa dziwnie. Chodzi o to, że po pierwszym naciśnięciu mryga 6 razy (dlaczego?), a potem w ogóle. Tak więc mam dwa problemy:
[?] Gdy tylko program skoczy do etykiety z usypianiem, mikrokontroler przestaje mrygać
[?] Jeżeli usunę usypianie od razu po ustawieniu wszystkich rejestrów to za pierwszym razem dioda mruga o 1 raz za dużo
Zauważyłem, że ten "1 raz za dużo" pojawia się od razu po naciśnięciu przycisku - mimo że pierwsze mrygnięcie powinno pojawić się dopiero po połowie sekundy.
To są moje obserwacje, ale nie znam ich przyczyny. Bardzo proszę o pomoc w rozwiązaniu problemów.
Kod: text
