'##############################################################################
' 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
'##############################################################################