Cześć!
Dawno mnie nie było, a że ferie idą, to postanowiłem sobie poćwiczyć przerwania zachęcony poradnikami Mirka
Cały projekt oparłem na ATTiny2313 i mój pilot RC.
W teorii wszystko jest proste :
Nadajnik RC wysyła do odbiornika położenie drążków ->
odbiornik przekształca odebrany sygnał na wypełnienie PWM na jego wyjściach ->
wyjścia odbiornika podłączam do nóżek INT0, INT1, PCINT0, PCINT1 mikrokontrolera ->
uC analizuje wypełnienia PWM i przekrztałca je w zmienne lvlPW(poziom wychylenia drążka mocy), lvlFB(poziom wychylenia drążka przód/tył), lvlLR(poziom wychylenia drążka lewo/prawo) ->
zmienne sterują czym tylko chcę
np. ledami
Założenia są proste, przykład prosty, wszystko podłączone i posprawdzane więc wziąłem się za programowanie w stylu "na Mirka" czyli otworzyłem sobie Paint'a, PDF'a, eclipse'a, MkAVRcalculator, lekcję wideo o przerwaniach i jedziemy
Szło mi bardzo dobrze (pewnie dzięki tej metodzie
) ale gdy miałem sprawdzać wypełnienie PWM w przerwaniach INT0 i INT1 zaczęły się problemy... (PCINT0...1 zostawiłem sobie na później)
Teoretycznie wszystko było dobrze poustawiane (bity, timery itd) ale gdy podłączyłem odbiornik do INT0 program strasznie zwolnił... wiem, bo mam ustawione miganie diody w przerwaniu Timer0 co 200ms a po podłączeniu recivera migała +- co sekundę. Po podłączeniu drugiego kanału pod nóżkę INT1 program się zatrzymał. Jeśli nie podepnę odbiornika to dioda miga co 200ms
Nie jestem pewien czy kod jest poprawny, ale myślę że zawiodło moje rozumowanie problemu
Odbiornik generuje sygnał prostokątny o okresie 20ms i zawsze jest jedno zbocze opadające. Niezależnie od wypełnienia.
Ja ustawiłem przerwanie timer0 i timer1 (tryb CTC) na 1ms w którym inkrementuję zmienną (TimerPW/FB/LR/4)
Przerwanie INT0 i INT1 też inkrementuje swoją zmienną (nazwana n) i sprawdza czy zmienna TimerPW/FB ma wartość >= 20 (czyli czy minęło 20ms) jeśli tak to ustawia wyjściową zmienną (lvlPW/FB) równą zmennej n a potem wszystko zeruje.
Według mnie, taki sposób działania powinien wykonać 20milisekundowy okres próbny (tyle samo trwa jedna "ramka" PWM) w którym dodaje 1 do zmiennej n która to z kolei zwiększy się tylko jeśli wystąpi stan niski na INT0/1.
Wiem że to strasznie wytłumaczyłem, dlatego mam nadzieję że kod z komentarzami wam wyjaśni moje rozmyślania
Przerwania INT0 i INT1 są wyzwalane przy stanie niskim czyli ISC0, ISC1, ISC10, ISC11 = 0
Nie pisałem tej linijki bo domyślnie są ustawione na 0.
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Wyświetlacz dodałem by lepiej zobrazować sobie działanie przerwań - taki rozbudowany debugger
Po kolei do każdego przerwania wrzucałem inkrementację zmiennej flag która pięknie się pokazywała na LCD.
Wszystko działa tak jak chcę jedyny problem jest ze sprawdzaniem wypełnienia PWM
Mam wrażenie że nawet kod jest dobrze napisany a jedynie ja nie wiem jak zabrać się za sprawdzanie PWM...
Z góry dziękuję za pomoc i gratuluję tym którzy przeczytali wszystko co napisałem