logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[Atmega8L][Bascom] RC5-nieprawidłowy odbiór

Overclocker 04 Wrz 2009 18:30 3535 24
  • #1 6980090
    Overclocker
    Poziom 13  
    Witam, chciałem się podzielić z szanownym gronem moim problemem, który napotkałem, gdy chce odebrać coś w RC5. Napisałem (a właściwie to skopiowałem z helpa) program do odbioru rc5, i tu pojawia się problem, ponieważ na wyświetlaczu cały czas mam wartość 255 255 a w drugiej lini pomocnicze 0 0... (jest to tylko test) nieważne, czy podłącze pin do masy, czy do + (prymitywny test :)) używam odbiornika TFMS5360 podłączony do zasilania (4,5V) przez potencjometr 1k (myślałem, ze wartość rezystora jest z noty katalogowej nie jest dokładna - 220ohm, dlatego mam regulacje:))

    czasami coś z tego pilota zostanie odebrane ( zawsze to samo) adr 31 i comm191 ale to tak 1/50
    Napięcie na wyjściu czujnika zmienia się o ok0,2V gdy w niego przyświecę z pilota
    I to chyba było by tyle, nie mam żadnego pomysłu, próbowałem wzmocnić sygnał (napięcie) stosowałem darlingtony ale to też nie pomogło (nie wysterowało tranzystora) a wzmacniacza operacyjnego nie potrafiłem podpiąć :)
    Jeśli ktoś miałby jakieś sugestie to proszę śmiało mówić :D
    niżej kod
    
    $regfile = "m8def.DAT"                                      'deklaracja procesora, w tym wypadku Atmega8
    $crystal = 8000000                                          'deklaracja cześtotlwiości pracy
    
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portd.7 , Db6 = Portd.6 , Db7 = Portd.5 , E = Portd.3 , Rs = Portd.4
    
    
    Config Rc5 = Pinc.3
    Enable Timer0
    
    Enable Interrupts
    
    Dim Adr As Word
    Dim Comm As Word
    Dim Adrr As Word
    Dim Commm As Word
    
    Do
    
      Getrc5(adr , Comm)
    
    
     If Adr < 254 Then
     Adrr = Adr
    
     End If
     If Comm < 254 Then
     Commm = Comm
     End If
    
    
         Cls
         Lcd Adr ; Comm
         Lowerline
         Lcd Adrr ; "  " ; Commm;
         If Pinc.3 = 0 Then
          Lcd "  0"
          End If
      Waitms 100
    Loop
    End
    


    Poprawiłem tytuł - regulamin p.11.1
    [zumek]
  • #2 6980276
    marenc
    Poziom 24  
    Daj schemat... masz dużego elektrolita na zasilaniu zaraz przy odbiorniku?
  • #3 6980318
    Overclocker
    Poziom 13  
    elektrolit mam 220uF, nie mam żadnego ceramika. zaraz przy pinach procesora nie widziałem potrzeby dawać przy odbiorniku bo to 1cm dalej przewodami poprowadzonymi od kondensatora. zasilanie to 4,5V (3xAA) caly układ bierze 10mA (jest tam jeszcze eeprom i ds18b20) baterie wymieniłem 2h temu. a schemat... nic nowego nie wymyśliłem, narysowałem go przed chwilą na podstawie noty

    [Atmega8L][Bascom] RC5-nieprawidłowy odbiór
  • Pomocny post
    #4 6981047
    mirekk36
    Poziom 42  
    po pierwsze, z jakiego ty helpa wziąłeś kod do testowania? chyba z helpa z kosmosu - bo na pewno nie wygląda to na kod z helpa Bascoma

    
    Getrc5(address , Command)
    
    If Address = 0 Then
        'clear the toggle bit
        'the toggle bit toggles on each new received command
        'toggle bit is bit 7. Extended RC5 bit is in bit 6
    
        Command = Command And &B01111111
    
        Print Address ; "  " ; Command
    
    End If
    


    a ty wymyślasz i modzisz coś tym kodzie w ogóle bez sensu. Oczywiście zamiast Print możesz sobie użyć LCD

    ..... po drugie .... kurczę zastanawiam się skąd ty wziąłeś taki schemat podłączenia odbiornika TFMS ???? matko boska - a do tego jeszcze piszesz że z noty katalogowej PDF.... toż jak by autor tej noty zobaczył co ty zrobiłeś na jej podstawie to by się przeżegnał lewą nogą i to jeszcze na plecach ;)

    ..... do testów to możesz podłączyć bezpośrednio VCC czyli +5V do jednej nogi odbiornika, GND do drugiej nogi - a trzecią czyli wyjście - podłączyć wprost do pinu procesora. Jednak dobrze by było dać rezystor np 10K pomiędzy tą nogą wyjściową odbiornika a VCC (czyli zrobić tzw pullup do VCC)

    natomiast twój pomysł z potencjometrem to już kuriozum tak samo jak próby wzmacniania sygnału przez tranzystory , darlingtony a jeszcze jak byś umiał zrobić to na wzm.operacyjnym to i jego byś tam jeszcze dorzucił - zgroza ;)

    tak dla twojej wiedzy i zrozumienia:

    w nocie masz podłączone zasilanie do odbiornika przez rezystorek np 220R - ale jest tam też wyraźnie narysowany kondensator elektrolityczny ok 4,7uF który jest od nogi zasilania dołączony do GND. Ten układ - rezystor plus mały kondensator elektrolityczny ale przy nodze odbiornika przed rezystorem który idzie do VCC - jest tylko po to aby zredukować możliwość występowania zakłóceń w trakcie odbioru. Dodam, że rezystor możesz dać od ok 100R do 330R i z każdą wartością będzie to działało tak samo dobrze - a potencjometr to wywal i zapomnij o takim rozwiązaniu - tylko nie zapomnij o małym kondku elektrolitycznym przy nodze zasilania - jeśli już dajesz ten rezystor


    ...... jak poprawnie wykonasz to co opisałem w tych 2 uwagach - to zobaczysz że wszystko ci ruszy - a dodatkowo na przyszłość będziesz wiedział - po co jest ten rezystor ;)


    ..... aha i nie daje się nigdy tak dużych elektrolitów jak 220uF przy nogach procka. najwyżej coś ok 10uF może 47uF - max 100uF - nie więcej.

    poza tym daje się zawsze przy nogach zasilania każdego procka - kondensator ceramiczny 100nF. Jak będziesz się trzymał tej zasady to nie zginiesz ;)
  • #5 6981280
    Overclocker
    Poziom 13  
    Na początku dzięki na wyczerpującą odpowiedź :)
    Co do schematu, to napisałem, że narysowałem go na podstawie noty : http://www.datasheetcatalog.org/datasheet/Temic/mXyzwrzq.pdf , różni się tylko kondensatorem i potencjometrem.
    Naprawdę siedziałem nad tym dobre kilka godzin próbowałem tak jak orginalnie w helpie jest, ale po tych kombinacjach pojawiło się przynajmniej cokolwiek 1/50 ale zawsze coś :D
    używałem jeszcze SFH5110-36 ale było to samo, wyciągnąłem też z jakiegoś telewizora, ale nie wiedziałem jak ma wyprowadzenia, wiec międzyczasie mógł się zepsuć :D

    dobra teraz zmieniłem :
    -rezystor 220ohm
    -kondensator na nogach odbiornika 10uF nie mialem innego
    -kondensator przy nogach uC 10uF i 100nF
    -rezystor podciągający 10k (on już był)
    nowy kod (teraz już całkiem z helpa)

    
    
    $regfile = "m8def.dat"                                      ' specify the used micro
    
    $crystal = 8000000
                                                               ' used crystal frequency
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portd.7 , Db6 = Portd.6 , Db7 = Portd.5 , E = Portd.3 , Rs = Portd.4
    $baud = 19200                                               ' use baud rate
    
    $hwstack = 32                                               ' default use 32 for the hardware stack
    
    $swstack = 10                                               ' default use 10 for the SW stack
    
    $framesize = 40                                             ' default use 40 for the frame space
    
    
    
    'use byte library for smaller code
    
    '$lib "mcsbyte.lbx"
    
    
    
    'This example shows how to decode RC5 remote control signals
    
    'with a SFH506-35 IR receiver.
    
    
    
    'Connect to input to PIND.2 for this example
    
    'The GETRC5 function uses TIMER0 and the TIMER0 interrupt.
    
    'The TIMER0 settings are restored however so only the interrupt can not
    
    'be used anymore for other tasks
    
    
    
    
    
    'tell the compiler which pin we want to use for the receiver input
    
    
    
    Config Rc5 = Pinc.3
    
    
    
    'the interrupt routine is inserted automatic but we need to make it occur
    
    'so enable the interrupts
    
    Enable Interrupts
    
    
    
    'reserve space for variables
    
    Dim Address As Byte , Command As Byte
    cls
    Lcd "Waiting for RC5..."
    
    
    
    Do
    
      'now check if a key on the remote is pressed
    
      'Note that at startup all pins are set for INPUT
    
      'so we dont set the direction here
    
      'If the pins is used for other input just unremark the next line
    
      'Config Pind.2 = Input
    
      Getrc5(address , Command)
    
    
    
      'we check for the TV address and that is 0
    
      If Address = 0 Then
    
         'clear the toggle bit
    
         'the toggle bit toggles on each new received command
    
         'toggle bit is bit 7. Extended RC5 bit is in bit 6
    
         Command = Command And &B01111111
         Cls
         Lcd Address ; "  " ; Command
    
      End If
    
    Loop
    
    End
    
    


    układ 0 reakcji, napięcie na wyjściu czujnika:
    -bez rezystora podciągającego - z 4,22v do 3,84V (względem masy)
    -z rezystorem podciągającym - z 4,75v do 4,33v

    napięcie bezpośrednio na baterii 4,82v
    napięcie na czujniku (za rezystorem) 4,79
    dzięki temu potencjometrowi spadało napięcie na wyjściu i mogłem ostawić je tak, ze było trochę większe od progu przełączenia ( do tego służyło mi to 0 co pojawiało się na LCD w stanie niskim pinb.3) i może dlatego czasami zadziałało tylko zawsze tak samo.
    Mam nadzieję że ma ktoś jeszcze jakąś propozycję, dlaczego to nie działa :)
    testowałem już wszystkie piloty w domu :D

    dodam jeszcze, że oscyloskopu nie mam, a dostęp będę miał dopiero za tydzień,
  • #6 6981448
    mirekk36
    Poziom 42  
    Kolego - po co ty wciąż mierzysz te napięcia na wyjściu odbiornika ???? tam w trakcie odbioru pojawiają się ściśle określone ciągi impulsów (kodowanie bifazowe albo inaczej Menchester) - lecą sobie zera i jedynki. Więc przykładanie tam voltomierza ma się jak ser do gwoździa ;)

    miernik może ci wskazywać tam tylko różne średnie - wypadkowe napięcie - które nic a nic nikomu w tym przypadku nie powie - więc sobie odpuść tutaj woltomierz ;)

    a to że miałeś jakieś tam mniejsze napięcie dając potencometr to nie dziwne - skoro ograniczałeś napięcie zasilające dosyć poważnie i ponad miarę jakimś dziwacznym potencjometrem ...... poczytaj troszkę o kodowaniu w podczerwieni - to sporo ci się wyjaśni i nie będziesz już kombinował więcej w tym przypadku z potencjometrem i woltomierzem ;)

    oscyl - tak - dużo by ci powiedział i zobaczyłbyś nawet paczki impulsów. oscyloskopem można jak najbardziej badać takie przebiegi cyfrowe.

    Najważniejsze, że teraz masz już kod dobry ;) .... a obsługa RC5 w Bascomie jest prosta jak obsługa cepa - jak sam widzisz

    jeśli więc ci nie działa nadal - to sprawdź połączenia - bo na 100% coś masz nie tak ze sprzętem i/lub połączeniami - nie ma że boli

    (ja na twoim miejscu żeby uniknąć błędów połączeń - do testów - podłączyłbym ten odbiornik bez rezystora 220R - tylko wprost nogę do zasilania. A jedynie podciągnął wyjście przez 10k do VCC..... i to musi zadziałać w Bascomie ;) nawet bez żadnego oscyloskopu. No chyba że wszystkie swoje odbiorniki potraktowałeś podłączeniem odwrotnie zasilania na dłużej - to rzeczywiście mogły się uszkodzić
  • #7 6981501
    Overclocker
    Poziom 13  
    no mi tez się wydawało, ze nic w tym skomplikowanego nie ma :) mierzenie mialo na selu sprawdzenie czy on w ogóle działa, te paczki danych działają trochę jak pwm, dlatego powinny byc zmiany napięcia :)
    O kodowaniu czytałem, przynajmniej podstawę, i przebiegi czasowe, bo miałem zamiar pisać od nawa odbiór danych :)
    a co do podłączenia, sprawdzę to jutro , ale to są 3 kabelki z tego 2 do zasilania z tego co sprawdzałem jest dobrze (i to nie raz sprawdzałem) ale jest możliwość, ze gdzieś coś jest nie tak musi być :) bo płytka jest mała, bo to jest montowane do działającego układu na bardzo małej płytce uniwersalnej :)
    Jutro zrobię ten układzik na kawałku uniwersalnej i zobaczę czy działa, narazie dzięki za pomoc i dobranoc :D
  • #9 6981985
    landy13
    Poziom 31  
    Cytat:
    testowałem już wszystkie piloty w domu

    Czy na pewno te piloty nadają w RC5?
  • #10 6982137
    grysek
    Poziom 19  
    Standardowo w Atmedze prosto ze sklepu jest ustawione wewnętrzne taktowanie 8Mhz ale jest też ustawiony dzielnik przez 8 sygnału zegarowego. Spróbuj ustawić 'fusebit C' być może w tym jest przyczyna problemu
  • #11 6982244
    landy13
    Poziom 31  
    Kolego grysek nie wprowadzaj ludzi w błąd. Atmega8 "prosto ze sklepu" jest taktowana 1MHz i nie ma dzielnika przez osiem.
  • #12 6982621
    Overclocker
    Poziom 13  
    zumek napisał:

    Mnie natomiast zastanawia, dlaczego podałeś
    $crystal = 8000000

    , a nie np.
    $crystal = 3000000

    czy też dowolną inną liczbę :?:


    Podałem taką, ponieważ była ona w helpie, a ja przepisałem dokładnie wszystko (jak widać) z helpa

    grysek napisał:

    Standardowo w Atmedze prosto ze sklepu jest ustawione wewnętrzne taktowanie 8Mhz ale jest też ustawiony dzielnik przez 8 sygnału zegarowego. Spróbuj ustawić 'fusebit C' być może w tym jest przyczyna problemu

    nie wiem dlaczego, ale u mnie wszystkie atmegi8 jakie kupiłem po odczytaniu fuse bitów posiadają ustawiony internal rc oscylator 1MHz o bicie c nie wiedziałem, zaraz zobaczę co to jest :D

    landy13 napisał:

    Czy na pewno te piloty nadają w RC5?


    no właśnie nie wiem, i tu jest największy problem. ale myślę, że 1 na 6 pilotów powinien działać


    wszystko pracowało na wew rc, więc może być, że jest on za mało stabilny, i za chwilę zamontuje kwarc 3MHz i wtedy się zobaczy :)
  • #13 6982640
    grysek
    Poziom 19  
    landy13 masz rację pomyliłem się to w Atmega88 tak jest.

    Skoro pracujesz na wewnętrzym taktowaniu 1Mhz to wpisz w dyrektywie "$crystal=1000000" i wystarczy. Wewnętrzny oscylator może i jest nie aż tak dokładny ale GetRc5 powinno działać na wewnętrznym

    Ps. Mi działało na pilocie od cyfry+ :D
  • #14 6982734
    Overclocker
    Poziom 13  
    Ale ja zawsze zmieniam oscylator do zadeklarowanej prędkości, teraz chodzi na zewnętrznym 3MHz i mam $crystal = 3000000 jednak to dalej nie działa, sprawdziłem poprawność połączeń, wszystko jest ok fuse bita C mam = 1 (bodlevel 2,7v).
    Naprawdę brak mi pomysłów co to może być
  • #15 6982761
    grysek
    Poziom 19  
    A ustawiłeś pin do którego masz podpięty odbirnik jako wejście?
  • #16 6982784
    Overclocker
    Poziom 13  
    nie, nie deklarowałem tego, jednak w helpe i w "programowanie mikrokontrolerow avr w języku bascom" nie ma tej deklaracji jest jedynie : config rc5 = pinX.X ale probowalem tez z konfiguracjami jako wejście, podciągałem port do góry, ale to też nic nie dawało
  • Pomocny post
    #17 6983107
    kwesoly
    Poziom 15  
    Ja mam w domu 4 piloty i żaden koło RC5 nie leżał - najpierw sprawdź ten pilot, bo często używają innego standardu (albo miałem pecha:))

    Tutaj są pliki konfiguracyjne masy pilotów do programu lirc:
    http://lirc.sourceforge.net/remotes/

    Tutaj opis tego formatu:
    http://www.lirc.org/html/configure.html#lircrc_format

    A tutaj opis tego jak to powinno wyglądać:
    http://www.sbprojects.com/knowledge/ir/ir.htm

    Dodano po 10 [minuty]:

    A odnośnie pierwszego schematu, elektrolitów i przeżegnania się lewą nogą - podciągnięcie przez 10200 wiele nie zmienia, zaś kondensator robi tutaj za filtr RC do spółki z rezystorem, więc jego wartość nie ma IMHO aż takiego znaczenia, żeby unieruchomić układ.
  • #18 6983268
    Overclocker
    Poziom 13  
    więc jak sprawdzić, czy pilot, http://lirc.sourceforge.net/remotes/denver/DVD-228 nadaje w RC5 bo tam nie pisze w prost
    w RC5 nadawane są słowa 14-to bitowe, a w tym pilocie jest pre_data_bits 16
    co prawdopodobnie oznacz 16 bitowe slowa czyli standard RC6 czy dobrze mysle ?
  • Pomocny post
    #19 6983329
    mirekk36
    Poziom 42  
    Overclocker ---> weź zobie drugi procek, diodę nadawczą podczerwieni i skorzystaj z polecenia sendrc5. Wtedy sprawdzisz sobie czy działa ci prawidłowo odbiornik - ten który teraz próbujesz zrobić na RC5. Jak już będziesz pewien że działa w 100% - a w Bascomie to żaden problem - to wtedy możesz sobie testować całą stertę swoich pilotów z tzw szrotu domowego - czy któryś nadaje kod w RC5

    ........a ty stawiasz sprawę na głowie!!! - doszukujesz się błędów w układzie, w programie i bóg wie czym jeszcze a naparzasz pilotami, które być może z RC5 mają tyle wspólnego co twarożek almette ze śrubką mosiężną. No chyba że robisz to w ramach utrudnienia sobie zadania

    Dodano po 1 [minuty]:

    aha a przy okazji jeśli ten link który podałeś powyżej jest od twojego pilota - to widzisz tam na lirc'u taki wpis:

    Cytat:
    flags SPACE_ENC|CONST_LENGTH


    co oznacza na 100000000000% że to nie jest kodowanie RC5 tylko kodowanie typu SPACE - używane m.inn w pilotach SONY.
  • Pomocny post
    #20 6983399
    kwesoly
    Poziom 15  
    I pilotach LG niektórych.
    Dokładnie:
    Cytat:

    one 657 1605
    zero 657 469

    Takimi (średnio) długościami impulsów (w us) kodowane są zera i jedynki.
  • #21 6983425
    Overclocker
    Poziom 13  
    Dzięki wszystkim, teraz już działa :D wcześniej wpadłem na pomysł, żeby wysyłać z 2 procka, ale nie działało, a okazało sie przez to, że nie dałem Config Pinb.1 = Output :D
    czyli jednak żaden z 6 moich pilotów nie nadaje w RC5 :)


    Mam jeszcze jedno pytanko związane z nadajnikiem, mianowicie, gdy chce skompilować komendę na attiny45
    
    Rc5send Togbit , Address , Command 
     

    wywala mi pełno błędów:
    [Atmega8L][Bascom] RC5-nieprawidłowy odbiór

    co to może być ?
    na atmedze wszystko ładnie chodziło
  • #22 6992628
    mirekk36
    Poziom 42  
    Overclocker --> w helpie masz napisane, że Rc5send korzysta z Timer1 (który musi być 16bitowy) - a sprawdzałeś w nocie PDF procka ATtiny45 czy jest Timer1 ????

    podpowiadam że jest w nim Timer1 ;) ale niestety nie 16bitowy i nie kompatybilny że tak powiem z tym poleceniem - dlatego ci to nie działa a kompilator wywala tyle błędów
  • #23 6993323
    Overclocker
    Poziom 13  
    To już się dowiedziałem, przed twoim postem (google jednak nie boli :D) ale dzięki :) miałem teraz inne pytanie ( stworzyłem nowy temat https://www.elektroda.pl/rtvforum/topic1422831.html ) bo brak timera 16bitowego już rozwiązałem :D

    Myślę, że ten temat już można uznać za zamknięty :)
  • #25 6994916
    Overclocker
    Poziom 13  
    Ok dzięki :)
REKLAMA