Zitat Zitat von R2D2 Bastler Beitrag anzeigen
Ich bin, wie bereits anfangs erwähnt, nicht total auf "meinen" Code fixiert. Ich nehme auch gern jede andere Möglichkeit der Codegestaltung/Übertragung/Auswertung in Kauf. Es sollen lediglich 4 verschiedene Befehle übertragen werden können und keine Wait-Befehle in einer ISR beinhalten, da ich sonst beim weiteren Ausbau des Codes (RC-Signale einlesen etc) Schwierigkeiten bekomme.
Hallo,
noch ein Sendecodeschnipsel zu der weiter oben erwähnten Zeitmeßmethode und ein "Übertragungscode". Kann aber nicht absehen, ob Dein weiterer Ausbau des Codes im Empfänger nicht die Hauptschleifenlaufzeit zu lang macht

Startbit ist immer 400µs lang und wird mit Burst übertragen
Ein LOW Datenbit wird mit 600µs Länge übertragen
Ein HIGH Datenbit wird mit 800µs Länge übertragen
Ob Datenbit mit Burst oder Pause übertragen wird, hängt von seiner Stelle in der Sendereihenfolge ab.
Das erste, dritte, also alle ungeraden Datenbits (wenn mit eins zu zählen begonnen wird), wird mit Pause (Gap) übertragen.
Die geraden Datenbits werden mit Burst übertragen.
Bei einer geraden Anzahl zu übertragender Datenbits ist der Carrier zum Schluß also abgeschaltet.
Mit dem Startbit kann synchronisiert werden.
Maximale Rahmenzeit ist incl. Sicherheitszeit zwischen zwei Rahmen 2400µs, min. ist 2000µs

Habe nicht genau ins Datenblatt geschaut bzw nicht getestet; falls die Erholungszeiten und Ansprechzeiten des TSOP nicht eingehalten werden, kann man an den Zeiten natürlich noch was drehen.

Bleibt "nur" noch die Auswerteroutine im Empfänger anzupassen und fehlerhafte Berechnungen der Impulse/Pausen ausschließen, wenn sich lange nichts tut (verstrichene Zeit ist größer 255 Timerticks).

Code:
do

Waitus 400                                                  'Sicherheitszeit zwischen zwei Commands

'Startbit (Ir_befehl.2) senden (immer 1)
Ddrb.0 = 1                                                  'carrier on, burst begin
Waitus 400                                                  'Startbit soll 400µs lang sein
Ddrb.0 = 0                                                  'carrier off, burst ende

'erstes Datenbit
Select Case Ir_befehl.1 
  Case 0 : Waitus 600                                       'für erstes datenbit=0 bleibt carrier für 600µs off
  Case 1 : Waitus 800                                       'für erstes datenbit=1 bleibt carrier für 800µs off
End Select

'zweites Datenbit
Ddrb.0 = 1                                                  'carrier on, burst begin
Select Case Ir_befehl.0
  Case 0 : Waitus 600                                       'ist zweites datenbit=0 ist carrier für 600µs on
  Case 1 : Waitus 800                                       'ist zweites datenbit=1 ist carrier für 800µs on
End Select
Ddrb.0 = 0                                                  'carrier zum Schluß wieder off, burst ende

loop
Alles noch halbgar
Gruß
Searcher