Uniwersalny uczący się odbiornik IR


Przedstawiony układ jest rozwinięciem i przeróbką układu Marcina Połomskiego. Działa z prawie każdym pilotem podczerwieni. Testowałem na dostępnych u mnie dziewięciu pilotach. Ze wszystkimi działał bezbłędnie.
Jest to minimum kodu potrzebne do działania. Oczywiście można go rozbudować o elementy wykonawcze i peryferia.
Urządzenie zapamiętuje (uczy się) czterech dowolnych kodów pilota IR. Ograniczeniem jest pojemność pamięci EEPROM Atmega8. Ze względu na zmienny sygnał toggle protokołów RC5 i RC6, każdy kod zapisywany jest dwukrotnie. O ile ktoś jest pewny, ze pilot użyty do programowania, nie jest w standardzie RC5 albo RC6 może przerobić w prosty sposób kod i w ten sposób zyska kolejne cztery kody do zapamiętania.

Programowanie przebiega w prosty sposób. Po chwilowym wciśnięciu przycisku S1 zapala się dioda D1. Teraz pilot kierujemy w kierunku odbiornika IR i przyciskamy 1 przycisk, który ma być zapamiętany. Dioda D1 gaśnie.
Wciskamy ponownie przycisk 1 na pilocie. Dioda D1 gaśnie i zapala się dioda D2. Wciskamy przycisk 2 na pilocie. Dioda D2 gaśnie. Ponownie wciskamy przycisk 2 na pilocie. Zapala się dioda D3. Dalej postępujemy analogicznie, aż zaprogramujemy wszystkie cztery przyciski pilota. Oczywiście sposób programowania jest tylko przykładowy. Można go w dowolny sposób zmienić w kodzie programu. Po zapamiętaniu kodów pilota można nim włączać i wyłączać 4 diody LED.

$regfile = "m8def.dat"
$crystal = 8000000
 
'Odbiornik IR----------------------------------------------------------------------------
Dim Licznik0 As Byte , Licznik1 As Byte , Tab(70) As Byte
Dim X As Byte , Flaga As Byte,  Zapis As Byte
Dim Kod As Byte , Porownanie As Byte
Dim Pr As byte , P2 As Word , Adres As word , A as Byte
 
'Inne------------------------------------------------------------------------------------
Dim I As Byte
'----------------------------------------------------------------------------------------
Config portd = &B01111011 : portd = &B11111111
Config Portb = &B11111111 : Portb = &B11111111
Config Portc = &B11111111 : Portc = &B11111111
 
Czujnik_IR Alias Pind.7        'odbiornik IR
Programowanie1 Alias Pind.2    'przycisk programowania
 
'Odbiornik IR---------------------------------------------------------------------------
Config Timer0 = Timer , Prescale = 64 : On Timer0 Co32us
Disable Timer0
Enable Interrupts
Licznik0 = 0 : Licznik1 = 0
Flaga = 1 : X = 0
 
'=================PETLA=GLÓWNA============================================
Do
   If Czujnik_IR = 0 Then
      If Zapis = 0 then
         Adres = 0
      End if
      Enable Timer0
      Waitms 200
   End if
   Debounce Programowanie1 , 0, Programowanie , Sub   'Przycisk programowania
 
Loop
End
'===========================================================================
 
Co32us:
 
   Timer0 = 252     '32us
 
'czytanie-pilota-zera------------------------
 
   If Czujnik_IR = 0 Then
      If Flaga = 1 Then
         Licznik0 = 0
         If Licznik1 <> 0 Then
            Tab(X) = Licznik1
            Incr X
         End If
      End If
      Incr Licznik0
      Flaga = 0
   End If
 
'czytanie-pilota-jedynki---------------------
 
   If Czujnik_IR = 1 Then
      If Flaga = 0 Then
         Licznik1 = 0
         If Licznik0 <> 0 Then
            Tab(X) = Licznik0
            Incr X
         End If
      End If
      Incr Licznik1
      Flaga = 1
   End If
 
 
 
   If Licznik1 = 250 Then
      Porownanie = 0
 
'koniec czytania pilota-------------------
 
'Zapisywanie jeśli tryb = 1 (zapis)---------
 
      If Zapis = 1 Then
 
         For X = 0 to 63
            P2 = X + Adres
            Writeeeprom Tab(X) , P2
         Next X
 
         Adres = Adres + 64
         If Adres >448 then
            Adres = 0
            Zapis = 0
            PR = 0
 
         End If
 
'sygnalizacja LED w czasie programowania
 
         If Adres = 64 Then
            Portc.2 = 1
         End if
 
         If Adres = 128 Then
            Portc.3 = 0
         End if
 
         If Adres = 192 Then
            Portc.3 = 1
         End if
 
         If Adres = 256 Then
            Portc.4 = 0
         End if
 
         If Adres = 320 Then
            Portc.4 = 1
         End if
 
         If Adres = 384 Then
            Portc.5 = 0
         End if
 
         If Adres = 448 Then
            Portc.5 = 1
         End If
      End If
 
 
'odczyt-i-sprawdzanie poprawności jeśli tryb = 0 (odczyt)-
 
      If Zapis = 0 Then
         For Adres = 0 to 448 step 64   ' zakres obszaru pamieci eeprom adres co 64 (128 = 2 rozkazy)
            Porownanie = 0
            For X = 0 to 63
               P2 = X + Adres
               Readeeprom Kod , P2            'odczytywanie z pamięci EEPROM
               Kod = Kod - 3                  'tolerancja 120us  (trzy przerwania od timera0)
               If Kod <> Tab(X) Then
                  Incr Kod
                  If Kod <> Tab(X) Then
                     Incr Kod
                     If Kod <> Tab(X) Then
                        Incr Kod
                        If Kod <> Tab(X) Then
                           Incr Kod
                           If Kod <> Tab(X) Then
                              Incr Kod
                              If Kod <> Tab(X) Then
                                 Incr Kod
                                 If Kod <> Tab(X) Then
                                    Porownanie = 1
                                 End If
                              End If
                           End If
                        End If
                     End If
                  End If
               End If
            Next X
 
            If Porownanie = 0 then
               Exit for
            End If
         Next Adres
      End If
'-----------------------odczyt z odbiornika IR----------------------------------------------
 
      If Porownanie = 0 Then                   'jezeli czasy sie zgadzaja
         If zapis = 0 then
 
            If Adres = 0  or Adres = 64 then        ' odczyt komenda 1
               Toggle portc.2
            End If
 
            If Adres = 128 or Adres = 192 Then         ' odczyt komenda 2
               Toggle portc.3
            End If
 
            If Adres = 256 or Adres = 320 Then        ' odczyt komenda 3
               Toggle portc.4
            End If
 
            If Adres = 384 or Adres = 448 Then         ' odczyt komenda 4
               Toggle portc.5
            End If
 
         End If
      End If
 
      Licznik1 = 0
      Disable Timer0              'wyłaczenie timera0
      X = 0
   End If
   P2 = 0
 
Return
 
'wlaczenie programowania odbiornika IR--z-przycisku-programowanie1------------------------------
Programowanie:
 
   Portc.2 = 0
   Portc.3 = 1
   Portc.4 = 1
   Portc.5 = 1    ' sygnalizacja zapisu pierwszego
 
   Incr PR
   If PR = 1 then           'programowanie adresu 0
      Adres = 0
      Zapis = 1
 
   End If
 
Return