'############################################################################## ' IR-Empfaenger.BAS Stand 12.01.2010 ' ----------------- (C) Markus Fulde ' ' Beispielprogramm für einen universellen IR-Empfänger mit RC5 codierung. ' Das Baspiel basiert auf der Vorlage RC5.BAS von MCS Electronics, basierend ' auf den Atmel AVR410 application notes. ' Das Beispiel wurde um eine LCD-Display-Ansteuerung mit Ausgabe von ' Adresse und Kommando ergänzt. ' Das Beispielprogramm ist angepasst auf mein HW-Design IR-Empfaenger welches ' noch die folgenden Eigenschaften besitzt: ' - Spannungsversorgung über stabilisrtes 5V-Netzteil 5V mit ' Platinensteckverbinder 2-polig ' - blinkende Alive-LED ' - Mikrocontroller ATmega8 (inkl. ISP und Reset) 8 MHz extern ' - LCD-Display 2x16 DOG-M EA162 ' ' Am Beispiel wird der Empfang und die dekodierung eines RC5 Fernsteuerungs- ' signals mit einem TSOP322 Infrarotempfänger gezeigt. ' Der Anschluss des IR findet über Pin D.7 des Atmega8 statt. ' Für die Funktion GETRC wird der Timer0 inkl. des Timer0 Interrupt benötigt. ' ' Das Beispielprogramm dient der Demonstration und kann ohne Genemigung ' beliebig weiterverwendet werden. ' '############################################################################## '------------------------------------------------------------------------------ ' Compilerinstruktionen und Compilerdirektiven '------------------------------------------------------------------------------ $regfile = "m8def.dat" ' Definitionsdatei für ATmega128 laden $crystal = 8000000 ' Quarzfrequenz für 16 MHz festlegen $hwstack = 128 ' HW-Stack auf 128 Bytes erweitern $swstack = 64 ' SW-Stack auf 64 Bytes erweitern $framesize = 80 ' Framesize auf 80 Byte festlegen '------------------------------------------------------------------------------ ' Definition von Ressourcen '------------------------------------------------------------------------------ ' ----- LED: Anzeige-LED's ----- ' Alive-LED Alive_pin Alias Pinb.0 ' GPIO für Alive-LED (für DDR oder Input) Alive Alias Portb.0 ' GPIO für Alive-LED (für Output oder PullUp) ' RC5-Pin Rc5_pin Alias Pind.7 ' GPIO für RC5 Empfänger ' LCD-Display Db4_pin Alias Portc.0 ' GPIO für LCD Pin4 Db5_pin Alias Portc.1 ' GPIO für LCD Pin5 Db6_pin Alias Portc.2 ' GPIO für LCD Pin6 Db7_pin Alias Portc.3 ' GPIO für LCD Pin7 E_pin Alias Portc.4 ' GPIO für LCD E Rs_pin Alias Portc.5 ' GPIO für LCD RS '------------------------------------------------------------------------------ ' Definition von Konstaten '------------------------------------------------------------------------------ Const Timervorgabe = 34286 ' Zeitvorgabe für Sekunden-Timer Const Lcd_kontrast_default = 35 ' LCD-Default-Kontrast '------------------------------------------------------------------------------ ' Definition von Variablen und Datentypen '------------------------------------------------------------------------------ ' Arbeitsvariablen für Adress- und Kommando-Informationen Dim Address As Byte , Command As Byte ' Display-Kontrast Dim Kontrastwert As Byte ' Temporäre Arbeitsvariablen definieren Dim Tempvar_1 As Byte ' Temporäre Variable 1 Dim Tempvar_2 As Byte ' Temporäre Variable 2 '------------------------------------------------------------------------------ ' Konfiguration und Basiseinstellungen (Projekt und Testumgebung) '------------------------------------------------------------------------------ ' ----- Variablen und Werte ----- Kontrastwert = Lcd_kontrast_default ' Kontrastwert ' ----- CONFIG ----- ' Sekunden-Timer und Teiler definieren Config Timer1 = Timer , Prescale = 256 ' Timer Konfiguration On Timer1 Sekunden_tick ' Interruptserviceroutine ' Konfiguration LCD Display Config Lcdpin = Pin , Db4 = Db4_pin , Db5 = Db5_pin , Db6 = Db6_pin , Db7 = Db7_pin , E = E_pin , Rs = Rs_pin Config Lcd = 16 * 2 , Chipset = Dogm162v5 ' DOG-M Treiber laden Config Lcdbus = 4 ' LCD arbeitet über 4-Bit Initlcd ' LCD initialisieren Waitms 100 ' 100ms nach Init warten Cursor Off Noblink ' Blinkenden Cursor abschalten Cls ' Clear Screen ' RC5 Empfänger Config Rc5 = Rc5_pin ' ----- Port's und Pin's ----- ' LED: LED's Config Alive_pin = Output ' Ausgang konfigurieren ' ----- Freigabe aller Interrupts ---- Enable Timer1 Enable Interrupts ' ----- Gosub's ----- Gosub Lcd_kontrastset ' LCD Kontrast einstellen ' ############################################################################# ' ' Hauptprogramm ConvCtrl ' ' ############################################################################# Locate 1 , 1 : Lcd "*RC5-Empfaenger*" Locate 2 , 1 : Lcd "Waiting for RC5!" ' ---------------------------------------------- ' ----- Hier ist die Programmhauptschleife ----- ' ---------------------------------------------- Do ' hole die Daten von dem konfigurierten IR-Empfänger Getrc5(address , Command) ' prüfe ob etwas empfangen wird, üblich ist 255 = kein Empfang If Address <> 255 Then ' JA, es wurde etwas empfangen ' Lösche das Toggle-Bit 7 welches auf Bit 7 im Kommando mit zurückgegeben wird. ' Das Toggle-Bit toggelt bei jedem empfangenen Kommando. ' Für den extended RC5 Code wird Bit 6 des Kommandobytes verwendet. Command = Command And &B01111111 ' LCD löschen und empfangenen Parameter ausgeben Cls Locate 1 , 1 : Lcd "ADR:" Locate 1 , 10 : Lcd "COM:" Locate 2 , 1 : Lcd Address Locate 2 , 10 : Lcd Command End If Loop '## End Hauptprogramm ######################################################### '****************************************************************************** ' Interruptroutinen '****************************************************************************** '------------------------------------------------------------------------------ ' Interrupt-Service-Routine (Timer1): Sekunden_tick ' Routine zur Auswertung des Timer Interrupts '------------------------------------------------------------------------------ Sekunden_tick: Timer1 = Timervorgabe Toggle Alive Return '-- End Sekunden_tick --------------------------------------------------------- '****************************************************************************** ' GOSubroutinen '****************************************************************************** '------------------------------------------------------------------------------ ' LCD - Gosub-Routine: Lcd_contrastset ' Routine berechnen neue Kontrastwerte und steuert direkt den ' Kontroller des Display an. '------------------------------------------------------------------------------ Lcd_kontrastset: ' Kontrasteinstellung Display ' Verarbeitung des Kontrastwertes für High-Byte und Low-Byte Tempvar_1 = Kontrastwert And &B00001111 Tempvar_1 = Tempvar_1 + &B01110000 Tempvar_2 = Kontrastwert Shift Tempvar_2 , Right , 4 Tempvar_2 = Tempvar_2 And &B00000011 Tempvar_2 = Tempvar_2 + &B01010100 ' Instruction Table 1 einstellen [0,1] _temp1 = &B00101001 !rCall _Lcd_control ' Tempvar_1 = &B0111xxxx für Kontrast Set Instruction Table 1 - Low Byte _temp1 = Tempvar_1 !rCall _Lcd_control ' Temovar_2 = &B010101xx für Kontrast Set Instruction Table 1 - High Byte _temp1 = Tempvar_2 !rCall _Lcd_control ' Zurückschalten auf Instruction Table 0 [0,0] _temp1 = &B00101000 !rCall _Lcd_control Return '-- End Lcd_kontrastset ------------------------------------------------------- End 'end program '###################################### END ################################### '################################### Historie ################################# ' 12.01.2010 : Version 1.0 ' Erste offizielle und vollständig umgesetzte Version '##############################################################################