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

[Bascom] Zapamiętanie kodu RC5

komanche 23 Mar 2010 18:52 1384 6
REKLAMA
  • #1 7870949
    komanche
    Poziom 13  
    Witam!
    Potrzebuję pomocy przy budowie pewnego urządzenia, miałoby ono przy uruchomieniu czekać na komendę z pilota i zapamiętać ją.
    Przy następnym użyciu pilota mikroprocesor powinien porównać odebrany kod z zapamiętanym i w przypadku zgodności przejść do dalszych działań.

    Wymyśliłem coś takiego:


    $regfile = "m8def.dat"   
    $crystal = 8000000
    
    Config Pind.3 = Input  ' porty
    Reset Pind.3
    
    Dim Address As Byte  ' zmienne
    Dim Command As Byte
    Dim Kod As Byte
    Dim Flaga_programuj As Byte
    
    Config Int1 = Falling  ' Konfiguracja przerwania
    Config Rc5 = Pind.3
    On Int1 Kod_rc5
    Enable Interrupts
    Enable Int1
    Flaga_programuj = 1
    Command = 0
    
    Do
     If Flaga_programuj = 1 Then
       If Command <> 0 Then
          Kod = Command
          Flaga_programuj = 0
       End If
     End If
     If Flaga_programuj <> 1 Then
       If Kod = Command Then
    
    [TUTAJ DALSZY PROGRAM]
    
    
       End If
      End If
    Command = 0
    Loop
    End
    
    Kod_rc5:
     Disable Int1
     Enable Interrupts
     Getrc5(address , Command)
    Return


    I jak na złość, nie chce działać...
    Albo w ogóle olewa przycisk na pilocie albo już po pierwszym (!) naciśnięciu ta wycięta część programu ciągle się powtarza (jakbym co chwila wciskał przycisk).

    Miałem sporą przerwę w zabawie z uC i teraz mam w głowie pustkę...
  • REKLAMA
  • #2 7871241
    wader_669
    Poziom 28  
    Jak miales przerwe to czytaj wiecej helpa.
    Wylaczasz przerwanie int1, a pozniej go nie wlaczasz to sie nie dziw, ze nie dziala. Poza tym dane odebrane z pilota sa zapisywane w 2 zmiennych address i command (u ciebie).

    
    Dim Flaga_odebrane As Bit
    Dim Flaga_zapisane As Bit
    
    Dim Address_zapisany As Byte
    Dim Command_zapisany As Byte
    
    Falga_odebrana = 0
    Flaga_zapisane = 0
    Address_zapisany = 0
    Command_zapisany = 0
    
    
    Do
    
    If Flaga_odebrane = 1 Then                                  ' pilot cos nadal
    Flaga_odebrane = 0
    
       If Flaga_zapisane = 0 Then                               ' jeszcze nie bylo nic zapisane
       Address_zapisany = Address
       Command_zapisany = Command
       Flaga_zapisany = 1                                       ' juz bylo cos zapisane
       Else                                                     ' sprawdzanie czy teraz jest to samo
       If Command = Command_zapisany Then
          If Address = Address_zapisany Then
    
          'dalcze instrukcje
          End If
       End If
       End If
    Enable Int1
    End If
    
    End
    Loop
    
    Kod_rc5:
     Disable Int1
     Enable Interrupts
     Getrc5(address , Command)
     Flaga_odebrane = 1
    Return
    


    Jest to prawie gotowiec, moga byc drobne bledy. Wazne zebys zrozumial jak program dziala
  • REKLAMA
  • #3 7871913
    komanche
    Poziom 13  
    $regfile = "m8def.dat"
    $crystal = 8000000
    
    Config Portc.5 = Output
    Config Portb.1 = Output
    Config Pind.3 = Input
    Reset Portc.5
    Reset Portb.1
    Reset Pind.3
    Config Int1 = Falling                                       ' Konfiguracja przerwania
    Config Rc5 = Pind.3
    On Int1 Kod_rc5
    Enable Interrupts
    Enable Int1
    
    Przekaznik1 Alias Portc.5
    Przekaznik2 Alias Portb.1
    
    Dim Flaga_odebrane As Bit
    Dim Flaga_zapisane As Bit
    Dim Address_zapisany As Byte
    Dim Command_zapisany As Byte
    Dim Address As Byte
    Dim Command As Byte
    
    Flaga_odebrane = 0
    Flaga_zapisane = 0
    Address_zapisany = 0
    Command_zapisany = 0
    
    Do
    
    If Flaga_odebrane = 1 Then
    Flaga_odebrane = 0
    
       If Flaga_zapisane = 0 Then
       Address_zapisany = Address
       Command_zapisany = Command
       Flaga_zapisane = 1
       Else
       If Command = Command_zapisany Then
          If Address = Address_zapisany Then
            Przekaznik1 = 1
            Waitms 200
            Przekaznik2 = 1
            Waitms 500
            Przekaznik1 = 0
            Waitms 200
            Przekaznik2 = 0
            Waitms 200
          End If
       End If
       End If
    Enable Int1
    End If
    
    End
    Loop
    
    
    
    
    Kod_rc5:
     Disable Int1
     Enable Interrupts
     Getrc5(address , Command)
     Flaga_odebrane = 1
    Return



    Spodziewałem się, że ten program (jak to określiłeś - gotowiec) zadziała.
    A tutaj niespodzianka!
    Wciskam przycisk na pilocie - nic.
    Wciskam drugi raz - nic.
    Przytrzymuję - znowu nic.
    Trzeba będzie do roboty zaciągnąć drugą atmegę do wysyłania RC5, bo podejrzewam, że mój pilot nie wysyła RC5...

    No, chyba, że powyższy kod po prostu nie ma prawa działać bo coś przegapiłem.

    Pozdrawiam!


    Edit:
    A może istnieje jakaś opcja zapamiętania dowolnej sekwencji odebranej z odbiornika TSOP?
    Tak, żeby urządzenie reagowało tylko i wyłącznie na jeden przycisk dowolnego pilota pracującego na odpowiedniej nośnej a nie koniecznie z odpowiednim kodowaniem.
  • REKLAMA
  • #4 7872035
    wader_669
    Poziom 28  
    masz jakis wyswietlacz? To podlacz go i napisz prosty program, to bedziemy wiedziec czy twoj pilot nadaje w rc5 lub uzyj kompa i uart'a
  • #5 7872275
    komanche
    Poziom 13  
    nie mam wyświetlacza a połączeniami z komputerem się jeszcze nie bawiłem...
    I w ogóle płytka, którą mam uniemożliwia podłączenie się pod porty portd.0 i portd.1 więc uart odpada...
  • #6 7872305
    arktik1
    Poziom 27  
    Popatrz sobie w HELPie BASCOMA , jest tam RC5SEND i GETRC5.
    Zacznij od tego.
  • REKLAMA
  • #7 7873346
    komanche
    Poziom 13  
    Witam!
    Znalazłem w helpie bascoma programik, który jak mi się zdaje, generuje nośną i kod rc5.

    $regfile = "m8def.dat"
    $crystal = 4000000  
    $baud = 19200  
    $hwstack = 32
    $swstack = 10
    $framesize = 40    
    
    Dim Togbit As Byte , Command As Byte , Address As Byte
    
    Command = 12 
    Togbit = 0 
    Address = 0
    
    Do
    
      Waitms 500
    
      Rc5send Togbit , Address , Command
    
    Loop
    
    End
    
    


    Zasadniczo, jeśli program działa tak jak opisałem to powyżej, to mnie zadowala :)
    Jest tylko problem...
    Posiadam całą masę TSOP1738 i ani jednego odbiornika na 36kHz...
    Jest jakaś możliwość zmiany nośnej na 38kHz, czy muszę szukać ...36?
REKLAMA