Hallo,
Zitat Zitat von R2D2 Bastler Beitrag anzeigen
Mann, das "bisschen" IR-Übertrtragen bringt mich bald ins Grab...
Hier noch ein Sargnagel

Du hattest doch zuletzt ein Programm zum Einlesen und Ausgeben von Servo Signalen auf Tiny45 gemacht. Das hab ich hergenommen und ASM der EmpfangsISR angepaßt und Codeschnipsel für eine IR-Empfangsprogramm draus gemacht. Ging besser als viel Text zu schreiben.

Im Grunde werden Länge von IR Signalpause und IR Signalimpuls vom TSOP gemessen. Die Länge auf Gültigkeit geprüft und einer Auswerteroutine übergeben. Hoffe ist verständlich und es bleibt noch einige Arbeit ...

Wie damit Sender UND Empfänger auf einem µC untergebracht werden ??? Irgendwie einen Timer doppelt verwenden. Geht erstmal nur ums Prinzip.

Code:
'======================================================
'ISR
'======================================================


Rc_eingang_1:                                               'ISR mit NOSAVE anspringen
 $asm
   push r17                                                 'Register auf Stack sichern
   sbis pinb , 2                                            'Skip next Instr if PINB.2 = 1
   rjmp Puls_ende1                                          'Springe Puls_ende
   in r17 , tcnt1                                           'Timer1 Wert holen
   sts {Rc_signal_1_start} , r17                            'Speichere Timer1 nach Rc_signal_1_start

'##### für IR Bitlängenmessung
   ldi r17 , 1
   sts {Rc_signal_1_start_flag} , r17                        'Setze Flag zur Bearbeitung von Impulslaenge in Hauptschleife
'#####

   rjmp ende1                                               'Springe zum Ende
  Puls_ende1:
   in r17 , tcnt1                                           'Timer1 Wert holen
   sts {Rc_signal_1_stop} , r17                             'Speichere Timer1 nach Rc_signal_1_stop
   ldi r17 , 1
   sts {Rc_signal_1_stop_flag} , r17                        'Setze Flag zur Bearbeitung von Impulslaenge in Hauptschleife
  Ende1:
   pop r17                                                  'Register vom Stack zurückholen
 $end Asm
Return




do   '####   Haupschleifenausführung darf nicht länger als eine gültige Bitlänge dauern

  If Rc_signal_1_start_flag = 1 Then                           'Bearbeitung nur, wenn ISR Pulsanfang gefunden hat
      Pausen_laenge_1 = Rc_signal_1_stop - Rc_signal_1_start
      Rc_signal_1_start_flag = 0
      if Pausen_laenge > 400µs and pausen_laenge < 600µs then     'vorsicht pseudocode
        received_bit = 0
        received_bit_flag = 1                                   'Anzeige eines Emfangs eines gültigen Bits  
      end if
  End If

  If Rc_signal_1_stop_flag = 1 Then                           'Bearbeitung nur, wenn ISR Pulsende gefunden hat
      Impuls_laenge_1 = Rc_signal_1_stop - Rc_signal_1_start
      Rc_signal_1_stop_flag = 0
      if Impuls_laenge > 400µs and Impuls_laenge < 600µs then    'vorsicht pseudocode
        received_bit = 1
        received_bit_flag = 1                                    'Anzeige eines Emfangs eines gültigen Bits  
      end if
  End If


  if received_bit_flag = 1 then

       '### Empfangene Bits (die von "received_bit") aufreihen und auf gültiges bitmuster scannen

     received_bit_flag = 0
  end if

loop
Gruß
Searcher