' 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.= 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.= Output                                   'Standbylijn hoog
  Set Portb.0

  Config Portd.= Output                                   'led standby-rood
  Set Portd.0

  Config Portd.= Output                                   'led aan-groen
  Reset Portd.1

  Config Portd.= Input                                    'knop

  Config Portd.= 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.= 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