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. 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. $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
|
|||