' Versie 1.0 Peter L.
$regfile = "ATTiny2313.dat" 'Controllertyp
$framesize = 24 'Stackanweisungen
$swstack = 8
$hwstack = 32 'Achtung ISR=32 Byte
$crystal = 8000000 'bei Änderung den Timer0 neu einstellen!!
$lib "mcsbyte.lbx" 'ACHTUNG:numeric<>string conversion routines only for bytes
$initmicro
Input_pin Alias Pind.3 'Pin für TSOP1736
Config Timer0 = Timer , Prescale = 8
On Timer0 Timer_irq
Const Timervorgabe = 78 'Timeraufruf alle 178µs (10 Samples = 1 Bit = 1,778ms)
Enable Timer0 'Hier werden die Timer aktiviert
Enable Interrupts
'Timing 10 Samples Per Bit = 1,778ms
Const Samples_early = 8 'Flanke Frühestens Nach 8 Samples
Const Samples_late = 12 'Flanke Spätestens Nach 12 Samples
Const Samples_min = 3 'Flanke Vor 3 Samples - > Paket Verwerfen
' EEPROM variabele RC5 device code
Dim E_remote_adres As Eram Byte
Dim E_remote_knop As Eram Byte
'Variablen ISR
Dim Sample As Byte 'eigentlich Bit, spart aber 46Byte ROM
Dim Ir_lastsample As Byte 'zuletzt gelesenes Sample
Dim Ir_bittimer As Byte 'zählt die Aufrufe von Timer_IRQ
Dim Ir_data_tmp As Word 'Bitstream
Dim Ir_bitcount As Byte 'Anzahl gelesener Bits
Dim Address_rc5 As Byte , Command_rc5 As Byte , Rc5_flag As Bit
Dim T As Byte , Remote_adres As Byte , Remote_knop As Byte
'programmeermode remote
Waitms 250
If Rc5_flag = 1 Then 'bij opstarten remoteknop ingedrukt?
E_remote_adres = Address_rc5 'schrijf rc5 device code naar EEPROM
E_remote_knop = Command_rc5 'schrijf rc5 remote knop naar EEPROM
' knipper leds
For T = 1 To 5
Reset Portd.0 'led standby-rood
Set Portd.1 'led aan-groen
Waitms 100
Reset Portd.1
Set Portd.0
Waitms 100
Next T
Reset Rc5_flag
End If
'haal rc5 device code op uit EEPROM
Remote_adres = E_remote_adres
If Remote_adres = 255 Then Remote_adres = 0 'Indien geen device code in EEPROM dan TV remote
Remote_knop = E_remote_knop
If Remote_knop = 255 Then Remote_knop = 12 'Indien geen knop code in EEPROM dan Standby knop
'hoofdlus
Do
If Rc5_flag = 1 Then ' rc5 code ontvangen
If Address_rc5 = Remote_adres Then 'code van juiste remote?
If Command_rc5 = Remote_knop Then 'code van juiste knop?
Gosub Togglestandby
End If
End If
Reset Rc5_flag 'volgende rc5 code mag ontvangen worden
End If
If Pind.5 = 0 Then 'knop ingedrukt?
Gosub Togglestandby
End If
Loop
End
Togglestandby:
Toggle Portb.0 'Standbylijn
Toggle Portd.0 'led rood
Toggle Portd.1 'led groen
Wait 3
Return
_init_micro:
'init poorten
Config Portb.0 = Output 'Standbylijn hoog
Set Portb.0
Config Portd.0 = Output 'led standby-rood
Set Portd.0
Config Portd.1 = Output 'led aan-groen
Reset Portd.1
Config Portd.5 = Input 'knop
Config Portd.3 = Input 'IR receiver
Set Porta.0 'pullup unused pins
Set Porta.1
Set Portd.2
Set Portd.4
Set Portd.6
Set Portb.1
Set Portb.2
Set Portb.3
Set Portb.4
Set Portb.5
Set Portb.6
Set Portb.7
Return
Timer_irq:
Timer0 = Timervorgabe
Sample = Not Input_pin
'bittimer erhöhen (bleibt bei 255 stehen)
If Ir_bittimer < 255 Then Incr Ir_bittimer
'flankenwechsel erkennen
If Ir_lastsample <> Sample Then
If Ir_bittimer <= Samples_min Then
'flanke kommt zu früh: paket verwerfen
Ir_bitcount = 0
Else
'nur Flankenwechsel in Bit-Mitte berücksichtigen
If Ir_bittimer >= Samples_early Then
If Ir_bittimer <= Samples_late Then
'Bit speichern
Shift Ir_data_tmp , Left , 1
Ir_data_tmp = Ir_data_tmp + Sample
Incr Ir_bitcount
Else
'Flankenwechsel zu spät: Neuanfang mit gemessener Flanke
Ir_bitcount = 1
Ir_data_tmp = Sample
End If
'bittimer zurücksetzen wenn Timer > Samples_early
Ir_bittimer = 0
End If
End If
'Kontrolle des Startbits auf 1
If Ir_bitcount = 1 Then Ir_bitcount = Ir_data_tmp.0
'Alle 14 Bits gelesen?
If Ir_bitcount >= 14 Then
Command_rc5 = Ir_data_tmp 'Bit 6 und 7 siehe unten
Shift Ir_data_tmp , Right , 6
Address_rc5 = Ir_data_tmp And &B00011111
'For extended RC5 code, the extended bit is bit 6 of the command.
Command_rc5.6 = Not Ir_data_tmp.6
'The toggle bit
' Toggle_rc5 = Ir_data_tmp.5
'Paket erfolgreich gelesen
Set Rc5_flag
'paket zurücksetzen
Ir_bitcount = 0
End If
End If
'sample im samplepuffer ablegen
Ir_lastsample = Sample
Return