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

[atmega16][Bascom] odbió kodu pilota (innego niz rc5)

misiekdg 30 Gru 2008 03:46 4601 10
  • #1 30 Gru 2008 03:46
    misiekdg
    Poziom 13  

    Mam problem, musze zrobic urzadzenie które działa na pilota nie pracujacego w stantardzie rc5. Korzystajac z procedury get rc5 otrzymuje ciągle wynik 255 zarówno adres jak i komenda. Jest jakaś alternatywa na to?? Pilot jest od starej wiezy Samsung i chyba on nie ma zadnego standartu. Jak sie za to zabrac?

    0 10
  • Oscyloskop cyfrowy Siglent SDS1104X
  • #2 30 Gru 2008 08:37
    mirekk36
    Poziom 42  

    misiekdg napisał:
    Pilot jest od starej wiezy Samsung i chyba on nie ma zadnego standartu. Jak sie za to zabrac?


    żadnego standardu to nie ma np szum kosmiczny. Natomiast każdy pilot IR działa w oparciu o jakiś standard kodowania. I nawet jeśli nie jest oparty na podstawach jednego z podstawowych typów kodowania IR jak: biphase (np piloty Philipsa w tym RC5), space (np Sony) czy pulse (np JVC) to na pewno działają w oparciu o charakterystyczny tylko dla nich standard.

    jak się za to zabrać? ano podejść do tematu nieco głębiej a nie tylko tak powierzchownie. Dowiedzieć się najpierw na jakiej zasadzie działa samo RC5 a dzięki temu zrobić pierwszy krok w kierunku poznania tego całego zresztą jakże przyjemnego zagadnienia.

    http://www.ustr.net/infrared/infrared1.shtml

    potem poczytać o innych sposobach kodowania i najważniejsze, nie przerażać się, że to skomplikowane i że można to zrobić tylko w asemblerze albo w C. W Bascomie także się da - zapewniam cię - tylko trzeba chcieć i poczytać. Ale nie zaprzeczę też, że odkąd zacząłem się uczyć C - to oprogramowanie dowolnego rodzaju pilota stało się dla mnie tzw pikusiem.

    w związku z powyższym zapoznaj się ze stronką, po tysiąckroć przytaczaną tu na elektrodzie:

    http://lirc.sourceforge.net/remotes/

    na niej ku swojemu ogromnemu zdumieniu odnajdziesz na pewno także standard kodowania swojego pilota samsunga - bo to bardzo popularne piloty i są nieźle tam opisane

    przy okazji polecam też link:

    https://www.elektroda.pl/rtvforum/viewtopic.php?t=1139494&highlight=

    tu padło dużo wyjaśnień jak korzystać z informacji zawartej na tej stronce do budowy swojego własnego dowolnego pilota

    pozdrawiam

    0
  • #3 30 Gru 2008 11:37
    misiekdg
    Poziom 13  

    próbowałem róznych metod, te strony znałem już wcześniej, mimo to nie udało mi sie uzyskac zadowalających efektów. najbardziej sensowna chyba była by metoda np co ok 800 us sprawdzac stan wejscie do któego jest podpiety odbiornik ale nie wiem czemu mi sie to zapętla i jak odbierze kod z pilota to leci bez końca. oto kod

    Code:

    $regfile = "m16def.dat"
    $crystal = 16000000

    Config Lcdpin = Pin , Db4 = Porta.3 , Db5 = Porta.2 , Db6 = Porta.1 , Db7 = Porta.0 , E = Porta.4 , Rs = Porta.5
    Config Lcd = 16 * 2
    On Int0 Pobr_rc5

    Config Timer1 = Timer , Prescale = 1
    Enable Timer1
    On Timer1 Przerwanie_timer1

    Stop Timer1

    Dim Kod As String * 16
    Dim Znak0 As Bit
    Dim Znak1 As Bit

    Znak0 = 0
    Znak1 = 1

    Dim Licznik As Integer

    Enable Interrupts
    Enable Int0
    Cls

    Do

    Lcd Nadawca

     Enable Int0

    Loop
    End

    Pobr_rc5:
     Disable Int0

     If Pind.2 = 0 Then
       Timer1 = 53286
       Licznik = 0
       Start Timer1
     End If

    Return

    Przerwanie_timer1:

    If Pind.2 = 0 Then

       Kod= Kod + Str(znak0)
       Else
       Kod = Kod + Str(znak1)
       End If

       Incr Licznik

          If Licznik > 16 Then
             Stop Timer1
             Timer1 = 53286
             Licznik = 0
          End If

     Return


    Nie wiem czemu cały wyswietlacz sie zapełnia 0/1 skoro przerwanie sie wykonuje tylko 17 razy.

    Innym pomysłem było zliczanie czasu trwania poszczególnych snanów

    Code:

     If Pinb.1 = 0 Then

         While Petla < 27


             While Pinb.1 = 0
               Incr Licznik
               Waitms 1
             Wend


              If Petla < 8 Then
               Nadawca = Nadawca + Str(licznik)
              End If

              If Petla > 21 Then
               Rozkaz = Rozkaz + Str(licznik)
              End If

           Licznik = 1
           Waitms 1
           Incr Petla

         Wend

      Petla = 1

    If Rozkaz = "41241" Then
    Polecenie = "Play"
    End If
    .....
       Cls

            Lcd Nadawca
            Locate 2 , 1
            Lcd Rozkaz ; " " ; Polecenie
          Polecenie = ""
          Nadawca = ""
          Rozkaz = ""

        Czas = 1

       Wait 2
     End If


    Tu już mozna zadeklarować wszystkie przyciski ale nie jest to dokładne. Kod zmienia sie gdy pilota ustawi sie pod innym kontem lub zmienia sie odległosc. Jak sie centralnie celuje w czujnik jest ok ale jest to pewne utrudnienie. Jak wybrnąć z tego i napisać coś co będzie działąć idealnie??

    0
  • Oscyloskop cyfrowy Siglent SDS1104X
  • #4 30 Gru 2008 11:55
    mirekk36
    Poziom 42  

    Podchodzisz do tego w najprostszy z możliwych sposobów i dlatego nie wychodzi albo bardzo kiepsko wychodzi.

    1. Zapomnij o stosowaniu poleceń typu waitms itp
    2. Synchronizuj się wraz z odbieranym sygnałem programowo - np poprzez zobocza narastające czy opadające lub jedne i drugie wtedy nie będziesz miał problemów, że jak pilot jest pod innym kątem to coś nie działa. Bez synchronizacji tak na prawdę pomijasz tak ważne zagadnienie jak odporność na zakłócenia

    użyj jakiegoś wejścia typu INTx lub wejścia ICP jednego z Timerów - i właśnie dokładnie za pomocą Timerów odmierzaj odpowiednie czasy a nie takimi pętelkami z waitms itp. To wtedy coś zacznie ci wychodzić

    0
  • #5 30 Gru 2008 15:45
    misiekdg
    Poziom 13  

    pomyślałem że wykorzystam 2 przerwania, złączyłęm razem int0 i int1. jedno bedzie wykrywac opadajace zbocze a drugie rosnące. efektem miał być ciąg licz np "345,12,345,32,463,12" gdzie kazda liczba oznaczałą by długość kolejnego impulsu otrzymywanego z czujnika.
    napisałem kod:

    Code:

    $regfile = "m16def.dat"
    $crystal = 16000000

    Config Lcdpin = Pin , Db4 = Porta.3 , Db5 = Porta.2 , Db6 = Porta.1 , Db7 = Porta.0 , E = Porta.4 , Rs = Porta.5

    Config Lcd = 16 * 2

    Cursor Off


    Config Int0 = Falling
    Config Int1 = Rising

    On Int0 Opadajace
    On Int1 Rosnace

    Config Timer1 = Timer , Prescale = 8
    Enable Timer1
    On Timer1 Przerwanie_timer1
    Stop Timer1
    Timer1 = 0


    Dim Nadawca As String * 16
    Dim Znak0 As String * 1


    Znak0 = ","

    Nadawca = ""

    Dim Licznik As Integer

    Enable Interrupts
    Enable Int0
    Enable Int1

    Cls


    Do



    Lcd Nadawca

    Wait 1

    Nadawca = ""
    Cls

    Loop


    Rosnace:

    Start Timer1

    Return



    Opadajace:

    Stop Timer1


     Nadawca = Nadawca + Str(timer1) + Znak0
      Timer1 = 0
    Return



     Przerwanie_timer1:
                 Stop Timer1
     Lcd "koniec odczytu"
     Wait 2
     Return
    $regfile = "m16def.dat"
    $crystal = 16000000

    Config Lcdpin = Pin , Db4 = Porta.3 , Db5 = Porta.2 , Db6 = Porta.1 , Db7 = Porta.0 , E = Porta.4 , Rs = Porta.5

    Config Lcd = 16 * 2

    Cursor Off


    Config Int0 = Falling
    Config Int1 = Rising

    On Int0 Opadajace
    On Int1 Rosnace

    Config Timer1 = Timer , Prescale = 8
    Enable Timer1
    On Timer1 Przerwanie_timer1
    Stop Timer1
     Timer1 = 0


    Dim Nadawca As String * 16
    Dim Znak0 As String * 1


    Znak0 = ","

    Nadawca = ""

    Dim Licznik As Integer

    Enable Interrupts
    Enable Int0
    Enable Int1

    Cls


    Do



    Lcd Nadawca

    Wait 1

    Nadawca = ""
    Cls

    Loop


    Rosnace:

    Stop Timer1


     Nadawca = Nadawca + Str(timer1) + Znak0
      Timer1 = 0

    Return



    Opadajace:

    Start Timer1

    Return



     Przerwanie_timer1:

     Stop Timer1
     Lcd "brak zm. sygnalu/end"
     Wait 2
     Return


    w efekcie otrzymuje wynik "15" i na tym sie konczy. Mierzy tylko jedną wartość któa za kazdym wcisnieciem przycisku waha sie +/- 1. Po paru przycisnieciach guzika od pilota wiesza sie i przestaje reagować. Zmiana zakresu pracy timera1 nie wiele pomaga. Czemu nie zczytuje kolejnych wartosci tylko jedną? Gdyby udało mi sie tak zmierzyć cały przebieg sygnału miałbym później prostą sprawe w konfiguracji sygnału na postać 0/1.

    0
  • #6 30 Gru 2008 22:08
    asembler
    Poziom 32  

    A nie szybciej podpatrzyc nalizatorem stanow cyfrowych lub oscyloskopem i w oparciu a przebieg napisac wlasna procedure odbioru?

    0
  • #8 05 Sty 2009 00:45
    asembler
    Poziom 32  

    Ale kazdy chyba ma komputer na ktorym mozna uruchomic analizator np 4 kanalowy

    0
  • #10 05 Sty 2009 20:32
    misiekdg
    Poziom 13  

    Wieża to samsung max 550, pilot ma w sobie układ BU2478-2Z. Próbowałem przy pomocy Timera, co ok 500 us w przerwaniu Timera sprawdzałem stan wejścia sygnałowego od czujnika 0/1. W pętli dodawałem daną wartośc do ciągu znaków. W efekcie otrzymałem "analize" sygnału którą trzeba troszkę dostroić Timerem i wydobyć z tego interesujący nas fragment. Działa to nawet niezle na AtMega8 i 1Mhz zegarze, ale to nie jest zrobione tak jak trzeba, bo przestanie działać przy zmianie zegara i trzeba bedzie się znowu bawić w dostrajanie a to dość czasochłonne. Może ma ktoś pomysł na uniwersalny kod który czytałby każdego pilota i dostrajał się do niego np po bicie startu? Myslałem o połączeniu 2 przerwań INT0 i INT1 z czego jedno uruchamia timer opadającym zboczem a drugi zatrzymuje rosnącym, ale jakoś nie chciało mi to działąś, Timer ruszał ale już sie nie zatrzymywał.

    0
  • #11 05 Sty 2009 21:11
    mirekk36
    Poziom 42  

    misiekdg napisał:
    Może ma ktoś pomysł na uniwersalny kod który czytałby każdego pilota i dostrajał się do niego np po bicie startu?


    sorki, ale może za chwilkę jeszcze zachcesz gwiazgę z nieba hmmm??


    .... coś mocno mylisz pojęcia.

    1. Można zrobić uniwerslanego pilota - albo na zasadzie "uczenia" go nadlatujących sygnałów z klawiszy pilota od którego ma on się "uczyć". I to polega na próbkowaniu sygnału - zapisaniu tych próbek do pamięci - a następnie wyemitowaniu tychże próbek, które mają "udawać" naciśnięcie klawisza oryginalnego pilota. Jak chcesz uniwersalny pomysł - to wykorzystaj scalak z jakiegoś dowolnego zakupionego tzw uniwersalnego pilota. A jak chcesz to sam zrobić to kombinuj dalej, szukaj w necie podobnych rozwiązań skoro sam nie możesz do tego dojść aby móc się potem na nich wzorować. Ten algorytm, który ci powyżej opisałem jest bardzo ogólny ale tak działają piloty uniwersalne i programy, które się uczą. Kiedyś znalazłem w necie nawet program i opis takiego pilota na AVRku, który ze względu na niewielką ilość swojej pamięci EEPROM zapamiętywał tylko kilka klawiszy - tzn się ich uczył. Nie pamiętam stronki ale to był chyba nawet jakiś artykuł z EdW.

    2. Jeśli natomiast chcesz zrobić urządzonko, które potrafi rozpoznawać po Headrze (czyli czasie trwania nagłówka) standard nie tylko kodowania IR ale także pilota ( a jest to możliwe ) to musisz sobie poczytać sporo na temat różnych standardów kodowania a potem spróbować zakodować w procesorze wszystkie rozpoznane piloty z tego linku który ci już wcześniej podawałem:

    http://lirc.sourceforge.net/remotes/

    jak widzisz jest ich mnóstwo, więc twój procek musiałby być chyba co najmniej ATmega128 - chyba, żeby pokusić się o jakieś mocne sparametryzowanie takiej procedury. Też kiedyś o tym myślałem - zrobiłem nawet procedurkę w asemblerze, która autoamtycznie rozpoznaje 3 rodzaje pilotów: RC5, SONY, JVC.

    ale jak zapoznasz się choć z częścią opisów z lirc'a to zobaczysz, że spora część tych opisów jest w trybie RAW - co gigantycznie komplikuje sprawę - zresztą po jakimś czasie dochodzi się do wniosku, że zrobienie urządzenia, które potrafi rozpoznać każdy możliwy wyprodukowany na świecie - kiedyś , teraz i w przyszłości pilot, jest całkowicie bez sensu - no chyba, że tak dla zabawy jak się ma sporo czasu i lubi się robić rzeczy, które i tak później do niczego nie są potrzebne. Ale też w takiej sytuacji dochodzi się do wniosku, że lepiej wrócić do punktu nr.1 czyli zrobić pilota samouczącego się i już ;)

    0