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

[ATmega][BASCOM] Odbiór RC5 bez użycia GETRC5 - gotowiec dla początkujących

23 Cze 2011 16:20 5895 13
  • #1 23 Cze 2011 16:20
    30402
    Użytkownik usunął konto  
  • #2 23 Cze 2011 16:53
    mirekk36
    Poziom 42  

    Fajnie, że działa ale jest to strasznie hmmm mało odporne na błędy a może nawet powodować zawieszenia całości.

    Uzyłeś w przerwaniu BitWait ! ? ! ? ..... już samo to jest masakrą niestety - i to może powodować wręcz zawieszenia działania całego programu i to na AMEN :(

    Wystarczy, że nadleci jakieś odbicie kodu wysłanego z pilota od ściany i np nie doleci cała ramka.

    Ale generalnie jak to jeszcze dopracować to może fajnie działać ;) ... no tylko, ze to dodatkowy kawał kodu, który znowu sporo powiększa cały kod w Bascomie w sencie kodu źródłowego, no i brak standardowej obsługi - trzeba to za każdym razem mocno sobie modyfikować chcąc dopasować do innego taktowania, nieco innych czasów itp....

    Jednak reasumując - bardzo fajnie, że chciało ci się zrobić to po swojemu a nie korzystać z gotowca - bo to prawda, że ma on te wady o których wspominałeś wyżej.

    1
  • #3 23 Cze 2011 17:27
    30402
    Użytkownik usunął konto  
  • #4 23 Cze 2011 17:32
    mirekk36
    Poziom 42  

    Sorki - po prostu zauważyłem Bitwaita ;) ... ale masz rację - w tym przypadku to nie spowoduje czegoś złego ;) więc tym bardziej gratulacje za takie zrobienie RC5 w Bascomie na piechotę.

    0
  • #5 23 Cze 2011 21:59
    xury
    Poziom 38  

    Bardzo ciekawy kod. Jeszcze jak by można było prosić o więcej komentarzy przy kodzie.

    0
  • #6 25 Cze 2011 15:01
    30402
    Użytkownik usunął konto  
  • #8 25 Cze 2011 16:23
    mirekk36
    Poziom 42  

    Uważam, że jako alternatywa dla Bascomicznego RC5 to bardzo dobre rozwiązanie i wcale nie prymitywny program jak piszesz ;)

    Jedyną jego wadą jest właśnie tylko to, że trzeba go dosyć mocno parametryzować pod swój konkretny model pilota bo jak sam zauważyłeś - niby standard RC5 a co pilot to gada troszkę inaczej.

    Dlatego wadą takich rozwiązań jest własnie to, że program np nie będzie działał - ze wszystkimi rodzajami pilotów RC5 tak jak to robi Bascom. No ale tutaj coś za coś - i tak każdy kto dostał od ciebie to rozwiązanie nie może narzekać bo ma lepiej działającego gotowca.

    Jeszcze inną wadą na pewno jest to, że czasem gdy się będzie ruszało ręką czy jak doleci coś z odbić to niestety - może się okazać że np pokażą się inne odebrane kody niż wysłał pilot.... , albo nie wszystkie ramki zostaną odebrane.

    Jednak te wady wcale nie oznaczają, że to jakaś tragedia bo kto ze zwykłych przyciskaczy pilota wyczuje czy po jednym wduszeniu klawisza pilot wyemituje jedną czy kilka a może nawet kilkanaście ramek ;) ... zawsze któraś doleci.

    Nie mniej jednak - żeby zrobić ten ciut rozbudowany sposób jak piszesz to nie koniecznie trzeba się zaraz synchronizować do długości pierwszych odebranych bitów .... wystarczy tylko w każdym bajcie sprawdzać długość bitu czy półbitu - no ale to na jedno w sumie wychodzi. Wtedy dodając tolerancję o jakiej pisałeś można mieć już w pełni uiniwersalnego pilota na RC5 ;)

    Tak czy inaczej - jeszcze raz podkreślam - to nie jakaś krytyka z mojej strony tylko kilka uwag - a sposób jak dla Bascomowców - nadzwyczaj przydatny - chociaż zapewne i tak nie wszyscy go nawet docenią - bo czasem na początku drogi nie każdy nawet zdaje sobie sprawę z tych wad o jakich pisałeś ;)

    0
  • #9 25 Cze 2011 16:40
    30402
    Użytkownik usunął konto  
  • #10 25 Cze 2011 16:45
    xury
    Poziom 38  

    No teraz z komentarzami to rewelacja!. Myślę, że bardzo mi się przyda ten kod w zrozumieniu kodowania w Manchesterze, bo jakoś mi opornie idzie pojęcie tego, a także podpatrzenia metodyki pisania kodu. W imieniu swoim oraz innych Bascomowców dziękuję za ten kod.

    0
  • #11 25 Cze 2011 19:43
    mirekk36
    Poziom 42  

    Saabotaz napisał:
    tak, można mierzyć długości półbitów ale zauważ że wtedy wstrzymuję główny program na czas odbioru całej ramki. Ale jest rozwiązanie, pobieram dane co pół bitu a nie co cały. Wtedy gdy otrzymam np 01 to mam 1, 10 to mam 0, a gdy dostanę 11 lub 00 to znaczy że bit jest błędny. Przerwanie Timer0 muszę więc wykonać 2x częściej, ale mam dokładniejszy odbiór i nie wstrzymuję programu głównego. No ale to zabawa na później :-)


    Ale ja w swoich programach tego typu podchodzę nieco inaczej i broń boże nie wstrzymuję programu głównego nawet na niepotrzebną nano-sekundę. Dokładniej mówiąc zrobiłem to na swój użytek na dwa sposoby. Jeden z użyciem INTx oraz Timera 8-bitowego, tylko że koncepcja jest o tyle inna od twojej, że u mnie INTx cały czas bierze udział w dekodowaniu wespół z timerem i dzięki temu timerem odmierzam właśnie te czasy - czyli nadal wszystko pięknie w przerwaniach najkrócej jak można. A poważną zaletą takiego podejścia jest to, że zrobienie z tego dekodowania w innym standardzie to już bajka, w sumie tyle roboty co z tym parametryzowaniem tu programu.

    Innym sposobem jest jeszcze wejście ICP Timera1. Wtedy masz dwa w jednym - bo i wejście przerwania i jednocześnie timer do odmierzania.

    obydwa sprawują się znakomicie i można wykorzystywać je alternatywnie, czyli np tam gdzie mniej mi zależy na Timerze1 a bardziej na wejściach INTx to pierwszy sposób, a tam gdzie Timer1 musi być użyty do czegoś innego to leci to pierwsze rozwiązanie. Tyle, że ja już takimi rzeczami to bawię się w C.... bo łatwiej mi po przejściu z Bascoma a szczególnie dlatego, że nie muszę już szprycować swoich programów wstawkami w asemblerze - do czego byłem zmuszony w Bascomie chcąc wyciągnąć z niego więcej i więcej.

    Nie mniej jednak jeszcze raz powiadam - dałeś braci Bascomowskiej i tak gigantyczną przysługę ;)

    0
  • #12 25 Cze 2011 20:42
    30402
    Użytkownik usunął konto  
  • #13 02 Sty 2013 21:11
    Ilmarinen
    Poziom 12  

    Sam trafiłem teraz na problem z odbiorem RC5 w przerwaniach i po przeanalizowaniu tego kodu myślę że można by łatwo dodać synchronizację dla każdego pilota.

    W programie Saabotaz mierzy czas trwania połówki bitu. Zakładając że czas wysłania połowy bitu wacha się miedzy pilotami np. od 905ms do 860ms i nie zmienia sie podczas transmisji, można wyliczyć czas trwania 1/4 bitu dzieląc czas zmierzony przez 2. Przy okazji, mnożąc tą wartość przez 2 dostajemy czas trwanie każdego bitu dla danego pilota.

    Jak to zrobić w krótkim czasie który pozostał do nadejścia kolejnych bitów?
    Mnożenie w wydaniu Bascoma wygeneruje pewnie kilkaset cykli czyli zamorduje cała transmisje, ale dzielenie przez 2 można zrealizować przez przesunięcie bitowe.

    Nie wiem ile to potrwa wykorzystując Bascomowa funkcję Shift ale zawsze pozostaje wstawka asm i wykorzystanie odpowiedniego rozkazu procesora co w AVR zajmuje przeważnie 1 cykl zegarowy.

    W programie Saabotaz próbkuje sygnał w czasie trwania 1 połówki bitu, niestety przez to dostaje sygnał zanegowany co wymaga dodatkowych operacji. Lepszym rozwiązaniem było by odczytywanie wartości drugiej połówki bitu.

    Spróbuje poprawić i przetestować te propozycje swoim projekcie jak sie uda to wrzucę kod na forum.

    0
  • #14 03 Sty 2013 13:29
    30402
    Użytkownik usunął konto