Universal IR Empfänger für PC

Gast #102020
Lesenswert?

Hi, ich habe das mal überflogen.
Scheint genau das, was ich suche. Ich muss das noch anpassen können.
Könntest du mir bitte eine PAP(Programm Ablauf Plan) schiecken?
Oder einfach mit Worten so beschreiben, wie dein Programm funktioniert.
Den Ansatz halt, damit ich weiß, ob ich es an meine Bedürfinisse
anpassen kann.
Danke
Gast #102021
Lesenswert?

Das Programm startet mit _reset.

Wichtig in der HW init routine sind Timer0 und ext. Interrupt setup
Diese zwei braucht das Programm unbedingt. Die Sendefunktion ist noch
fürn Müll :-) daher kannst du die LEDs weglassen.

rcall putchar: Es wird ein SW UART zum Senden verwendet, der keinen
nachgeschalteten Inverter braucht. Du kannst die Codes aber auch intern
verarbeiten, statt sie an andere Geräte zu senden.

bitschieben: Schiebt das gemessene Bit in den Zwischenspeicher.
Verhindert einen Überlauf (max. 20 Bytes=160 Bits können erfasst
werden)

sendnibble: Übergibt den Hexwert für ein halbes Byte an den UART.

main: In der Hauptschleife wird auf ein Event gewartet:
Events sind: Ext Int, Timer0 overflow und SW UART received a byte
Dir fällt sicherlich dieser ominöse Debugmode auf. Der ist für die
Sendefunktionalität, vergiss ihn einfach.

Der Timer0 wird zum Zeitmessen benutzt. Sollte er überlaufen, ist das
Signal wohl zu Ende und die Daten werden per UART verschickt.
Im Sendemodus wird er auch in der Hauptschleife verwendet (Block of
T0INT), ignorier das mal, genauso "Block of RXCHAR".

Der ext. Int. steuert das eigentliche Datenerfassen:
Jedesmal wenn eine fallende Flanke auftritt, wird die Zeit genommen.
Über einen Bitzähler wird bestimmt, wo man gerade ist. Die beiden
ersten Flanken werden ignoriert, da Fernbedienungen zwei lange Pulse
vorneweg senden, die keine Nutzdaten enthalten.
Nach der 2. Flanke wird berechnet, wie lange ein kurzer und langer
Impuls ist. Eigentlich berechnet er die Grenze zwischen lang und kurz,
um später die Bits 0 und 1 unterscheiden zu können.
Mit dieser Schwelle wird jede gemessene Pulszeit verglichen und je nach
Länge als 0 oder 1 gewertet.
Das T flag: Um kurze Pulse immer als 0 zu werten, muss man feststellen
ob der erste Puls auch wirklich der kurze war.
Funktioniert glaube ich noch nicht richtig...
Gast #102022
Lesenswert?

Du hast also als Grundlage dir gelegt, dass die kurze Lichtimpulse eine
0 bedeuten und die Langen eine 1. Das würde auch funktionieren, wenn
man nur 2 Arten von Länger der Impulse hätte. Einen Langen und einen
kurzen Impuls mit immer gleich bleibenden pausen dazwischen. So ist es
aber nicht immer. Es gibt viele Codes, die Informationen mit
unterschiedlichen Längen von Impulsen und gleichzeitig mit
unteschiedlich langen Pausen übertragen(RC5-Code). Es gibt sogar
welche, die nur mit Pausen arbeiten. Die Impulse selbst sind immer
gleich.(DENON-Code,NEC-Code)Würde man so ein Code an deine Schaltung
schiecken, würde sie vermutlich immer nur einser ausgeben. Aber wier
gesagt: es ist nur so, wenn ich richtig verstanden habe, dass du die
langen Impulse als eine "1" und die kurzen als eine "0" erkennst,
und weiter gibst.
>Die beiden
>ersten Flanken werden ignoriert, da Fernbedienungen zwei lange Pulse
>vorneweg senden, die keine Nutzdaten enthalten.
stimmt auch nicht immer. Meines Wwissens ist es meist nur einer. Aber
von Fernbediehnung zu Fernbediehnung eben unterschiedlih.

Hast du die Schaltung mit vielen verschiedenen Geräten, Koden
ausprobiert?
Gast #102023
Lesenswert?

Deine Anmerkung ist schon berechtigt, da es Codes gibt, die
Informationen im An- und Auszustand übertragen (z.B. RC5). Allerdings
hast du noch eine Sache falsch verstanden: Die Pulsdauer setzt sich für
mein Programm zusammen aus der An- und der Auszeit (also beide Zeiten)
da immer auf fallende Flanke getriggert wird. Die binäre Information,
die das Programm erzeugt, muss daher nicht zwangsläufig identisch mit
den binären Daten der FB sein. Aber eine Eindeutigkeit ist jedenfalls
gegeben.
Getestet habe ich mit den Formaten Japan, Daewoo, RC5, uvm (über 8
verschiedene Systeme), geht einwandfrei.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren