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

[ATMEGA32] - sterowanie RC5 - nie działa.

zyzioone 19 Lis 2008 14:28 2026 3
  • #1 5757801
    zyzioone
    Poziom 12  
    Witam. Zdaje sobie doskonale sprawę że temat był wałkowany milion razy. Przeczytałem chyba wszystkie posty dotyczące odbioru RC5 w avr - sprawdziłem z 10 różnych programów i efekt ten sam - nie mogę odebrać żadnej komendy z odbiornika rc5. Dlatego po dwóch dniach walki postanowiłem zapytać.
    Sprzęt:
    -Układ testuje na ATMEGA32 na płytce uruchomieniowej ZL3AVR
    -Fusebity ustawione na zew, rezonator 16MHz
    -pisze w bascomie

    Program działający u kolegi na atmega8 w którym zmieniłem tylko regfile.
    
    $regfile = "m32def.dat"                                     'Dyrektyway dla kompilatora.
    $lib "mcsbyte.lbx"
    '$crystal = 8000000                                         'Oscylator wewnętrzny o częstotliwości 8MHz.
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portd.5 , Db5 = Portd.3 , Db6 = Portd.4 , Db7 = Portd.6 , E = Portb.1 , Rs = Portb.2
    
    Config Pind.2 = Input
    Set Portd.2
    Config Rc5 = Pind.2
    
    Enable Interrupts
    
    Dim Address As Byte , Con1 As Byte , Con2 As Byte , Command As Byte , Adr_str As String * 2
    Dim Com_str As String * 2
     Cls
    Con1 = 0
    Con2 = 0
    Lcd "* RC5 *"
    Lowerline
    Lcd "*READER*"
    Wait 2
    Cls
    Do
     Getrc5(address , Command)
     If Address <> &HFF Then
     If Address <> Con1 Or Command <> Con2 Then
         Con1 = Address
         Con2 = Command
            Adr_str = Hex(address)                              'zamieniamy na postać do wyświetlenia na LCD
            Command = Command And &B01111111                    'zerujemy znacznik w słowie RC5
            Com_str = Hex(command)                              'bit znacznika jest zmieniany podczas każdej transmisji
          Cls
          Lcd "Adr:" ; Adr_str
          Lowerline
          Lcd "Com: " ; Com_str
          Print Com_str
       End If
     End If
    Loop
    End

    Pilot na 100% nadaje w RC5.
    Wejście odbiornika Ir podłączone do PD2(int0).

    Zmieniałem zegar na wew. 8Mhz - nic nie pomogło.
    Sprawdzałem programy z elektrody podpisane jako działające - nie działa.
    Napisałem swój na podstawie helpa - nie działa.

    Nie zmieniłem tylko odbiornika IR - ale nie sądze żeby był uszkodzony.
    Pozdrawiam.
  • #2 5757928
    mirekk36
    Poziom 42  
    Witam,

     If Address <> Con1 Or Command <> Con2 Then 
         Con1 = Address 
         Con2 = Command 
            Adr_str = Hex(address)                              'zamieniamy na postać do wyświetlenia na LCD 
            Command = Command And &B01111111                    'zerujemy znacznik w słowie RC5 
            Com_str = Hex(command)                              'bit znacznika jest zmieniany podczas każdej transmisji 
          Cls 
          Lcd "Adr:" ; Adr_str 
          Lowerline 
          Lcd "Com: " ; Com_str 
          Print Com_str 
       End If 
     End If 


    no a jak może być ten twój warunek spełniony jeśli bit Toggle "wyjmujesz" dopiero w środku warunku a nie przed nim!
    Command = Command And &B01111111

    przez to ten cały IF nie będzie spełniony, musisz od razu po sprawdzeniu czy adres jest różny od 255 maskować bit Toogle

    Command = Command And &B01111111

    Dodano po 2 [minuty]:

    nie - no w ogóle ten cały warunek jest jakiś pokićkany, daruj go sobie , zamaskuj tylko tooglebit i zobaczysz że zadziała - a później to już będziesz sam wiedział co dalej

    Dodano po 3 [minuty]:

    poza tym piszesz, że fusebity masz ustawione na rezonator zewn 16MHz a w kodzie nie masz zdeklarowanego $crystal bo jest zaremowany

    coś mi się wydaje że przepisałeś bez minimum zrozumienia kodu i zastanowienia

    wyrzuć całą tą linijkę:

    If Address <> Con1 Or Command <> Con2 Then

    oraz odpowiedni ENDIF do niej i będzie działać
  • #3 5758275
    dawid512
    Poziom 32  
    A po co podłączyłeś odbiornik do int0 skoro z niego nie korzystasz? Po za tym mówisz że fuse bity masz na zew. kwarc 16MHz a w programie informujesz że używasz 8MHz... Masz tutaj mój sprawdzony kod:
    
    
    $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 Portd.3 = Output                                     'Buzzer
    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
    
    Buzzer Alias Portd.3
    
    Enable Interrupts                                           'wlaczenie systemu przerwan
    
    Enable Int0                                                 'odblokowanie przerwania int0
    
    Set Odebrano                                                'ustaw flagi odebrano
    Reset Buzzer
    Cls
    Cursor Off
    
    Do
                                                                'jesli odebrano to...
    If Odebrano = 1 Then
    
    
    Locate 1 , 1
    Lcd "adres:" ; Address ; " "                                'pokaz adres
    
    Locate 2 , 1                                                'pokaz komende
    Lcd "komenda:" ; Command ; " "
    
    Reset Odebrano                                              'reset odebrano
    Enable Int0                                                 'aktywuj przerwanie
    
    Else
    
    
    Locate 1 , 1
    Lcd "adres:0" ; "  "                                        'pokaz adres 0
    
    Locate 2 , 1                                                'pokaz komende 0
    Lcd "komenda:0" ; "  "
    End If
    
    '******************** Jesli odebrano okreslony adres i komende to... ***********************
    If Address = 10 And Command = 12 Then
    Set Buzzer
    Else
    Reset Buzzer
    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
    
  • #4 5758496
    zyzioone
    Poziom 12  
    Witam.Dziękuje za odpowiedź. Jeżeli chodzi o warunki:
    
     Getrc5(address , Command)
     If Address <> &HFF Then
     If Address <> Con1 Or Command <> Con2 Then
    

    To pierwszy sprawdza czy adres jest różny od 255, a drugi czy adres jest różny od Con1(0) i Con2(0). Program z dwoma warunkami działa.
    Wyrzuciłem z programu obłsugę LCD i wygląda teraz tak:
    
     
    $regfile = "m32def.dat"                                     'Dyrektyway dla kompilatora.
    $lib "mcsbyte.lbx"
    $crystal = 16000000
    
    Config Pind.2 = Input
    Set Portd.2
    Config Rc5 = Pind.2
    
    Enable Interrupts
    
    Dim Address As Byte , Con1 As Byte , Con2 As Byte , Command As Byte , Adr_str As String * 2
    Dim Com_str As String * 2
    
    Con1 = 0
    Con2 = 0
    Print "podaj"
    Do
     Getrc5(address , Command)
     If Address <> &HFF Then
     If Address <> Con1 Or Command <> Con2 Then
         Con1 = Address
         Con2 = Command
         Adr_str = Hex(address)                                 'zamieniamy na postać do wyświetlenia na LCD
         Command = Command And &B01111111                       'zerujemy znacznik w słowie RC5
         Com_str = Hex(command)                                 'bit znacznika jest zmieniany podczas każdej transmisji
    
          Print Com_str ;
          Print Adr_str
       End If
     End If
    Loop
    End
    

    W tym przypadku błąd leżał po stronie '$crystal - aż wstyd się przyznać.
    Wcześniejsze programiki stworzone na podstawie helpa bascoma nie działają więc musze jeszcze nad tym posiedzieć. Dziękuje za pomoc i pozdrawiam serdecznie.
REKLAMA