Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 28 kwi 2024, o 07:17


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 3 ] 
Autor Wiadomość
PostNapisane: 21 sty 2014, o 15:17 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 lip 2013
Posty: 106
Pomógł: 0

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ę :D 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 :D
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.

Składnia: [ Pobierz ] [ Ukryj ]
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 :)

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 sty 2014, o 22:08 
Offline
Użytkownik

Dołączył(a): 24 sty 2012
Posty: 1469
Pomógł: 56

Nie przeczytałem całości ;-)
A PWMa... może podłącz diodę :?:

_________________
Jestem początkujący i moje porady mogą być błędne



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 sty 2014, o 08:04 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 lip 2013
Posty: 106
Pomógł: 0

MirkoT do PWM od odbiornika RC tak? :)
Wiem że cały problem jest błachy i że sprawdzanie PWM przez uC tylko po to by potem świecić ledami wydaje się głupie, ale tak naprawdę ma to pewien sens.(choć niestety chyba tylko dla mnie)
To może wytłumaczę dlaczego chcę użyć do tego uC:
1. Staram się nauczyć obsługi przerwań INTx/PCINTx i uznałem że sprawdzanie przy ich pomocy wypełnienia sygnału PWM będzie dobrym pomysłem :)
2. Nadajnik cały czas generuje PWM więc mimo tego, że drążek wychylę do tyłu nie uzyskam sygnału "wstecznego" co jest normalne i oczywiste, dlatego też nie mogę np świecić diodą 1 gdy wychylę drążek do przodu, a gdy do tyłu - diodą nr 2 bez użycia mikrokontrolera który odróżni te dwa stany (przód/tył) i na ich podstawie będzie czymś sterował.
Mam nadzieję że teraz zrozumiecie o co mi chodziło...

EDIT
Poczytałem, poszukałem i dowiedziałem się, że przerwanie INT0 "skonfigurowane jako wyzwalane poziomem(w moim przypadku niskim) będzie trwało tak długo, jak będzie ten stan się utrzymywał." - czyli praktycznie cały czas. Według mnie właśnie to jest przyczyną "zamulania" procka.
Sprawdzałem też z ustawioną reakcją na zbocze opadające, gdzie progam nie zawieszał się a przerwanie występowało dokładnie raz na okres 20ms czyli tak jak powinno być, i tak jak jest to w sygnale PWM.

Czyli muszę zmniejszyć częstotliwość występowania przerwań na stan niski z natychmiastowego (bo za każdym razem gdy pojawi się stan niski wykonywane jest przerwanie, potem jedna linijka z while i natychmiast skok do przerwania) na przerwanie występujące co 1ms. Tylko jak ? :)

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 3 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 2 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO