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

Odbiór i nadawanie sygnału podczerwieni

07 Maj 2008 23:22 4313 27
  • Poziom 11  
    Witam
    Mam problem związany z odbieraniem sygnału podczerwieni. Ale może zacznę od początku.

    Działam na układzie ZL2AVR, jest tam procek Atmega8 jbc. Zbudowałem sobie układ nadajnika na podstawie książki Marcina Wiązani "Programowanie mikrokontrolerów AVR w języku BASCOM". Kod programu wziąłem z helpa BASCOM AVR.

    Program do odbioru mam z ww. książki. Starałem się to jakoś połączyć ale tak czy siak, bez względu czy jest podłączony nadajnik czy nie: Address wyświetla się 255 a Command 127.

    Jak sobie z tym poradzić? Mógłby ktoś pomóc?

    Z elektroniką nie miałem zbyt wiele styczności, wręcz jeśli mam być szczery to zacząłem mieć ową styczność jakiś miesiąc temu :)

    P.s. Nadajnik działa bo sprawdzałem przez aparat.
  • RenexRenex
  • Poziom 42  
    Witam,

    a myślisz, że wszyscy wiedzą albo będzie im się chciało szukać schematu jakiegoś tam ZL2AVR ?

    rozumiem, że zaczynasz przygodę z elektroniką i prockami - to super, ale ...

    naucz się też zadawać pytania na forum, jeśli naprawdę oczekujesz pomocy

    pokaż fragment schematu tego co spłodziłeś, pokaż fragmenty kodu o których mówisz to będzie można coś podpowiedzieć a nie odsyłasz ludzi do szukania schematów twoich urządzeń i przykładów z książki. Jeśli wszystko zrobiłeś z książki dobrze to nie ma bata musi działać - a jeśli coś źle przepisałeś to i źle działa - ale co tu ci powiedzieć, skoro nie widać co napisałeś (przepisałeś)

    pozdr
  • Poziom 11  
    To jest ten kod:

    Code:
    $regfile = "m8def.dat"
    
    $crystal = 8000000

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

    Config Rc5 = Pind.2
    Config Pinb.1 = Output

    Dim Address As Byte , Command As Byte , Togbit As Byte
    Enable Interrupts


    Command = 12                                              'kod włącz/wyłącz
    Togbit = 0                                                  'wyzeruj toggle bit
    Address = 0

    Do
       Cls
       Waitms 500
       Rc5send Togbit , Address, Command

       Waitms 100

       Getrc5(address , Command)
       Command = Command And &B01111111
       Cls
       Lcd "Adres: " ; Address
       Lowerline
       Lcd "Komenda: " ; Command

    Loop

    End


    Schemat nadajnika:
    Odbiór i nadawanie sygnału podczerwieni

    oraz odbiornika wbudowanego w płytkę:

    Odbiór i nadawanie sygnału podczerwieni
  • Poziom 42  
    odnośnie kodu - nie wiem czy dobrze rozumiem - czy ty chcesz w tym samym procku nadawać i jednocześnie odbierać kod RC5 - tak jak to widać w listingu który załączyłeś?????

    Code:
    Command = 12                                              'kod włącz/wyłącz 
    
    Togbit = 0                                                  'wyzeruj toggle bit
    Address = 0

    Do
       Cls
       Waitms 500
       Rc5send Togbit , Address, Command

       Waitms 100

       Getrc5(address , Command)
       Command = Command And &B01111111
       Cls
       Lcd "Adres: " ; Address
       Lowerline
       Lcd "Komenda: " ; Command

    Loop


    jeśli na początku pętli za pomocą polecenia Rc5send wysyłasz jakiś kod w twoim przypadku Command = 12 potem robisz przerwę waitms 100 - to ten kod po tej przerwie już dawno sobie poleciał, poodbijał się od ścian i zniknął a ty go wtedy chcesz załapać jeszcze poleceniem Getrc5 ????

    raczej wątpię aby tak było w jakiejś książce. Generalnie zacząłeś dobrze tylko, że na jednym procku zrób sobie nadajnik i w pętli pozostaw tylko to:

    Code:
    do
    
       Command = 12                                              'kod włącz/wyłącz
       Togbit = 0                                                  'wyzeruj toggle bit   
       Address = 0
       
       Rc5send Togbit , Address, Command

       Waitms 500
    Loop


    wtedy ten procek będzie co pół sekundy nadawał ci cały czas ten sam kod (command = 12)

    a w drugim procku wpisz sobie w pętli tylko odbiór:

    Code:
    Do 
    

       Getrc5(address , Command)
       if Address <> 255 then
         Command = Command And &B01111111
         Cls
         Lcd "Adres: " ; Address
         Lowerline
         Lcd "Komenda: " ; Command
       end if

    Loop


    i wtedy zobaczysz, że wszystko przylatuje ok
  • Poziom 11  
    Obrazki poprawione...a co do kodu to właśnie nie wiem nawet czy tak można, dlatego chciałem zapytać jak to w ogóle zrobić
  • Poziom 38  
    Obrazki ładujemy na elke... nie na tymczasowe... będzie krzyk modów...
  • RenexRenex
  • Poziom 42  
    przeczytaj jeszcze raz mój post powyżej, bo pisałem go troszkę i nie zauważyłeś może w międzyczasie co ci podpowiedziałem.
  • Poziom 11  
    Ok, dzięki za rady, rano się za to wezmę bo teraz nie mam części, ale tak w ogóle to czemu zawsze tak wyskakiwał adres 255?
  • Pomocny post
    Poziom 42  
    to prawidłowa reakcja - tak się dzieje, gdy polecenie Getrc5 nic nie odebrało. Zobacz w kodzie dla odbiornika dodałem ci tam jeszcze polecenie:

    if Address <> 255 then
    .... tu wyświetlenie odebranych danych
    end if

    czyli na LCD wyświetlą się tylko wtedy dane gdy przyleci coś prawidłowego, a bez tego if-c co pół sekundy miałbyś odświeżany LCD i ciągle byłoby 255 wtedy gdy nadajnik akurat nic nie nadaje.

    teraz jaśniej?
  • Poziom 11  
    No raczej :)
    Ale tak przy okazji zapytam jeszcze dlaczego jest takie coś?
    Code:
    Command = Command And &B01111111 

    Da się to jakoś po polsku wytłumaczyć również? :)
  • Poziom 42  
    oczywiście - ale najpierw proponowałbym ci zapoznać się bliżej ze standardem kodowania RC5 jeśli chcesz to po polsku zrozumieć.

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

    czyli w RC5 jak już teraz po tej lekturze wiesz występuje za każdym naciśnięciem klawisza na pilocie odwrotny stan przesyłanego bitu o nazwie Toggle. Jest on przekazywany przez polecenie Getrc5 jako najstarszy bit w Command. I dlatego maskujemy go - czyli zerujemy za pomocą polecenia AND tak aby zawsze miał wartość 0 - bo w praktyce nie będzie nam do niczego potrzebny. A gdyby go nie zamaskować to za każdym naciśnięciem klawisza np "1" na pilocie czy wysłaniem kodu 1 - miałbyś raz Command = 1 a drugi raz Command = 129 i tak na zmianę. Po to go maskujemy. No chyba, że mamy jakiś super pomysł jak go wykorzystać do własnych celów to można go stamtąd właśnie "wyjąć" i coś z nim zrobić w kodzie
  • Poziom 19  
    Ja bym to zrobił inaczej a mianowicie żeby polecenie getrc5 nie było wywoływane wtedy kiedy nie ma sygnału bo wtedy jest 255
    mozna wykorzystać to że odbiornik RC5 jest podpięty INT0

    Code:
    $regfile = "m8def.dat" 
    
    $crystal = 8000000

    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
    On INT0 Odbior
    Enable INT0
    Config Rc5 = Pind.2
    Config Pinb.1 = Output

    Dim Address As Byte , Command As Byte , Togbit As Byte
    Enable Interrupts


    Command = 12                                                                         
    Address = 0

    Do 
       Home
       Lcd "Adres: " ; Address
       Lowerline
       Lcd "Komenda: " ; Command
    Loop

    Odbior:
     Getrc5(Address , Command)
     Command = Command And &B01111111
    return

    End


    Program jest o wiele bardziej przejrzysty i polecenie GETRC5 jest używane tylko wtedy gdy jest sygnał z nadajnika :D
  • Poziom 42  
    grysek -> oczywiście, że tak można - jak najbardziej tylko, jeszcze trzeba ustawić w jaki sposób ma być wyzwalane przerwanie - najlepiej ustawić na zbocze opadające czyli falling.

    po drugie takie rozwiązanie jest dobre ale nie zabardzo nadaje się do rozwiązań gdzie wykorzystuje się multipleksowanie przy wyświetlaczach LED. Wtedy zwykle powoduje to migotanie dosyć widoczne wyświetlacza z tego powodu, że dekodowanie RC5 "troszkę" trwa i jeśli dzieje się to w przerwaniu to zakłóca na "chwileczkę" przerwanie w którym następuje multipleksowanie cyfr na wyświetlaczu.

    jednak dla innych celów jest jak najbardziej dobre
  • Poziom 19  
    mirekk36 napisał:
    po drugie takie rozwiązanie jest dobre ale nie zabardzo nadaje się do rozwiązań gdzie wykorzystuje się multipleksowanie przy wyświetlaczach LED


    Lecz na szczęście kolega ma w schemacie wyświetlacz LCD tak więc moje rozwiązanie jest najbardziej trafne w tym przypadku :D

    Aha i rzeczywiście zapomniałem dodać:
    Code:
    Config INT0 = FALLING

    przed
    Code:
    Enable INT0


    Tom_x - wysłałem na PW
  • Poziom 11  
    Hmm, program by mirekk36 bez zmian...tzn odbiór nie działa. A program by grysek też w sumie nie działa, z tym że jak się przystawi nadajnik to zatrzymuje się odświeżanie na wyświetlaczu...tak jakby coś niby reagowało...ale nie wiem co...

    (P.s. Hura, działa zlutowany nadajnik :P Czyli mam na osobnej płytce już nadajnik a na tej zl2avr mam odbiornik jbc.)
  • Poziom 19  
    Napisz nam, co konkretnie się dzieje??

    Pozdrawiam :D
  • Poziom 11  
    No właśnie bez zmian :/ adres wyświetla 255 a command 127, nie mam pojęcia już gdzie tkwi ten błąd...
  • Poziom 42  
    to teraz pokaż dokładnie swój kod nadajnika i oddzielnie kod odbiornika - żeby coś ci dalej pomóc

    jaki masz odbiornik podczerwieni? i do którego pinu podpięty?
  • Poziom 11  
    Ok, a więc różnych już próbowałem ale aktualnie wgrany jest taki kod:
    odbiornik:
    Code:
    $regfile = "m8def.dat"
    
    $crystal = 8000000

    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
    On Int0 Odbior
    Enable Int0
    Config Rc5 = Pind.2
    Config Int0 = Falling

    Dim Address As Byte , Command As Byte , Togbit As Byte
    Enable Interrupts

    Do
       Home
       Lcd "Adres: " ; Address
       Lowerline
       Lcd "Komenda: " ; Command
    Loop

    Odbior:
     Disable Int0
     Enable Interrupts
     Getrc5(address , Command)
     Command = Command And &B01111111
     Waitms 100
     Enable Int0
    Return


    a nadajnik:
    Code:
    $sim
    
    $regfile = "m8def.dat"
    $crystal = 8000000


    Command = 12
    Togbit = 0
    Address = 0

    Do
       Rc5send Togbit , Address , Command
    Loop
    End


    A odbiornik podczerwieni w schemacie zamieszczonym w jednym z pierwszych postów to TFMS5630

    ...no i podpięty jest do pinu PB1
    Schemat płytki ==> http://www.btc.pl/pdf/zl2avr.pdf
  • Poziom 42  
    po pierwsze wywal w odbiorniku z przerwania Odbior: (i nigdy nie stosuj w przerwaniach poleceń) wait czy waitms!

    na końcu tegoż przerwania daj jeszcze Enable Interrupts

    jeśli chodzi o nadajnik to tu z kolei - masz tylko pętlę główną no i nie dałeś żadnego oczekiwania po nadaniu kodu ? dlaczego? Tu wstaw powiedzmy wait 1 czyli pętla nada kod RC5 i poczeka sekundę i znowu i znowu

    ... kolejna rzecz - napisałeś jaki masz odbiornik podczerwieni i dobry ale napisałeś że podpięty jest do pinu PB1?? ----> a jak to się ma do deklaracji w odbiorniku ???

    Config Rc5 = Pind.2

    nijak - patrz troszkę co robisz :)
  • Poziom 11  
    Oj sorki, przejęzyczyłem się...odbiornik podpinałem do PD2...A po zamianach w programie bez zmian :/ na początku adres i komenda "0" a jak sie zbliży nadajnik to adres 255 a komenda 127. Czasami dochodzą jeszcze jakieś śmieci na LCD.

    Ale tak jeszcze porozmawiałem trochę z fachowcem i parę spraw doszło. Mianowicie to RC5 to podchwytliwe bywa, prawda? Że lepiej niby jakoś nadawać sygnał prostokątny zwyczajnie...tylko jak?

    Co powiecie o tym?

    A i jeszcze mówił coś o częstotliwościach, że mogą się nie zgadzać jakoś
  • Poziom 24  
    Tom_x napisał:
    to RC5 to podchwytliwe bywa, prawda?

    Co masz dokladnie na mysli?

    Tom_x napisał:
    A i jeszcze mówił coś o częstotliwościach, że mogą się nie zgadzać jakoś


    Przykladowo odbiornik TFMS5360 pracuje na 36kHz.
  • Poziom 42  
    Tom_x napisał:
    Oj sorki, przejęzyczyłem się...odbiornik podpinałem do PD2...A po zamianach w programie bez zmian :/ na początku adres i komenda "0" a jak sie zbliży nadajnik to adres 255 a komenda 127. Czasami dochodzą jeszcze jakieś śmieci na LCD


    jesteś o tyle nieugięty w niechęci niesienia pomocy samemu sobie, że czuję, iż prędzej polegniesz na polu walki z RC5 i prockiem niż coś zrobisz jeśli nadal tak będziesz działał. Zobacz sobie inne tematy, jak ktoś się dopytuje o szczegóły to potrafi wklejać co chwilę nawet cały kod aby skorzystać z porad ludzi, którzy robili to o co się pyta setki razy i mają w tym doświadczenie. A ty mylisz się przy wklejaniu kodu, a potem nawet nie pokazujesz niby tego poprawionego no i znowu robisz zgaduj zgadulę co może być u ciebie źle.... można stracić cierpliwość ;) ... no ale może się nauczysz jeszcze zadawać pytania i poprawności a co najważniejsze sprawdzania 10razy po sobie tego co piszesz nie tylko tutaj przy wklejaniu ale i w samym swoim kodzie - bo taki nieład pozwala tylko przypuszczać co jest 100%towym powodem tego, że ci się to nie udaje (bałagan właśnie)


    Tom_x napisał:
    Ale tak jeszcze porozmawiałem trochę z fachowcem i parę spraw doszło. Mianowicie to RC5 to podchwytliwe bywa, prawda? Że lepiej niby jakoś nadawać sygnał prostokątny zwyczajnie...tylko jak?


    a ty i twój fachowiec uważacie że co? , że polecenie Sendrc5 w Bascomie nadaje sygnał sinusoidalny? trójkątny? czy może jakiś kolisto-cosinusoidalny? - sorry za tę ironię - ale w przypadku czystego procka i generowania na jego wyjściu jakiegokolwiek sygnału cyfrowego ciężko go podejżewać o wygenerowanie czegoś innego niż dokładny sygnał protokątny. Więc proponuję zmienić fachowca na innego bo ten jest może z programu USTERKA w TVN. Tym bardziej, że powiada o zwyczajnym nadawaniu sygnału - tzn co? jakimis metodami naturalnymi? bez elektroniki może? - to już trąci psychotroniką (znowu przepraszam za ironię ale nie mogę się powstrzymać jak słyszę takie bzdury)


    Tom_x napisał:

    A i jeszcze mówił coś o częstotliwościach, że mogą się nie zgadzać jakoś


    taaak mogą się nie zgadzać - tylko co poeta miał na myśli hmmm? może to co słusznie zauważył mój przedmówca, który zwrócił uwagę, że masz odbiornik może na nieco inną częstotliwość niż zalecaną dla RC5 o ile dobrze podałeś jego symbol w ogóle. Z drugiej strony sam przy różnych i wielu juz próbach oprogramowywania transmisji IR zarówno w Bascomie i asemblerze zauważyłem, nie tylko ja, że filtry w tych odbiornikach są takie, że z niedużej odległości i przy silnym sygnale nadawanym działają w bardzo szerokim zakresie więc to w twoim przypadku nie powinno aż tak przeszkadzać. Jednak możesz sobie dla pewności sprawić odbiornik na 36KHz

    z kolejnej strony - hmmm częstotliwości mogą się nie zgadzać - i tu ma fachowiec rację niechąco - chociaż może nie wie zabardzo w czym rzecz ponieważ RC5 jak i inne standardy kodowania IR odporne są na niewielkie różnice częstotliwości pomiędzy sygnałem nadawanym i układem odbiorczym. Innymi słowy mówiąc mają duży stopień tolerancji a wiesz dzięki czemu - ano dzięki własnie sposobowi kodowania w przypadku akurat RC5 bifazowego - co pozwala korygować te różnice pomiędzy częstotliwością starego zjechanego pilota z rozklekotaną elektroniką a nowego np TV czy odwrotnie - po to wymyślono takie standardy. Więc niech fachowiec nie odkrywa ameryki i nie wyważa głową drzwi....

    .... a już poza konkuresem - czy ty kolego uważasz, że jako pierwszy na świecie użyłeś i odrazu wykryłeś poważny błąd w działaniach funkcji Sendrc5 i Getrc5 w języku Bascom ???? ;) ..... eeeeh no przydałoby się nawet początkującemu troszkę więcej samokrytyki i szukania błędów u siebie a nie nie producentów procków czy standardów kodowania istniejących na świecie czasem dłużej niż sam autor tekstów.

    pozdrawiam, i zapraszam do przedstawienie swoich obecnych kodów jednej i drugiej procedury. Dokładnie tym razem postaraj się. I ew jeszcze wyjmij do testów polecenie Getrc5 z procedury przerwania tylko wstaw je poprostu w pętli głównej tak jak podałem w jednym z moich sposobów na samym początku OK? po co wprowadzać dodatkowe warunki sprzyjające problemom w kodzie jak przerwanie INT0 jeśli zależy ci na początku tylko na złapaniu samej funkcjonalności - a potem jak ci zadziała to po kolei możesz próbować dalej ...
  • Poziom 11  
    JmL(TM) napisał:
    Tom_x napisał:
    to RC5 to podchwytliwe bywa, prawda?

    Co masz dokladnie na mysli?

    No ja dokładnie nie wiem ale coś z tymi częstotliwościami oraz z tym, że sygnał może się odbić od ścian i wrócić (czyli niby nie było przerwy w odbiorze chociaż tak naprawdę była)

    A co do mirekk36 to drogi kolego może źle ująłem parę spraw i niepotrzebnie się jak widać na nich skupiasz.

    Po pierwsze ten fachowiec o którym mowa mimo wszystko sądzę że jednak jest obeznany w temacie tylko może po prostu ja źle ująłem to co on miał na myśli, nie pamiętam jak to było z kształtem sygnału.

    Po drugie projekt robię z kolegą i tak się składa że płytka jest u niego...i akurat nie mogę zawsze testować tych programów. Przekazuję tylko informacje od niego. Jak np teraz nie mam tych programów u siebie i nie mogę ich wkleić choćbym bardzo chciał

    Po trzecie to chyba się przerzucę na nadawanie sygnału laserem bo ta podczerwień to męcząca się robi.

    Po czwarte może dla Ciebie niektóre rzeczy są oczywiste, bardzo mnie to cieszy, nie ma to jak być dobrze obeznanym w temacie, ale z elektroniką mam do czynienia jakieś parę tygodni w związku z tym projektem więc nawet niby oczywiste rzeczy są dla mnie nowością czasami

    Dziękuję wszystkim za chęć pomocy ale czas goni i chyba wezmę się za ten laser bo tam sprawa raczej prostsza jest...do podczerwieni może kiedyś wrócę. Miłego wieczorku :)
  • Poziom 32  
    Cytat:
    Po trzecie to chyba się przerzucę na nadawanie sygnału laserem bo ta podczerwień to męcząca się robi.


    Wydaje mi się że nie ma takiej potrzeby. Bo jest ci potrzebny jedynie:
    - procek np. ATTINY2313
    - źródło zasilania
    - rezystor
    - dioda IR nadawcza
    - Program w bascom to kilka liniejk kodu

    Powiem Ci tak od siebie że ostatnio nawet coś takiego sklecilem na kawałku płytki uniwersalnej. Teraz spokojnie zmieniam sobie kanały w TV ;).
  • Poziom 24  
    Jesli nadal masz taki kod w nadajniku:

    Code:
    $sim     <<< USUN
    
    $regfile = "m8def.dat"
    $crystal = 8000000


    Command = 12
    Togbit = 0
    Address = 0

    Do
       Rc5send Togbit , Address , Command
       Wait 1 <<< DODAJ jak sugerowal mirekk36
    Loop
    End


    To nie ma prawa nie dzialac!!! Zarowno uklad jak i program sa tak proste ze prostsze juz byc nie moga... w koncu to Bascom! ;)
    Sprawdz wszystkie polaczenie 3x Sam kiedys robilem dokladnie ten sam przyklad i dzialal od pierwszego uruchomienia...
  • Poziom 19  
    Niestety problem tkwi w tym że kolega buduje nadajnik i odbiornik... a niedziała odbiornik :cry:
    Budowałem podobny układ u siebie na płytce stykowej i rzeczywiście nie działa jak powinien
  • Poziom 42  
    dziwne bo tak się składa, że kolega powyżej JmL(TM) , także ja - ale i wiele innych osób na całym świecie robiło dokładnie to samo i u wszystkich działa bez mrugniecia oka - proponuję z tego wyciągać odpowiednie wnioski. Tzn , że to musi działać a jeśli nie działa to coś źle połączyłem, polutowałem czy zaprogramowałem albo mam uszkodzone fizycznie jakieś części.

    a nie domyślanie się, że transmisja IR w Bascomie szczególnie jest jakaś trudna, ciężka i nie da rady tego zrobić, albo że Bascom ma wady, albo że firma ATMEL źle wyprodukowała procka itp itp

    mirekk36 napisał:

    czuję, iż prędzej polegniesz na polu walki z RC5 i prockiem

    chyba prorokiem byłem - bo...
    Tom_x napisał:
    bo ta podczerwień to męcząca się robi.


    ... tak więc kolego grysek, jeśli ktoś przy tak prostych rzeczach załamuje ręce to jeszcze gorzej będzie przy choć odrobinę bardziej skomplikowanych - zapewniam