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.

bascom avr i algorytm IR

marcin-k 31 Paź 2008 01:14 2516 1
  • #1 31 Paź 2008 01:14
    marcin-k
    Poziom 15  

    Mam mały problem z programem napisanym w bascomie , mianowicie założenia są takie jest to odbiornik pilota IR na atmega 8 chodzi mi o sam algorytm dekodowania sygnału , który ma dekodować wszystkie rodzaje pilotów obojętnie czy są w standardzie RC5 czy SONY na wyświetlaczu LCD mam mieć wyświetlane umownie wartość jedynek i zer i problem polega na tym że wyświetlacz pokazuje mi jakieś wartości na wyświetlaczu ale obojętnie jaki przycisk wcisnę w pilocie pokazuje mi taką samą wartość na wyświetlaczu wskazania różnią się bardzo nieznacznie jeśli wezmę pilot w innym standardzie to zachowuje się tak samo jak napisałem wyżej z tym ,że pokazuje nieco inne wartości jak poprzednio czyli (kicha) .Program z założenia miał wyglądać coś jak dekoder kodu rc5 z książki Marcina Wiązani z tym ,że ma pokazywać wartości z innych standardów nie chodzi mi o poprawne zdekodowanie sygnału tylko oto żeby wartości wyświetlane się zmieniały (były różne) dla każdego przycisku pilota oraz innego standardu dołączam kod programu.

    Code:


    $regfile = "m8def.dat"
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portb.2 , Db5 = Portb.3 , Db6 = Portb.4 , Db7 = Portb.5 , E = Portb.1 , Rs = Portb.0
    Dim Petla As Word
    Dim Wartosc_1 As Word         'zmienna jedynek
    Dim Wartosc_2 As Word         'zmienna zer

    Declare Sub Przerwanie        '
    Config Pind.2 = Input
    Set Pind.2
    Set Portd.2
    Config Pind.5 = Output
    Set Portd.5                   'leda
    Set Pind.5



    Config Timer0 = Counter , Edge = Falling       ' Rising zbocze opadajace
    'Config Timer0 = Timer , Prescale = 1


    'Tcnt0 = 0                     'wyzeruj zmienna licznika
    On Int0 Przerwanie            'jesli wystapilo przerwanie skocz do tej etykiety
    Enable Int0                   'odblokuj przerwanie taimera0
    Enable Interrupts             'odblokuj globalne przerwania

    Cls                           'czysc wyswietlacz lcd
    Lcd "MARCIN K"
    Wait 1                        'czekaj 1sek
    Cls                           'czysc wyswietlacz lcd



    Do


    Loop
     End
    '///////////////////////////////////////////////////////////////////////////////
    Przerwanie:
    Disable Int0                  'zabron uzywania przerwania int0 na czas obslugi




    Disable Interrupts            'zabron uzywania wogule przerwan
    'Tcnt0 = 0                     'wyzeruj zmienna licznika
           Wartosc_1 = 0          'wyzeruj zmienna jedynki
           Wartosc_2 = 0          'wyzeruj zmienna zera

    For Petla = 0 To 12           'sprawdzaj wejscie  12 razy

          If Pind.2 = 0 Then      'sprawdz czy na wejsciu jest sygnal
          Incr Wartosc_1          'zwieksz zmienna jedynka
          Else
          Incr Wartosc_2
          End If

           'Waitus 10              'czekaj ok 10us
          'If Pind.2 = 1 Then      'sprawdz czy na wejsciu brak sygnalu
          'Incr Wartosc_2          'zwieksz zmienna zer
          'End If
         Waitus 889               'czekaj ok 10us
    Incr Petla                    'zwieksz zmienna petla o 1
    Next Petla
    Cls                           'czysc wyswietlacz lcd
    Lcd "ilosc jed= " ; Wartosc_1
    Lowerline                     'w dolnej lini
    Lcd "ilosc zer= " ; Wartosc_2
    'Wait 1                        'czekaj 1sek
    Reset Portd.5                 'zapal lede
    Waitms 500                    'czekaj 500ms
    Set Portd.5                   'zgas diode
    Enable Int0                   'zezwalaj ponownie uzywania przerwania int0
    Enable Interrupts             'zezwalaj ponownie uzywania wogule przerwan
    Return

    0 1
  • #2 31 Paź 2008 03:55
    mirekk36
    Poziom 42  

    marcin-k napisał:
    Mam mały problem z programem napisanym w bascomie


    .... ja myślę, że masz duuuży problem, dlaczego?

    1. bo po pierwsze w ogóle nie zapoznałeś się ze standardami kodowania IR dla różnych pilotów (choćby dla RC5 i SONY o których wspominasz)

    2. po drugie - proponuję najpierw poćwiczyć pisanie w Bascomie prostszych programów aby nabrać trochę doświadczenia , bo na podstawie tego co napisałeś to można się tylko przeżegnać lewą nogą i położyć. Ciężko nawet z tym polemizować i coś podpowiadać. A nie piszę tego zgryźliwie ... sam tak kiedyś na początku nieświadomie próbowałem zaczynać... więc wiem jak to jest

    .... odnośnie punktu pierwszego polecam najpierw o wiele dokładniejsze zapoznanie się nawet z lekturą, którą posiadasz - pisałeś coś o książce M.Wiązani - ale chyba przeczytałeś ją bardzo "po łebkach". Poza tym polecam sławne i często już wspominane na elektrodzie linki:

    http://www.ustr.net/infrared/index.shtml
    http://www.sbprojects.com/knowledge/ir/sirc.htm
    http://www.sbprojects.com/knowledge/ir/rc5.htm

    bo to na prawdę dobre podstawy i nie jest to trudne tylko trzeba dobrze poczytać i zaskoczyć....

    .... odnośnie punktu drugiego, to zapamiętaj sobie, że przerwań, żadnych przerwań w zasadzie nigdy się nie używa tak jak ty to wyczyniasz - ale rozumiem, że to z powodu właśnie na razie tylko braku praktyki. Programy, przerwań powinny być jak najkrótsze, nie należy tam nigdy wciskać procedur do bezpośredniego wyświetlania itp ... można to spokojnie robić w pętli głównej. U ciebie o tyle jest wszystko na głowie, że wszystko właśnie co powinno być w pętli głównej wrzuciłeś do przerwania i tym samym "zabiłeś" ideę samego przerwania ;)

    .... tak bardzo ogólnie odnośnie standardów IR to musisz zrozumieć, że różne piloty (czytaj firmy) stosują różne standardy. Generalnie można wyróżnić 3 standardy samego sposobu kodowania:

    - kodowanie bifazowe (np RC5 - firma Philips)
    - kodowanie typu PULSE
    - kodowanie typu SPACE

    każdy z nich mocno różni się od siebie i chociażby z tego powodu nie odczytasz w takim jakby nawet trybie "raw" o którym piszesz swoich zer i jedynek - różnych w zależności od naciśniętego klawisza.

    nie zrobisz tego w taki sposób jaki próbowałeś do tego podejść nie tylko ze względu na różnicę w standardach kodowania ale i ze względu na różne formaty danych przesyłanych przez różne piloty wykorzystujące nawet ten sam typ kodowania.

    Np jeden pilot nadający w standardzie SPACE będzie miał header o długości 2,4ms a inny o długości 8ms i już ci się wszystko rozjedzie. Ale to nie wszystko - bo np jeden będzie przesyłał 16bitową ramkę a inny 14 bitową. Do tego jeden może nadawać tzw pakiet "pre-bits" też 16 bitów zawsze taki sam i masz po ptakach bez indywiduwalnego podejścia do zdekodowania każdego standardu (pilota) indywidualnie.

    oczywiście można to zrobić i to także w Bascomie bez najmniejszego problemu ale jak mówię trzeba " troszkę" się tego wszystkiego poduczyć.

    Generalnie rozpoznawanie nadawanego standardu można próbować robić w oparciu o długość właśnie nadawanego Headera. Ale też nie wyjdzie ta metoda dla wszystkich standardów jakie na świecie istnieją ;) można natomiast na pewno zrobić sobie automatyczne rozpoznawanie pilota i odczyt klawiszy biorąc pod uwagę np RC5 (Philips) , SIRC (Sony) czy JVC Każdy z nich nadaje z użyciem innego sposobu kodowania - Biphase, Space i Pulse...... Sam coś takiego z powodzeniem swego czasu robiłem chociaż wtedy w asemblerze.

    Teraz zaprzęgając jednak do pracy wejście ICP procka oraz stosowne przerwanie Timera1 i mechanizm Capture spokojnie można byłoby to oprogramować w dowolnym języku asm, C czy Bascom

    na koniec - jeśli będzie cię nadal interesował temat dekodowania IR, a to bardzo ciekawy temat to polecam też ten żelazny link, który zwykle jest potrzebny gdy już się w tym mocno siedzi ;)

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

    0