Witam Kolegów,
Idąc śladem Kolegi mirekk36 napisałem sobie prosty program do pilota (podobny do tego z jego I książki) a w zasadzie jego wzór z tą jednak różnicą…z resztą od początku. Powiem szczerze, że problem, który opiszę za chwilę rozwiązałem w inny sposób (bez blokowania INT0), ale ciekaw jestem gdzie tkwił błąd, czego sam nie byłem w stanie ustalić! Program i projekt jest bardzo prosty: do jednego z portów podpięto 8 klawiszy, ich drugie wyprowadzenia połączono razem i podpięto do wyprowadzenia przerwania zewnętrznego INT0. Program na początku ustawia te piny obsługujące przyciski jako wyjścia, INT0 jako wejście z podciąganiem, zezwala na INT0, uruchamia obsługę przerwań i usypia procesor.
Wybudzenie powoduje wciśnięcie dowolnego przycisku, wtedy procek wchodzi do obsługi ISR INT0, odczytuje numer wciśniętego klawisza (odpowiednio zmieniając kierunki portów), ustawia flagę (jednocześnie będącą kodem odczytanego klawisza gdy !=0xFF) dla pętli głównej i blokuje przerwanie INT0. W pętli głównej program instruowany ta flagą wykorzystuje wartość odczytanego klawisza i usypia procek ponownie. Pewnie się zastanawiacie czemu kodu odczytanego klawisza nie wykorzystuje w samej procedurze INT0 bez jej blokowania – otóż muszę tak robić bo to tzw. wykorzystanie numeru klawisza polega na jego wysłaniu i odebraniu potwierdzenia wysłania w procedurze ISR ICP1 a jak wiemy wejście w przerwanie INT0 blokuje inne przerwania – nie chciałem komplikować sprawy i obsługiwać przerwań w czasie innych przerwań. Problem w tym, że ten nawet prosty szkielet programu (bez wysyłania czegokolwiek - jak niżej) powoduje w pewnych warunkach zawieszenie się programu a dokładnie, jak przypuszczam, wejście w stan uśpienia prawdopodobnie z zablokowanym przerwaniem INT0 co skutecznie wiesza system. Jest to prawdopodobnie spowodowane jakimiś stanami przejściowymi spowodowanymi drganiem styków – nie mogę jednak znaleźć miejsca gdzie takie coś może powodować zawieszenie się systemu. Może Wy Panowie zauważycie to co oczywiste i co może przydać się innym…robiw
Kod całości (uproszczony bo prób pokonania problemu było wiele
):
Idąc śladem Kolegi mirekk36 napisałem sobie prosty program do pilota (podobny do tego z jego I książki) a w zasadzie jego wzór z tą jednak różnicą…z resztą od początku. Powiem szczerze, że problem, który opiszę za chwilę rozwiązałem w inny sposób (bez blokowania INT0), ale ciekaw jestem gdzie tkwił błąd, czego sam nie byłem w stanie ustalić! Program i projekt jest bardzo prosty: do jednego z portów podpięto 8 klawiszy, ich drugie wyprowadzenia połączono razem i podpięto do wyprowadzenia przerwania zewnętrznego INT0. Program na początku ustawia te piny obsługujące przyciski jako wyjścia, INT0 jako wejście z podciąganiem, zezwala na INT0, uruchamia obsługę przerwań i usypia procesor.
Wybudzenie powoduje wciśnięcie dowolnego przycisku, wtedy procek wchodzi do obsługi ISR INT0, odczytuje numer wciśniętego klawisza (odpowiednio zmieniając kierunki portów), ustawia flagę (jednocześnie będącą kodem odczytanego klawisza gdy !=0xFF) dla pętli głównej i blokuje przerwanie INT0. W pętli głównej program instruowany ta flagą wykorzystuje wartość odczytanego klawisza i usypia procek ponownie. Pewnie się zastanawiacie czemu kodu odczytanego klawisza nie wykorzystuje w samej procedurze INT0 bez jej blokowania – otóż muszę tak robić bo to tzw. wykorzystanie numeru klawisza polega na jego wysłaniu i odebraniu potwierdzenia wysłania w procedurze ISR ICP1 a jak wiemy wejście w przerwanie INT0 blokuje inne przerwania – nie chciałem komplikować sprawy i obsługiwać przerwań w czasie innych przerwań. Problem w tym, że ten nawet prosty szkielet programu (bez wysyłania czegokolwiek - jak niżej) powoduje w pewnych warunkach zawieszenie się programu a dokładnie, jak przypuszczam, wejście w stan uśpienia prawdopodobnie z zablokowanym przerwaniem INT0 co skutecznie wiesza system. Jest to prawdopodobnie spowodowane jakimiś stanami przejściowymi spowodowanymi drganiem styków – nie mogę jednak znaleźć miejsca gdzie takie coś może powodować zawieszenie się systemu. Może Wy Panowie zauważycie to co oczywiste i co może przydać się innym…robiw
Kod całości (uproszczony bo prób pokonania problemu było wiele
Kod: C / C++