Hallo,
Zitat von
R2D2 Bastler
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
Lesezeichen