Forum: Mikrocontroller und Digitale Elektronik IRMP und NEC-Protokoll


von ugly_micro (Gast)


Lesenswert?

Hallo,

ich habe eine IR-Fernbedienung, die mit dem NEC-Protokoll arbeitet.
Nun habe ich mit einem IR-Decoder herausgefunden, dass die raw-bits 
genau 0xFF02FD entsprechen.
Wenn ich nun IRMP benutze, dann bekomme ich folgendes heraus:
address: 0xFF00
command: 0x40

Der command ist klar. Aber irgendwie habe ich bei der Adresse 0xFF 
erwartet. Meines Wissens ist die Adresse nämlich nur 8-bit lang + 8-bit 
invertierte Adresse.
Gibt es das auch anders? Und wie erkennt IRMP denn, was von beidem es 
ist? In dem Fall mit der Adresse 0xFF == ~0x00 wäre schließlich beides 
möglich.

Danke!

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

ugly_micro schrieb:
> address: 0xFF00

Das sieht richtig aus. Wenn man 0xFF invertiert, ist es doch 0x00.
Es gehört zu den IRMP Konventionen, das Address und Command als uint16_t 
abgelegt werden, da die Datenstruktur ja auch für andere Protokolle 
passen soll.

von ugly_micro (Gast)


Lesenswert?

Matthias S. schrieb:
> ugly_micro schrieb:
>> address: 0xFF00
>
> Das sieht richtig aus. Wenn man 0xFF invertiert, ist es doch 0x00.
> Es gehört zu den IRMP Konventionen, das Address und Command als uint16_t
> abgelegt werden, da die Datenstruktur ja auch für andere Protokolle
> passen soll.

Es geht mir aber darum, dass dann nur 0xFF oder auch nur 0x00 doch 
eigentlich die Adresse ist.
Der Befehl ist ja auch nicht 0xBF40 sondern 0x40.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Auzug aus

https://www.mikrocontroller.net/articles/IRMP#NEC_.2B_extended_NEC
1
Daten NEC       8 Adress-Bits +
2
                8 invertierte Adress-Bits +
3
                8 Kommando-Bits +
4
                8 invertierte Kommando-Bits

Um einen Standard-NEC-Frame eindeutig festzulegen, braucht man lediglich 
2 Bytes, nämlich 8 Adress-Bits + 8 Kommando-Bits. Der Rest ist 
redundanterweise einfach invertiert, also Byte 2 und Byte 4.

Wenn ich aber im Artikel eine Zeile weiterlese, finde ich:
1
Daten ext. NEC  16 Adress-Bits
2
                8 Kommando-Bits +
3
                8 invertierte Kommando-Bits

Die Lösung dieses vermeintlichen Widerspruches ist einfach:

Irgendwann gingen den Herstellern die 256 maximal möglichen Adressen 
aus. Also hat man das Protokoll erweitert ("Extended NEC") und auf die 
Forderung, dass das zweite Byte im Frame die negierte 8-Bit-Adresse ist, 
verzichtet.

Damit hat man nun bis zu 65536 Adressen. In der Regel ist es aber 
trotzdem so, dass meist das zweite Byte das negierte erste Byte ist. 
Aber es ist nicht zwingend. Und damit sind nun Geräteadressen von 
0x000 bis 0xFFFF möglich.

Aus diesem Grund gibt IRMP eine vollständige 16 Bit-Adresse zurück und 
einen 8-Bit Kommando-Code. Letzterer geht also lediglich nur von 0x00 
bis 0xFF.

Mit 2 Byte Adressen und 1 Byte Kommando-Code sind nun sowohl NEC als 
auch Extended NEC eindeutig spezifiziert.

EDIT:

Okay, ich hätte im IRMP daraus auch zwei Protokolle machen können, wie 
z.B. NEC und EXT_NEC. Da die technischen Merkmale sich aber nur in 
diesem einen Punkt unterscheiden, behandle ich beide als "Extended NEC". 
Damit der Frame von der Identifikation her eindeutig ist und auch von 
IRSND eindeutig reproduziert werden kann, war die Erweiterung auf 16 Bit 
für die Geräteadresse die logische Konsequenz - so wie es auch die 
Hersteller gemacht haben.

IRMP behandelt also alle NEC-Frames als Extended-NEC-Protokoll. Denn das 
Extended-NEC-Protokoll ist einfach eine Obermenge von Standard-NEC.

Nachlesen kannst Du das im Detail auch auf:

https://www.sbprojects.net/knowledge/ir/nec.php

: Bearbeitet durch Moderator
von ugly_micro (Gast)


Lesenswert?

Danke.
Das heißt aber, wenn ich mit IRSND 0xF8 verschicke, bekomme ich 0x8F70 
zurück, oder?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

ugly_micro schrieb:
> Das heißt aber, wenn ich mit IRSND 0xF8 verschicke, bekomme ich 0x8F70
> zurück, oder?

Du meinst jetzt als Adresse? Nein.

Wenn Du 0xF8 als Geräteadresse im IRSND verwendest, dann ist das die 
16-Bit-Adresse 0x00F8. Und Du wirst auch exakt 0x00F8 im IRMP 
zurückbekommen.

Wenn Du jedoch als Kommando 0xF8 verschickst, dann ist Byte Nr. 3 = 0xF8 
und Byte nur 4 = 0x70. IRMP empfängt diese, prüft, ob das Byte Nr. 3 
gleich dem negierten Byte Nr. 4 ist und gibt dann als Kommando wieder 
0xF8 zurück.

Ergo: Du bekommst transparent genau das raus, was Du vorne reingesteckt 
hast. Alles andere wäre auch Unsinn. Also kümmere Dich nicht darum, wie 
der IR-Frame intern aussieht, sondern merke Dir einfach:

"Bei NEC ist die Geräteadresse 16-Bit breit, das Kommando nur 8 Bit. Ich 
bekomme vom IRMP exakt das zurück, was ich bei IRSND gesendet habe."

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.