janeczqu --> takie uwagi:
1. wyłączenie przerwań cli(); PODCZAS rozpoczęcia procedury obsługi przerwania jest ZAWSZE robione automatycznie przez procesor AVR - a zatem nie rób tego w kodzie przerwania
2. włączenie przerwań sei(); na zakończenie procedury obsługi przerwania jest robione AUTOMATYCZNIE przez procesor, więc tego też nie rób w kodzie przerwania. Przy czym o ile powyższe cli(); z pkt.1 akurat niczemu nie zaszkodzi - ot po prostu zbędny rozkaz, to już twój sei() pod koniec przerwania może czasem przynieść sieczkę w niektórych programach, płacz i zgrzytanie zębów - ponieważ odpalasz sei() przed epilogiem przerwania. Musisz bowiem pamiętać że makro przerwania ISR() wygląda mniej więcej tak
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
przy czym prolog i epilog składający się z rozkazów push i pop w asemblerze dodaje sam kompilator, a więc widzisz teraz że twoje sei() odpala się przez epilogiem i może narazić np stos procka na pokrębasienie
------------------------ [ Dodano po: 3 minutach ]kolejna rzecz, zmiennych globalnych nigdy nie inicjalizuje się ZEREM jak to robisz
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
zapamiętaj sobie po prostu, że one ZAWSZE są zerowane automatycznie przez kompilator. Czyli oczywiście to że zrobiłeś = 0 przy każdej z nich - nic nie zaszkodzi ale tak na prawdę jest ZUPEŁNIE niepotrzebne. Dopiero gdy potrzebujesz inicjalizować inną wartością niż zero - tak jak ostatnia ze zmiennych globalnych = 61 - wtedy jest OK
------------------------ [ Dodano po: 7 minutach ]Następna uwaga, po RESECIE procka WSZYSTKIE piny są WEJŚCIAMI ponieważ rejestry DDRx są wyzerowane, a zatem pisanie takiej linii nie jest konieczne:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
ale oczywiście to tylko informacyjnie bo nie wpływa to na jakieś złe działanie programu, ot po prostu niepotrzebnie zajęta pamięć FLASH. Chociaż dla porządku jak się zaczyna programować może być - ale ja często wtedy też komentuję sobie taką linię
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
------------------------ [ Dodano po: 11 minutach ]na koniec, ZDECYDOWANIE ale to ZDECYDOWANIE - nigdy nie używaj jakichkolwiek poleceń do obsługi LCD w jakimkolwiek przerwaniu. To mniej więcej tak samo jakbyś użył tam _delay_ms(). Pamiętaj obsługa LCD jest bardzo powolna .... i tak jak podpowiadał ci już kolega wyżej można było po prostu zamiast tego bloku poleceń
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
ustawić po prostu jakąś zmienną globalną (flagę), np:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
natomiast w pętli nieskończonej while(1) w funkcji main dać:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
------------------------ [ Dodano po: 13 minutach ]na zakończenie - to co napisałem, to nie żadna tam jakaś kocia krytyka, tylko takie hinty (podpowiedzi) z mojej strony - mam nadzieję, że w jakimś stopniu przydadzą się, i życzę powodzenia w dalszym kodowaniu
