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

Kolejny raz RC5Send Attiny2313

19 Kwi 2008 16:29 1892 13
  • Poziom 32  
    Witam serdecznie!

    Wiem że na forum był już podobny temat ale niestety nie pomógł mi rozwiązać mojego problemu. Mianowicie wiem że attiny wysyla dane poniewaz patrzac na diode ir przez cyfrowke widac ze mruga a takze po podlaczeniu zwyklego leda rowniez. Problem jest taki że wysyła nie to co chce :(.
    Teraz pytanie skąd wiem ze tak sie dzieje. Wiem poniewaz na innym procku mam zrobiony odbiornik rc5 ktory dziala prawidlowo z pilotem od TV. Diode mam podlaczona poprzez rezystor 220Ω do PB.3 czyli do OC1A a anoda do 5V. Jesli wysylam dane przez pilot od tv to komendy prawidlowo pojawiaja sie na lcd a jesli przez nadajnik na attiny to ciagle pokazuje mi sie adres 255 a komenda 127. Co może być nie tak? Prosze o pomoc.

    Pozdrawiam Dawid.
  • Poziom 32  
    Próbowałem już z tym kodem gdyż kod miałem prawie identyczny :P ale dalej to samo :( adres 255 komenda 127. Co jest grane? Sprawdzalem takze na Atmedze32 i tak samo :(.
  • Poziom 25  
    To akurat dziwne :)
    A jakiego odbiornika używasz? Ja miałem na 38kHz, używasz wewnętrznego czy zewnętrznego kwarcu?
    Masz może oscyloskop?
  • Poziom 32  
    Odbiornik mam TSOP1736 czyli 36kHz i dziwne jest to że jak nacisne dowolny klawisz zwyklego pilot tv to na lcd mam adres i komedne kazdego klawisza a jak wysylam przy uzyciu procka to nie dziala :(. Attiny byl na wew 8MHz a Atmega32 na zew. 8MHz.
  • Poziom 42  
    a zrobiłeś układ nadawczy tak jak w helpie Bascoma???

    jaki rezystor dałeś dla diody? czyli jakim prądem ją sterujesz?

    pokazałeś chociaż swój schemat i fragment kodu testowego? - NIE - więc jak rozumiem liczysz na odpowiedź wróżki.
  • Poziom 32  
    Przepraszam że nie podałem kodu ale już to robię:

    to był kod dla attiny:
    Code:

    $regfile = "attiny2313.dat"
    $crystal = 8000000

    Config Pind.6 = Input
    Config Pinb.3 = Output

    Config Debounce = 50

    Dim Togbit As Byte , Komenda As Byte , Adres As Byte

    S1 Alias Pind.6

    Set Portd.6

    Komenda = 12

    Togbit = 0

    Adres = 10

    '***********************************************
    Do

    Debounce S1 , 0 , Rc5 , Sub

    Loop
    End

    '********************************************
    Rc5:

    Do

    Waitms 250

    Rc5send Togbit , Adres , Komenda

    Loop Until S1 = 1

    Return
     


    a to kod nadajnika i odbiornika w jednym na Atmedze32:
    Code:

    $regfile = "m32def.dat"                                     'atmega32
    $crystal = 8000000                                          'kwarc 8MHz

    Config Lcdbus = 4
    Config Lcd = 16 * 2                                         'wyswietlacz 2x16 znakow
    Config Lcdpin = Pin , Db4 = Pb.4 , Db5 = Pb.5
    Config Lcdpin = Pin , Db6 = Pb.6 , Db7 = Pb.7 , E = Pb.3 , Rs = Pb.2

    Config Pinb.3 = Output

    Config Rc5 = Pind.2                                         'wejscie int0 do ktorego jest podlaczony odbiornik

    Config Int0 = Low Level                                     'przerwanie zew. koncowka int0 czyli pd.2
                                                             'przerwanie po wystapieniu stanu niskiego
                                                                  'Podczas przerwania int0 skok do pobor
    On Int0 Pobor

    Dim Togbit As Byte , Command As Byte , Address As Byte

    Dim Adres As Byte , Komenda As Byte                         'deklaracja komendy i adresu

    Dim Odebrano As Byte                                        'flaga

    Dim Licznik As Word

    Enable Interrupts                                           'wlaczenie systemu przerwan

    Enable Int0                                                 'odblokowanie przerwania int0

    Set Odebrano                                                'ustaw flagi odebrano

    Command = 12

    Togbit = 0

    Address = 10

    Cls
    Cursor Off

    Do

    Waitms 250

    Rc5send Togbit , Address , Command

                                                                 'jesli odebrano to...
    If Odebrano = 1 Then
    Cls
    Home
    Lcd "adres: " ; Adres                                       'pokaz adres

    Lowerline                                                   'pokaz komende
    Lcd "komenda: " ; Komenda

    Reset Odebrano                                              'reset odebrano
    Enable Int0                                                 'aktywuj przerwanie

    End If



    Loop
    End

    Pobor:
                                                                'wylacz przerwanie int0
    Disable Int0                                                'wlacz system globalnych przerwan
    Enable Interrupts

    Getrc5(adres , Komenda)                                     'pobierz adres i komende

    Komenda = Komenda And &B01111111                            'wyzeruj najbardziej znaczacy bit komendy

    Set Odebrano                                                'ustaw odebrano (mozliwy odbior kojenego kodu)

    Return


    Czyżby niedoczytane?
    Cytat:

    Diode mam podlaczona poprzez rezystor 220Ω do PB.3 czyli do OC1A a anoda do 5V.


    Przez tranzystor też próbowałem z rezystorem 220Ω oraz 10Ω i dalej nic... Jeżeli patrzę przez cyfrówkę na diode ir to mocno miga co jakas część sekundy.

    Dodano po 1 [godziny] 50 [minuty]:

    Witam.

    Problem pośrednio rozwiązany ale nie mogę zrozumieć jednego. Mianowicie kod nadajnika to :
    Code:
    $regfile = "attiny2313.dat"
    
    $crystal = 8000000

    Config Pinb.3 = Output

    Dim Togbit As Byte , Command As Byte , Address As Byte

    Command = 24

    Togbit = 0

    Address = 10

    '***********************************************
    Do

    Waitms 500

    Rc5send Togbit , Address , Command

    Loop
    End


    A odbiornika zmienilem na taki :
    Code:

    $regfile = "m32def.dat"
    $crystal = 8000000

    Config Lcdbus = 4
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Pb.4 , Db5 = Pb.5 , Db6 = Pb.6 , Db7 = Pb.7 , E = Pb.3 , Rs = Pb.2

    Config Rc5 = Pind.2


    Dim Address As Byte , Command As Byte

    Enable Interrupts

    Cls

    Do


    Getrc5(address , Command)


    Locate 1 , 1
    Lcd "Adres:" ; Address

    Locate 2 , 1
    Lcd "Komenda:" ; Command

    Wait 2
    Cls


    Loop
    End


    Co się okazuje nadajnik działa prawidlowo ale problem tym razem jest z odbiornikiem. Przy użyciu kodu odbiornika ktory podalem wyzej wszystko dziala ale nie moge zrozumiec dlaczego nie dziala kod odbiornika ktory dziala w przerwaniu int0. Czy ktoś wie dlaczego tak się dzieje??
  • Poziom 36  
    Dzieje sie tak bo bascom działa jak chce. A część programów wykorzystuje peryferia dla swojego działania efekty widać w bardziej złożonych programach działa albo nie a zazwyczaj nie ...
  • Poziom 42  
    oczywiście, że nie doczytałem o tym rezystorze, sorki - mój błąd

    a co do kodu:
    odnośnie ATtiny to teoretycznie powinno być dobrze, ale do testów pozbąć się tego debounce tylko prosto w pętli głównej wysyłaj np co kilkaset ms ten sam kod i adres - powinno działać

    odnośnie kodu na Atmega32 - to coś mi tu nie pasuje - po pierwsze nie wiem czy tak można robić zapis przy CONFIG LCD jak ty to piszesz czyli np DBx = Pb.x ale skoro ci to wyświetla to chyba działają takie skróty

    jednak zauważ, że Portb.3 masz użyty i w LCD i chyba jednocześnie używasz go na potrzeby RC5 ? ale może się mylę bo nie wiadomo jak tu popodpinałeś to wszystko - oczywiście schemat by się przydał bo właśnie przez takie słowne opisywanie układu można się pogubić i tym trudniej coś pomóc

    czy na Atmega32 podłączyłeś wyjście sterujące diodą IR pod pin OC1A ??? czyli Portd.5 ??? jeśl tak? to gdzie masz ustawienie go najko wyjście ?

    poza tym na jedym procku - jednocześnie próbujesz nadawać i odbierać (ATMega32) ?????

    troszkę namieszałeś chyba - tak mi się wydaje. Weź spokojnie na tym ATtiny2313 zrób nadajnik, jak pisałem który sam co kilkaset ms będzie wysyłał Kod RC5

    a na ATmega32 zrób odbiornik - tylko proawidłowo popodłączaj wszystko albo/i pokaż schemat

    pozdr

    Dodano po 5 [minuty]:

    nie stosuj wyzwalania INT0 poziomem (level) tylko zboczem po pierwsze - spokojnie powinien działać GetRc5 w przerwaniu Int0 - tylko ty dziwnie jakoś to napisałeś
  • Poziom 32  
    Nadajnik testuje tak jak napisal kolega czyli w petli na attiny zas odbiornik jest na atmedze32 i w programie byl blad bo powinien byc pind.5 a nie pinb.3 ale mimo to program ktory odbiera dane w przerwaniu nie dziala a bez przerwania tak. Co teraz?
  • Pomocny post
    Poziom 42  
    już pisałem co zrobić ale tym razem ty nie doczytałeś chyba, więc:

    po pierwsze - ustaw wyzwalanie przerwania INT0 zboczem opadającym (falling)

    po drugie - tuż po wejściu w przerwanie wyłącz je

    disable INT0

    ale zaraz po tym daj Enable Interrupts, żeby mógł działać Timer

    potem odbierz kod RC5

    ustaw swój znacznik Odebrano

    a resztę przetwarzaj w programie głównym czyli analizę address , command , toggle itp

    aha i nie zapomnij po odebraniu kompletnego kodu RC5 ponownie włączyć INT0

    a zobaczysz że będzie wszystko ładnie śmigać na przerwaniach
  • Poziom 32  
    Wielkie dzięki :) oczywiście pomogło tylko jak odbieram kod to wyświetlacz miga ale widac kod czy da sie to usunac? Probowalem usunac cls ale wtedy oprocz konkretnych wartosci pozostaja stare. Oto kod:
    Code:

    $regfile = "m32def.dat"                                     'atmega32
    $crystal = 8000000                                          'kwarc 8MHz

    Config Lcdbus = 4
    Config Lcd = 16 * 2                                         'wyswietlacz 2x16 znakow
    Config Lcdpin = Pin , Db4 = Pb.4 , Db5 = Pb.5
    Config Lcdpin = Pin , Db6 = Pb.6 , Db7 = Pb.7 , E = Pb.3 , Rs = Pb.2

    Config Rc5 = Pind.2                                         'wejscie int0 do ktorego jest podlaczony odbiornik

    Config Int0 = Falling                                       'przerwanie zew. koncowka int0 czyli pd.2
                                                             'przerwanie po wystapieniu opadajacego zbocza syg.
                                                                  'Podczas przerwania int0 skok do pobor
    On Int0 Pobor
    Dim Address As Byte , Command As Byte                       'deklaracja komendy i adresu

    Dim Odebrano As Byte                                        'flaga


    Enable Interrupts                                           'wlaczenie systemu przerwan

    Enable Int0                                                 'odblokowanie przerwania int0

    Set Odebrano                                                'ustaw flagi odebrano

    Cls
    Cursor Off

    Do
                                                                'jesli odebrano to...
    If Odebrano = 1 Then
    Cls
    Home
    Lcd "adres: " ; Address                                     'pokaz adres

    Lowerline                                                   'pokaz komende
    Lcd "komenda: " ; Command

    Reset Odebrano                                              'reset odebrano
    Enable Int0                                                 'aktywuj przerwanie

    End If



    Loop
    End

    Pobor:
                                                                'wylacz przerwanie int0
    Disable Int0                                                'wlacz system globalnych przerwan
    Enable Interrupts

    Getrc5(address , Command)                                   'pobierz adres i komende

    Set Odebrano                                                'ustaw odebrano (mozliwy odbior kojenego kodu)
    Return
  • Poziom 42  
    pewnie, że się da pominąć to miganie wyświetlacza LCD. Szczególnie LCD. Wystarczy zamiast stosowania CLS dla całego wyświetlacza zastosować polecenie LOCATE y,x i wyświetlać konkretne wartości w konkretnym miejscu. Za taką wartością można dać jeszcze spację albo dwie aby w razie czego kasować końcówkę liczby w przypadku gdy np wyświetla ci się 100 a zaraz potem ma wyświetlić się np 3.

    i jak widać na końcu - Bascom sam nic nie robi wg własnego uznania, robi dokładnie to co mu programista poleci o ile się go zna. Zresztą ta sama zasada dotyczy każdego języka czy kompilatora - asm lub C.

    powodzenia
  • Poziom 32  
    Dzieki :) Całkowicie zapomniałem o locate a przewaznie go stosowalem moj blad. Temat uwarzam za zamknięty.