Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Przygoda z przerwaniami cd. - wylaczenie diody

07 Sty 2017 10:45 789 9
  • Poziom 6  
    Witam.

    Dzieki uzytkownikom tego forum zdążyłem, w moim odczuciu, zrobić postępy w zrozumieniu przerwań. Wiem już o tym dlaczego nie stosować funkcji delay w przerwaniu ze względu na niedokładność odliczanego przez nią czasu i ryzyko gubienia przerwań i zamiast tego używać timera do opóźnień. Próbuję jeszcze zapanować nad jedną rzeczą ale mi się nie udaje... Mianowicie:

    Oto fragment kodu:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Taktowanie procesora jest ustawiony na 16 MHz stad, tak jak pisalem w komentarzach, dioda zielona pali sie praktycznie non stop, niezauwazalnie migajac wiec to jest dobrze. Chce aby dioda czerwona zostala calkowicie zgaszona w momencie gdy mam wcisniety przycisk tzn. gdy generują się przerwania. No ale wiem ze program w pewnym momencie opuszcza przerwanie i pomimo PORTA &=~(1<<PA5) dioda czerwona na krotko mrygnie w petli glownej. Chciałbym abyście podsunęli mi jakiś pomysł jak zrealizować takie zadanie, że dioda czerwona miga sobie spokojnie w petli głownej (dioda zielona zgaszona), a gdy wystepuja przerwania zewnetrze dioda zielona zaczyna swiecic(nie mrygać) a dioda czerwona zostaje calokowicie wygaszona w tym czasie. Wiem ze to co zrobilem jest troche oszukane bo wystarczy zmniejszyc czestotliwosc zegara by zauwazyc ze obie diody tak naprawde migaja w czasie wystepowania przerwan. Jak to zrobic poprawnie ,gdy używamy przerwań? Z góry dzięki za jakieś pomysły
  • Poziom 39  
    Używanie przerwania od zmiany stanu do obsługi przycisku jest ze względu na drgania styków niezbyt praktyczne. Na każde jedno wciśnięcie i puszczenie przycisku będziesz miał wiele zgłoszonych przerwań. Moim zdaniem, lepiej czytać stan przycisku w cyklicznym przerwaniu zegarowym, np. co 0.05-0,1s.
  • Poziom 6  
    Przerwania i tak bedą następować jedne po drugim w momencie ciągłego trzymania przycisku bo są wyzwalane poziomem niskim. Chodzi mi o to jak skutecznie wytłumić jedną z diod ( o czym pisałem wyżej) na czas trwania serii przerwań (ciągłego trzymania przycisku)
  • Poziom 39  
    Koncepcja którą realizujesz jest bardzo niepraktyczna. To tak trochę jakbyś rozważał jak odkręcić świecę w samochodzie otwieraczem do konserw. Jest to możliwe, ale wiedza którą zdobędziesz do niczego Ci się nie przyda. Poświęć lepiej ten czas na analizowanie tego jak to robią inni.
  • Specjalista - Mikrokontrolery
    Program i założenia są złe. Te przerwanie nie powinno być wyzwalane od niskiego poziomu. Powinno reagować na każdą zmianę poziomu. Powinna zostać wprowadzona zmienna globalna volatile, która będzie przyjmować wartości zależne od stanu tego przycisku. W pętli głównej powinny być wykonywane działania w zależności od stanu tej zmiennej. Oczywiście można to zrobić prościej bez przerwań, ale rozumiem, że Ty chcesz ćwiczyć obsługę przerwań.
  • Pomocny post
    Specjalista - Mikrokontrolery
    "Program i założenia są błędne". ;)
    Przycisku nie obsługuje się przy użyciu przerwania portu - należy to robić przy użyciu przerwania timera. Ponadto w programie jest jeszcze jeden paskudny błąd: z powodu operacji logicznych na portach w obsłudze przerwania, opercje na portach w pętli głównej muszą być wykonywane w sekcji krytycznej - przy zablokowanych przerwaniach. Inaczej zawartość portu będzie modyfikowana błędnie.
  • Poziom 6  
    BlueDraco napisał:
    "Program i założenia są błędne". ;)
    Ponadto w programie jest jeszcze jeden paskudny błąd: z powodu operacji logicznych na portach w obsłudze przerwania, opercje na portach w pętli głównej muszą być wykonywane w sekcji krytycznej - przy zablokowanych przerwaniach. Inaczej zawartość portu będzie modyfikowana błędnie.


    Dzięki piękne, faktycznie wyłączenie przerwania przed zmianą stanu diody i włączenie go po zmianie stanu w pętli if pomogło. Ale że nie wiem czy to dobrze rozumiem...

    Kod: c
    Zaloguj się, aby zobaczyć kod


    1.Naciskam przycisk, wykonuje się przerwanie, migająca dioda w pętli głównej zostaje wygaszona, a dioda migająca stale zapalona.
    2.Powrót do pętli głównej: wyłączenie przerwania. Dioda migająca zmienia stan na przeciwny zatem poprzednio zgaszona w przerwaniu teraz zapala się, dioda paląca się stale zostaje zgaszona.

    Nie potrafie odpowiedzieć jaką rolę odgrywa tutaj wyłączenie przerwania INT0. Wygląda jakby wyłączenie przerwania pozwoliło w spokoju zapalić się diodzie migającej. Okej dzięki temu przerwania wygaszające diodę migającą nie występuje w momencie zmiany stanu tej diody w pętli głównej (no bo nie wiemy w którym miejscu programu wykonuje się przerwanie) dzięki czemu stan diody w czasie trwania zmiany w pętli głównej nie zostaje zmodyfikowany przez przerwanie.
    Nie rozumiem dlaczego program tak działa, tzn. dlaczego dioda migająca zostaje na stałe wygaszona. Wszak o to mi chodziło ale czy jest to rezultat wysokiego taktowania procesora tzn. czy gdyby taktowanie było mniejsze i przerwania występowałyby w z mniejszą częstotliwością to czy bylibyśmy w stanie dostrzec że tak naprawdę dioda migająca po przejściu do pętli głównej z przerwania zapala się?

    Dodano po 10 [minuty]:

    BlueDraco napisał:
    "Program i założenia są błędne". ;)
    Przycisku nie obsługuje się przy użyciu przerwania portu - należy to robić przy użyciu przerwania timera



    Kod: c
    Zaloguj się, aby zobaczyć kod


    coś w tym stylu?
  • Specjalista - Mikrokontrolery
    Zacznij od określenia funkcjonalności urządzenia. Nie myśl o przerwaniach, a o tym, jak to ma się zachowywać, np. : "po naciśnięciu przycisku dioda miga 4 razy co 0.5 sekundy".
  • Poziom 6  
    Chcę aby na czas trzymania przycisku jedna dioda paliła się stale a druga była zgaszona. W momencie puszczenia przycisku chcę aby druga dioda, która wcześnie była zgaszona, teraz migała, a pierwsza dioda została zgaszona. I chcę to osiągnąć koniecznie z użyciem przerwań. Poszedłem za Twoją radą i to się udało. Teraz chce to zrozumieć jak to po kolei działa. Wiem że ludzie, którzy już siedzą w temacie sporo czasu nie myślą o takich rzeczach, bo jest to dla nich już naturalne, weszło im w nawyk ale dla mnie, który zaczyna dopiero jest to niezmiernie ważne by zrozumieć co po kolei się dzieje. Opisałem wyżej tak jak to rozumiem ale kłóci się to z tym co jest w praktyce.
  • Specjalista - Mikrokontrolery
    Zaprogramuj timer na zgłaszanie przerwań z częstotliwością np. 100 Hz. W obłsudze przerwania zrób rozejście wg. bieżącego stanu urządzenia. W obsłudze stanu sprawdć warunek zmiany stanu (np. wciśnięto przycisk) i jeśli on zachhodzi - zmień sterowanie wyjść i zmień stan. W stanie migania ponadto odliczaj przerwania timera i po osiągnięciu jakiejś liczby zmień stan wyjścia i wyzeruj licznik przerwań.