IR_Empfaenger_mit_ATmega_auswerten
(armin77, 09.08.2013, 13:44:08)
Durch den Einsatz eines IR-Empfänger und einer Universalfernbedienung lassen
sich viele Geräte elegant und einfach steuern.
Bascom bietet dazu eine fertige komfortable Empfangsroutine für
Übertragungsprotokolle nach dem RC5 Standart. (Philips/Sony)
Diese Routine benutzt den Timer0, der damit nicht mehr im Hauptprogramm
benutzt werden kann.
Das Infrarotlicht wird mit 36kHz getaktet.
Daher sollte der Empfänger ebenfalls für 36kHz ausgelegt sein.
Eine Liste der einsetzbaren IR Empfänger.
SFH 5110
TSOP1136
TSOP1736
SFH506-36
oder Vergleichstypen.
Hier ein Beispielbild.
Zum Einsatz kommt eine einfache Universalfernbedienung von Medion.
Diese muß auf Philipps Fernseher eingestellt werden (sehr wichtig).
So habe ich den IR Empfänger an den ATMega 8 angeschlossen.
Im Bascom Programm habe ich den internen Pull-Up Widerstand von PinB.0 eingeschaltet.
Macht man dies nicht, sollte man einen externen Widerstand (ca.4,7K-10KOhm) von +5V zum
Ausgang des IR-Empfängers schalten.
Die Anschlußbelegung des IR-Empfänger (+5V, GND und Out) muß man selbstverständlich
im jeweiligen Datenblatt nachschauen.
Ich benutze hier das Beispielprogramm aus der Bascom Hilfe, daß
ich etwas abgewandelt habe.
$regfile = "m8adef.dat"
$crystal = 8000000
$hwstack = 40
$swstack = 16
$framesize = 32
Dim Geraet As Byte , Kommando As Byte
Config Pinb.0 = Input
Portb.0 = 1 'Pull Up Widerstand einschalten
Config Rc5 = Pinb.0, Wait = 2000 'PinB.0 als RC5 Eingang deklarieren
Enable Interrupts
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2 'LCD konfigurieren
Config Lcd = 20 * 4
Cls
Cursor Off
Cls
Locate 1 , 1
Lcd "Geraet:"
Locate 2 , 1
Lcd "Kommando:"
Do
Getrc5(geraet , Kommando) 'Gerät und Komando vom IR Empfänger lesen
If Geraet < 255 Then 'Falls etwas empfangen -> anzeigen
Kommando.7 = 0 'Togglebit löschen
Locate 1 , 11
Lcd Geraet ; " "
Locate 2 , 11
Lcd Kommando ; " "
End If
Loop
End
$crystal = 8000000
$hwstack = 40
$swstack = 16
$framesize = 32
Dim Geraet As Byte , Kommando As Byte
Config Pinb.0 = Input
Portb.0 = 1 'Pull Up Widerstand einschalten
Config Rc5 = Pinb.0, Wait = 2000 'PinB.0 als RC5 Eingang deklarieren
Enable Interrupts
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2 'LCD konfigurieren
Config Lcd = 20 * 4
Cls
Cursor Off
Cls
Locate 1 , 1
Lcd "Geraet:"
Locate 2 , 1
Lcd "Kommando:"
Do
Getrc5(geraet , Kommando) 'Gerät und Komando vom IR Empfänger lesen
If Geraet < 255 Then 'Falls etwas empfangen -> anzeigen
Kommando.7 = 0 'Togglebit löschen
Locate 1 , 11
Lcd Geraet ; " "
Locate 2 , 11
Lcd Kommando ; " "
End If
Loop
End
Das Programm empfängt den Code der Fernbedienung an PinB.0 und dekodiert ihn.
Jetzt kann man die Variable Kommando auswerten und verschiedene Ausgänge schalten.
Hier noch ein Beispiel um drei Ausgänge mit der Fernbedienung zu schalten.
$regfile = "m8adef.dat"
$crystal = 8000000
$hwstack = 40
$swstack = 16
$framesize = 32
Dim Geraet As Byte , Kommando As Byte
Config Pinb.0 = Input
Portb.0 = 1 'Pull Up Widerstand einschalten
Config Rc5 = Pinb.0 , Wait = 2000 'PinB.0 als RC% Eingang deklarieren
Config Portb.2 = Output
Config Portb.3 = Output
Config Portb.4 = Output
Enable Interrupts
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2 'LCD konfigurieren
Config Lcd = 20 * 4
Cls
Cursor Off
Cls
Locate 1 , 1
Lcd "Geraet:"
Locate 2 , 1
Lcd "Kommando:"
Do
Getrc5(geraet , Kommando) 'Gerät und Komando vom IR Empfänger lesen
If Geraet < 255 Then 'Falls etwas empfangen -> anzeigen
Kommando.7 = 0 'Togglebit loeschen
Locate 1 , 11
Lcd Geraet ; " "
Locate 2 , 11
Lcd Kommando ; " "
Portb.2 = 0
Portb.3 = 0
Portb.4 = 0
End If
Select Case Kommando
Case 1 : Portb.2 = 1
Case 2 : Portb.3 = 1
Case 3 : Portb.4 = 1
End Select
Loop
End
$crystal = 8000000
$hwstack = 40
$swstack = 16
$framesize = 32
Dim Geraet As Byte , Kommando As Byte
Config Pinb.0 = Input
Portb.0 = 1 'Pull Up Widerstand einschalten
Config Rc5 = Pinb.0 , Wait = 2000 'PinB.0 als RC% Eingang deklarieren
Config Portb.2 = Output
Config Portb.3 = Output
Config Portb.4 = Output
Enable Interrupts
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2 'LCD konfigurieren
Config Lcd = 20 * 4
Cls
Cursor Off
Cls
Locate 1 , 1
Lcd "Geraet:"
Locate 2 , 1
Lcd "Kommando:"
Do
Getrc5(geraet , Kommando) 'Gerät und Komando vom IR Empfänger lesen
If Geraet < 255 Then 'Falls etwas empfangen -> anzeigen
Kommando.7 = 0 'Togglebit loeschen
Locate 1 , 11
Lcd Geraet ; " "
Locate 2 , 11
Lcd Kommando ; " "
Portb.2 = 0
Portb.3 = 0
Portb.4 = 0
End If
Select Case Kommando
Case 1 : Portb.2 = 1
Case 2 : Portb.3 = 1
Case 3 : Portb.4 = 1
End Select
Loop
End
Ein weiteres Beispiel mit umschalten/toggeln der Ausgänge
$regfile = "m8adef.dat"
$crystal = 8000000
$hwstack = 40
$swstack = 16
$framesize = 32
Dim Geraet As Byte , Kommando As Byte
Config Pinb.0 = Input
Portb.0 = 1 'Pull Up Widerstand einschalten
Config Rc5 = Pinb.0 , Wait = 2000 'PinB.0 als RC% Eingang deklarieren
Config Portb.2 = Output
Config Portb.3 = Output
Config Portb.4 = Output
Enable Interrupts
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2 'LCD konfigurieren
Config Lcd = 20 * 4
Cls
Cursor Off
Cls
Locate 1 , 1
Lcd "Geraet:"
Locate 2 , 1
Lcd "Kommando:"
Do
Getrc5(geraet , Kommando) 'Gerät und Komando vom IR Empfänger lesen
If Geraet < 255 Then 'Falls etwas empfangen -> anzeigen
Kommando.7 = 0 'Togglebit loeschen
Locate 1 , 11
Lcd Geraet ; " "
Locate 2 , 11
Lcd Kommando ; " "
End If
Select Case Kommando
Case 1 : Toggle Portb.2
Case 2 : Toggle Portb.3
Case 3 : Toggle Portb.4
End Select
Waitms 200
Loop
End
$crystal = 8000000
$hwstack = 40
$swstack = 16
$framesize = 32
Dim Geraet As Byte , Kommando As Byte
Config Pinb.0 = Input
Portb.0 = 1 'Pull Up Widerstand einschalten
Config Rc5 = Pinb.0 , Wait = 2000 'PinB.0 als RC% Eingang deklarieren
Config Portb.2 = Output
Config Portb.3 = Output
Config Portb.4 = Output
Enable Interrupts
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2 'LCD konfigurieren
Config Lcd = 20 * 4
Cls
Cursor Off
Cls
Locate 1 , 1
Lcd "Geraet:"
Locate 2 , 1
Lcd "Kommando:"
Do
Getrc5(geraet , Kommando) 'Gerät und Komando vom IR Empfänger lesen
If Geraet < 255 Then 'Falls etwas empfangen -> anzeigen
Kommando.7 = 0 'Togglebit loeschen
Locate 1 , 11
Lcd Geraet ; " "
Locate 2 , 11
Lcd Kommando ; " "
End If
Select Case Kommando
Case 1 : Toggle Portb.2
Case 2 : Toggle Portb.3
Case 3 : Toggle Portb.4
End Select
Waitms 200
Loop
End
Ein Bild vom Testaufbau.