<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://www.mikrocontroller.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Shortie</id>
	<title>Mikrocontroller.net - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="https://www.mikrocontroller.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Shortie"/>
	<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/articles/Spezial:Beitr%C3%A4ge/Shortie"/>
	<updated>2026-04-11T04:05:03Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.39.7</generator>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Receiver-Mainboard_Plattform_Philips_PNX8950&amp;diff=64648</id>
		<title>Receiver-Mainboard Plattform Philips PNX8950</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Receiver-Mainboard_Plattform_Philips_PNX8950&amp;diff=64648"/>
		<updated>2012-03-01T10:10:08Z</updated>

		<summary type="html">&lt;p&gt;Shortie: /* Netzteil */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Wichtige Links =&lt;br /&gt;
Hier nur die wichtigsten Links (Hauptdiskussionsthread und andere Wikis), den Rest unter &amp;quot;weitergehende Infos im Netz&amp;quot;&lt;br /&gt;
* Diskussionsthread [http://www.mikrocontroller.net/topic/210759 Pollin - Receiver-Mainboard mit Twin DVB-T/C Tuner, NXP PNX8950EH]&lt;br /&gt;
&lt;br /&gt;
* Bedienungsanleitung [http://www1.medion.de/downloads/download.pl?lang=de&amp;amp;filename=bda_md29052_de.pdf&amp;amp;id=7946&amp;amp;type=anleitungen MEDION LIFE S27200 - MD 29052]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Wichtiger Hinweis =&lt;br /&gt;
&amp;lt;span style=&amp;quot;background-color:red;color:white;font-weight:bold&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Vor dem Arbeiten an der Platine oder Öffnen des Gehäuses ist der Netzstecker (230V) zu ziehen. Denn: Der Kühlkörper (des Netzteils) führt eine Spannung von 115V!!!&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Betriebssysteme =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Bestehenden Inhalt aus dem Flash auslesen ==&lt;br /&gt;
&lt;br /&gt;
Von User AgentData wird freundlicherweise die [http://www.mikrocontroller.net/attachment/106071/complete_nand_layout.rar Erklärung sowie der Source für den Dumper] zur Verfügung gestellt. Im Ergebnis bekommt man dafür die Original Firmware-Dateien und kann so den Lieferzustand jederzeit wieder herstellen. Der für den direkten Zugriff auf das NAND benötigte Code befindet sich übrigens in der Datei /Windows/TmToolbox.dll (read/write/erase).&lt;br /&gt;
&lt;br /&gt;
== Neues Firmware-Image installieren ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039; Der Flashvorgang der Box besitzt keine Sicherung - da offenbar erst der Speicher gelöscht und dann neu geschrieben wird führt ein Stromausfall während des Vorgangs zu einem formschönen Ziegelstein.&lt;br /&gt;
&lt;br /&gt;
# Auf einen mit FAT32 formatierten USB-Stick folgende Dateien kopieren: &lt;br /&gt;
:* flashing.txt&lt;br /&gt;
:* phStbRootApp_256M_0_t.mi&lt;br /&gt;
:* phStbRootApp_256M_1_t.mi&lt;br /&gt;
:* WinCe1.nb0 &lt;br /&gt;
:Die Dateien befinden sich z.B. im Ordner WCE1 der Datei swu.zip&lt;br /&gt;
# Receiver ausschalten (Wippschalter auf der Geräterückseite)&lt;br /&gt;
# SW1 auf ON (DIL Schalter auf Pollin Board)&lt;br /&gt;
# USB-Stick am USB-Port auf der Geräterück- oder Vorderseite des Receivers anschließen&lt;br /&gt;
# Receiver einschalten (Wippschalter auf der Geräterückseite)&lt;br /&gt;
# Auf der Fernbedienung auf Power drücken. Bei einer Fehlermeldung auf dem Bildschirm kann Folgendes probiert werden:&lt;br /&gt;
:* Anderer USB Stick (oder eine SD-Karte mit Reader)&lt;br /&gt;
:* Bei der Nutzung eines IDE/SATA-Adapters muss die Festplatte via Jumper als Master gesetzt sein, um erkannt zu werden&lt;br /&gt;
:* Die Fehlermeldung &amp;quot;ERROR writing update software. Please power cycle the box to try again&amp;quot; zeigt ein fehlerhaftes Image an.&lt;br /&gt;
Wenn alles funktioniert, erscheint eine Anzeige auf dem Bildschirm, dass das Update durchgeführt wird und man den Receiver nicht ausschalten soll, bis das Update eingespielt ist. Falls irgendetwas falsch läuft, startet das Windows CE und zeigt den Telegen-Desktop. Dann nochmal alles überprüfen.&lt;br /&gt;
# Auf dem roten, 4-stelligen Frontdisplay der Box wird nun für die insgesamt 4 Flash-Vorgänge jeweils der Fortschritt in Prozent angezeigt. Achtung: Es werden insgesamt 4 Dateien einzeln geflasht, die Prozentzahl klettert also vier Mal bis auf 100%.&lt;br /&gt;
# Nach kurzer Zeit (1 oder 2 Minuten) erscheint eine Meldung, dass das Software-Update erfolgreich war&lt;br /&gt;
# Receiver ausschalten (Wippschalter auf der Geräterückseite)&lt;br /&gt;
# SW1 auf OFF setzen. &lt;br /&gt;
&lt;br /&gt;
Nun wird die Box beim Einschalten auf dem TV einen hin- und herwandernden roten Balken zeigen. Die weiteren Programmpunkte sind selbsterklärend.&lt;br /&gt;
&lt;br /&gt;
== WindowsCE (Original) ==&lt;br /&gt;
&lt;br /&gt;
*Windows CE 5.0&lt;br /&gt;
*Windows CE Kernel for MIPS (Built on Mar 29 2005 at 14:00:54)&lt;br /&gt;
*Telegent Kernel V0.9.3.16 (Built on Sep  4 2006 at 22:23:55)&lt;br /&gt;
&lt;br /&gt;
Mit aktiver More.tv Firmware oder bei Err0 während der Flashversuche führt der einfachste Weg zurück zum Auslieferungszustand über das &amp;lt;u&amp;gt;[http://www.mikrocontroller.net/attachment/111731/reflash_wince.rar Reflash-Attachment aus dem Forum]&amp;lt;/u&amp;gt;.&lt;br /&gt;
Kurzgefasst: Box aus; DIP Schalter 1 auf ON stellen; Dateien (im Wurzelverzeichnis auf Fat32) per USB Speicher in die Box einstecken; Box per Fernbedienung und &amp;lt;u&amp;gt;nicht&amp;lt;/u&amp;gt; per Taster auf Frontseite einschalten. Wenn alle &amp;lt;u&amp;gt;vier&amp;lt;/u&amp;gt; Flashdurchänge abgeschlossen sind die Box ausschalten und den DIP-Schalter auf Off zurückstellen.&lt;br /&gt;
&lt;br /&gt;
Das oben genannte Attachment enthält folgendes:&lt;br /&gt;
* WinCe0.nb0&lt;br /&gt;
* WinCe1.nb0&lt;br /&gt;
* phStbRootApp_256M_0_t.mi&lt;br /&gt;
* phStbRootApp_256M_1_t.mi&lt;br /&gt;
* flashme.exe&lt;br /&gt;
* flashing.txt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
User AgentData hat [https://www.mikrocontroller.net/attachment/105978/org_firmware_dump.rar das im Auslieferungszustand auf dem Gerät befindliche WindowsCE] ausgelesen (siehe hierzu [http://www.mikrocontroller.net/articles/Receiver-Mainboard_Plattform_Philips_PNX8950#Bestehenden_Inhalt_aus_dem_Flash_auslesen Inhalt aus dem Flash auslesen]). Dadurch kann beispielsweise eine [http://www.mikrocontroller.net/articles/Receiver-Mainboard_Plattform_Philips_PNX8950#MoreTv_als_Medion_gelabelt mit MoreTV &amp;quot;aktualisierte&amp;quot;] Box nun auch wieder in den Auslieferungszustand zurückversetzt werden. Die [http://www.mikrocontroller.net/articles/Receiver-Mainboard_Plattform_Philips_PNX8950#Neues_Firmwareimage_installieren Update-Prozedur] ist identisch.&lt;br /&gt;
&lt;br /&gt;
Screenshot der Windows CE 5.0 Oberfläche (über VNC mit der Box verbunden http://efonvnc.sourceforge.net/)&lt;br /&gt;
&lt;br /&gt;
[[Datei:CEscreenshot.png]]&lt;br /&gt;
&lt;br /&gt;
== MoreTv als Medion gelabelt ==&lt;br /&gt;
&lt;br /&gt;
Die MoreTV-Firmware stammt aus Receivern, welche u.A. von Medion verkauft wurden. Sowohl DVB-T als auch DVB-C werden unterstützt, bei letzterem jedoch kein QAM256. Die Funktionen umfassen EPG, PIP, Timergesteuerte- und Sofortaufnahmen sowie Timeshift.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ein großes Danke gilt den Benutzern Fritz und M. W.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Verwendete Soft- und Hardware&lt;br /&gt;
# Festplatte SATA-Anschluss, 160GB oder mehr (im Original 250GB), Formatierung s.u.&lt;br /&gt;
# USB-Stick, FAT32 formatiert&lt;br /&gt;
# Software-Archiv: [http://www.mikrocontroller.net/attachment/105209/swu.zip Archiv] (Forum, ZIP) &#039;&#039;&#039;oder&#039;&#039;&#039; [http://www.mikrocontroller.net/wikifiles/b/b7/Swu.part1.rar Teil 1] [http://www.mikrocontroller.net/wikifiles/2/26/Swu.part2.rar Teil 2] (Wiki, 2 Teile, 10% Recovery-Informationen, RAR).&lt;br /&gt;
&lt;br /&gt;
Ein Hinweis&lt;br /&gt;
:Beim Start der Box ohne Modifikation wird WindowsCE gestartet und kann mittels USB-Maus und Tastatur bedient werden. Nach erfolgtem Flash-Vorgang ist dies nicht mehr möglich.&lt;br /&gt;
&lt;br /&gt;
Hier nun die Kurzanleitung zum &#039;Tuning&#039;&lt;br /&gt;
* USB-Stick vorbereiten&lt;br /&gt;
:Den Inhalt des Ordner WCE1, aus der Datei [http://www.mikrocontroller.net/attachment/105209/swu.zip] (SWU_Finland_V1.0.3.454), auf einen formatierten USB-Stick (FAT32) kopieren und wie [http://www.mikrocontroller.net/articles/Receiver-Mainboard_Plattform_Philips_PNX8950#Neues_Firmware-Image_installieren hier] beschrieben installieren.&lt;br /&gt;
&lt;br /&gt;
* Festplatte vorbereiten&lt;br /&gt;
:# Auf der einzubauenden Festplatte eine erweiterte Partition mit zwei logischen Laufwerken mit FAT32-Dateisystem anlegen. Mit dem kostenlosen Windows Programm &amp;quot;[http://www.easeus.com/download.htm EASEUS Partition Master 8.0.1 Home Edition]&amp;quot; lassen sich die Partitionen leicht anlegen, unter Linux ist FAT32 im Programm fdisk übrigens der Typ &#039;b&#039;. &lt;br /&gt;
:# Auf das erste logische Laufwerk (minimum 2GB, im Original 19,53GB, das entspricht exakt 20000MB) den gesamten Inhalt des zuvor ausgepackten [https://www.more.tv/softwareupdate/SWU_Finland/SWU_Finland_V1.0.3.454/swu.zip SoftWareUpdates] kopieren.&lt;br /&gt;
:# Die Ordner moreTV&#039;&#039;&#039;n&#039;&#039;&#039; und moreTV&#039;&#039;&#039;n&#039;&#039;&#039;.INIT nach &#039;&#039;&#039;moreTV&#039;&#039;&#039; und &#039;&#039;&#039;moreTV.INIT&#039;&#039;&#039; kopieren.&lt;br /&gt;
:# Das zweite logische Laufwerk (je größer desto besser, im Original 213,4GB) bleibt leer.&lt;br /&gt;
&lt;br /&gt;
: Die fehlenden Ordner auf der Festplatte werden beim ersten Starten der Box automatisch angelegt.&lt;br /&gt;
&lt;br /&gt;
ACHTUNG: Die USB-Anschlüsse werden nach der Installation von der MoreTV-Software nicht mehr unterstützt. Eine Ausnahme bildet einzig und alleine das [http://www.mikrocontroller.net/articles/Receiver-Mainboard_Plattform_Philips_PNX8950#Neues_Firmwareimage_installieren Flash-Update].&lt;br /&gt;
USB-Speichersticks und Externe-Festplatten werden zwar noch erkannt und als USBDisk in das Dateisystem eingebunden können aber über die MoreTV-Software nicht angesprochen werden. USB-Keyboard und -Maus werden unter MoreTV nicht mehr erkannt und können auch nicht benutzt werden.&lt;br /&gt;
&lt;br /&gt;
Bei der More.TV-Software ist zu beachten, dass im Forum zwei unterschiedliche Versionen zum Einsatz kommen: Zum Einen die oben genannte Update-Version, welche ursprünglich über den Downloadserver der inzwischen insolventen More.TV frei verfügbar war. Zum Anderen haben einige Mitstreiter den Festplatteninhalt einer original Medion-Box kopiert, diese enthalten eine aktuellere Version welche prinzipiell einige Bugs behebt, jedoch wurde die EPG-Funktion eingeschränkt. Die Versionen lassen sich über das &amp;quot;More&amp;quot;-Menü unterscheiden: Heißt der erste Menüpunkt &amp;quot;Programm&amp;quot; handelt es sich um die Update-Version des More.TV-Servers, die Medion-Version zeigt als ersten Punkt die Beschriftung &amp;quot;EPG&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Zeitzonen-Einstellung ===&lt;br /&gt;
&lt;br /&gt;
Eigentlich sollte sich die Uhrzeit bei richtigem Empfang automatisch einstellen.&lt;br /&gt;
Dies ist nicht immer der Fall, der folgende Trick hat bei DVB-C geholfen (und zumindest Methode 1 auch bei DVB-T).&lt;br /&gt;
&lt;br /&gt;
==== Methode 1: Werksreset/Ländereinstellung ====&lt;br /&gt;
Bei der Ländereinstellung muss Finnland ausgewählt und als PLZ 00100 (Helsinki) eingegeben werden. Dazu  Setup-&amp;gt;Sonstiges-&amp;gt;Werkseinstellung  aufrufen. Natürlich sind dann alle Einstellungen (Programme) neu einzustellen.&lt;br /&gt;
&lt;br /&gt;
Damit wird die Zeitzone auf Finnland umgestellt +1 Std. Die Finnen haben&lt;br /&gt;
zwar auch Sommerzeit, da die Sommerzeitumstellung aber ja nicht&lt;br /&gt;
funktioniert passt es dann. Das muss allerdings zum Ende der Sommerzeit&lt;br /&gt;
wieder zurückgestellt werden, mit den gleichen Unannehmlichkeiten.&lt;br /&gt;
&lt;br /&gt;
==== Methode 2: Datenbank ändern ====&lt;br /&gt;
&lt;br /&gt;
Alternativ lässt sich die Ländereinstellung auf Dateiebene ändern, hierbei handelt es sich jedoch leider um ein binäres Datenbankformat. Die Konfiguration befindet sich in der Datei /HardDisk/moreTV.persistent/tbConfigurations.xbc welche z.B. über FTP erreichbar ist. Die Datei lässt sich z.B. mit einem Hex-Editor wie GHex2 unter Linux öffnen, es sollte eine Struktur mit Wertenamen und deren Variablen erkennbar sein. Recht im Anfang befindet sich eine Einstellung &amp;quot;COUNTRY_ID&amp;quot; - nach vier kleinen Werten befindet sich (hier Offset 0x32) eine ASCII-Zahl, z.B. 1 (0x31) für Deutschland(?). In meinem Fall brachte eine Änderung auf 2 (0x32) mit anschließendem Neustart den gewünschten Effekt für die Zeiteinstellung.&lt;br /&gt;
&lt;br /&gt;
= Linux =&lt;br /&gt;
&lt;br /&gt;
Die CPU wird pauschal von Linux unterstützt.&lt;br /&gt;
&lt;br /&gt;
Der Kernel ist hier erhältlich:&lt;br /&gt;
*Einstiegsseite: http://www.linux-mips.org/wiki/Main_Page &lt;br /&gt;
*Download: http://www.linux-mips.org/pub/linux/mips/kernel/v2.6/&lt;br /&gt;
&lt;br /&gt;
=== GCC Cross Compiler ===&lt;br /&gt;
&lt;br /&gt;
Für das Kompilieren von Programmen und von dem Kernel selber wird ein gcc Cross Compiler benötigt. Hier werden verschiedene Optionen für das Installieren, bzw. Kompilieren beschrieben.&lt;br /&gt;
&lt;br /&gt;
==== Debian ====&lt;br /&gt;
&#039;&#039;&#039;Ungetestet&#039;&#039;&#039; Bitte testen und anschließend diese Zeile löschen&lt;br /&gt;
&lt;br /&gt;
Emdebian stellt einen MIPS Cross Compiler mit gcc 4.3 zur Verfügung. Für die Installation dieser sind die Anweisungen der [http://wiki.debian.org/EmdebianToolchain#Get_the_binaries Wikipedia von Emdebian] zu folgen.&lt;br /&gt;
&lt;br /&gt;
__________________________________________________________________________&lt;br /&gt;
&lt;br /&gt;
Ich habe folgenden Weg auf einem Debian Squeeze AMD64 gewählt:&lt;br /&gt;
&lt;br /&gt;
In der Datei:&lt;br /&gt;
&lt;br /&gt;
/etc/apt/sources.list.d/emdebian.sources.list&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
deb http://www.emdebian.org/debian/ squeeze main&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
eingefügt. &lt;br /&gt;
Beim &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt-get update&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Kam folgende Fehlermeldung:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
The following signatures couldn&#039;t be verified because the public key is not available: NO_PUBKEY 010908312D230C5F&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
dies kann man mit:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
gpg --keyserver pgpkeys.mit.edu --recv-key  010908312D230C5F &lt;br /&gt;
gpg -a --export 010908312D230C5F | sudo apt-key add -&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
beheben. (Den Key durch den bei euch angezeigten ersetzen)&lt;br /&gt;
&lt;br /&gt;
Danach dann folgende Pakete wie in Embedian angeben installieren. Evtl. sind das auch einige zu viel, wer Ahnung davon hat bitte zusammenkürzen.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt-get install linux-libc-dev-mipsel-cross&lt;br /&gt;
apt-get install libc6-mipsel-cross  libc6-dev-mipsel-cross&lt;br /&gt;
apt-get install binutils-mipsel-linux-gnu&lt;br /&gt;
apt-get install gcc-4.4-mipsel-linux-gnu&lt;br /&gt;
apt-get install g++-4.4-mipsel-linux-gnu&lt;br /&gt;
apt-get install apt-cross dpkg-cross&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Der Richtige Export ist dann:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
export CROSS_COMPILE=mipsel-linux-gnu-&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Danach solltet ihr alles fehlerfrei Übersetzen können.&lt;br /&gt;
&lt;br /&gt;
Auf Lauffähigkeit habe ich das u-Boot allerdings noch nicht getestet. (Wird entfernt, wenn es geschehen ist)&lt;br /&gt;
&lt;br /&gt;
==== Ubuntu ====&lt;br /&gt;
Scheinbar gibt es kein eigenes Package in den Ubuntu Repositories. Aus diesem Grund sollte hier die Beschreibung bei [[#Generischer Linux|Generischen Linux]] befolgt werden.&lt;br /&gt;
&lt;br /&gt;
==== RedHat ====&lt;br /&gt;
&#039;&#039;&#039;Ergänzen&#039;&#039;&#039; Da ich kein RedHat System am Laufen habe, kann ich nicht sagen ob die Distribution ein MIPS Cross Compiler zur Verfügung stellt.&lt;br /&gt;
&lt;br /&gt;
==== Gentoo ====&lt;br /&gt;
&#039;&#039;&#039;siehe RedHat&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== Arch ====&lt;br /&gt;
Durch das Paket cross-mipsel-linux-gnu-gcc aus dem AUR kann der Compiler installiert werden.&lt;br /&gt;
&lt;br /&gt;
==== Generischer Linux ====&lt;br /&gt;
Die hier beschriebenen Optionen sind nicht an eine Distribution gebunden. Der daraus erwachsende Nachteil ist, dass diese Programme &#039;&#039;&#039;nicht&#039;&#039;&#039; im Standard Pfad installiert werden sollten da sie sonst möglicherweise Dateien überschreiben könnten, die unter der Versionsverwaltung der einzelnen Distributionen stehen. &lt;br /&gt;
&lt;br /&gt;
===== ELDK =====&lt;br /&gt;
Um den Embedded Linux Development Kit zu installieren folgt man am Besten der Anleitung auf der [http://www.denx.de/wiki/view/DULG/ELDKInstallation Seite des Herstellers]. Zu beachten ist, dass ELDK 4.1 verwendet werden sollte, wenn U-Boot zu kompilieren ist.&lt;br /&gt;
&lt;br /&gt;
===== crosstool-ng =====&lt;br /&gt;
[http://crosstool-ng.org/ crosstool-ng] automatisiert die Kompilierung und Installation eines Cross Compilers. Das Programm ist normalerweise in den Repositories der verwendeten Linux Distribution enthalten. Ansonsten muss es auf dem Host Rechner kompiliert und installiert werden. In Folge werden anhand beispielhafter Befehle die Schritte für die Erstellung eines Cross Compilers gezeigt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ct-ng mipsel-unknown-linux-gnu&lt;br /&gt;
ct-ng menuconfig&lt;br /&gt;
ct-ng build&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im menuconfig sind die Pfade des Compilers anzupassen, wenn diese nicht in $HOME/x-tools installiert werden sollen. Zu beachten ist, dass ct-ng Schreibrechte für den entsprechenden Pfad braucht. Ein mit crosstool-ng erstellter Compiler ist [http://wird-ergaenzt.at hier] zu finden. Zu beachten ist, dass dieser für den Pfad /opt erstellt wurde und auch dort installiert werden muss.&lt;br /&gt;
&lt;br /&gt;
===== buildroot =====&lt;br /&gt;
In der Standardeinstellung erstellt Buildroot seinen eigenen Cross Compiler, welcher auch außerhalb der Umgebung verwendet werden kann. Hierfür sind die Beschreibungen in der [http://buildroot.uclibc.org/downloads/buildroot.html#using_toolchain Dokumentation] von buildroot zu befolgen. Zu beachten ist, dass ein gcc 4.2.4 verwendet werden sollte, wenn ein Kernel mit der Version 2.6.21 kompiliert wird.&lt;br /&gt;
&lt;br /&gt;
=== UBoot ===&lt;br /&gt;
&lt;br /&gt;
U-Boot 2011.09 wurde auf die Receiver Platine portiert. Der Port kann aus der Repository von [https://github.com/tuxx42/PNX8550_U-BOOT gihub/tuxx42] bezogen werden. Für die Kompilierung ist ein GCC der Version 4.1 oder Höher notwendig. Zurzeit unterstützt U-Boot das Laden und Booten des Kernels aus dem Netzwerk, aus dem NAND Flash und von der Festplatte. In weiterer Folge werden alle notwendigen Schritte beschrieben um U-Boot auf der Receiver Platine zum Laufen zu bringen.&lt;br /&gt;
&lt;br /&gt;
==== Vorbereitung ====&lt;br /&gt;
&lt;br /&gt;
* Der gesamte Vorgang ist auf einem Linux oder in einer Linux-Ähnlichen Umgebung wie zum Beispiel cygwin (&#039;&#039;&#039;ungetestet&#039;&#039;&#039;) auszuführen.&lt;br /&gt;
* Der MIPS Compiler sollte im Pfad enthalten sein.&lt;br /&gt;
* Es muss das Programm &#039;&#039;make&#039;&#039; im Pfad erhalten sein.&lt;br /&gt;
&lt;br /&gt;
===== kermit =====&lt;br /&gt;
&lt;br /&gt;
Für das Flashen des endgültigen Systems ist das Programm kermit notwendig. Diese kann bei Debian Varianten über den Befehl &amp;lt;pre&amp;gt;sudo apt-get install ckermit&amp;lt;/pre&amp;gt; installiert werden. Die Konfiguration von kermit geschieht am Besten über die Konfigurationsdatei ~/.kermrc. Folgende Einträge haben sich hierbei bewährt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
set line /dev/ttyUSB0  # auf den serielen Port ändern&lt;br /&gt;
set speed 38400&lt;br /&gt;
set carrier-watch off&lt;br /&gt;
set handshake none&lt;br /&gt;
set flow-control none&lt;br /&gt;
robust&lt;br /&gt;
set file type bin&lt;br /&gt;
set file name lit&lt;br /&gt;
set rec pack 1000&lt;br /&gt;
set send pack 1000&lt;br /&gt;
set window 5&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In Folge werden einige wichtigen Befehle für die Handhabung von kermit beschrieben. Eine ausführliche Anleitung findet sich auf der Webseite von der [http://www.columbia.edu/kermit/ckututor.html Columbia Universität].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;(/home/foo/) C-Kermit&amp;gt;send foo.bar&amp;lt;/pre&amp;gt;&lt;br /&gt;
Die Datei foo.bar über die Serielle senden&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;(/home/foo/) C-Kermit&amp;gt;connect&amp;lt;/pre&amp;gt;&lt;br /&gt;
Verbindet sich zu der seriellen Schnittstelle&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Escape Character: strg + strg-alt + ß&amp;lt;/pre&amp;gt;&lt;br /&gt;
Wird gebraucht um wieder auf die kermit Konsole wechseln zu können.&lt;br /&gt;
&lt;br /&gt;
==== U-Boot Flashen ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ACHTUNG&#039;&#039;&#039; Zurzeit sind nur 5MB für den Linux Kernel vorgesehen. Dies reicht nicht aus um den original Elecard Kernel mit einem initrd zu integrieren. Dieser Fehler wird zurzeit behoben und in Kürze ein neues Flash-Paket veröffentlicht.&lt;br /&gt;
&lt;br /&gt;
Das gesamte Archiv aus dem [http://www.mikrocontroller.net/attachment/127634/U-Boot.zip Board] auf einen FAT32 formatierten USB-Stick entpacken und die Datei u-boot.img in ein Verzeichnis auf dem Host-Rechner kopieren. Alle weiteren Schritte, wie in [[#System flashen|System flashen]] beschrieben, durchführen. Anschließend kermit starten und mit &amp;quot;connect&amp;quot; auf das Terminal verbinden. Nach dem booten von U-Boot muss die Ausgabe &amp;quot;flasher# &amp;quot; auf der seriellen Schnittstelle J2 erscheinen. &lt;br /&gt;
&lt;br /&gt;
# Mit &amp;quot;connect&amp;quot; auf die U-Boot Konsole wechseln&lt;br /&gt;
## loadb 82000000&lt;br /&gt;
# Mit dem Escape Character und c auf die kermit Konsole wechseln&lt;br /&gt;
## cd folder/with/u-boot/image&lt;br /&gt;
## send u-boot.img&lt;br /&gt;
# Mit &amp;quot;connect&amp;quot; auf die U-Boot Konsole wechseln&lt;br /&gt;
## mtdparts default&lt;br /&gt;
## nand erase.part U-Boot&lt;br /&gt;
## nand write $(loadaddr) U-Boot $(filesize)&lt;br /&gt;
&lt;br /&gt;
Sollten keine Fehler bei dem Beschreiben des Flash aufgetreten sein, so kann U-Boot mit dem Befehl &amp;quot;reset&amp;quot; neu gestartet werden. Bei Fehlern kann der Flasher mittels dem WinCE wieder hergestellt werden.&lt;br /&gt;
&lt;br /&gt;
==== Kernel Flashen ====&lt;br /&gt;
&lt;br /&gt;
Der vorbereitete Kernel vom [ Board] muss vor dem Flashen in den Speicher des Receivers kopiert werden. Wenn eine Netzwerkverbindung besteht, bietet es sich an die Datei aufgrund ihrer Größe mit TFTP statt mit kermit zu kopieren.&lt;br /&gt;
&lt;br /&gt;
# Laden des Kernels&lt;br /&gt;
## Mittels TFTP:   tftp $(loadaddr) 111.222.333.444:uImage&lt;br /&gt;
## Mittels kermit: loadb $(loadaddr)&lt;br /&gt;
# Flashen des Kernels: Mit &amp;quot;connect&amp;quot; auf die Box wechseln&lt;br /&gt;
## mtdparts default&lt;br /&gt;
## nand erase.part Linux&lt;br /&gt;
## nand write $(loadaddr) Linux $(filesize)&lt;br /&gt;
&lt;br /&gt;
==== Kernel booten ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;wird noch geschrieben&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Netzwerk booten =====&lt;br /&gt;
&amp;lt;wird noch geschrieben&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Flash booten =====&lt;br /&gt;
&amp;lt;wird noch geschrieben&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Festplatte booten =====&lt;br /&gt;
&amp;lt;wird noch geschrieben&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== U-Boot vom Source kompilieren ====&lt;br /&gt;
&lt;br /&gt;
===== Flasher =====&lt;br /&gt;
Die U-Boot git aus-checken, beziehungsweise einen komprimierten Snapshot von [https://github.com/tuxx42/PNX8550_U-BOOT gihub/tuxx42] laden. Die folgenden Befehle sind als Anhaltspunkte für das Vorgehen bei der Kompilierung gedacht. Es können Abweichungen durch einen anderen Setup entstehen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd u-boot&lt;br /&gt;
export CROSS_COMPILE=&amp;lt;mipsel-gcc-prefix-&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
In dieser Zeile ist der Prefix des Cross Compilers einzufügen. Dieser kann sich zwischen den verwendeten Systemen unterscheiden. Bei der Verwendung von ELDK entspricht dies mips_4KCle-, bei der Verwendung eines mit crosstool-ng oder buildroot erstellten Compiler entspricht dies mipsel-linux-&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
make mrproper&lt;br /&gt;
make pollinux_flasher_config&lt;br /&gt;
make&lt;br /&gt;
./tools/mkpollinux u-boot.bin 00004000_00040000__loader.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Die Originaldatei mit der Ausgabe von mkpollinux auf dem USB Stick ersetzten. Ab hier sind die Anweisungen in [[#System flashen|System flashen]] zu befolgen und alle 3 Dateien auf die Box zu flashen. Nach dem Booten ist U-Boot über die gewählte serielle Schnittstelle verfügbar und es kann mit dem Flashen des endgültigen Systems begonnen werden.&lt;br /&gt;
&lt;br /&gt;
===== U-Boot =====&lt;br /&gt;
Im ersten Schritt muss das endgültige U-Boot kompiliert werden. Hierfür muss U-Boot mit pollinux_config konfiguriert und kompiliert werden. Anschließend können alle weiteren Schritte aus [[#Flasher|Flasher]] übernommen werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Anpassung von U-Boot ====&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;u&amp;gt;Serielle Schnittstelle:&amp;lt;/u&amp;gt; Sollte die Ausgabe auf J33 statt auf J2 geführt werden, so muss in der Datei include/configs/pollinux.h das Define CONFIG_CONSOLE_PORT auf CONFIG_SERIAL_PORT_2 geändert werden.&lt;br /&gt;
&lt;br /&gt;
=== Elecard ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ACHTUNG&#039;&#039;&#039; Diese Anleitung ist veraltet und muss noch aktualisiert werden- bitte auch im Board lesen - [http://www.mikrocontroller.net/topic/210759#2232954 Version 0.2] | [http://www.mikrocontroller.net/topic/210759#2233950 Version für USB/HDD-Installation ohne NFS]&lt;br /&gt;
&lt;br /&gt;
(via AgentData)&lt;br /&gt;
&lt;br /&gt;
Um das NAND zu schonen werden rootfs, userfs, configfs und profile bis auf Weiteres über NFS, also Netzwerk, von einem Linux-PC (oder einer VM) geladen.&lt;br /&gt;
&lt;br /&gt;
==== Vorbereitungen ====&lt;br /&gt;
&lt;br /&gt;
* Das gesamte Archiv aus dem [http://www.mikrocontroller.net/attachment/109811/Pollinux.rar Board] auf einen FAT32 formatierten USB-Stick entpacken&lt;br /&gt;
* Linux-PC und Pollin-Box müssen im selben Netzwerk sein, am besten ein Crossover-Kabel verwenden um Netzprobleme ausschließen zu können&lt;br /&gt;
* Die Beispiele gehen davon aus, dass der NFS-Server auf der IP 192.168.0.3 läuft. Die Box nutzt je nach Rootfs DHCP oder ist auf die IP 192.168.0.254 vorkonfiguriert.&lt;br /&gt;
&lt;br /&gt;
==== System flashen ====&lt;br /&gt;
&lt;br /&gt;
Hinweise für Entwickler:&lt;br /&gt;
* die cmdline für den Kernel befindet sich im File 00004000_00040000__loader.bin @ offset 0x7000&lt;br /&gt;
&lt;br /&gt;
* Pollin-Box auf Auslieferungszustand bringen (Anleitung gibts im WIKI)&lt;br /&gt;
* Pollin-Box DIP1 auf OFF (WCE1) und reboot&lt;br /&gt;
* USB-Stick anstecken und flashme.exe starten&lt;br /&gt;
* an der Pollin-Box Taste Pfeil runter oder auf der Fernbedienung die Taste 1 drücken =&amp;gt; loader wird geflashed&lt;br /&gt;
* an der Pollin-Box Taste Pfeil hoch oder auf der Fernbedienung die Taste 2 drücken =&amp;gt; kernel wird geflashed&lt;br /&gt;
* an der Pollin-Box Taste Pfeil links oder auf der Fernbedienung die Taste 3 drücken =&amp;gt; wince0 wird geflashed&lt;br /&gt;
** wince0 ist ein modifiziertes Image welches statt TGUpdater.exe die&lt;br /&gt;
flashme.exe vom USB-Stick startet -&amp;gt; erhält uns die Möglichkeit von&lt;br /&gt;
WinCE aus zu flashen&lt;br /&gt;
* Box ausschalten&lt;br /&gt;
* USB-Stick abziehen &#039;&#039;Wichtig! Ein Boot mit USB-Stick kann in einigen Konfigurationen den Bootloader zerstören, eine Wiederherstellung der Box ist in diesem Fall nur schwer möglich!&#039;&#039;&lt;br /&gt;
* DIP1 auf ON&lt;br /&gt;
&lt;br /&gt;
==== LINUX NFS Server vorbereiten ====&lt;br /&gt;
&lt;br /&gt;
Die Box erwartet den NFS-Server auf der IP 192.168.0.3&lt;br /&gt;
&lt;br /&gt;
Anm. des Autors: Da ich bis vor einer Woche noch nie ein Linux System von nahem gesehen habe arbeite ich momentan noch mit einer Knoppix Live CD. Sämtliche Pfadangaben beziehen sich also auf dieses System es ist nicht wirklich nötig mit einem USB-Stick zu arbeiten - aber ich denk die Linuxer wissen das. Ich würde trotzdem vorschlagen bis auf weiteres mit Partitionen zu arbeiten da es dann für uns ganz einfach ist Änderungen als ext2 Image der jeweiligen Partition auszutauschen. Nachfolgend also die Anleitung wie ich es bei mir gemacht habe.&lt;br /&gt;
&lt;br /&gt;
===== Linux-Box booten =====&lt;br /&gt;
&lt;br /&gt;
...und die Dateien nfsroot.ext2, nfsuser.ext2 und pollinux_start_nfs aus&lt;br /&gt;
dem Download Archiv auf den Knoppix Desktop kopieren&lt;br /&gt;
&lt;br /&gt;
===== USB-Stick partitionieren =====&lt;br /&gt;
Mit GParted auf einem USB-Stick vier primäre ext2 Partitionen anlegen&lt;br /&gt;
&lt;br /&gt;
 sdb1     50 mb    -&amp;gt; später mounted als rootfs&lt;br /&gt;
 sdb2    100 mb    -&amp;gt; später mounted als userfs&lt;br /&gt;
 sdb3      5 mb    -&amp;gt; später mounted als configfs&lt;br /&gt;
 sdb4      5 mb    -&amp;gt; später mounted als profile&lt;br /&gt;
&lt;br /&gt;
* abschließend die vier neuen Partitionen mounten&lt;br /&gt;
* bei mir werden sie unter /dev/sdb1 bis /dev/sdb4 bzw. /media/sdb1 bis&lt;br /&gt;
/media/sdb4 eingehängt&lt;br /&gt;
&lt;br /&gt;
=====Daten Kopieren=====&lt;br /&gt;
Das nfsroot und nfsuser ext2 image auf den USB-Stick kopieren&lt;br /&gt;
&lt;br /&gt;
* benötigt werden hier die files nfsroot.ext2 und nfsuser.ext2 aus dem&lt;br /&gt;
Download Archiv&lt;br /&gt;
* wenn ihr meine Anleitung befolgt hab liegen sie auf dem Knoppix&lt;br /&gt;
Desktop -&amp;gt; wenn nicht müsst ihr die Pfade anpassen&lt;br /&gt;
** /home/knoppix/Desktop/nfsroot.ext2&lt;br /&gt;
** /home/knoppix/Desktop/nfsuser.ext2&lt;br /&gt;
* terminal starten&lt;br /&gt;
* mit su [ret] als superuser einloggen&lt;br /&gt;
* nfsroot kopieren:&lt;br /&gt;
** -&amp;gt; dd if=/home/knoppix/Desktop/nfsroot.ext2 of=/dev/sdb1&lt;br /&gt;
* nfsuser kopieren:&lt;br /&gt;
** dd if=/home/knoppix/Desktop/nfsuser.ext2 of=/dev/sdb2&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung&#039;&#039;&#039; Die Imagedateien in der Originaldatei sind beschädigt, stattdessen sollten die Dateien aus der [http://www.mikrocontroller.net/attachment/109976/pollinux.tar.gz pollinlinux.tar.gz] verwendet werden.&lt;br /&gt;
&lt;br /&gt;
=====NFS Server starten=====&lt;br /&gt;
&lt;br /&gt;
* benötigt wird hier das Script pollinux_start_nfs aus dem Download Archiv&lt;br /&gt;
* wenn ihr meine Anleitung befolgt hab liegt es auf dem Knoppix Desktop&lt;br /&gt;
** wenn nicht müsst ihr die Pfade anpassen&lt;br /&gt;
** /home/knoppix/Desktop/pollinux_start_nfs&lt;br /&gt;
* terminal starten&lt;br /&gt;
* mit su [ret] als superuser einloggen&lt;br /&gt;
* nfs server starten:&lt;br /&gt;
** /home/knoppix/Desktop/pollinux_start_nfs&lt;br /&gt;
&lt;br /&gt;
Achtung bei Nicht Live-Systemen: Das Script überschreibt die /etc/exports - es sind folgende Freigaben notwendig:&lt;br /&gt;
&lt;br /&gt;
 /pollinux/nandfs                *(rw,insecure,no_root_squash,no_subtree_check)&lt;br /&gt;
 /pollinux/nandfs.user           *(rw,insecure,no_root_squash,no_subtree_check)&lt;br /&gt;
 /pollinux/nandfs.config         *(rw,insecure,no_root_squash,no_subtree_check)&lt;br /&gt;
 /pollinux/nandfs.profile        *(rw,insecure,no_root_squash,no_subtree_check)&lt;br /&gt;
&lt;br /&gt;
==== Ergänzungen ====&lt;br /&gt;
&lt;br /&gt;
* wenn alles glatt läuft müsstet ihr jetzt die Pollin-Box booten können und die Partitionen werden über nfs mounted&lt;br /&gt;
* es gilt jetzt die Scripte für einen fehlerfreien boot anzupassen&lt;br /&gt;
* login als root auf die Pollin-Box funktioniert per telnet problemlos&lt;br /&gt;
* DVB-T-Devices werden erkannt, eine Sendersuche per w_scan war erfolgreich&lt;br /&gt;
* Alternativ zu den USB-Partitionen kann natürlich auch eine einfache NFS-Freigabe verwendet werden, eine Anleitung hat [http://www.mikrocontroller.net/topic/210759#2186133 Laszlo H.]&lt;br /&gt;
* Beim Boot wird eine serielle Konsole mit 38400bps gestartet&lt;br /&gt;
* Um eine serielle Shell zu erhalten in der /etc/inittab den Eintrag &amp;quot;ttyS1&amp;quot; durch &amp;quot;ttyS0&amp;quot; ersetzen.&lt;br /&gt;
* Der Soundchip wird zwar erkannt, eine Soundausgabe bisher jedoch nicht gelungen.&lt;br /&gt;
&lt;br /&gt;
Folgende Programme lassen sich starten:&lt;br /&gt;
&lt;br /&gt;
* Haupt-Anwendung (Youtube-Player, XviD von SD-Karte, usw.)&lt;br /&gt;
 cd /opt/elecard/bin/&lt;br /&gt;
 ./mainapp.sh&lt;br /&gt;
&lt;br /&gt;
* Ein Webbrowser&lt;br /&gt;
 cd /usr/local/webkit/&lt;br /&gt;
 ./_start.sh&lt;br /&gt;
&lt;br /&gt;
* Für DVB-C muss die Datei &#039;/etc/init.d/S30pretmmodules&#039; wie folgt angepasst werden:&lt;br /&gt;
 #modprobe phStbDemux_dvbpnx8550 fe_model_name=&amp;quot;TU1216&amp;quot;&lt;br /&gt;
 modprobe phStbDemux_dvbpnx8550 fe_model_name=&amp;quot;CU1216&amp;quot;&lt;br /&gt;
Mit dem Modul werden die nötigen Frontends erstellt, ein Zugriff über die elecard-Mainapp ist möglich, QAM256 wird im Gegensatz zu MoreTV unterstützt.&lt;br /&gt;
&lt;br /&gt;
== Interessant zum weiteren Testen ==&lt;br /&gt;
&lt;br /&gt;
*MontaVista Linux Professional Edition&lt;br /&gt;
&lt;br /&gt;
= Unterstützte Codecs =&lt;br /&gt;
&lt;br /&gt;
Quelle: [http://www.synnex.com.tw/oem/mic_link/seminar%20download/y70303.pdf]&lt;br /&gt;
&lt;br /&gt;
*dual: SD MPEG-1/2&lt;br /&gt;
*single: SD MPEG-4, WM9, H264,DivX; HD MPEG-2 (1080i), WM9(720p)&lt;br /&gt;
*Audio: dual stereo (2.0 + 2.0),MPEG-1, Dolby AC-3&lt;br /&gt;
&lt;br /&gt;
= Bezugsquellen = &lt;br /&gt;
&lt;br /&gt;
===Platinen===&lt;br /&gt;
* [http://www.pollin.de/shop/dt/NzQ5OTA2OTk-/Bausaetze_Module/Module/Receiver_Mainboard_mit_Twin_DVB_T_Tuner.html Pollin : Receiver-Mainboard mit Twin DVB-T Tuner (390 052, 7,95€)]&lt;br /&gt;
* [http://www.pollin.de/shop/dt/NjQ5OTA2OTk-/Bausaetze_Module/Module/Receiver_Mainboard_mit_Twin_DVB_C_Tuner.html Pollin : Receiver-Mainboard mit Twin DVB-C Tuner (390 053, 7,95€)]&lt;br /&gt;
* [http://www.pollin.de/shop/dt/MzQxODcyOTk-/Computer_und_Zubehoer/Hardware/Kabel_Stecker_Adapter/RS232_Einbaubuchse.html Pollin : RS232-Einbaubuchse (721 856, 0,25€)], zur Befestigung werden noch zwei passende Sechskant-Schraubbolzen benötigt&lt;br /&gt;
* [http://www.pollin.de/shop/dt/NDQxODcyOTk-/Computer_und_Zubehoer/Hardware/Kabel_Stecker_Adapter/USB_2_0_Einbaubuchse.html Pollin : USB 2.0-Einbaubuchse (721 855, 0,25€)]&lt;br /&gt;
&lt;br /&gt;
===Zubehör===&lt;br /&gt;
:Netzteil, Gehäuse, Fernbedienung:&lt;br /&gt;
*[http://www.pollin.de/shop/dt/NjUwOTQ2OTk-/Stromversorgung/Netzgeraete/Festspannungs_Netzgeraete/Schaltnetzteil_DELTA_EADP_50DF_12_V_4_16_A.html Pollin : Schaltnetzteil DELTA EADP-50DF, 12 V-/4,16 A (350 943 , 4,95€)]&lt;br /&gt;
*[http://www.pollin.de/shop/dt/MDg4OTM1OTk-/Bauelemente_Bauteile/Gehaeuse/Stahlblech_Gehaeuse_mit_Frontblende.html Pollin : Stahlblech-Gehäuse mit Frontblende (460 119, 2,95€)]&lt;br /&gt;
*[http://www.pollin.de/shop/dt/Nzc5OTczOTk-/SAT_Antennentechnik/Satelliten_Technik/Fernbedienungen/Infrarot_Fernbedienung_RCX155.html Pollin : Infrarot-Fernbedienung RCX155 (620 022, 1,50€)]&lt;br /&gt;
:SATA:&lt;br /&gt;
*[http://www.pollin.de/shop/dt/NTQxODcyOTk-/Computer_und_Zubehoer/Hardware/Kabel_Stecker_Adapter/SATA_Kabel.html Pollin : SATA-Kabel, 2x SATA-Stecker, 0,35m (721 854, 0,50€)]&lt;br /&gt;
*[http://www.pollin.de/shop/dt/MDM0OTcyOTk-/Computer_und_Zubehoer/Hardware/Kabel_Stecker_Adapter/HDD_Stromversorgungskabel.html Pollin : PC-Stromversorgungskabel, 2x 5,25&amp;quot;- Stecker, 2x HDD-Stecker, 70mm (720 569, 0,20€)]&lt;br /&gt;
*[http://www.pollin.de/shop/dt/NDI1ODcyOTk-/Computer_und_Zubehoer/Hardware/Kabel_Stecker_Adapter/SATA_Stromversorgungsadapter.html Pollin : SATA-Stromversorgungsadapter (721 475, 0,85)] oder alternativ&lt;br /&gt;
*[http://www.pollin.de/shop/dt/MTUwOTcyOTk-/Computer_und_Zubehoer/Hardware/Kabel_Stecker_Adapter/SATA_Stromversorgungsadapter.html Pollin : SATA-Stromversorgungsadapter, mit Rastnase! (720 948, 0,55)]&lt;br /&gt;
:WLAN:&lt;br /&gt;
*[http://www.pollin.de/shop/dt/NDY5ODgyOTk-/Computer_und_Zubehoer/Netzwerktechnik/Wireless_LAN/WLAN_miniPCI_Karte_XG_603.html Pollin : WLAN miniPCI-Karte XG-603 (711 035, 3,95€)]&lt;br /&gt;
*[http://www.pollin.de/shop/dt/MjUwOTgyOTk-/Computer_und_Zubehoer/Netzwerktechnik/Wireless_LAN/Wireless_LAN_Antennen_Adapterkabel.html Pollin : WLAN-Antennen-Adapterkabel (710 947, 4,95€)]&lt;br /&gt;
*[http://www.pollin.de/shop/dt/MTM5ODgyOTk-/Computer_und_Zubehoer/Netzwerktechnik/Wireless_LAN/Wireless_LAN_Rundstrahlantenne.html Pollin : WLAN-Antenne 4 dBi. Länge 140 mm Reverse-SMA (710 068, 1,95€)] oder alternativ &lt;br /&gt;
*[http://www.pollin.de/shop/dt/NzY3ODgyOTk-/Computer_und_Zubehoer/Netzwerktechnik/Wireless_LAN/WLAN_Antenne_FSC_5_dBi_RP_SMA.html Pollin : WLAN-Antenne, mit Standfuß, Reverse-SMA, 5 dBi (711 232, 3,95€)] oder alternativ&lt;br /&gt;
*[http://www.pollin.de/shop/dt/NDE0OTgyOTk-/Computer_und_Zubehoer/Netzwerktechnik/Wireless_LAN/Wireless_LAN_Rundstrahlantenne.html Pollin : WLAN-Antenne, Reverse-SMA, 5 dBi (710 585, 6,95€)] oder alternativ&lt;br /&gt;
*[http://www.pollin.de/shop/dt/ODI5ODgyOTk-/Computer_und_Zubehoer/Netzwerktechnik/Wireless_LAN/Wireless_LAN_Antenne.html Pollin : WLAN-Antenne, mit magnetischem Standfuß, Reverse-SMA, 7 dBi (711 071, 6,95€)] oder alternativ&lt;br /&gt;
*[http://www.reichelt.de/?ACTION=3;ARTICLE=61136;PROVID=2402 Reichelt: LAN DN-70100, WLAN-Antenne, Reverse-SMA, 5 dBi (LAN DN-70100, 3,65€)]&lt;br /&gt;
 &lt;br /&gt;
:DVB-T und DVB-C:&lt;br /&gt;
*[http://www.pollin.de/shop/dt/MzQ3ODI0OTk-/SAT_Antennentechnik/Kabel/Antennen_Anschlusskabel_75_150_mm.html Pollin : Antennen-Anschlusskabel 75 Ω, 150 mm (571 256, 0,15€)] zum Durchschleifen des DVB-Signals&lt;br /&gt;
:DVB-T:&lt;br /&gt;
*Bitte beachten: Passive Antennen sind grundsätzlich nicht zu empfehlen. Zumindest nicht im Zimmer. Außer man wohnt am Sender :D&lt;br /&gt;
*[http://www.pollin.de/shop/dt/MTc4ODI0OTk-/SAT_Antennentechnik/DVB_T_DVB_C/Antennen/DVB_T_Antenne_QOSMIO.html Pollin : DVB-T Antenne QOSMIO, passiv (571 128, 2,95€)]&lt;br /&gt;
:DVB-S:&lt;br /&gt;
*[http://www.elsner-computer.de/product_info.php?info=p430032_Dream-Multimedia-Tuner-7020S---7020Si---DVB-S.html Tuner 7020S Elsner Shop 39€ mit Alps Tuner, läuft (noch?) nicht unter WIN CE !!!]&lt;br /&gt;
*[http://www.hm-sat-shop.de/receiver-digital-dreambox/sat-tuner-fuer-dreambox-7020-philips.html HM Sat Shop:DVB-S Tuner zum Sat-Umbau, 49€.] &lt;br /&gt;
*[http://www.devilcards.de/Ersatzteile-Dreambox/Dream-Multimedia-Tuner-7020S-7020Si-DVB-S::225.html DevilCards Dream Multimedia Tuner 7020S DVB-S 37€ mit Alps Tuner, läuft (noch?) nicht unter WIN CE !!! ]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Entweder zwei identische Tuner bestücken oder exklusiv nur einen. Mischbetrieb ist scheinbar nicht möglich!&lt;br /&gt;
&lt;br /&gt;
*...außerdem Plexiglas/Kunststoff-Zuschnitt (13cm x 15cm) als HD-Träger sowie diverse Schrauben aus der PC-Grabbelkiste (7* Gehäuse, 1* Front-USB, 4* Schaltnetzteil, 6* Mainboard, 4* HD-Träger, 4* HD, 3* Frontpanel)&lt;br /&gt;
*...gut eignet sich auch das Bodenblech aus einem alten CD-Laufwerk: quer eingebaut und den überstehenden Teil abgesägt, 3.5mm-Löcher reingebohrt -- fertig!&lt;br /&gt;
*zu guter letzt wäre ein passender [http://www.mikrocontroller.net/attachment/106125/box.jpg Berührungsschutz für das Schaltnetzteil] noch eine sinnvolle Maßnahme zur Vermeidung von Personenschäden. Auch hier kann wieder ein Plexiglas/Kunststoff-Zuschnitt zum Einsatz kommen.&lt;br /&gt;
&lt;br /&gt;
= Hardware =&lt;br /&gt;
Aufbauend auf der Telegent TG 15666 EVO1, auch bekannt als Maxdome 15666 kommt die bei Pollin vertriebene Hardware jedoch mit zusätzlichen Features wie beispielsweise DVB-Tuner, CI-Slot, CONAX-SLot, SATA-Anschluss für interne Festplatte und Display zur Anzeige der Sendernummer.&lt;br /&gt;
== technische Daten ==&lt;br /&gt;
:Hauptprozessor PNX-8950 CPU (little endian)&lt;br /&gt;
:Flash-ROM 64 MB&lt;br /&gt;
:RAM-Speicher 256 MB&lt;br /&gt;
:Festplatte 250 GB (bei original Medion-Gerät) &lt;br /&gt;
*Conditional Access Interface&lt;br /&gt;
:1 Steckplatz (PCMCIA, DVB Common Interface Standard)&lt;br /&gt;
:1 Steckplatz (CONAX und andere)&lt;br /&gt;
*A/V &amp;amp; Data In/Out-Anschlüsse extern&lt;br /&gt;
:Video CVBS/S-VIDEO-Ausgang (PAL)&lt;br /&gt;
:TV-SCART (PAL/RGB-Ausgang)&lt;br /&gt;
:VCR-SCART&lt;br /&gt;
:Audio L/R-Ausgang&lt;br /&gt;
:Optical S/PDIF Digital Audio- oder Dolby AC-3 Bitstream-Ausgang&lt;br /&gt;
:serielle Schnittstelle (9-poliger D-Sub Type)&lt;br /&gt;
:RJ 45 (LAN 10/100MBit)&lt;br /&gt;
:WLAN-Antennensockel (Reverse-SMA Buchse)&lt;br /&gt;
:2x USB (1 Vorder-/Rückseite)&lt;br /&gt;
:2x Tuner (Philips DVB-T Tuner TU1216L/IVP über Input/Loop-Through-Connector F-Type, IEC 169-2, Buchse/Stecker)&lt;br /&gt;
*Ports/Anschlüsse intern&lt;br /&gt;
:3x USB 2.0 (einer davon über Kabel mit Front-USB verbunden)&lt;br /&gt;
:2x SATA-150&lt;br /&gt;
:RS232 (Console)&lt;br /&gt;
:miniPCI für WLAN-Karte XG-603 (über Verbindungskabel mit U.FL-Stecker an rückwärtige Reverse-SMA Buchse)&lt;br /&gt;
*Tuner &amp;amp; Service Decoder&lt;br /&gt;
:2 x Philips DVB-T Tuner &amp;quot;TU1216L/I V P&amp;quot; oder DVB-C Tuner &amp;quot;CU1216L/A I G V-3&amp;quot;&lt;br /&gt;
:RF-Anschlussimpedanz 75Ω&lt;br /&gt;
:Input/Loop-through-Connector F-Type, IEC 600169-2/24 (IEC-F-Anschluss)&lt;br /&gt;
:Frequenzbereich 45 ~ 860 MHz&lt;br /&gt;
:Signalpegel Eingang min. 74 dBm&lt;br /&gt;
:Modulation QPSK, 16 und 64 QAM&lt;br /&gt;
*MPEG Transport-Stream A/V Decoding&lt;br /&gt;
:Transport-Stream ISO/IEC 13818-1 MPEG-2&lt;br /&gt;
:Profile-Level 2x MPEG-2 MP@ML (PIP)&lt;br /&gt;
:Aspect Ratio 4:3, 16:9, Pan &amp;amp; Scan, Letterbox&lt;br /&gt;
:Videoauflösung 720x576&lt;br /&gt;
:Audio-Decoding MPEG-1 Layer 1, 2, 3&lt;br /&gt;
*Stromversorgung&lt;br /&gt;
:Eingangsspannung 100~240V AC, 1,5 A, 50/60 Hz&lt;br /&gt;
:Stromaufnahme ohne HDD max. 2 A&lt;br /&gt;
:Energieverbrauch im Betrieb Max. 50 W, Standby: 12 W&lt;br /&gt;
:Schutz durch Interne Sicherung (auf Schaltnetzteil eingelötet)&lt;br /&gt;
:HDD-Stromversorgung on Board&lt;br /&gt;
*Physische Spezifikationen&lt;br /&gt;
:Größe/Abmessungen (BxHxT) 440 x 265 x 70 mm&lt;br /&gt;
:Betriebstemperatur +5°C - +40°C&lt;br /&gt;
&lt;br /&gt;
== Jumper ==&lt;br /&gt;
* J1: JTAG (Header 2x5, nicht bestückt)&lt;br /&gt;
* J2: RS-232 Console (3:RX=RS232.3, 5:TX=RS232.2, 9:GND=RS232.5, Header 2x5)&lt;br /&gt;
* J4: (Header 2*10)&lt;br /&gt;
* J6: (Header 2x1, neben HD-Power)&lt;br /&gt;
* J8: (Header 2x3 nicht bestückt)&lt;br /&gt;
* J27: Massepunkt(1:GND, 2:GND, Header 2*1, zwischen SCART und Audio-Buchse)&lt;br /&gt;
* J30: USB Port 4 (über 4 pol Kabel verbunden mit Front USB, Header 1x4) &lt;br /&gt;
* J31: USB Port 3 (Header 1x4)&lt;br /&gt;
* J32: (Header 2x1, nicht bestückt, neben SW1)&lt;br /&gt;
* J34: an PIN 32 DVB-T-Tuner (Header 2x1, neben Tuner 1, bei DVB-C-Tuner nicht benutzt)&lt;br /&gt;
* J35: +5V für aktive Antenne (Header 2x1, nicht bestückt, neben Tuner 1, Zur Spannungsversorgung der am Tuner 1 angeschlossenen aktiven Antenne mit 5V)&lt;br /&gt;
* J36: an PIN 32 DVB-T-Tuner (Header 2x1, neben Tuner 2, bei DVB-C-Tuner nicht benutzt)&lt;br /&gt;
* J37: +5V für aktive Antenne (Header 2x1, nicht bestückt, neben Tuner 2, Zur Spannungsversorgung der am Tuner 2 angeschlossenen aktiven Antenne mit 5V)&lt;br /&gt;
* J41: Anschluss Bedien-PCB,  7-Seg. Display(5 pol)&lt;br /&gt;
* J42: Anschluss Bedien-PCB, Tastatur + Infrarot-Receiver (10 pol)&lt;br /&gt;
* J43: 12V von Schaltnetzteil&lt;br /&gt;
* J45: 12V Spannungsversorgung, nicht bestückt, Hohlbuchse&lt;br /&gt;
* J46: USB Port 2 (Header 1x4)&lt;br /&gt;
* J47: SPDIF-Ausgang&lt;br /&gt;
&lt;br /&gt;
== Schalter ==&lt;br /&gt;
SW1:  ON: Consoleport 38400 bps, Flashloader aktiv, Softwareupdate von externem USB-Stick laden&lt;br /&gt;
:OFF: Consoleport@115200N81, Flashloader passiv(default)&lt;br /&gt;
SW2:  ON: EJTAG enabled&lt;br /&gt;
:OFF: EJTAG disabled (default)&lt;br /&gt;
&lt;br /&gt;
Wenn man die Serielle zum loggen nutzt, ist zu beachten, dass Ausgaben&lt;br /&gt;
vom Flashloader (SW1 on)  mit 38400 Baud erfolgen, wenn allerdings SW1&lt;br /&gt;
auf &amp;quot;off&amp;quot; steht muss man das Terminal auf 115200 8-N-1 stellen.&lt;br /&gt;
&lt;br /&gt;
== LEDs ==&lt;br /&gt;
* &amp;lt;span style=&amp;quot;background-color:lightgreen;color:black&amp;quot;&amp;gt;LED1: grün&amp;lt;/span&amp;gt;, blinkt, wenn am rückwärtigen USB-Anschluss beispielsweise eine Maus angeschlossen ist (zwischen U1 und nicht bestücktem DVI-Chip U42)&lt;br /&gt;
* &amp;lt;span style=&amp;quot;background-color:blue;color:white&amp;quot;&amp;gt;LED2: blau&amp;lt;/span&amp;gt; (neben Befestigungsloch H3)&lt;br /&gt;
* &amp;lt;span style=&amp;quot;background-color:red;color:white&amp;quot;&amp;gt;LED3: rot&amp;lt;/span&amp;gt;, wahrscheinlich Netzkontroll-LED (Nähe J4)&lt;br /&gt;
* &amp;lt;span style=&amp;quot;background-color:lightgreen;color:black&amp;quot;&amp;gt;LED4: grün&amp;lt;/span&amp;gt;, leuchtet nur ganz schwach (neben LED3, Nähe J4)&lt;br /&gt;
* &amp;lt;span style=&amp;quot;background-color:lightgreen;color:black&amp;quot;&amp;gt;LED5: grün&amp;lt;/span&amp;gt; (neben Prozessor)&lt;br /&gt;
* &amp;lt;span style=&amp;quot;background-color:blue;color:white&amp;quot;&amp;gt;LED6: blau&amp;lt;/span&amp;gt; CPU Heartbeat, blinkt im Sekundentakt (neben Prozessor)&lt;br /&gt;
* &amp;lt;span style=&amp;quot;background-color:red;color:white&amp;quot;&amp;gt;LED7: rot&amp;lt;/span&amp;gt; (neben LED5)&lt;br /&gt;
* &amp;lt;span style=&amp;quot;background-color:lightgreen;color:black&amp;quot;&amp;gt;LED8: grün&amp;lt;/span&amp;gt;, zeigt HD-Schreibzugriff bei einer Aufnahme an (neben J6, USB Port 2)&lt;br /&gt;
&lt;br /&gt;
== Netzteil ==&lt;br /&gt;
Open Frame Schaltnetzteil, Typ DELTA EADP-50DF (bei Pollin AUSVERKAUFT)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Technische Daten:&#039;&#039;&#039;&lt;br /&gt;
*Eingang 100...240 V~&lt;br /&gt;
*Ausgang 12 V-/4,16 A&lt;br /&gt;
*Leistungsaufnahme unbelastet nur 0,5 W&lt;br /&gt;
*eingangsseitiges Euro-Netzkabel 1,3 m mit Zugentlastung&lt;br /&gt;
*Snap-In Netzschalter (Einbauöffnung 20x13 mm)&lt;br /&gt;
*4 Bohrungen (ø 3,5 mm) zur Befestigung der Platine&lt;br /&gt;
*Maße (LxBxH): 150x60x26 mm. &lt;br /&gt;
&lt;br /&gt;
Das Netzteil hat elektrisch KEINEN Kontakt zum Gehäuse, es sei denn die mit J4 bezeichnete [http://www.mikrocontroller.net/attachment/104993/00027.jpg Brücke] wird auf der Netzteilplatine nachträglich eingelötet. Das ganze ist sehr gut auf dem [http://www.mikrocontroller.net/attachment/104992/00025.jpg Foto] erkennbar.&lt;br /&gt;
Dieser Jumper sorgt dafür, dass die Masse der Sekudärseite mit dem Gehäuse verbunden wird. Dies passiert sowieso über die Receiverplatine; ein gesetzter Jumper sorgt so eher für eine Masseschleife...&lt;br /&gt;
&lt;br /&gt;
Nicht zu verachten ist jedoch der auf dem Netzteil befindliche Kühlkörper. Dieser führt die halbe Netzspannung, also 115V AC! &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ACHTUNG: Gegen versehentliche Berührung sichern. Vor Arbeiten am Gerät immer Netzstecker ziehen!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Aussage von Pollin auf Facebook am 27.2.2012: ... leider ist das Schaltnetzteil (350 943) komplett ausverkauft und bekommen es nicht mehr ins Sortiment.&lt;br /&gt;
&lt;br /&gt;
==Bestückungsvarianten der Hauptplatine==&lt;br /&gt;
===DVB-T===&lt;br /&gt;
===DVB-C===&lt;br /&gt;
Die Box kann hardwareseitig QAM256 modulierte Programme wiedergeben.&lt;br /&gt;
&lt;br /&gt;
===DVB-S===&lt;br /&gt;
Offiziell gab es die Box nur mit DVB-T und DVB-C Tunern. Jedoch ist es möglich, nach Auslöten der original Tuner nachträglich DVB-S Tuner zu verbauen. Gemischter Betrieb ist dabei nicht möglich. Dies liegt unter anderem daran, dass moreTV nicht zwei Senderlisten (für jeden Tuner eine eigene) verwaltet, sondern nur eine gemeinsame Senderliste. Mit einem Tuner aus einer defekten DM7020 (Tuner: Philips SU1278) wurde DVB-S erfolgreich getestet.&lt;br /&gt;
Bezugsmöglichkeiten:&lt;br /&gt;
http://www.hm-sat-shop.de/receiver-digital-dreambox/sat-tuner-fuer-dreambox-7020-philips.html&lt;br /&gt;
&lt;br /&gt;
== Bilder/Innenleben ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;300&amp;quot; heights=&amp;quot;225&amp;quot; perrow=&amp;quot;3&amp;quot;&amp;gt;&lt;br /&gt;
Bild:moretv_1.jpg|Gesamtansicht&lt;br /&gt;
Bild:moretv_2.jpg|JTAG-Anschluss für LPC921F (unter anderem) und Platz zur Montage einer 3,5&amp;quot; Festplatte&lt;br /&gt;
Bild:moretv_3.jpg|Board komplett&lt;br /&gt;
Bild:moretv_4.jpg|DVI – nicht bestückt&lt;br /&gt;
Bild:moretv_5.jpg|DVB-T Tuner&lt;br /&gt;
Bild:moretv_6.jpg|CPU RAM etc.&lt;br /&gt;
Bild:PNX8950 ohne kuehlkoerper.JPG|CPU ohne Kühlkörper&lt;br /&gt;
Bild:moretv_7.jpg|mini PCI, Sata, CI-Slot, Smartcard&lt;br /&gt;
Bild:moretv_8.jpg|Rückseite komplett&lt;br /&gt;
Bild:moretv_9.jpg|CI-Controller&lt;br /&gt;
Bild:moretv_10.jpg|Sata-Controller&lt;br /&gt;
Bild:moretv_11.jpg|RAM und TDA8024T SmartCard-Interface&lt;br /&gt;
Bild:moretv_12.jpg|LAN DP83816 (fast identisch zu SiS 900)&lt;br /&gt;
Bild:moretv_13.jpg|SW1 auf ON = SW-Update&amp;lt;br/&amp;gt;SW2 auf ON = JTAG Enable&lt;br /&gt;
Bild:moretv_14.jpg|Stromversorgung&lt;br /&gt;
Bild:moretv_15.jpg|Anschluss J4&lt;br /&gt;
Bild:EJTAG.jpg|CON1: EJTAG für den PNX8950&lt;br /&gt;
Bild:Tuner_Jumper1.JPG|Wie man sieht, müssen keinerlei Jumper gesetzt sein, um DVB-T empfangen zu können.&lt;br /&gt;
Bild:Console.png|RS-232 Console auf J2&lt;br /&gt;
Bild:lpc_8051_power.png|3,3Volt auf J4&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Schnittstellen ==&lt;br /&gt;
&lt;br /&gt;
* 4x USB (bei Verwendung von moreTV werden die USB-Ports nicht mehr unterstützt)&lt;br /&gt;
** 3x intern: J31 USB Port3, J46 USB Port2&lt;br /&gt;
** 2x extern: J30 USB Port4 (Frontpanel), CON9 (rückwärtiger USB Port1, unterhalb der RJ45-Buchse)&lt;br /&gt;
** &#039;&#039;&#039;Pinout&#039;&#039;&#039;:&lt;br /&gt;
::* Pin1: +5V (Rot)&lt;br /&gt;
::* PIN2: D-  (Weiss)&lt;br /&gt;
::* PIN3: D+  (Grün)&lt;br /&gt;
::* PIN4: GND (Schwarz)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* 2x RS-232&lt;br /&gt;
:* 1x intern, Pinbelegung (J33)&lt;br /&gt;
::* &#039;&#039;&#039;hier einfügen&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:*1x extern, Pinbelegung (J2):&lt;br /&gt;
::* 6 gnd&lt;br /&gt;
::* 5 rx1 r2in MAX2333 (U10)&lt;br /&gt;
::* 4 rx2 r1in MAX2333 (U10)&lt;br /&gt;
::* 3 tx1 T2out MAX2333 (U10)&lt;br /&gt;
::* 2 tx2 T1out MAX2333 (U10)&lt;br /&gt;
::* 1 gnd  0&lt;br /&gt;
::* das O ist die Markierung auf der Platine&lt;br /&gt;
&lt;br /&gt;
== Chips ==&lt;br /&gt;
Übersicht über die verwendeten Bausteine mit Links auf entsprechende Datenblätter, Quellen etc.&lt;br /&gt;
&lt;br /&gt;
* Multimedia-CPU Philips PNX8950EH/M2/S1 (MIPS32)&lt;br /&gt;
**[http://datasheet.octopart.com/PNX8950EH/M2/S1%2C55-NXP-datasheet-8325175.pdf Datasheet PNX8950EH/M2/S1]&lt;br /&gt;
**[http://www.brightsign.biz/documents/HD2000HardwareGuide.pdf Brightsign Hardwareguide]&lt;br /&gt;
**[http://www.kanecomputing.co.uk/pdfs/mds_mds810.pdf MDS-810]&lt;br /&gt;
*[http://www.alldatasheet.com/datasheet-pdf/pdf/98585/SAMSUNG/K4H511638C-UCCC.html 4x 512 MBit DDR SDRAM SAMSUNG K4H511638C-UCCC]&lt;br /&gt;
* [http://www.hynix.com/datasheet/pdf/flash/HY27(U_S)S(08_16)121A%20Series(Rev1.3).pdf HYNIX HY27US08121A 512 Mbit NAND Flash]&lt;br /&gt;
* [http://www.siliconimage.com/docs/SiI-DS-0102-D.pdf SiI3512 SATA150 Controller]&lt;br /&gt;
*[http://www.national.com/ds/DP/DP83816.pdf 10/100 Mbps PCI Ethernet-Controller NATIONAL DP83816]&lt;br /&gt;
* High Speed USB PCI Host Controller Philips ISP1561BM [http://www.nxp.com/acrobat_download2/expired_datasheets/ISP1561_2.pdf Datasheet]&lt;br /&gt;
* [http://www.maxim-ic.com/datasheet/index.mvp/id/1068 MAX3222]&lt;br /&gt;
* PNX8510HW [http://www.datasheetcatalog.org/datasheet/philips/PNX8510_PNX8511_4.pdf Datasheet]&lt;br /&gt;
* Bedienteil mit LED-Display, Infrarotempfänger usw.&lt;br /&gt;
* In der DVB-C-Version: Philips CU1216 DVB-C Tuner [http://read.pudn.com/downloads138/sourcecode/others/589797/CU1216L-3-datasheet.pdf Datasheet]&lt;br /&gt;
** Philips TDA10023 (DVB-C Channel Decoder) [http://www.datasheetdownload.com/download.php?id=677273 Datasheet]&lt;br /&gt;
* In der DVB-T-Version: Philips TU1216 DVB-T Tuner&lt;br /&gt;
** Philips TDA10046 (DVB-T Channel Decoder) [http://www.nxp.com/acrobat/literature/9397/75009522.pdf Spec Sheet] [http://git.linuxtv.org/media_tree.git?a=blob;f=drivers/media/dvb/frontends/tda1004x.c - linuxtv.org Frontend Treiber]&lt;br /&gt;
** Philips TDA6650 (5 V mixer/oscillator and low noise PLL synthesizer for hybrid terrestrial tuner) [http://www.nxp.com/documents/data_sheet/TDA6650TT_6651TT.pdf Datasheet] [http://git.linuxtv.org/media_tree.git?a=blob;f=drivers/media/dvb/frontends/tda665x.c - linuxtv.org Tuner Treiber]&lt;br /&gt;
* Philips TDA8024T (IC Card Interface) [http://www.nxp.com/documents/data_sheet/TDA8024.pdf Datasheet]&lt;br /&gt;
* U19: [http://ics.nxp.com/products/lpc900/all/~P89LPC921/ Philips P89LPC921] 8-Bit Mikrocontroller mit 8051-Kern&lt;br /&gt;
* U24: [http://www.nxp.com/documents/data_sheet/PCF8563.pdf Philips PCF8563T] Echtzeituhr (RTC)&lt;br /&gt;
* U82 (SOIC) oder U38 (DIP): [http://atmel.com/dyn/resources/prod_documents/doc5140.pdf Atmel 93C46] 1kbit serial EEPROM&lt;br /&gt;
&lt;br /&gt;
Nicht bestückte ICs:&lt;br /&gt;
* U42 DVI (wahrscheinlich [http://www.nxp.com/products/interface_and_connectivity/hdmi/hdmi_transmitters/TDA9981B.html Philips TDA9983])&lt;br /&gt;
* U40 ????&lt;br /&gt;
* U41 ????&lt;br /&gt;
* U44 ????&lt;br /&gt;
* U45 ????&lt;br /&gt;
* U48 ????&lt;br /&gt;
* U51 ????&lt;br /&gt;
* U59 ????&lt;br /&gt;
&lt;br /&gt;
== Fernbedienung ==&lt;br /&gt;
Bitte bei der Fernbedienung RCX161 von Pollin beachten:&lt;br /&gt;
Das ist eine FB, die für unterschiedliche Geräte gedacht ist. Wenn die FB nicht im richtigen Modus ist, dann blinkt zwar der Receiver bei jedem Tastendruck, TUT ABER NIX! Die Knöpfe links oben schalten den Code und/oder die Adressen um:&amp;lt;br /&amp;gt;&lt;br /&gt;
- TV  : schaltet auf RC5 (Adresse 0) um&amp;lt;br /&amp;gt;&lt;br /&gt;
- STB : schaltet auf NEC-Protokoll (Adresse 68) um. Das ist die Betriebsart für die weiter unten beschriebenen Tastencodes. Beispiel: &lt;br /&gt;
        Taste &amp;quot;1&amp;quot; gedrückt --&amp;gt; 446B10EFh wird empfangen. &lt;br /&gt;
        das entspricht Adresse 68 (44h) und Code 16 (10h)&amp;lt;br /&amp;gt;&lt;br /&gt;
- DVD : schaltet auf NEC-Protokoll (Adresse 0) um.&amp;lt;br /&amp;gt;&lt;br /&gt;
- VCR : wahrscheinlich JVC-Format (nur 37 Halbbits)&amp;lt;br /&amp;gt;&lt;br /&gt;
        hier mal ne Aufzeichnung:&lt;br /&gt;
        8.1 ms Lo, 3.8 ms Hi, 0.5 ms Lo, 1.39 ms Hi, 0.55 ms Lo ....&lt;br /&gt;
- AUX : schaltet auf NEC-Protokoll (Adresse 32)&amp;lt;br /&amp;gt;&lt;br /&gt;
Die Tastencodes sind je nach Gerät unterschiedlich.&lt;br /&gt;
Die NEC-Protokolle sind klassisch, d.h. im 1. Byte kommt die Adresse,&lt;br /&gt;
im 2. Byte die negierte Adresse, im 3. Byte der Tastencode und im&lt;br /&gt;
4.Byte der negierte Tastencode. (Es gibt auch FB, die es mit den&lt;br /&gt;
negierten Adressen und Codes nicht so genau nehmen)&lt;br /&gt;
&lt;br /&gt;
[[IRMP]] Codes (nur für den Modus &amp;quot;STB&amp;quot;):  &lt;br /&gt;
&lt;br /&gt;
Protokoll: NEC&amp;lt;br /&amp;gt;&lt;br /&gt;
Geräte ID: 68 (dez) bzw. 0x6B44&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;Tastencodes&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Code || Taste&lt;br /&gt;
|-&lt;br /&gt;
| 00 || 0&lt;br /&gt;
|-&lt;br /&gt;
| 01 || EXIT&lt;br /&gt;
|-&lt;br /&gt;
| 02 || 8&lt;br /&gt;
|-&lt;br /&gt;
| 03 || INFO&lt;br /&gt;
|-&lt;br /&gt;
| 04 || 4&lt;br /&gt;
|-&lt;br /&gt;
| 05 || Stumm&lt;br /&gt;
|-&lt;br /&gt;
| 06 || HELP&lt;br /&gt;
|-&lt;br /&gt;
| 07 || OK&lt;br /&gt;
|-&lt;br /&gt;
| 08 || 2&lt;br /&gt;
|-&lt;br /&gt;
| 09 || REC&lt;br /&gt;
|-&lt;br /&gt;
| 0B || Marker&lt;br /&gt;
|-&lt;br /&gt;
| 0C || 6&lt;br /&gt;
|-&lt;br /&gt;
| 0E || Down&lt;br /&gt;
|-&lt;br /&gt;
| 0F || V-&lt;br /&gt;
|-&lt;br /&gt;
| 10 || 1&lt;br /&gt;
|-&lt;br /&gt;
| 11 || AV&lt;br /&gt;
|-&lt;br /&gt;
| 12 || 9&lt;br /&gt;
|-&lt;br /&gt;
| 13 || Right&lt;br /&gt;
|-&lt;br /&gt;
| 14 || 5&lt;br /&gt;
|-&lt;br /&gt;
| 15 || Archiv&lt;br /&gt;
|-&lt;br /&gt;
| 17 || P-&lt;br /&gt;
|-&lt;br /&gt;
| 18 || 3&lt;br /&gt;
|-&lt;br /&gt;
| 19 || Up&lt;br /&gt;
|-&lt;br /&gt;
| 1A || Yellow&lt;br /&gt;
|-&lt;br /&gt;
| 1B || Left&lt;br /&gt;
|-&lt;br /&gt;
| 1C || 7&lt;br /&gt;
|-&lt;br /&gt;
| 1D || Stop/LIVE&lt;br /&gt;
|-&lt;br /&gt;
| 1E || RED&lt;br /&gt;
|-&lt;br /&gt;
| 1F || V+&lt;br /&gt;
|-&lt;br /&gt;
| 40 || MORE&lt;br /&gt;
|-&lt;br /&gt;
| 41 || LIST&lt;br /&gt;
|-&lt;br /&gt;
| 42 || FFWD&lt;br /&gt;
|-&lt;br /&gt;
| 44 || Chap-&lt;br /&gt;
|-&lt;br /&gt;
| 46 || Play&lt;br /&gt;
|-&lt;br /&gt;
| 48 || TV&lt;br /&gt;
|-&lt;br /&gt;
| 49 || #&lt;br /&gt;
|-&lt;br /&gt;
| 4A || GREEN&lt;br /&gt;
|-&lt;br /&gt;
| 4C || EPG&lt;br /&gt;
|-&lt;br /&gt;
| 4E || SLOW&lt;br /&gt;
|-&lt;br /&gt;
| 50 || P+&lt;br /&gt;
|-&lt;br /&gt;
| 51 || *&lt;br /&gt;
|-&lt;br /&gt;
| 52 || POWER&lt;br /&gt;
|-&lt;br /&gt;
| 54 || FREW&lt;br /&gt;
|-&lt;br /&gt;
| 56 || PAUSE&lt;br /&gt;
|-&lt;br /&gt;
| 58 || Setup&lt;br /&gt;
|-&lt;br /&gt;
| 59 || TEXT&lt;br /&gt;
|-&lt;br /&gt;
| 5A || BLUE&lt;br /&gt;
|-&lt;br /&gt;
| 5C || Chap+&lt;br /&gt;
|-&lt;br /&gt;
| 5E || PiP&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== DVI Schnittstelle ==&lt;br /&gt;
&lt;br /&gt;
Das Layout für eine DVI Buchse ist vorhanden. Leider ist dieses nicht bestückt. Bisher ist keine erfolgreiche Bestückung bekannt. Hier wird nun der aktuelle Stand dokumentiert.&lt;br /&gt;
&lt;br /&gt;
Der aktuelle Stand findet Ihr hier: http://www.mikrocontroller.net/topic/226429&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Momentane Bauteilliste:&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* U42: NXP TDA9984BHW&lt;br /&gt;
* D70, D74: BOURNS CDSC706-0504C&lt;br /&gt;
* L121-L124: TDK ACM2012-900-2P&lt;br /&gt;
* U41: ON SEMICONDUCTOR MC74VHC1GT50DFT1&lt;br /&gt;
* Q2, Q3: NXP BSS123 oder BSH112&lt;br /&gt;
* Q25: LM1117IMPX-ADJ&lt;br /&gt;
* L136, L137, L140: ?&lt;br /&gt;
&lt;br /&gt;
= Anwendungen und Ideen =&lt;br /&gt;
&lt;br /&gt;
==Realisierte Projekte/Anwendungen für MoreTV==&lt;br /&gt;
&lt;br /&gt;
Hier finden sich Installationsanleitungen zu verschiedenen Softwarepaketen und Erweiterungen. Da das System keine .cab-Dateien unterstützt muss dabei viel manuell erledigt werden. Viele der Anpassungen laufen auch mit dem original Windows CE.&lt;br /&gt;
&lt;br /&gt;
=== FTP-Server installieren  ===&lt;br /&gt;
* Auf der Festplatte in der Datei &amp;quot;moreTV.cfg&amp;quot; im Abschnitt &amp;quot;Shell_startup&amp;quot; die Zeile für den Start des ftp-Servers einfügen&lt;br /&gt;
::  &amp;lt;Shell_startup&amp;gt;&lt;br /&gt;
::  &amp;lt;run cmd=&amp;quot;$H\ftpsvr.exe&amp;quot;/&amp;gt;  &amp;lt;!-- diese Zeile einfügen --&amp;gt;&lt;br /&gt;
::  &amp;lt;run cmd=&amp;quot;$H\moreTV\DC.exe&amp;quot;/&amp;gt;&lt;br /&gt;
::  &amp;lt;!--  &amp;lt;run cmd=&amp;quot;$H\moreTV\Ivon.exe&amp;quot;/&amp;gt; --&amp;gt;&lt;br /&gt;
::  &amp;lt;run cmd=&amp;quot;$H\moreTV\MaxAktiv.exe&amp;quot;/&amp;gt;&lt;br /&gt;
::  &amp;lt;/Shell_startup&amp;gt;&lt;br /&gt;
* Den FTP-Server [http://www.mikrocontroller.net/attachment/104995/ftpsvr.exe hier] downloaden und nach $H:\ kopieren, also in das Hauptverzeichnis des ersten logischen Laufwerkes der Festplatte.&lt;br /&gt;
* Als Login-Daten für den FTP-Server können beliebige Werte eingeben, z.B.&lt;br /&gt;
::   Benutzer: root&lt;br /&gt;
::   Passwort: root&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkungen:&#039;&#039;&#039;&lt;br /&gt;
* Die Exe-Dateien aus dem Windows-Verzeichnis können aber nicht bzw. nicht alle kopiert werden. Im Total-Commander werden die Attribute 555 angezeigt. Vielleicht hat ja noch jemand eine Idee, wie man das überwinden kann. Das sind Dateien, die im ROM angeordnet und bereits auf feste Adressen geladen sind, so dass sie direkt ausführbar sind - also nicht direkt kopier- und an anderer Stelle verwendbar. Idee: wahrscheinlich finden sich diese Dateien in einem Plattform-Kit oder einer EVC-Version (EmbeddedVisualC..) von Microsoft.&lt;br /&gt;
* Der FTP-Server unterstützt nicht alle Befehle des FTP-Protokolls, so ist es mit einigen Clients z.B. nicht möglich eine Datei zu überschreiben - die aktuelle Datei löschen und dann die Neue in den Ordner kopieren funktioniert jedoch.&lt;br /&gt;
&lt;br /&gt;
=== VNC-Server installieren  ===&lt;br /&gt;
* Auf der Festplatte in der Datei &amp;quot;moreTV.cfg&amp;quot; im Abschnitt &amp;quot;Shell_startup&amp;quot; die Zeile für den Start des vnc-Servers einfügen&lt;br /&gt;
::  &amp;lt;Shell_startup&amp;gt;&lt;br /&gt;
::  &amp;lt;run cmd=&amp;quot;$H\winvnc.exe&amp;quot;/&amp;gt;  &amp;lt;!-- diese Zeile einfügen --&amp;gt;&lt;br /&gt;
::  &amp;lt;run cmd=&amp;quot;\Windows\explorer.exe&amp;quot;/&amp;gt;&lt;br /&gt;
::  &amp;lt;run cmd=&amp;quot;$H\moreTV\DC.exe&amp;quot;/&amp;gt;&lt;br /&gt;
::  &amp;lt;!--  &amp;lt;run cmd=&amp;quot;$H\moreTV\Ivon.exe&amp;quot;/&amp;gt; --&amp;gt;&lt;br /&gt;
::  &amp;lt;run cmd=&amp;quot;$H\moreTV\MaxAktiv.exe&amp;quot;/&amp;gt;&lt;br /&gt;
::  &amp;lt;/Shell_startup&amp;gt;&lt;br /&gt;
* Den VNC-Server [http://www.mikrocontroller.net/attachment/105859/winvnc.exe hier] downloaden und nach $H:\ kopieren, also in das Hauptverzeichnis des ersten logischen Laufwerkes der Festplatte.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkungen:&#039;&#039;&#039;&lt;br /&gt;
* Sofern More.TV läuft ist auf dem Client nur ein schwarzer Bildschirm zu sehen. Minimiert man es lässt sich die WinCE-Oberfläche normal nutzen.&lt;br /&gt;
* Durch Auskommentieren der Zeile mit MaxAktiv.exe kann man den automatischen Start der More.TV-Software verhindern, man erhält den üblichen Windows-Desktop. Die Software lässt sich später über die genannte EXE manuell starten.&lt;br /&gt;
&lt;br /&gt;
=== More.TV als UPnP-Client ===&lt;br /&gt;
&lt;br /&gt;
Die More.TV-Firmware kann prinzipiell als UPnP-AV-Client verwendet werden, also Audio- und Videodateien von einem entsprechend ausgestatteten Netzwerkspeicher abspielen. Die Einrichtung wird durch einen Bug erschwert, die Funktion ist recht beschränkt.&lt;br /&gt;
&lt;br /&gt;
Ist die Box korrekt mit dem Netzwerk verbunden kann unter Setup &amp;gt; Netzwerk &amp;gt;&lt;br /&gt;
Media-Server der aktive Medienserver ausgewählt werden. Ist nur ein UPnP-AV-Server im Netz verfügbar wird dieser nicht in der Datenbank eingetragen, versucht man im More-Menü auf &amp;quot;Medien&amp;quot; zuzugreifen erhält man die Meldung &amp;quot;No Media Server found. Please check connection&amp;quot;. Zur Korrekten Einrichtung müssen im Netz zwei Mediaserver vorhanden sein - wählt man nun auf der Box einen aus der Liste aus wird der Server korrekt gespeichert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Technische Info:&#039;&#039; Der aktuelle Mediaserver wird in der Datei &#039;&#039;&#039;/HardDisk/moreTV.persistent/tbConfigurations.xbc&#039;&#039;&#039; als Variable &amp;quot;MEDIA_SERVER&amp;quot; gespeichert. Sie ist als Standard &amp;quot;0&amp;quot;, wenn ein Server ausgewählt ist befindet sich hier der UPnP-Server-Name.&lt;br /&gt;
&lt;br /&gt;
Ist ein Mediaserver eingetragen lässt sich der Menüpunkt &amp;quot;Medien&amp;quot; ohne Fehler aufrufen, es bestehen 3 Ordner (Video, Musik, Bilder). Bei den getesteten Linux-UPnP-Servern mediatomb und fuppes waren diese Ordner leer, ein Zugriff auf die Dateien nicht möglich. Mit dem integrieren Server des Windows Media Players können Dateien abgespielt werden, die Formate sind jedoch auf MPEG/TS und WMV (?) beschränkt, andere Formate führen zu Fehlermeldungen oder dem Aufhängen der Box.&lt;br /&gt;
&lt;br /&gt;
=== The Core Pocket Media Player (TCPMP) ===&lt;br /&gt;
&lt;br /&gt;
TCPMP ist ein hochoptimiertes Abspielprogramm für Videos und Audio. Eine Anleitung zur Installation auf dieser Box ist bei [http://thomson.dreamgates.de/dokuwiki/doku.php?id=sot:installation:telegent#tcpmp_installieren dreamgates.de] zu finden. Es kann wie CE3-Version verwendet werden.&lt;br /&gt;
&lt;br /&gt;
=== Total Commander ===&lt;br /&gt;
&lt;br /&gt;
TotalCommander (TCMD) ist ein alternativer Dateimanager welcher u.A. ZIP-funktionalität und Netzwerkzugriff (SMB,FTP) bietet. Die WinCE-Version steht als .cab zum [http://www.ghisler.com/wince2x.htm Download auf der Herstellerseite] bereit. Sie kann z.B. mit der Software &amp;quot;WinCE Cab Manager&amp;quot; entpackt werden, die Dateien werden in &amp;quot;\Programme\Total Commander&amp;quot; platziert.&lt;br /&gt;
&lt;br /&gt;
==Anwendungsideen==&lt;br /&gt;
&lt;br /&gt;
===Unter Linux===&lt;br /&gt;
* Festplattenreceiver&lt;br /&gt;
* Asterisk Server&lt;br /&gt;
* NAS&lt;br /&gt;
* Car-PC&lt;br /&gt;
* Multimedia Client/Server&lt;br /&gt;
* Wetterstation logging Server&lt;br /&gt;
* Solar logging Server&lt;br /&gt;
&lt;br /&gt;
===Unter WinCE===&lt;br /&gt;
* Festplattenreceiver&lt;br /&gt;
* NAS&lt;br /&gt;
* Car-PC&lt;br /&gt;
* Media Portal Client/Server&lt;br /&gt;
* Kamera Server&lt;br /&gt;
* Spielekonsole für minigames&lt;br /&gt;
* Download Server&lt;br /&gt;
&lt;br /&gt;
==== ROM entpacken / erweitern ====&lt;br /&gt;
Über die Software [http://www.xs4all.nl/~itsme/projects/xda/dumprom.html dumprom] soll sich die Systempartition entpacken lassen, mit [http://www.xs4all.nl/~itsme/projects/xda/romtools.html romtools] vielleicht wieder zusammenbauen.&lt;br /&gt;
 &lt;br /&gt;
Über diesen Weg könnte es möglich sein eine bestehende CE-Installation um weitere Funktionen zu ergänzen. &lt;br /&gt;
&lt;br /&gt;
Beide WinCE-Images können entpackt werden. Zumindest meldet Dumprom keine Fehler.&lt;br /&gt;
Nicht entpackt werden kann bislang nur 0_nboot, Dumprom läuft in eine Endlosschleife.&lt;br /&gt;
&lt;br /&gt;
Hier ein Vergleich des originalen Images mit dem aus der SWU&lt;br /&gt;
&lt;br /&gt;
Dateien in 2_WinCE1, die nicht in SWU_WinCe1 vorkommen:&lt;br /&gt;
&lt;br /&gt;
connmc.exe&lt;br /&gt;
&lt;br /&gt;
connpnl.cpl&lt;br /&gt;
&lt;br /&gt;
conshid.dll&lt;br /&gt;
&lt;br /&gt;
ethman.dll&lt;br /&gt;
&lt;br /&gt;
hidparse.dll&lt;br /&gt;
&lt;br /&gt;
ISP1561-ehci.dll&lt;br /&gt;
&lt;br /&gt;
kbdhid.dll&lt;br /&gt;
&lt;br /&gt;
MouHid.dll&lt;br /&gt;
&lt;br /&gt;
mp3dmod.dll&lt;br /&gt;
&lt;br /&gt;
ndispwr.dll&lt;br /&gt;
&lt;br /&gt;
phStbRootApp.sym&lt;br /&gt;
&lt;br /&gt;
rnaapp.exe&lt;br /&gt;
&lt;br /&gt;
tapi.dll&lt;br /&gt;
&lt;br /&gt;
TT7268M_.TTF&lt;br /&gt;
&lt;br /&gt;
usbhid.dll&lt;br /&gt;
&lt;br /&gt;
   zusätzliche Bytes: 594940&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dateien in SWU_WinCe1, die nicht in 2_WinCE1 vorkommen:&lt;br /&gt;
&lt;br /&gt;
av_dll.dll&lt;br /&gt;
&lt;br /&gt;
cedrm2.dll&lt;br /&gt;
&lt;br /&gt;
ddcore.dll&lt;br /&gt;
&lt;br /&gt;
ddhel.dll&lt;br /&gt;
&lt;br /&gt;
ddraw.dll&lt;br /&gt;
&lt;br /&gt;
devcerttemplate.dat&lt;br /&gt;
&lt;br /&gt;
DspImageBuild.txt&lt;br /&gt;
&lt;br /&gt;
icm.dll&lt;br /&gt;
&lt;br /&gt;
imaadpcm.dll&lt;br /&gt;
&lt;br /&gt;
janus_wince.dll&lt;br /&gt;
&lt;br /&gt;
MediaRenderer.dll&lt;br /&gt;
&lt;br /&gt;
mediarenderer.xml&lt;br /&gt;
&lt;br /&gt;
mediarendereravtransportservice.xml&lt;br /&gt;
&lt;br /&gt;
mediarendererconnectionmanagerservice.xml&lt;br /&gt;
&lt;br /&gt;
mediarendererrenderingcontrolservice.xml&lt;br /&gt;
&lt;br /&gt;
msadpcm.dll&lt;br /&gt;
&lt;br /&gt;
msg711.dll&lt;br /&gt;
&lt;br /&gt;
msgsm610.dll&lt;br /&gt;
&lt;br /&gt;
msrle32.dll&lt;br /&gt;
&lt;br /&gt;
mTVshell.exe&lt;br /&gt;
&lt;br /&gt;
phStbRootApp_0.mi.size&lt;br /&gt;
&lt;br /&gt;
phStbRootApp_0.sym&lt;br /&gt;
&lt;br /&gt;
phStbRootApp_1.mi.size&lt;br /&gt;
&lt;br /&gt;
phStbRootApp_1.sym&lt;br /&gt;
&lt;br /&gt;
Pnx8550Mmio.dll&lt;br /&gt;
&lt;br /&gt;
PNX8550_UART.dll&lt;br /&gt;
&lt;br /&gt;
StandbyMicro.mapping&lt;br /&gt;
&lt;br /&gt;
TFFS3.dll&lt;br /&gt;
&lt;br /&gt;
TmStream.dll&lt;br /&gt;
&lt;br /&gt;
wmdrmpd.dat&lt;br /&gt;
&lt;br /&gt;
   zusätzliche Bytes: 1587378&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dateien, die ungleich sind: zu viele um sie hier zu posten.&lt;br /&gt;
&lt;br /&gt;
===Hardware-Mods===&lt;br /&gt;
====SATA Power-Mod====&lt;br /&gt;
Der interne Molex für die SATA-Platte liefert an der +12V-Schiene nur ca. 11V welche unter Last bis auf ca. 10V einbrechen können. Für den Anlaufstrom vor allem älterer Festplatten kann dies ggf. zu wenig sein.&lt;br /&gt;
&lt;br /&gt;
Ich habe die +12V der Festplatte vom Molex getrennt und direkt mit der 12V-Schiene des Netzteils verbunden. Da die Kommandos zum Abschalten der Festplatte per SATA gegeben werden ist der Standby-Betrieb durch diese Änderung nicht beeinträchtigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Antennenspannung für aktive Antennen über den Receiver (DVB-T)====&lt;br /&gt;
Neben dem Tuner 1 befinden sich zwei unbestückte Lötaugen (siehe Foto). Werden diese miteinander verbunden, liegt am Antennenanschluss 5V für die Versorgung einer aktiven Antenne über den Receiver an.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;300&amp;quot; heights=&amp;quot;225&amp;quot; perrow=&amp;quot;3&amp;quot;&amp;gt;&lt;br /&gt;
Bild:Antennenanschluss.jpg|5V Antennenspannung&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= weitergehende Infos im Netz =&lt;br /&gt;
Alles was noch weiterführende Infos bietet. Andere Wikis, Beiträge, etc.&lt;br /&gt;
* [http://www.oohito.com/wince/mips_o_j.htm MIPS FTP Server]&lt;br /&gt;
* [http://thomson.dreamgates.de/dokuwiki/doku.php?id=stb:telegent:15666:start Dreamgates.de - TG 15666/EVO1]&lt;br /&gt;
* [http://hackdaworld.org/cgi-bin/awki.cgi/PnxStb hacking a pnx8950 based set top box]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Projekte]]&lt;/div&gt;</summary>
		<author><name>Shortie</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=IRMP&amp;diff=63225</id>
		<title>IRMP</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=IRMP&amp;diff=63225"/>
		<updated>2012-01-09T21:49:59Z</updated>

		<summary type="html">&lt;p&gt;Shortie: /* Fernbedienungen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Von &#039;&#039;&#039;Frank M. ([http://www.mikrocontroller.net/user/show/ukw ukw])&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= IRMP - Infrarot-Multiprotokoll-Decoder =&lt;br /&gt;
&lt;br /&gt;
[[Datei:irmp-title.png| |Scan eines NEC-kompatiblen Fernbedienungssignals]]&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
[[Datei:IRMP-TSOP1736.png|miniatur|Anschluß eines IR-Empfängers an µC]]&lt;br /&gt;
&lt;br /&gt;
Da RC5 nicht nur veraltet, sondern mittlerweile obsolet ist und immer mehr die elektronischen Geräte der fernöstlichen Unterhaltungsindustrie in unseren Haushalten Einzug finden, ist es an der Zeit, einen IR-Decoder zu entwickeln, der ca. 90% aller bei uns im täglichen Leben zu findenden IR-Fernbedienungen &amp;quot;versteht&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
IRMP ist lauffähig auf folgenden AVR µCs:&lt;br /&gt;
&lt;br /&gt;
* ATtiny45,  ATtiny85&lt;br /&gt;
* ATtiny84&lt;br /&gt;
* ATmega8,   ATmega16,  ATmega32&lt;br /&gt;
* ATmega162&lt;br /&gt;
* ATmega164, ATmega324, ATmega644,  ATmega644P, ATmega1284&lt;br /&gt;
* ATmega88,  ATmega88P, ATmega168,  ATmega168P, ATmega328P&lt;br /&gt;
&lt;br /&gt;
Es gibt aber auch Portierungen auf diverse PIC µCs.&lt;br /&gt;
&lt;br /&gt;
IRMP - der Infrarot-Fernbedienungsdecoder, der mehrere Protokolle auf einmal decodieren kann, beherrscht folgende Protokolle:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Protokoll || Hersteller&lt;br /&gt;
|-&lt;br /&gt;
| SIRCS || Sony&lt;br /&gt;
|-&lt;br /&gt;
| NEC || NEC, Yamaha, Canon, Tevion, Harman/Kardon, Hitachi, JVC, Pioneer, Toshiba, Xoro, Orion, NoName und viele weitere japanische Hersteller.&lt;br /&gt;
|-&lt;br /&gt;
| SAMSUNG || Samsung&lt;br /&gt;
|-&lt;br /&gt;
| SAMSUNG32 || Samsung&lt;br /&gt;
|-&lt;br /&gt;
| MATSUSHITA || Matsushita&lt;br /&gt;
|-&lt;br /&gt;
| KASEIKYO || Panasonic, Technics, Denon und andere japanische Hersteller, welche Mitglied der &amp;quot;Japan&#039;s Association for Electric Home Application&amp;quot; sind.&lt;br /&gt;
|-&lt;br /&gt;
| RECS80 || Philips, Nokia, Thomson, Nordmende, Telefunken, Saba&lt;br /&gt;
|-&lt;br /&gt;
| RECS80EXT || Philips, Technisat, Thomson, Nordmende, Telefunken, Saba&lt;br /&gt;
|-&lt;br /&gt;
| RC5 || Philips und andere europäische Hersteller&lt;br /&gt;
|-&lt;br /&gt;
| DENON || Denon, Sharp&lt;br /&gt;
|-&lt;br /&gt;
| RC6 || Philips und andere europäische Hersteller&lt;br /&gt;
|-&lt;br /&gt;
| RC6A || Philips, Kathrein und andere Hersteller, z.B. XBOX&lt;br /&gt;
|-&lt;br /&gt;
| APPLE || Apple&lt;br /&gt;
|-&lt;br /&gt;
| NUBERT || Nubert, z.B. Subwoofer System&lt;br /&gt;
|-&lt;br /&gt;
| B&amp;amp;O || Bang &amp;amp; Olufsen&lt;br /&gt;
|-&lt;br /&gt;
| GRUNDIG || Grundig&lt;br /&gt;
|-&lt;br /&gt;
| NOKIA || Nokia, z.B. D-Box&lt;br /&gt;
|-&lt;br /&gt;
| SIEMENS || Siemens, z.B. Gigaset M740AV (ab ~15kHz, siehe Bemerkungen zu F_INTERRUPTS)&lt;br /&gt;
|-&lt;br /&gt;
| FDC || FDC Keyboard (ab ~15kHz)&lt;br /&gt;
|-&lt;br /&gt;
| RCCAR || RC Car: IR Fernbedienung für Modellfahrzeuge&lt;br /&gt;
|-&lt;br /&gt;
| JVC || JVC&lt;br /&gt;
|-&lt;br /&gt;
| NIKON || NIKON&lt;br /&gt;
|-&lt;br /&gt;
| RUWIDO || RUWIDO (z.B. T-Home-Mediareceiver)&lt;br /&gt;
|-&lt;br /&gt;
| KATHREIN  || KATHREIN&lt;br /&gt;
|-&lt;br /&gt;
| NEC16  || JVC&lt;br /&gt;
|-&lt;br /&gt;
| NEC42  || JVC&lt;br /&gt;
|-&lt;br /&gt;
| LEGO   || Lego&lt;br /&gt;
|-&lt;br /&gt;
| THOMSON || Thomson&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Jedes dieser Protokolle ist einzeln aktivierbar. Wer möchte, kann alle Protokolle aktivieren. Wer nur ein Protokoll braucht, kann alle anderen deaktivieren. Es wird nur das vom Compiler übersetzt, was auch benötigt wird.&lt;br /&gt;
&lt;br /&gt;
Der auf AVR- und PIC-µCs einsetzbare Source zu IRMP entstand im Rahmen des [[Word Clock]] Projektes.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anlass für einen eigenen IRMP-Artikel ist folgender Thread in der Codesammlung: [http://www.mikrocontroller.net/topic/162119 Beitrag: IRMP - Infrared Multi Protocol Decoder]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Protokolle ==&lt;br /&gt;
&lt;br /&gt;
[[Datei:nec-protocol.png|miniatur|NEC-Protokoll, Reichelt RGB-LED-Fernbedienung, T-&amp;gt;A: 9,14ms, A-&amp;gt;B: 4,42ms, B-&amp;gt;C: 660us]]&lt;br /&gt;
&lt;br /&gt;
Einige Hersteller verwenden ihr eigenes Protokoll, dazu gehören u.a. Sony, Samsung und Matsushita. Philips hat RC5 entwickelt und natürlich auch selbst benutzt. RC5 galt damals in Europa als &#039;&#039;das&#039;&#039; Standard-IR-Protokoll, welches von vielen europäischen Herstellern übernommen wurde. Mittlerweile ist RC5 fast gar nicht mehr anzutreffen - man kann es eigentlich als &amp;quot;ausgestorben&amp;quot; abhaken.&lt;br /&gt;
&lt;br /&gt;
Auch die japanischen Hersteller haben versucht, einen eigenen Standard zu etablieren, nämlich das sog. Kaseikyo- (oder auch &amp;quot;Japan-&amp;quot;) Protokoll. Dieses ist mit einer Bitlänge von 48 sehr universell und allgemein verwendbar. Richtig durchgesetzt hat es sich aber bis heute nicht. Ich selbst habe jedenfalls noch keine einzige Fernbedienung gesehen, die das Kaseikyo-Protokoll nutzt.&lt;br /&gt;
&lt;br /&gt;
Heutzutage wird vornehmlich das NEC-Protokoll verwendet - und zwar von den unterschiedlichsten (Marken- und auch Noname-)Herstellern. Ich schätze den &amp;quot;Marktanteil&amp;quot; auf ca. 80% beim NEC-Protokoll. Fast alle Fernbedienungen im alltäglichen Einsatz verwenden bei mir den NEC-IR-Code. Das fängt beim Fernseher an, geht über vom DVD-Player zur Notebook-Fernbedienung und reicht bis zur Noname-MultiMedia-Festplatte - um nur einige Beispiele zu nennen.&lt;br /&gt;
&lt;br /&gt;
Die von IRMP decodierten Protokolle haben etwas gemeinsames: Sie weisen alle ein Start-Bit auf, welches vom Timing her ausgezeichnet, d.h. einmalig ist.&lt;br /&gt;
&lt;br /&gt;
Anhand dieses Start-Bit-Timings werden die verschiedenen Protokolle unterschieden. IRMP misst also das Timing des Start-Bits und stellt dann &amp;quot;on-thy-fly&amp;quot; seine Timingtabellen auf das erkannte Protokoll um, damit die nach dem Start-Bit gesandten Daten in einem Rutsch eingelesen werden können, ohne das komplette Telegramm (Frame) erst speichern zu müssen.&lt;br /&gt;
&lt;br /&gt;
IRMP unterstützt folgende IR-Codings:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Pulse Distance&#039;&#039;&#039;, typ. Beispiel: NEC, Sony&lt;br /&gt;
* &#039;&#039;&#039;Bi-Phase&#039;&#039;&#039; (Manchester), typ. Beispiel: RC5, RC6&lt;br /&gt;
* &#039;&#039;&#039;Serial&#039;&#039;&#039; (ab 1.9.5), typ. Beispiel: Netbox&lt;br /&gt;
&lt;br /&gt;
Ein &#039;&#039;&#039;Puls-Distance-Protokoll&#039;&#039;&#039; erkennt man an folgenden Regeln:&lt;br /&gt;
&lt;br /&gt;
* es gibt nur &#039;&#039;&#039;eine Pulslänge&#039;&#039;&#039; und &#039;&#039;&#039;zwei verschiedene Pausenlängen&#039;&#039;&#039; oder&lt;br /&gt;
  &lt;br /&gt;
* es gibt &#039;&#039;&#039;zwei verschiedene Pulslängen&#039;&#039;&#039; und nur &#039;&#039;&#039;eine Pausenlänge&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ein &#039;&#039;&#039;Bi-Phase-Protokoll&#039;&#039;&#039; erkennt man an:&lt;br /&gt;
&lt;br /&gt;
* es kommen genau &#039;&#039;&#039;eine&#039;&#039;&#039; Pausen- und eine Pulslänge, sowie jeweils die &#039;&#039;&#039;doppelten&#039;&#039;&#039; Puls-/Pausenlängen vor&lt;br /&gt;
&lt;br /&gt;
Typisches Kriterium für ein &#039;&#039;&#039;bitserielles Protokoll&#039;&#039;&#039; ist:&lt;br /&gt;
&lt;br /&gt;
* es kommen &#039;&#039;&#039;Vielfache&#039;&#039;&#039; einer Grund-Puls-/Pausenlänge vor&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Eine tabellarische Aufstellung der verschiedenen IR-Protokolle findet man hier: [http://www.mikrocontroller.net/articles/IRMP#Die_IR-Protokolle_im_Detail Die IR-Protokolle im Detail].&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die angegebenen Timingwerte sind Idealwerte. Bei einigen Fernbedienungen in der Praxis weichen sie um bis zu 40% voneinander ab. Deshalb arbeitet IRMP mit Minimum-/Maximumsgrenzen, um bzgl. des Zeitverhaltens tolerabel zu sein.&lt;br /&gt;
&lt;br /&gt;
== Download ==&lt;br /&gt;
&lt;br /&gt;
Version 2.0.1, Stand vom 20.09.2011&lt;br /&gt;
&lt;br /&gt;
Download Release-Version: [http://www.mikrocontroller.net/wikifiles/7/79/Irmp.zip Irmp.zip] &lt;br /&gt;
&lt;br /&gt;
IRMP &amp;amp; IRSND sind nun auch über SVN abrufbar: [http://www.mikrocontroller.net/svnbrowser/irmp/ IRMP im SVN], Download [http://www.mikrocontroller.net/svnbrowser/irmp/?view=tar Tarball]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die Version im SVN kann eine Zwischen- oder Test-Version sein, die nicht den hier dokumentierten Stand widerspiegelt! Im Zweifel verwendet man besser den obigen Download-Link auf Irmp.zip.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die Software-Änderungen kann man sich hier anschauen: [http://www.mikrocontroller.net/articles/IRMP#Software-Historie_IRMP Software-Historie IRMP]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Source-Code ==&lt;br /&gt;
&lt;br /&gt;
Der Source-Code lässt sich einfach für AVR-µCs übersetzen, indem man die Projekt-Datei irmp.aps in den WinAVR lädt.&lt;br /&gt;
&lt;br /&gt;
Auch auf PIC-Prozessoren ist IRMP lauffähig. Für den PIC-CCS-Compiler sind entsprechende Preprocessor-Konstanten bereits gesetzt, so dass man irmp.c direkt in der CCS-Entwicklungsumgebung verwenden kann. Lediglich eine kleine Interrupt-Routine wie&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void  TIMER2_isr(void) &lt;br /&gt;
{&lt;br /&gt;
 irmp_ISR ();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ist hinzuzufügen, wobei man den Interrupt auf 66µs (also 15kHz) stellt. &lt;br /&gt;
&lt;br /&gt;
Für AVR-Prozessoren ist ein Beispiel für die Anwendung von IRMP in main.c zu finden - im wesentlichen geht es da um die Timer-Initialisierung und den Abruf der empfangenen IR-Telegramme.&lt;br /&gt;
&lt;br /&gt;
Die Konfiguration von IRMP wird über Parameter in irmpconfig.h vorgenommen, nämlich:&lt;br /&gt;
&lt;br /&gt;
* Anzahl Interrupts pro Sekunde&lt;br /&gt;
* Unterstützte IR-Protokolle&lt;br /&gt;
* Hardware-Pin zum IR-Empfänger&lt;br /&gt;
* IR-Logging&lt;br /&gt;
&lt;br /&gt;
=== Einstellungen in irmpconfig.h ===&lt;br /&gt;
&lt;br /&gt;
IRMP decodiert sämtliche oben aufgelisteten Protokolle in einer ISR, siehe irmpconfig.h. Dafür sind einige Angaben nötig. Diese werden in irmpconfig.h eingestellt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;F_INTERRUPTS&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Anzahl der Interrupts pro Sekunde. Der Wert kann zwischen 10000 und 20000 eingestellt werden.&lt;br /&gt;
&lt;br /&gt;
Standardwert:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#define F_INTERRUPTS                            15000      // interrupts per second&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMP_SUPPORT_xxx_PROTOCOL&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Hier lässt sich einstellen, welche Protokolle von IRMP unterstützt werden sollen. Die Standardprotokolle sind bereits aktiv. Möchte man weitere Protokolle einschalten bzw. einige aus Speicherplatzgründen deaktivieren, sind die entsprechenden Werte in irmpconfig.h anzupassen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
// typical protocols, disable here!             Enable  Remarks                 F_INTERRUPTS            Program Space&lt;br /&gt;
#define IRMP_SUPPORT_SIRCS_PROTOCOL             1       // Sony SIRCS           &amp;gt;= 10000                 ~150 bytes&lt;br /&gt;
#define IRMP_SUPPORT_NEC_PROTOCOL               1       // NEC + APPLE          &amp;gt;= 10000                 ~300 bytes&lt;br /&gt;
#define IRMP_SUPPORT_SAMSUNG_PROTOCOL           1       // Samsung + Samsung32  &amp;gt;= 10000                 ~300 bytes&lt;br /&gt;
#define IRMP_SUPPORT_MATSUSHITA_PROTOCOL        1       // Matsushita           &amp;gt;= 10000                  ~50 bytes&lt;br /&gt;
#define IRMP_SUPPORT_KASEIKYO_PROTOCOL          1       // Kaseikyo             &amp;gt;= 10000                 ~250 bytes&lt;br /&gt;
#define IRMP_SUPPORT_DENON_PROTOCOL             1       // DENON, Sharp         &amp;gt;= 10000                 ~250 bytes&lt;br /&gt;
&lt;br /&gt;
// more protocols, enable here!                 Enable  Remarks                 F_INTERRUPTS            Program Space&lt;br /&gt;
#define IRMP_SUPPORT_RC5_PROTOCOL               0       // RC5                  &amp;gt;= 10000                 ~250 bytes&lt;br /&gt;
#define IRMP_SUPPORT_RC6_PROTOCOL               0       // RC6 &amp;amp; RC6A           &amp;gt;= 10000                 ~250 bytes&lt;br /&gt;
#define IRMP_SUPPORT_JVC_PROTOCOL               0       // JVC                  &amp;gt;= 10000                 ~150 bytes&lt;br /&gt;
#define IRMP_SUPPORT_NEC16_PROTOCOL             0       // NEC16                &amp;gt;= 10000                 ~100 bytes&lt;br /&gt;
#define IRMP_SUPPORT_NEC42_PROTOCOL             0       // NEC42                &amp;gt;= 10000                 ~300 bytes&lt;br /&gt;
#define IRMP_SUPPORT_IR60_PROTOCOL              0       // IR60 (SAB2008)       &amp;gt;= 10000                 ~300 bytes&lt;br /&gt;
#define IRMP_SUPPORT_GRUNDIG_PROTOCOL           0       // Grundig              &amp;gt;= 10000                 ~300 bytes&lt;br /&gt;
#define IRMP_SUPPORT_SIEMENS_PROTOCOL           0       // Siemens Gigaset      &amp;gt;= 15000                 ~550 bytes&lt;br /&gt;
#define IRMP_SUPPORT_NOKIA_PROTOCOL             0       // Nokia                &amp;gt;= 10000                 ~300 bytes&lt;br /&gt;
&lt;br /&gt;
// exotic protocols, enable here!               Enable  Remarks                 F_INTERRUPTS            Program Space&lt;br /&gt;
#define IRMP_SUPPORT_KATHREIN_PROTOCOL          0       // Kathrein             &amp;gt;= 10000                 ~200 bytes&lt;br /&gt;
#define IRMP_SUPPORT_NUBERT_PROTOCOL            0       // NUBERT               &amp;gt;= 10000                  ~50 bytes&lt;br /&gt;
#define IRMP_SUPPORT_BANG_OLUFSEN_PROTOCOL      0       // Bang &amp;amp; Olufsen       &amp;gt;= 10000                 ~200 bytes&lt;br /&gt;
#define IRMP_SUPPORT_RECS80_PROTOCOL            0       // RECS80 (SAA3004)     &amp;gt;= 15000                  ~50 bytes&lt;br /&gt;
#define IRMP_SUPPORT_RECS80EXT_PROTOCOL         0       // RECS80EXT (SAA3008)  &amp;gt;= 15000                  ~50 bytes&lt;br /&gt;
#define IRMP_SUPPORT_THOMSON_PROTOCOL           0       // Thomson              &amp;gt;= 10000                 ~250 bytes&lt;br /&gt;
#define IRMP_SUPPORT_NIKON_PROTOCOL             0       // NIKON camera         &amp;gt;= 10000                 ~250 bytes&lt;br /&gt;
#define IRMP_SUPPORT_NETBOX_PROTOCOL            0       // Netbox keyboard      &amp;gt;= 10000                 ~400 bytes (PROTOTYPE!)&lt;br /&gt;
#define IRMP_SUPPORT_FDC_PROTOCOL               0       // FDC3402 keyboard     &amp;gt;= 10000 (better 15000)  ~150 bytes (~400 in combination with RC5)&lt;br /&gt;
#define IRMP_SUPPORT_RCCAR_PROTOCOL             0       // RC Car               &amp;gt;= 10000 (better 15000)  ~150 bytes (~500 in combination with RC5)&lt;br /&gt;
#define IRMP_SUPPORT_RUWIDO_PROTOCOL            0       // RUWIDO, T-Home       &amp;gt;= 15000                 ~550 bytes&lt;br /&gt;
#define IRMP_SUPPORT_LEGO_PROTOCOL              0       // LEGO Power RC        &amp;gt;= 20000                 ~150 bytes&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jedes von IRMP unterstützte IR-Protokoll &amp;quot;verbrät&amp;quot; ungefähr den oben angegebenen Speicher an Code. Hier kann man Optimierungen vornehmen: Zum Beispiel ist die Modulationsfrequenz von 455kHz beim B&amp;amp;O-Protokoll weitab von den Frequenzen, die von den anderen Protokollen verwendet werden. Hier braucht man evtl. andere IR-Empfänger, anderenfalls kann man diese Protokolle einfach deaktiveren. Zum Beispiel kann man mit einem TSOP1738 kein B&amp;amp;O-Protokoll (455kHz) mehr empfangen. &lt;br /&gt;
&lt;br /&gt;
Ausserdem werden die Protokolle SIEMENS/FDC/RCCAR erst ab einer Scan-Frequenz von ca. 15kHz zuverlässig erkannt. Bei RECS80/REC80EXT sind es sogar 20kHz. Wenn man also diese Protokolle nutzen will, muss man F_INTERRUPTS entsprechend anpassen, sonst erscheint beim Übersetzen eine entsprechende Warnung und die entsprechenden Protokolle werden dann automatisch abgeschaltet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMP_PORT&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;IRMP_DDR&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;IRMP_PIN&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;IRMP_BIT&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Über diese Konstanten wird der Pin am µC beschrieben, an welchem der IR-Empfänger angeschlossen ist.&lt;br /&gt;
&lt;br /&gt;
Standardwerte:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#define IRMP_PORT                               PORTB&lt;br /&gt;
#define IRMP_DDR                                DDRB&lt;br /&gt;
#define IRMP_PIN                                PINB&lt;br /&gt;
#define IRMP_BIT                                6       // use PB6 as IR input on AVR&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Anwendung von IRMP ===&lt;br /&gt;
&lt;br /&gt;
Die von IRMP unterstützten Protokolle weisen Bitlängen - teilweise variabel, teilweise fest - von 12 bis 48 Bit auf. Diese werden über Preprocessor-Defines beschrieben.&lt;br /&gt;
&lt;br /&gt;
IRMP trennt diese IR-Telegramme prinzipiell in 3 Bereiche:&lt;br /&gt;
&lt;br /&gt;
 1. ID für verwendetes Protokoll&lt;br /&gt;
 2. Adresse bzw. Herstellercode&lt;br /&gt;
 3. Kommando&lt;br /&gt;
&lt;br /&gt;
Mittels der Funktion&lt;br /&gt;
&lt;br /&gt;
   irmp_get_data (IRMP_DATA * irmp_data_p)&lt;br /&gt;
&lt;br /&gt;
kann man ein decodiertes Telegramm abrufen. Der Return-Wert ist 1, wenn ein Telegramm eingelesen wurde, sonst 0. Im ersten Fall werden die Struct-Members&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
    irmp_data_p-&amp;gt;protocol&lt;br /&gt;
    irmp_data_p-&amp;gt;address&lt;br /&gt;
    irmp_data_p-&amp;gt;command&lt;br /&gt;
    irmp_data_p-&amp;gt;flags&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gefüllt.&lt;br /&gt;
&lt;br /&gt;
Das heisst: am Ende bekommt man dann über irmp_get_data() einfach drei&lt;br /&gt;
Werte (Protokoll, Adresse und Kommando-Code), die man über ein if oder switch checken kann, z.&amp;amp;nbsp;B. hier eine Routine, welche die Tasten 1-9 auf einer Fernbedienung auswertet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
   IRMP_DATA irmp_data;&lt;br /&gt;
&lt;br /&gt;
   if (irmp_get_data (&amp;amp;irmp_data))&lt;br /&gt;
   {&lt;br /&gt;
      if (irmp_data.protocol == IRMP_NEC_PROTOCOL &amp;amp;&amp;amp;     // NEC-Protokoll&lt;br /&gt;
          irmp_data.address == 0x1234)                   // Adresse 0x1234&lt;br /&gt;
      {&lt;br /&gt;
         switch (irmp_data.command)&lt;br /&gt;
         {&lt;br /&gt;
            case 0x0001: key1_pressed(); break;          // Taste 1&lt;br /&gt;
            case 0x0002: key2_pressed(); break;          // Taste 2&lt;br /&gt;
            ...&lt;br /&gt;
            case 0x0009: key9_pressed(); break;          // Taste 9&lt;br /&gt;
         }&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier die möglichen Werte für irmp_data.protocol, siehe auch irmp.h:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#define IRMP_SIRCS_PROTOCOL                      1              // Sony&lt;br /&gt;
#define IRMP_NEC_PROTOCOL                        2              // NEC, Pioneer, JVC, Toshiba, NoName etc.&lt;br /&gt;
#define IRMP_SAMSUNG_PROTOCOL                    3              // Samsung&lt;br /&gt;
#define IRMP_MATSUSHITA_PROTOCOL                 4              // Matsushita&lt;br /&gt;
#define IRMP_KASEIKYO_PROTOCOL                   5              // Kaseikyo (Panasonic etc)&lt;br /&gt;
#define IRMP_RECS80_PROTOCOL                     6              // Philips, Thomson, Nordmende, Telefunken, Saba&lt;br /&gt;
#define IRMP_RC5_PROTOCOL                        7              // Philips etc&lt;br /&gt;
#define IRMP_DENON_PROTOCOL                      8              // Denon, Sharp&lt;br /&gt;
#define IRMP_RC6_PROTOCOL                        9              // Philips etc&lt;br /&gt;
#define IRMP_SAMSUNG32_PROTOCOL                 10              // Samsung32: no sync pulse at bit 16, length 32 instead of 37&lt;br /&gt;
#define IRMP_APPLE_PROTOCOL                     11              // Apple, very similar to NEC&lt;br /&gt;
#define IRMP_RECS80EXT_PROTOCOL                 12              // Philips, Technisat, Thomson, Nordmende, Telefunken, Saba&lt;br /&gt;
#define IRMP_NUBERT_PROTOCOL                    13              // Nubert&lt;br /&gt;
#define IRMP_BANG_OLUFSEN_PROTOCOL              14              // Bang &amp;amp; Olufsen&lt;br /&gt;
#define IRMP_GRUNDIG_PROTOCOL                   15              // Grundig&lt;br /&gt;
#define IRMP_NOKIA_PROTOCOL                     16              // Nokia&lt;br /&gt;
#define IRMP_SIEMENS_PROTOCOL                   17              // Siemens, e.g. Gigaset&lt;br /&gt;
#define IRMP_FDC_PROTOCOL                       18              // FDC keyboard&lt;br /&gt;
#define IRMP_RCCAR_PROTOCOL                     19              // RC Car&lt;br /&gt;
#define IRMP_JVC_PROTOCOL                       20              // JVC (NEC with 16 bits)&lt;br /&gt;
#define IRMP_RC6A_PROTOCOL                      21              // RC6A, e.g. Kathrein, XBOX&lt;br /&gt;
#define IRMP_NIKON_PROTOCOL                     22              // Nikon&lt;br /&gt;
#define IRMP_RUWIDO_PROTOCOL                    23              // Ruwido, e.g. T-Home Mediareceiver&lt;br /&gt;
#define IRMP_IR60_PROTOCOL                      24              // IR60 (SAB2008)&lt;br /&gt;
#define IRMP_KATHREIN_PROTOCOL                  25              // Kathrein&lt;br /&gt;
#define IRMP_NETBOX_PROTOCOL                    26              // Netbox keyboard (bitserial)&lt;br /&gt;
#define IRMP_NEC16_PROTOCOL                     27              // NEC with 16 bits (incl. sync)&lt;br /&gt;
#define IRMP_NEC42_PROTOCOL                     28              // NEC with 42 bits&lt;br /&gt;
#define IRMP_LEGO_PROTOCOL                      29              // LEGO Power Functions RC&lt;br /&gt;
#define IRMP_THOMSON_PROTOCOL                   30              // Thomson&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Werte für die Adresse und das Kommando muss man natürlich einmal für eine unbekannte Fernbedienung auslesen und dann über ein UART oder LC-Display ausgeben, um sie dann im Programm hart zu kodieren. Oder man hat eine kleine Anlernroutine, wo man einmal die gewünschten Tasten drücken muss, um sie anschließend im EEPROM abzuspeichern. Ein Beispiel dazu findet man im Artikel [http://www.mikrocontroller.net/articles/DIY_Lernfähige_Fernbedienung_mit_IRMP Lernfähige IR-Fernbedienung mit IRMP].&lt;br /&gt;
&lt;br /&gt;
Eine weitere Beispiel-Main-Funktion ist im Zip-File enthalten, da sieht man dann auch die Initialisierung des Timers.&lt;br /&gt;
&lt;br /&gt;
=== &amp;quot;Entprellen&amp;quot; von Tasten ===&lt;br /&gt;
&lt;br /&gt;
Um zu unterscheiden, ob eine Taste lange gedrückt wurde oder lediglich einzeln, dient das Bit IRMP_FLAG_REPETITION. Dieses wird im Struct-Member &#039;&#039;&#039;flags&#039;&#039;&#039; gesetzt, wenn eine Taste auf der Fernbedienung längere Zeit gedrückt wurde und dadurch immer wieder dasselbe Kommando innerhalb kurzer Zeitabstände ausgesandt wird.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
    if (irmp_data.flags &amp;amp; IRMP_FLAG_REPETITION)&lt;br /&gt;
    {&lt;br /&gt;
      // Benutzer hält die Taste länger runter&lt;br /&gt;
      // entweder:&lt;br /&gt;
      //   ich ignoriere die (Wiederholungs-)Taste&lt;br /&gt;
      // oder:&lt;br /&gt;
      //   ich benutze diese Info, um einen Repeat-Effekt zu nutzen&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
      // Es handelt sich um eine neue Taste&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies kann zum Beispiel dafür genutzt werden, um die Tasten 0-9 zu &amp;quot;entprellen&amp;quot;, indem man Kommandos mit gesetztem Bit IRMP_FLAG_REPETITION ignoriert. Bei dem Drücken auf die Tasten VOLUME+ oder VOLUME- kann die wiederholte Auswertung ein und desselben Kommandos aber durchaus gewünscht sein - zum Beispiel, um LEDs zu faden.&lt;br /&gt;
&lt;br /&gt;
Wenn man nur Einzeltasten auswerten will, kann man obigen IF-Block reduzieren auf:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
    if (! (irmp_data.flags &amp;amp; IRMP_FLAG_REPETITION))&lt;br /&gt;
    {&lt;br /&gt;
      // Es handelt sich um eine neue Taste&lt;br /&gt;
      // ACTION!&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Arbeitsweise ==&lt;br /&gt;
&lt;br /&gt;
Das &amp;quot;Working Horse&amp;quot; von IRMP ist die Interrupt Service Routine irmp_ISR() welche 15.000 mal pro Sekunde aufgerufen werden sollte. Weicht dieser Wert ab, muss die Preprocessor-Konstante F_INTERRUPTS in irmpconfig.h angepasst werden. Der Wert kann zwischen 10kHz und 20kHz eingestellt werden.&lt;br /&gt;
&lt;br /&gt;
irmp_ISR detektiert zunächst die Länge und die Form des/der Startbits und ermittelt daraus das verwendete Protokoll. Sobald das Protokoll erkannt wurde, werden die weiter einzulesenden Bits parametrisiert, um dann möglichst effektiv in den weiteren Aufrufen das komplette IR-Telegramm einzulesen.&lt;br /&gt;
&lt;br /&gt;
Um direkt Kritikern den Wind aus den Segeln zu nehmen:&lt;br /&gt;
&lt;br /&gt;
Ich weiss, die ISR ist ziemlich groß. Aber da sie sich wie eine State Machine verhält, ist der tatsächlich ausgeführte Code pro Durchlauf relativ gering. Solange es &amp;quot;dunkel&amp;quot; ist (und das ist es ja die meiste Zeit ;-)) ist die aufgewendete Zeit sogar verschwindend gering. Im WordClock-Projekt werden mit ein- und demselben Timer 8 ISRs aufgerufen, davon ist die irmp_ISR() nur eine unter vielen. Bei mindestens 8 MHz CPU-Takt traten bisher keine Timing-Probleme auf. Daher sehe ich bei der Länge von irmp_ISR überhaupt kein Problem.&lt;br /&gt;
&lt;br /&gt;
Ein Quarz ist nicht unbedingt notwendig, es funktioniert auch mit dem internen Oszillator des AVRs, wenn man die Prescaler-Fuse entsprechend gesetzt hat, dass die CPU auch mit 8MHz rennt ... Die Fuse-Werte für einen ATMEGA88 findet man in main.c.&lt;br /&gt;
&lt;br /&gt;
== Scannen von unbekannten Protokollen ==&lt;br /&gt;
&lt;br /&gt;
Stellt man in irmpconfig.h in der Zeile&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
    #define IRMP_LOGGING    0   // 1: log IR signal (scan), 0: do not (default)&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
den Wert für IRMP_LOGGING auf 1, wird in IRMP eine Protokollierung eingeschaltet: Es werden dann die Hell- und Dunkelphase auf dem UART des Microntrollers mit 9600Bd ausgegeben: 1=Dunkel, 0=Hell. Eventuell müssen dann die Konstanten in den Funktionen uart_init() und uart_putc() angepasst werden; das kommt auf den verwendeten AVR-µC an.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hinweis: Die IRMP-Logging-Funktion (insb. die Ausgabe über UART) ist nicht für PIC-Prozessoren angepasst. Wer immer dies tun möchte, kann sich gerne bei mir (Benutzer [http://www.mikrocontroller.net/user/show/ukw ukw]) per PN melden.&lt;br /&gt;
&lt;br /&gt;
Nimmt man diese Protokoll-Scans mit einem Terminal-Emulationsprogramm auf und speichert sie dann als normale Datei ab, kann man diese Scan-Dateien zur Analyse verwenden, um damit IRMP an das unbekannte Protokoll anzupassen - siehe nächstes Kapitel.&lt;br /&gt;
&lt;br /&gt;
Wer eine Fernbedienung hat, die nicht von IRMP unterstützt wird, kann mir  ([http://www.mikrocontroller.net/user/show/ukw ukw]) gern die Scan-Dateien zuschicken. Ich schaue dann, ob das Protokoll in das IRMP-Konzept passt und passe gegebenenfalls den Source an.&lt;br /&gt;
&lt;br /&gt;
== IRMP unter Linux und Windows ==&lt;br /&gt;
&lt;br /&gt;
irmp.c lässt sich auch unter Linux direkt kompilieren, um damit Infrarot-Scans, welche in Dateien gespeichert sind, direkt zu testen. Im Unterordner IR-Data finden sich solche Dateien, die man dem IRMP direkt zum &amp;quot;Fraß&amp;quot; vorwerfen kann. &lt;br /&gt;
&lt;br /&gt;
Das Übersetzen von IRMP geht folgendermaßen:&lt;br /&gt;
&lt;br /&gt;
    make -f makefile.lnx&lt;br /&gt;
&lt;br /&gt;
Dabei werden 3 IRMP-Versionen erzeugt:&lt;br /&gt;
&lt;br /&gt;
* irmp: Version für 10kHz Scans&lt;br /&gt;
* irmp-15kHz: Version für 15kHz Scans&lt;br /&gt;
* irmp-20kHz: Version für 20kHz Scans&lt;br /&gt;
&lt;br /&gt;
Der Aufruf geschieht dann über:&lt;br /&gt;
&lt;br /&gt;
  ./irmp [-l|-p|-a|-v] &amp;lt; scan-file&lt;br /&gt;
&lt;br /&gt;
Die angegebenen Optionen schließen sich aus, das heisst, es kann jeweils nur eine Option zu einer Zeit angegeben werden:&lt;br /&gt;
&lt;br /&gt;
Option:&lt;br /&gt;
&lt;br /&gt;
   -l  List             gibt eine Liste der Pulse und Pausen aus&lt;br /&gt;
   -a analyze           analysiert die Puls-/Pausen und schreibt ein &amp;quot;Spektrum&amp;quot; in ASCII-Form&lt;br /&gt;
   -v verbose           ausführliche Ausgabe&lt;br /&gt;
   -p  Print Timings    gibt für alle Protokolle eine Timing-Tabelle aus&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Normale Ausgabe:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
   ./irmp &amp;lt; IR-Data/orion_vcr_07660BM070.txt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 -------------------------------------------------------------------------&lt;br /&gt;
 # Taste 1&lt;br /&gt;
 00000001110111101000000001111111 p =  2, a = 0x7b80, c = 0x0001, f = 0x00&lt;br /&gt;
 -------------------------------------------------------------------------&lt;br /&gt;
 # Taste 2&lt;br /&gt;
 00000001110111100100000010111111 p =  2, a = 0x7b80, c = 0x0002, f = 0x00&lt;br /&gt;
 -------------------------------------------------------------------------&lt;br /&gt;
 # Taste 3&lt;br /&gt;
 00000001110111101100000000111111 p =  2, a = 0x7b80, c = 0x0003, f = 0x00&lt;br /&gt;
 -------------------------------------------------------------------------&lt;br /&gt;
 # Taste 4&lt;br /&gt;
 00000001110111100010000011011111 p =  2, a = 0x7b80, c = 0x0004, f = 0x00&lt;br /&gt;
 -------------------------------------------------------------------------&lt;br /&gt;
 ...&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Listen-Ausgabe:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
   ./irmp -l &amp;lt; IR-Data/orion_vcr_07660BM070.txt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
# Taste 1&lt;br /&gt;
pulse: 91 pause: 44&lt;br /&gt;
pulse: 6 pause: 5&lt;br /&gt;
pulse: 6 pause: 6&lt;br /&gt;
pulse: 6 pause: 5&lt;br /&gt;
pulse: 6 pause: 5&lt;br /&gt;
pulse: 6 pause: 5&lt;br /&gt;
pulse: 6 pause: 6&lt;br /&gt;
pulse: 6 pause: 5&lt;br /&gt;
pulse: 6 pause: 16&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Analyse:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
   ./irmp -a &amp;lt; IR-Data/orion_vcr_07660BM070.txt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
START PULSES:&lt;br /&gt;
 90 o 1&lt;br /&gt;
 91 oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo 33&lt;br /&gt;
 92 ooo 2&lt;br /&gt;
pulse avg: 91.0=9102.8 us, min: 90=9000.0 us, max: 92=9200.0 us, tol:  1.1%&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
START PAUSES:&lt;br /&gt;
 43 oo 1&lt;br /&gt;
 44 oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo 25&lt;br /&gt;
 45 oooooooooooooooooooooooo 10&lt;br /&gt;
pause avg: 44.2=4425.0 us, min: 43=4300.0 us, max: 45=4500.0 us, tol:  2.8%&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
PULSES:&lt;br /&gt;
  5 o 17&lt;br /&gt;
  6 ooooooooooooooooooooooooooooooooooooooooooooooooooooooo 562&lt;br /&gt;
  7 oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo 609&lt;br /&gt;
pulse avg:  6.5= 649.8 us, min:  5= 500.0 us, max:  7= 700.0 us, tol: 23.1%&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
PAUSES:&lt;br /&gt;
  4 ooooooooooooooooooooooo 169&lt;br /&gt;
  5 oooooooooooooooooooooooooooooooooooooooooooooooooooooooooo 412&lt;br /&gt;
  6 oooo 31&lt;br /&gt;
pause avg:  4.8= 477.5 us, min:  4= 400.0 us, max:  6= 600.0 us, tol: 25.7%&lt;br /&gt;
 15 oooooo 43&lt;br /&gt;
 16 oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo 425&lt;br /&gt;
 17 oooooooooo 72&lt;br /&gt;
pause avg: 16.1=1605.4 us, min: 15=1500.0 us, max: 17=1700.0 us, tol:  6.6%&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier sieht man die gemessenen Zeiten aller Pulse und Pausen als (liegende) Glockenkurven, welche natürlich wegen der ASCII-Darstellung nicht gerade einer Idealkurve entsprechen. Je schmaler die gemessenen Kanäle, desto besser ist das Timing der Fernbedienung.&lt;br /&gt;
&lt;br /&gt;
Aus obigem Output kann man herauslesen:&lt;br /&gt;
&lt;br /&gt;
* Das Start-Bit hat eine Pulslänge zwischen 9000 und 9200 usec, im Mittel sind es 9102 usec. Die Abweichung von diesem Mittelwert liegt bei 1,1 Prozent.&lt;br /&gt;
&lt;br /&gt;
* Das Start-Bit hat eine Pausenlänge zwischen 4300 usec und 4500 usec, der Mittelwert beträgt 4424 usec. Der Fehler liegt bei 2,8 Prozent.&lt;br /&gt;
&lt;br /&gt;
* Die Pulslänge eines Datenbits liegt zwischen 500 usec und 700 usec, im Mittel sind es 650 usec, der Fehler liegt bei (stolzen) 23,1 Prozent!&lt;br /&gt;
&lt;br /&gt;
Desweiteren gibt es noch 2 verschieden lange Pausen (für die Bits 0 und 1), das Ablesen der Werte überlasse ich dem geneigten Leser ;-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ausführliche Ausgabe:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
    ./irmp -v &amp;lt; IR-Data/orion_vcr_07660BM070.txt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
# Taste 1&lt;br /&gt;
   26084 [starting pulse]&lt;br /&gt;
start-bit: pulse = 91, pause = 44&lt;br /&gt;
protocol = NEC, start bit timings: pulse:  53 - 127, pause:  26 -  64&lt;br /&gt;
pulse_1:   2 -   9&lt;br /&gt;
pause_1:   9 -  25&lt;br /&gt;
pulse_0:   2 -   9&lt;br /&gt;
pause_0:   2 -   9&lt;br /&gt;
command_offset: 16&lt;br /&gt;
command_len:     16&lt;br /&gt;
complete_len:    32&lt;br /&gt;
stop_bit:         1&lt;br /&gt;
   26230 [bit  0: pulse =   6, pause =   5] 0&lt;br /&gt;
   26242 [bit  1: pulse =   6, pause =   6] 0&lt;br /&gt;
   26253 [bit  2: pulse =   6, pause =   5] 0&lt;br /&gt;
   26264 [bit  3: pulse =   6, pause =   5] 0&lt;br /&gt;
   ...&lt;br /&gt;
   26749 [bit 31: pulse =   6, pause =  17] 1&lt;br /&gt;
stop bit detected&lt;br /&gt;
code detected, length = 32&lt;br /&gt;
p =  2, a = 0x7b80, c = 0x0001, f = 0x00&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Timing-Tabelle:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
     ./irmp -p&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
IRMP_TIMEOUT_LEN:        165&lt;br /&gt;
IRMP_KEY_REPETITION_LEN  1500&lt;br /&gt;
&lt;br /&gt;
PROTOCOL       S  S-PULSE    S-PAUSE    PULSE-0    PAUSE-0    PULSE-1    PAUSE-1&lt;br /&gt;
====================================================================================&lt;br /&gt;
SIRCS          1   21 -  27    4 -   7    4 -   8    4 -   8   10 -  14    4 -   8&lt;br /&gt;
NEC            1   53 - 127   26 -  64    2 -   9    2 -   9    2 -   9    9 -  25&lt;br /&gt;
NEC (rep)      1   53 - 127   13 -  32    2 -   9    2 -   9    2 -   9    9 -  25&lt;br /&gt;
SAMSUNG        1   40 -  51   40 -  51    3 -   8    2 -   7    3 -   8    9 -  20&lt;br /&gt;
MATSUSHITA     1   27 -  43   27 -  43    4 -  13    4 -  13    4 -  13   15 -  38&lt;br /&gt;
KASEIKYO       1   29 -  38   14 -  20    1 -   8    1 -   7    1 -   8    5 -  20&lt;br /&gt;
RECS80         1    1 -   3   66 -  83    0 -   3   43 -  55    0 -   3   66 -  83&lt;br /&gt;
RC5            1    7 -  11    7 -  11    7 -  11&lt;br /&gt;
DENON          1    1 -   4               1 -   4    6 -  10    1 -   4   16 -  22&lt;br /&gt;
RC6            1   23 -  30    7 -  11    3 -   6&lt;br /&gt;
RECS80EXT      1    1 -   3   34 -  39    0 -   3   43 -  55    0 -   3   66 -  83&lt;br /&gt;
NUBERT         1   10 -  17    2 -   5    3 -   7    9 -  17   10 -  17    2 -   5&lt;br /&gt;
BANG_OLUFSEN   1    1 -   3   27 -  35&lt;br /&gt;
BANG_OLUFSEN   2    1 -   3   27 -  35&lt;br /&gt;
BANG_OLUFSEN   3    1 -   3  140 - 165&lt;br /&gt;
BANG_OLUFSEN   4    1 -   3   27 -  35&lt;br /&gt;
BANG_OLUFSEN   -                          1 -   3   27 -  35    1 -   3   83 - 104&lt;br /&gt;
GRUNDIG/NOKIA  1    3 -   7   22 -  33    3 -   7&lt;br /&gt;
SIEMENS        1    2 -   4    2 -   4    2 -   4&lt;br /&gt;
FDC            1   18 -  24    8 -  12    1 -   5    1 -   3    1 -   5    5 -  10&lt;br /&gt;
RCCAR          1   17 -  23   17 -  23    4 -   8    5 -  13    4 -   8    2 -   7&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei längeren Ausgaben sollte man das Programm &amp;quot;less&amp;quot; verwenden, um seitenweise zu blättern, z.B.:&lt;br /&gt;
&lt;br /&gt;
    ./irmp -v &amp;lt; IR-Data/Samsung_DVD_Rec_00062C.txt | less&lt;br /&gt;
&lt;br /&gt;
Diese Scan-Dateien halfen mir nicht nur bei der Entwicklung des IRMP, sondern können auch bei der Anpassung des Sources an neue IR-Protokolle sehr hilfreich sein.&lt;br /&gt;
&lt;br /&gt;
Mittlerweile kann man IRMP auch unter Windows nutzen, nämlich folgendermaßen:&lt;br /&gt;
&lt;br /&gt;
* Eingabeaufforderung starten&lt;br /&gt;
* In das Verzeichnis irmp wechseln&lt;br /&gt;
* Aufruf von:&lt;br /&gt;
            irmp.exe &amp;lt; IR-Data\rc5x.txt&lt;br /&gt;
&lt;br /&gt;
Da manche Ausgaben sehr lang werden, empfiehlt es sich auch hier, die Ausgabe in eine Datei zu lenken oder in den more weiterzuleiten, damit man seitenweise blättern kann:&lt;br /&gt;
&lt;br /&gt;
            irmp.exe &amp;lt; IR-Data\rc5x.txt | more&lt;br /&gt;
&lt;br /&gt;
Auch hier gelten dieselben Optionen wie für die Linux-Version.&lt;br /&gt;
&lt;br /&gt;
Zusatz:&lt;br /&gt;
&lt;br /&gt;
Der Decoder für das RECS80- und RECS80-Extended-Protokoll ist ungetestet, wurde anhand von Dokumentationen im Internet erstellt und lediglich mittels&lt;br /&gt;
künstlich erzeugten Scan-Dateien getestet... daher: keine Gewähr!&lt;br /&gt;
&lt;br /&gt;
== Fernbedienungen ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Protokoll || Bezeichnung || Gerät || Device Address&lt;br /&gt;
|-&lt;br /&gt;
| NEC || Toshiba CT-9859 || Fernseher || 24384&lt;br /&gt;
|-&lt;br /&gt;
| || Toshiba VT-728G || V-728G Videorekorder || 23364&lt;br /&gt;
|-&lt;br /&gt;
| || Elta 8848 MP 4 || DVD-Player || 32512&lt;br /&gt;
|-&lt;br /&gt;
| || AS-218 || Askey TV-View CHP03X (TV-Karte) || 15238&lt;br /&gt;
|-&lt;br /&gt;
| || Cyberhome ??? || Cyberhome DVD Player || 28018&lt;br /&gt;
|-&lt;br /&gt;
| || WD TV Life || Western Digital Multimediaplayer || 7984&lt;br /&gt;
|-&lt;br /&gt;
| NEC16 || Daewoo || Videorekorder || 21&lt;br /&gt;
|-&lt;br /&gt;
| KASEIKYO || Technics EUR646497 || AV Receiver SA-AX 730 || 8194&lt;br /&gt;
|-&lt;br /&gt;
| RC5 || Loewe Assist/RC3/RC4 || Fernseher (FB auf TV-Mode) || 0&lt;br /&gt;
|-&lt;br /&gt;
| RC6 || Philips Television || Fernseher (FB auf TV-Mode) || 0&lt;br /&gt;
|-&lt;br /&gt;
| SIRCS || Sony RM-816 || Fernseher (FB auf TV-Mode) || 0 (siehe Beschreibung)&lt;br /&gt;
|-&lt;br /&gt;
| DENON || DENON RC970 || AVR3805 (Verstärker) || 8&lt;br /&gt;
|-&lt;br /&gt;
| || DENON RC970 || DVD/CD-Player || 2&lt;br /&gt;
|-&lt;br /&gt;
| || DENON RC970 || Tuner || 6&lt;br /&gt;
|-&lt;br /&gt;
| SAMSUNG32 || Samsung AA59-00484A || LE40D550 Fernseher || 1799&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== IR-Tastaturen ==&lt;br /&gt;
&lt;br /&gt;
[[Datei:irmp-fdc3402.jpg|miniatur|FDC-3402-Tastatur]]&lt;br /&gt;
&lt;br /&gt;
IRMP unterstützt ab Version 1.7.0 auch IR-Tastaturen, nämlich die Infrarot-Tastatur FDC-3402 - erhältlich bei Pollin (Art. 711 056) für weniger als 2 EUR.&lt;br /&gt;
&lt;br /&gt;
Beim Erkennen einer Taste gibt IRMP folgende Daten zurück:&lt;br /&gt;
&lt;br /&gt;
 Protokoll-Nummer (irmp_data.protocol): 18&lt;br /&gt;
 Addresse         (irmp_data.address):  0x003F&lt;br /&gt;
&lt;br /&gt;
Als Kommando (irmp_data.command) werden folgende Werte zurückgeliefert:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code || Taste || Code || Taste || Code || Taste || Code || Taste || Code || Taste || Code || Taste || Code || Taste || Code || Taste&lt;br /&gt;
|-&lt;br /&gt;
| 0x0000 ||      || 0x0010 || TAB || 0x0020 || &#039;s&#039; || 0x0030 || &#039;c&#039; || 0x0040 ||      || 0x0050 || HOME || 0x0060 ||      || 0x0070 || MENUE&lt;br /&gt;
|-&lt;br /&gt;
| 0x0001 || &#039;^&#039; || 0x0011 || &#039;q&#039; || 0x0021 || &#039;d&#039; || 0x0031 || &#039;v&#039; || 0x0041 ||      || 0x0051 || END || 0x0061 ||      || 0x0071 || BACK&lt;br /&gt;
|-&lt;br /&gt;
| 0x0002 || &#039;1&#039; || 0x0012 || &#039;w&#039; || 0x0022 || &#039;f&#039; || 0x0032 || &#039;b&#039; || 0x0042 ||      || 0x0052 ||      || 0x0062 ||      || 0x0072 || FORWARD&lt;br /&gt;
|-&lt;br /&gt;
| 0x0003 || &#039;2&#039; || 0x0013 || &#039;e&#039; || 0x0023 || &#039;g&#039; || 0x0033 || &#039;n&#039; || 0x0043 ||      || 0x0053 || UP || 0x0063 ||      || 0x0073 || ADDRESS&lt;br /&gt;
|-&lt;br /&gt;
| 0x0004 || &#039;3&#039; || 0x0014 || &#039;r&#039; || 0x0024 || &#039;h&#039; || 0x0034 || &#039;m&#039; || 0x0044 ||      || 0x0054 || DOWN || 0x0064 ||      || 0x0074 || WINDOW&lt;br /&gt;
|-&lt;br /&gt;
| 0x0005 || &#039;4&#039; || 0x0015 || &#039;t&#039; || 0x0025 || &#039;j&#039; || 0x0035 || &#039;,&#039; || 0x0045 ||      || 0x0055 || PAGE_UP || 0x0065 ||      || 0x0075 || 1ST_PAGE&lt;br /&gt;
|-&lt;br /&gt;
| 0x0006 || &#039;5&#039; || 0x0016 || &#039;z&#039; || 0x0026 || &#039;k&#039; || 0x0036 || &#039;.&#039; || 0x0046 ||      || 0x0056 || PAGE_DOWN || 0x0066 ||      || 0x0076 || STOP&lt;br /&gt;
|-&lt;br /&gt;
| 0x0007 || &#039;6&#039; || 0x0017 || &#039;u&#039; || 0x0027 || &#039;l&#039; || 0x0037 || &#039;-&#039; || 0x0047 ||      || 0x0057 ||      || 0x0067 ||      || 0x0077 || MAIL&lt;br /&gt;
|-&lt;br /&gt;
| 0x0008 || &#039;7&#039; || 0x0018 || &#039;i&#039; || 0x0028 || &#039;ö&#039; || 0x0038 ||      || 0x0048 ||      || 0x0058 ||      || 0x0068 ||      || 0x0078 || FAVORITES&lt;br /&gt;
|-&lt;br /&gt;
| 0x0009 || &#039;8&#039; || 0x0019 || &#039;o&#039; || 0x0029 || &#039;ä&#039; || 0x0039 || SHIFT_RIGHT || 0x0049 ||      || 0x0059 || RIGHT || 0x0069 ||      || 0x0079 || NEW_PAGE&lt;br /&gt;
|-&lt;br /&gt;
| 0x000A || &#039;9&#039; || 0x001A || &#039;p&#039; || 0x002A || &#039;#&#039; || 0x003A || CTRL || 0x004A ||      || 0x005A ||      || 0x006A ||      || 0x007A || SETUP&lt;br /&gt;
|-&lt;br /&gt;
| 0x000B || &#039;0&#039; || 0x001B || &#039;ü&#039; || 0x002B || CR || 0x003B ||      || 0x004B || INSERT || 0x005B ||      || 0x006B ||      || 0x007B || FONT&lt;br /&gt;
|-&lt;br /&gt;
| 0x000C || &#039;ß&#039; || 0x001C || &#039;+&#039; || 0x002C || SHIFT_LEFT || 0x003C || ALT_LEFT || 0x004C || DELETE || 0x005C ||      || 0x006C ||      || 0x007C || PRINT&lt;br /&gt;
|-&lt;br /&gt;
| 0x000D || &#039;´&#039; || 0x001D ||      || 0x002D || &#039;&amp;lt;&#039; || 0x003D || SPACE || 0x004D ||      || 0x005D ||      || 0x006D ||      || 0x007D ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x000E ||      || 0x001E || CAPSLOCK || 0x002E || &#039;y&#039; || 0x003E || ALT_RIGHT || 0x004E ||      || 0x005E ||      || 0x006E || ESCAPE || 0x007E || ON_OFF&lt;br /&gt;
|-&lt;br /&gt;
| 0x000F || BACKSPACE || 0x001F || &#039;a&#039; || 0x002F || &#039;x&#039; || 0x003F ||      || 0x004F || LEFT || 0x005F ||      || 0x006F ||      || 0x007F ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Zusatztasten links:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code || Taste&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| 0x0400 || KEY_MOUSE_1&lt;br /&gt;
|-&lt;br /&gt;
| 0x0800 || KEY_MOUSE_2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Dabei gelten die obigen Werte für das Drücken einer Taste. Wird die Taste wieder losgelassen, setzt IRMP zusätzlich das 8. Bit im Kommando.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
      Taste &#039;a&#039; drücken:   0x001F&lt;br /&gt;
      Taste &#039;a&#039; loslassen: 0x009F&lt;br /&gt;
&lt;br /&gt;
Ausnahme ist die EIN/AUS-Taste: Diese sendet nur beim Drücken einen Code, nicht beim Loslassen.&lt;br /&gt;
&lt;br /&gt;
Wird eine Taste länger gedrückt, wird das in irmp_data.flag angezeigt.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
                           command   flag&lt;br /&gt;
      Taste &#039;a&#039; drücken:   0x001F    0x00&lt;br /&gt;
      Taste &#039;a&#039; drücken:   0x001F    0x01&lt;br /&gt;
      Taste &#039;a&#039; drücken:   0x001F    0x01&lt;br /&gt;
      Taste &#039;a&#039; drücken:   0x001F    0x01&lt;br /&gt;
      ....&lt;br /&gt;
      Taste &#039;a&#039; loslassen: 0x009F    0x00&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Werden Tastenkombinationen (zum Beispiel für ein großes &#039;A&#039;) gedrückt, dann sind die Rückgabewerte von IRMP in folgendem Ablauf zu sehen:&lt;br /&gt;
&lt;br /&gt;
      Linke SHIFT-Taste drücken:   0x0002&lt;br /&gt;
      Taste &#039;a&#039; drücken:           0x001F&lt;br /&gt;
      Taste &#039;a&#039; loslassen:         0x009F&lt;br /&gt;
      Linke SHIFT-Taste loslassen: 0x0082&lt;br /&gt;
&lt;br /&gt;
In irmp.c findet man für die LINUX-Version eine Funktion get_fdc_key(), welche als Vorlage dienen mag, die Keycodes einer FDC-Tastatur in die entsprechenden ASCII-Codes umzuwandeln. Diese Funktion kann man entweder lokal auf dem µC nutzen, um die Keycodes zu decodieren, oder auf einem Hostsystem (z.B. PC), an welches die IRMP-Data-Struktur gesandt wird. Dafür sollte man die Funktion incl. der dazugehörenden Preprozessor-Konstanten in seinen Applikations-Quelltext kopieren.&lt;br /&gt;
&lt;br /&gt;
Hier der entsprechende Auszug:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#define STATE_LEFT_SHIFT    0x01&lt;br /&gt;
#define STATE_RIGHT_SHIFT   0x02&lt;br /&gt;
#define STATE_LEFT_CTRL     0x04&lt;br /&gt;
#define STATE_LEFT_ALT      0x08&lt;br /&gt;
#define STATE_RIGHT_ALT     0x10&lt;br /&gt;
&lt;br /&gt;
#define KEY_ESCAPE          0x1B            // keycode = 0x006e&lt;br /&gt;
#define KEY_MENUE           0x80            // keycode = 0x0070&lt;br /&gt;
#define KEY_BACK            0x81            // keycode = 0x0071&lt;br /&gt;
#define KEY_FORWARD         0x82            // keycode = 0x0072&lt;br /&gt;
#define KEY_ADDRESS         0x83            // keycode = 0x0073&lt;br /&gt;
#define KEY_WINDOW          0x84            // keycode = 0x0074&lt;br /&gt;
#define KEY_1ST_PAGE        0x85            // keycode = 0x0075&lt;br /&gt;
#define KEY_STOP            0x86            // keycode = 0x0076&lt;br /&gt;
#define KEY_MAIL            0x87            // keycode = 0x0077&lt;br /&gt;
#define KEY_FAVORITES       0x88            // keycode = 0x0078&lt;br /&gt;
#define KEY_NEW_PAGE        0x89            // keycode = 0x0079&lt;br /&gt;
#define KEY_SETUP           0x8A            // keycode = 0x007a&lt;br /&gt;
#define KEY_FONT            0x8B            // keycode = 0x007b&lt;br /&gt;
#define KEY_PRINT           0x8C            // keycode = 0x007c&lt;br /&gt;
#define KEY_ON_OFF          0x8E            // keycode = 0x007c&lt;br /&gt;
&lt;br /&gt;
#define KEY_INSERT          0x90            // keycode = 0x004b&lt;br /&gt;
#define KEY_DELETE          0x91            // keycode = 0x004c&lt;br /&gt;
#define KEY_LEFT            0x92            // keycode = 0x004f&lt;br /&gt;
#define KEY_HOME            0x93            // keycode = 0x0050&lt;br /&gt;
#define KEY_END             0x94            // keycode = 0x0051&lt;br /&gt;
#define KEY_UP              0x95            // keycode = 0x0053&lt;br /&gt;
#define KEY_DOWN            0x96            // keycode = 0x0054&lt;br /&gt;
#define KEY_PAGE_UP         0x97            // keycode = 0x0055&lt;br /&gt;
#define KEY_PAGE_DOWN       0x98            // keycode = 0x0056&lt;br /&gt;
#define KEY_RIGHT           0x99            // keycode = 0x0059&lt;br /&gt;
#define KEY_MOUSE_1         0x9E            // keycode = 0x0400&lt;br /&gt;
#define KEY_MOUSE_2         0x9F            // keycode = 0x0800&lt;br /&gt;
&lt;br /&gt;
static uint8_t&lt;br /&gt;
get_fdc_key (uint16_t cmd)&lt;br /&gt;
{&lt;br /&gt;
    static uint8_t key_table[128] =&lt;br /&gt;
    {&lt;br /&gt;
     // 0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F&lt;br /&gt;
        0,  &#039;^&#039;, &#039;1&#039;, &#039;2&#039;, &#039;3&#039;, &#039;4&#039;, &#039;5&#039;, &#039;6&#039;, &#039;7&#039;, &#039;8&#039;, &#039;9&#039;, &#039;0&#039;, &#039;ß&#039;, &#039;´&#039;,  0,  &#039;\b&#039;,&lt;br /&gt;
       &#039;\t&#039;,&#039;q&#039;, &#039;w&#039;, &#039;e&#039;, &#039;r&#039;, &#039;t&#039;, &#039;z&#039;, &#039;u&#039;, &#039;i&#039;, &#039;o&#039;, &#039;p&#039;, &#039;ü&#039;, &#039;+&#039;,  0,   0,  &#039;a&#039;,&lt;br /&gt;
       &#039;s&#039;, &#039;d&#039;, &#039;f&#039;, &#039;g&#039;, &#039;h&#039;, &#039;j&#039;, &#039;k&#039;, &#039;l&#039;, &#039;ö&#039;, &#039;ä&#039;, &#039;#&#039;,  &#039;\r&#039;, 0,  &#039;&amp;lt;&#039;, &#039;y&#039;, &#039;x&#039;,&lt;br /&gt;
       &#039;c&#039;, &#039;v&#039;, &#039;b&#039;, &#039;n&#039;, &#039;m&#039;, &#039;,&#039;, &#039;.&#039;, &#039;-&#039;,  0,   0,   0,   0,   0,  &#039; &#039;,  0,   0,&lt;br /&gt;
&lt;br /&gt;
        0,  &#039;°&#039;, &#039;!&#039;, &#039;&amp;quot;&#039;, &#039;§&#039;, &#039;$&#039;, &#039;%&#039;, &#039;&amp;amp;&#039;, &#039;/&#039;, &#039;(&#039;, &#039;)&#039;, &#039;=&#039;, &#039;?&#039;, &#039;`&#039;,  0,  &#039;\b&#039;,&lt;br /&gt;
       &#039;\t&#039;,&#039;Q&#039;, &#039;W&#039;, &#039;E&#039;, &#039;R&#039;, &#039;T&#039;, &#039;Z&#039;, &#039;U&#039;, &#039;I&#039;, &#039;O&#039;, &#039;P&#039;, &#039;Ü&#039;, &#039;*&#039;,  0,   0,  &#039;A&#039;,&lt;br /&gt;
       &#039;S&#039;, &#039;D&#039;, &#039;F&#039;, &#039;G&#039;, &#039;H&#039;, &#039;J&#039;, &#039;K&#039;, &#039;L&#039;, &#039;Ö&#039;, &#039;Ä&#039;, &#039;\&#039;&#039;,&#039;\r&#039;, 0,  &#039;&amp;gt;&#039;, &#039;Y&#039;, &#039;X&#039;,&lt;br /&gt;
       &#039;C&#039;, &#039;V&#039;, &#039;B&#039;, &#039;N&#039;, &#039;M&#039;, &#039;;&#039;, &#039;:&#039;, &#039;_&#039;,  0,   0,   0,   0,   0,  &#039; &#039;,  0,   0&lt;br /&gt;
    };&lt;br /&gt;
    static uint8_t state;&lt;br /&gt;
&lt;br /&gt;
    uint8_t key = 0;&lt;br /&gt;
&lt;br /&gt;
    switch (cmd)&lt;br /&gt;
    {&lt;br /&gt;
        case 0x002C: state |=  STATE_LEFT_SHIFT;    break;              // pressed left shift&lt;br /&gt;
        case 0x00AC: state &amp;amp;= ~STATE_LEFT_SHIFT;    break;              // released left shift&lt;br /&gt;
        case 0x0039: state |=  STATE_RIGHT_SHIFT;   break;              // pressed right shift&lt;br /&gt;
        case 0x00B9: state &amp;amp;= ~STATE_RIGHT_SHIFT;   break;              // released right shift&lt;br /&gt;
        case 0x003A: state |=  STATE_LEFT_CTRL;     break;              // pressed left ctrl&lt;br /&gt;
        case 0x00BA: state &amp;amp;= ~STATE_LEFT_CTRL;     break;              // released left ctrl&lt;br /&gt;
        case 0x003C: state |=  STATE_LEFT_ALT;      break;              // pressed left alt&lt;br /&gt;
        case 0x00BC: state &amp;amp;= ~STATE_LEFT_ALT;      break;              // released left alt&lt;br /&gt;
        case 0x003E: state |=  STATE_RIGHT_ALT;     break;              // pressed left alt&lt;br /&gt;
        case 0x00BE: state &amp;amp;= ~STATE_RIGHT_ALT;     break;              // released left alt&lt;br /&gt;
&lt;br /&gt;
        case 0x006e: key = KEY_ESCAPE;              break;&lt;br /&gt;
        case 0x004b: key = KEY_INSERT;              break;&lt;br /&gt;
        case 0x004c: key = KEY_DELETE;              break;&lt;br /&gt;
        case 0x004f: key = KEY_LEFT;                break;&lt;br /&gt;
        case 0x0050: key = KEY_HOME;                break;&lt;br /&gt;
        case 0x0051: key = KEY_END;                 break;&lt;br /&gt;
        case 0x0053: key = KEY_UP;                  break;&lt;br /&gt;
        case 0x0054: key = KEY_DOWN;                break;&lt;br /&gt;
        case 0x0055: key = KEY_PAGE_UP;             break;&lt;br /&gt;
        case 0x0056: key = KEY_PAGE_DOWN;           break;&lt;br /&gt;
        case 0x0059: key = KEY_RIGHT;               break;&lt;br /&gt;
        case 0x0400: key = KEY_MOUSE_1;             break;&lt;br /&gt;
        case 0x0800: key = KEY_MOUSE_2;             break;&lt;br /&gt;
&lt;br /&gt;
        default:&lt;br /&gt;
        {&lt;br /&gt;
            if (!(cmd &amp;amp; 0x80))                      // pressed key&lt;br /&gt;
            {&lt;br /&gt;
                if (cmd &amp;gt;= 0x70 &amp;amp;&amp;amp; cmd &amp;lt;= 0x7F)     // function keys&lt;br /&gt;
                {&lt;br /&gt;
                    key = cmd + 0x10;               // 7x -&amp;gt; 8x&lt;br /&gt;
                }&lt;br /&gt;
                else if (cmd &amp;lt; 64)                  // key listed in key_table&lt;br /&gt;
                {&lt;br /&gt;
                    if (state &amp;amp; (STATE_LEFT_ALT | STATE_RIGHT_ALT))&lt;br /&gt;
                    {&lt;br /&gt;
                        switch (cmd)&lt;br /&gt;
                        {&lt;br /&gt;
                            case 0x0003: key = &#039;²&#039;;     break;&lt;br /&gt;
                            case 0x0008: key = &#039;{&#039;;     break;&lt;br /&gt;
                            case 0x0009: key = &#039;[&#039;;     break;&lt;br /&gt;
                            case 0x000A: key = &#039;]&#039;;     break;&lt;br /&gt;
                            case 0x000B: key = &#039;}&#039;;     break;&lt;br /&gt;
                            case 0x000C: key = &#039;\\&#039;;    break;&lt;br /&gt;
                            case 0x001C: key = &#039;~&#039;;     break;&lt;br /&gt;
                            case 0x002D: key = &#039;|&#039;;     break;&lt;br /&gt;
                            case 0x0034: key = &#039;µ&#039;;     break;&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                    else if (state &amp;amp; (STATE_LEFT_CTRL))&lt;br /&gt;
                    {&lt;br /&gt;
                        if (key_table[cmd] &amp;gt;= &#039;a&#039; &amp;amp;&amp;amp; key_table[cmd] &amp;lt;= &#039;z&#039;)&lt;br /&gt;
                        {&lt;br /&gt;
                            key = key_table[cmd] - &#039;a&#039; + 1;&lt;br /&gt;
                        }&lt;br /&gt;
                        else&lt;br /&gt;
                        {&lt;br /&gt;
                            key = key_table[cmd];&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                    else&lt;br /&gt;
                    {&lt;br /&gt;
                        int idx = cmd + ((state &amp;amp; (STATE_LEFT_SHIFT | STATE_RIGHT_SHIFT)) ? 64 : 0);&lt;br /&gt;
&lt;br /&gt;
                        if (key_table[idx])&lt;br /&gt;
                        {&lt;br /&gt;
                            key = key_table[idx];&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return (key);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Als letztes noch ein Beispiel einer Anwendung der Funktion get_fdc_key():&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
    if (irmp_get_data (&amp;amp;irmp_data))&lt;br /&gt;
    {&lt;br /&gt;
        uint8_t key;&lt;br /&gt;
&lt;br /&gt;
        if (irmp_data.protocol == IRMP_FDC_PROTOCOL &amp;amp;&amp;amp;&lt;br /&gt;
            (key = get_fdc_key (irmp_data.command)) != 0)&lt;br /&gt;
        {&lt;br /&gt;
            if ((key &amp;gt;= 0x20 &amp;amp;&amp;amp; key &amp;lt; 0x7F) || key &amp;gt;= 0xA0) // show only printable characters&lt;br /&gt;
            {&lt;br /&gt;
                printf (&amp;quot;ascii-code = 0x%02x, character = &#039;%c&#039;\n&amp;quot;, key, key);&lt;br /&gt;
            }&lt;br /&gt;
            else // it&#039;s a non-printable key&lt;br /&gt;
            {&lt;br /&gt;
                printf (&amp;quot;ascii-code = 0x%02x\n&amp;quot;, key);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alle nicht-druckbaren Zeichen werden dabei folgendermaßen codiert:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Taste             || Konstante                || Wert&lt;br /&gt;
|-&lt;br /&gt;
| ESC               || KEY_ESCAPE              || 0x1B&lt;br /&gt;
|-&lt;br /&gt;
| Menü              || KEY_MENUE               || 0x80&lt;br /&gt;
|-&lt;br /&gt;
| Zurück            || KEY_BACK                || 0x81&lt;br /&gt;
|-&lt;br /&gt;
| Vorw.             || KEY_FORWARD             || 0x82&lt;br /&gt;
|-&lt;br /&gt;
| Adresse           || KEY_ADDRESS             || 0x83&lt;br /&gt;
|-&lt;br /&gt;
| Fenster           || KEY_WINDOW              || 0x84&lt;br /&gt;
|-&lt;br /&gt;
| 1. Seite          || KEY_1ST_PAGE            || 0x85&lt;br /&gt;
|-&lt;br /&gt;
| Stop              || KEY_STOP                || 0x86&lt;br /&gt;
|-&lt;br /&gt;
| Mail              || KEY_MAIL                || 0x87&lt;br /&gt;
|-&lt;br /&gt;
| Fav.              || KEY_FAVORITES           || 0x88&lt;br /&gt;
|-&lt;br /&gt;
| Neue Seite        || KEY_NEW_PAGE            || 0x89&lt;br /&gt;
|-&lt;br /&gt;
| Setup             || KEY_SETUP               || 0x8A&lt;br /&gt;
|-&lt;br /&gt;
| Schrift           || KEY_FONT                || 0x8B&lt;br /&gt;
|-&lt;br /&gt;
| Druck             || KEY_PRINT               || 0x8C&lt;br /&gt;
|-&lt;br /&gt;
| Ein/Aus           || KEY_ON_OFF              || 0x8E&lt;br /&gt;
|-&lt;br /&gt;
| Backspace         || &#039;\b&#039;                    || 0x08&lt;br /&gt;
|-&lt;br /&gt;
| CR/ENTER          || &#039;\r&#039;                    || 0x0C&lt;br /&gt;
|-&lt;br /&gt;
| TAB               || &#039;\t&#039;                    || 0x09&lt;br /&gt;
|-&lt;br /&gt;
| Einfg             || KEY_INSERT              || 0x90&lt;br /&gt;
|-&lt;br /&gt;
| Entf              || KEY_DELETE              || 0x91&lt;br /&gt;
|-&lt;br /&gt;
| Cursor links      || KEY_LEFT                || 0x92&lt;br /&gt;
|-&lt;br /&gt;
| Pos1              || KEY_HOME                || 0x93&lt;br /&gt;
|-&lt;br /&gt;
| Ende              || KEY_END                 || 0x94&lt;br /&gt;
|-&lt;br /&gt;
| Cursor rechts     || KEY_UP                  || 0x95&lt;br /&gt;
|-&lt;br /&gt;
| Cursor runter     || KEY_DOWN                || 0x96&lt;br /&gt;
|-&lt;br /&gt;
| Bild hoch         || KEY_PAGE_UP             || 0x97&lt;br /&gt;
|-&lt;br /&gt;
| Bild runter       || KEY_PAGE_DOWN           || 0x98&lt;br /&gt;
|-&lt;br /&gt;
| Cursor links      || KEY_RIGHT               || 0x99&lt;br /&gt;
|-&lt;br /&gt;
| Linke Maustaste   || KEY_MOUSE_1             || 0x9E&lt;br /&gt;
|-&lt;br /&gt;
| Rechte Maustaste  || KEY_MOUSE_2             || 0x9F&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die Funktion get_fdc_key berücksichtigt das Gedrückthalten der Shift-, Strg- und ALT-Tasten. Damit funktioniert nicht nur das Schreiben von Großbuchstaben, sondern auch das Auswählen der Sonderzeichen mit der Tastenkombination  ALT + Taste, z.B. ALT + m = µ oder ALT + q = @. Ebenso kann man mit der Strg-Taste die Control-Zeichen CTRL-A bis CTRL-Z senden. Die CapsLock-Taste wird ignoriert, da ich sie sowieso für die überflüssigste Taste überhaupt halte ;-)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= IRSND - Infrarot-Multiprotokoll-Encoder =&lt;br /&gt;
&lt;br /&gt;
[[Datei:irmp-title.png| |Scan eines NEC-kompatiblen Fernbedienungssignals]]&lt;br /&gt;
&lt;br /&gt;
== Einleitung IRSND ==&lt;br /&gt;
&lt;br /&gt;
[[Datei:ir-sender.png|miniatur|Anschluß eines einfachen IR-Senders an µC]]&lt;br /&gt;
&lt;br /&gt;
IRSND ist das Gegenstück zu IRMP: es reproduziert aus den Daten, die mit IRMP empfangen wurden, wieder den Original Frame, der dann über eine Infrarot-Diode ausgegeben werden kann.&lt;br /&gt;
&lt;br /&gt;
IRSND ist lauffähig auf folgenden AVR µCs:&lt;br /&gt;
&lt;br /&gt;
* ATtiny45,  ATtiny85&lt;br /&gt;
* ATtiny84&lt;br /&gt;
* ATmega8,   ATmega16,  ATmega32&lt;br /&gt;
* ATmega162&lt;br /&gt;
* ATmega164, ATmega324, ATmega644,  ATmega644P, ATmega1284&lt;br /&gt;
* ATmega88,  ATmega88P, ATmega168,  ATmega168P, ATmega328P&lt;br /&gt;
&lt;br /&gt;
IRSND unterstützt die folgenden Protokolle:&lt;br /&gt;
&lt;br /&gt;
* SIRCS&lt;br /&gt;
* NEC&lt;br /&gt;
* SAMSUNG&lt;br /&gt;
* SAMSUNG32&lt;br /&gt;
* MATSUSHITA&lt;br /&gt;
* RC5&lt;br /&gt;
* KASEIKYO&lt;br /&gt;
* DENON&lt;br /&gt;
* JVC&lt;br /&gt;
* APPLE&lt;br /&gt;
* NUBERT&lt;br /&gt;
* BANG_OLUFSEN&lt;br /&gt;
* GRUNDIG&lt;br /&gt;
* NOKIA&lt;br /&gt;
* SIEMENS (bei mind. ~15kHz)&lt;br /&gt;
* FDC (bei mind. ~15kHz)&lt;br /&gt;
* RCCAR (bei mind. ~15kHz)&lt;br /&gt;
* RECS80 (bei mind. ~20kHz)&lt;br /&gt;
* RECS80EXT (bei mind. ~20kHz)&lt;br /&gt;
* NIKON&lt;br /&gt;
* RC6&lt;br /&gt;
* RC6A&lt;br /&gt;
* THOMSON (&#039;&#039;&#039;NEU&#039;&#039;&#039;)&lt;br /&gt;
* NEC16 (&#039;&#039;&#039;NEU&#039;&#039;&#039;)&lt;br /&gt;
* NEC42 (&#039;&#039;&#039;NEU&#039;&#039;&#039;)&lt;br /&gt;
* LEGO (&#039;&#039;&#039;NEU&#039;&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
== Download IRSND ==&lt;br /&gt;
&lt;br /&gt;
Version 2.0.1, Stand vom 20.09.2011&lt;br /&gt;
&lt;br /&gt;
Download Release-Version: [http://www.mikrocontroller.net/wikifiles/c/c7/Irsnd.zip Irsnd.zip] &lt;br /&gt;
&lt;br /&gt;
IRMP &amp;amp; IRSND sind nun auch über SVN abrufbar: [http://www.mikrocontroller.net/svnbrowser/irmp/ IRMP im SVN]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die Version im SVN kann eine Zwischen- oder Test-Version sein, die nicht den hier dokumentierten Stand widerspiegelt! Im Zweifel verwendet man besser den obigen Download auf Irsnd.zip.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die Software-Änderungen kann man sich hier anschauen: [http://www.mikrocontroller.net/articles/IRMP#Software-Historie_IRSND Software-Historie IRSND]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Source-Code IRSND ==&lt;br /&gt;
&lt;br /&gt;
Der Source-Code lässt sich einfach übersetzen, indem man die Projekt-Datei irsnd.aps in den WinAVR lädt.&lt;br /&gt;
&lt;br /&gt;
IRSND encodiert sämtliche oben aufgelisteten Protokolle in einer ISR, siehe irsnd.c.&lt;br /&gt;
&lt;br /&gt;
=== Einstellungen in irsndconfig.h ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;F_INTERRUPTS&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Anzahl der Interrupts pro Sekunde. Der Wert kann zwischen 10000 und 20000 eingestellt werden.&lt;br /&gt;
&lt;br /&gt;
Standardwert:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#define F_INTERRUPTS                            15000      // interrupts per second&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRSND_SUPPORT_xxx_PROTOCOL&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Hier lässt sich einstellen, welche Protokolle von IRSND unterstützt werden sollen. Die Standardprotokolle sind bereits aktiv. Möchte man weitere Protokolle einschalten bzw. einige aus Speicherplatzgründen deaktivieren, sind die entsprechenden Werte in irsndconfig.h anzupassen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
// typical protocols, disable here!             Enable  Remarks                 F_INTERRUPTS            Program Space&lt;br /&gt;
#define IRSND_SUPPORT_SIRCS_PROTOCOL            1       // Sony SIRCS           &amp;gt;= 10000                 ~150 bytes&lt;br /&gt;
#define IRSND_SUPPORT_NEC_PROTOCOL              1       // NEC + APPLE          &amp;gt;= 10000                 ~100 bytes&lt;br /&gt;
#define IRSND_SUPPORT_SAMSUNG_PROTOCOL          1       // Samsung + Samsung32  &amp;gt;= 10000                 ~300 bytes&lt;br /&gt;
#define IRSND_SUPPORT_MATSUSHITA_PROTOCOL       1       // Matsushita           &amp;gt;= 10000                 ~200 bytes&lt;br /&gt;
#define IRSND_SUPPORT_KASEIKYO_PROTOCOL         1       // Kaseikyo             &amp;gt;= 10000                 ~150 bytes&lt;br /&gt;
#define IRSND_SUPPORT_DENON_PROTOCOL            1       // DENON, Sharp         &amp;gt;= 10000                 ~200 bytes&lt;br /&gt;
&lt;br /&gt;
// more protocols, enable here!                 Enable  Remarks                 F_INTERRUPTS            Program Space&lt;br /&gt;
#define IRSND_SUPPORT_RC5_PROTOCOL              0       // RC5                  &amp;gt;= 10000                 ~150 bytes&lt;br /&gt;
#define IRSND_SUPPORT_RC6_PROTOCOL              0       // RC6                  &amp;gt;= 10000                 ~250 bytes&lt;br /&gt;
#define IRSND_SUPPORT_RC6A_PROTOCOL             0       // RC6A                 &amp;gt;= 10000                 ~250 bytes&lt;br /&gt;
#define IRSND_SUPPORT_JVC_PROTOCOL              0       // JVC                  &amp;gt;= 10000                 ~150 bytes&lt;br /&gt;
#define IRSND_SUPPORT_NEC16_PROTOCOL            0       // NEC16                &amp;gt;= 10000                 ~150 bytes&lt;br /&gt;
#define IRSND_SUPPORT_NEC42_PROTOCOL            0       // NEC42                &amp;gt;= 10000                 ~150 bytes&lt;br /&gt;
#define IRSND_SUPPORT_IR60_PROTOCOL             0       // IR60 (SAB2008)       &amp;gt;= 10000                 DON&#039;T CHANGE, NOT SUPPORTED YET!&lt;br /&gt;
#define IRSND_SUPPORT_GRUNDIG_PROTOCOL          0       // Grundig              &amp;gt;= 10000                 ~300 bytes&lt;br /&gt;
#define IRSND_SUPPORT_SIEMENS_PROTOCOL          0       // Siemens, Gigaset     &amp;gt;= 15000                 ~150 bytes&lt;br /&gt;
#define IRSND_SUPPORT_NOKIA_PROTOCOL            0       // Nokia                &amp;gt;= 10000                 ~400 bytes&lt;br /&gt;
&lt;br /&gt;
// exotic protocols, enable here!               Enable  Remarks                 F_INTERRUPTS            Program Space&lt;br /&gt;
#define IRSND_SUPPORT_KATHREIN_PROTOCOL         0       // Kathrein             &amp;gt;= 10000                 DON&#039;T CHANGE, NOT SUPPORTED YET!&lt;br /&gt;
#define IRSND_SUPPORT_NUBERT_PROTOCOL           0       // NUBERT               &amp;gt;= 10000                 ~100 bytes&lt;br /&gt;
#define IRSND_SUPPORT_BANG_OLUFSEN_PROTOCOL     0       // Bang&amp;amp;Olufsen         &amp;gt;= 10000                 ~250 bytes&lt;br /&gt;
#define IRSND_SUPPORT_RECS80_PROTOCOL           0       // RECS80               &amp;gt;= 20000                 ~100 bytes&lt;br /&gt;
#define IRSND_SUPPORT_RECS80EXT_PROTOCOL        0       // RECS80EXT            &amp;gt;= 20000                 ~100 bytes&lt;br /&gt;
#define IRSND_SUPPORT_THOMSON_PROTOCOL          0       // Thomson              &amp;gt;= 10000                 ~250 bytes&lt;br /&gt;
#define IRSND_SUPPORT_NIKON_PROTOCOL            0       // NIKON                &amp;gt;= 10000                 ~150 bytes&lt;br /&gt;
#define IRSND_SUPPORT_NETBOX_PROTOCOL           0       // Netbox keyboard      &amp;gt;= 10000                 DON&#039;T CHANGE, NOT SUPPORTED YET!&lt;br /&gt;
#define IRSND_SUPPORT_FDC_PROTOCOL              0       // FDC IR keyboard      &amp;gt;= 10000 (better 15000)  ~150 bytes&lt;br /&gt;
#define IRSND_SUPPORT_RCCAR_PROTOCOL            0       // RC CAR               &amp;gt;= 10000 (better 15000)  ~150 bytes&lt;br /&gt;
#define IRSND_SUPPORT_RUWIDO_PROTOCOL           0       // RUWIDO, T-Home       &amp;gt;= 15000                 DON&#039;T CHANGE, NOT SUPPORTED YET!&lt;br /&gt;
#define IRSND_SUPPORT_LEGO_PROTOCOL             0       // LEGO Power RC        &amp;gt;= 20000                 ~150 bytes&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit Setzen auf 0 wird das Protokoll deaktiviert, mit Setzen auf 1 wird es aktiviert. Die deaktivierten Protokolle werden dann nicht mitübersetzt. Das spart Speicherplatz im Flash, siehe Angaben in obigen Kommentaren. Wenn man unbedingt Speicherplatz sparen muss, gelten natürlich hier dieselben Tipps wie für IRMP.&lt;br /&gt;
&lt;br /&gt;
Um das APPLE-Protokoll zu unterstützen, ist IRSND_SUPPORT_NEC_PROTOCOL auf 1 zu setzen, da es sich hier lediglich um einen Spezialfall vom NEC-Protokoll handelt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRSND_OCx&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Für das Senden der IR-Signale benötigt IRSND einen PWM-fähigen Output-Pin, da das Signal moduliert werden muss. Möglich sind eine der folgenden Einstellungen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#define IRSND_OCx                               IRSND_OC2  // OC2  on ATmegas         supporting OC2,  e.g. ATmega8&lt;br /&gt;
#define IRSND_OCx                               IRSND_OC2A // OC2A on ATmegas         supporting OC2A, e.g. ATmega88&lt;br /&gt;
#define IRSND_OCx                               IRSND_OC2B // OC2B on ATmegas         supporting OC2B, e.g. ATmega88&lt;br /&gt;
#define IRSND_OCx                               IRSND_OC0  // OC0  on ATmegas         supporting OC0,  e.g. ATmega162&lt;br /&gt;
#define IRSND_OCx                               IRSND_OC0A // OC0A on ATmegas/ATtinys supporting OC0A, e.g. ATtiny84, ATtiny85&lt;br /&gt;
#define IRSND_OCx                               IRSND_OC0B // OC0B on ATmegas/ATtinys supporting OC0B, e.g. ATtiny84, ATtiny85&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Standardwert:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#define IRSND_OCx                               IRSND_OC2B&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
IRSND baut den zu sendenden Frame &amp;quot;on-the-fly&amp;quot; aus der IRMP-Datenstruktur wieder zusammen. Dazu zählen:&lt;br /&gt;
&lt;br /&gt;
 1. ID für verwendetes Protokoll&lt;br /&gt;
 2. Adresse bzw. Herstellercode&lt;br /&gt;
 3. Kommando&lt;br /&gt;
&lt;br /&gt;
Mittels der Funktion&lt;br /&gt;
&lt;br /&gt;
   irsnd_send_data (IRMP_DATA * irmp_data_p)&lt;br /&gt;
&lt;br /&gt;
kann man ein zu encodierendes Telegramm versenden. Der Return-Wert ist 1, wenn das Telegramm versendet werden kann, sonst 0. Im ersten Fall werden die Struct-Members&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
    irmp_data_p-&amp;gt;protocol&lt;br /&gt;
    irmp_data_p-&amp;gt;address&lt;br /&gt;
    irmp_data_p-&amp;gt;command&lt;br /&gt;
    irmp_data_p-&amp;gt;flags&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ausgelesen und dann als Frame im jeweils gewünschten Protokoll gesendet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;NEU ab Version 1.5.0:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
irmp_data_p-&amp;gt;flags gibt die Anzahl der Wiederholungen an, z.B.&lt;br /&gt;
&lt;br /&gt;
  irmp_data_p-&amp;gt;flags = 0: Verhalten wie bisher&lt;br /&gt;
  irmp_data_p-&amp;gt;flags = 1: 1 Wiederholung&lt;br /&gt;
  irmp_data_p-&amp;gt;flags = 2: 2 Wiederholungen&lt;br /&gt;
  usw.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Zu beachten: Da bisher irmp_data_p-&amp;gt;flags von IRSND nicht ausgewertet wurde, ist unbedingt ab Version 1.5.0 darauf zu achten, dass irmp_data_p-&amp;gt;flags vor dem Aufruf von irsnd_send_data() einen definierten Wert hat!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Hier ein Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
   IRMP_DATA irmp_data;&lt;br /&gt;
&lt;br /&gt;
   irmp_data.protocol = IRMP_NEC_PROTOCOL;   // sende im NEC-Protokoll&lt;br /&gt;
   irmp_data.address  = 0x00FF;              // verwende Adresse 0x00FF&lt;br /&gt;
   irmp_data.command  = 0x0001;              // sende Kommando 0001&lt;br /&gt;
   irmp_data.flags    = 0;                   // keine Wiederholung!&lt;br /&gt;
&lt;br /&gt;
   (void) irsnd_send_data (&amp;amp;irmp_data);      // versende ohne Prüfung&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Frame wird asynchron über die Interrupt-Routine irsnd_ISR() verschickt, so dass die Funktion irsnd_send_data() sofort zurückkommt.&lt;br /&gt;
&lt;br /&gt;
Sind Wiederholungen angegeben, wird entweder der Frame nach einer Pause (protokollabhängig) neu ausgegeben oder ein protokollspezifischer Wiederholungsframe (z.B. für NEC) gesendet.&lt;br /&gt;
&lt;br /&gt;
Wird erneut irsnd_send_data() aufgerufen, wartet diese, bis der vorhergenhende Frame vollständig verschickt wurde. Man kann aber auch selbst prüfen, ob IRSND gerade &amp;quot;busy&amp;quot; ist oder nicht:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
   while (irsnd_is_busy ())&lt;br /&gt;
   {&lt;br /&gt;
      ;                                      // selber warten oder was anderes tun...&lt;br /&gt;
   }&lt;br /&gt;
   (void) irsnd_send_data (&amp;amp;irmp_data);      // versende ohne Prüfung&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Beispiel-Source irsndmain.c findet man neben der Verwendung von irsnd_send_data() auch den Timer-Aufruf:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
ISR(TIMER1_COMPA_vect)&lt;br /&gt;
{&lt;br /&gt;
  irsnd_ISR())          // call irsnd ISR&lt;br /&gt;
  // call other timer interrupt routines...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Paralleles Betreiben von IRMP und IRSND ===&lt;br /&gt;
&lt;br /&gt;
Möchte man IRMP und IRSND parallel verwenden (also als Sender und Empfänger) schreibt man die ISR folgendermaßen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
ISR(TIMER1_COMPA_vect)&lt;br /&gt;
{&lt;br /&gt;
  if (! irsnd_ISR())          // call irsnd ISR&lt;br /&gt;
  {                           // if not busy...&lt;br /&gt;
      irmp_ISR();             // call irmp ISR&lt;br /&gt;
  }&lt;br /&gt;
  // call other timer interrupt routines...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das heisst: Nur wenn irsnd_ISR() nichts zu tun hat, dann rufe die ISR des Empfängers auf. Damit ist der Empfänger solange abgeschaltet, während irsnd_ISR() noch Daten sendet. Die Timer-Initialisierungsroutine ist für IRMP und IRSND dann natürlich dieselbe.&lt;br /&gt;
&lt;br /&gt;
Eine gemeinsame main-Funktion könnte dann zum Beispiel folgendermaßen aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
int&lt;br /&gt;
main (void)&lt;br /&gt;
{&lt;br /&gt;
  IRMP_DATA irmp_data;&lt;br /&gt;
&lt;br /&gt;
  irmp_init();                // initialize irmp&lt;br /&gt;
  irsnd_init();               // initialize irsnd&lt;br /&gt;
  timer_init();               // initialize timer&lt;br /&gt;
  sei ();                     // enable interrupts&lt;br /&gt;
&lt;br /&gt;
  for (;;)&lt;br /&gt;
  {&lt;br /&gt;
    if (irmp_get_data (&amp;amp;irmp_data))&lt;br /&gt;
    {&lt;br /&gt;
      irmp_data.flags = 0;    // reset flags!&lt;br /&gt;
      irsnd_send_data (&amp;amp;irmp_data);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Funktion des obigen Sources ist offensichtlich: Ein empfangenes Telegramm wird nach vollständiger Decodierung wieder encodiert und dann wieder über die IR-Diode ausgesandt. Somit können dann zum Beispiel Signale &amp;quot;um die Ecke&amp;quot; oder streckenweise drahtgebunden übertragen werden.&lt;br /&gt;
&lt;br /&gt;
Desweiteren könnte man auch Protokolle transformieren, zum Beispiel NEC-Telegramme in RC5 umwandeln, wenn man seine Original-RC5-FB zu seinem Philips-Gerät verlegt hat...&lt;br /&gt;
&lt;br /&gt;
Der Rest bleibt der Phantasie des geneigten Lesers überlassen ;-)&lt;br /&gt;
&lt;br /&gt;
Hier noch die möglichen Werte für irmp_data.protocol, siehe auch irmp.h:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#define IRMP_SIRCS_PROTOCOL                      1              // Sony&lt;br /&gt;
#define IRMP_NEC_PROTOCOL                        2              // NEC, Pioneer, JVC, Toshiba, NoName etc.&lt;br /&gt;
#define IRMP_SAMSUNG_PROTOCOL                    3              // Samsung&lt;br /&gt;
#define IRMP_MATSUSHITA_PROTOCOL                 4              // Matsushita&lt;br /&gt;
#define IRMP_KASEIKYO_PROTOCOL                   5              // Kaseikyo (Panasonic etc)&lt;br /&gt;
#define IRMP_RECS80_PROTOCOL                     6              // Philips, Thomson, Nordmende, Telefunken, Saba&lt;br /&gt;
#define IRMP_RC5_PROTOCOL                        7              // Philips etc&lt;br /&gt;
#define IRMP_DENON_PROTOCOL                      8              // Denon, Sharp&lt;br /&gt;
#define IRMP_RC6_PROTOCOL                        9              // Philips etc&lt;br /&gt;
#define IRMP_SAMSUNG32_PROTOCOL                 10              // Samsung32: no sync pulse at bit 16, length 32 instead of 37&lt;br /&gt;
#define IRMP_APPLE_PROTOCOL                     11              // Apple, very similar to NEC&lt;br /&gt;
#define IRMP_RECS80EXT_PROTOCOL                 12              // Philips, Technisat, Thomson, Nordmende, Telefunken, Saba&lt;br /&gt;
#define IRMP_NUBERT_PROTOCOL                    13              // Nubert&lt;br /&gt;
#define IRMP_BANG_OLUFSEN_PROTOCOL              14              // Bang &amp;amp; Olufsen&lt;br /&gt;
#define IRMP_GRUNDIG_PROTOCOL                   15              // Grundig&lt;br /&gt;
#define IRMP_NOKIA_PROTOCOL                     16              // Nokia&lt;br /&gt;
#define IRMP_SIEMENS_PROTOCOL                   17              // Siemens, e.g. Gigaset&lt;br /&gt;
#define IRMP_FDC_PROTOCOL                       18              // FDC keyboard&lt;br /&gt;
#define IRMP_RCCAR_PROTOCOL                     19              // RC Car&lt;br /&gt;
#define IRMP_JVC_PROTOCOL                       20              // JVC (NEC with 16 bits)&lt;br /&gt;
#define IRMP_RC6A_PROTOCOL                      21              // RC6A, e.g. Kathrein, XBOX&lt;br /&gt;
#define IRMP_NIKON_PROTOCOL                     22              // Nikon&lt;br /&gt;
#define IRMP_RUWIDO_PROTOCOL                    23              // Ruwido, e.g. T-Home Mediareceiver&lt;br /&gt;
#define IRMP_IR60_PROTOCOL                      24              // IR60 (SAB2008)&lt;br /&gt;
#define IRMP_KATHREIN_PROTOCOL                  25              // Kathrein&lt;br /&gt;
#define IRMP_NETBOX_PROTOCOL                    26              // Netbox keyboard (bitserial)&lt;br /&gt;
#define IRMP_NEC16_PROTOCOL                     27              // NEC with 16 bits (incl. sync)&lt;br /&gt;
#define IRMP_NEC42_PROTOCOL                     28              // NEC with 42 bits&lt;br /&gt;
#define IRMP_LEGO_PROTOCOL                      29              // LEGO Power Functions RC&lt;br /&gt;
#define IRMP_THOMSON_PROTOCOL                   30              // Thomson&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Daten für die Adresse und das Kommando ermittelt man am besten über IRMP, siehe weiter oben ;-)&lt;br /&gt;
&lt;br /&gt;
== IRSND unter Linux und Windows ==&lt;br /&gt;
&lt;br /&gt;
irsnd.c lässt sich auch unter Linux direkt kompilieren, um damit Telegramme in Form von IRMP-Scan-Dateien zu erzeugen. Das geht folgendermaßen:&lt;br /&gt;
&lt;br /&gt;
    cc irsnd.c -o irsnd                            # IRSND compilieren&lt;br /&gt;
&lt;br /&gt;
Der Aufruf geht dann folgendermaßen:&lt;br /&gt;
&lt;br /&gt;
    ./irsnd protocol-number hex-address hex-command [repeat] &amp;gt; filename.txt&lt;br /&gt;
&lt;br /&gt;
also zum Beispiel für das NEC-Protokoll, Adresse 0x00FF, Kommando 0x0001&lt;br /&gt;
&lt;br /&gt;
    ./irsnd 2 00FF 0001 &amp;gt; nec.txt                   # irsnd ausführen&lt;br /&gt;
&lt;br /&gt;
IRSND kann man auch unter Windows nutzen, nämlich folgendermaßen:&lt;br /&gt;
&lt;br /&gt;
* Eingabeaufforderung starten&lt;br /&gt;
* In das Verzeichnis von irsnd wechseln&lt;br /&gt;
* Aufruf von:&lt;br /&gt;
&lt;br /&gt;
            irsnd.exe 2 00FF 0001 &amp;gt; nec.txt&lt;br /&gt;
&lt;br /&gt;
Nun kann man direkt mit IRMP anschließend testen, ob das erzeugte Telegramm auch korrekt ist:&lt;br /&gt;
&lt;br /&gt;
            ./irmp &amp;lt; nec.txt&lt;br /&gt;
&lt;br /&gt;
bzw. unter Windows:&lt;br /&gt;
&lt;br /&gt;
            irmp.exe &amp;lt; nec.txt&lt;br /&gt;
&lt;br /&gt;
Das Ganze geht auch ohne Zwischendatei, nämlich:&lt;br /&gt;
&lt;br /&gt;
            ./irsnd 2 00FF 0001 | ./irmp&lt;br /&gt;
&lt;br /&gt;
bzw. unter Windows:&lt;br /&gt;
&lt;br /&gt;
            irsnd.exe 2 00FF 0001 | irmp.exe&lt;br /&gt;
&lt;br /&gt;
IRMP gibt dann als Ergebnis folgendes aus:&lt;br /&gt;
&lt;br /&gt;
            11111111000000001000000001111111 p =  2, a = 0x00ff, c = 0x0001, f = 0x00&lt;br /&gt;
&lt;br /&gt;
IRMP konnte also aus dem von IRSND generierten Frame wieder das Protokoll 2, Adresse 0x00FF und Kommando 0x0001 decodieren.&lt;br /&gt;
&lt;br /&gt;
Bitte beachten: Je nach benutztem Protokoll sind die Bit-Breiten der Adressen bzw. Kommandos verschieden, siehe obige Tabelle [http://www.mikrocontroller.net/articles/IRMP#Protokolle].&lt;br /&gt;
&lt;br /&gt;
Man kann also nicht mit jedem IR-Protokoll komplett 16-Bit breite Adressen oder Kommandos transparent übertragen.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= Anhang =&lt;br /&gt;
&lt;br /&gt;
== Die IR-Protokolle im Detail ==&lt;br /&gt;
&lt;br /&gt;
=== Pulse-Distance Protokolle ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;SIRCS&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 40 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Pulse Distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 Start-Bit + 12-20 Daten-Bits, kein Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 7 Kommando-Bits + 5 Adress-Bits + bis zu 8 zusätzliche Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 2400µs Puls, 600µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 600µs Puls, 600µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 1200µs Puls, 600µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || zweimalig nach ca. 25ms, d.h. 2. und 3. Frame&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || ab dem 4. identischen Frame, Abstand ca. 25ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;NEC + extended NEC&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 36 kHz / 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Pulse Distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 Start-Bit + 32 Daten-Bits + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten NEC || 8 Adress-Bits + 8 invertierte Adress-Bits + 8 Kommando-Bits + 8 invertierte Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Daten ext. NEC || 16 Adress-Bits + 8 Kommando-Bits + 8 invertierte Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 9000µs Puls, 4500µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 560µs Puls,  560µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 560µs Puls, 1690µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || 560µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || keine&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || 9000µs Puls, 2250µs Pause, 560µs Puls, ~100ms Pause&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;JVC&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Pulse Distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 Start-Bit + 16 Daten-Bits + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 4 Adress-Bits + 12 Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 9000µs Puls, 4500µs Pause, 6000µs Pause bei Tasten-Wiederholung&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 560µs Puls,  560µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 560µs Puls, 1690µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || 560µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || keine&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || Wiederholung nach Pause von 25ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;NEC16&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Pulse Distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 Start-Bit + 8 Adress-Bits + 1 Sync-Bit + 8 Daten-Bits + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 9000µs Puls, 4500µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Sync-Bit || 560µs Puls, 4500µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 560µs Puls,  560µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 560µs Puls, 1690µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || 560µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || keine/eine/zwei nach 25ms?&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || Wiederholung nach Pause von 25ms?&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;NEC42&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Pulse Distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 Start-Bit + 42 Daten-Bits + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 13 Adress-Bits + 13 invertierte Adress-Bits + 8 Kommando-Bits + 8 invertierte Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 9000µs Puls, 4500µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 560µs Puls,  560µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 560µs Puls, 1690µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || 560µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || keine&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || (unbekannt)&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;SAMSUNG&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || ?? kHz&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Pulse Distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 Start-Bit + 16 Daten(1)-Bits + 1 Sync-Bit + 20 Daten(2)-Bits + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten(1) || 16 Adress-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Daten(2) || 4 ID-Bits + 8 Kommando-Bits + 8 invertierte Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 4500µs Puls, 4500µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 550µs Puls,  450µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 550µs Puls, 1450µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Sync-Bit || 550µs Puls, 4500µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || 550µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || keine&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || N-fache Wiederholung des Original-Frames innerhalb von 100ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;SAMSUNG32&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Pulse Distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 Start-Bit + 32 Daten-Bits + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 16 Adress-Bits + 16 Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 4500µs Puls, 4500µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 550µs Puls,  450µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 550µs Puls, 1450µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || 550µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || einmalig nach 45ms&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || dritter, fünfter, siebter usw. identischer Frame&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;MATSUSHITA&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 36 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Pulse Distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 Start-Bit + 24 Daten-Bits + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 6 Hersteller-Bits + 6 Kommando-Bits + 12 Adress-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 3488µs Puls, 3488µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 872µs Puls,  872µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 872µs Puls, 2616µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || 872µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || keine&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || N-fache Wiederholung des Original-Frames innerhalb von 100ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || LSB first?&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;KASEIKYO&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Pulse Distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 Start-Bit + 48 Daten-Bits + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 16 Hersteller-Bits + 4 Parity-Bits + 4 Genre1-Bits + 4 Genre2-Bits + 10 Kommando-Bits + 2 ID-Bits + 8 Parity-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 3380µs Puls, 1690µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 423µs Puls,  423µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 423µs Puls, 1269µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || 423µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || einmalig nach 74ms&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || N-fache Wiederholung des Original-Frames innerhalb von 74ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || LSB first?&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;RECS80&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Pulse Distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 Start-Bits + 10 Daten-Bits + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 1 Toggle-Bit + 3 Adress-Bits + 6 Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 158µs Puls, 7432µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 158µs Puls, 4902µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 158µs Puls, 7432µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || 158µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || keine&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || N-fache Wiederholung des Original-Frames innerhalb von 100ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;RECS80EXT&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Pulse Distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 2 Start-Bits + 11 Daten-Bits + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 1 Toggle-Bit + 4 Adress-Bits + 6 Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 158µs Puls, 3637µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 158µs Puls, 4902µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 158µs Puls, 7432µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || 158µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || keine&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || N-fache Wiederholung des Original-Frames innerhalb von 100ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;DENON&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 38 kHz (in der Praxis, lt. Dokumentation: 32 kHz)&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Pulse Distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 0 Start-Bits + 15 Data-Bits + 1 Stop-Bit + 65ms Pause + 15 invertierte Daten-Bits + 1 Stop-bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 5 Address-Bits + 10 Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || kein Start-Bit&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 310µs Puls, 745µs Pause (in der Praxis, lt. Doku: 275µs Puls, 775µs Pause)&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 310µs Puls, 1780µs Pause (in der Praxis, lt. Doku: 275µs Puls, 1900µs Pause)&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || 310µs Puls (310µs Puls, 745µs Pause (in der Praxis, lt. Doku: 275µs Puls)&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || keine&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || N-fache Wiederholung des Original-Frames innerhalb von 100ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;APPLE&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Pulse Distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 Start-Bit + 32 Daten-Bits + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 16 Adress-Bits + 11100000 + 8 Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || siehe NEC&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || siehe NEC&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || siehe NEC&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || siehe NEC&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || keine&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || N-fache Wiederholung des Original-Frames innerhalb von 100ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;NUBERT&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 36 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Pulse Distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 Start-Bit + 10 Daten-Bits + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 0 Adress-Bits + 10 Kommando-Bits ?&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 1340µs Puls, 340µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 500µs Puls, 1300µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 1340µs Puls, 340µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || 500µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || einmalig nach 35ms&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || dritter, fünfter, siebter usw. identischer Frame&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || MSB first?&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;B&amp;amp;O&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 455 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Pulse Distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 4 Start-Bits + 16 Daten-Bits + 1 Trailer-Bit + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 0 Adress-Bits + 16 Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit 1 || 200µs Puls, 2925µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit 2 || 200µs Puls, 2925µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit 3 || 200µs Puls, 15425µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit 4 || 200µs Puls, 2925µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 200µs Puls, 2925µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 200µs Puls, 9175µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| R-Bit || 200µs Puls, 6050µs Pause, wiederholt das letzte Bit (repetition)&lt;br /&gt;
|-&lt;br /&gt;
| Trailer-Bit || 200µs Puls, 12300µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || 200µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || keine&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || N-fache Wiederholung des Original-Frames innerhalb von 100ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;FDC&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Pulse Distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 Start-Bit + 40 Daten-Bits + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 8 Adress-Bits + 12 x 0-Bits + 4 Press/Release-Bits + 8 Kommando-Bits + 8 invertierte Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 2085µs Puls, 966µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 300µs Puls,  220µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 300µs Puls, 715µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || 300µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || keine&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Drücken || Press/Release-Bits = 0000&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Loslassen || Press/Release-Bits = 1111&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || Wiederholung nach Pause von 60ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;RCCAR&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Pulse Distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 Start-Bit + 13 Daten-Bits + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten || C0 C1 A0 A1 D0 D1 D2 D3 D4 D5 D6 D7 V&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 2000µs Puls, 2000µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 600µs Puls,  900µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 600µs Puls, 450µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || 600µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || keine&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || keine?&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Bi-Phase Protokolle ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;RC5 + RC5X&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 36 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Bi-Phase (Manchester)&lt;br /&gt;
|-&lt;br /&gt;
| Frame RC5 || 2 Start-Bits + 12 Daten-Bits + 0 Stop-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Daten RC5 || 1 Toggle-Bit + 5 Adress-Bits + 6 Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Frame RC5X || 1 Start-Bit + 13 Daten-Bits + 0 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten RC5X || 1 invertiertes Kommando-Bit + 1 Toggle-Bit + 5 Adress-Bits + 6 Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 889µs Pause, 889µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 889µs Puls, 889µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 889µs Pause, 889µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || kein Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || keine&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || N-fache Wiederholung des Original-Frames innerhalb von 100ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;RC6&#039;&#039;&#039; + &#039;&#039;&#039;RC6A&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 36 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Bi-Phase (Manchester)&lt;br /&gt;
|-&lt;br /&gt;
| Frame RC6 || 1 Start-Bit + 1 Bit &amp;quot;1&amp;quot; + 3 Mode-Bits (000) + 1 Toggle-Bit + 16 Daten-Bits + 2666µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Frame RC6A || 1 Start-Bit + 1 Bit &amp;quot;1&amp;quot; + 3 Mode-Bits (110) + 1 Toggle-Bit + 31 Daten-Bits + 2666µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Daten RC6 || 8 Adress-Bits + 8 Kommando Bits&lt;br /&gt;
|-&lt;br /&gt;
| Daten RC6A || &amp;quot;1&amp;quot; + 14 Hersteller-Bits + 8 System-Bits + 8 Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 2666µs Puls, 889µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Toggle 0-Bit || 889µs Pause, 889µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| Toggle 1-Bit || 889µs Puls, 889µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 444µs Pause, 444µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 444µs Puls, 444µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || kein Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || keine&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || N-fache Wiederholung des Original-Frames innerhalb von 100ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;GRUNDIG + NOKIA&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 38 kHz (?)&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Bi-Phase (Manchester)&lt;br /&gt;
|-&lt;br /&gt;
| Frame-Paket || 1 Start-Frame + 19,968ms Pause + N Info-Frames + 117,76ms Pause + 1 Stop-Frame&lt;br /&gt;
|-&lt;br /&gt;
| Start-Frame || 1 Pre-Bit + 1 Start-Bit + 9 Daten-Bits (alle 1) + 0 Stop-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Info-Frame || 1 Pre-Bit + 1 Start-Bit + 9 Daten-Bits + 0 Stop-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Frame || 1 Pre-Bit + 1 Start-Bit + 9 Daten-Bits (alle 1) + 0 Stop-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Daten Grundig || 9 Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Daten Nokia || 8 Kommando-Bits + 8 Address-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Pre-Bit || 528µs Puls, 2639µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 528µs Puls, 528µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 528µs Pause, 528µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 528µs Puls, 528µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || kein Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || keine&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || N-fache Wiederholung des Info-Frames mit einem Pausenabstand von 117,76ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;SIEMENS + RUWIDO&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 36 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Bi-Phase (Manchester)&lt;br /&gt;
|-&lt;br /&gt;
| Frame Siemens || 1 Start-Bit + 22 Daten-Bits + 0 Stop-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Frame Ruwido || 1 Start-Bit + 17 Daten-Bits + 0 Stop-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Daten Siemens || 11 Adress-Bits + 10 Daten-Bits + 1 invertiertes Bit (letztes Bit davor nochmal invertiert)&lt;br /&gt;
|-&lt;br /&gt;
| Daten Ruwido || 9 Adress-Bits + 7 Daten-Bits + 1 invertiertes Bit (letztes Bit davor nochmal invertiert)&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 275µs Puls, 275µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 275µs Pause, 275µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 275µs Puls, 275µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || kein Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || 1-malige Wiederholung mit gesetztem Repeat-Bit (?)&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || N-fache Wiederholung des Original-Frames innerhalb von 100ms (?)&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Serial Protokolle ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;NETBOX&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Serial&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 Start-Bit + 16 Daten-Bits, kein Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 3 Adress-Bits + 13 Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 2400µs Puls, 800µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Bitlänge || 800µs&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || keine&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || Abstand ca. 35ms?&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Software-Historie IRMP ==&lt;br /&gt;
&lt;br /&gt;
Änderungen IRMP:&lt;br /&gt;
&lt;br /&gt;
Version 2.0.1:&lt;br /&gt;
&lt;br /&gt;
* 20.09.2011: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: KATHREIN&lt;br /&gt;
* 20.09.2011: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: RUWIDO&lt;br /&gt;
* 20.09.2011: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: THOMSON&lt;br /&gt;
* 20.09.2011: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: IR60&lt;br /&gt;
* 20.09.2011: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: LEGO&lt;br /&gt;
* 20.09.2011: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: NEC16&lt;br /&gt;
* 20.09.2011: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: NEC42&lt;br /&gt;
* 20.09.2011: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: NETBOX&lt;br /&gt;
* 20.09.2011: Portierung auf ATtiny84 und ATtiny85&lt;br /&gt;
* 20.09.2011: Verbesserung von Tastenwiederholungen bei RC5&lt;br /&gt;
* 20.09.2011: Verbessertes Decodieren von Bi-Phase-Protokollen&lt;br /&gt;
* 20.09.2011: Korrekturen am RECS80-Decoder&lt;br /&gt;
* 20.09.2011: Korrekturen beim Erkennen von zusätzlichen Bits im SIRCS-Protocol&lt;br /&gt;
&lt;br /&gt;
Ältere Versionen:&lt;br /&gt;
&lt;br /&gt;
* 18.01.2011: Korrekturen für Siemens-Protokoll&lt;br /&gt;
* 18.01.2011: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: NIKON&lt;br /&gt;
* 18.01.2011: Speichern der zusätzlichen Bits (&amp;gt;12) im SIRCS-Protokoll in der Adresse&lt;br /&gt;
* 18.01.2011: Timing-Korrekturen für Denon-Protokoll&lt;br /&gt;
&lt;br /&gt;
* 04.09.2010: Bugfix für F_INTERRUPTS &amp;gt;= 16000&lt;br /&gt;
&lt;br /&gt;
* 02.09.2010: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: RC6A&lt;br /&gt;
&lt;br /&gt;
* 29.08.2010: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: JVC&lt;br /&gt;
* 29.08.2010: Kaseikyo-Protokoll: Berücksichtigung der Genre-Bits. &#039;&#039;&#039;ACHTUNG: dadurch neue Command-Codes!&#039;&#039;&#039;&lt;br /&gt;
* 29.08.2010: Kaseikyo-Protokoll: Verbesserte Behandlung von Wiederholungs-Frames&lt;br /&gt;
* 29.08.2010: Verbesserte Unterstützung des APPLE-Protokolls. &#039;&#039;&#039;ACHTUNG: dadurch neue Adress-Codes!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* 01.07.2010: Bugfix: Einführen eines Timeouts für NEC-Repetition-Frames, um &amp;quot;Geisterkommandos&amp;quot; zu verhindern.&lt;br /&gt;
&lt;br /&gt;
* 26.06.2010: Bugfix: Deaktivieren von RECS80, RECS80EXT &amp;amp; SIEMENS bei geringer Interrupt-Rate&lt;br /&gt;
&lt;br /&gt;
* 25.06.2010: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: RCCAR&lt;br /&gt;
* 25.06.2010: Tastenerkennung für FDC-Protokoll (IR-keyboard) erweitert&lt;br /&gt;
* 25.06.2010: Interrupt-Frequenz nun bis zu 20kHz möglich&lt;br /&gt;
&lt;br /&gt;
* 09.06.2010: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: FDC (IR-keyboard)&lt;br /&gt;
* 09.06.2010: Timing für DENON-Protokoll korrigiert&lt;br /&gt;
&lt;br /&gt;
* 02.06.2010: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: Siemens (Gigaset)&lt;br /&gt;
&lt;br /&gt;
* 26.05.2010: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: Nokia&lt;br /&gt;
* 26.05.2010: Bugfix Auswertung von langen Tastendrücken bei Grundig-Protokoll&lt;br /&gt;
&lt;br /&gt;
* 17.05.2010: Bugfix SAMSUNG32-Protokoll: Kommando-Bit-Maske korrigiert&lt;br /&gt;
&lt;br /&gt;
* 16.05.2010: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: Grundig&lt;br /&gt;
* 16.05.2010: Behandlung von automatischen Frame-Wiederholungen beim SIRCS-, SAMSUNG32- und NUBERT-Protokoll verbessert.&lt;br /&gt;
&lt;br /&gt;
* 28.04.2010: Nur einige kosmetische Code-Optimierungen&lt;br /&gt;
&lt;br /&gt;
* 16.04.2010: Sämtliche Timing-Toleranzen angepasst/optimiert&lt;br /&gt;
&lt;br /&gt;
* 12.04.2010: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: Bang &amp;amp; Olufsen&lt;br /&gt;
&lt;br /&gt;
* 29.03.2010: Bugfix beim Erkennen von mehrfachen NEC-Repetition-Frames&lt;br /&gt;
* 29.03.2010: Konfiguration in irmpconfig.h ausgelagert&lt;br /&gt;
* 29.03.2010: Einführung einer Programmversion in README.txt: Version 1.0&lt;br /&gt;
&lt;br /&gt;
* 17.03.2010: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: Nubert&lt;br /&gt;
&lt;br /&gt;
* 16.03.2010: Korrektur der RECS80-Startbit-Timings&lt;br /&gt;
* 16.03.2010: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: RECS80 Extended&lt;br /&gt;
&lt;br /&gt;
* 15.03.2010: Codeoptimierung&lt;br /&gt;
&lt;br /&gt;
* 14.03.2010: Portierung auf PIC&lt;br /&gt;
&lt;br /&gt;
* 11.03.2010: Anpassungen an verschiedene ATMega-Typen durchgeführt&lt;br /&gt;
&lt;br /&gt;
* 07.03.2010: Bugfix: Zurücksetzen der Statemachine nach einem unvollständigen RC5-Frame&lt;br /&gt;
&lt;br /&gt;
* 05.03.2010: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: Apple&lt;br /&gt;
* 05.03.2010: Die Daten irmp_data.addr + irmp_data.command werden nun in der jeweiligen Bit-Order des verwendeten Protokolls gespeichert&lt;br /&gt;
&lt;br /&gt;
* 04.03.2010: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: SAMSUNG32 (Mix aus SAMSUNG &amp;amp; NEC-Protokoll)&lt;br /&gt;
* 04.03.2010: Änderung der SIRCS- und Kaseikyo-Toleranzen&lt;br /&gt;
&lt;br /&gt;
* 02.03.2010: SIRCS: Korrekte Erkennung und Unterdrückung von automatischen Frame-Wiederholungen&lt;br /&gt;
* 02.03.2010: SIRCS: Device-ID-Bits werden nun in irmp_data.command und nicht mehr in irmp_data.address gespeichert&lt;br /&gt;
* 02.03.2010: Vergrößerung des Scan Buffers (zwecks Protokollierung)&lt;br /&gt;
&lt;br /&gt;
* 24.02.2010: Neue Variable flags in IRMP_DATA zur Erkennung von langen Tastendrücken&lt;br /&gt;
&lt;br /&gt;
* 20.02.2010: Bugfix Denon-Protokoll: Wiederholungsframe grundsätzlich invertiert&lt;br /&gt;
&lt;br /&gt;
* 19.02.2010: Erkennung von NEC-Protokoll-Varianten, z.&amp;amp;nbsp;B. Apple-Fernbedienung&lt;br /&gt;
* 19.02.2010: Erkennung von RC6- und Denon-Protokoll&lt;br /&gt;
* 19.02.2010: Verbesserung des RC5-Decoders (Bugfixes)&lt;br /&gt;
&lt;br /&gt;
* 13.02.2010: Bugfix: Puls/Pausen-Counter um 1 zu niedrig, nun bessere Erkennung bei Protokollen mit sehr kurzen Pulszeiten&lt;br /&gt;
* 13.02.2010: Erkennung der NEC-Wiederholungssequenz&lt;br /&gt;
&lt;br /&gt;
* 12.02.2010: RC5-Protokoll-Decoder hinzugefügt&lt;br /&gt;
&lt;br /&gt;
* 05.02.2010: Konflikt zwischen Samsung- und Matsushita-Protokoll beseitigt&lt;br /&gt;
&lt;br /&gt;
* 07.01.2010: Erste Version&lt;br /&gt;
&lt;br /&gt;
== Software-Historie IRSND ==&lt;br /&gt;
&lt;br /&gt;
Änderungen IRSND:&lt;br /&gt;
&lt;br /&gt;
Version 2.0.1:&lt;br /&gt;
&lt;br /&gt;
* 20.09.2011: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: THOMSON&lt;br /&gt;
* 20.09.2011: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: LEGO&lt;br /&gt;
* 20.09.2011: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: NEC16&lt;br /&gt;
* 20.09.2011: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: NEC42&lt;br /&gt;
* 20.09.2011: Portierung auf ATtiny84 und ATtiny85&lt;br /&gt;
* 20.09.2011: Korrektur von Pausenlängen&lt;br /&gt;
* 20.09.2011: Korrekturen von irsnd_stop()&lt;br /&gt;
* 20.09.2011: Korrektur des SIEMENS-Timings&lt;br /&gt;
* 20.09.2011: Umstellung auf 36kHz Modulationsfrequenz für DENON-Protokoll&lt;br /&gt;
* 20.09.2011: Korrektur Behandlung zusätzlicher Bits im SIRCS Protokoll&lt;br /&gt;
&lt;br /&gt;
Ältere Versionen:&lt;br /&gt;
&lt;br /&gt;
* 18.01.2011: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: RC6A&lt;br /&gt;
* 18.01.2011: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: RC6&lt;br /&gt;
* 18.01.2011: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: NIKON&lt;br /&gt;
* 18.01.2011: Beachten der zusätzlichen Bits (&amp;gt;12) im SIRCS-Protokoll&lt;br /&gt;
* 18.01.2011: Korrektur der Pausenlängen&lt;br /&gt;
* 18.01.2011: Timing-Korrekturen für Denon-Protokoll&lt;br /&gt;
&lt;br /&gt;
* 02.09.2010: Neues Protokoll: JVC&lt;br /&gt;
* 02.09.2010: Anpassung des APPLE-Encoders an IRMP-Version 1.7.3.&lt;br /&gt;
&lt;br /&gt;
* 29.08.2010: Neues Protokoll: Kaseikyo (Panasonic u.a.)&lt;br /&gt;
&lt;br /&gt;
* 01.07.2010: Bugfix: Deaktivieren von RECS80, RECS80EXT &amp;amp; SIEMENS bei geringer Interrupt-Rate&lt;br /&gt;
&lt;br /&gt;
* 25.06.2010: Neues Protokoll: RCCAR&lt;br /&gt;
&lt;br /&gt;
* 09.06.2010: Neues Protokoll: FDC (IR-keyboard)&lt;br /&gt;
* 09.06.2010: Timing für DENON-Protokoll korrigiert&lt;br /&gt;
&lt;br /&gt;
* 02.06.2010: Neues Protokoll: Siemens (Gigaset)&lt;br /&gt;
* 02.06.2010: Simulation von langen Tastendrücken&lt;br /&gt;
&lt;br /&gt;
* 26.05.2010: Neues Protokoll: Nokia&lt;br /&gt;
&lt;br /&gt;
* 17.05.2010: Neues Protokoll: Grundig&lt;br /&gt;
* 17.05.2010: Behandlung von Frame-Wiederholungen für SIRCS, SAMSUNG32 und NUBERT korrigiert&lt;br /&gt;
&lt;br /&gt;
* 28.04.2010: Unterstützung des APPLE-Protokolls&lt;br /&gt;
* 28.04.2010: Konfiguration über irmpconfig.h&lt;br /&gt;
&lt;br /&gt;
* 16.04.2010: Sämtliche Timing-Toleranzen angepasst/optimiert&lt;br /&gt;
&lt;br /&gt;
* 14.04.2010: Neues Protokoll: Bang &amp;amp; Olufsen&lt;br /&gt;
&lt;br /&gt;
* 17.03.2010: Neues Protokoll: Nubert&lt;br /&gt;
* 17.03.2010: Korrektur der Pausen zwischen Frame-Wiederholungen&lt;br /&gt;
&lt;br /&gt;
* 16.03.2010: Korrektur des Timer-Registers TCCR2&lt;br /&gt;
* 16.03.2010: Korrektur der RECS80-Startbit-Timings&lt;br /&gt;
* 16.03.2010: Neues Protokoll: RECS80 Extended &lt;br /&gt;
&lt;br /&gt;
* 11.03.2010: Anpassungen an verschiedene ATMega-Typen durchgeführt&lt;br /&gt;
&lt;br /&gt;
* 07.03.2010: Alpha-Version&lt;br /&gt;
&lt;br /&gt;
== Literatur ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; IR-Übersicht &#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* http://www.epanorama.net/links/irremote.html&lt;br /&gt;
* http://www.elektor.de/jahrgang/2008/juni/cc2-avr-projekt-%283%29-unsichtbare-kommandos.497184.lynkx?tab=4 (IR Übersicht &amp;amp; RC5)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SIRCS-Protokoll&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* http://www.sbprojects.com/knowledge/ir/sirc.htm&lt;br /&gt;
* http://www.ustr.net/infrared/sony.shtml&lt;br /&gt;
* http://users.telenet.be/davshomepage/sony.htm&lt;br /&gt;
* http://picprojects.org.uk/projects/sirc/&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;NEC-Protokoll:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* http://www.sbprojects.com/knowledge/ir/nec.htm&lt;br /&gt;
* http://www.ustr.net/infrared/nec.shtml&lt;br /&gt;
* http://www.celadon.com/infrared_protocol/infrared_protocols_samples.pdf&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;NEC16-Protokoll (JVC):&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* http://www.ustr.net/infrared/jvc.shtml&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SAMSUNG-Protokoll:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
(wurde aus diversen Protokollen (Daewoo u.ä.) zusammengereimt, daher kein direkter Link auf irgendwelche SAMSUNG-Dokumentation verfügbar)&lt;br /&gt;
&lt;br /&gt;
Hier ein Link zum Daewoo-Protokoll, welches dasselbe Prinzip des Sync-Bits in der Mitte eines Frames nutzt, jedoch mit anderen Timing-Werten arbeitet:&lt;br /&gt;
&lt;br /&gt;
* http://users.telenet.be/davshomepage/daewoo.htm&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MATSUHITA-Protokoll:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* http://www.celadon.com/infrared_protocol/infrared_protocols_samples.pdf&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KASEIKYO-Protokoll (auch &amp;quot;Japan-Protokoll&amp;quot;):&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* http://www.mikrocontroller.net/attachment/4246/IR-Protokolle_Diplomarbeit.pdf&lt;br /&gt;
* http://www.roboternetz.de/phpBB2/files/entwicklung_und_realisierung_einer_universalinfrarotfernbedienung_mit_timerfunktionen.pdf&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RECS80- und RECS80-Extended-Protokoll:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* http://www.sbprojects.com/knowledge/ir/recs80.htm&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RC5- und RC5x-Protokoll:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* http://www.sbprojects.com/knowledge/ir/rc5.htm&lt;br /&gt;
* http://users.telenet.be/davshomepage/rc5.htm&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Denon-Protokoll:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* http://www.mikrocontroller.com/de/IR-Protokolle.php#DENON&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RC6 und RC6A-Protokoll:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* http://www.sbprojects.com/knowledge/ir/rc6.htm&lt;br /&gt;
* http://slycontrol.ru/scr/kb/rc6.htm&lt;br /&gt;
* http://www.picbasic.nl/info_rc6_uk.htm&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bang &amp;amp; Olufsen:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* http://www.mikrocontroller.net/attachment/33137/datalink.pdf&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Grundig&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* http://www.mikrocontroller.net/attachment/77507/Grundig_10bit.pdf&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nokia&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* http://www.sbprojects.com/knowledge/ir/nrc17.htm&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Diverse Protokolle:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* http://www.mikrocontroller.net/attachment/4246/IR-Protokolle_Diplomarbeit.pdf&lt;br /&gt;
* http://www.celadon.com/infrared_protocol/infrared_protocols_samples.pdf&lt;br /&gt;
* http://www.opendcc.de/info/rc5/rc5.html&lt;br /&gt;
* http://www.roboternetz.de/phpBB2/files/entwicklung_und_realisierung_einer_universalinfrarotfernbedienung_mit_timerfunktionen.pdf&lt;br /&gt;
&lt;br /&gt;
== Hardware / IRMP-Projekte ==&lt;br /&gt;
&lt;br /&gt;
Eine Implementierung auf Basis IRMP und IRSND als Multiprotokoll Dekoder mit LCD&lt;br /&gt;
von Klaus Leidinger: &lt;br /&gt;
* http://www.mikrocontroller-projekte.de/Mikrocontroller/index.html&lt;br /&gt;
&lt;br /&gt;
Ähnliche Implementierung wie von Klaus Leidinger für Pollin AVR-NET-IO mit Pollin ADD-ON Board:&lt;br /&gt;
* http://son.ffdf-clan.de/include.php?path=forumsthread&amp;amp;threadid=703&lt;br /&gt;
&lt;br /&gt;
USB IR Remote Receiver von Hugo Portisch:&lt;br /&gt;
* http://www.mikrocontroller.net/articles/USB_IR_Remote_Receiver&lt;br /&gt;
&lt;br /&gt;
Servo-gesteuerter IR Sender mit Anlernfunktion von Stefan Pendsa:&lt;br /&gt;
* http://forum.mikrokopter.de/topic-21060.html&lt;br /&gt;
* (SVN) http://svn.mikrokopter.de/listing.php?repname=Projects&amp;amp;path=%2FServo-Controlled+IR-Transmitter%2F&amp;amp;#Ad2417800d6aa14bf08c571a896e9def7&lt;br /&gt;
&lt;br /&gt;
Lernfähige IR-Fernbedienung von Robert und Frank M.&lt;br /&gt;
* http://www.mikrocontroller.net/articles/DIY_Lernfähige_Fernbedienung_mit_IRMP&lt;br /&gt;
&lt;br /&gt;
== Danksagung ==&lt;br /&gt;
&lt;br /&gt;
Ganz herzlich bedanken möchte ich mich bei Vlad Tepesch, Klaus Leidinger und Peter K., die mich mit Scan-Dateien ihrer Infrarot-Fernbedienungen versorgt haben. Dank auch an Klaus für seine nächtelangen Tests von IRMP &amp;amp; IRSND.&lt;br /&gt;
&lt;br /&gt;
Ebenso bedanken möchte ich mich bei Christian F. für seine Tipps zur PIC-Portierung.&lt;br /&gt;
&lt;br /&gt;
== Diskussion ==&lt;br /&gt;
&lt;br /&gt;
Meinungen, Verbesserungsvorschläge, harsche Kritik und ähnliches kann im [http://www.mikrocontroller.net/topic/162119 Beitrag: Infrared Multi Protocol Decoder] geäussert werden.&lt;br /&gt;
&lt;br /&gt;
Viel Spaß mit IRMP!&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Datenübertragung]]&lt;br /&gt;
[[Kategorie:AVR-Projekte]]&lt;/div&gt;</summary>
		<author><name>Shortie</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=IRMP&amp;diff=63224</id>
		<title>IRMP</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=IRMP&amp;diff=63224"/>
		<updated>2012-01-09T21:47:03Z</updated>

		<summary type="html">&lt;p&gt;Shortie: /* Fernbedienungen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Von &#039;&#039;&#039;Frank M. ([http://www.mikrocontroller.net/user/show/ukw ukw])&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= IRMP - Infrarot-Multiprotokoll-Decoder =&lt;br /&gt;
&lt;br /&gt;
[[Datei:irmp-title.png| |Scan eines NEC-kompatiblen Fernbedienungssignals]]&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
[[Datei:IRMP-TSOP1736.png|miniatur|Anschluß eines IR-Empfängers an µC]]&lt;br /&gt;
&lt;br /&gt;
Da RC5 nicht nur veraltet, sondern mittlerweile obsolet ist und immer mehr die elektronischen Geräte der fernöstlichen Unterhaltungsindustrie in unseren Haushalten Einzug finden, ist es an der Zeit, einen IR-Decoder zu entwickeln, der ca. 90% aller bei uns im täglichen Leben zu findenden IR-Fernbedienungen &amp;quot;versteht&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
IRMP ist lauffähig auf folgenden AVR µCs:&lt;br /&gt;
&lt;br /&gt;
* ATtiny45,  ATtiny85&lt;br /&gt;
* ATtiny84&lt;br /&gt;
* ATmega8,   ATmega16,  ATmega32&lt;br /&gt;
* ATmega162&lt;br /&gt;
* ATmega164, ATmega324, ATmega644,  ATmega644P, ATmega1284&lt;br /&gt;
* ATmega88,  ATmega88P, ATmega168,  ATmega168P, ATmega328P&lt;br /&gt;
&lt;br /&gt;
Es gibt aber auch Portierungen auf diverse PIC µCs.&lt;br /&gt;
&lt;br /&gt;
IRMP - der Infrarot-Fernbedienungsdecoder, der mehrere Protokolle auf einmal decodieren kann, beherrscht folgende Protokolle:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Protokoll || Hersteller&lt;br /&gt;
|-&lt;br /&gt;
| SIRCS || Sony&lt;br /&gt;
|-&lt;br /&gt;
| NEC || NEC, Yamaha, Canon, Tevion, Harman/Kardon, Hitachi, JVC, Pioneer, Toshiba, Xoro, Orion, NoName und viele weitere japanische Hersteller.&lt;br /&gt;
|-&lt;br /&gt;
| SAMSUNG || Samsung&lt;br /&gt;
|-&lt;br /&gt;
| SAMSUNG32 || Samsung&lt;br /&gt;
|-&lt;br /&gt;
| MATSUSHITA || Matsushita&lt;br /&gt;
|-&lt;br /&gt;
| KASEIKYO || Panasonic, Technics, Denon und andere japanische Hersteller, welche Mitglied der &amp;quot;Japan&#039;s Association for Electric Home Application&amp;quot; sind.&lt;br /&gt;
|-&lt;br /&gt;
| RECS80 || Philips, Nokia, Thomson, Nordmende, Telefunken, Saba&lt;br /&gt;
|-&lt;br /&gt;
| RECS80EXT || Philips, Technisat, Thomson, Nordmende, Telefunken, Saba&lt;br /&gt;
|-&lt;br /&gt;
| RC5 || Philips und andere europäische Hersteller&lt;br /&gt;
|-&lt;br /&gt;
| DENON || Denon, Sharp&lt;br /&gt;
|-&lt;br /&gt;
| RC6 || Philips und andere europäische Hersteller&lt;br /&gt;
|-&lt;br /&gt;
| RC6A || Philips, Kathrein und andere Hersteller, z.B. XBOX&lt;br /&gt;
|-&lt;br /&gt;
| APPLE || Apple&lt;br /&gt;
|-&lt;br /&gt;
| NUBERT || Nubert, z.B. Subwoofer System&lt;br /&gt;
|-&lt;br /&gt;
| B&amp;amp;O || Bang &amp;amp; Olufsen&lt;br /&gt;
|-&lt;br /&gt;
| GRUNDIG || Grundig&lt;br /&gt;
|-&lt;br /&gt;
| NOKIA || Nokia, z.B. D-Box&lt;br /&gt;
|-&lt;br /&gt;
| SIEMENS || Siemens, z.B. Gigaset M740AV (ab ~15kHz, siehe Bemerkungen zu F_INTERRUPTS)&lt;br /&gt;
|-&lt;br /&gt;
| FDC || FDC Keyboard (ab ~15kHz)&lt;br /&gt;
|-&lt;br /&gt;
| RCCAR || RC Car: IR Fernbedienung für Modellfahrzeuge&lt;br /&gt;
|-&lt;br /&gt;
| JVC || JVC&lt;br /&gt;
|-&lt;br /&gt;
| NIKON || NIKON&lt;br /&gt;
|-&lt;br /&gt;
| RUWIDO || RUWIDO (z.B. T-Home-Mediareceiver)&lt;br /&gt;
|-&lt;br /&gt;
| KATHREIN  || KATHREIN&lt;br /&gt;
|-&lt;br /&gt;
| NEC16  || JVC&lt;br /&gt;
|-&lt;br /&gt;
| NEC42  || JVC&lt;br /&gt;
|-&lt;br /&gt;
| LEGO   || Lego&lt;br /&gt;
|-&lt;br /&gt;
| THOMSON || Thomson&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Jedes dieser Protokolle ist einzeln aktivierbar. Wer möchte, kann alle Protokolle aktivieren. Wer nur ein Protokoll braucht, kann alle anderen deaktivieren. Es wird nur das vom Compiler übersetzt, was auch benötigt wird.&lt;br /&gt;
&lt;br /&gt;
Der auf AVR- und PIC-µCs einsetzbare Source zu IRMP entstand im Rahmen des [[Word Clock]] Projektes.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anlass für einen eigenen IRMP-Artikel ist folgender Thread in der Codesammlung: [http://www.mikrocontroller.net/topic/162119 Beitrag: IRMP - Infrared Multi Protocol Decoder]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Protokolle ==&lt;br /&gt;
&lt;br /&gt;
[[Datei:nec-protocol.png|miniatur|NEC-Protokoll, Reichelt RGB-LED-Fernbedienung, T-&amp;gt;A: 9,14ms, A-&amp;gt;B: 4,42ms, B-&amp;gt;C: 660us]]&lt;br /&gt;
&lt;br /&gt;
Einige Hersteller verwenden ihr eigenes Protokoll, dazu gehören u.a. Sony, Samsung und Matsushita. Philips hat RC5 entwickelt und natürlich auch selbst benutzt. RC5 galt damals in Europa als &#039;&#039;das&#039;&#039; Standard-IR-Protokoll, welches von vielen europäischen Herstellern übernommen wurde. Mittlerweile ist RC5 fast gar nicht mehr anzutreffen - man kann es eigentlich als &amp;quot;ausgestorben&amp;quot; abhaken.&lt;br /&gt;
&lt;br /&gt;
Auch die japanischen Hersteller haben versucht, einen eigenen Standard zu etablieren, nämlich das sog. Kaseikyo- (oder auch &amp;quot;Japan-&amp;quot;) Protokoll. Dieses ist mit einer Bitlänge von 48 sehr universell und allgemein verwendbar. Richtig durchgesetzt hat es sich aber bis heute nicht. Ich selbst habe jedenfalls noch keine einzige Fernbedienung gesehen, die das Kaseikyo-Protokoll nutzt.&lt;br /&gt;
&lt;br /&gt;
Heutzutage wird vornehmlich das NEC-Protokoll verwendet - und zwar von den unterschiedlichsten (Marken- und auch Noname-)Herstellern. Ich schätze den &amp;quot;Marktanteil&amp;quot; auf ca. 80% beim NEC-Protokoll. Fast alle Fernbedienungen im alltäglichen Einsatz verwenden bei mir den NEC-IR-Code. Das fängt beim Fernseher an, geht über vom DVD-Player zur Notebook-Fernbedienung und reicht bis zur Noname-MultiMedia-Festplatte - um nur einige Beispiele zu nennen.&lt;br /&gt;
&lt;br /&gt;
Die von IRMP decodierten Protokolle haben etwas gemeinsames: Sie weisen alle ein Start-Bit auf, welches vom Timing her ausgezeichnet, d.h. einmalig ist.&lt;br /&gt;
&lt;br /&gt;
Anhand dieses Start-Bit-Timings werden die verschiedenen Protokolle unterschieden. IRMP misst also das Timing des Start-Bits und stellt dann &amp;quot;on-thy-fly&amp;quot; seine Timingtabellen auf das erkannte Protokoll um, damit die nach dem Start-Bit gesandten Daten in einem Rutsch eingelesen werden können, ohne das komplette Telegramm (Frame) erst speichern zu müssen.&lt;br /&gt;
&lt;br /&gt;
IRMP unterstützt folgende IR-Codings:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Pulse Distance&#039;&#039;&#039;, typ. Beispiel: NEC, Sony&lt;br /&gt;
* &#039;&#039;&#039;Bi-Phase&#039;&#039;&#039; (Manchester), typ. Beispiel: RC5, RC6&lt;br /&gt;
* &#039;&#039;&#039;Serial&#039;&#039;&#039; (ab 1.9.5), typ. Beispiel: Netbox&lt;br /&gt;
&lt;br /&gt;
Ein &#039;&#039;&#039;Puls-Distance-Protokoll&#039;&#039;&#039; erkennt man an folgenden Regeln:&lt;br /&gt;
&lt;br /&gt;
* es gibt nur &#039;&#039;&#039;eine Pulslänge&#039;&#039;&#039; und &#039;&#039;&#039;zwei verschiedene Pausenlängen&#039;&#039;&#039; oder&lt;br /&gt;
  &lt;br /&gt;
* es gibt &#039;&#039;&#039;zwei verschiedene Pulslängen&#039;&#039;&#039; und nur &#039;&#039;&#039;eine Pausenlänge&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ein &#039;&#039;&#039;Bi-Phase-Protokoll&#039;&#039;&#039; erkennt man an:&lt;br /&gt;
&lt;br /&gt;
* es kommen genau &#039;&#039;&#039;eine&#039;&#039;&#039; Pausen- und eine Pulslänge, sowie jeweils die &#039;&#039;&#039;doppelten&#039;&#039;&#039; Puls-/Pausenlängen vor&lt;br /&gt;
&lt;br /&gt;
Typisches Kriterium für ein &#039;&#039;&#039;bitserielles Protokoll&#039;&#039;&#039; ist:&lt;br /&gt;
&lt;br /&gt;
* es kommen &#039;&#039;&#039;Vielfache&#039;&#039;&#039; einer Grund-Puls-/Pausenlänge vor&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Eine tabellarische Aufstellung der verschiedenen IR-Protokolle findet man hier: [http://www.mikrocontroller.net/articles/IRMP#Die_IR-Protokolle_im_Detail Die IR-Protokolle im Detail].&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die angegebenen Timingwerte sind Idealwerte. Bei einigen Fernbedienungen in der Praxis weichen sie um bis zu 40% voneinander ab. Deshalb arbeitet IRMP mit Minimum-/Maximumsgrenzen, um bzgl. des Zeitverhaltens tolerabel zu sein.&lt;br /&gt;
&lt;br /&gt;
== Download ==&lt;br /&gt;
&lt;br /&gt;
Version 2.0.1, Stand vom 20.09.2011&lt;br /&gt;
&lt;br /&gt;
Download Release-Version: [http://www.mikrocontroller.net/wikifiles/7/79/Irmp.zip Irmp.zip] &lt;br /&gt;
&lt;br /&gt;
IRMP &amp;amp; IRSND sind nun auch über SVN abrufbar: [http://www.mikrocontroller.net/svnbrowser/irmp/ IRMP im SVN], Download [http://www.mikrocontroller.net/svnbrowser/irmp/?view=tar Tarball]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die Version im SVN kann eine Zwischen- oder Test-Version sein, die nicht den hier dokumentierten Stand widerspiegelt! Im Zweifel verwendet man besser den obigen Download-Link auf Irmp.zip.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die Software-Änderungen kann man sich hier anschauen: [http://www.mikrocontroller.net/articles/IRMP#Software-Historie_IRMP Software-Historie IRMP]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Source-Code ==&lt;br /&gt;
&lt;br /&gt;
Der Source-Code lässt sich einfach für AVR-µCs übersetzen, indem man die Projekt-Datei irmp.aps in den WinAVR lädt.&lt;br /&gt;
&lt;br /&gt;
Auch auf PIC-Prozessoren ist IRMP lauffähig. Für den PIC-CCS-Compiler sind entsprechende Preprocessor-Konstanten bereits gesetzt, so dass man irmp.c direkt in der CCS-Entwicklungsumgebung verwenden kann. Lediglich eine kleine Interrupt-Routine wie&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void  TIMER2_isr(void) &lt;br /&gt;
{&lt;br /&gt;
 irmp_ISR ();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ist hinzuzufügen, wobei man den Interrupt auf 66µs (also 15kHz) stellt. &lt;br /&gt;
&lt;br /&gt;
Für AVR-Prozessoren ist ein Beispiel für die Anwendung von IRMP in main.c zu finden - im wesentlichen geht es da um die Timer-Initialisierung und den Abruf der empfangenen IR-Telegramme.&lt;br /&gt;
&lt;br /&gt;
Die Konfiguration von IRMP wird über Parameter in irmpconfig.h vorgenommen, nämlich:&lt;br /&gt;
&lt;br /&gt;
* Anzahl Interrupts pro Sekunde&lt;br /&gt;
* Unterstützte IR-Protokolle&lt;br /&gt;
* Hardware-Pin zum IR-Empfänger&lt;br /&gt;
* IR-Logging&lt;br /&gt;
&lt;br /&gt;
=== Einstellungen in irmpconfig.h ===&lt;br /&gt;
&lt;br /&gt;
IRMP decodiert sämtliche oben aufgelisteten Protokolle in einer ISR, siehe irmpconfig.h. Dafür sind einige Angaben nötig. Diese werden in irmpconfig.h eingestellt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;F_INTERRUPTS&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Anzahl der Interrupts pro Sekunde. Der Wert kann zwischen 10000 und 20000 eingestellt werden.&lt;br /&gt;
&lt;br /&gt;
Standardwert:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#define F_INTERRUPTS                            15000      // interrupts per second&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMP_SUPPORT_xxx_PROTOCOL&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Hier lässt sich einstellen, welche Protokolle von IRMP unterstützt werden sollen. Die Standardprotokolle sind bereits aktiv. Möchte man weitere Protokolle einschalten bzw. einige aus Speicherplatzgründen deaktivieren, sind die entsprechenden Werte in irmpconfig.h anzupassen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
// typical protocols, disable here!             Enable  Remarks                 F_INTERRUPTS            Program Space&lt;br /&gt;
#define IRMP_SUPPORT_SIRCS_PROTOCOL             1       // Sony SIRCS           &amp;gt;= 10000                 ~150 bytes&lt;br /&gt;
#define IRMP_SUPPORT_NEC_PROTOCOL               1       // NEC + APPLE          &amp;gt;= 10000                 ~300 bytes&lt;br /&gt;
#define IRMP_SUPPORT_SAMSUNG_PROTOCOL           1       // Samsung + Samsung32  &amp;gt;= 10000                 ~300 bytes&lt;br /&gt;
#define IRMP_SUPPORT_MATSUSHITA_PROTOCOL        1       // Matsushita           &amp;gt;= 10000                  ~50 bytes&lt;br /&gt;
#define IRMP_SUPPORT_KASEIKYO_PROTOCOL          1       // Kaseikyo             &amp;gt;= 10000                 ~250 bytes&lt;br /&gt;
#define IRMP_SUPPORT_DENON_PROTOCOL             1       // DENON, Sharp         &amp;gt;= 10000                 ~250 bytes&lt;br /&gt;
&lt;br /&gt;
// more protocols, enable here!                 Enable  Remarks                 F_INTERRUPTS            Program Space&lt;br /&gt;
#define IRMP_SUPPORT_RC5_PROTOCOL               0       // RC5                  &amp;gt;= 10000                 ~250 bytes&lt;br /&gt;
#define IRMP_SUPPORT_RC6_PROTOCOL               0       // RC6 &amp;amp; RC6A           &amp;gt;= 10000                 ~250 bytes&lt;br /&gt;
#define IRMP_SUPPORT_JVC_PROTOCOL               0       // JVC                  &amp;gt;= 10000                 ~150 bytes&lt;br /&gt;
#define IRMP_SUPPORT_NEC16_PROTOCOL             0       // NEC16                &amp;gt;= 10000                 ~100 bytes&lt;br /&gt;
#define IRMP_SUPPORT_NEC42_PROTOCOL             0       // NEC42                &amp;gt;= 10000                 ~300 bytes&lt;br /&gt;
#define IRMP_SUPPORT_IR60_PROTOCOL              0       // IR60 (SAB2008)       &amp;gt;= 10000                 ~300 bytes&lt;br /&gt;
#define IRMP_SUPPORT_GRUNDIG_PROTOCOL           0       // Grundig              &amp;gt;= 10000                 ~300 bytes&lt;br /&gt;
#define IRMP_SUPPORT_SIEMENS_PROTOCOL           0       // Siemens Gigaset      &amp;gt;= 15000                 ~550 bytes&lt;br /&gt;
#define IRMP_SUPPORT_NOKIA_PROTOCOL             0       // Nokia                &amp;gt;= 10000                 ~300 bytes&lt;br /&gt;
&lt;br /&gt;
// exotic protocols, enable here!               Enable  Remarks                 F_INTERRUPTS            Program Space&lt;br /&gt;
#define IRMP_SUPPORT_KATHREIN_PROTOCOL          0       // Kathrein             &amp;gt;= 10000                 ~200 bytes&lt;br /&gt;
#define IRMP_SUPPORT_NUBERT_PROTOCOL            0       // NUBERT               &amp;gt;= 10000                  ~50 bytes&lt;br /&gt;
#define IRMP_SUPPORT_BANG_OLUFSEN_PROTOCOL      0       // Bang &amp;amp; Olufsen       &amp;gt;= 10000                 ~200 bytes&lt;br /&gt;
#define IRMP_SUPPORT_RECS80_PROTOCOL            0       // RECS80 (SAA3004)     &amp;gt;= 15000                  ~50 bytes&lt;br /&gt;
#define IRMP_SUPPORT_RECS80EXT_PROTOCOL         0       // RECS80EXT (SAA3008)  &amp;gt;= 15000                  ~50 bytes&lt;br /&gt;
#define IRMP_SUPPORT_THOMSON_PROTOCOL           0       // Thomson              &amp;gt;= 10000                 ~250 bytes&lt;br /&gt;
#define IRMP_SUPPORT_NIKON_PROTOCOL             0       // NIKON camera         &amp;gt;= 10000                 ~250 bytes&lt;br /&gt;
#define IRMP_SUPPORT_NETBOX_PROTOCOL            0       // Netbox keyboard      &amp;gt;= 10000                 ~400 bytes (PROTOTYPE!)&lt;br /&gt;
#define IRMP_SUPPORT_FDC_PROTOCOL               0       // FDC3402 keyboard     &amp;gt;= 10000 (better 15000)  ~150 bytes (~400 in combination with RC5)&lt;br /&gt;
#define IRMP_SUPPORT_RCCAR_PROTOCOL             0       // RC Car               &amp;gt;= 10000 (better 15000)  ~150 bytes (~500 in combination with RC5)&lt;br /&gt;
#define IRMP_SUPPORT_RUWIDO_PROTOCOL            0       // RUWIDO, T-Home       &amp;gt;= 15000                 ~550 bytes&lt;br /&gt;
#define IRMP_SUPPORT_LEGO_PROTOCOL              0       // LEGO Power RC        &amp;gt;= 20000                 ~150 bytes&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jedes von IRMP unterstützte IR-Protokoll &amp;quot;verbrät&amp;quot; ungefähr den oben angegebenen Speicher an Code. Hier kann man Optimierungen vornehmen: Zum Beispiel ist die Modulationsfrequenz von 455kHz beim B&amp;amp;O-Protokoll weitab von den Frequenzen, die von den anderen Protokollen verwendet werden. Hier braucht man evtl. andere IR-Empfänger, anderenfalls kann man diese Protokolle einfach deaktiveren. Zum Beispiel kann man mit einem TSOP1738 kein B&amp;amp;O-Protokoll (455kHz) mehr empfangen. &lt;br /&gt;
&lt;br /&gt;
Ausserdem werden die Protokolle SIEMENS/FDC/RCCAR erst ab einer Scan-Frequenz von ca. 15kHz zuverlässig erkannt. Bei RECS80/REC80EXT sind es sogar 20kHz. Wenn man also diese Protokolle nutzen will, muss man F_INTERRUPTS entsprechend anpassen, sonst erscheint beim Übersetzen eine entsprechende Warnung und die entsprechenden Protokolle werden dann automatisch abgeschaltet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMP_PORT&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;IRMP_DDR&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;IRMP_PIN&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;IRMP_BIT&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Über diese Konstanten wird der Pin am µC beschrieben, an welchem der IR-Empfänger angeschlossen ist.&lt;br /&gt;
&lt;br /&gt;
Standardwerte:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#define IRMP_PORT                               PORTB&lt;br /&gt;
#define IRMP_DDR                                DDRB&lt;br /&gt;
#define IRMP_PIN                                PINB&lt;br /&gt;
#define IRMP_BIT                                6       // use PB6 as IR input on AVR&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Anwendung von IRMP ===&lt;br /&gt;
&lt;br /&gt;
Die von IRMP unterstützten Protokolle weisen Bitlängen - teilweise variabel, teilweise fest - von 12 bis 48 Bit auf. Diese werden über Preprocessor-Defines beschrieben.&lt;br /&gt;
&lt;br /&gt;
IRMP trennt diese IR-Telegramme prinzipiell in 3 Bereiche:&lt;br /&gt;
&lt;br /&gt;
 1. ID für verwendetes Protokoll&lt;br /&gt;
 2. Adresse bzw. Herstellercode&lt;br /&gt;
 3. Kommando&lt;br /&gt;
&lt;br /&gt;
Mittels der Funktion&lt;br /&gt;
&lt;br /&gt;
   irmp_get_data (IRMP_DATA * irmp_data_p)&lt;br /&gt;
&lt;br /&gt;
kann man ein decodiertes Telegramm abrufen. Der Return-Wert ist 1, wenn ein Telegramm eingelesen wurde, sonst 0. Im ersten Fall werden die Struct-Members&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
    irmp_data_p-&amp;gt;protocol&lt;br /&gt;
    irmp_data_p-&amp;gt;address&lt;br /&gt;
    irmp_data_p-&amp;gt;command&lt;br /&gt;
    irmp_data_p-&amp;gt;flags&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gefüllt.&lt;br /&gt;
&lt;br /&gt;
Das heisst: am Ende bekommt man dann über irmp_get_data() einfach drei&lt;br /&gt;
Werte (Protokoll, Adresse und Kommando-Code), die man über ein if oder switch checken kann, z.&amp;amp;nbsp;B. hier eine Routine, welche die Tasten 1-9 auf einer Fernbedienung auswertet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
   IRMP_DATA irmp_data;&lt;br /&gt;
&lt;br /&gt;
   if (irmp_get_data (&amp;amp;irmp_data))&lt;br /&gt;
   {&lt;br /&gt;
      if (irmp_data.protocol == IRMP_NEC_PROTOCOL &amp;amp;&amp;amp;     // NEC-Protokoll&lt;br /&gt;
          irmp_data.address == 0x1234)                   // Adresse 0x1234&lt;br /&gt;
      {&lt;br /&gt;
         switch (irmp_data.command)&lt;br /&gt;
         {&lt;br /&gt;
            case 0x0001: key1_pressed(); break;          // Taste 1&lt;br /&gt;
            case 0x0002: key2_pressed(); break;          // Taste 2&lt;br /&gt;
            ...&lt;br /&gt;
            case 0x0009: key9_pressed(); break;          // Taste 9&lt;br /&gt;
         }&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier die möglichen Werte für irmp_data.protocol, siehe auch irmp.h:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#define IRMP_SIRCS_PROTOCOL                      1              // Sony&lt;br /&gt;
#define IRMP_NEC_PROTOCOL                        2              // NEC, Pioneer, JVC, Toshiba, NoName etc.&lt;br /&gt;
#define IRMP_SAMSUNG_PROTOCOL                    3              // Samsung&lt;br /&gt;
#define IRMP_MATSUSHITA_PROTOCOL                 4              // Matsushita&lt;br /&gt;
#define IRMP_KASEIKYO_PROTOCOL                   5              // Kaseikyo (Panasonic etc)&lt;br /&gt;
#define IRMP_RECS80_PROTOCOL                     6              // Philips, Thomson, Nordmende, Telefunken, Saba&lt;br /&gt;
#define IRMP_RC5_PROTOCOL                        7              // Philips etc&lt;br /&gt;
#define IRMP_DENON_PROTOCOL                      8              // Denon, Sharp&lt;br /&gt;
#define IRMP_RC6_PROTOCOL                        9              // Philips etc&lt;br /&gt;
#define IRMP_SAMSUNG32_PROTOCOL                 10              // Samsung32: no sync pulse at bit 16, length 32 instead of 37&lt;br /&gt;
#define IRMP_APPLE_PROTOCOL                     11              // Apple, very similar to NEC&lt;br /&gt;
#define IRMP_RECS80EXT_PROTOCOL                 12              // Philips, Technisat, Thomson, Nordmende, Telefunken, Saba&lt;br /&gt;
#define IRMP_NUBERT_PROTOCOL                    13              // Nubert&lt;br /&gt;
#define IRMP_BANG_OLUFSEN_PROTOCOL              14              // Bang &amp;amp; Olufsen&lt;br /&gt;
#define IRMP_GRUNDIG_PROTOCOL                   15              // Grundig&lt;br /&gt;
#define IRMP_NOKIA_PROTOCOL                     16              // Nokia&lt;br /&gt;
#define IRMP_SIEMENS_PROTOCOL                   17              // Siemens, e.g. Gigaset&lt;br /&gt;
#define IRMP_FDC_PROTOCOL                       18              // FDC keyboard&lt;br /&gt;
#define IRMP_RCCAR_PROTOCOL                     19              // RC Car&lt;br /&gt;
#define IRMP_JVC_PROTOCOL                       20              // JVC (NEC with 16 bits)&lt;br /&gt;
#define IRMP_RC6A_PROTOCOL                      21              // RC6A, e.g. Kathrein, XBOX&lt;br /&gt;
#define IRMP_NIKON_PROTOCOL                     22              // Nikon&lt;br /&gt;
#define IRMP_RUWIDO_PROTOCOL                    23              // Ruwido, e.g. T-Home Mediareceiver&lt;br /&gt;
#define IRMP_IR60_PROTOCOL                      24              // IR60 (SAB2008)&lt;br /&gt;
#define IRMP_KATHREIN_PROTOCOL                  25              // Kathrein&lt;br /&gt;
#define IRMP_NETBOX_PROTOCOL                    26              // Netbox keyboard (bitserial)&lt;br /&gt;
#define IRMP_NEC16_PROTOCOL                     27              // NEC with 16 bits (incl. sync)&lt;br /&gt;
#define IRMP_NEC42_PROTOCOL                     28              // NEC with 42 bits&lt;br /&gt;
#define IRMP_LEGO_PROTOCOL                      29              // LEGO Power Functions RC&lt;br /&gt;
#define IRMP_THOMSON_PROTOCOL                   30              // Thomson&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Werte für die Adresse und das Kommando muss man natürlich einmal für eine unbekannte Fernbedienung auslesen und dann über ein UART oder LC-Display ausgeben, um sie dann im Programm hart zu kodieren. Oder man hat eine kleine Anlernroutine, wo man einmal die gewünschten Tasten drücken muss, um sie anschließend im EEPROM abzuspeichern. Ein Beispiel dazu findet man im Artikel [http://www.mikrocontroller.net/articles/DIY_Lernfähige_Fernbedienung_mit_IRMP Lernfähige IR-Fernbedienung mit IRMP].&lt;br /&gt;
&lt;br /&gt;
Eine weitere Beispiel-Main-Funktion ist im Zip-File enthalten, da sieht man dann auch die Initialisierung des Timers.&lt;br /&gt;
&lt;br /&gt;
=== &amp;quot;Entprellen&amp;quot; von Tasten ===&lt;br /&gt;
&lt;br /&gt;
Um zu unterscheiden, ob eine Taste lange gedrückt wurde oder lediglich einzeln, dient das Bit IRMP_FLAG_REPETITION. Dieses wird im Struct-Member &#039;&#039;&#039;flags&#039;&#039;&#039; gesetzt, wenn eine Taste auf der Fernbedienung längere Zeit gedrückt wurde und dadurch immer wieder dasselbe Kommando innerhalb kurzer Zeitabstände ausgesandt wird.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
    if (irmp_data.flags &amp;amp; IRMP_FLAG_REPETITION)&lt;br /&gt;
    {&lt;br /&gt;
      // Benutzer hält die Taste länger runter&lt;br /&gt;
      // entweder:&lt;br /&gt;
      //   ich ignoriere die (Wiederholungs-)Taste&lt;br /&gt;
      // oder:&lt;br /&gt;
      //   ich benutze diese Info, um einen Repeat-Effekt zu nutzen&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
      // Es handelt sich um eine neue Taste&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies kann zum Beispiel dafür genutzt werden, um die Tasten 0-9 zu &amp;quot;entprellen&amp;quot;, indem man Kommandos mit gesetztem Bit IRMP_FLAG_REPETITION ignoriert. Bei dem Drücken auf die Tasten VOLUME+ oder VOLUME- kann die wiederholte Auswertung ein und desselben Kommandos aber durchaus gewünscht sein - zum Beispiel, um LEDs zu faden.&lt;br /&gt;
&lt;br /&gt;
Wenn man nur Einzeltasten auswerten will, kann man obigen IF-Block reduzieren auf:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
    if (! (irmp_data.flags &amp;amp; IRMP_FLAG_REPETITION))&lt;br /&gt;
    {&lt;br /&gt;
      // Es handelt sich um eine neue Taste&lt;br /&gt;
      // ACTION!&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Arbeitsweise ==&lt;br /&gt;
&lt;br /&gt;
Das &amp;quot;Working Horse&amp;quot; von IRMP ist die Interrupt Service Routine irmp_ISR() welche 15.000 mal pro Sekunde aufgerufen werden sollte. Weicht dieser Wert ab, muss die Preprocessor-Konstante F_INTERRUPTS in irmpconfig.h angepasst werden. Der Wert kann zwischen 10kHz und 20kHz eingestellt werden.&lt;br /&gt;
&lt;br /&gt;
irmp_ISR detektiert zunächst die Länge und die Form des/der Startbits und ermittelt daraus das verwendete Protokoll. Sobald das Protokoll erkannt wurde, werden die weiter einzulesenden Bits parametrisiert, um dann möglichst effektiv in den weiteren Aufrufen das komplette IR-Telegramm einzulesen.&lt;br /&gt;
&lt;br /&gt;
Um direkt Kritikern den Wind aus den Segeln zu nehmen:&lt;br /&gt;
&lt;br /&gt;
Ich weiss, die ISR ist ziemlich groß. Aber da sie sich wie eine State Machine verhält, ist der tatsächlich ausgeführte Code pro Durchlauf relativ gering. Solange es &amp;quot;dunkel&amp;quot; ist (und das ist es ja die meiste Zeit ;-)) ist die aufgewendete Zeit sogar verschwindend gering. Im WordClock-Projekt werden mit ein- und demselben Timer 8 ISRs aufgerufen, davon ist die irmp_ISR() nur eine unter vielen. Bei mindestens 8 MHz CPU-Takt traten bisher keine Timing-Probleme auf. Daher sehe ich bei der Länge von irmp_ISR überhaupt kein Problem.&lt;br /&gt;
&lt;br /&gt;
Ein Quarz ist nicht unbedingt notwendig, es funktioniert auch mit dem internen Oszillator des AVRs, wenn man die Prescaler-Fuse entsprechend gesetzt hat, dass die CPU auch mit 8MHz rennt ... Die Fuse-Werte für einen ATMEGA88 findet man in main.c.&lt;br /&gt;
&lt;br /&gt;
== Scannen von unbekannten Protokollen ==&lt;br /&gt;
&lt;br /&gt;
Stellt man in irmpconfig.h in der Zeile&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
    #define IRMP_LOGGING    0   // 1: log IR signal (scan), 0: do not (default)&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
den Wert für IRMP_LOGGING auf 1, wird in IRMP eine Protokollierung eingeschaltet: Es werden dann die Hell- und Dunkelphase auf dem UART des Microntrollers mit 9600Bd ausgegeben: 1=Dunkel, 0=Hell. Eventuell müssen dann die Konstanten in den Funktionen uart_init() und uart_putc() angepasst werden; das kommt auf den verwendeten AVR-µC an.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hinweis: Die IRMP-Logging-Funktion (insb. die Ausgabe über UART) ist nicht für PIC-Prozessoren angepasst. Wer immer dies tun möchte, kann sich gerne bei mir (Benutzer [http://www.mikrocontroller.net/user/show/ukw ukw]) per PN melden.&lt;br /&gt;
&lt;br /&gt;
Nimmt man diese Protokoll-Scans mit einem Terminal-Emulationsprogramm auf und speichert sie dann als normale Datei ab, kann man diese Scan-Dateien zur Analyse verwenden, um damit IRMP an das unbekannte Protokoll anzupassen - siehe nächstes Kapitel.&lt;br /&gt;
&lt;br /&gt;
Wer eine Fernbedienung hat, die nicht von IRMP unterstützt wird, kann mir  ([http://www.mikrocontroller.net/user/show/ukw ukw]) gern die Scan-Dateien zuschicken. Ich schaue dann, ob das Protokoll in das IRMP-Konzept passt und passe gegebenenfalls den Source an.&lt;br /&gt;
&lt;br /&gt;
== IRMP unter Linux und Windows ==&lt;br /&gt;
&lt;br /&gt;
irmp.c lässt sich auch unter Linux direkt kompilieren, um damit Infrarot-Scans, welche in Dateien gespeichert sind, direkt zu testen. Im Unterordner IR-Data finden sich solche Dateien, die man dem IRMP direkt zum &amp;quot;Fraß&amp;quot; vorwerfen kann. &lt;br /&gt;
&lt;br /&gt;
Das Übersetzen von IRMP geht folgendermaßen:&lt;br /&gt;
&lt;br /&gt;
    make -f makefile.lnx&lt;br /&gt;
&lt;br /&gt;
Dabei werden 3 IRMP-Versionen erzeugt:&lt;br /&gt;
&lt;br /&gt;
* irmp: Version für 10kHz Scans&lt;br /&gt;
* irmp-15kHz: Version für 15kHz Scans&lt;br /&gt;
* irmp-20kHz: Version für 20kHz Scans&lt;br /&gt;
&lt;br /&gt;
Der Aufruf geschieht dann über:&lt;br /&gt;
&lt;br /&gt;
  ./irmp [-l|-p|-a|-v] &amp;lt; scan-file&lt;br /&gt;
&lt;br /&gt;
Die angegebenen Optionen schließen sich aus, das heisst, es kann jeweils nur eine Option zu einer Zeit angegeben werden:&lt;br /&gt;
&lt;br /&gt;
Option:&lt;br /&gt;
&lt;br /&gt;
   -l  List             gibt eine Liste der Pulse und Pausen aus&lt;br /&gt;
   -a analyze           analysiert die Puls-/Pausen und schreibt ein &amp;quot;Spektrum&amp;quot; in ASCII-Form&lt;br /&gt;
   -v verbose           ausführliche Ausgabe&lt;br /&gt;
   -p  Print Timings    gibt für alle Protokolle eine Timing-Tabelle aus&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Normale Ausgabe:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
   ./irmp &amp;lt; IR-Data/orion_vcr_07660BM070.txt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 -------------------------------------------------------------------------&lt;br /&gt;
 # Taste 1&lt;br /&gt;
 00000001110111101000000001111111 p =  2, a = 0x7b80, c = 0x0001, f = 0x00&lt;br /&gt;
 -------------------------------------------------------------------------&lt;br /&gt;
 # Taste 2&lt;br /&gt;
 00000001110111100100000010111111 p =  2, a = 0x7b80, c = 0x0002, f = 0x00&lt;br /&gt;
 -------------------------------------------------------------------------&lt;br /&gt;
 # Taste 3&lt;br /&gt;
 00000001110111101100000000111111 p =  2, a = 0x7b80, c = 0x0003, f = 0x00&lt;br /&gt;
 -------------------------------------------------------------------------&lt;br /&gt;
 # Taste 4&lt;br /&gt;
 00000001110111100010000011011111 p =  2, a = 0x7b80, c = 0x0004, f = 0x00&lt;br /&gt;
 -------------------------------------------------------------------------&lt;br /&gt;
 ...&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Listen-Ausgabe:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
   ./irmp -l &amp;lt; IR-Data/orion_vcr_07660BM070.txt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
# Taste 1&lt;br /&gt;
pulse: 91 pause: 44&lt;br /&gt;
pulse: 6 pause: 5&lt;br /&gt;
pulse: 6 pause: 6&lt;br /&gt;
pulse: 6 pause: 5&lt;br /&gt;
pulse: 6 pause: 5&lt;br /&gt;
pulse: 6 pause: 5&lt;br /&gt;
pulse: 6 pause: 6&lt;br /&gt;
pulse: 6 pause: 5&lt;br /&gt;
pulse: 6 pause: 16&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Analyse:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
   ./irmp -a &amp;lt; IR-Data/orion_vcr_07660BM070.txt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
START PULSES:&lt;br /&gt;
 90 o 1&lt;br /&gt;
 91 oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo 33&lt;br /&gt;
 92 ooo 2&lt;br /&gt;
pulse avg: 91.0=9102.8 us, min: 90=9000.0 us, max: 92=9200.0 us, tol:  1.1%&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
START PAUSES:&lt;br /&gt;
 43 oo 1&lt;br /&gt;
 44 oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo 25&lt;br /&gt;
 45 oooooooooooooooooooooooo 10&lt;br /&gt;
pause avg: 44.2=4425.0 us, min: 43=4300.0 us, max: 45=4500.0 us, tol:  2.8%&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
PULSES:&lt;br /&gt;
  5 o 17&lt;br /&gt;
  6 ooooooooooooooooooooooooooooooooooooooooooooooooooooooo 562&lt;br /&gt;
  7 oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo 609&lt;br /&gt;
pulse avg:  6.5= 649.8 us, min:  5= 500.0 us, max:  7= 700.0 us, tol: 23.1%&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
PAUSES:&lt;br /&gt;
  4 ooooooooooooooooooooooo 169&lt;br /&gt;
  5 oooooooooooooooooooooooooooooooooooooooooooooooooooooooooo 412&lt;br /&gt;
  6 oooo 31&lt;br /&gt;
pause avg:  4.8= 477.5 us, min:  4= 400.0 us, max:  6= 600.0 us, tol: 25.7%&lt;br /&gt;
 15 oooooo 43&lt;br /&gt;
 16 oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo 425&lt;br /&gt;
 17 oooooooooo 72&lt;br /&gt;
pause avg: 16.1=1605.4 us, min: 15=1500.0 us, max: 17=1700.0 us, tol:  6.6%&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier sieht man die gemessenen Zeiten aller Pulse und Pausen als (liegende) Glockenkurven, welche natürlich wegen der ASCII-Darstellung nicht gerade einer Idealkurve entsprechen. Je schmaler die gemessenen Kanäle, desto besser ist das Timing der Fernbedienung.&lt;br /&gt;
&lt;br /&gt;
Aus obigem Output kann man herauslesen:&lt;br /&gt;
&lt;br /&gt;
* Das Start-Bit hat eine Pulslänge zwischen 9000 und 9200 usec, im Mittel sind es 9102 usec. Die Abweichung von diesem Mittelwert liegt bei 1,1 Prozent.&lt;br /&gt;
&lt;br /&gt;
* Das Start-Bit hat eine Pausenlänge zwischen 4300 usec und 4500 usec, der Mittelwert beträgt 4424 usec. Der Fehler liegt bei 2,8 Prozent.&lt;br /&gt;
&lt;br /&gt;
* Die Pulslänge eines Datenbits liegt zwischen 500 usec und 700 usec, im Mittel sind es 650 usec, der Fehler liegt bei (stolzen) 23,1 Prozent!&lt;br /&gt;
&lt;br /&gt;
Desweiteren gibt es noch 2 verschieden lange Pausen (für die Bits 0 und 1), das Ablesen der Werte überlasse ich dem geneigten Leser ;-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ausführliche Ausgabe:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
    ./irmp -v &amp;lt; IR-Data/orion_vcr_07660BM070.txt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
# Taste 1&lt;br /&gt;
   26084 [starting pulse]&lt;br /&gt;
start-bit: pulse = 91, pause = 44&lt;br /&gt;
protocol = NEC, start bit timings: pulse:  53 - 127, pause:  26 -  64&lt;br /&gt;
pulse_1:   2 -   9&lt;br /&gt;
pause_1:   9 -  25&lt;br /&gt;
pulse_0:   2 -   9&lt;br /&gt;
pause_0:   2 -   9&lt;br /&gt;
command_offset: 16&lt;br /&gt;
command_len:     16&lt;br /&gt;
complete_len:    32&lt;br /&gt;
stop_bit:         1&lt;br /&gt;
   26230 [bit  0: pulse =   6, pause =   5] 0&lt;br /&gt;
   26242 [bit  1: pulse =   6, pause =   6] 0&lt;br /&gt;
   26253 [bit  2: pulse =   6, pause =   5] 0&lt;br /&gt;
   26264 [bit  3: pulse =   6, pause =   5] 0&lt;br /&gt;
   ...&lt;br /&gt;
   26749 [bit 31: pulse =   6, pause =  17] 1&lt;br /&gt;
stop bit detected&lt;br /&gt;
code detected, length = 32&lt;br /&gt;
p =  2, a = 0x7b80, c = 0x0001, f = 0x00&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Timing-Tabelle:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
     ./irmp -p&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
IRMP_TIMEOUT_LEN:        165&lt;br /&gt;
IRMP_KEY_REPETITION_LEN  1500&lt;br /&gt;
&lt;br /&gt;
PROTOCOL       S  S-PULSE    S-PAUSE    PULSE-0    PAUSE-0    PULSE-1    PAUSE-1&lt;br /&gt;
====================================================================================&lt;br /&gt;
SIRCS          1   21 -  27    4 -   7    4 -   8    4 -   8   10 -  14    4 -   8&lt;br /&gt;
NEC            1   53 - 127   26 -  64    2 -   9    2 -   9    2 -   9    9 -  25&lt;br /&gt;
NEC (rep)      1   53 - 127   13 -  32    2 -   9    2 -   9    2 -   9    9 -  25&lt;br /&gt;
SAMSUNG        1   40 -  51   40 -  51    3 -   8    2 -   7    3 -   8    9 -  20&lt;br /&gt;
MATSUSHITA     1   27 -  43   27 -  43    4 -  13    4 -  13    4 -  13   15 -  38&lt;br /&gt;
KASEIKYO       1   29 -  38   14 -  20    1 -   8    1 -   7    1 -   8    5 -  20&lt;br /&gt;
RECS80         1    1 -   3   66 -  83    0 -   3   43 -  55    0 -   3   66 -  83&lt;br /&gt;
RC5            1    7 -  11    7 -  11    7 -  11&lt;br /&gt;
DENON          1    1 -   4               1 -   4    6 -  10    1 -   4   16 -  22&lt;br /&gt;
RC6            1   23 -  30    7 -  11    3 -   6&lt;br /&gt;
RECS80EXT      1    1 -   3   34 -  39    0 -   3   43 -  55    0 -   3   66 -  83&lt;br /&gt;
NUBERT         1   10 -  17    2 -   5    3 -   7    9 -  17   10 -  17    2 -   5&lt;br /&gt;
BANG_OLUFSEN   1    1 -   3   27 -  35&lt;br /&gt;
BANG_OLUFSEN   2    1 -   3   27 -  35&lt;br /&gt;
BANG_OLUFSEN   3    1 -   3  140 - 165&lt;br /&gt;
BANG_OLUFSEN   4    1 -   3   27 -  35&lt;br /&gt;
BANG_OLUFSEN   -                          1 -   3   27 -  35    1 -   3   83 - 104&lt;br /&gt;
GRUNDIG/NOKIA  1    3 -   7   22 -  33    3 -   7&lt;br /&gt;
SIEMENS        1    2 -   4    2 -   4    2 -   4&lt;br /&gt;
FDC            1   18 -  24    8 -  12    1 -   5    1 -   3    1 -   5    5 -  10&lt;br /&gt;
RCCAR          1   17 -  23   17 -  23    4 -   8    5 -  13    4 -   8    2 -   7&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei längeren Ausgaben sollte man das Programm &amp;quot;less&amp;quot; verwenden, um seitenweise zu blättern, z.B.:&lt;br /&gt;
&lt;br /&gt;
    ./irmp -v &amp;lt; IR-Data/Samsung_DVD_Rec_00062C.txt | less&lt;br /&gt;
&lt;br /&gt;
Diese Scan-Dateien halfen mir nicht nur bei der Entwicklung des IRMP, sondern können auch bei der Anpassung des Sources an neue IR-Protokolle sehr hilfreich sein.&lt;br /&gt;
&lt;br /&gt;
Mittlerweile kann man IRMP auch unter Windows nutzen, nämlich folgendermaßen:&lt;br /&gt;
&lt;br /&gt;
* Eingabeaufforderung starten&lt;br /&gt;
* In das Verzeichnis irmp wechseln&lt;br /&gt;
* Aufruf von:&lt;br /&gt;
            irmp.exe &amp;lt; IR-Data\rc5x.txt&lt;br /&gt;
&lt;br /&gt;
Da manche Ausgaben sehr lang werden, empfiehlt es sich auch hier, die Ausgabe in eine Datei zu lenken oder in den more weiterzuleiten, damit man seitenweise blättern kann:&lt;br /&gt;
&lt;br /&gt;
            irmp.exe &amp;lt; IR-Data\rc5x.txt | more&lt;br /&gt;
&lt;br /&gt;
Auch hier gelten dieselben Optionen wie für die Linux-Version.&lt;br /&gt;
&lt;br /&gt;
Zusatz:&lt;br /&gt;
&lt;br /&gt;
Der Decoder für das RECS80- und RECS80-Extended-Protokoll ist ungetestet, wurde anhand von Dokumentationen im Internet erstellt und lediglich mittels&lt;br /&gt;
künstlich erzeugten Scan-Dateien getestet... daher: keine Gewähr!&lt;br /&gt;
&lt;br /&gt;
== Fernbedienungen ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Protokoll || Bezeichnung || Gerät || Device Address&lt;br /&gt;
|-&lt;br /&gt;
| NEC || Toshiba CT-9859 || Fernseher || 24384&lt;br /&gt;
|-&lt;br /&gt;
| || Toshiba VT-728G || V-728G Videorekorder || 23364&lt;br /&gt;
|-&lt;br /&gt;
| || Elta 8848 MP 4 || DVD-Player || 32512&lt;br /&gt;
|-&lt;br /&gt;
| || AS-218 || Askey TV-View CHP03X (TV-Karte) || 15238&lt;br /&gt;
|-&lt;br /&gt;
| || Cyberhome ??? || Cyberhome DVD Player || 28018&lt;br /&gt;
|-&lt;br /&gt;
| || WD TV Life || Western Digital Multimediaplayer || 7984&lt;br /&gt;
|-&lt;br /&gt;
| NEC16 || Daewoo || Videorekorder || 21&lt;br /&gt;
|-&lt;br /&gt;
| KASEIKYO || Technics EUR646497 || AV Receiver SA-AX 730 || 8194&lt;br /&gt;
|-&lt;br /&gt;
| RC5 || Loewe Assist/RC3/RC4 || Fernseher (FB auf TV-Mode) || 0&lt;br /&gt;
|-&lt;br /&gt;
| RC6 || Philips Television || Fernseher (FB auf TV-Mode) || 0&lt;br /&gt;
|-&lt;br /&gt;
| SIRCS || Sony RM-816 || Fernseher (FB auf TV-Mode) || 0 (siehe Beschreibung)&lt;br /&gt;
|-&lt;br /&gt;
| DENON || DENON RC970 || AVR3805 (Verstärker) || 8&lt;br /&gt;
|-&lt;br /&gt;
| || DENON RC970 || DVD/CD-Player || 2&lt;br /&gt;
|-&lt;br /&gt;
| || DENON RC970 || Tuner || 6&lt;br /&gt;
|-&lt;br /&gt;
| SAMSUNG32 || Samsung AA59-00484A || Fernseher || 1799&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== IR-Tastaturen ==&lt;br /&gt;
&lt;br /&gt;
[[Datei:irmp-fdc3402.jpg|miniatur|FDC-3402-Tastatur]]&lt;br /&gt;
&lt;br /&gt;
IRMP unterstützt ab Version 1.7.0 auch IR-Tastaturen, nämlich die Infrarot-Tastatur FDC-3402 - erhältlich bei Pollin (Art. 711 056) für weniger als 2 EUR.&lt;br /&gt;
&lt;br /&gt;
Beim Erkennen einer Taste gibt IRMP folgende Daten zurück:&lt;br /&gt;
&lt;br /&gt;
 Protokoll-Nummer (irmp_data.protocol): 18&lt;br /&gt;
 Addresse         (irmp_data.address):  0x003F&lt;br /&gt;
&lt;br /&gt;
Als Kommando (irmp_data.command) werden folgende Werte zurückgeliefert:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code || Taste || Code || Taste || Code || Taste || Code || Taste || Code || Taste || Code || Taste || Code || Taste || Code || Taste&lt;br /&gt;
|-&lt;br /&gt;
| 0x0000 ||      || 0x0010 || TAB || 0x0020 || &#039;s&#039; || 0x0030 || &#039;c&#039; || 0x0040 ||      || 0x0050 || HOME || 0x0060 ||      || 0x0070 || MENUE&lt;br /&gt;
|-&lt;br /&gt;
| 0x0001 || &#039;^&#039; || 0x0011 || &#039;q&#039; || 0x0021 || &#039;d&#039; || 0x0031 || &#039;v&#039; || 0x0041 ||      || 0x0051 || END || 0x0061 ||      || 0x0071 || BACK&lt;br /&gt;
|-&lt;br /&gt;
| 0x0002 || &#039;1&#039; || 0x0012 || &#039;w&#039; || 0x0022 || &#039;f&#039; || 0x0032 || &#039;b&#039; || 0x0042 ||      || 0x0052 ||      || 0x0062 ||      || 0x0072 || FORWARD&lt;br /&gt;
|-&lt;br /&gt;
| 0x0003 || &#039;2&#039; || 0x0013 || &#039;e&#039; || 0x0023 || &#039;g&#039; || 0x0033 || &#039;n&#039; || 0x0043 ||      || 0x0053 || UP || 0x0063 ||      || 0x0073 || ADDRESS&lt;br /&gt;
|-&lt;br /&gt;
| 0x0004 || &#039;3&#039; || 0x0014 || &#039;r&#039; || 0x0024 || &#039;h&#039; || 0x0034 || &#039;m&#039; || 0x0044 ||      || 0x0054 || DOWN || 0x0064 ||      || 0x0074 || WINDOW&lt;br /&gt;
|-&lt;br /&gt;
| 0x0005 || &#039;4&#039; || 0x0015 || &#039;t&#039; || 0x0025 || &#039;j&#039; || 0x0035 || &#039;,&#039; || 0x0045 ||      || 0x0055 || PAGE_UP || 0x0065 ||      || 0x0075 || 1ST_PAGE&lt;br /&gt;
|-&lt;br /&gt;
| 0x0006 || &#039;5&#039; || 0x0016 || &#039;z&#039; || 0x0026 || &#039;k&#039; || 0x0036 || &#039;.&#039; || 0x0046 ||      || 0x0056 || PAGE_DOWN || 0x0066 ||      || 0x0076 || STOP&lt;br /&gt;
|-&lt;br /&gt;
| 0x0007 || &#039;6&#039; || 0x0017 || &#039;u&#039; || 0x0027 || &#039;l&#039; || 0x0037 || &#039;-&#039; || 0x0047 ||      || 0x0057 ||      || 0x0067 ||      || 0x0077 || MAIL&lt;br /&gt;
|-&lt;br /&gt;
| 0x0008 || &#039;7&#039; || 0x0018 || &#039;i&#039; || 0x0028 || &#039;ö&#039; || 0x0038 ||      || 0x0048 ||      || 0x0058 ||      || 0x0068 ||      || 0x0078 || FAVORITES&lt;br /&gt;
|-&lt;br /&gt;
| 0x0009 || &#039;8&#039; || 0x0019 || &#039;o&#039; || 0x0029 || &#039;ä&#039; || 0x0039 || SHIFT_RIGHT || 0x0049 ||      || 0x0059 || RIGHT || 0x0069 ||      || 0x0079 || NEW_PAGE&lt;br /&gt;
|-&lt;br /&gt;
| 0x000A || &#039;9&#039; || 0x001A || &#039;p&#039; || 0x002A || &#039;#&#039; || 0x003A || CTRL || 0x004A ||      || 0x005A ||      || 0x006A ||      || 0x007A || SETUP&lt;br /&gt;
|-&lt;br /&gt;
| 0x000B || &#039;0&#039; || 0x001B || &#039;ü&#039; || 0x002B || CR || 0x003B ||      || 0x004B || INSERT || 0x005B ||      || 0x006B ||      || 0x007B || FONT&lt;br /&gt;
|-&lt;br /&gt;
| 0x000C || &#039;ß&#039; || 0x001C || &#039;+&#039; || 0x002C || SHIFT_LEFT || 0x003C || ALT_LEFT || 0x004C || DELETE || 0x005C ||      || 0x006C ||      || 0x007C || PRINT&lt;br /&gt;
|-&lt;br /&gt;
| 0x000D || &#039;´&#039; || 0x001D ||      || 0x002D || &#039;&amp;lt;&#039; || 0x003D || SPACE || 0x004D ||      || 0x005D ||      || 0x006D ||      || 0x007D ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x000E ||      || 0x001E || CAPSLOCK || 0x002E || &#039;y&#039; || 0x003E || ALT_RIGHT || 0x004E ||      || 0x005E ||      || 0x006E || ESCAPE || 0x007E || ON_OFF&lt;br /&gt;
|-&lt;br /&gt;
| 0x000F || BACKSPACE || 0x001F || &#039;a&#039; || 0x002F || &#039;x&#039; || 0x003F ||      || 0x004F || LEFT || 0x005F ||      || 0x006F ||      || 0x007F ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Zusatztasten links:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code || Taste&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| 0x0400 || KEY_MOUSE_1&lt;br /&gt;
|-&lt;br /&gt;
| 0x0800 || KEY_MOUSE_2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Dabei gelten die obigen Werte für das Drücken einer Taste. Wird die Taste wieder losgelassen, setzt IRMP zusätzlich das 8. Bit im Kommando.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
      Taste &#039;a&#039; drücken:   0x001F&lt;br /&gt;
      Taste &#039;a&#039; loslassen: 0x009F&lt;br /&gt;
&lt;br /&gt;
Ausnahme ist die EIN/AUS-Taste: Diese sendet nur beim Drücken einen Code, nicht beim Loslassen.&lt;br /&gt;
&lt;br /&gt;
Wird eine Taste länger gedrückt, wird das in irmp_data.flag angezeigt.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
                           command   flag&lt;br /&gt;
      Taste &#039;a&#039; drücken:   0x001F    0x00&lt;br /&gt;
      Taste &#039;a&#039; drücken:   0x001F    0x01&lt;br /&gt;
      Taste &#039;a&#039; drücken:   0x001F    0x01&lt;br /&gt;
      Taste &#039;a&#039; drücken:   0x001F    0x01&lt;br /&gt;
      ....&lt;br /&gt;
      Taste &#039;a&#039; loslassen: 0x009F    0x00&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Werden Tastenkombinationen (zum Beispiel für ein großes &#039;A&#039;) gedrückt, dann sind die Rückgabewerte von IRMP in folgendem Ablauf zu sehen:&lt;br /&gt;
&lt;br /&gt;
      Linke SHIFT-Taste drücken:   0x0002&lt;br /&gt;
      Taste &#039;a&#039; drücken:           0x001F&lt;br /&gt;
      Taste &#039;a&#039; loslassen:         0x009F&lt;br /&gt;
      Linke SHIFT-Taste loslassen: 0x0082&lt;br /&gt;
&lt;br /&gt;
In irmp.c findet man für die LINUX-Version eine Funktion get_fdc_key(), welche als Vorlage dienen mag, die Keycodes einer FDC-Tastatur in die entsprechenden ASCII-Codes umzuwandeln. Diese Funktion kann man entweder lokal auf dem µC nutzen, um die Keycodes zu decodieren, oder auf einem Hostsystem (z.B. PC), an welches die IRMP-Data-Struktur gesandt wird. Dafür sollte man die Funktion incl. der dazugehörenden Preprozessor-Konstanten in seinen Applikations-Quelltext kopieren.&lt;br /&gt;
&lt;br /&gt;
Hier der entsprechende Auszug:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#define STATE_LEFT_SHIFT    0x01&lt;br /&gt;
#define STATE_RIGHT_SHIFT   0x02&lt;br /&gt;
#define STATE_LEFT_CTRL     0x04&lt;br /&gt;
#define STATE_LEFT_ALT      0x08&lt;br /&gt;
#define STATE_RIGHT_ALT     0x10&lt;br /&gt;
&lt;br /&gt;
#define KEY_ESCAPE          0x1B            // keycode = 0x006e&lt;br /&gt;
#define KEY_MENUE           0x80            // keycode = 0x0070&lt;br /&gt;
#define KEY_BACK            0x81            // keycode = 0x0071&lt;br /&gt;
#define KEY_FORWARD         0x82            // keycode = 0x0072&lt;br /&gt;
#define KEY_ADDRESS         0x83            // keycode = 0x0073&lt;br /&gt;
#define KEY_WINDOW          0x84            // keycode = 0x0074&lt;br /&gt;
#define KEY_1ST_PAGE        0x85            // keycode = 0x0075&lt;br /&gt;
#define KEY_STOP            0x86            // keycode = 0x0076&lt;br /&gt;
#define KEY_MAIL            0x87            // keycode = 0x0077&lt;br /&gt;
#define KEY_FAVORITES       0x88            // keycode = 0x0078&lt;br /&gt;
#define KEY_NEW_PAGE        0x89            // keycode = 0x0079&lt;br /&gt;
#define KEY_SETUP           0x8A            // keycode = 0x007a&lt;br /&gt;
#define KEY_FONT            0x8B            // keycode = 0x007b&lt;br /&gt;
#define KEY_PRINT           0x8C            // keycode = 0x007c&lt;br /&gt;
#define KEY_ON_OFF          0x8E            // keycode = 0x007c&lt;br /&gt;
&lt;br /&gt;
#define KEY_INSERT          0x90            // keycode = 0x004b&lt;br /&gt;
#define KEY_DELETE          0x91            // keycode = 0x004c&lt;br /&gt;
#define KEY_LEFT            0x92            // keycode = 0x004f&lt;br /&gt;
#define KEY_HOME            0x93            // keycode = 0x0050&lt;br /&gt;
#define KEY_END             0x94            // keycode = 0x0051&lt;br /&gt;
#define KEY_UP              0x95            // keycode = 0x0053&lt;br /&gt;
#define KEY_DOWN            0x96            // keycode = 0x0054&lt;br /&gt;
#define KEY_PAGE_UP         0x97            // keycode = 0x0055&lt;br /&gt;
#define KEY_PAGE_DOWN       0x98            // keycode = 0x0056&lt;br /&gt;
#define KEY_RIGHT           0x99            // keycode = 0x0059&lt;br /&gt;
#define KEY_MOUSE_1         0x9E            // keycode = 0x0400&lt;br /&gt;
#define KEY_MOUSE_2         0x9F            // keycode = 0x0800&lt;br /&gt;
&lt;br /&gt;
static uint8_t&lt;br /&gt;
get_fdc_key (uint16_t cmd)&lt;br /&gt;
{&lt;br /&gt;
    static uint8_t key_table[128] =&lt;br /&gt;
    {&lt;br /&gt;
     // 0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F&lt;br /&gt;
        0,  &#039;^&#039;, &#039;1&#039;, &#039;2&#039;, &#039;3&#039;, &#039;4&#039;, &#039;5&#039;, &#039;6&#039;, &#039;7&#039;, &#039;8&#039;, &#039;9&#039;, &#039;0&#039;, &#039;ß&#039;, &#039;´&#039;,  0,  &#039;\b&#039;,&lt;br /&gt;
       &#039;\t&#039;,&#039;q&#039;, &#039;w&#039;, &#039;e&#039;, &#039;r&#039;, &#039;t&#039;, &#039;z&#039;, &#039;u&#039;, &#039;i&#039;, &#039;o&#039;, &#039;p&#039;, &#039;ü&#039;, &#039;+&#039;,  0,   0,  &#039;a&#039;,&lt;br /&gt;
       &#039;s&#039;, &#039;d&#039;, &#039;f&#039;, &#039;g&#039;, &#039;h&#039;, &#039;j&#039;, &#039;k&#039;, &#039;l&#039;, &#039;ö&#039;, &#039;ä&#039;, &#039;#&#039;,  &#039;\r&#039;, 0,  &#039;&amp;lt;&#039;, &#039;y&#039;, &#039;x&#039;,&lt;br /&gt;
       &#039;c&#039;, &#039;v&#039;, &#039;b&#039;, &#039;n&#039;, &#039;m&#039;, &#039;,&#039;, &#039;.&#039;, &#039;-&#039;,  0,   0,   0,   0,   0,  &#039; &#039;,  0,   0,&lt;br /&gt;
&lt;br /&gt;
        0,  &#039;°&#039;, &#039;!&#039;, &#039;&amp;quot;&#039;, &#039;§&#039;, &#039;$&#039;, &#039;%&#039;, &#039;&amp;amp;&#039;, &#039;/&#039;, &#039;(&#039;, &#039;)&#039;, &#039;=&#039;, &#039;?&#039;, &#039;`&#039;,  0,  &#039;\b&#039;,&lt;br /&gt;
       &#039;\t&#039;,&#039;Q&#039;, &#039;W&#039;, &#039;E&#039;, &#039;R&#039;, &#039;T&#039;, &#039;Z&#039;, &#039;U&#039;, &#039;I&#039;, &#039;O&#039;, &#039;P&#039;, &#039;Ü&#039;, &#039;*&#039;,  0,   0,  &#039;A&#039;,&lt;br /&gt;
       &#039;S&#039;, &#039;D&#039;, &#039;F&#039;, &#039;G&#039;, &#039;H&#039;, &#039;J&#039;, &#039;K&#039;, &#039;L&#039;, &#039;Ö&#039;, &#039;Ä&#039;, &#039;\&#039;&#039;,&#039;\r&#039;, 0,  &#039;&amp;gt;&#039;, &#039;Y&#039;, &#039;X&#039;,&lt;br /&gt;
       &#039;C&#039;, &#039;V&#039;, &#039;B&#039;, &#039;N&#039;, &#039;M&#039;, &#039;;&#039;, &#039;:&#039;, &#039;_&#039;,  0,   0,   0,   0,   0,  &#039; &#039;,  0,   0&lt;br /&gt;
    };&lt;br /&gt;
    static uint8_t state;&lt;br /&gt;
&lt;br /&gt;
    uint8_t key = 0;&lt;br /&gt;
&lt;br /&gt;
    switch (cmd)&lt;br /&gt;
    {&lt;br /&gt;
        case 0x002C: state |=  STATE_LEFT_SHIFT;    break;              // pressed left shift&lt;br /&gt;
        case 0x00AC: state &amp;amp;= ~STATE_LEFT_SHIFT;    break;              // released left shift&lt;br /&gt;
        case 0x0039: state |=  STATE_RIGHT_SHIFT;   break;              // pressed right shift&lt;br /&gt;
        case 0x00B9: state &amp;amp;= ~STATE_RIGHT_SHIFT;   break;              // released right shift&lt;br /&gt;
        case 0x003A: state |=  STATE_LEFT_CTRL;     break;              // pressed left ctrl&lt;br /&gt;
        case 0x00BA: state &amp;amp;= ~STATE_LEFT_CTRL;     break;              // released left ctrl&lt;br /&gt;
        case 0x003C: state |=  STATE_LEFT_ALT;      break;              // pressed left alt&lt;br /&gt;
        case 0x00BC: state &amp;amp;= ~STATE_LEFT_ALT;      break;              // released left alt&lt;br /&gt;
        case 0x003E: state |=  STATE_RIGHT_ALT;     break;              // pressed left alt&lt;br /&gt;
        case 0x00BE: state &amp;amp;= ~STATE_RIGHT_ALT;     break;              // released left alt&lt;br /&gt;
&lt;br /&gt;
        case 0x006e: key = KEY_ESCAPE;              break;&lt;br /&gt;
        case 0x004b: key = KEY_INSERT;              break;&lt;br /&gt;
        case 0x004c: key = KEY_DELETE;              break;&lt;br /&gt;
        case 0x004f: key = KEY_LEFT;                break;&lt;br /&gt;
        case 0x0050: key = KEY_HOME;                break;&lt;br /&gt;
        case 0x0051: key = KEY_END;                 break;&lt;br /&gt;
        case 0x0053: key = KEY_UP;                  break;&lt;br /&gt;
        case 0x0054: key = KEY_DOWN;                break;&lt;br /&gt;
        case 0x0055: key = KEY_PAGE_UP;             break;&lt;br /&gt;
        case 0x0056: key = KEY_PAGE_DOWN;           break;&lt;br /&gt;
        case 0x0059: key = KEY_RIGHT;               break;&lt;br /&gt;
        case 0x0400: key = KEY_MOUSE_1;             break;&lt;br /&gt;
        case 0x0800: key = KEY_MOUSE_2;             break;&lt;br /&gt;
&lt;br /&gt;
        default:&lt;br /&gt;
        {&lt;br /&gt;
            if (!(cmd &amp;amp; 0x80))                      // pressed key&lt;br /&gt;
            {&lt;br /&gt;
                if (cmd &amp;gt;= 0x70 &amp;amp;&amp;amp; cmd &amp;lt;= 0x7F)     // function keys&lt;br /&gt;
                {&lt;br /&gt;
                    key = cmd + 0x10;               // 7x -&amp;gt; 8x&lt;br /&gt;
                }&lt;br /&gt;
                else if (cmd &amp;lt; 64)                  // key listed in key_table&lt;br /&gt;
                {&lt;br /&gt;
                    if (state &amp;amp; (STATE_LEFT_ALT | STATE_RIGHT_ALT))&lt;br /&gt;
                    {&lt;br /&gt;
                        switch (cmd)&lt;br /&gt;
                        {&lt;br /&gt;
                            case 0x0003: key = &#039;²&#039;;     break;&lt;br /&gt;
                            case 0x0008: key = &#039;{&#039;;     break;&lt;br /&gt;
                            case 0x0009: key = &#039;[&#039;;     break;&lt;br /&gt;
                            case 0x000A: key = &#039;]&#039;;     break;&lt;br /&gt;
                            case 0x000B: key = &#039;}&#039;;     break;&lt;br /&gt;
                            case 0x000C: key = &#039;\\&#039;;    break;&lt;br /&gt;
                            case 0x001C: key = &#039;~&#039;;     break;&lt;br /&gt;
                            case 0x002D: key = &#039;|&#039;;     break;&lt;br /&gt;
                            case 0x0034: key = &#039;µ&#039;;     break;&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                    else if (state &amp;amp; (STATE_LEFT_CTRL))&lt;br /&gt;
                    {&lt;br /&gt;
                        if (key_table[cmd] &amp;gt;= &#039;a&#039; &amp;amp;&amp;amp; key_table[cmd] &amp;lt;= &#039;z&#039;)&lt;br /&gt;
                        {&lt;br /&gt;
                            key = key_table[cmd] - &#039;a&#039; + 1;&lt;br /&gt;
                        }&lt;br /&gt;
                        else&lt;br /&gt;
                        {&lt;br /&gt;
                            key = key_table[cmd];&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                    else&lt;br /&gt;
                    {&lt;br /&gt;
                        int idx = cmd + ((state &amp;amp; (STATE_LEFT_SHIFT | STATE_RIGHT_SHIFT)) ? 64 : 0);&lt;br /&gt;
&lt;br /&gt;
                        if (key_table[idx])&lt;br /&gt;
                        {&lt;br /&gt;
                            key = key_table[idx];&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return (key);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Als letztes noch ein Beispiel einer Anwendung der Funktion get_fdc_key():&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
    if (irmp_get_data (&amp;amp;irmp_data))&lt;br /&gt;
    {&lt;br /&gt;
        uint8_t key;&lt;br /&gt;
&lt;br /&gt;
        if (irmp_data.protocol == IRMP_FDC_PROTOCOL &amp;amp;&amp;amp;&lt;br /&gt;
            (key = get_fdc_key (irmp_data.command)) != 0)&lt;br /&gt;
        {&lt;br /&gt;
            if ((key &amp;gt;= 0x20 &amp;amp;&amp;amp; key &amp;lt; 0x7F) || key &amp;gt;= 0xA0) // show only printable characters&lt;br /&gt;
            {&lt;br /&gt;
                printf (&amp;quot;ascii-code = 0x%02x, character = &#039;%c&#039;\n&amp;quot;, key, key);&lt;br /&gt;
            }&lt;br /&gt;
            else // it&#039;s a non-printable key&lt;br /&gt;
            {&lt;br /&gt;
                printf (&amp;quot;ascii-code = 0x%02x\n&amp;quot;, key);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alle nicht-druckbaren Zeichen werden dabei folgendermaßen codiert:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Taste             || Konstante                || Wert&lt;br /&gt;
|-&lt;br /&gt;
| ESC               || KEY_ESCAPE              || 0x1B&lt;br /&gt;
|-&lt;br /&gt;
| Menü              || KEY_MENUE               || 0x80&lt;br /&gt;
|-&lt;br /&gt;
| Zurück            || KEY_BACK                || 0x81&lt;br /&gt;
|-&lt;br /&gt;
| Vorw.             || KEY_FORWARD             || 0x82&lt;br /&gt;
|-&lt;br /&gt;
| Adresse           || KEY_ADDRESS             || 0x83&lt;br /&gt;
|-&lt;br /&gt;
| Fenster           || KEY_WINDOW              || 0x84&lt;br /&gt;
|-&lt;br /&gt;
| 1. Seite          || KEY_1ST_PAGE            || 0x85&lt;br /&gt;
|-&lt;br /&gt;
| Stop              || KEY_STOP                || 0x86&lt;br /&gt;
|-&lt;br /&gt;
| Mail              || KEY_MAIL                || 0x87&lt;br /&gt;
|-&lt;br /&gt;
| Fav.              || KEY_FAVORITES           || 0x88&lt;br /&gt;
|-&lt;br /&gt;
| Neue Seite        || KEY_NEW_PAGE            || 0x89&lt;br /&gt;
|-&lt;br /&gt;
| Setup             || KEY_SETUP               || 0x8A&lt;br /&gt;
|-&lt;br /&gt;
| Schrift           || KEY_FONT                || 0x8B&lt;br /&gt;
|-&lt;br /&gt;
| Druck             || KEY_PRINT               || 0x8C&lt;br /&gt;
|-&lt;br /&gt;
| Ein/Aus           || KEY_ON_OFF              || 0x8E&lt;br /&gt;
|-&lt;br /&gt;
| Backspace         || &#039;\b&#039;                    || 0x08&lt;br /&gt;
|-&lt;br /&gt;
| CR/ENTER          || &#039;\r&#039;                    || 0x0C&lt;br /&gt;
|-&lt;br /&gt;
| TAB               || &#039;\t&#039;                    || 0x09&lt;br /&gt;
|-&lt;br /&gt;
| Einfg             || KEY_INSERT              || 0x90&lt;br /&gt;
|-&lt;br /&gt;
| Entf              || KEY_DELETE              || 0x91&lt;br /&gt;
|-&lt;br /&gt;
| Cursor links      || KEY_LEFT                || 0x92&lt;br /&gt;
|-&lt;br /&gt;
| Pos1              || KEY_HOME                || 0x93&lt;br /&gt;
|-&lt;br /&gt;
| Ende              || KEY_END                 || 0x94&lt;br /&gt;
|-&lt;br /&gt;
| Cursor rechts     || KEY_UP                  || 0x95&lt;br /&gt;
|-&lt;br /&gt;
| Cursor runter     || KEY_DOWN                || 0x96&lt;br /&gt;
|-&lt;br /&gt;
| Bild hoch         || KEY_PAGE_UP             || 0x97&lt;br /&gt;
|-&lt;br /&gt;
| Bild runter       || KEY_PAGE_DOWN           || 0x98&lt;br /&gt;
|-&lt;br /&gt;
| Cursor links      || KEY_RIGHT               || 0x99&lt;br /&gt;
|-&lt;br /&gt;
| Linke Maustaste   || KEY_MOUSE_1             || 0x9E&lt;br /&gt;
|-&lt;br /&gt;
| Rechte Maustaste  || KEY_MOUSE_2             || 0x9F&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die Funktion get_fdc_key berücksichtigt das Gedrückthalten der Shift-, Strg- und ALT-Tasten. Damit funktioniert nicht nur das Schreiben von Großbuchstaben, sondern auch das Auswählen der Sonderzeichen mit der Tastenkombination  ALT + Taste, z.B. ALT + m = µ oder ALT + q = @. Ebenso kann man mit der Strg-Taste die Control-Zeichen CTRL-A bis CTRL-Z senden. Die CapsLock-Taste wird ignoriert, da ich sie sowieso für die überflüssigste Taste überhaupt halte ;-)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= IRSND - Infrarot-Multiprotokoll-Encoder =&lt;br /&gt;
&lt;br /&gt;
[[Datei:irmp-title.png| |Scan eines NEC-kompatiblen Fernbedienungssignals]]&lt;br /&gt;
&lt;br /&gt;
== Einleitung IRSND ==&lt;br /&gt;
&lt;br /&gt;
[[Datei:ir-sender.png|miniatur|Anschluß eines einfachen IR-Senders an µC]]&lt;br /&gt;
&lt;br /&gt;
IRSND ist das Gegenstück zu IRMP: es reproduziert aus den Daten, die mit IRMP empfangen wurden, wieder den Original Frame, der dann über eine Infrarot-Diode ausgegeben werden kann.&lt;br /&gt;
&lt;br /&gt;
IRSND ist lauffähig auf folgenden AVR µCs:&lt;br /&gt;
&lt;br /&gt;
* ATtiny45,  ATtiny85&lt;br /&gt;
* ATtiny84&lt;br /&gt;
* ATmega8,   ATmega16,  ATmega32&lt;br /&gt;
* ATmega162&lt;br /&gt;
* ATmega164, ATmega324, ATmega644,  ATmega644P, ATmega1284&lt;br /&gt;
* ATmega88,  ATmega88P, ATmega168,  ATmega168P, ATmega328P&lt;br /&gt;
&lt;br /&gt;
IRSND unterstützt die folgenden Protokolle:&lt;br /&gt;
&lt;br /&gt;
* SIRCS&lt;br /&gt;
* NEC&lt;br /&gt;
* SAMSUNG&lt;br /&gt;
* SAMSUNG32&lt;br /&gt;
* MATSUSHITA&lt;br /&gt;
* RC5&lt;br /&gt;
* KASEIKYO&lt;br /&gt;
* DENON&lt;br /&gt;
* JVC&lt;br /&gt;
* APPLE&lt;br /&gt;
* NUBERT&lt;br /&gt;
* BANG_OLUFSEN&lt;br /&gt;
* GRUNDIG&lt;br /&gt;
* NOKIA&lt;br /&gt;
* SIEMENS (bei mind. ~15kHz)&lt;br /&gt;
* FDC (bei mind. ~15kHz)&lt;br /&gt;
* RCCAR (bei mind. ~15kHz)&lt;br /&gt;
* RECS80 (bei mind. ~20kHz)&lt;br /&gt;
* RECS80EXT (bei mind. ~20kHz)&lt;br /&gt;
* NIKON&lt;br /&gt;
* RC6&lt;br /&gt;
* RC6A&lt;br /&gt;
* THOMSON (&#039;&#039;&#039;NEU&#039;&#039;&#039;)&lt;br /&gt;
* NEC16 (&#039;&#039;&#039;NEU&#039;&#039;&#039;)&lt;br /&gt;
* NEC42 (&#039;&#039;&#039;NEU&#039;&#039;&#039;)&lt;br /&gt;
* LEGO (&#039;&#039;&#039;NEU&#039;&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
== Download IRSND ==&lt;br /&gt;
&lt;br /&gt;
Version 2.0.1, Stand vom 20.09.2011&lt;br /&gt;
&lt;br /&gt;
Download Release-Version: [http://www.mikrocontroller.net/wikifiles/c/c7/Irsnd.zip Irsnd.zip] &lt;br /&gt;
&lt;br /&gt;
IRMP &amp;amp; IRSND sind nun auch über SVN abrufbar: [http://www.mikrocontroller.net/svnbrowser/irmp/ IRMP im SVN]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die Version im SVN kann eine Zwischen- oder Test-Version sein, die nicht den hier dokumentierten Stand widerspiegelt! Im Zweifel verwendet man besser den obigen Download auf Irsnd.zip.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die Software-Änderungen kann man sich hier anschauen: [http://www.mikrocontroller.net/articles/IRMP#Software-Historie_IRSND Software-Historie IRSND]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Source-Code IRSND ==&lt;br /&gt;
&lt;br /&gt;
Der Source-Code lässt sich einfach übersetzen, indem man die Projekt-Datei irsnd.aps in den WinAVR lädt.&lt;br /&gt;
&lt;br /&gt;
IRSND encodiert sämtliche oben aufgelisteten Protokolle in einer ISR, siehe irsnd.c.&lt;br /&gt;
&lt;br /&gt;
=== Einstellungen in irsndconfig.h ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;F_INTERRUPTS&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Anzahl der Interrupts pro Sekunde. Der Wert kann zwischen 10000 und 20000 eingestellt werden.&lt;br /&gt;
&lt;br /&gt;
Standardwert:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#define F_INTERRUPTS                            15000      // interrupts per second&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRSND_SUPPORT_xxx_PROTOCOL&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Hier lässt sich einstellen, welche Protokolle von IRSND unterstützt werden sollen. Die Standardprotokolle sind bereits aktiv. Möchte man weitere Protokolle einschalten bzw. einige aus Speicherplatzgründen deaktivieren, sind die entsprechenden Werte in irsndconfig.h anzupassen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
// typical protocols, disable here!             Enable  Remarks                 F_INTERRUPTS            Program Space&lt;br /&gt;
#define IRSND_SUPPORT_SIRCS_PROTOCOL            1       // Sony SIRCS           &amp;gt;= 10000                 ~150 bytes&lt;br /&gt;
#define IRSND_SUPPORT_NEC_PROTOCOL              1       // NEC + APPLE          &amp;gt;= 10000                 ~100 bytes&lt;br /&gt;
#define IRSND_SUPPORT_SAMSUNG_PROTOCOL          1       // Samsung + Samsung32  &amp;gt;= 10000                 ~300 bytes&lt;br /&gt;
#define IRSND_SUPPORT_MATSUSHITA_PROTOCOL       1       // Matsushita           &amp;gt;= 10000                 ~200 bytes&lt;br /&gt;
#define IRSND_SUPPORT_KASEIKYO_PROTOCOL         1       // Kaseikyo             &amp;gt;= 10000                 ~150 bytes&lt;br /&gt;
#define IRSND_SUPPORT_DENON_PROTOCOL            1       // DENON, Sharp         &amp;gt;= 10000                 ~200 bytes&lt;br /&gt;
&lt;br /&gt;
// more protocols, enable here!                 Enable  Remarks                 F_INTERRUPTS            Program Space&lt;br /&gt;
#define IRSND_SUPPORT_RC5_PROTOCOL              0       // RC5                  &amp;gt;= 10000                 ~150 bytes&lt;br /&gt;
#define IRSND_SUPPORT_RC6_PROTOCOL              0       // RC6                  &amp;gt;= 10000                 ~250 bytes&lt;br /&gt;
#define IRSND_SUPPORT_RC6A_PROTOCOL             0       // RC6A                 &amp;gt;= 10000                 ~250 bytes&lt;br /&gt;
#define IRSND_SUPPORT_JVC_PROTOCOL              0       // JVC                  &amp;gt;= 10000                 ~150 bytes&lt;br /&gt;
#define IRSND_SUPPORT_NEC16_PROTOCOL            0       // NEC16                &amp;gt;= 10000                 ~150 bytes&lt;br /&gt;
#define IRSND_SUPPORT_NEC42_PROTOCOL            0       // NEC42                &amp;gt;= 10000                 ~150 bytes&lt;br /&gt;
#define IRSND_SUPPORT_IR60_PROTOCOL             0       // IR60 (SAB2008)       &amp;gt;= 10000                 DON&#039;T CHANGE, NOT SUPPORTED YET!&lt;br /&gt;
#define IRSND_SUPPORT_GRUNDIG_PROTOCOL          0       // Grundig              &amp;gt;= 10000                 ~300 bytes&lt;br /&gt;
#define IRSND_SUPPORT_SIEMENS_PROTOCOL          0       // Siemens, Gigaset     &amp;gt;= 15000                 ~150 bytes&lt;br /&gt;
#define IRSND_SUPPORT_NOKIA_PROTOCOL            0       // Nokia                &amp;gt;= 10000                 ~400 bytes&lt;br /&gt;
&lt;br /&gt;
// exotic protocols, enable here!               Enable  Remarks                 F_INTERRUPTS            Program Space&lt;br /&gt;
#define IRSND_SUPPORT_KATHREIN_PROTOCOL         0       // Kathrein             &amp;gt;= 10000                 DON&#039;T CHANGE, NOT SUPPORTED YET!&lt;br /&gt;
#define IRSND_SUPPORT_NUBERT_PROTOCOL           0       // NUBERT               &amp;gt;= 10000                 ~100 bytes&lt;br /&gt;
#define IRSND_SUPPORT_BANG_OLUFSEN_PROTOCOL     0       // Bang&amp;amp;Olufsen         &amp;gt;= 10000                 ~250 bytes&lt;br /&gt;
#define IRSND_SUPPORT_RECS80_PROTOCOL           0       // RECS80               &amp;gt;= 20000                 ~100 bytes&lt;br /&gt;
#define IRSND_SUPPORT_RECS80EXT_PROTOCOL        0       // RECS80EXT            &amp;gt;= 20000                 ~100 bytes&lt;br /&gt;
#define IRSND_SUPPORT_THOMSON_PROTOCOL          0       // Thomson              &amp;gt;= 10000                 ~250 bytes&lt;br /&gt;
#define IRSND_SUPPORT_NIKON_PROTOCOL            0       // NIKON                &amp;gt;= 10000                 ~150 bytes&lt;br /&gt;
#define IRSND_SUPPORT_NETBOX_PROTOCOL           0       // Netbox keyboard      &amp;gt;= 10000                 DON&#039;T CHANGE, NOT SUPPORTED YET!&lt;br /&gt;
#define IRSND_SUPPORT_FDC_PROTOCOL              0       // FDC IR keyboard      &amp;gt;= 10000 (better 15000)  ~150 bytes&lt;br /&gt;
#define IRSND_SUPPORT_RCCAR_PROTOCOL            0       // RC CAR               &amp;gt;= 10000 (better 15000)  ~150 bytes&lt;br /&gt;
#define IRSND_SUPPORT_RUWIDO_PROTOCOL           0       // RUWIDO, T-Home       &amp;gt;= 15000                 DON&#039;T CHANGE, NOT SUPPORTED YET!&lt;br /&gt;
#define IRSND_SUPPORT_LEGO_PROTOCOL             0       // LEGO Power RC        &amp;gt;= 20000                 ~150 bytes&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit Setzen auf 0 wird das Protokoll deaktiviert, mit Setzen auf 1 wird es aktiviert. Die deaktivierten Protokolle werden dann nicht mitübersetzt. Das spart Speicherplatz im Flash, siehe Angaben in obigen Kommentaren. Wenn man unbedingt Speicherplatz sparen muss, gelten natürlich hier dieselben Tipps wie für IRMP.&lt;br /&gt;
&lt;br /&gt;
Um das APPLE-Protokoll zu unterstützen, ist IRSND_SUPPORT_NEC_PROTOCOL auf 1 zu setzen, da es sich hier lediglich um einen Spezialfall vom NEC-Protokoll handelt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRSND_OCx&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Für das Senden der IR-Signale benötigt IRSND einen PWM-fähigen Output-Pin, da das Signal moduliert werden muss. Möglich sind eine der folgenden Einstellungen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#define IRSND_OCx                               IRSND_OC2  // OC2  on ATmegas         supporting OC2,  e.g. ATmega8&lt;br /&gt;
#define IRSND_OCx                               IRSND_OC2A // OC2A on ATmegas         supporting OC2A, e.g. ATmega88&lt;br /&gt;
#define IRSND_OCx                               IRSND_OC2B // OC2B on ATmegas         supporting OC2B, e.g. ATmega88&lt;br /&gt;
#define IRSND_OCx                               IRSND_OC0  // OC0  on ATmegas         supporting OC0,  e.g. ATmega162&lt;br /&gt;
#define IRSND_OCx                               IRSND_OC0A // OC0A on ATmegas/ATtinys supporting OC0A, e.g. ATtiny84, ATtiny85&lt;br /&gt;
#define IRSND_OCx                               IRSND_OC0B // OC0B on ATmegas/ATtinys supporting OC0B, e.g. ATtiny84, ATtiny85&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Standardwert:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#define IRSND_OCx                               IRSND_OC2B&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
IRSND baut den zu sendenden Frame &amp;quot;on-the-fly&amp;quot; aus der IRMP-Datenstruktur wieder zusammen. Dazu zählen:&lt;br /&gt;
&lt;br /&gt;
 1. ID für verwendetes Protokoll&lt;br /&gt;
 2. Adresse bzw. Herstellercode&lt;br /&gt;
 3. Kommando&lt;br /&gt;
&lt;br /&gt;
Mittels der Funktion&lt;br /&gt;
&lt;br /&gt;
   irsnd_send_data (IRMP_DATA * irmp_data_p)&lt;br /&gt;
&lt;br /&gt;
kann man ein zu encodierendes Telegramm versenden. Der Return-Wert ist 1, wenn das Telegramm versendet werden kann, sonst 0. Im ersten Fall werden die Struct-Members&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
    irmp_data_p-&amp;gt;protocol&lt;br /&gt;
    irmp_data_p-&amp;gt;address&lt;br /&gt;
    irmp_data_p-&amp;gt;command&lt;br /&gt;
    irmp_data_p-&amp;gt;flags&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ausgelesen und dann als Frame im jeweils gewünschten Protokoll gesendet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;NEU ab Version 1.5.0:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
irmp_data_p-&amp;gt;flags gibt die Anzahl der Wiederholungen an, z.B.&lt;br /&gt;
&lt;br /&gt;
  irmp_data_p-&amp;gt;flags = 0: Verhalten wie bisher&lt;br /&gt;
  irmp_data_p-&amp;gt;flags = 1: 1 Wiederholung&lt;br /&gt;
  irmp_data_p-&amp;gt;flags = 2: 2 Wiederholungen&lt;br /&gt;
  usw.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Zu beachten: Da bisher irmp_data_p-&amp;gt;flags von IRSND nicht ausgewertet wurde, ist unbedingt ab Version 1.5.0 darauf zu achten, dass irmp_data_p-&amp;gt;flags vor dem Aufruf von irsnd_send_data() einen definierten Wert hat!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Hier ein Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
   IRMP_DATA irmp_data;&lt;br /&gt;
&lt;br /&gt;
   irmp_data.protocol = IRMP_NEC_PROTOCOL;   // sende im NEC-Protokoll&lt;br /&gt;
   irmp_data.address  = 0x00FF;              // verwende Adresse 0x00FF&lt;br /&gt;
   irmp_data.command  = 0x0001;              // sende Kommando 0001&lt;br /&gt;
   irmp_data.flags    = 0;                   // keine Wiederholung!&lt;br /&gt;
&lt;br /&gt;
   (void) irsnd_send_data (&amp;amp;irmp_data);      // versende ohne Prüfung&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Frame wird asynchron über die Interrupt-Routine irsnd_ISR() verschickt, so dass die Funktion irsnd_send_data() sofort zurückkommt.&lt;br /&gt;
&lt;br /&gt;
Sind Wiederholungen angegeben, wird entweder der Frame nach einer Pause (protokollabhängig) neu ausgegeben oder ein protokollspezifischer Wiederholungsframe (z.B. für NEC) gesendet.&lt;br /&gt;
&lt;br /&gt;
Wird erneut irsnd_send_data() aufgerufen, wartet diese, bis der vorhergenhende Frame vollständig verschickt wurde. Man kann aber auch selbst prüfen, ob IRSND gerade &amp;quot;busy&amp;quot; ist oder nicht:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
   while (irsnd_is_busy ())&lt;br /&gt;
   {&lt;br /&gt;
      ;                                      // selber warten oder was anderes tun...&lt;br /&gt;
   }&lt;br /&gt;
   (void) irsnd_send_data (&amp;amp;irmp_data);      // versende ohne Prüfung&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Beispiel-Source irsndmain.c findet man neben der Verwendung von irsnd_send_data() auch den Timer-Aufruf:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
ISR(TIMER1_COMPA_vect)&lt;br /&gt;
{&lt;br /&gt;
  irsnd_ISR())          // call irsnd ISR&lt;br /&gt;
  // call other timer interrupt routines...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Paralleles Betreiben von IRMP und IRSND ===&lt;br /&gt;
&lt;br /&gt;
Möchte man IRMP und IRSND parallel verwenden (also als Sender und Empfänger) schreibt man die ISR folgendermaßen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
ISR(TIMER1_COMPA_vect)&lt;br /&gt;
{&lt;br /&gt;
  if (! irsnd_ISR())          // call irsnd ISR&lt;br /&gt;
  {                           // if not busy...&lt;br /&gt;
      irmp_ISR();             // call irmp ISR&lt;br /&gt;
  }&lt;br /&gt;
  // call other timer interrupt routines...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das heisst: Nur wenn irsnd_ISR() nichts zu tun hat, dann rufe die ISR des Empfängers auf. Damit ist der Empfänger solange abgeschaltet, während irsnd_ISR() noch Daten sendet. Die Timer-Initialisierungsroutine ist für IRMP und IRSND dann natürlich dieselbe.&lt;br /&gt;
&lt;br /&gt;
Eine gemeinsame main-Funktion könnte dann zum Beispiel folgendermaßen aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
int&lt;br /&gt;
main (void)&lt;br /&gt;
{&lt;br /&gt;
  IRMP_DATA irmp_data;&lt;br /&gt;
&lt;br /&gt;
  irmp_init();                // initialize irmp&lt;br /&gt;
  irsnd_init();               // initialize irsnd&lt;br /&gt;
  timer_init();               // initialize timer&lt;br /&gt;
  sei ();                     // enable interrupts&lt;br /&gt;
&lt;br /&gt;
  for (;;)&lt;br /&gt;
  {&lt;br /&gt;
    if (irmp_get_data (&amp;amp;irmp_data))&lt;br /&gt;
    {&lt;br /&gt;
      irmp_data.flags = 0;    // reset flags!&lt;br /&gt;
      irsnd_send_data (&amp;amp;irmp_data);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Funktion des obigen Sources ist offensichtlich: Ein empfangenes Telegramm wird nach vollständiger Decodierung wieder encodiert und dann wieder über die IR-Diode ausgesandt. Somit können dann zum Beispiel Signale &amp;quot;um die Ecke&amp;quot; oder streckenweise drahtgebunden übertragen werden.&lt;br /&gt;
&lt;br /&gt;
Desweiteren könnte man auch Protokolle transformieren, zum Beispiel NEC-Telegramme in RC5 umwandeln, wenn man seine Original-RC5-FB zu seinem Philips-Gerät verlegt hat...&lt;br /&gt;
&lt;br /&gt;
Der Rest bleibt der Phantasie des geneigten Lesers überlassen ;-)&lt;br /&gt;
&lt;br /&gt;
Hier noch die möglichen Werte für irmp_data.protocol, siehe auch irmp.h:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#define IRMP_SIRCS_PROTOCOL                      1              // Sony&lt;br /&gt;
#define IRMP_NEC_PROTOCOL                        2              // NEC, Pioneer, JVC, Toshiba, NoName etc.&lt;br /&gt;
#define IRMP_SAMSUNG_PROTOCOL                    3              // Samsung&lt;br /&gt;
#define IRMP_MATSUSHITA_PROTOCOL                 4              // Matsushita&lt;br /&gt;
#define IRMP_KASEIKYO_PROTOCOL                   5              // Kaseikyo (Panasonic etc)&lt;br /&gt;
#define IRMP_RECS80_PROTOCOL                     6              // Philips, Thomson, Nordmende, Telefunken, Saba&lt;br /&gt;
#define IRMP_RC5_PROTOCOL                        7              // Philips etc&lt;br /&gt;
#define IRMP_DENON_PROTOCOL                      8              // Denon, Sharp&lt;br /&gt;
#define IRMP_RC6_PROTOCOL                        9              // Philips etc&lt;br /&gt;
#define IRMP_SAMSUNG32_PROTOCOL                 10              // Samsung32: no sync pulse at bit 16, length 32 instead of 37&lt;br /&gt;
#define IRMP_APPLE_PROTOCOL                     11              // Apple, very similar to NEC&lt;br /&gt;
#define IRMP_RECS80EXT_PROTOCOL                 12              // Philips, Technisat, Thomson, Nordmende, Telefunken, Saba&lt;br /&gt;
#define IRMP_NUBERT_PROTOCOL                    13              // Nubert&lt;br /&gt;
#define IRMP_BANG_OLUFSEN_PROTOCOL              14              // Bang &amp;amp; Olufsen&lt;br /&gt;
#define IRMP_GRUNDIG_PROTOCOL                   15              // Grundig&lt;br /&gt;
#define IRMP_NOKIA_PROTOCOL                     16              // Nokia&lt;br /&gt;
#define IRMP_SIEMENS_PROTOCOL                   17              // Siemens, e.g. Gigaset&lt;br /&gt;
#define IRMP_FDC_PROTOCOL                       18              // FDC keyboard&lt;br /&gt;
#define IRMP_RCCAR_PROTOCOL                     19              // RC Car&lt;br /&gt;
#define IRMP_JVC_PROTOCOL                       20              // JVC (NEC with 16 bits)&lt;br /&gt;
#define IRMP_RC6A_PROTOCOL                      21              // RC6A, e.g. Kathrein, XBOX&lt;br /&gt;
#define IRMP_NIKON_PROTOCOL                     22              // Nikon&lt;br /&gt;
#define IRMP_RUWIDO_PROTOCOL                    23              // Ruwido, e.g. T-Home Mediareceiver&lt;br /&gt;
#define IRMP_IR60_PROTOCOL                      24              // IR60 (SAB2008)&lt;br /&gt;
#define IRMP_KATHREIN_PROTOCOL                  25              // Kathrein&lt;br /&gt;
#define IRMP_NETBOX_PROTOCOL                    26              // Netbox keyboard (bitserial)&lt;br /&gt;
#define IRMP_NEC16_PROTOCOL                     27              // NEC with 16 bits (incl. sync)&lt;br /&gt;
#define IRMP_NEC42_PROTOCOL                     28              // NEC with 42 bits&lt;br /&gt;
#define IRMP_LEGO_PROTOCOL                      29              // LEGO Power Functions RC&lt;br /&gt;
#define IRMP_THOMSON_PROTOCOL                   30              // Thomson&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Daten für die Adresse und das Kommando ermittelt man am besten über IRMP, siehe weiter oben ;-)&lt;br /&gt;
&lt;br /&gt;
== IRSND unter Linux und Windows ==&lt;br /&gt;
&lt;br /&gt;
irsnd.c lässt sich auch unter Linux direkt kompilieren, um damit Telegramme in Form von IRMP-Scan-Dateien zu erzeugen. Das geht folgendermaßen:&lt;br /&gt;
&lt;br /&gt;
    cc irsnd.c -o irsnd                            # IRSND compilieren&lt;br /&gt;
&lt;br /&gt;
Der Aufruf geht dann folgendermaßen:&lt;br /&gt;
&lt;br /&gt;
    ./irsnd protocol-number hex-address hex-command [repeat] &amp;gt; filename.txt&lt;br /&gt;
&lt;br /&gt;
also zum Beispiel für das NEC-Protokoll, Adresse 0x00FF, Kommando 0x0001&lt;br /&gt;
&lt;br /&gt;
    ./irsnd 2 00FF 0001 &amp;gt; nec.txt                   # irsnd ausführen&lt;br /&gt;
&lt;br /&gt;
IRSND kann man auch unter Windows nutzen, nämlich folgendermaßen:&lt;br /&gt;
&lt;br /&gt;
* Eingabeaufforderung starten&lt;br /&gt;
* In das Verzeichnis von irsnd wechseln&lt;br /&gt;
* Aufruf von:&lt;br /&gt;
&lt;br /&gt;
            irsnd.exe 2 00FF 0001 &amp;gt; nec.txt&lt;br /&gt;
&lt;br /&gt;
Nun kann man direkt mit IRMP anschließend testen, ob das erzeugte Telegramm auch korrekt ist:&lt;br /&gt;
&lt;br /&gt;
            ./irmp &amp;lt; nec.txt&lt;br /&gt;
&lt;br /&gt;
bzw. unter Windows:&lt;br /&gt;
&lt;br /&gt;
            irmp.exe &amp;lt; nec.txt&lt;br /&gt;
&lt;br /&gt;
Das Ganze geht auch ohne Zwischendatei, nämlich:&lt;br /&gt;
&lt;br /&gt;
            ./irsnd 2 00FF 0001 | ./irmp&lt;br /&gt;
&lt;br /&gt;
bzw. unter Windows:&lt;br /&gt;
&lt;br /&gt;
            irsnd.exe 2 00FF 0001 | irmp.exe&lt;br /&gt;
&lt;br /&gt;
IRMP gibt dann als Ergebnis folgendes aus:&lt;br /&gt;
&lt;br /&gt;
            11111111000000001000000001111111 p =  2, a = 0x00ff, c = 0x0001, f = 0x00&lt;br /&gt;
&lt;br /&gt;
IRMP konnte also aus dem von IRSND generierten Frame wieder das Protokoll 2, Adresse 0x00FF und Kommando 0x0001 decodieren.&lt;br /&gt;
&lt;br /&gt;
Bitte beachten: Je nach benutztem Protokoll sind die Bit-Breiten der Adressen bzw. Kommandos verschieden, siehe obige Tabelle [http://www.mikrocontroller.net/articles/IRMP#Protokolle].&lt;br /&gt;
&lt;br /&gt;
Man kann also nicht mit jedem IR-Protokoll komplett 16-Bit breite Adressen oder Kommandos transparent übertragen.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= Anhang =&lt;br /&gt;
&lt;br /&gt;
== Die IR-Protokolle im Detail ==&lt;br /&gt;
&lt;br /&gt;
=== Pulse-Distance Protokolle ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;SIRCS&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 40 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Pulse Distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 Start-Bit + 12-20 Daten-Bits, kein Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 7 Kommando-Bits + 5 Adress-Bits + bis zu 8 zusätzliche Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 2400µs Puls, 600µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 600µs Puls, 600µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 1200µs Puls, 600µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || zweimalig nach ca. 25ms, d.h. 2. und 3. Frame&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || ab dem 4. identischen Frame, Abstand ca. 25ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;NEC + extended NEC&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 36 kHz / 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Pulse Distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 Start-Bit + 32 Daten-Bits + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten NEC || 8 Adress-Bits + 8 invertierte Adress-Bits + 8 Kommando-Bits + 8 invertierte Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Daten ext. NEC || 16 Adress-Bits + 8 Kommando-Bits + 8 invertierte Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 9000µs Puls, 4500µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 560µs Puls,  560µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 560µs Puls, 1690µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || 560µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || keine&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || 9000µs Puls, 2250µs Pause, 560µs Puls, ~100ms Pause&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;JVC&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Pulse Distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 Start-Bit + 16 Daten-Bits + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 4 Adress-Bits + 12 Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 9000µs Puls, 4500µs Pause, 6000µs Pause bei Tasten-Wiederholung&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 560µs Puls,  560µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 560µs Puls, 1690µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || 560µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || keine&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || Wiederholung nach Pause von 25ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;NEC16&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Pulse Distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 Start-Bit + 8 Adress-Bits + 1 Sync-Bit + 8 Daten-Bits + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 9000µs Puls, 4500µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Sync-Bit || 560µs Puls, 4500µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 560µs Puls,  560µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 560µs Puls, 1690µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || 560µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || keine/eine/zwei nach 25ms?&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || Wiederholung nach Pause von 25ms?&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;NEC42&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Pulse Distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 Start-Bit + 42 Daten-Bits + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 13 Adress-Bits + 13 invertierte Adress-Bits + 8 Kommando-Bits + 8 invertierte Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 9000µs Puls, 4500µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 560µs Puls,  560µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 560µs Puls, 1690µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || 560µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || keine&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || (unbekannt)&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;SAMSUNG&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || ?? kHz&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Pulse Distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 Start-Bit + 16 Daten(1)-Bits + 1 Sync-Bit + 20 Daten(2)-Bits + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten(1) || 16 Adress-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Daten(2) || 4 ID-Bits + 8 Kommando-Bits + 8 invertierte Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 4500µs Puls, 4500µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 550µs Puls,  450µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 550µs Puls, 1450µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Sync-Bit || 550µs Puls, 4500µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || 550µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || keine&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || N-fache Wiederholung des Original-Frames innerhalb von 100ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;SAMSUNG32&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Pulse Distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 Start-Bit + 32 Daten-Bits + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 16 Adress-Bits + 16 Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 4500µs Puls, 4500µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 550µs Puls,  450µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 550µs Puls, 1450µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || 550µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || einmalig nach 45ms&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || dritter, fünfter, siebter usw. identischer Frame&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;MATSUSHITA&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 36 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Pulse Distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 Start-Bit + 24 Daten-Bits + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 6 Hersteller-Bits + 6 Kommando-Bits + 12 Adress-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 3488µs Puls, 3488µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 872µs Puls,  872µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 872µs Puls, 2616µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || 872µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || keine&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || N-fache Wiederholung des Original-Frames innerhalb von 100ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || LSB first?&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;KASEIKYO&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Pulse Distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 Start-Bit + 48 Daten-Bits + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 16 Hersteller-Bits + 4 Parity-Bits + 4 Genre1-Bits + 4 Genre2-Bits + 10 Kommando-Bits + 2 ID-Bits + 8 Parity-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 3380µs Puls, 1690µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 423µs Puls,  423µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 423µs Puls, 1269µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || 423µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || einmalig nach 74ms&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || N-fache Wiederholung des Original-Frames innerhalb von 74ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || LSB first?&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;RECS80&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Pulse Distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 Start-Bits + 10 Daten-Bits + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 1 Toggle-Bit + 3 Adress-Bits + 6 Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 158µs Puls, 7432µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 158µs Puls, 4902µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 158µs Puls, 7432µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || 158µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || keine&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || N-fache Wiederholung des Original-Frames innerhalb von 100ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;RECS80EXT&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Pulse Distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 2 Start-Bits + 11 Daten-Bits + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 1 Toggle-Bit + 4 Adress-Bits + 6 Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 158µs Puls, 3637µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 158µs Puls, 4902µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 158µs Puls, 7432µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || 158µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || keine&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || N-fache Wiederholung des Original-Frames innerhalb von 100ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;DENON&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 38 kHz (in der Praxis, lt. Dokumentation: 32 kHz)&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Pulse Distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 0 Start-Bits + 15 Data-Bits + 1 Stop-Bit + 65ms Pause + 15 invertierte Daten-Bits + 1 Stop-bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 5 Address-Bits + 10 Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || kein Start-Bit&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 310µs Puls, 745µs Pause (in der Praxis, lt. Doku: 275µs Puls, 775µs Pause)&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 310µs Puls, 1780µs Pause (in der Praxis, lt. Doku: 275µs Puls, 1900µs Pause)&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || 310µs Puls (310µs Puls, 745µs Pause (in der Praxis, lt. Doku: 275µs Puls)&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || keine&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || N-fache Wiederholung des Original-Frames innerhalb von 100ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;APPLE&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Pulse Distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 Start-Bit + 32 Daten-Bits + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 16 Adress-Bits + 11100000 + 8 Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || siehe NEC&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || siehe NEC&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || siehe NEC&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || siehe NEC&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || keine&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || N-fache Wiederholung des Original-Frames innerhalb von 100ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;NUBERT&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 36 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Pulse Distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 Start-Bit + 10 Daten-Bits + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 0 Adress-Bits + 10 Kommando-Bits ?&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 1340µs Puls, 340µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 500µs Puls, 1300µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 1340µs Puls, 340µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || 500µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || einmalig nach 35ms&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || dritter, fünfter, siebter usw. identischer Frame&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || MSB first?&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;B&amp;amp;O&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 455 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Pulse Distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 4 Start-Bits + 16 Daten-Bits + 1 Trailer-Bit + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 0 Adress-Bits + 16 Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit 1 || 200µs Puls, 2925µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit 2 || 200µs Puls, 2925µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit 3 || 200µs Puls, 15425µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit 4 || 200µs Puls, 2925µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 200µs Puls, 2925µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 200µs Puls, 9175µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| R-Bit || 200µs Puls, 6050µs Pause, wiederholt das letzte Bit (repetition)&lt;br /&gt;
|-&lt;br /&gt;
| Trailer-Bit || 200µs Puls, 12300µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || 200µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || keine&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || N-fache Wiederholung des Original-Frames innerhalb von 100ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;FDC&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Pulse Distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 Start-Bit + 40 Daten-Bits + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 8 Adress-Bits + 12 x 0-Bits + 4 Press/Release-Bits + 8 Kommando-Bits + 8 invertierte Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 2085µs Puls, 966µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 300µs Puls,  220µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 300µs Puls, 715µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || 300µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || keine&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Drücken || Press/Release-Bits = 0000&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Loslassen || Press/Release-Bits = 1111&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || Wiederholung nach Pause von 60ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;RCCAR&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Pulse Distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 Start-Bit + 13 Daten-Bits + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten || C0 C1 A0 A1 D0 D1 D2 D3 D4 D5 D6 D7 V&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 2000µs Puls, 2000µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 600µs Puls,  900µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 600µs Puls, 450µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || 600µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || keine&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || keine?&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Bi-Phase Protokolle ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;RC5 + RC5X&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 36 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Bi-Phase (Manchester)&lt;br /&gt;
|-&lt;br /&gt;
| Frame RC5 || 2 Start-Bits + 12 Daten-Bits + 0 Stop-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Daten RC5 || 1 Toggle-Bit + 5 Adress-Bits + 6 Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Frame RC5X || 1 Start-Bit + 13 Daten-Bits + 0 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten RC5X || 1 invertiertes Kommando-Bit + 1 Toggle-Bit + 5 Adress-Bits + 6 Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 889µs Pause, 889µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 889µs Puls, 889µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 889µs Pause, 889µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || kein Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || keine&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || N-fache Wiederholung des Original-Frames innerhalb von 100ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;RC6&#039;&#039;&#039; + &#039;&#039;&#039;RC6A&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 36 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Bi-Phase (Manchester)&lt;br /&gt;
|-&lt;br /&gt;
| Frame RC6 || 1 Start-Bit + 1 Bit &amp;quot;1&amp;quot; + 3 Mode-Bits (000) + 1 Toggle-Bit + 16 Daten-Bits + 2666µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Frame RC6A || 1 Start-Bit + 1 Bit &amp;quot;1&amp;quot; + 3 Mode-Bits (110) + 1 Toggle-Bit + 31 Daten-Bits + 2666µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Daten RC6 || 8 Adress-Bits + 8 Kommando Bits&lt;br /&gt;
|-&lt;br /&gt;
| Daten RC6A || &amp;quot;1&amp;quot; + 14 Hersteller-Bits + 8 System-Bits + 8 Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 2666µs Puls, 889µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Toggle 0-Bit || 889µs Pause, 889µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| Toggle 1-Bit || 889µs Puls, 889µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 444µs Pause, 444µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 444µs Puls, 444µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || kein Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || keine&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || N-fache Wiederholung des Original-Frames innerhalb von 100ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;GRUNDIG + NOKIA&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 38 kHz (?)&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Bi-Phase (Manchester)&lt;br /&gt;
|-&lt;br /&gt;
| Frame-Paket || 1 Start-Frame + 19,968ms Pause + N Info-Frames + 117,76ms Pause + 1 Stop-Frame&lt;br /&gt;
|-&lt;br /&gt;
| Start-Frame || 1 Pre-Bit + 1 Start-Bit + 9 Daten-Bits (alle 1) + 0 Stop-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Info-Frame || 1 Pre-Bit + 1 Start-Bit + 9 Daten-Bits + 0 Stop-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Frame || 1 Pre-Bit + 1 Start-Bit + 9 Daten-Bits (alle 1) + 0 Stop-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Daten Grundig || 9 Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Daten Nokia || 8 Kommando-Bits + 8 Address-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Pre-Bit || 528µs Puls, 2639µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 528µs Puls, 528µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 528µs Pause, 528µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 528µs Puls, 528µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || kein Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || keine&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || N-fache Wiederholung des Info-Frames mit einem Pausenabstand von 117,76ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;SIEMENS + RUWIDO&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 36 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Bi-Phase (Manchester)&lt;br /&gt;
|-&lt;br /&gt;
| Frame Siemens || 1 Start-Bit + 22 Daten-Bits + 0 Stop-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Frame Ruwido || 1 Start-Bit + 17 Daten-Bits + 0 Stop-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Daten Siemens || 11 Adress-Bits + 10 Daten-Bits + 1 invertiertes Bit (letztes Bit davor nochmal invertiert)&lt;br /&gt;
|-&lt;br /&gt;
| Daten Ruwido || 9 Adress-Bits + 7 Daten-Bits + 1 invertiertes Bit (letztes Bit davor nochmal invertiert)&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 275µs Puls, 275µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 275µs Pause, 275µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 275µs Puls, 275µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || kein Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || 1-malige Wiederholung mit gesetztem Repeat-Bit (?)&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || N-fache Wiederholung des Original-Frames innerhalb von 100ms (?)&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Serial Protokolle ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;NETBOX&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Serial&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 Start-Bit + 16 Daten-Bits, kein Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 3 Adress-Bits + 13 Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 2400µs Puls, 800µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Bitlänge || 800µs&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || keine&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || Abstand ca. 35ms?&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Software-Historie IRMP ==&lt;br /&gt;
&lt;br /&gt;
Änderungen IRMP:&lt;br /&gt;
&lt;br /&gt;
Version 2.0.1:&lt;br /&gt;
&lt;br /&gt;
* 20.09.2011: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: KATHREIN&lt;br /&gt;
* 20.09.2011: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: RUWIDO&lt;br /&gt;
* 20.09.2011: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: THOMSON&lt;br /&gt;
* 20.09.2011: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: IR60&lt;br /&gt;
* 20.09.2011: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: LEGO&lt;br /&gt;
* 20.09.2011: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: NEC16&lt;br /&gt;
* 20.09.2011: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: NEC42&lt;br /&gt;
* 20.09.2011: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: NETBOX&lt;br /&gt;
* 20.09.2011: Portierung auf ATtiny84 und ATtiny85&lt;br /&gt;
* 20.09.2011: Verbesserung von Tastenwiederholungen bei RC5&lt;br /&gt;
* 20.09.2011: Verbessertes Decodieren von Bi-Phase-Protokollen&lt;br /&gt;
* 20.09.2011: Korrekturen am RECS80-Decoder&lt;br /&gt;
* 20.09.2011: Korrekturen beim Erkennen von zusätzlichen Bits im SIRCS-Protocol&lt;br /&gt;
&lt;br /&gt;
Ältere Versionen:&lt;br /&gt;
&lt;br /&gt;
* 18.01.2011: Korrekturen für Siemens-Protokoll&lt;br /&gt;
* 18.01.2011: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: NIKON&lt;br /&gt;
* 18.01.2011: Speichern der zusätzlichen Bits (&amp;gt;12) im SIRCS-Protokoll in der Adresse&lt;br /&gt;
* 18.01.2011: Timing-Korrekturen für Denon-Protokoll&lt;br /&gt;
&lt;br /&gt;
* 04.09.2010: Bugfix für F_INTERRUPTS &amp;gt;= 16000&lt;br /&gt;
&lt;br /&gt;
* 02.09.2010: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: RC6A&lt;br /&gt;
&lt;br /&gt;
* 29.08.2010: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: JVC&lt;br /&gt;
* 29.08.2010: Kaseikyo-Protokoll: Berücksichtigung der Genre-Bits. &#039;&#039;&#039;ACHTUNG: dadurch neue Command-Codes!&#039;&#039;&#039;&lt;br /&gt;
* 29.08.2010: Kaseikyo-Protokoll: Verbesserte Behandlung von Wiederholungs-Frames&lt;br /&gt;
* 29.08.2010: Verbesserte Unterstützung des APPLE-Protokolls. &#039;&#039;&#039;ACHTUNG: dadurch neue Adress-Codes!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* 01.07.2010: Bugfix: Einführen eines Timeouts für NEC-Repetition-Frames, um &amp;quot;Geisterkommandos&amp;quot; zu verhindern.&lt;br /&gt;
&lt;br /&gt;
* 26.06.2010: Bugfix: Deaktivieren von RECS80, RECS80EXT &amp;amp; SIEMENS bei geringer Interrupt-Rate&lt;br /&gt;
&lt;br /&gt;
* 25.06.2010: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: RCCAR&lt;br /&gt;
* 25.06.2010: Tastenerkennung für FDC-Protokoll (IR-keyboard) erweitert&lt;br /&gt;
* 25.06.2010: Interrupt-Frequenz nun bis zu 20kHz möglich&lt;br /&gt;
&lt;br /&gt;
* 09.06.2010: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: FDC (IR-keyboard)&lt;br /&gt;
* 09.06.2010: Timing für DENON-Protokoll korrigiert&lt;br /&gt;
&lt;br /&gt;
* 02.06.2010: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: Siemens (Gigaset)&lt;br /&gt;
&lt;br /&gt;
* 26.05.2010: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: Nokia&lt;br /&gt;
* 26.05.2010: Bugfix Auswertung von langen Tastendrücken bei Grundig-Protokoll&lt;br /&gt;
&lt;br /&gt;
* 17.05.2010: Bugfix SAMSUNG32-Protokoll: Kommando-Bit-Maske korrigiert&lt;br /&gt;
&lt;br /&gt;
* 16.05.2010: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: Grundig&lt;br /&gt;
* 16.05.2010: Behandlung von automatischen Frame-Wiederholungen beim SIRCS-, SAMSUNG32- und NUBERT-Protokoll verbessert.&lt;br /&gt;
&lt;br /&gt;
* 28.04.2010: Nur einige kosmetische Code-Optimierungen&lt;br /&gt;
&lt;br /&gt;
* 16.04.2010: Sämtliche Timing-Toleranzen angepasst/optimiert&lt;br /&gt;
&lt;br /&gt;
* 12.04.2010: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: Bang &amp;amp; Olufsen&lt;br /&gt;
&lt;br /&gt;
* 29.03.2010: Bugfix beim Erkennen von mehrfachen NEC-Repetition-Frames&lt;br /&gt;
* 29.03.2010: Konfiguration in irmpconfig.h ausgelagert&lt;br /&gt;
* 29.03.2010: Einführung einer Programmversion in README.txt: Version 1.0&lt;br /&gt;
&lt;br /&gt;
* 17.03.2010: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: Nubert&lt;br /&gt;
&lt;br /&gt;
* 16.03.2010: Korrektur der RECS80-Startbit-Timings&lt;br /&gt;
* 16.03.2010: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: RECS80 Extended&lt;br /&gt;
&lt;br /&gt;
* 15.03.2010: Codeoptimierung&lt;br /&gt;
&lt;br /&gt;
* 14.03.2010: Portierung auf PIC&lt;br /&gt;
&lt;br /&gt;
* 11.03.2010: Anpassungen an verschiedene ATMega-Typen durchgeführt&lt;br /&gt;
&lt;br /&gt;
* 07.03.2010: Bugfix: Zurücksetzen der Statemachine nach einem unvollständigen RC5-Frame&lt;br /&gt;
&lt;br /&gt;
* 05.03.2010: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: Apple&lt;br /&gt;
* 05.03.2010: Die Daten irmp_data.addr + irmp_data.command werden nun in der jeweiligen Bit-Order des verwendeten Protokolls gespeichert&lt;br /&gt;
&lt;br /&gt;
* 04.03.2010: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: SAMSUNG32 (Mix aus SAMSUNG &amp;amp; NEC-Protokoll)&lt;br /&gt;
* 04.03.2010: Änderung der SIRCS- und Kaseikyo-Toleranzen&lt;br /&gt;
&lt;br /&gt;
* 02.03.2010: SIRCS: Korrekte Erkennung und Unterdrückung von automatischen Frame-Wiederholungen&lt;br /&gt;
* 02.03.2010: SIRCS: Device-ID-Bits werden nun in irmp_data.command und nicht mehr in irmp_data.address gespeichert&lt;br /&gt;
* 02.03.2010: Vergrößerung des Scan Buffers (zwecks Protokollierung)&lt;br /&gt;
&lt;br /&gt;
* 24.02.2010: Neue Variable flags in IRMP_DATA zur Erkennung von langen Tastendrücken&lt;br /&gt;
&lt;br /&gt;
* 20.02.2010: Bugfix Denon-Protokoll: Wiederholungsframe grundsätzlich invertiert&lt;br /&gt;
&lt;br /&gt;
* 19.02.2010: Erkennung von NEC-Protokoll-Varianten, z.&amp;amp;nbsp;B. Apple-Fernbedienung&lt;br /&gt;
* 19.02.2010: Erkennung von RC6- und Denon-Protokoll&lt;br /&gt;
* 19.02.2010: Verbesserung des RC5-Decoders (Bugfixes)&lt;br /&gt;
&lt;br /&gt;
* 13.02.2010: Bugfix: Puls/Pausen-Counter um 1 zu niedrig, nun bessere Erkennung bei Protokollen mit sehr kurzen Pulszeiten&lt;br /&gt;
* 13.02.2010: Erkennung der NEC-Wiederholungssequenz&lt;br /&gt;
&lt;br /&gt;
* 12.02.2010: RC5-Protokoll-Decoder hinzugefügt&lt;br /&gt;
&lt;br /&gt;
* 05.02.2010: Konflikt zwischen Samsung- und Matsushita-Protokoll beseitigt&lt;br /&gt;
&lt;br /&gt;
* 07.01.2010: Erste Version&lt;br /&gt;
&lt;br /&gt;
== Software-Historie IRSND ==&lt;br /&gt;
&lt;br /&gt;
Änderungen IRSND:&lt;br /&gt;
&lt;br /&gt;
Version 2.0.1:&lt;br /&gt;
&lt;br /&gt;
* 20.09.2011: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: THOMSON&lt;br /&gt;
* 20.09.2011: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: LEGO&lt;br /&gt;
* 20.09.2011: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: NEC16&lt;br /&gt;
* 20.09.2011: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: NEC42&lt;br /&gt;
* 20.09.2011: Portierung auf ATtiny84 und ATtiny85&lt;br /&gt;
* 20.09.2011: Korrektur von Pausenlängen&lt;br /&gt;
* 20.09.2011: Korrekturen von irsnd_stop()&lt;br /&gt;
* 20.09.2011: Korrektur des SIEMENS-Timings&lt;br /&gt;
* 20.09.2011: Umstellung auf 36kHz Modulationsfrequenz für DENON-Protokoll&lt;br /&gt;
* 20.09.2011: Korrektur Behandlung zusätzlicher Bits im SIRCS Protokoll&lt;br /&gt;
&lt;br /&gt;
Ältere Versionen:&lt;br /&gt;
&lt;br /&gt;
* 18.01.2011: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: RC6A&lt;br /&gt;
* 18.01.2011: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: RC6&lt;br /&gt;
* 18.01.2011: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: NIKON&lt;br /&gt;
* 18.01.2011: Beachten der zusätzlichen Bits (&amp;gt;12) im SIRCS-Protokoll&lt;br /&gt;
* 18.01.2011: Korrektur der Pausenlängen&lt;br /&gt;
* 18.01.2011: Timing-Korrekturen für Denon-Protokoll&lt;br /&gt;
&lt;br /&gt;
* 02.09.2010: Neues Protokoll: JVC&lt;br /&gt;
* 02.09.2010: Anpassung des APPLE-Encoders an IRMP-Version 1.7.3.&lt;br /&gt;
&lt;br /&gt;
* 29.08.2010: Neues Protokoll: Kaseikyo (Panasonic u.a.)&lt;br /&gt;
&lt;br /&gt;
* 01.07.2010: Bugfix: Deaktivieren von RECS80, RECS80EXT &amp;amp; SIEMENS bei geringer Interrupt-Rate&lt;br /&gt;
&lt;br /&gt;
* 25.06.2010: Neues Protokoll: RCCAR&lt;br /&gt;
&lt;br /&gt;
* 09.06.2010: Neues Protokoll: FDC (IR-keyboard)&lt;br /&gt;
* 09.06.2010: Timing für DENON-Protokoll korrigiert&lt;br /&gt;
&lt;br /&gt;
* 02.06.2010: Neues Protokoll: Siemens (Gigaset)&lt;br /&gt;
* 02.06.2010: Simulation von langen Tastendrücken&lt;br /&gt;
&lt;br /&gt;
* 26.05.2010: Neues Protokoll: Nokia&lt;br /&gt;
&lt;br /&gt;
* 17.05.2010: Neues Protokoll: Grundig&lt;br /&gt;
* 17.05.2010: Behandlung von Frame-Wiederholungen für SIRCS, SAMSUNG32 und NUBERT korrigiert&lt;br /&gt;
&lt;br /&gt;
* 28.04.2010: Unterstützung des APPLE-Protokolls&lt;br /&gt;
* 28.04.2010: Konfiguration über irmpconfig.h&lt;br /&gt;
&lt;br /&gt;
* 16.04.2010: Sämtliche Timing-Toleranzen angepasst/optimiert&lt;br /&gt;
&lt;br /&gt;
* 14.04.2010: Neues Protokoll: Bang &amp;amp; Olufsen&lt;br /&gt;
&lt;br /&gt;
* 17.03.2010: Neues Protokoll: Nubert&lt;br /&gt;
* 17.03.2010: Korrektur der Pausen zwischen Frame-Wiederholungen&lt;br /&gt;
&lt;br /&gt;
* 16.03.2010: Korrektur des Timer-Registers TCCR2&lt;br /&gt;
* 16.03.2010: Korrektur der RECS80-Startbit-Timings&lt;br /&gt;
* 16.03.2010: Neues Protokoll: RECS80 Extended &lt;br /&gt;
&lt;br /&gt;
* 11.03.2010: Anpassungen an verschiedene ATMega-Typen durchgeführt&lt;br /&gt;
&lt;br /&gt;
* 07.03.2010: Alpha-Version&lt;br /&gt;
&lt;br /&gt;
== Literatur ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; IR-Übersicht &#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* http://www.epanorama.net/links/irremote.html&lt;br /&gt;
* http://www.elektor.de/jahrgang/2008/juni/cc2-avr-projekt-%283%29-unsichtbare-kommandos.497184.lynkx?tab=4 (IR Übersicht &amp;amp; RC5)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SIRCS-Protokoll&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* http://www.sbprojects.com/knowledge/ir/sirc.htm&lt;br /&gt;
* http://www.ustr.net/infrared/sony.shtml&lt;br /&gt;
* http://users.telenet.be/davshomepage/sony.htm&lt;br /&gt;
* http://picprojects.org.uk/projects/sirc/&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;NEC-Protokoll:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* http://www.sbprojects.com/knowledge/ir/nec.htm&lt;br /&gt;
* http://www.ustr.net/infrared/nec.shtml&lt;br /&gt;
* http://www.celadon.com/infrared_protocol/infrared_protocols_samples.pdf&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;NEC16-Protokoll (JVC):&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* http://www.ustr.net/infrared/jvc.shtml&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SAMSUNG-Protokoll:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
(wurde aus diversen Protokollen (Daewoo u.ä.) zusammengereimt, daher kein direkter Link auf irgendwelche SAMSUNG-Dokumentation verfügbar)&lt;br /&gt;
&lt;br /&gt;
Hier ein Link zum Daewoo-Protokoll, welches dasselbe Prinzip des Sync-Bits in der Mitte eines Frames nutzt, jedoch mit anderen Timing-Werten arbeitet:&lt;br /&gt;
&lt;br /&gt;
* http://users.telenet.be/davshomepage/daewoo.htm&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MATSUHITA-Protokoll:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* http://www.celadon.com/infrared_protocol/infrared_protocols_samples.pdf&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KASEIKYO-Protokoll (auch &amp;quot;Japan-Protokoll&amp;quot;):&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* http://www.mikrocontroller.net/attachment/4246/IR-Protokolle_Diplomarbeit.pdf&lt;br /&gt;
* http://www.roboternetz.de/phpBB2/files/entwicklung_und_realisierung_einer_universalinfrarotfernbedienung_mit_timerfunktionen.pdf&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RECS80- und RECS80-Extended-Protokoll:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* http://www.sbprojects.com/knowledge/ir/recs80.htm&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RC5- und RC5x-Protokoll:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* http://www.sbprojects.com/knowledge/ir/rc5.htm&lt;br /&gt;
* http://users.telenet.be/davshomepage/rc5.htm&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Denon-Protokoll:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* http://www.mikrocontroller.com/de/IR-Protokolle.php#DENON&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RC6 und RC6A-Protokoll:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* http://www.sbprojects.com/knowledge/ir/rc6.htm&lt;br /&gt;
* http://slycontrol.ru/scr/kb/rc6.htm&lt;br /&gt;
* http://www.picbasic.nl/info_rc6_uk.htm&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bang &amp;amp; Olufsen:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* http://www.mikrocontroller.net/attachment/33137/datalink.pdf&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Grundig&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* http://www.mikrocontroller.net/attachment/77507/Grundig_10bit.pdf&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nokia&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* http://www.sbprojects.com/knowledge/ir/nrc17.htm&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Diverse Protokolle:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* http://www.mikrocontroller.net/attachment/4246/IR-Protokolle_Diplomarbeit.pdf&lt;br /&gt;
* http://www.celadon.com/infrared_protocol/infrared_protocols_samples.pdf&lt;br /&gt;
* http://www.opendcc.de/info/rc5/rc5.html&lt;br /&gt;
* http://www.roboternetz.de/phpBB2/files/entwicklung_und_realisierung_einer_universalinfrarotfernbedienung_mit_timerfunktionen.pdf&lt;br /&gt;
&lt;br /&gt;
== Hardware / IRMP-Projekte ==&lt;br /&gt;
&lt;br /&gt;
Eine Implementierung auf Basis IRMP und IRSND als Multiprotokoll Dekoder mit LCD&lt;br /&gt;
von Klaus Leidinger: &lt;br /&gt;
* http://www.mikrocontroller-projekte.de/Mikrocontroller/index.html&lt;br /&gt;
&lt;br /&gt;
Ähnliche Implementierung wie von Klaus Leidinger für Pollin AVR-NET-IO mit Pollin ADD-ON Board:&lt;br /&gt;
* http://son.ffdf-clan.de/include.php?path=forumsthread&amp;amp;threadid=703&lt;br /&gt;
&lt;br /&gt;
USB IR Remote Receiver von Hugo Portisch:&lt;br /&gt;
* http://www.mikrocontroller.net/articles/USB_IR_Remote_Receiver&lt;br /&gt;
&lt;br /&gt;
Servo-gesteuerter IR Sender mit Anlernfunktion von Stefan Pendsa:&lt;br /&gt;
* http://forum.mikrokopter.de/topic-21060.html&lt;br /&gt;
* (SVN) http://svn.mikrokopter.de/listing.php?repname=Projects&amp;amp;path=%2FServo-Controlled+IR-Transmitter%2F&amp;amp;#Ad2417800d6aa14bf08c571a896e9def7&lt;br /&gt;
&lt;br /&gt;
Lernfähige IR-Fernbedienung von Robert und Frank M.&lt;br /&gt;
* http://www.mikrocontroller.net/articles/DIY_Lernfähige_Fernbedienung_mit_IRMP&lt;br /&gt;
&lt;br /&gt;
== Danksagung ==&lt;br /&gt;
&lt;br /&gt;
Ganz herzlich bedanken möchte ich mich bei Vlad Tepesch, Klaus Leidinger und Peter K., die mich mit Scan-Dateien ihrer Infrarot-Fernbedienungen versorgt haben. Dank auch an Klaus für seine nächtelangen Tests von IRMP &amp;amp; IRSND.&lt;br /&gt;
&lt;br /&gt;
Ebenso bedanken möchte ich mich bei Christian F. für seine Tipps zur PIC-Portierung.&lt;br /&gt;
&lt;br /&gt;
== Diskussion ==&lt;br /&gt;
&lt;br /&gt;
Meinungen, Verbesserungsvorschläge, harsche Kritik und ähnliches kann im [http://www.mikrocontroller.net/topic/162119 Beitrag: Infrared Multi Protocol Decoder] geäussert werden.&lt;br /&gt;
&lt;br /&gt;
Viel Spaß mit IRMP!&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Datenübertragung]]&lt;br /&gt;
[[Kategorie:AVR-Projekte]]&lt;/div&gt;</summary>
		<author><name>Shortie</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=IRMP&amp;diff=50486</id>
		<title>IRMP</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=IRMP&amp;diff=50486"/>
		<updated>2010-09-08T17:43:12Z</updated>

		<summary type="html">&lt;p&gt;Shortie: /* Hardware / IRMP-Projekte */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Von &#039;&#039;&#039;Frank M. ([http://www.mikrocontroller.net/user/show/ukw ukw])&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= IRMP - Infrarot-Multiprotokoll-Decoder =&lt;br /&gt;
&lt;br /&gt;
[[Datei:irmp-title.png| |Scan eines NEC-kompatiblen Fernbedienungssignals]]&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
[[Datei:IRMP-TSOP1736.png|miniatur|Anschluß eines IR-Empfängers an µC]]&lt;br /&gt;
&lt;br /&gt;
Da RC5 nicht nur veraltet, sondern mittlerweile obsolet ist und immer mehr die elektronischen Geräte der fernöstlichen Unterhaltungsindustrie in unseren Haushalten Einzug finden, ist es an der Zeit, einen IR-Decoder zu entwickeln, der ca. 90% aller bei uns im täglichen Leben zu findenden IR-Fernbedienungen &amp;quot;versteht&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
IRMP - der Infrarot-Fernbedienungsdecoder, der mehrere Protokolle auf einmal decodieren kann, beherrscht folgende Protokolle:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Protokoll || Hersteller&lt;br /&gt;
|-&lt;br /&gt;
| SIRCS || Sony&lt;br /&gt;
|-&lt;br /&gt;
| NEC || NEC, Yamaha, Canon, Tevion, Harman/Kardon, Hitachi, JVC, Pioneer, Toshiba, Xoro, Orion, NoName und viele weitere japanische Hersteller.&lt;br /&gt;
|-&lt;br /&gt;
| SAMSUNG || Samsung&lt;br /&gt;
|-&lt;br /&gt;
| SAMSUNG32 || Samsung&lt;br /&gt;
|-&lt;br /&gt;
| MATSUSHITA || Matsushita&lt;br /&gt;
|-&lt;br /&gt;
| KASEIKYO || Panasonic, Technics, Denon und andere japanische Hersteller, welche Mitglied der &amp;quot;Japan&#039;s Association for Electric Home Application&amp;quot; sind.&lt;br /&gt;
|-&lt;br /&gt;
| RECS80 || Philips, Nokia, Thomson, Nordmende, Telefunken, Saba&lt;br /&gt;
|-&lt;br /&gt;
| RECS80EXT || Philips, Technisat, Thomson, Nordmende, Telefunken, Saba&lt;br /&gt;
|-&lt;br /&gt;
| RC5 || Philips und andere europäische Hersteller&lt;br /&gt;
|-&lt;br /&gt;
| DENON || Denon&lt;br /&gt;
|-&lt;br /&gt;
| RC6 || Philips und andere europäische Hersteller&lt;br /&gt;
|-&lt;br /&gt;
| RC6A || Philips, Kathrein und andere Hersteller, z.B. XBOX (&#039;&#039;&#039;NEU!&#039;&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| APPLE || Apple&lt;br /&gt;
|-&lt;br /&gt;
| NUBERT || Nubert, z.B. Subwoofer System&lt;br /&gt;
|-&lt;br /&gt;
| B&amp;amp;O || Bang &amp;amp; Olufsen&lt;br /&gt;
|-&lt;br /&gt;
| GRUNDIG || Grundig&lt;br /&gt;
|-&lt;br /&gt;
| NOKIA || Nokia, z.B. D-Box&lt;br /&gt;
|-&lt;br /&gt;
| SIEMENS || Siemens, z.B. Gigaset M740AV (ab ~15kHz, siehe Bemerkungen zu F_INTERRUPTS)&lt;br /&gt;
|-&lt;br /&gt;
| FDC || FDC Keyboard (ab ~15kHz)&lt;br /&gt;
|-&lt;br /&gt;
| RCCAR || RC Car: IR Fernbedienung für Modellfahrzeuge&lt;br /&gt;
|-&lt;br /&gt;
| JVC || JVC  (&#039;&#039;&#039;NEU!&#039;&#039;&#039;)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Jedes dieser Protokolle ist einzeln aktivierbar. Wer möchte, kann alle Protokolle aktivieren, wer nur ein Protokoll braucht, kann alle anderen deaktivieren. Es wird nur das vom Compiler übersetzt, was auch benötigt wird.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ein paar Bemerkungen zu den einzelnen Protokollen:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Einige Hersteller verwenden ihr eigenes Protokoll, dazu gehören u.a. Sony, Samsung und Matsushita. Philips hat RC5 entwickelt und natürlich auch selbst benutzt. RC5 galt damals in Europa als &#039;&#039;das&#039;&#039; Standard-IR-Protokoll, welches von vielen europäischen Herstellern übernommen wurde. Mittlerweile ist RC5 fast gar nicht mehr anzutreffen - man kann es eigentlich als &amp;quot;ausgestorben&amp;quot; abhaken.&lt;br /&gt;
&lt;br /&gt;
Auch die japanischen Hersteller haben versucht, einen eigenen Standard zu etablieren, nämlich das sog. Kaseikyo- (oder auch &amp;quot;Japan-&amp;quot;) Protokoll. Dieses ist mit einer Bitlänge von 48 sehr universell und allgemein verwendbar. Richtig durchgesetzt hat es sich aber bis heute nicht. Ich selbst habe jedenfalls noch keine einzige Fernbedienung gesehen, die das Kaseikyo-Protokoll nutzt.&lt;br /&gt;
&lt;br /&gt;
Heutzutage wird vornehmlich das NEC-Protokoll verwendet - und zwar von den unterschiedlichsten (Marken- und auch Noname-)Herstellern. Ich schätze den &amp;quot;Marktanteil&amp;quot; auf ca. 80% beim NEC-Protokoll. Fast alle Fernbedienungen im alltäglichen Einsatz verwenden bei mir den NEC-IR-Code. Das fängt beim Fernseher an, geht über vom DVD-Player zur Notebook-Fernbedienung und reicht bis zur Noname-MultiMedia-Festplatte - um nur einige Beispiele zu nennen.&lt;br /&gt;
&lt;br /&gt;
Der auf AVR- und PIC-µCs einsetzbare Source zu IRMP entstand im Rahmen des [[Word Clock]] Projektes.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anlass für einen eigenen IRMP-Artikel ist folgender Thread in der Codesammlung: [http://www.mikrocontroller.net/topic/162119 Beitrag: IRMP - Infrared Multi Protocol Decoder]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Protokolle ==&lt;br /&gt;
&lt;br /&gt;
[[Datei:nec-protocol.png|miniatur|NEC-Protokoll, Reichelt RGB-LED-Fernbedienung, T-&amp;gt;A: 9,14ms, A-&amp;gt;B: 4,42ms, B-&amp;gt;C: 660us]]&lt;br /&gt;
&lt;br /&gt;
Die von IRMP decodierten Protokolle haben etwas gemeinsames: Sie weisen alle ein Start-Bit auf, welches vom Timing her ausgezeichnet, d.h. einmalig ist.&lt;br /&gt;
&lt;br /&gt;
Anhand dieses Start-Bit-Timings werden die verschiedenen Protokolle unterschieden. IRMP misst also das Timing des Start-Bits und stellt dann &amp;quot;on-thy-fly&amp;quot; seine Timingtabellen auf das erkannte Protokoll um, damit die nach dem Start-Bit gesandten Daten in einem Rutsch eingelesen werden können, ohne das komplette Telegramm (Frame) erst speichern zu müssen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Eine tabellarische Aufstellung der verschiedenen IR-Protokolle findet man hier: [http://www.mikrocontroller.net/articles/IRMP#Die_IR-Protokolle_im_Detail Die IR-Protokolle im Detail].&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die angegebenen Timingwerte sind Idealwerte. Bei einigen Fernbedienungen in der Praxis weichen sie um bis zu 40% voneinander ab. Deshalb arbeitet IRMP mit Minimum-/Maximumsgrenzen, um bzgl. des Zeitverhaltens tolerabel zu sein.&lt;br /&gt;
&lt;br /&gt;
== Download ==&lt;br /&gt;
&lt;br /&gt;
Version 1.8.1, Stand vom 04.09.2010&lt;br /&gt;
&lt;br /&gt;
Download Release-Version: [http://www.mikrocontroller.net/wikifiles/7/79/Irmp.zip Irmp.zip] &lt;br /&gt;
&lt;br /&gt;
IRMP &amp;amp; IRSND sind nun auch über SVN abrufbar: [http://www.mikrocontroller.net/svnbrowser/irmp/ IRMP im SVN], Download [http://www.mikrocontroller.net/svnbrowser/irmp/?view=tar Tarball]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die Version im SVN kann eine Zwischen- oder Test-Version sein, die nicht den hier dokumentierten Stand widerspiegelt! Im Zweifel verwendet man besser den obigen Download-Link auf Irmp.zip.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die Software-Änderungen kann man sich hier anschauen: [http://www.mikrocontroller.net/articles/IRMP#Software-Historie_IRMP Software-Historie IRMP]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Source-Code ==&lt;br /&gt;
&lt;br /&gt;
Der Source-Code lässt sich einfach für AVR-µCs übersetzen, indem man die Projekt-Datei irmp.aps in den WinAVR lädt.&lt;br /&gt;
&lt;br /&gt;
Aber auch für die Codevision Nutzer ist IRMP entsprechend angepasst: hier muss man die Zeile&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
  //#define CODEVISION&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
in main.c aktivieren, das heisst, die Kommentarzeichen entfernen.&lt;br /&gt;
&lt;br /&gt;
Auch auf PIC-Prozessoren ist IRMP lauffähig. Für den PIC-CCS-Compiler sind entsprechende Preprocessor-Konstanten bereits gesetzt, so dass man irmp.c direkt in der CCS-Entwicklungsumgebung verwenden kann. Lediglich eine kleine Interrupt-Routine wie&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void  TIMER2_isr(void) &lt;br /&gt;
{&lt;br /&gt;
 irmp_ISR ();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ist hinzuzufügen, wobei man den Interrupt auf 100µs (also 10kHz) stellt. &lt;br /&gt;
&lt;br /&gt;
Für AVR-Prozessoren ist ein Beispiel für die Anwendung von IRMP in main.c zu finden - im wesentlichen geht es da um die Timer-Initialisierung und den Abruf der empfangenen IR-Telegramme.&lt;br /&gt;
&lt;br /&gt;
Die Konfiguration von IRMP wird über Parameter in irmpconfig.h vorgenommen, nämlich:&lt;br /&gt;
&lt;br /&gt;
* Anzahl Interrupts pro Sekunde&lt;br /&gt;
* Unterstützte IR-Protokolle&lt;br /&gt;
* Hardware-Pin zum IR-Empfänger&lt;br /&gt;
* IR-Logging&lt;br /&gt;
&lt;br /&gt;
IRMP decodiert sämtliche oben aufgelisteten Protokolle in einer ISR, siehe irmpconfig.h. Standardmäßig sind nur die meistgebrauchten Protokolle aktiviert. Möchte man zusätzliche Protokolle nutzen, oder weitere Protokolle abschalten, um Speicherplatz zu sparen, sind die entsprechenden Werte in irmpconfig.h durch Setzen von 1 (aktiviert) oder 0 (deaktiviert) neu einzustellen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//      Protocol                                Enable  Remarks                 F_INTERRUPTS        Program Space&lt;br /&gt;
#define IRMP_SUPPORT_SIRCS_PROTOCOL             1       // Sony SIRCS           &amp;gt;= 10000                 ~100 bytes&lt;br /&gt;
#define IRMP_SUPPORT_NEC_PROTOCOL               1       // NEC + APPLE          &amp;gt;= 10000                 ~250 bytes&lt;br /&gt;
#define IRMP_SUPPORT_SAMSUNG_PROTOCOL           1       // Samsung + Samsung32  &amp;gt;= 10000                 ~250 bytes&lt;br /&gt;
#define IRMP_SUPPORT_MATSUSHITA_PROTOCOL        1       // Matsushita           &amp;gt;= 10000                  ~50 bytes&lt;br /&gt;
#define IRMP_SUPPORT_KASEIKYO_PROTOCOL          1       // Kaseikyo             &amp;gt;= 10000                 ~250 bytes&lt;br /&gt;
#define IRMP_SUPPORT_DENON_PROTOCOL             1       // DENON                &amp;gt;= 10000                 ~250 bytes&lt;br /&gt;
#define IRMP_SUPPORT_JVC_PROTOCOL               1       // JVC                  &amp;gt;= 10000                 ~250 bytes&lt;br /&gt;
#define IRMP_SUPPORT_RC5_PROTOCOL               1       // RC5                  &amp;gt;= 10000                 ~250 bytes&lt;br /&gt;
#define IRMP_SUPPORT_RC6_PROTOCOL               1       // RC6 &amp;amp; RC6A           &amp;gt;= 10000                 ~200 bytes&lt;br /&gt;
#define IRMP_SUPPORT_GRUNDIG_PROTOCOL           1       // Grundig              &amp;gt;= 10000                 ~150 bytes&lt;br /&gt;
#define IRMP_SUPPORT_NOKIA_PROTOCOL             1       // Nokia                &amp;gt;= 10000                 ~150 bytes&lt;br /&gt;
#define IRMP_SUPPORT_NUBERT_PROTOCOL            1       // NUBERT               &amp;gt;= 10000                  ~50 bytes&lt;br /&gt;
#define IRMP_SUPPORT_BANG_OLUFSEN_PROTOCOL      1       // Bang &amp;amp; Olufsen       &amp;gt;= 10000                 ~200 bytes&lt;br /&gt;
#define IRMP_SUPPORT_FDC_PROTOCOL               0       // FDC3402 keyboard     &amp;gt;= 10000 (better 15000)   ~50 bytes (~400 in combination with RC5)&lt;br /&gt;
#define IRMP_SUPPORT_RCCAR_PROTOCOL             0       // RC Car               &amp;gt;= 10000 (better 15000)  ~150 bytes (~500 in combination with RC5)&lt;br /&gt;
#define IRMP_SUPPORT_SIEMENS_PROTOCOL           0       // Siemens Gigaset      &amp;gt;= 15000                 ~150 bytes&lt;br /&gt;
#define IRMP_SUPPORT_RECS80_PROTOCOL            0       // RECS80               &amp;gt;= 20000                  ~50 bytes&lt;br /&gt;
#define IRMP_SUPPORT_RECS80EXT_PROTOCOL         0       // RECS80EXT            &amp;gt;= 20000                  ~50 bytes&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipp:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Jedes von IRMP unterstützte IR-Protokoll &amp;quot;verbrät&amp;quot; ungefähr den oben angegebenen Speicher an Code. Hier kann man Optimierungen vornehmen: Zum Beispiel ist die Modulationsfrequenz von 455kHz beim B&amp;amp;O-Protokoll weitab von den Frequenzen, die von den anderen Protokollen verwendet werden. Hier braucht man evtl. andere IR-Empfänger, anderenfalls kann man diese Protokolle einfach deaktiveren. Zum Beispiel kann man mit einem TSOP1738 kein B&amp;amp;O-Protokoll (455kHz) mehr empfangen. &lt;br /&gt;
&lt;br /&gt;
Ausserdem werden die Protokolle SIEMENS/FDC/RCCAR erst ab einer Scan-Frequenz von ca. 15kHz zuverlässig erkannt. Bei RECS80/REC80EXT sind es sogar 20kHz. Wenn man also diese Protokolle nutzen will, muss man F_INTERRUPTS entsprechend anpassen, sonst erscheint beim Übersetzen eine entsprechende Warnung und die entsprechenden Protokolle werden dann automatisch abgeschaltet.&lt;br /&gt;
&lt;br /&gt;
Die von IRMP unterstützten Protokolle weisen Bitlängen - teilweise variabel, teilweise fest - von 12 bis 48 Bit auf. Diese werden über Preprocessor-Defines beschrieben.&lt;br /&gt;
&lt;br /&gt;
IRMP trennt diese IR-Telegramme prinzipiell in 3 Bereiche:&lt;br /&gt;
&lt;br /&gt;
 1. ID für verwendetes Protokoll&lt;br /&gt;
 2. Adresse bzw. Herstellercode&lt;br /&gt;
 3. Kommando&lt;br /&gt;
&lt;br /&gt;
Mittels der Funktion&lt;br /&gt;
&lt;br /&gt;
   irmp_get_data (IRMP_DATA * irmp_data_p)&lt;br /&gt;
&lt;br /&gt;
kann man ein decodiertes Telegramm abrufen. Der Return-Wert ist 1, wenn ein Telegramm eingelesen wurde, sonst 0. Im ersten Fall werden die Struct-Members&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
    irmp_data_p-&amp;gt;protocol&lt;br /&gt;
    irmp_data_p-&amp;gt;address&lt;br /&gt;
    irmp_data_p-&amp;gt;command&lt;br /&gt;
    irmp_data_p-&amp;gt;flags&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gefüllt.&lt;br /&gt;
&lt;br /&gt;
Das heisst: am Ende bekommt man dann über irmp_get_data() einfach drei&lt;br /&gt;
Werte (Protokoll, Adresse und Kommando-Code), die man über ein if oder switch checken kann, z.&amp;amp;nbsp;B. hier eine Routine, welche die Tasten 1-9 auf einer Fernbedienung auswertet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
   IRMP_DATA irmp_data;&lt;br /&gt;
&lt;br /&gt;
   if (irmp_get_data (&amp;amp;irmp_data))&lt;br /&gt;
   {&lt;br /&gt;
      if (irmp_data.protocol == IRMP_NEC_PROTOCOL &amp;amp;&amp;amp;     // NEC-Protokoll&lt;br /&gt;
          irmp_data.address == 0x1234)                   // Adresse 0x1234&lt;br /&gt;
      {&lt;br /&gt;
         switch (irmp_data.command)&lt;br /&gt;
         {&lt;br /&gt;
            case 0x0001: key1_pressed(); break;          // Taste 1&lt;br /&gt;
            case 0x0002: key2_pressed(); break;          // Taste 2&lt;br /&gt;
            ...&lt;br /&gt;
            case 0x0009: key9_pressed(); break;          // Taste 9&lt;br /&gt;
         }&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier die möglichen Werte für irmp_data.protocol, siehe auch irmp.h:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#define IRMP_SIRCS_PROTOCOL                      1              // Sony&lt;br /&gt;
#define IRMP_NEC_PROTOCOL                        2              // NEC, Pioneer, JVC, Toshiba, NoName etc.&lt;br /&gt;
#define IRMP_SAMSUNG_PROTOCOL                    3              // Samsung&lt;br /&gt;
#define IRMP_MATSUSHITA_PROTOCOL                 4              // Matsushita&lt;br /&gt;
#define IRMP_KASEIKYO_PROTOCOL                   5              // Kaseikyo (Panasonic etc)&lt;br /&gt;
#define IRMP_RECS80_PROTOCOL                     6              // Philips, Thomson, Nordmende, Telefunken, Saba&lt;br /&gt;
#define IRMP_RC5_PROTOCOL                        7              // Philips etc&lt;br /&gt;
#define IRMP_DENON_PROTOCOL                      8              // Denon&lt;br /&gt;
#define IRMP_RC6_PROTOCOL                        9              // Philips etc&lt;br /&gt;
#define IRMP_SAMSUNG32_PROTOCOL                 10              // Samsung32: no sync pulse at bit 16, length 32 instead of 37&lt;br /&gt;
#define IRMP_APPLE_PROTOCOL                     11              // Apple, very similar to NEC&lt;br /&gt;
#define IRMP_RECS80EXT_PROTOCOL                 12              // Philips, Technisat, Thomson, Nordmende, Telefunken, Saba&lt;br /&gt;
#define IRMP_NUBERT_PROTOCOL                    13              // Nubert&lt;br /&gt;
#define IRMP_BANG_OLUFSEN_PROTOCOL              14              // Bang &amp;amp; Olufsen&lt;br /&gt;
#define IRMP_GRUNDIG_PROTOCOL                   15              // Grundig&lt;br /&gt;
#define IRMP_NOKIA_PROTOCOL                     16              // Nokia&lt;br /&gt;
#define IRMP_SIEMENS_PROTOCOL                   17              // Siemens, e.g. Gigaset&lt;br /&gt;
#define IRMP_FDC_PROTOCOL                       18              // FDC keyboard&lt;br /&gt;
#define IRMP_RCCAR_PROTOCOL                     19              // RC Car&lt;br /&gt;
#define IRMP_JVC_PROTOCOL                       20              // JVC&lt;br /&gt;
#define IRMP_RC6A_PROTOCOL                      21              // RC6A, e.g. Kathrein, XBOX&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Werte für die Adresse und das Kommando muss man natürlich einmal für eine unbekannte Fernbedienung auslesen und dann über ein UART oder LC-Display ausgeben, um sie dann im Programm hart zu kodieren. Oder man hat eine kleine Anlernroutine, wo man einmal die gewünschten Tasten drücken muss, um sie anschließend im EEPROM abzuspeichern.&lt;br /&gt;
&lt;br /&gt;
Eine weitere Beispiel-Main-Funktion ist im Zip-File enthalten, da sieht man dann auch die Initialisierung des Timers.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Neu:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Um zu unterscheiden, ob eine Taste lange gedrückt wurde oder lediglich einzeln, dient das Bit IRMP_FLAG_REPETITION. Dieses wird im Struct-Member &#039;&#039;&#039;flags&#039;&#039;&#039; gesetzt, wenn eine Taste auf der Fernbedienung längere Zeit gedrückt wurde und dadurch immer wieder dasselbe Kommando innerhalb kurzer Zeitabstände ausgesandt wird.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
    if (irmp_data.flags &amp;amp; IRMP_FLAG_REPETITION)&lt;br /&gt;
    {&lt;br /&gt;
      finger_blau (irmp_data.command);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
      einzeln (irmp_data.command);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies kann zum Beispiel dafür genutzt werden, um die Tasten 0-9 zu &amp;quot;entprellen&amp;quot;, indem man Kommandos mit gesetztem Bit IRMP_FLAG_REPETITION ignoriert. Bei dem Drücken auf die Tasten VOLUME+ oder VOLUME- kann die wiederholte Auswertung ein und desselben Kommandos aber durchaus gewünscht sein - zum Beispiel, um LEDs zu faden.&lt;br /&gt;
&lt;br /&gt;
== Arbeitsweise ==&lt;br /&gt;
&lt;br /&gt;
Das &amp;quot;Working Horse&amp;quot; von IRMP ist die Interrupt Service Routine irmp_ISR() welche 10.000 mal pro Sekunde aufgerufen werden sollte. Weicht dieser Wert ab, muss die Preprocessor-Konstante F_INTERRUPTS in irmpconfig.h angepasst werden. Dieser kann durchaus höher werden, aber nicht wesentlich kleiner. Sonst wird es kritisch mit der Protokoll-Erkennung.&lt;br /&gt;
&lt;br /&gt;
irmp_ISR detektiert zunächst die Länge und die Form des/der Startbits und ermittelt daraus das verwendete Protokoll. Sobald das Protokoll erkannt wurde, werden die weiter einzulesenden Bits parametrisiert, um dann möglichst effektiv in den weiteren Aufrufen das komplette IR-Telegramm einzulesen.&lt;br /&gt;
&lt;br /&gt;
Um direkt Kritikern den Wind aus den Segeln zu nehmen:&lt;br /&gt;
&lt;br /&gt;
Ich weiss, die ISR ist ziemlich groß. Aber da sie sich wie eine State Machine verhält, ist der tatsächlich ausgeführte Code pro Durchlauf relativ gering. Solange es &amp;quot;dunkel&amp;quot; ist (und das ist es ja die meiste Zeit ;-)) ist die aufgewendete Zeit sogar verschwindend gering. Im WordClock-Projekt werden mit ein- und demselben Timer 8 ISRs aufgerufen, davon ist die irmp_ISR() nur eine unter vielen. Bei mindestens 8 MHz CPU-Takt traten bisher keine Timining-Probleme auf. Daher sehe ich bei der Länge von irmp_ISR überhaupt kein Problem.&lt;br /&gt;
&lt;br /&gt;
Ein Quarz ist nicht unbedingt notwendig, es funktioniert auch mit dem internen Oszillator des AVRs, wenn man die Prescaler-Fuse entsprechend gesetzt hat, dass die CPU auch mit 8MHz rennt ... Die Fuse-Werte für einen ATMEGA88 findet man in main.c&lt;br /&gt;
&lt;br /&gt;
Zur Hardware: IRMP sollte so ziemlich für alle ATMegas übersetzbar sein,&lt;br /&gt;
das Beispiel-Projekt wurde auf ATMEGA88 eingestellt.&lt;br /&gt;
&lt;br /&gt;
Der Pin, an dem der IR-Empfänger angeschlossen wird, ist frei wählbar&lt;br /&gt;
und wird in irmpconfig.h über&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
    #define IRMP_PORT  PORTB&lt;br /&gt;
    #define IRMP_DDR   DDRB&lt;br /&gt;
    #define IRMP_PIN   PINB&lt;br /&gt;
    #define IRMP_BIT   6       // use PB6 as IR input&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
eingestellt.&lt;br /&gt;
&lt;br /&gt;
== Scannen von unbekannten Protokollen ==&lt;br /&gt;
&lt;br /&gt;
Stellt man in irmpconfig.h in der Zeile&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
    #define IRMP_LOGGING    0   // 1: log IR signal (scan), 0: do not (default)&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
den Wert für IRMP_LOGGING auf 1, wird in IRMP eine Protokollierung eingeschaltet: Es werden dann die Hell- und Dunkelphase auf dem UART des Microntrollers mit 9600Bd ausgegeben: 1=Dunkel, 0=Hell. Eventuell müssen dann die Konstanten in den Funktionen uart_init() und uart_putc() angepasst werden; das kommt auf den verwendeten AVR-µC an.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hinweis: Die IRMP-Logging-Funktion (insb. die Ausgabe über UART) ist nicht für PIC-Prozessoren angepasst. Wer immer dies tun möchte, kann sich gerne bei mir (Benutzer [http://www.mikrocontroller.net/user/show/ukw ukw]) per PN melden.&lt;br /&gt;
&lt;br /&gt;
Nimmt man diese Protokoll-Scans mit einem Terminal-Emulationsprogramm auf und speichert sie dann als normale Datei ab, kann man diese Scan-Dateien zur Analyse verwenden, um damit IRMP an das unbekannte Protokoll anzupassen - siehe nächstes Kapitel.&lt;br /&gt;
&lt;br /&gt;
Wer eine Fernbedienung hat, die nicht von IRMP unterstützt wird, kann mir  ([http://www.mikrocontroller.net/user/show/ukw ukw]) gern die Scan-Dateien zuschicken. Ich schaue dann, ob das Protokoll in das IRMP-Konzept passt und passe gegebenenfalls den Source an.&lt;br /&gt;
&lt;br /&gt;
== IRMP unter Linux und Windows ==&lt;br /&gt;
&lt;br /&gt;
irmp.c lässt sich auch unter Linux direkt kompilieren, um damit Infrarot-Scans, welche in Dateien gespeichert sind, direkt zu testen. Im Unterordner IR-Data finden sich solche Dateien, die man dem IRMP direkt zum &amp;quot;Fraß&amp;quot; vorwerfen kann. &lt;br /&gt;
&lt;br /&gt;
Das Übersetzen von IRMP geht folgendermaßen:&lt;br /&gt;
&lt;br /&gt;
    make -f makefile.lnx&lt;br /&gt;
&lt;br /&gt;
Dabei werden 3 IRMP-Versionen erzeugt:&lt;br /&gt;
&lt;br /&gt;
* irmp: Version für 10kHz Scans&lt;br /&gt;
* irmp-15kHz: Version für 15kHz Scans&lt;br /&gt;
* irmp-20kHz: Version für 20kHz Scans&lt;br /&gt;
&lt;br /&gt;
Der Aufruf geschieht dann über:&lt;br /&gt;
&lt;br /&gt;
  ./irmp [-l|-p|-a|-v] &amp;lt; scan-file&lt;br /&gt;
&lt;br /&gt;
Die angegebenen Optionen schließen sich aus, das heisst, es kann jeweils nur eine Option zu einer Zeit angegeben werden:&lt;br /&gt;
&lt;br /&gt;
Option:&lt;br /&gt;
&lt;br /&gt;
   -l  List             gibt eine Liste der Pulse und Pausen aus&lt;br /&gt;
   -a analyze           analysiert die Puls-/Pausen und schreibt ein &amp;quot;Spektrum&amp;quot; in ASCII-Form&lt;br /&gt;
   -v verbose           ausführliche Ausgabe&lt;br /&gt;
   -p  Print Timings    gibt für alle Protokolle eine Timing-Tabelle aus&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Normale Ausgabe:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
   ./irmp &amp;lt; IR-Data/orion_vcr_07660BM070.txt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 -------------------------------------------------------------------------&lt;br /&gt;
 # Taste 1&lt;br /&gt;
 00000001110111101000000001111111 p =  2, a = 0x7b80, c = 0x0001, f = 0x00&lt;br /&gt;
 -------------------------------------------------------------------------&lt;br /&gt;
 # Taste 2&lt;br /&gt;
 00000001110111100100000010111111 p =  2, a = 0x7b80, c = 0x0002, f = 0x00&lt;br /&gt;
 -------------------------------------------------------------------------&lt;br /&gt;
 # Taste 3&lt;br /&gt;
 00000001110111101100000000111111 p =  2, a = 0x7b80, c = 0x0003, f = 0x00&lt;br /&gt;
 -------------------------------------------------------------------------&lt;br /&gt;
 # Taste 4&lt;br /&gt;
 00000001110111100010000011011111 p =  2, a = 0x7b80, c = 0x0004, f = 0x00&lt;br /&gt;
 -------------------------------------------------------------------------&lt;br /&gt;
 ...&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Listen-Ausgabe:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
   ./irmp -l &amp;lt; IR-Data/orion_vcr_07660BM070.txt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
# Taste 1&lt;br /&gt;
pulse: 91 pause: 44&lt;br /&gt;
pulse: 6 pause: 5&lt;br /&gt;
pulse: 6 pause: 6&lt;br /&gt;
pulse: 6 pause: 5&lt;br /&gt;
pulse: 6 pause: 5&lt;br /&gt;
pulse: 6 pause: 5&lt;br /&gt;
pulse: 6 pause: 6&lt;br /&gt;
pulse: 6 pause: 5&lt;br /&gt;
pulse: 6 pause: 16&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Analyse:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
   ./irmp -a &amp;lt; IR-Data/orion_vcr_07660BM070.txt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
START PULSES:&lt;br /&gt;
 90 o 1&lt;br /&gt;
 91 oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo 33&lt;br /&gt;
 92 ooo 2&lt;br /&gt;
pulse avg: 91.0=9102.8 us, min: 90=9000.0 us, max: 92=9200.0 us, tol:  1.1%&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
START PAUSES:&lt;br /&gt;
 43 oo 1&lt;br /&gt;
 44 oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo 25&lt;br /&gt;
 45 oooooooooooooooooooooooo 10&lt;br /&gt;
pause avg: 44.2=4425.0 us, min: 43=4300.0 us, max: 45=4500.0 us, tol:  2.8%&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
PULSES:&lt;br /&gt;
  5 o 17&lt;br /&gt;
  6 ooooooooooooooooooooooooooooooooooooooooooooooooooooooo 562&lt;br /&gt;
  7 oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo 609&lt;br /&gt;
pulse avg:  6.5= 649.8 us, min:  5= 500.0 us, max:  7= 700.0 us, tol: 23.1%&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
PAUSES:&lt;br /&gt;
  4 ooooooooooooooooooooooo 169&lt;br /&gt;
  5 oooooooooooooooooooooooooooooooooooooooooooooooooooooooooo 412&lt;br /&gt;
  6 oooo 31&lt;br /&gt;
pause avg:  4.8= 477.5 us, min:  4= 400.0 us, max:  6= 600.0 us, tol: 25.7%&lt;br /&gt;
 15 oooooo 43&lt;br /&gt;
 16 oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo 425&lt;br /&gt;
 17 oooooooooo 72&lt;br /&gt;
pause avg: 16.1=1605.4 us, min: 15=1500.0 us, max: 17=1700.0 us, tol:  6.6%&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier sieht man die gemessenen Zeiten aller Pulse und Pausen als (liegende) Glockenkurven, welche natürlich wegen der ASCII-Darstellung nicht gerade einer Idealkurve entsprechen. Je schmaler die gemessenen Kanäle, desto besser ist das Timing der Fernbedienung.&lt;br /&gt;
&lt;br /&gt;
Aus obigem Output kann man herauslesen:&lt;br /&gt;
&lt;br /&gt;
* Das Start-Bit hat eine Pulslänge zwischen 9000 und 9200 usec, im Mittel sind es 9102 usec. Die Abweichung von diesem Mittelwert liegt bei 1,1 Prozent.&lt;br /&gt;
&lt;br /&gt;
* Das Start-Bit hat eine Pausenlänge zwischen 4300 usec und 4500 usec, der Mittelwert beträgt 4424 usec. Der Fehler liegt bei 2,8 Prozent.&lt;br /&gt;
&lt;br /&gt;
* Die Pulslänge eines Datenbits liegt zwischen 500 usec und 700 usec, im Mittel sind es 650 usec, der Fehler liegt bei (stolzen) 23,1 Prozent!&lt;br /&gt;
&lt;br /&gt;
Desweiteren gibt es noch 2 verschieden lange Pausen (für die Bits 0 und 1), das Ablesen der Werte überlasse ich dem geneigten Leser ;-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ausführliche Ausgabe:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
    ./irmp -v &amp;lt; IR-Data/orion_vcr_07660BM070.txt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
# Taste 1&lt;br /&gt;
   26084 [starting pulse]&lt;br /&gt;
start-bit: pulse = 91, pause = 44&lt;br /&gt;
protocol = NEC, start bit timings: pulse:  53 - 127, pause:  26 -  64&lt;br /&gt;
pulse_1:   2 -   9&lt;br /&gt;
pause_1:   9 -  25&lt;br /&gt;
pulse_0:   2 -   9&lt;br /&gt;
pause_0:   2 -   9&lt;br /&gt;
command_offset: 16&lt;br /&gt;
command_len:     16&lt;br /&gt;
complete_len:    32&lt;br /&gt;
stop_bit:         1&lt;br /&gt;
   26230 [bit  0: pulse =   6, pause =   5] 0&lt;br /&gt;
   26242 [bit  1: pulse =   6, pause =   6] 0&lt;br /&gt;
   26253 [bit  2: pulse =   6, pause =   5] 0&lt;br /&gt;
   26264 [bit  3: pulse =   6, pause =   5] 0&lt;br /&gt;
   ...&lt;br /&gt;
   26749 [bit 31: pulse =   6, pause =  17] 1&lt;br /&gt;
stop bit detected&lt;br /&gt;
code detected, length = 32&lt;br /&gt;
p =  2, a = 0x7b80, c = 0x0001, f = 0x00&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Timing-Tabelle:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
     ./irmp -p&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
IRMP_TIMEOUT_LEN:        165&lt;br /&gt;
IRMP_KEY_REPETITION_LEN  1500&lt;br /&gt;
&lt;br /&gt;
PROTOCOL       S  S-PULSE    S-PAUSE    PULSE-0    PAUSE-0    PULSE-1    PAUSE-1&lt;br /&gt;
====================================================================================&lt;br /&gt;
SIRCS          1   21 -  27    4 -   7    4 -   8    4 -   8   10 -  14    4 -   8&lt;br /&gt;
NEC            1   53 - 127   26 -  64    2 -   9    2 -   9    2 -   9    9 -  25&lt;br /&gt;
NEC (rep)      1   53 - 127   13 -  32    2 -   9    2 -   9    2 -   9    9 -  25&lt;br /&gt;
SAMSUNG        1   40 -  51   40 -  51    3 -   8    2 -   7    3 -   8    9 -  20&lt;br /&gt;
MATSUSHITA     1   27 -  43   27 -  43    4 -  13    4 -  13    4 -  13   15 -  38&lt;br /&gt;
KASEIKYO       1   29 -  38   14 -  20    1 -   8    1 -   7    1 -   8    5 -  20&lt;br /&gt;
RECS80         1    1 -   3   66 -  83    0 -   3   43 -  55    0 -   3   66 -  83&lt;br /&gt;
RC5            1    7 -  11    7 -  11    7 -  11&lt;br /&gt;
DENON          1    1 -   4               1 -   4    6 -  10    1 -   4   16 -  22&lt;br /&gt;
RC6            1   23 -  30    7 -  11    3 -   6&lt;br /&gt;
RECS80EXT      1    1 -   3   34 -  39    0 -   3   43 -  55    0 -   3   66 -  83&lt;br /&gt;
NUBERT         1   10 -  17    2 -   5    3 -   7    9 -  17   10 -  17    2 -   5&lt;br /&gt;
BANG_OLUFSEN   1    1 -   3   27 -  35&lt;br /&gt;
BANG_OLUFSEN   2    1 -   3   27 -  35&lt;br /&gt;
BANG_OLUFSEN   3    1 -   3  140 - 165&lt;br /&gt;
BANG_OLUFSEN   4    1 -   3   27 -  35&lt;br /&gt;
BANG_OLUFSEN   -                          1 -   3   27 -  35    1 -   3   83 - 104&lt;br /&gt;
GRUNDIG/NOKIA  1    3 -   7   22 -  33    3 -   7&lt;br /&gt;
SIEMENS        1    2 -   4    2 -   4    2 -   4&lt;br /&gt;
FDC            1   18 -  24    8 -  12    1 -   5    1 -   3    1 -   5    5 -  10&lt;br /&gt;
RCCAR          1   17 -  23   17 -  23    4 -   8    5 -  13    4 -   8    2 -   7&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei längeren Ausgaben sollte man das Programm &amp;quot;less&amp;quot; verwenden, um seitenweise zu blättern, z.B.:&lt;br /&gt;
&lt;br /&gt;
    ./irmp -v &amp;lt; IR-Data/Samsung_DVD_Rec_00062C.txt | less&lt;br /&gt;
&lt;br /&gt;
Diese Scan-Dateien halfen mir nicht nur bei der Entwicklung des IRMP, sondern können auch bei der Anpassung des Sources an neue IR-Protokolle sehr hilfreich sein.&lt;br /&gt;
&lt;br /&gt;
Mittlerweile kann man IRMP auch unter Windows nutzen, nämlich folgendermaßen:&lt;br /&gt;
&lt;br /&gt;
* Eingabeaufforderung starten&lt;br /&gt;
* In das Verzeichnis irmp wechseln&lt;br /&gt;
* Aufruf von:&lt;br /&gt;
            irmp.exe &amp;lt; IR-Data\rc5x.txt&lt;br /&gt;
&lt;br /&gt;
Da manche Ausgaben sehr lang werden, empfiehlt es sich auch hier, die Ausgabe in eine Datei zu lenken oder in den more weiterzuleiten, damit man seitenweise blättern kann:&lt;br /&gt;
&lt;br /&gt;
            irmp.exe &amp;lt; IR-Data\rc5x.txt | more&lt;br /&gt;
&lt;br /&gt;
Auch hier gelten dieselben Optionen wie für die Linux-Version.&lt;br /&gt;
&lt;br /&gt;
Zusatz:&lt;br /&gt;
&lt;br /&gt;
Der Decoder für das RECS80- und RECS80-Extended-Protokoll ist ungetestet, wurde anhand von Dokumentationen im Internet erstellt und lediglich mittels&lt;br /&gt;
künstlich erzeugten Scan-Dateien getestet... daher: keine Gewähr!&lt;br /&gt;
&lt;br /&gt;
== Fernbedienungen ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Protokoll || Bezeichnung || Gerät || Device Address&lt;br /&gt;
|-&lt;br /&gt;
| NEC || Toshiba CT-9859 || Fernseher || 765&lt;br /&gt;
|-&lt;br /&gt;
| || Toshiba VT-728G || V-728G Videorekorder || 8925&lt;br /&gt;
|-&lt;br /&gt;
| || Elta 8848 MP 4 || DVD-Player || 255&lt;br /&gt;
|-&lt;br /&gt;
| || AS-218 || Askey TV-View CHP03X (TV-Karte) || 25046&lt;br /&gt;
|-&lt;br /&gt;
| || Cyberhome ??? || Cyberhome DVD Player || 20147&lt;br /&gt;
|-&lt;br /&gt;
| || WD TV Life || Western Digital Multimediaplayer || 7984&lt;br /&gt;
|-&lt;br /&gt;
| KASEIKYO || Technics EUR646497 || AV Receiver SA-AX 730 || 8194&lt;br /&gt;
|-&lt;br /&gt;
| RC5 || Loewe Assist/RC3/RC4 || Fernseher (FB auf TV-Mode) || 0&lt;br /&gt;
|-&lt;br /&gt;
| RC6 || Philips Television || Fernseher (FB auf TV-Mode) || 0&lt;br /&gt;
|-&lt;br /&gt;
| SIRCS || Sony RM-816 || Fernseher (FB auf TV-Mode) || 0 (siehe Beschreibung)&lt;br /&gt;
|-&lt;br /&gt;
| DENON || DENON RC970 || AVR3805 (Verstärker) || 8&lt;br /&gt;
|-&lt;br /&gt;
| || DENON RC970 || DVD/CD-Player || 2&lt;br /&gt;
|-&lt;br /&gt;
| || DENON RC970 || Tuner || 6&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
== IR-Tastaturen ==&lt;br /&gt;
&lt;br /&gt;
[[Datei:irmp-fdc3402.jpg|miniatur|FDC-3402-Tastatur]]&lt;br /&gt;
&lt;br /&gt;
IRMP unterstützt ab Version 1.7.0 auch IR-Tastaturen, nämlich die Infrarot-Tastatur FDC-3402 - erhältlich bei Pollin (Art. 711 056) für weniger als 2 EUR.&lt;br /&gt;
&lt;br /&gt;
Beim Erkennen einer Taste gibt IRMP folgende Daten zurück:&lt;br /&gt;
&lt;br /&gt;
 Protokoll-Nummer (irmp_data.protocol): 18&lt;br /&gt;
 Addresse         (irmp_data.address):  0x003F&lt;br /&gt;
&lt;br /&gt;
Als Kommando (irmp_data.command) werden folgende Werte zurückgeliefert:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code || Taste || Code || Taste || Code || Taste || Code || Taste || Code || Taste || Code || Taste || Code || Taste || Code || Taste&lt;br /&gt;
|-&lt;br /&gt;
| 0x0000 ||      || 0x0010 || TAB || 0x0020 || &#039;s&#039; || 0x0030 || &#039;c&#039; || 0x0040 ||      || 0x0050 || HOME || 0x0060 ||      || 0x0070 || MENUE&lt;br /&gt;
|-&lt;br /&gt;
| 0x0001 || &#039;^&#039; || 0x0011 || &#039;q&#039; || 0x0021 || &#039;d&#039; || 0x0031 || &#039;v&#039; || 0x0041 ||      || 0x0051 || END || 0x0061 ||      || 0x0071 || BACK&lt;br /&gt;
|-&lt;br /&gt;
| 0x0002 || &#039;1&#039; || 0x0012 || &#039;w&#039; || 0x0022 || &#039;f&#039; || 0x0032 || &#039;b&#039; || 0x0042 ||      || 0x0052 ||      || 0x0062 ||      || 0x0072 || FORWARD&lt;br /&gt;
|-&lt;br /&gt;
| 0x0003 || &#039;2&#039; || 0x0013 || &#039;e&#039; || 0x0023 || &#039;g&#039; || 0x0033 || &#039;n&#039; || 0x0043 ||      || 0x0053 || UP || 0x0063 ||      || 0x0073 || ADDRESS&lt;br /&gt;
|-&lt;br /&gt;
| 0x0004 || &#039;3&#039; || 0x0014 || &#039;r&#039; || 0x0024 || &#039;h&#039; || 0x0034 || &#039;m&#039; || 0x0044 ||      || 0x0054 || DOWN || 0x0064 ||      || 0x0074 || WINDOW&lt;br /&gt;
|-&lt;br /&gt;
| 0x0005 || &#039;4&#039; || 0x0015 || &#039;t&#039; || 0x0025 || &#039;j&#039; || 0x0035 || &#039;,&#039; || 0x0045 ||      || 0x0055 || PAGE_UP || 0x0065 ||      || 0x0075 || 1ST_PAGE&lt;br /&gt;
|-&lt;br /&gt;
| 0x0006 || &#039;5&#039; || 0x0016 || &#039;z&#039; || 0x0026 || &#039;k&#039; || 0x0036 || &#039;.&#039; || 0x0046 ||      || 0x0056 || PAGE_DOWN || 0x0066 ||      || 0x0076 || STOP&lt;br /&gt;
|-&lt;br /&gt;
| 0x0007 || &#039;6&#039; || 0x0017 || &#039;u&#039; || 0x0027 || &#039;l&#039; || 0x0037 || &#039;-&#039; || 0x0047 ||      || 0x0057 ||      || 0x0067 ||      || 0x0077 || MAIL&lt;br /&gt;
|-&lt;br /&gt;
| 0x0008 || &#039;7&#039; || 0x0018 || &#039;i&#039; || 0x0028 || &#039;ö&#039; || 0x0038 ||      || 0x0048 ||      || 0x0058 ||      || 0x0068 ||      || 0x0078 || FAVORITES&lt;br /&gt;
|-&lt;br /&gt;
| 0x0009 || &#039;8&#039; || 0x0019 || &#039;o&#039; || 0x0029 || &#039;ä&#039; || 0x0039 || SHIFT_RIGHT || 0x0049 ||      || 0x0059 || RIGHT || 0x0069 ||      || 0x0079 || NEW_PAGE&lt;br /&gt;
|-&lt;br /&gt;
| 0x000A || &#039;9&#039; || 0x001A || &#039;p&#039; || 0x002A || &#039;#&#039; || 0x003A || CTRL || 0x004A ||      || 0x005A ||      || 0x006A ||      || 0x007A || SETUP&lt;br /&gt;
|-&lt;br /&gt;
| 0x000B || &#039;0&#039; || 0x001B || &#039;ü&#039; || 0x002B || CR || 0x003B ||      || 0x004B || INSERT || 0x005B ||      || 0x006B ||      || 0x007B || FONT&lt;br /&gt;
|-&lt;br /&gt;
| 0x000C || &#039;ß&#039; || 0x001C || &#039;+&#039; || 0x002C || SHIFT_LEFT || 0x003C || ALT_LEFT || 0x004C || DELETE || 0x005C ||      || 0x006C ||      || 0x007C || PRINT&lt;br /&gt;
|-&lt;br /&gt;
| 0x000D || &#039;´&#039; || 0x001D ||      || 0x002D || &#039;&amp;lt;&#039; || 0x003D || SPACE || 0x004D ||      || 0x005D ||      || 0x006D ||      || 0x007D ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x000E ||      || 0x001E || CAPSLOCK || 0x002E || &#039;y&#039; || 0x003E || ALT_RIGHT || 0x004E ||      || 0x005E ||      || 0x006E || ESCAPE || 0x007E || ON_OFF&lt;br /&gt;
|-&lt;br /&gt;
| 0x000F || BACKSPACE || 0x001F || &#039;a&#039; || 0x002F || &#039;x&#039; || 0x003F ||      || 0x004F || LEFT || 0x005F ||      || 0x006F ||      || 0x007F ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Zusatztasten links:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code || Taste&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| 0x0400 || KEY_MOUSE_1&lt;br /&gt;
|-&lt;br /&gt;
| 0x0800 || KEY_MOUSE_2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Dabei gelten die obigen Werte für das Drücken einer Taste. Wird die Taste wieder losgelassen, setzt IRMP zusätzlich das 8. Bit im Kommando.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
      Taste &#039;a&#039; drücken:   0x001F&lt;br /&gt;
      Taste &#039;a&#039; loslassen: 0x009F&lt;br /&gt;
&lt;br /&gt;
Ausnahme ist die EIN/AUS-Taste: Diese sendet nur beim Drücken einen Code, nicht beim Loslassen.&lt;br /&gt;
&lt;br /&gt;
Wird eine Taste länger gedrückt, wird das in irmp_data.flag angezeigt.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
                           command   flag&lt;br /&gt;
      Taste &#039;a&#039; drücken:   0x001F    0x00&lt;br /&gt;
      Taste &#039;a&#039; drücken:   0x001F    0x01&lt;br /&gt;
      Taste &#039;a&#039; drücken:   0x001F    0x01&lt;br /&gt;
      Taste &#039;a&#039; drücken:   0x001F    0x01&lt;br /&gt;
      ....&lt;br /&gt;
      Taste &#039;a&#039; loslassen: 0x009F    0x00&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Werden Tastenkombinationen (zum Beispiel für ein großes &#039;A&#039;) gedrückt, dann sind die Rückgabewerte von IRMP in folgendem Ablauf zu sehen:&lt;br /&gt;
&lt;br /&gt;
      Linke SHIFT-Taste drücken:   0x0002&lt;br /&gt;
      Taste &#039;a&#039; drücken:           0x001F&lt;br /&gt;
      Taste &#039;a&#039; loslassen:         0x009F&lt;br /&gt;
      Linke SHIFT-Taste loslassen: 0x0082&lt;br /&gt;
&lt;br /&gt;
In irmp.c findet man für die LINUX-Version eine Funktion get_fdc_key(), welche als Vorlage dienen mag, die Keycodes einer FDC-Tastatur in die entsprechenden ASCII-Codes umzuwandeln. Diese Funktion kann man entweder lokal auf dem µC nutzen, um die Keycodes zu decodieren, oder auf einem Hostsystem (z.B. PC), an welches die IRMP-Data-Struktur gesandt wird. Dafür sollte man die Funktion incl. der dazugehörenden Preprozessor-Konstanten in seinen Applikations-Quelltext kopieren.&lt;br /&gt;
&lt;br /&gt;
Hier der entsprechende Auszug:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#define STATE_LEFT_SHIFT    0x01&lt;br /&gt;
#define STATE_RIGHT_SHIFT   0x02&lt;br /&gt;
#define STATE_LEFT_CTRL     0x04&lt;br /&gt;
#define STATE_LEFT_ALT      0x08&lt;br /&gt;
#define STATE_RIGHT_ALT     0x10&lt;br /&gt;
&lt;br /&gt;
#define KEY_ESCAPE          0x1B            // keycode = 0x006e&lt;br /&gt;
#define KEY_MENUE           0x80            // keycode = 0x0070&lt;br /&gt;
#define KEY_BACK            0x81            // keycode = 0x0071&lt;br /&gt;
#define KEY_FORWARD         0x82            // keycode = 0x0072&lt;br /&gt;
#define KEY_ADDRESS         0x83            // keycode = 0x0073&lt;br /&gt;
#define KEY_WINDOW          0x84            // keycode = 0x0074&lt;br /&gt;
#define KEY_1ST_PAGE        0x85            // keycode = 0x0075&lt;br /&gt;
#define KEY_STOP            0x86            // keycode = 0x0076&lt;br /&gt;
#define KEY_MAIL            0x87            // keycode = 0x0077&lt;br /&gt;
#define KEY_FAVORITES       0x88            // keycode = 0x0078&lt;br /&gt;
#define KEY_NEW_PAGE        0x89            // keycode = 0x0079&lt;br /&gt;
#define KEY_SETUP           0x8A            // keycode = 0x007a&lt;br /&gt;
#define KEY_FONT            0x8B            // keycode = 0x007b&lt;br /&gt;
#define KEY_PRINT           0x8C            // keycode = 0x007c&lt;br /&gt;
#define KEY_ON_OFF          0x8E            // keycode = 0x007c&lt;br /&gt;
&lt;br /&gt;
#define KEY_INSERT          0x90            // keycode = 0x004b&lt;br /&gt;
#define KEY_DELETE          0x91            // keycode = 0x004c&lt;br /&gt;
#define KEY_LEFT            0x92            // keycode = 0x004f&lt;br /&gt;
#define KEY_HOME            0x93            // keycode = 0x0050&lt;br /&gt;
#define KEY_END             0x94            // keycode = 0x0051&lt;br /&gt;
#define KEY_UP              0x95            // keycode = 0x0053&lt;br /&gt;
#define KEY_DOWN            0x96            // keycode = 0x0054&lt;br /&gt;
#define KEY_PAGE_UP         0x97            // keycode = 0x0055&lt;br /&gt;
#define KEY_PAGE_DOWN       0x98            // keycode = 0x0056&lt;br /&gt;
#define KEY_RIGHT           0x99            // keycode = 0x0059&lt;br /&gt;
#define KEY_MOUSE_1         0x9E            // keycode = 0x0400&lt;br /&gt;
#define KEY_MOUSE_2         0x9F            // keycode = 0x0800&lt;br /&gt;
&lt;br /&gt;
static uint8_t&lt;br /&gt;
get_fdc_key (uint16_t cmd)&lt;br /&gt;
{&lt;br /&gt;
    static uint8_t key_table[128] =&lt;br /&gt;
    {&lt;br /&gt;
     // 0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F&lt;br /&gt;
        0,  &#039;^&#039;, &#039;1&#039;, &#039;2&#039;, &#039;3&#039;, &#039;4&#039;, &#039;5&#039;, &#039;6&#039;, &#039;7&#039;, &#039;8&#039;, &#039;9&#039;, &#039;0&#039;, &#039;ß&#039;, &#039;´&#039;,  0,  &#039;\b&#039;,&lt;br /&gt;
       &#039;\t&#039;,&#039;q&#039;, &#039;w&#039;, &#039;e&#039;, &#039;r&#039;, &#039;t&#039;, &#039;z&#039;, &#039;u&#039;, &#039;i&#039;, &#039;o&#039;, &#039;p&#039;, &#039;ü&#039;, &#039;+&#039;,  0,   0,  &#039;a&#039;,&lt;br /&gt;
       &#039;s&#039;, &#039;d&#039;, &#039;f&#039;, &#039;g&#039;, &#039;h&#039;, &#039;j&#039;, &#039;k&#039;, &#039;l&#039;, &#039;ö&#039;, &#039;ä&#039;, &#039;#&#039;,  &#039;\r&#039;, 0,  &#039;&amp;lt;&#039;, &#039;y&#039;, &#039;x&#039;,&lt;br /&gt;
       &#039;c&#039;, &#039;v&#039;, &#039;b&#039;, &#039;n&#039;, &#039;m&#039;, &#039;,&#039;, &#039;.&#039;, &#039;-&#039;,  0,   0,   0,   0,   0,  &#039; &#039;,  0,   0,&lt;br /&gt;
&lt;br /&gt;
        0,  &#039;°&#039;, &#039;!&#039;, &#039;&amp;quot;&#039;, &#039;§&#039;, &#039;$&#039;, &#039;%&#039;, &#039;&amp;amp;&#039;, &#039;/&#039;, &#039;(&#039;, &#039;)&#039;, &#039;=&#039;, &#039;?&#039;, &#039;`&#039;,  0,  &#039;\b&#039;,&lt;br /&gt;
       &#039;\t&#039;,&#039;Q&#039;, &#039;W&#039;, &#039;E&#039;, &#039;R&#039;, &#039;T&#039;, &#039;Z&#039;, &#039;U&#039;, &#039;I&#039;, &#039;O&#039;, &#039;P&#039;, &#039;Ü&#039;, &#039;*&#039;,  0,   0,  &#039;A&#039;,&lt;br /&gt;
       &#039;S&#039;, &#039;D&#039;, &#039;F&#039;, &#039;G&#039;, &#039;H&#039;, &#039;J&#039;, &#039;K&#039;, &#039;L&#039;, &#039;Ö&#039;, &#039;Ä&#039;, &#039;\&#039;&#039;,&#039;\r&#039;, 0,  &#039;&amp;gt;&#039;, &#039;Y&#039;, &#039;X&#039;,&lt;br /&gt;
       &#039;C&#039;, &#039;V&#039;, &#039;B&#039;, &#039;N&#039;, &#039;M&#039;, &#039;;&#039;, &#039;:&#039;, &#039;_&#039;,  0,   0,   0,   0,   0,  &#039; &#039;,  0,   0&lt;br /&gt;
    };&lt;br /&gt;
    static uint8_t state;&lt;br /&gt;
&lt;br /&gt;
    uint8_t key = 0;&lt;br /&gt;
&lt;br /&gt;
    switch (cmd)&lt;br /&gt;
    {&lt;br /&gt;
        case 0x002C: state |=  STATE_LEFT_SHIFT;    break;              // pressed left shift&lt;br /&gt;
        case 0x00AC: state &amp;amp;= ~STATE_LEFT_SHIFT;    break;              // released left shift&lt;br /&gt;
        case 0x0039: state |=  STATE_RIGHT_SHIFT;   break;              // pressed right shift&lt;br /&gt;
        case 0x00B9: state &amp;amp;= ~STATE_RIGHT_SHIFT;   break;              // released right shift&lt;br /&gt;
        case 0x003A: state |=  STATE_LEFT_CTRL;     break;              // pressed left ctrl&lt;br /&gt;
        case 0x00BA: state &amp;amp;= ~STATE_LEFT_CTRL;     break;              // released left ctrl&lt;br /&gt;
        case 0x003C: state |=  STATE_LEFT_ALT;      break;              // pressed left alt&lt;br /&gt;
        case 0x00BC: state &amp;amp;= ~STATE_LEFT_ALT;      break;              // released left alt&lt;br /&gt;
        case 0x003E: state |=  STATE_RIGHT_ALT;     break;              // pressed left alt&lt;br /&gt;
        case 0x00BE: state &amp;amp;= ~STATE_RIGHT_ALT;     break;              // released left alt&lt;br /&gt;
&lt;br /&gt;
        case 0x006e: key = KEY_ESCAPE;              break;&lt;br /&gt;
        case 0x004b: key = KEY_INSERT;              break;&lt;br /&gt;
        case 0x004c: key = KEY_DELETE;              break;&lt;br /&gt;
        case 0x004f: key = KEY_LEFT;                break;&lt;br /&gt;
        case 0x0050: key = KEY_HOME;                break;&lt;br /&gt;
        case 0x0051: key = KEY_END;                 break;&lt;br /&gt;
        case 0x0053: key = KEY_UP;                  break;&lt;br /&gt;
        case 0x0054: key = KEY_DOWN;                break;&lt;br /&gt;
        case 0x0055: key = KEY_PAGE_UP;             break;&lt;br /&gt;
        case 0x0056: key = KEY_PAGE_DOWN;           break;&lt;br /&gt;
        case 0x0059: key = KEY_RIGHT;               break;&lt;br /&gt;
        case 0x0400: key = KEY_MOUSE_1;             break;&lt;br /&gt;
        case 0x0800: key = KEY_MOUSE_2;             break;&lt;br /&gt;
&lt;br /&gt;
        default:&lt;br /&gt;
        {&lt;br /&gt;
            if (!(cmd &amp;amp; 0x80))                      // pressed key&lt;br /&gt;
            {&lt;br /&gt;
                if (cmd &amp;gt;= 0x70 &amp;amp;&amp;amp; cmd &amp;lt;= 0x7F)     // function keys&lt;br /&gt;
                {&lt;br /&gt;
                    key = cmd + 0x10;               // 7x -&amp;gt; 8x&lt;br /&gt;
                }&lt;br /&gt;
                else if (cmd &amp;lt; 64)                  // key listed in key_table&lt;br /&gt;
                {&lt;br /&gt;
                    if (state &amp;amp; (STATE_LEFT_ALT | STATE_RIGHT_ALT))&lt;br /&gt;
                    {&lt;br /&gt;
                        switch (cmd)&lt;br /&gt;
                        {&lt;br /&gt;
                            case 0x0003: key = &#039;²&#039;;     break;&lt;br /&gt;
                            case 0x0008: key = &#039;{&#039;;     break;&lt;br /&gt;
                            case 0x0009: key = &#039;[&#039;;     break;&lt;br /&gt;
                            case 0x000A: key = &#039;]&#039;;     break;&lt;br /&gt;
                            case 0x000B: key = &#039;}&#039;;     break;&lt;br /&gt;
                            case 0x000C: key = &#039;\\&#039;;    break;&lt;br /&gt;
                            case 0x001C: key = &#039;~&#039;;     break;&lt;br /&gt;
                            case 0x002D: key = &#039;|&#039;;     break;&lt;br /&gt;
                            case 0x0034: key = &#039;µ&#039;;     break;&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                    else if (state &amp;amp; (STATE_LEFT_CTRL))&lt;br /&gt;
                    {&lt;br /&gt;
                        if (key_table[cmd] &amp;gt;= &#039;a&#039; &amp;amp;&amp;amp; key_table[cmd] &amp;lt;= &#039;z&#039;)&lt;br /&gt;
                        {&lt;br /&gt;
                            key = key_table[cmd] - &#039;a&#039; + 1;&lt;br /&gt;
                        }&lt;br /&gt;
                        else&lt;br /&gt;
                        {&lt;br /&gt;
                            key = key_table[cmd];&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                    else&lt;br /&gt;
                    {&lt;br /&gt;
                        int idx = cmd + ((state &amp;amp; (STATE_LEFT_SHIFT | STATE_RIGHT_SHIFT)) ? 64 : 0);&lt;br /&gt;
&lt;br /&gt;
                        if (key_table[idx])&lt;br /&gt;
                        {&lt;br /&gt;
                            key = key_table[idx];&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return (key);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Als letztes noch ein Beispiel einer Anwendung der Funktion get_fdc_key():&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
    if (irmp_get_data (&amp;amp;irmp_data))&lt;br /&gt;
    {&lt;br /&gt;
        uint8_t key;&lt;br /&gt;
&lt;br /&gt;
        if (irmp_data.protocol == IRMP_FDC_PROTOCOL &amp;amp;&amp;amp;&lt;br /&gt;
            (key = get_fdc_key (irmp_data.command)) != 0)&lt;br /&gt;
        {&lt;br /&gt;
            if ((key &amp;gt;= 0x20 &amp;amp;&amp;amp; key &amp;lt; 0x7F) || key &amp;gt;= 0xA0) // show only printable characters&lt;br /&gt;
            {&lt;br /&gt;
                printf (&amp;quot;ascii-code = 0x%02x, character = &#039;%c&#039;\n&amp;quot;, key, key);&lt;br /&gt;
            }&lt;br /&gt;
            else // it&#039;s a non-printable key&lt;br /&gt;
            {&lt;br /&gt;
                printf (&amp;quot;ascii-code = 0x%02x\n&amp;quot;, key);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alle nicht-druckbaren Zeichen werden dabei folgendermaßen codiert:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Taste             || Konstante                || Wert&lt;br /&gt;
|-&lt;br /&gt;
| ESC               || KEY_ESCAPE              || 0x1B&lt;br /&gt;
|-&lt;br /&gt;
| Menü              || KEY_MENUE               || 0x80&lt;br /&gt;
|-&lt;br /&gt;
| Zurück            || KEY_BACK                || 0x81&lt;br /&gt;
|-&lt;br /&gt;
| Vorw.             || KEY_FORWARD             || 0x82&lt;br /&gt;
|-&lt;br /&gt;
| Adresse           || KEY_ADDRESS             || 0x83&lt;br /&gt;
|-&lt;br /&gt;
| Fenster           || KEY_WINDOW              || 0x84&lt;br /&gt;
|-&lt;br /&gt;
| 1. Seite          || KEY_1ST_PAGE            || 0x85&lt;br /&gt;
|-&lt;br /&gt;
| Stop              || KEY_STOP                || 0x86&lt;br /&gt;
|-&lt;br /&gt;
| Mail              || KEY_MAIL                || 0x87&lt;br /&gt;
|-&lt;br /&gt;
| Fav.              || KEY_FAVORITES           || 0x88&lt;br /&gt;
|-&lt;br /&gt;
| Neue Seite        || KEY_NEW_PAGE            || 0x89&lt;br /&gt;
|-&lt;br /&gt;
| Setup             || KEY_SETUP               || 0x8A&lt;br /&gt;
|-&lt;br /&gt;
| Schrift           || KEY_FONT                || 0x8B&lt;br /&gt;
|-&lt;br /&gt;
| Druck             || KEY_PRINT               || 0x8C&lt;br /&gt;
|-&lt;br /&gt;
| Ein/Aus           || KEY_ON_OFF              || 0x8E&lt;br /&gt;
|-&lt;br /&gt;
| Backspace         || &#039;\b&#039;                    || 0x08&lt;br /&gt;
|-&lt;br /&gt;
| CR/ENTER          || &#039;\r&#039;                    || 0x0C&lt;br /&gt;
|-&lt;br /&gt;
| TAB               || &#039;\t&#039;                    || 0x09&lt;br /&gt;
|-&lt;br /&gt;
| Einfg             || KEY_INSERT              || 0x90&lt;br /&gt;
|-&lt;br /&gt;
| Entf              || KEY_DELETE              || 0x91&lt;br /&gt;
|-&lt;br /&gt;
| Cursor links      || KEY_LEFT                || 0x92&lt;br /&gt;
|-&lt;br /&gt;
| Pos1              || KEY_HOME                || 0x93&lt;br /&gt;
|-&lt;br /&gt;
| Ende              || KEY_END                 || 0x94&lt;br /&gt;
|-&lt;br /&gt;
| Cursor rechts     || KEY_UP                  || 0x95&lt;br /&gt;
|-&lt;br /&gt;
| Cursor runter     || KEY_DOWN                || 0x96&lt;br /&gt;
|-&lt;br /&gt;
| Bild hoch         || KEY_PAGE_UP             || 0x97&lt;br /&gt;
|-&lt;br /&gt;
| Bild runter       || KEY_PAGE_DOWN           || 0x98&lt;br /&gt;
|-&lt;br /&gt;
| Cursor links      || KEY_RIGHT               || 0x99&lt;br /&gt;
|-&lt;br /&gt;
| Linke Maustaste   || KEY_MOUSE_1             || 0x9E&lt;br /&gt;
|-&lt;br /&gt;
| Rechte Maustaste  || KEY_MOUSE_2             || 0x9F&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die Funktion get_fdc_key berücksichtigt das Gedrückthalten der Shift-, Strg- und ALT-Tasten. Damit funktioniert nicht nur das Schreiben von Großbuchstaben, sondern auch das Auswählen der Sonderzeichen mit der Tastenkombination  ALT + Taste, z.B. ALT + m = µ oder ALT + q = @. Ebenso kann man mit der Strg-Taste die Control-Zeichen CTRL-A bis CTRL-Z senden. Die CapsLock-Taste wird ignoriert, da ich sie sowieso für die überflüssigste Taste überhaupt halte ;-)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= IRSND - Infrarot-Multiprotokoll-Encoder =&lt;br /&gt;
&lt;br /&gt;
[[Datei:irmp-title.png| |Scan eines NEC-kompatiblen Fernbedienungssignals]]&lt;br /&gt;
&lt;br /&gt;
== Einleitung IRSND ==&lt;br /&gt;
&lt;br /&gt;
[[Datei:ir-sender.png|miniatur|Anschluß eines einfachen IR-Senders an µC]]&lt;br /&gt;
&lt;br /&gt;
IRSND ist das Gegenstück zu IRMP: es reproduziert aus den Daten, die mit IRMP empfangen wurden, wieder den Original Frame, der dann über eine Infrarot-Diode ausgegeben werden kann.&lt;br /&gt;
&lt;br /&gt;
IRSND unterstützt die folgenden Protokolle:&lt;br /&gt;
&lt;br /&gt;
* SIRCS&lt;br /&gt;
* NEC&lt;br /&gt;
* SAMSUNG&lt;br /&gt;
* SAMSUNG32&lt;br /&gt;
* MATSUSHITA&lt;br /&gt;
* RC5&lt;br /&gt;
* KASEIKYO (&#039;&#039;&#039;NEU!&#039;&#039;&#039;)&lt;br /&gt;
* DENON&lt;br /&gt;
* JVC (&#039;&#039;&#039;NEU!&#039;&#039;&#039;)&lt;br /&gt;
* APPLE&lt;br /&gt;
* NUBERT&lt;br /&gt;
* BANG_OLUFSEN&lt;br /&gt;
* GRUNDIG&lt;br /&gt;
* NOKIA&lt;br /&gt;
* SIEMENS (bei mind. ~15kHz)&lt;br /&gt;
* FDC (bei mind. ~15kHz)&lt;br /&gt;
* RCCAR (bei mind. ~15kHz)&lt;br /&gt;
* RECS80 (bei mind. ~20kHz)&lt;br /&gt;
* RECS80EXT (bei mind. ~20kHz)&lt;br /&gt;
&lt;br /&gt;
IRSND unterstützt folgende Protokolle (noch) &#039;&#039;&#039;nicht&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* RC6&lt;br /&gt;
* RC6A&lt;br /&gt;
&lt;br /&gt;
== Download IRSND ==&lt;br /&gt;
&lt;br /&gt;
Version 1.8.0, Stand vom 02.09.2010&lt;br /&gt;
&lt;br /&gt;
Download Release-Version: [http://www.mikrocontroller.net/wikifiles/c/c7/Irsnd.zip Irsnd.zip] &lt;br /&gt;
&lt;br /&gt;
IRMP &amp;amp; IRSND sind nun auch über SVN abrufbar: [http://www.mikrocontroller.net/svnbrowser/irmp/ IRMP im SVN]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die Version im SVN kann eine Zwischen- oder Test-Version sein, die nicht den hier dokumentierten Stand widerspiegelt! Im Zweifel verwendet man besser den obigen Download auf Irsnd.zip.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die Software-Änderungen kann man sich hier anschauen: [http://www.mikrocontroller.net/articles/IRMP#Software-Historie_IRSND Software-Historie IRSND]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Source-Code IRSND ==&lt;br /&gt;
&lt;br /&gt;
Der Source-Code lässt sich einfach übersetzen, indem man die Projekt-Datei irsnd.aps in den WinAVR lädt. Aber auch für die Codevision Nutzer ist IRSND entsprechend angepasst: hier muss man die Zeile&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
  //#define CODEVISION&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
in irsndmain.c aktivieren, das heisst, die Kommentarzeichen entfernen.&lt;br /&gt;
&lt;br /&gt;
IRSND encodiert sämtliche oben aufgelisteten Protokolle in einer ISR, siehe irsnd.c. Welche Protokolle aktiv sein sollen, wird in irsndconfig.h eingestellt. Die Standardprotokolle sind bereits aktiv. Möchte man weitere Protokolle einschalten bzw. einige aus Speicherplatzgründen deaktivieren, sind die entsprechenden Werte in irsnd.c ...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//      Protocol                                Enable  Remarks                 F_INTERRUPTS                Program Space&lt;br /&gt;
#define IRSND_SUPPORT_SIRCS_PROTOCOL            1       // Sony SIRCS           &amp;gt;= 10000                    uses ~150 bytes&lt;br /&gt;
#define IRSND_SUPPORT_NEC_PROTOCOL              1       // NEC + APPLE          &amp;gt;= 10000                    uses ~100 bytes&lt;br /&gt;
#define IRSND_SUPPORT_SAMSUNG_PROTOCOL          1       // Samsung + Samsung32  &amp;gt;= 10000                    uses ~300 bytes&lt;br /&gt;
#define IRSND_SUPPORT_MATSUSHITA_PROTOCOL       1       // Matsushita           &amp;gt;= 10000                    uses ~200 bytes&lt;br /&gt;
#define IRSND_SUPPORT_KASEIKYO_PROTOCOL         1       // Kaseikyo             &amp;gt;= 10000                    uses ~150 bytes&lt;br /&gt;
#define IRSND_SUPPORT_RC5_PROTOCOL              1       // RC5                  &amp;gt;= 10000                    uses ~150 bytes&lt;br /&gt;
#define IRSND_SUPPORT_DENON_PROTOCOL            1       // DENON                &amp;gt;= 10000                    uses ~200 bytes&lt;br /&gt;
#define IRSND_SUPPORT_RC6_PROTOCOL              0       // RC6                  NOT SUPPORTED YET!&lt;br /&gt;
#define IRSND_SUPPORT_NUBERT_PROTOCOL           1       // NUBERT               &amp;gt;= 10000                    uses ~100 bytes&lt;br /&gt;
#define IRSND_SUPPORT_BANG_OLUFSEN_PROTOCOL     1       // Bang&amp;amp;Olufsen         &amp;gt;= 10000                    uses ~250 bytes&lt;br /&gt;
#define IRSND_SUPPORT_GRUNDIG_PROTOCOL          1       // Grundig              &amp;gt;= 10000                    uses ~300 bytes&lt;br /&gt;
#define IRSND_SUPPORT_NOKIA_PROTOCOL            1       // Nokia                &amp;gt;= 10000                    uses ~400 bytes&lt;br /&gt;
#define IRSND_SUPPORT_FDC_PROTOCOL              1       // FDC IR keyboard      &amp;gt;= 10000 (better 15000)     uses ~150 bytes&lt;br /&gt;
#define IRSND_SUPPORT_RCCAR_PROTOCOL            1       // RC CAR               &amp;gt;= 10000 (better 15000)     uses ~150 bytes&lt;br /&gt;
#define IRSND_SUPPORT_SIEMENS_PROTOCOL          0       // Siemens, Gigaset     &amp;gt;= 15000                    uses ~150 bytes&lt;br /&gt;
#define IRSND_SUPPORT_RECS80_PROTOCOL           0       // RECS80               &amp;gt;= 20000                    uses ~100 bytes&lt;br /&gt;
#define IRSND_SUPPORT_RECS80EXT_PROTOCOL        0       // RECS80EXT            &amp;gt;= 20000                    uses ~100 bytes&lt;br /&gt;
#define IRSND_SUPPORT_JVC_PROTOCOL              0       // JVC                  NOT SUPPORTED YET!&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
auf 0 (deaktiviert) oder auf 1 (aktiviert) zu setzen. Die deaktivierten Protokolle werden dann nicht mitübersetzt.&lt;br /&gt;
&lt;br /&gt;
Um das APPLE-Protokoll zu unterstützen, ist IRSND_SUPPORT_NEC_PROTOCOL auf 1 zu setzen, da es sich hier lediglich um einen Spezialfall vom NEC-Protokoll handelt.&lt;br /&gt;
&lt;br /&gt;
Wenn man Speicherplatz sparen möchte, gelten natürlich hier dieselben Tipps wie für den IRMP.&lt;br /&gt;
&lt;br /&gt;
IRSND baut den zu sendenden Frame &amp;quot;on-the-fly&amp;quot; aus der IRMP-Datenstruktur wieder zusammen. Dazu zählen:&lt;br /&gt;
&lt;br /&gt;
 1. ID für verwendetes Protokoll&lt;br /&gt;
 2. Adresse bzw. Herstellercode&lt;br /&gt;
 3. Kommando&lt;br /&gt;
&lt;br /&gt;
Mittels der Funktion&lt;br /&gt;
&lt;br /&gt;
   irsnd_send_data (IRMP_DATA * irmp_data_p)&lt;br /&gt;
&lt;br /&gt;
kann man ein zu encodierendes Telegramm versenden. Der Return-Wert ist 1, wenn das Telegramm versendet werden kann, sonst 0. Im ersten Fall werden die Struct-Members&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
    irmp_data_p-&amp;gt;protocol&lt;br /&gt;
    irmp_data_p-&amp;gt;address&lt;br /&gt;
    irmp_data_p-&amp;gt;command&lt;br /&gt;
    irmp_data_p-&amp;gt;flags&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ausgelesen und dann als Frame im jeweils gewünschten Protokoll gesendet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;NEU ab Version 1.5.0:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
irmp_data_p-&amp;gt;flags gibt die Anzahl der Wiederholungen an, z.B.&lt;br /&gt;
&lt;br /&gt;
  irmp_data_p-&amp;gt;flags = 0: Verhalten wie bisher&lt;br /&gt;
  irmp_data_p-&amp;gt;flags = 1: 1 Wiederholung&lt;br /&gt;
  irmp_data_p-&amp;gt;flags = 2: 2 Wiederholungen&lt;br /&gt;
  usw.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Zu beachten: Da bisher irmp_data_p-&amp;gt;flags von IRSND nicht ausgewertet wurde, ist unbedingt ab Version 1.5.0 darauf zu achten, dass irmp_data_p-&amp;gt;flags vor dem Aufruf von irsnd_send_data() einen definierten Wert hat!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Hier ein Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
   IRMP_DATA irmp_data;&lt;br /&gt;
&lt;br /&gt;
   irmp_data.protocol = IRMP_NEC_PROTOCOL;   // sende im NEC-Protokoll&lt;br /&gt;
   irmp_data.address  = 0x00FF;              // verwende Adresse 0x00FF&lt;br /&gt;
   irmp_data.command  = 0x0001;              // sende Kommando 0001&lt;br /&gt;
   irmp_data.flags    = 0;                   // keine Wiederholung!&lt;br /&gt;
&lt;br /&gt;
   (void) irsnd_send_data (&amp;amp;irmp_data);      // versende ohne Prüfung&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Frame wird asynchron über die Interrupt-Routine irsnd_ISR() verschickt, so dass die Funktion irsnd_send_data() sofort zurückkommt.&lt;br /&gt;
&lt;br /&gt;
Sind Wiederholungen angegeben, wird entweder der Frame nach einer Pause (protokollabhängig) neu ausgegeben oder ein protokollspezifischer Wiederholungsframe (z.B. für NEC) gesendet.&lt;br /&gt;
&lt;br /&gt;
Wird erneut irsnd_send_data() aufgerufen, wartet diese, bis der vorhergenhende Frame vollständig verschickt wurde. Man kann aber auch selbst prüfen, ob IRSND gerade &amp;quot;busy&amp;quot; ist oder nicht:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
   while (irsnd_is_busy ())&lt;br /&gt;
   {&lt;br /&gt;
      ;                                      // selber warten oder was anderes tun...&lt;br /&gt;
   }&lt;br /&gt;
   (void) irsnd_send_data (&amp;amp;irmp_data);      // versende ohne Prüfung&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Beispiel-Source irsndmain.c findet man neben der Verwendung von irsnd_send_data() auch den Timer-Aufruf:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
ISR(TIMER1_COMPA_vect)&lt;br /&gt;
{&lt;br /&gt;
  irsnd_ISR())          // call irsnd ISR&lt;br /&gt;
  // call other timer interrupt routines...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Möchte man IRMP und IRSND parallel verwenden (also als Sender und Empfänger) schreibt man die ISR folgendermaßen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
ISR(TIMER1_COMPA_vect)&lt;br /&gt;
{&lt;br /&gt;
  if (! irsnd_ISR())          // call irsnd ISR&lt;br /&gt;
  {                           // if not busy...&lt;br /&gt;
      irmp_ISR();             // call irmp ISR&lt;br /&gt;
  }&lt;br /&gt;
  // call other timer interrupt routines...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das heisst: Nur wenn irsnd_ISR() nichts zu tun hat, dann rufe die ISR des Empfängers auf. Damit ist der Empfänger solange abgeschaltet, während irsnd_ISR() noch Daten sendet. Die Timer-Initialisierungsroutine ist für IRMP und IRSND dann natürlich dieselbe.&lt;br /&gt;
&lt;br /&gt;
Eine gemeinsame main-Funktion könnte dann zum Beispiel folgendermaßen aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
int&lt;br /&gt;
main (void)&lt;br /&gt;
{&lt;br /&gt;
  IRMP_DATA irmp_data;&lt;br /&gt;
&lt;br /&gt;
  irmp_init();                // initialize irmp&lt;br /&gt;
  irsnd_init();               // initialize irsnd&lt;br /&gt;
  timer_init();               // initialize timer&lt;br /&gt;
  sei ();                     // enable interrupts&lt;br /&gt;
&lt;br /&gt;
  for (;;)&lt;br /&gt;
  {&lt;br /&gt;
    if (irmp_get_data (&amp;amp;irmp_data))&lt;br /&gt;
    {&lt;br /&gt;
      irmp_data.flags = 0;    // reset flags!&lt;br /&gt;
      irsnd_send_data (&amp;amp;irmp_data);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Funktion des obigen Sources ist offensichtlich: Ein empfangenes Telegramm wird nach vollständiger Decodierung wieder encodiert und dann wieder über die IR-Diode ausgesandt. Somit können dann zum Beispiel Signale &amp;quot;um die Ecke&amp;quot; oder streckenweise drahtgebunden übertragen werden.&lt;br /&gt;
&lt;br /&gt;
Desweiteren könnte man auch Protokolle transformieren, zum Beispiel NEC-Telegramme in RC5 umwandeln, wenn man seine Original-RC5-FB zu seinem Philips-Gerät verlegt hat...&lt;br /&gt;
&lt;br /&gt;
Der Rest bleibt der Phantasie des geneigten Lesers überlassen ;-)&lt;br /&gt;
&lt;br /&gt;
Hier noch die möglichen Werte für irmp_data.protocol, siehe auch irmp.h:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#define IRMP_SIRCS_PROTOCOL                      1              // Sony&lt;br /&gt;
#define IRMP_NEC_PROTOCOL                        2              // NEC, Pioneer, JVC, Toshiba, NoName etc.&lt;br /&gt;
#define IRMP_SAMSUNG_PROTOCOL                    3              // Samsung&lt;br /&gt;
#define IRMP_MATSUSHITA_PROTOCOL                 4              // Matsushita&lt;br /&gt;
#define IRMP_KASEIKYO_PROTOCOL                   5              // Kaseikyo (Panasonic etc)&lt;br /&gt;
#define IRMP_RECS80_PROTOCOL                     6              // Philips, Thomson, Nordmende, Telefunken, Saba&lt;br /&gt;
#define IRMP_RC5_PROTOCOL                        7              // Philips etc&lt;br /&gt;
#define IRMP_DENON_PROTOCOL                      8              // Denon&lt;br /&gt;
#define IRMP_RC6_PROTOCOL                        9              // Philips etc&lt;br /&gt;
#define IRMP_SAMSUNG32_PROTOCOL                 10              // Samsung32: no sync pulse at bit 16, length 32 instead of 37&lt;br /&gt;
#define IRMP_APPLE_PROTOCOL                     11              // Apple, very similar to NEC&lt;br /&gt;
#define IRMP_RECS80EXT_PROTOCOL                 12              // Philips, Technisat, Thomson, Nordmende, Telefunken, Saba&lt;br /&gt;
#define IRMP_NUBERT_PROTOCOL                    13              // Nubert&lt;br /&gt;
#define IRMP_BANG_OLUFSEN_PROTOCOL              14              // Bang &amp;amp; Olufsen&lt;br /&gt;
#define IRMP_GRUNDIG_PROTOCOL                   15              // Grundig&lt;br /&gt;
#define IRMP_NOKIA_PROTOCOL                     16              // Nokia&lt;br /&gt;
#define IRMP_SIEMENS_PROTOCOL                   17              // Siemens, e.g. Gigaset&lt;br /&gt;
#define IRMP_FDC_PROTOCOL                       18              // FDC keyboard&lt;br /&gt;
#define IRMP_RCCAR_PROTOCOL                     19              // RC Car&lt;br /&gt;
#define IRMP_JVC_PROTOCOL                       20              // JVC&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bitte daran denken: RC6 und JVC werden von IRSND (noch) &#039;&#039;&#039;nicht&#039;&#039;&#039; unterstützt.&lt;br /&gt;
&lt;br /&gt;
Die Daten für die Adresse und das Kommando ermittelt man am besten über IRMP, siehe weiter oben ;-)&lt;br /&gt;
&lt;br /&gt;
== Modulation ==&lt;br /&gt;
&lt;br /&gt;
IRSND moduliert das Signal mit der Trägerfrequenz des jeweiligen IR-Protokolls über PWM, siehe auch Tabelle [http://www.mikrocontroller.net/articles/IRMP#Protokolle]. Dazu benutzt IRSND den Timer2 des ATMEGAs. Beim ATMEGA 48/88/168/328 liegt das OC2A-Signal am PB3, siehe Datenblatt.&lt;br /&gt;
&lt;br /&gt;
Das muss bei anderen ATMEGAs eventuell angepasst werden. Dazu dienen die Zeilen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#define IRSND_PORT          PORTB                       // port B&lt;br /&gt;
#define IRSND_DDR           DDRB                        // ddr B&lt;br /&gt;
#define IRSND_BIT           3                           // OC2A&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
in irsnd.c.&lt;br /&gt;
&lt;br /&gt;
== IRSND unter Linux und Windows ==&lt;br /&gt;
&lt;br /&gt;
irsnd.c lässt sich auch unter Linux direkt kompilieren, um damit Telegramme in Form von IRMP-Scan-Dateien zu erzeugen. Das geht folgendermaßen:&lt;br /&gt;
&lt;br /&gt;
    cc irsnd.c -o irsnd                            # IRSND compilieren&lt;br /&gt;
&lt;br /&gt;
Der Aufruf geht dann folgendermaßen:&lt;br /&gt;
&lt;br /&gt;
    ./irsnd protocol-number hex-address hex-command [repeat] &amp;gt; filename.txt&lt;br /&gt;
&lt;br /&gt;
also zum Beispiel für das NEC-Protokoll, Adresse 0x00FF, Kommando 0x0001&lt;br /&gt;
&lt;br /&gt;
    ./irsnd 2 00FF 0001 &amp;gt; nec.txt                   # irsnd ausführen&lt;br /&gt;
&lt;br /&gt;
IRSND kann man auch unter Windows nutzen, nämlich folgendermaßen:&lt;br /&gt;
&lt;br /&gt;
* Eingabeaufforderung starten&lt;br /&gt;
* In das Verzeichnis von irsnd wechseln&lt;br /&gt;
* Aufruf von:&lt;br /&gt;
&lt;br /&gt;
            irsnd.exe 2 00FF 0001 &amp;gt; nec.txt&lt;br /&gt;
&lt;br /&gt;
Nun kann man direkt mit IRMP anschließend testen, ob das erzeugte Telegramm auch korrekt ist:&lt;br /&gt;
&lt;br /&gt;
            ./irmp &amp;lt; nec.txt&lt;br /&gt;
&lt;br /&gt;
bzw. unter Windows:&lt;br /&gt;
&lt;br /&gt;
            irmp.exe &amp;lt; nec.txt&lt;br /&gt;
&lt;br /&gt;
Das Ganze geht auch ohne Zwischendatei, nämlich:&lt;br /&gt;
&lt;br /&gt;
            ./irsnd 2 00FF 0001 | ./irmp&lt;br /&gt;
&lt;br /&gt;
bzw. unter Windows:&lt;br /&gt;
&lt;br /&gt;
            irsnd.exe 2 00FF 0001 | irmp.exe&lt;br /&gt;
&lt;br /&gt;
IRMP gibt dann als Ergebnis folgendes aus:&lt;br /&gt;
&lt;br /&gt;
            11111111000000001000000001111111 p =  2, a = 0x00ff, c = 0x0001, f = 0x00&lt;br /&gt;
&lt;br /&gt;
IRMP konnte also aus dem von IRSND generierten Frame wieder das Protokoll 2, Adresse 0x00FF und Kommando 0x0001 decodieren.&lt;br /&gt;
&lt;br /&gt;
Bitte beachten: Je nach benutztem Protokoll sind die Bit-Breiten der Adressen bzw. Kommandos verschieden, siehe obige Tabelle [http://www.mikrocontroller.net/articles/IRMP#Protokolle].&lt;br /&gt;
&lt;br /&gt;
Man kann also nicht mit jedem IR-Protokoll komplett 16-Bit breite Adressen oder Kommandos transparent übertragen.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= Anhang =&lt;br /&gt;
&lt;br /&gt;
== Die IR-Protokolle im Detail ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;SIRCS&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 40 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Pulse Distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 Start-Bit + 12-20 Daten-Bits, kein Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 7 Kommando-Bits + 5 Adress-Bits + bis zu 8 zusätzliche Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 2400µs Puls, 600µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 600µs Puls, 600µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 1200µs Puls, 600µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || zweimalig nach ca. 25ms, d.h. 2. und 3. Frame&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || ab dem 4. identischen Frame, Abstand ca. 25ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;NEC + extended NEC&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 36 kHz / 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Pulse Distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 Start-Bit + 32 Daten-Bits + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten NEC || 8 Adress-Bits + 8 invertierte Adress-Bits + 8 Kommando-Bits + 8 invertierte Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Daten ext. NEC || 16 Adress-Bits + 8 Kommando-Bits + 8 invertierte Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 9000µs Puls, 4500µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 560µs Puls,  560µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 560µs Puls, 1690µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || 560µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || keine&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || 9000µs Puls, 2250µs Pause, 560µs Puls, ~100ms Pause&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;SAMSUNG&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || ?? kHz&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Pulse Distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 Start-Bit + 16 Daten(1)-Bits + 1 Sync-Bit + 20 Daten(2)-Bits + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten(1) || 16 Adress-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Daten(2) || 4 ID-Bits + 8 Kommando-Bits + 8 invertierte Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 4500µs Puls, 4500µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 550µs Puls,  450µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 550µs Puls, 1450µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Sync-Bit || 550µs Puls, 4500µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || 550µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || keine&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || N-fache Wiederholung des Original-Frames innerhalb von 100ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;SAMSUNG32&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || ?? kHz&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Pulse Distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 Start-Bit + 32 Daten-Bits + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 16 Adress-Bits + 16 Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 4500µs Puls, 4500µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 550µs Puls,  450µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 550µs Puls, 1450µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || 550µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || einmalig nach 45ms&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || dritter, fünfter, siebter usw. identischer Frame&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;MATSUSHITA&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 36 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Pulse Distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 Start-Bit + 24 Daten-Bits + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 6 Hersteller-Bits + 6 Kommando-Bits + 12 Adress-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 3488µs Puls, 3488µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 872µs Puls,  872µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 872µs Puls, 2616µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || 872µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || keine&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || N-fache Wiederholung des Original-Frames innerhalb von 100ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || LSB first?&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;KASEIKYO&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Pulse Distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 Start-Bit + 48 Daten-Bits + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 16 Hersteller-Bits + 4 Parity-Bits + 4 Genre1-Bits + 4 Genre2-Bits + 10 Kommando-Bits + 2 ID-Bits + 8 Parity-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 3380µs Puls, 1690µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 423µs Puls,  423µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 423µs Puls, 1269µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || 423µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || einmalig nach 74ms&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || N-fache Wiederholung des Original-Frames innerhalb von 74ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || LSB first?&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;RECS80&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Pulse Distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 2 Start-Bits + 10 Daten-Bits + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 1 Toggle-Bit + 3 Adress-Bits + 6 Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 158µs Puls, 7432µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 158µs Puls, 4902µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 158µs Puls, 7432µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || 158µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || keine&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || N-fache Wiederholung des Original-Frames innerhalb von 100ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;RECS80EXT&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Pulse Distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 2 Start-Bits + 11 Daten-Bits + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 1 Toggle-Bit + 4 Adress-Bits + 6 Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 158µs Puls, 3637µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 158µs Puls, 4902µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 158µs Puls, 7432µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || 158µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || keine&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || N-fache Wiederholung des Original-Frames innerhalb von 100ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;RC5 + RC5X&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 36 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Bi-Phase (Manchester)&lt;br /&gt;
|-&lt;br /&gt;
| Frame RC5 || 2 Start-Bits + 12 Daten-Bits + 0 Stop-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Daten RC5 || 1 Toggle-Bit + 5 Adress-Bits + 6 Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Frame RC5X || 1 Start-Bit + 13 Daten-Bits + 0 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten RC5X || 1 invertiertes Kommando-Bit + 1 Toggle-Bit + 5 Adress-Bits + 6 Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 889µs Pause, 889µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 889µs Puls, 889µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 889µs Pause, 889µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || kein Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || keine&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || N-fache Wiederholung des Original-Frames innerhalb von 100ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;DENON&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 32 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Pulse Distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 0 Start-Bits + 15 Data-Bits + 1 Stop-Bit + 65ms Pause + 15 invertierte Daten-Bits + 1 Stop-bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 5 Address-Bits + 10 Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || kein Start-Bit&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 275µs Puls, 775µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 275µs Puls, 1900µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || 275µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || keine&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || N-fache Wiederholung des Original-Frames innerhalb von 100ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;RC6&#039;&#039;&#039; + &#039;&#039;&#039;RC6A&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 36 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Bi-Phase (Manchester)&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 Start-Bit + 1 Bit &amp;quot;1&amp;quot; + 3 Mode-Bits (000) + 1 Toggle-Bit + 16 Daten-Bits + 2666µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 Start-Bit + 1 Bit &amp;quot;1&amp;quot; + 3 Mode-Bits (110) + 1 Toggle-Bit + 31 Daten-Bits + 2666µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Daten RC6 || 8 Adress-Bits + 8 Kommando Bits&lt;br /&gt;
|-&lt;br /&gt;
| Daten RC6A || &amp;quot;1&amp;quot; + 14 Hersteller-Bits + 8 System-Bits + 8 Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 2666µs Puls, 889µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Toggle 0-Bit || 889µs Pause, 889µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| Toggle 1-Bit || 889µs Puls, 889µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 444µs Pause, 444µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 444µs Puls, 444µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || kein Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || keine&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || N-fache Wiederholung des Original-Frames innerhalb von 100ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;APPLE&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Pulse Distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 Start-Bit + 32 Daten-Bits + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 16 Adress-Bits + 11100000 + 8 Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || siehe NEC&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || siehe NEC&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || siehe NEC&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || siehe NEC&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || keine&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || N-fache Wiederholung des Original-Frames innerhalb von 100ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;NUBERT&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 36 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Pulse Distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 Start-Bit + 10 Daten-Bits + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 0 Adress-Bits + 10 Kommando-Bits ?&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 1340µs Puls, 340µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 500µs Puls, 1300µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 1340µs Puls, 340µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || 500µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || einmalig nach 35ms&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || dritter, fünfter, siebter usw. identischer Frame&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || MSB first?&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;B&amp;amp;O&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 455 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Pulse Distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 4 Start-Bits + 16 Daten-Bits + 1 Trailer-Bit + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 0 Adress-Bits + 16 Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit 1 || 200µs Puls, 2925µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit 2 || 200µs Puls, 2925µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit 3 || 200µs Puls, 15425µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit 4 || 200µs Puls, 2925µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 200µs Puls, 2925µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 200µs Puls, 9175µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| R-Bit || 200µs Puls, 6050µs Pause, wiederholt das letzte Bit (repetition)&lt;br /&gt;
|-&lt;br /&gt;
| Trailer-Bit || 200µs Puls, 12300µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || 200µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || keine&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || N-fache Wiederholung des Original-Frames innerhalb von 100ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;GRUNDIG&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 38 kHz (?)&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Bi-Phase (Manchester)&lt;br /&gt;
|-&lt;br /&gt;
| Frame-Paket || 1 Start-Frame + 19,968ms Pause + N Info-Frames + 117,76ms Pause + 1 Stop-Frame&lt;br /&gt;
|-&lt;br /&gt;
| Start-Frame || 1 Pre-Bit + 1 Start-Bit + 9 Daten-Bits (alle 1) + 0 Stop-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Info-Frame || 1 Pre-Bit + 1 Start-Bit + 9 Daten-Bits + 0 Stop-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Frame || 1 Pre-Bit + 1 Start-Bit + 9 Daten-Bits (alle 1) + 0 Stop-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 9 Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Pre-Bit || 528µs Puls, 2639µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 528µs Puls, 528µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 528µs Pause, 528µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 528µs Puls, 528µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || kein Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || keine&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || N-fache Wiederholung des Info-Frames mit einem Pausenabstand von 117,76ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;NOKIA&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Bi-Phase (Manchester)&lt;br /&gt;
|-&lt;br /&gt;
| Frame-Paket || 1 Start-Frame + 19,968ms Pause + N Info-Frames + 117,76ms Pause + 1 Stop-Frame&lt;br /&gt;
|-&lt;br /&gt;
| Start-Frame || 1 Pre-Bit + 1 Start-Bit + 1x 0-Bit + 15x 1-Bit + 0 Stop-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Info-Frame || 1 Pre-Bit + 1 Start-Bit + 16 Daten-Bits + 0 Stop-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Frame || 1 Pre-Bit + 1 Start-Bit + 1x 0-Bit + 15x 1-Bit + 0 Stop-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 8 Kommando-Bits + 8 Address-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Pre-Bit || 528µs Puls, 2639µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 528µs Puls, 528µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 528µs Pause, 528µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 528µs Puls, 528µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || kein Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || keine&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || N-fache Wiederholung des Info-Frames mit einem Pausenabstand von 117,76ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;SIEMENS&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 36 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Bi-Phase (Manchester)&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 Start-Bit + 22 Daten-Bits + 0 Stop-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 13 Adress-Bits + 1 Repeat-Bit + 7 Daten-Bits + 1 unbekanntes Bit&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 250µs Puls, 250µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 250µs Pause, 250µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 250µs Puls, 250µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || kein Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || 1-malige Wiederholung mit gesetztem Repeat-Bit (?)&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || N-fache Wiederholung des Original-Frames innerhalb von 100ms (?)&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;FDC&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Pulse Distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 Start-Bit + 40 Daten-Bits + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 8 Adress-Bits + 12 x 0-Bits + 4 Press/Release-Bits + 8 Kommando-Bits + 8 invertierte Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 2085µs Puls, 966µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 300µs Puls,  220µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 300µs Puls, 715µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || 300µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || keine&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Drücken || Press/Release-Bits = 0000&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Loslassen || Press/Release-Bits = 1111&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || Wiederholung nach Pause von 60ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;RCCAR&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Pulse Distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 Start-Bit + 13 Daten-Bits + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten || C0 C1 A0 A1 D0 D1 D2 D3 D4 D5 D6 D7 V&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 2000µs Puls, 2000µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 600µs Puls,  900µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 600µs Puls, 450µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || 600µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || keine&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || keine?&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;JVC&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Pulse Distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 Start-Bit + 16 Daten-Bits + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 4 Adress-Bits + 12 Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 9000µs Puls, 4500µs Pause, 6000µs Pause bei Tasten-Wiederholung&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 560µs Puls,  560µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 560µs Puls, 1690µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || 560µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || keine&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || Wiederholung nach Pause von 25ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Software-Historie IRMP ==&lt;br /&gt;
&lt;br /&gt;
Änderungen IRMP:&lt;br /&gt;
&lt;br /&gt;
* 04.09.2010: Bugfix für F_INTERRUPTS &amp;gt;= 16000&lt;br /&gt;
&lt;br /&gt;
* 02.09.2010: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: RC6A&lt;br /&gt;
&lt;br /&gt;
* 29.08.2010: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: JVC&lt;br /&gt;
* 29.08.2010: Kaseikyo-Protokoll: Berücksichtigung der Genre-Bits. &#039;&#039;&#039;ACHTUNG: dadurch neue Command-Codes!&#039;&#039;&#039;&lt;br /&gt;
* 29.08.2010: Kaseikyo-Protokoll: Verbesserte Behandlung von Wiederholungs-Frames&lt;br /&gt;
* 29.08.2010: Verbesserte Unterstützung des APPLE-Protokolls. &#039;&#039;&#039;ACHTUNG: dadurch neue Adress-Codes!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* 01.07.2010: Bugfix: Einführen eines Timeouts für NEC-Repetition-Frames, um &amp;quot;Geisterkommandos&amp;quot; zu verhindern.&lt;br /&gt;
&lt;br /&gt;
* 26.06.2010: Bugfix: Deaktivieren von RECS80, RECS80EXT &amp;amp; SIEMENS bei geringer Interrupt-Rate&lt;br /&gt;
&lt;br /&gt;
* 25.06.2010: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: RCCAR&lt;br /&gt;
* 25.06.2010: Tastenerkennung für FDC-Protokoll (IR-keyboard) erweitert&lt;br /&gt;
* 25.06.2010: Interrupt-Frequenz nun bis zu 20kHz möglich&lt;br /&gt;
&lt;br /&gt;
* 09.06.2010: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: FDC (IR-keyboard)&lt;br /&gt;
* 09.06.2010: Timing für DENON-Protokoll korrigiert&lt;br /&gt;
&lt;br /&gt;
* 02.06.2010: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: Siemens (Gigaset)&lt;br /&gt;
&lt;br /&gt;
* 26.05.2010: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: Nokia&lt;br /&gt;
* 26.05.2010: Bugfix Auswertung von langen Tastendrücken bei Grundig-Protokoll&lt;br /&gt;
&lt;br /&gt;
* 17.05.2010: Bugfix SAMSUNG32-Protokoll: Kommando-Bit-Maske korrigiert&lt;br /&gt;
&lt;br /&gt;
* 16.05.2010: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: Grundig&lt;br /&gt;
* 16.05.2010: Behandlung von automatischen Frame-Wiederholungen beim SIRCS-, SAMSUNG32- und NUBERT-Protokoll verbessert.&lt;br /&gt;
&lt;br /&gt;
* 28.04.2010: Nur einige kosmetische Code-Optimierungen&lt;br /&gt;
&lt;br /&gt;
* 16.04.2010: Sämtliche Timing-Toleranzen angepasst/optimiert&lt;br /&gt;
&lt;br /&gt;
* 12.04.2010: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: Bang &amp;amp; Olufsen&lt;br /&gt;
&lt;br /&gt;
* 29.03.2010: Bugfix beim Erkennen von mehrfachen NEC-Repetition-Frames&lt;br /&gt;
* 29.03.2010: Konfiguration in irmpconfig.h ausgelagert&lt;br /&gt;
* 29.03.2010: Einführung einer Programmversion in README.txt: Version 1.0&lt;br /&gt;
&lt;br /&gt;
* 17.03.2010: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: Nubert&lt;br /&gt;
&lt;br /&gt;
* 16.03.2010: Korrektur der RECS80-Startbit-Timings&lt;br /&gt;
* 16.03.2010: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: RECS80 Extended&lt;br /&gt;
&lt;br /&gt;
* 15.03.2010: Codeoptimierung&lt;br /&gt;
&lt;br /&gt;
* 14.03.2010: Portierung auf PIC&lt;br /&gt;
&lt;br /&gt;
* 11.03.2010: Anpassungen an verschiedene ATMega-Typen durchgeführt&lt;br /&gt;
&lt;br /&gt;
* 07.03.2010: Bugfix: Zurücksetzen der Statemachine nach einem unvollständigen RC5-Frame&lt;br /&gt;
&lt;br /&gt;
* 05.03.2010: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: Apple&lt;br /&gt;
* 05.03.2010: Die Daten irmp_data.addr + irmp_data.command werden nun in der jeweiligen Bit-Order des verwendeten Protokolls gespeichert&lt;br /&gt;
&lt;br /&gt;
* 04.03.2010: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: SAMSUNG32 (Mix aus SAMSUNG &amp;amp; NEC-Protokoll)&lt;br /&gt;
* 04.03.2010: Änderung der SIRCS- und Kaseikyo-Toleranzen&lt;br /&gt;
&lt;br /&gt;
* 02.03.2010: SIRCS: Korrekte Erkennung und Unterdrückung von automatischen Frame-Wiederholungen&lt;br /&gt;
* 02.03.2010: SIRCS: Device-ID-Bits werden nun in irmp_data.command und nicht mehr in irmp_data.address gespeichert&lt;br /&gt;
* 02.03.2010: Vergrößerung des Scan Buffers (zwecks Protokollierung)&lt;br /&gt;
&lt;br /&gt;
* 24.02.2010: Neue Variable flags in IRMP_DATA zur Erkennung von langen Tastendrücken&lt;br /&gt;
&lt;br /&gt;
* 20.02.2010: Bugfix Denon-Protokoll: Wiederholungsframe grundsätzlich invertiert&lt;br /&gt;
&lt;br /&gt;
* 19.02.2010: Erkennung von NEC-Protokoll-Varianten, z.&amp;amp;nbsp;B. Apple-Fernbedienung&lt;br /&gt;
* 19.02.2010: Erkennung von RC6- und Denon-Protokoll&lt;br /&gt;
* 19.02.2010: Verbesserung des RC5-Decoders (Bugfixes)&lt;br /&gt;
&lt;br /&gt;
* 13.02.2010: Bugfix: Puls/Pausen-Counter um 1 zu niedrig, nun bessere Erkennung bei Protokollen mit sehr kurzen Pulszeiten&lt;br /&gt;
* 13.02.2010: Erkennung der NEC-Wiederholungssequenz&lt;br /&gt;
&lt;br /&gt;
* 12.02.2010: RC5-Protokoll-Decoder hinzugefügt&lt;br /&gt;
&lt;br /&gt;
* 05.02.2010: Konflikt zwischen Samsung- und Matsushita-Protokoll beseitigt&lt;br /&gt;
&lt;br /&gt;
== Software-Historie IRSND ==&lt;br /&gt;
&lt;br /&gt;
Änderungen:&lt;br /&gt;
&lt;br /&gt;
* 02.09.2010: Neues Protokoll: JVC&lt;br /&gt;
* 02.09.2010: Anpassung des APPLE-Encoders an IRMP-Version 1.7.3.&lt;br /&gt;
&lt;br /&gt;
* 29.08.2010: Neues Protokoll: Kaseikyo (Panasonic u.a.)&lt;br /&gt;
&lt;br /&gt;
* 01.07.2010: Bugfix: Deaktivieren von RECS80, RECS80EXT &amp;amp; SIEMENS bei geringer Interrupt-Rate&lt;br /&gt;
&lt;br /&gt;
* 25.06.2010: Neues Protokoll: RCCAR&lt;br /&gt;
&lt;br /&gt;
* 09.06.2010: Neues Protokoll: FDC (IR-keyboard)&lt;br /&gt;
* 09.06.2010: Timing für DENON-Protokoll korrigiert&lt;br /&gt;
&lt;br /&gt;
* 02.06.2010: Neues Protokoll: Siemens (Gigaset)&lt;br /&gt;
* 02.06.2010: Simulation von langen Tastendrücken&lt;br /&gt;
&lt;br /&gt;
* 26.05.2010: Neues Protokoll: Nokia&lt;br /&gt;
&lt;br /&gt;
* 17.05.2010: Neues Protokoll: Grundig&lt;br /&gt;
* 17.05.2010: Behandlung von Frame-Wiederholungen für SIRCS, SAMSUNG32 und NUBERT korrigiert&lt;br /&gt;
&lt;br /&gt;
* 28.04.2010: Unterstützung des APPLE-Protokolls&lt;br /&gt;
* 28.04.2010: Konfiguration über irmpconfig.h&lt;br /&gt;
&lt;br /&gt;
* 16.04.2010: Sämtliche Timing-Toleranzen angepasst/optimiert&lt;br /&gt;
&lt;br /&gt;
* 14.04.2010: Neues Protokoll: Bang &amp;amp; Olufsen&lt;br /&gt;
&lt;br /&gt;
* 17.03.2010: Neues Protokoll: Nubert&lt;br /&gt;
* 17.03.2010: Korrektur der Pausen zwischen Frame-Wiederholungen&lt;br /&gt;
&lt;br /&gt;
* 16.03.2010: Korrektur des Timer-Registers TCCR2&lt;br /&gt;
* 16.03.2010: Korrektur der RECS80-Startbit-Timings&lt;br /&gt;
* 16.03.2010: Neues Protokoll: RECS80 Extended &lt;br /&gt;
&lt;br /&gt;
* 11.03.2010: Anpassungen an verschiedene ATMega-Typen durchgeführt&lt;br /&gt;
&lt;br /&gt;
* 07.03.2010: Alpha-Version&lt;br /&gt;
&lt;br /&gt;
== Literatur ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; IR-Übersicht &#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* http://www.epanorama.net/links/irremote.html&lt;br /&gt;
* http://www.elektor.de/jahrgang/2008/juni/cc2-avr-projekt-%283%29-unsichtbare-kommandos.497184.lynkx?tab=4 (IR Übersicht &amp;amp; RC5)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SIRCS-Protokoll&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* http://www.sbprojects.com/knowledge/ir/sirc.htm&lt;br /&gt;
* http://www.ustr.net/infrared/sony.shtml&lt;br /&gt;
* http://users.telenet.be/davshomepage/sony.htm&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;NEC-Protokoll:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* http://www.sbprojects.com/knowledge/ir/nec.htm&lt;br /&gt;
* http://www.ustr.net/infrared/nec.shtml&lt;br /&gt;
* http://www.celadon.com/infrared_protocol/infrared_protocols_samples.pdf&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SAMSUNG-Protokoll:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
(wurde aus diversen Protokollen (Daewoo u.ä.) zusammengereimt, daher kein direkter Link auf irgendwelche SAMSUNG-Dokumentation verfügbar)&lt;br /&gt;
&lt;br /&gt;
Hier ein Link zum Daewoo-Protokoll, welches dasselbe Prinzip des Sync-Bits in der Mitte eines Frames nutzt, jedoch mit anderen Timing-Werten arbeitet:&lt;br /&gt;
&lt;br /&gt;
* http://users.telenet.be/davshomepage/daewoo.htm&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MATSUHITA-Protokoll:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* http://www.celadon.com/infrared_protocol/infrared_protocols_samples.pdf&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KASEIKYO-Protokoll (auch &amp;quot;Japan-Protokoll&amp;quot;):&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* http://www.mikrocontroller.net/attachment/4246/IR-Protokolle_Diplomarbeit.pdf&lt;br /&gt;
* http://www.roboternetz.de/phpBB2/files/entwicklung_und_realisierung_einer_universalinfrarotfernbedienung_mit_timerfunktionen.pdf&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RECS80- und RECS80-Extended-Protokoll:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* http://www.sbprojects.com/knowledge/ir/recs80.htm&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RC5- und RC5x-Protokoll:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* http://www.sbprojects.com/knowledge/ir/rc5.htm&lt;br /&gt;
* http://users.telenet.be/davshomepage/rc5.htm&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Denon-Protokoll:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* http://www.mikrocontroller.com/de/IR-Protokolle.php#DENON&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RC6 und RC6A-Protokoll:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* http://www.sbprojects.com/knowledge/ir/rc6.htm&lt;br /&gt;
* http://slycontrol.ru/scr/kb/rc6.htm&lt;br /&gt;
* http://www.picbasic.nl/info_rc6_uk.htm&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bang &amp;amp; Olufsen:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* http://www.mikrocontroller.net/attachment/33137/datalink.pdf&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Grundig&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* http://www.mikrocontroller.net/attachment/77507/Grundig_10bit.pdf&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nokia&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* http://www.sbprojects.com/knowledge/ir/nrc17.htm&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Diverse Protokolle:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* http://www.mikrocontroller.net/attachment/4246/IR-Protokolle_Diplomarbeit.pdf&lt;br /&gt;
* http://www.celadon.com/infrared_protocol/infrared_protocols_samples.pdf&lt;br /&gt;
* http://www.opendcc.de/info/rc5/rc5.html&lt;br /&gt;
* http://www.roboternetz.de/phpBB2/files/entwicklung_und_realisierung_einer_universalinfrarotfernbedienung_mit_timerfunktionen.pdf&lt;br /&gt;
&lt;br /&gt;
== Hardware / IRMP-Projekte ==&lt;br /&gt;
&lt;br /&gt;
Eine Implementierung auf Basis IRMP und IRSND als Multiprotokoll Dekoder mit LCD&lt;br /&gt;
von Klaus Leidinger: &lt;br /&gt;
* http://www.mikrocontroller-projekte.de/Mikrocontroller/index.html&lt;br /&gt;
&lt;br /&gt;
Ähnliche Implementierung wie von Klaus Leidinger für Pollin AVR-NET-IO mit Pollin ADD-ON Board:&lt;br /&gt;
* http://son.ffdf-clan.de/include.php?path=forumsthread&amp;amp;threadid=703&lt;br /&gt;
&lt;br /&gt;
USB IR Remote Receiver von Hugo Portisch:&lt;br /&gt;
* http://www.mikrocontroller.net/articles/USB_IR_Remote_Receiver&lt;br /&gt;
&lt;br /&gt;
== Danksagung ==&lt;br /&gt;
&lt;br /&gt;
Ganz herzlich bedanken möchte ich mich bei Vlad Tepesch, Klaus Leidinger und Peter K., die mich mit Scan-Dateien ihrer Infrarot-Fernbedienungen versorgt haben. Dank auch an Klaus für seine nächtelangen Tests von IRMP &amp;amp; IRSND.&lt;br /&gt;
&lt;br /&gt;
Ebenso bedanken möchte ich mich bei Christian F. für seine Tipps zur PIC-Portierung.&lt;br /&gt;
&lt;br /&gt;
== Diskussion ==&lt;br /&gt;
&lt;br /&gt;
Meinungen, Verbesserungsvorschläge, harsche Kritik und ähnliches kann im [http://www.mikrocontroller.net/topic/162119 Beitrag: Infrared Multi Protocol Decoder] geäussert werden.&lt;br /&gt;
&lt;br /&gt;
Viel Spaß mit IRMP!&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Datenübertragung]]&lt;/div&gt;</summary>
		<author><name>Shortie</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=IRMP&amp;diff=43445</id>
		<title>IRMP</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=IRMP&amp;diff=43445"/>
		<updated>2010-02-20T16:46:14Z</updated>

		<summary type="html">&lt;p&gt;Shortie: /* Diskussion */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Von &#039;&#039;&#039;Frank M. ([http://www.mikrocontroller.net/user/show/ukw ukw])&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= IRMP - Infrarot-Multiprotokoll-Decoder =&lt;br /&gt;
&lt;br /&gt;
[[Datei:irmp-title.png| |Scan eines NEC-kompatiblen Fernbedienungssignals]]&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
[[Datei:IRMP-TSOP1736.png|miniatur|Anschluß eines IR-Empfängers an µC]]&lt;br /&gt;
&lt;br /&gt;
Da RC5 nicht nur veraltet, sondern mittlerweile obsolet ist und immer mehr die elektronischen Geräte der fernöstlichen Unterhaltungsindustrie in unseren Haushalten Einzug finden, ist es an der Zeit, einen IR-Decoder zu entwickeln, der ca. 90% aller bei uns im täglichen Leben zu findenden IR-Fernbedienungen &amp;quot;versteht&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
IRMP - der Infrarot-Fernbedienungsdecoder, der mehrere Protokolle auf einmal decodieren kann, beherrscht folgende Protokolle:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Protokoll || Hersteller&lt;br /&gt;
|-&lt;br /&gt;
| SIRCS || Sony&lt;br /&gt;
|-&lt;br /&gt;
| NEC || NEC, Yamaha, Canon, Tevion, Harman/Kardon, Hitachi, JVC, Pioneer, Toshiba, Xoro, Orion, NoName und viele weitere japanische Hersteller.&lt;br /&gt;
|-&lt;br /&gt;
| SAMSUNG || Samsung&lt;br /&gt;
|-&lt;br /&gt;
| MATSUSHITA || Matsushita&lt;br /&gt;
|-&lt;br /&gt;
| KASEIKYO || Panasonic, Technics, Denon und andere japanische Hersteller, welche Mitglied der &amp;quot;Japan&#039;s Association for Electric Home Application&amp;quot; sind.&lt;br /&gt;
|-&lt;br /&gt;
| RECS80 || Philips, Nokia, Thomson, Nordmende, Telefunken, Saba&lt;br /&gt;
|-&lt;br /&gt;
| RC5 || Philips und andere europäische Hersteller&lt;br /&gt;
|-&lt;br /&gt;
| DENON || Denon&lt;br /&gt;
|-&lt;br /&gt;
| RC6 || Philips und andere europäische Hersteller&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ein paar Bemerkungen zu den einzelnen Protokollen:&lt;br /&gt;
&lt;br /&gt;
Einige Hersteller verwenden ihr eigenes Protokoll, dazu gehören u.a. Sony, Samsung und Matsushita. Philips hat RC5 entwickelt und natürlich auch selbst benutzt. RC5 galt damals in Europa als &#039;&#039;das&#039;&#039; Standard-IR-Protokoll, welches von vielen europäischen Herstellern übernommen wurde. Mittlerweile ist RC5 fast gar nicht mehr anzutreffen - man kann es eigentlich als &amp;quot;ausgestorben&amp;quot; abhaken.&lt;br /&gt;
&lt;br /&gt;
Auch die japanischen Hersteller haben versucht, einen eigenen Standard zu etablieren, nämlich das sog. Kaseikyo- (oder auch &amp;quot;Japan-&amp;quot;) Protokoll. Dieses ist mit einer Bitlänge von 48 sehr universell und allgemein verwendbar. Richtig durchgesetzt hat es sich aber bis heute nicht. Ich selbst habe jedenfalls noch keine einzige Fernbedienung gesehen, die das Kaseikyo-Protokoll nutzt.&lt;br /&gt;
&lt;br /&gt;
Heutzutage wird vornehmlich das NEC-Protokoll verwendet - und zwar von den unterschiedlichsten (Marken- und auch Noname-)Herstellern. Ich schätze den &amp;quot;Marktanteil&amp;quot; auf ca. 80% beim NEC-Protokoll. Fast alle Fernbedienungen im alltäglichen Einsatz verwenden bei mir den NEC-IR-Code. Das fängt beim Fernseher an, geht über vom DVD-Player zur Notebook-Fernbedienung und reicht bis zur Noname-MultiMedia-Festplatte - um nur einige Beispiele zu nennen.&lt;br /&gt;
&lt;br /&gt;
Der Source zu IRMP entstand im Rahmen des Projektes &#039;&#039;&#039;WordClock&#039;&#039;&#039;, siehe auch Artikel [http://www.mikrocontroller.net/articles/Word_Clock WordClock]&lt;br /&gt;
&lt;br /&gt;
Anlass für einen eigenen IRMP-Artikel ist folgender Thread in der Codesammlung: &lt;br /&gt;
[http://www.mikrocontroller.net/topic/162119 Beitrag: IRMP - Infrared Multi Protocol Decoder]&lt;br /&gt;
&lt;br /&gt;
== Download ==&lt;br /&gt;
&lt;br /&gt;
Download: [http://www.mikrocontroller.net/wikifiles/7/79/Irmp.zip Irmp.zip] Stand: 20.02.2010&lt;br /&gt;
&lt;br /&gt;
Änderungen:&lt;br /&gt;
&lt;br /&gt;
* 20.02.2010: Bugfix Denon-Protokoll: Wiederholungsframe grundsätzlich invertiert&lt;br /&gt;
* 19.02.2010: Erkennung von NEC-Protokoll-Varianten, z.B. Apple-Fernbedienung&lt;br /&gt;
* 19.02.2010: Erkennung von RC6- und Denon-Protokoll&lt;br /&gt;
* 19.02.2010: Verbesserung des RC5-Decoders (Bugfixes)&lt;br /&gt;
* 13.02.2010: Bugfix: Puls/Pausen-Counter um 1 zu niedrig, nun bessere Erkennung bei Protokollen mit sehr kurzen Pulszeiten&lt;br /&gt;
* 13.02.2010: Erkennung der NEC-Wiederholungssequenz&lt;br /&gt;
* 12.02.2010: RC5-Protokoll-Decoder hinzugefügt&lt;br /&gt;
* 05.02.2010: Konflikt zwischen Samsung- und Matsushita-Protokoll beseitigt&lt;br /&gt;
&lt;br /&gt;
== Protokolle ==&lt;br /&gt;
&lt;br /&gt;
Die von IRMP decodierten Protokolle haben etwas gemeinsames: Sie weisen alle ein Start-Bit auf, welches vom Timing her ausgezeichnet, d.h. einmalig ist.&lt;br /&gt;
&lt;br /&gt;
Anhand dieses Start-Bit-Timings werden die verschiedenen Protokolle unterschieden. IRMP misst also das Timing des Start-Bits und stellt dann &amp;quot;on-thy-fly&amp;quot; seine Timingtabellen auf das erkannte Protokoll um, damit die nach dem Start-Bit gesandten Daten in einem Rutsch eingelesen werden können, ohne das komplette Telegramm (Frame) erst speichern zu müssen.&lt;br /&gt;
&lt;br /&gt;
Die angegebenen Timingwerte sind Idealwerte. Bei einigen Fernbedienungen in der Praxis weichen sie um bis zu 40% voneinander ab. Deshalb arbeitet IRMP mit Minimum-/Maximumsgrenzen, um bzgl. des Zeitverhaltens tolerabel zu sein.&lt;br /&gt;
&lt;br /&gt;
[[Datei:nec-protocol.png|miniatur|NEC-Protokoll, Reichelt RGB-LED-Fernbedienung, T-&amp;gt;A: 9,14ms, A-&amp;gt;B: 4,42ms, B-&amp;gt;C: 660us]]&lt;br /&gt;
&lt;br /&gt;
Die Protokolle im einzelnen:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;SIRCS&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 40 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 Start-Bit + 12-20 Daten-Bits, kein Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 7 Kommando-Bits + 5 Adress-Bits + bis zu 8 zusätzliche Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 2400µs Puls, 600µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 600µs Puls, 600µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 1200µs Puls, 600µs Pause&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;NEC + extended NEC&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 36 kHz / 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 Start-Bit + 32 Daten-Bits + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten NEC || 8 Adress-Bits + 8 invertierte Adress-Bits + 8 Kommando-Bits + 8 invertierte Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Daten ext. NEC || 16 Adress-Bits + 8 Kommando-Bits + 8 invertierte Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 9000µs Puls, 4500µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 560µs Puls,  560µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 560µs Puls, 1690µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || 560µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || 9000µs Puls, 2250µs Pause, 560µs Puls, ~100ms Pause&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;SAMSUNG&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || ?? kHz&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 Start-Bit + 16 Daten(1)-Bits + 1 Sync-Bit + 20 Daten(2)-Bits + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten(1) || 16 Adress-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Daten(2) || 4 ID-Bits + 8 Kommando-Bits + 8 invertierte Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 4500µs Puls, 4500µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 550µs Puls,  450µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 550µs Puls, 1450µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Sync-Bit || 550µs Puls, 4500µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || 550µs Puls&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;MATSUSHITA&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 36 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 Start-Bit + 24 Daten-Bits + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 6 Hersteller-Bits + 6 Kommando-Bits + 12 Adress-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 3488µs Puls, 3488µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 872µs Puls,  872µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 872µs Puls, 2616µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || 872µs Puls&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;KASEIKYO&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 56 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 Start-Bit + 48 Daten-Bits + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 16 Hersteller-Bits + 4 Parity-Bits + 4 Genre1-Bits + 4 Genre2-Bits + 10 Kommando-Bits + 2 ID-Bits + 8 Parity-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 3380µs Puls, 1690µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 423µs Puls,  423µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 423µs Puls, 1269µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || 423µs Puls&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;RECS80&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 2 Start-Bits + 10 Daten-Bits + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 1 Toggle-Bit + 3 Adress-Bits + 6 Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 158µs Puls, 5060µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 158µs Puls, 5060µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 158µs Puls, 7600µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || 158µs Puls&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;RC5 + RC5X&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 36 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Frame RC5 || 2 Start-Bits + 12 Daten-Bits + 0 Stop-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Daten RC5 || 1 Toggle-Bit + 5 Adress-Bits + 6 Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Frame RC5X || 1 Start-Bit + 13 Daten-Bits + 0 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten RC5X || 1 invertiertes Kommando-Bit + 1 Toggle-Bit + 5 Adress-Bits + 6 Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 889µs Pause, 889µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 889µs Puls, 889µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 889µs Pause, 889µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || kein Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;DENON&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || ?? kHz&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 0 Start-Bits + 16 Data-Bits + 1 Stop-Bit + 65ms Pause + 16 invertierte Daten-Bits + 1 Stop-bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 5 Address-Bits + 10 Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || kein Start-Bit&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 275µs Puls, 1050µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 275µs Puls, 1900µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || 275µs Puls&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;RC6&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 36 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 Start-Bit + 1 Bit &amp;quot;1&amp;quot; + 3 Mode-Bits + 1 Toggle-Bit + 16 Daten-Bits + 2666 µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 8 Adress-Bits + 8 Kommando Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 2666µs Puls, 889µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Toggle 0-Bit || 889µs Pause, 889µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| Toggle 1-Bit || 889µs Puls, 889µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 444µs Pause, 444µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 444µs Puls, 444µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || kein Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Source-Code ==&lt;br /&gt;
&lt;br /&gt;
Der Source-Code lässt sich einfach übersetzen, indem man die Projekt-Datei irmp.aps in den WinAVR lädt. Aber auch für die Codevision Nutzer ist IRMP entsprechend angepasst: hier muss man die Zeile&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
  //#define CODEVISION&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
in main.c aktivieren, das heisst, die Kommentarzeichen entfernen.&lt;br /&gt;
&lt;br /&gt;
IRMP decodiert sämtliche oben aufgelisteten Protokolle in einer ISR, siehe irmp.c. Möchte man davon einige aus Speicherplatzgründen deaktivieren, sind die&lt;br /&gt;
entsprechenden Werte in irmp.c ...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
  #define IRMP_SUPPORT_SIRCS_PROTOCOL       1 // flag: support SIRCS,      1=yes, 0=no, uses ~100 bytes&lt;br /&gt;
  #define IRMP_SUPPORT_NEC_PROTOCOL         1 // flag: support NEC,        1=yes, 0=no, uses ~250 bytes&lt;br /&gt;
  #define IRMP_SUPPORT_SAMSUNG_PROTOCOL     1 // flag: support Samsung,    1=yes, 0=no, uses ~250 bytes&lt;br /&gt;
  #define IRMP_SUPPORT_MATSUSHITA_PROTOCOL  1 // flag: support Matsushita, 1=yes, 0=no, uses ~100 bytes&lt;br /&gt;
  #define IRMP_SUPPORT_KASEIKYO_PROTOCOL    1 // flag: support Kaseikyo,   1=yes, 0=no, uses ~100 bytes&lt;br /&gt;
  #define IRMP_SUPPORT_RECS80_PROTOCOL      1 // flag: support RECS80,     1=yes, 0=no, uses ~100 bytes&lt;br /&gt;
  #define IRMP_SUPPORT_RC5_PROTOCOL         1 // flag: support RC5,        1=yes, 0=no, uses ~250 bytes&lt;br /&gt;
  #define IRMP_SUPPORT_DENON_PROTOCOL       1 // flag: support DENON,      1=yes, 0=no, uses ~150 bytes&lt;br /&gt;
  #define IRMP_SUPPORT_RC6_PROTOCOL         1 // flag: support RC6,        1=yes, 0=no, uses ~250 bytes&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
auf 0 zu setzen. Dann wird der Decoder für diese Protokolle nicht mitübersetzt.&lt;br /&gt;
&lt;br /&gt;
Tipp:&lt;br /&gt;
&lt;br /&gt;
Jedes von IRMP unterstützte IR-Protokoll &amp;quot;verbrät&amp;quot; ungefähr den oben angegebenen Speicher an Code. Wer sparen muss, weil ihm der Flash-Speicher ausgeht, der sollte die Unterstützung von KASEIKYO, RECS80, DENON, MATSUSHITA und/oder RC6 ausschalten. Diese sind eher exotische Protokolle, ausserdem ist die Modulationsfrequenz von 56Khz beim Kaseikyo-Protokoll weit ab von den Frequenzen, die von den anderen Protokollen verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Die von IRMP unterstützten Protokolle weisen Bitlängen - teilweise variabel, teilweise fest - von 12 bis 48 Bit auf. Diese werden über Preprocessor-Defines beschrieben.&lt;br /&gt;
&lt;br /&gt;
IRMP trennt diese IR-Telegramme prinzipiell in 3 Bereiche:&lt;br /&gt;
&lt;br /&gt;
 1. ID für verwendetes Protokoll&lt;br /&gt;
 2. Adresse bzw. Herstellercode&lt;br /&gt;
 3. Kommando&lt;br /&gt;
&lt;br /&gt;
Mittels der Funktion&lt;br /&gt;
&lt;br /&gt;
   irmp_get_data (IRMP_DATA * irmp_data_p)&lt;br /&gt;
&lt;br /&gt;
kann man ein decodiertes Telegramm abrufen. Der Return-Wert ist 1, wenn ein Telegramm eingelesen wurde, sonst 0. Im ersten Fall werden die Struct-Members&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
    irmp_data_p-&amp;gt;protocol&lt;br /&gt;
    irmp_data_p-&amp;gt;address&lt;br /&gt;
    irmp_data_p-&amp;gt;command&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gefüllt.&lt;br /&gt;
&lt;br /&gt;
Das heisst: am Ende bekommt man dann über irmp_get_data() einfach drei&lt;br /&gt;
Werte, die man über ein if oder switch checken kann, z.B. hier eine&lt;br /&gt;
Routine, welche die Tasten 1-9 auf einer Fernbedienung auswertet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
   IRMP_DATA irmp_data;&lt;br /&gt;
&lt;br /&gt;
   if (irmp_get_data (&amp;amp;irmp_data))&lt;br /&gt;
   {&lt;br /&gt;
      if (irmp_data.protocol == IRMP_NEC_PROTOCOL &amp;amp;&amp;amp;     // NEC-Protokoll&lt;br /&gt;
          irmp_data.address == 0x00FF)                   // Adresse 0x00FF&lt;br /&gt;
      {&lt;br /&gt;
         switch (irmp_data.command)&lt;br /&gt;
         {&lt;br /&gt;
            case 0x0001: key1_pressed(); break;          // Taste 1&lt;br /&gt;
            case 0x0002: key2_pressed(); break;          // Taste 2&lt;br /&gt;
            ...&lt;br /&gt;
            case 0x0009: key9_pressed(); break;          // Taste 9&lt;br /&gt;
         }&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Werte muss man natürlich für eine unbekannte Fernbedienung einmal auslesen und dann über ein UART oder LC-Display ausgeben, um sie dann im Programm hart zu kodieren. Oder man hat eine kleine Anlernroutine, wo man einmal die gewünschten Tasten drücken muss, um sie anschließend im EEPROM abzuspeichern.&lt;br /&gt;
&lt;br /&gt;
Eine weitere Beispiel-Main-Funktion ist im Zip-File enthalten, da sieht man dann auch die Initialisierung des Timers.&lt;br /&gt;
&lt;br /&gt;
== Arbeitsweise ==&lt;br /&gt;
&lt;br /&gt;
Das &amp;quot;Working Horse&amp;quot; von IRMP ist die Interrupt Service Routine irmp_ISR() welche 10.000 mal pro Sekunde aufgerufen werden sollte. Weicht dieser Wert ab, muss die Preprocessor-Konstante F_INTERRUPTS angepasst werden. Dieser kann durchaus höher werden, aber nicht wesentlich kleiner. Sonst wird es kritisch mit der Protokoll-Erkennung.&lt;br /&gt;
&lt;br /&gt;
irmp_ISR detektiert zunächst die Länge und die Form des/der Startbits und ermittelt daraus das verwendete Protokoll. Sobald das Protokoll erkannt wurde, werden die weiter einzulesenden Bits parametrisiert, um dann möglichst effektiv in den weiteren Aufrufen das komplette IR-Telegramm einzulesen.&lt;br /&gt;
&lt;br /&gt;
Um direkt Kritikern den Wind aus den Segeln zu nehmen:&lt;br /&gt;
&lt;br /&gt;
Ich weiss, die ISR ist ziemlich groß. Aber da sie sich wie eine State Machine verhält, ist der tatsächlich ausgeführte Code pro Durchlauf relativ gering. Solange es &amp;quot;dunkel&amp;quot; ist (und das ist es ja die meiste Zeit ;-)) ist die aufgewendete Zeit sogar verschwindend gering. Im WordClock-Projekt werden mit ein- und demselben Timer 8 ISRs aufgerufen, davon ist die irmp_ISR() nur eine unter vielen. Bei mindestens 8 MHz CPU-Takt traten bisher keine Timining-Probleme auf. Daher sehe ich bei der Länge von irmp_ISR überhaupt kein Problem.&lt;br /&gt;
&lt;br /&gt;
Ein Quarz ist nicht unbedingt notwendig, es funktioniert auch mit dem internen Oszillator des AVRs, wenn man die Prescaler-Fuse entsprechend gesetzt hat, dass die CPU auch mit 8MHz rennt ... Die Fuse-Werte für einen ATMEGA88 findet man in main.c&lt;br /&gt;
&lt;br /&gt;
Zur Hardware: IRMP sollte so ziemlich für alle ATMegas übersetzbar sein,&lt;br /&gt;
das Beispiel-Projekt wurde auf ATMEGA88 eingestellt.&lt;br /&gt;
&lt;br /&gt;
Der Pin, an dem der IR-Empfänger angeschlossen wird, ist frei wählbar&lt;br /&gt;
und wird in irmp.c über&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
    #define IRMP_PORT  PORTB&lt;br /&gt;
    #define IRMP_DDR   DDRB&lt;br /&gt;
    #define IRMP_PIN   PINB&lt;br /&gt;
    #define IRMP_BIT   6       // use PB6 as IR input&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
eingestellt.&lt;br /&gt;
&lt;br /&gt;
== Scannen von unbekannten Protokollen ==&lt;br /&gt;
&lt;br /&gt;
Stellt man in der Zeile&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
    #define IRMP_LOGGING    0   // 1: log IR signal (scan), 0: do not (default)&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
den Wert für IRMP_LOGGING auf 1, wird in IRMP eine Protokollierung eingeschaltet: Es werden dann die Hell- und Dunkelphase auf dem UART des Microntrollers mit 9600Bd ausgegeben: 1=Dunkel, 0=Hell. Eventuell müssen dann die Konstanten in den Funktionen uart_init() und uart_putc() angepasst werden; das kommt auf den verwendeten AVR-µC an.&lt;br /&gt;
&lt;br /&gt;
Nimmt man diese Protokoll-Scans mit einem Terminal-Emulationsprogramm auf und speichert sie dann als normale Datei ab, kann man diese Scan-Dateien zur Analyse verwenden, um damit IRMP an das unbekannte Protokoll anzupassen - siehe nächstes Kapitel.&lt;br /&gt;
&lt;br /&gt;
Wer eine Fernbedienung hat, die nicht von IRMP unterstützt wird, kann mir  ([http://www.mikrocontroller.net/user/show/ukw ukw]) gern die Scan-Dateien zuschicken. Ich schaue dann, ob das Protokoll in das IRMP-Konzept passt und passe gegebenenfalls den Source an.&lt;br /&gt;
&lt;br /&gt;
== IRMP unter Linux und Windows ==&lt;br /&gt;
&lt;br /&gt;
irmp.c lässt sich auch unter Linux direkt kompilieren, um damit Infrarot-Scans, welche in Dateien gespeichert sind, direkt zu testen. Im Unterordner IR-Data finden sich solche Dateien, die man dem IRMP direkt zum &amp;quot;Fraß&amp;quot; vorwerfen kann, nämlich folgendermaßen:&lt;br /&gt;
&lt;br /&gt;
    cc irmp.c -o irmp                              # IRMP compilieren&lt;br /&gt;
    ./irmp.c &amp;lt; IR-Data/Samsung_DVD_Rec_00062C.txt  # irmp ausführen&lt;br /&gt;
&lt;br /&gt;
IRMP gibt dann das erkannte Protokoll und weitere Timing-Daten aus, zum Beispiel:&lt;br /&gt;
&lt;br /&gt;
    # dvd - IR-cmd: 0x00C7&lt;br /&gt;
    start-bit: pulse = 47, pause = 44&lt;br /&gt;
    protocol = SAMSUNG, start bit timings: pulse: 36 - 54, pause: 36 - 54&lt;br /&gt;
    pulse_1        =  3 -  8&lt;br /&gt;
    pause_1        =  7 - 22&lt;br /&gt;
    pulse_0        =  3 -  8&lt;br /&gt;
    pause_0        =  2 -  7&lt;br /&gt;
    command_offset = 21&lt;br /&gt;
    command_len    = 16&lt;br /&gt;
    complete_len   = 37&lt;br /&gt;
    stop_bit       = 1&lt;br /&gt;
    [bit  0: pulse =  6, pause =  4] 0&lt;br /&gt;
    [bit  1: pulse =  6, pause =  4] 0&lt;br /&gt;
    [bit  2: pulse =  6, pause =  4] 0&lt;br /&gt;
    ...&lt;br /&gt;
    [bit 16: pulse =  6, pause = 44] SYNC&lt;br /&gt;
    ...&lt;br /&gt;
    [bit 35: pulse =  6, pause =  4] 0&lt;br /&gt;
    [bit 36: pulse =  6, pause =  4] 0&lt;br /&gt;
    stop bit detected&lt;br /&gt;
    code detected, length = 37&lt;br /&gt;
    protcol = 3, address = 0x0400, code = 0x00c7&lt;br /&gt;
&lt;br /&gt;
Wegen der etwas langen Ausgabe empfiehlt sich auch ein, um seitenweise zu blättern:&lt;br /&gt;
&lt;br /&gt;
    ./irmp.c &amp;lt; IR-Data/Samsung_DVD_Rec_00062C.txt | less&lt;br /&gt;
&lt;br /&gt;
Die Scan-Dateien haben mir bei der Entwicklung des IRMP enorm geholfen, Dank an Vlad Tepesch und Klaus Leidinger, die mich mit Scan-Dateien entsprechend versorgt haben!&lt;br /&gt;
&lt;br /&gt;
Mittlerweile kann man IRMP auch unter Windows nutzen, nämlich folgendermaßen:&lt;br /&gt;
&lt;br /&gt;
* Eingabeaufforderung starten&lt;br /&gt;
* In das Verzeichnis irmp\IR-Data wechseln&lt;br /&gt;
* Aufruf von:&lt;br /&gt;
            irmp.exe &amp;lt;rc5x.txt&lt;br /&gt;
&lt;br /&gt;
Da manche Ausgaben sehr lang werden, empfiehlt es sich, diese in eine&lt;br /&gt;
Datei zu lenken oder in den more weiterzuleiten, damit man seitenweise&lt;br /&gt;
blättern kann:&lt;br /&gt;
&lt;br /&gt;
            irmp.exe &amp;lt;rc5x.txt | more&lt;br /&gt;
&lt;br /&gt;
Dank an Klaus Leidinger, der den IRMP unter Windows compiliert hat.&lt;br /&gt;
&lt;br /&gt;
Zusatz:&lt;br /&gt;
&lt;br /&gt;
Der Decoder für das Kaseikyo- und RECS80-RC5-Protokoll ist ungetestet und wurde anhand von Dokumentationen im Internet erstellt und lediglich mittels&lt;br /&gt;
künstlich erzeugten Scan-Dateien getestet... daher: keine Gewähr!&lt;br /&gt;
&lt;br /&gt;
== Fernbedienungen ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Protokoll || Bezeichnung || Gerät || Device Address&lt;br /&gt;
|-&lt;br /&gt;
| NEC || Toshiba CT-9859 || Fernseher || 765&lt;br /&gt;
|-&lt;br /&gt;
| || Toshiba VT-728G || V-728G Videorekorder || 8925&lt;br /&gt;
|-&lt;br /&gt;
| || Elta 8848 MP 4 || DVD-Player || 255&lt;br /&gt;
|-&lt;br /&gt;
| || AS-218 || Askey TV-View CHP03X (TV-Karte) || 25046&lt;br /&gt;
|-&lt;br /&gt;
| || Cyberhome ??? || Cyberhome DVD Player || 20147&lt;br /&gt;
|-&lt;br /&gt;
| KASEIKYO || Technics EUR646497 || AV Receiver SA-AX 730 || 16388&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
== Diskussion ==&lt;br /&gt;
&lt;br /&gt;
Meinungen, Verbesserungsvorschläge, harsche Kritik und ähnliches kann im [http://www.mikrocontroller.net/topic/162119 Beitrag: Infrared Multi Protocol Decoder] geäussert werden.&lt;br /&gt;
&lt;br /&gt;
== Literatur ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SIRCS-Protokoll&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
http://www.sbprojects.com/knowledge/ir/sirc.htm&lt;br /&gt;
&lt;br /&gt;
http://www.ustr.net/infrared/sony.shtml&lt;br /&gt;
&lt;br /&gt;
http://users.telenet.be/davshomepage/sony.htm&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;NEC-Protokoll:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
http://www.sbprojects.com/knowledge/ir/nec.htm&lt;br /&gt;
&lt;br /&gt;
http://www.ustr.net/infrared/nec.shtml&lt;br /&gt;
&lt;br /&gt;
http://www.celadon.com/infrared_protocol/infrared_protocols_samples.pdf&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SAMSUNG-Protokoll:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
(wurde aus diversen Protokollen (Daewoo u.ä.) zusammengereimt, daher kein direkter Link auf irgendwelche SAMSUNG-Dokumentation verfügbar)&lt;br /&gt;
&lt;br /&gt;
Hier ein Link zum Daewoo-Protokoll, welches dasselbe Prinzip des Sync-Bits in der Mitte eines Frames nutzt, jedoch mit anderen Timing-Werten arbeitet:&lt;br /&gt;
&lt;br /&gt;
http://users.telenet.be/davshomepage/daewoo.htm&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MATSUHITA-Protokoll:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
http://www.celadon.com/infrared_protocol/infrared_protocols_samples.pdf&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KASEIKYO-Protokoll (auch &amp;quot;Japan-Protokoll&amp;quot;):&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
http://www.mikrocontroller.net/attachment/4246/IR-Protokolle_Diplomarbeit.pdf&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RECS80-Protokoll:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
http://www.sbprojects.com/knowledge/ir/recs80.htm&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RC5-Protokoll:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
http://www.sbprojects.com/knowledge/ir/rc5.htm&lt;br /&gt;
&lt;br /&gt;
http://users.telenet.be/davshomepage/rc5.htm&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Denon-Protokoll:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
http://www.mikrocontroller.com/de/IR-Protokolle.php#DENON&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RC6-Protokoll:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
http://www.sbprojects.com/knowledge/ir/rc6.htm&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Diverse Protokolle:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
http://www.mikrocontroller.net/attachment/4246/IR-Protokolle_Diplomarbeit.pdf&lt;br /&gt;
&lt;br /&gt;
http://www.celadon.com/infrared_protocol/infrared_protocols_samples.pdf&lt;br /&gt;
&lt;br /&gt;
Viel Spaß mit IRMP!&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Datenübertragung]]&lt;/div&gt;</summary>
		<author><name>Shortie</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=IRMP&amp;diff=43443</id>
		<title>IRMP</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=IRMP&amp;diff=43443"/>
		<updated>2010-02-20T16:32:15Z</updated>

		<summary type="html">&lt;p&gt;Shortie: /* Einleitung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Von &#039;&#039;&#039;Frank M. ([http://www.mikrocontroller.net/user/show/ukw ukw])&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= IRMP - Infrarot-Multiprotokoll-Decoder =&lt;br /&gt;
&lt;br /&gt;
[[Datei:irmp-title.png| |Scan eines NEC-kompatiblen Fernbedienungssignals]]&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
[[Datei:IRMP-TSOP1736.png|miniatur|Anschluß eines IR-Empfängers an µC]]&lt;br /&gt;
&lt;br /&gt;
Da RC5 nicht nur veraltet, sondern mittlerweile obsolet ist und immer mehr die elektronischen Geräte der fernöstlichen Unterhaltungsindustrie in unseren Haushalten Einzug finden, ist es an der Zeit, einen IR-Decoder zu entwickeln, der ca. 90% aller bei uns im täglichen Leben zu findenden IR-Fernbedienungen &amp;quot;versteht&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
IRMP - der Infrarot-Fernbedienungsdecoder, der mehrere Protokolle auf einmal decodieren kann, beherrscht folgende Protokolle:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Protokoll || Hersteller&lt;br /&gt;
|-&lt;br /&gt;
| SIRCS || Sony&lt;br /&gt;
|-&lt;br /&gt;
| NEC || NEC, Yamaha, Canon, Tevion, Harman/Kardon, Hitachi, JVC, Pioneer, Toshiba, Xoro, Orion, NoName und viele weitere japanische Hersteller.&lt;br /&gt;
|-&lt;br /&gt;
| SAMSUNG || Samsung&lt;br /&gt;
|-&lt;br /&gt;
| MATSUSHITA || Matsushita&lt;br /&gt;
|-&lt;br /&gt;
| KASEIKYO || Panasonic, Technics, Denon und andere japanische Hersteller, welche Mitglied der &amp;quot;Japan&#039;s Association for Electric Home Application&amp;quot; sind.&lt;br /&gt;
|-&lt;br /&gt;
| RECS80 || Philips, Nokia, Thomson, Nordmende, Telefunken, Saba&lt;br /&gt;
|-&lt;br /&gt;
| RC5 || Philips und andere europäische Hersteller&lt;br /&gt;
|-&lt;br /&gt;
| DENON || Denon&lt;br /&gt;
|-&lt;br /&gt;
| RC6 || Philips und andere europäische Hersteller&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ein paar Bemerkungen zu den einzelnen Protokollen:&lt;br /&gt;
&lt;br /&gt;
Einige Hersteller verwenden ihr eigenes Protokoll, dazu gehören u.a. Sony, Samsung und Matsushita. Philips hat RC5 entwickelt und natürlich auch selbst benutzt. RC5 galt damals in Europa als &#039;&#039;das&#039;&#039; Standard-IR-Protokoll, welches von vielen europäischen Herstellern übernommen wurde. Mittlerweile ist RC5 fast gar nicht mehr anzutreffen - man kann es eigentlich als &amp;quot;ausgestorben&amp;quot; abhaken.&lt;br /&gt;
&lt;br /&gt;
Auch die japanischen Hersteller haben versucht, einen eigenen Standard zu etablieren, nämlich das sog. Kaseikyo- (oder auch &amp;quot;Japan-&amp;quot;) Protokoll. Dieses ist mit einer Bitlänge von 48 sehr universell und allgemein verwendbar. Richtig durchgesetzt hat es sich aber bis heute nicht. Ich selbst habe jedenfalls noch keine einzige Fernbedienung gesehen, die das Kaseikyo-Protokoll nutzt.&lt;br /&gt;
&lt;br /&gt;
Heutzutage wird vornehmlich das NEC-Protokoll verwendet - und zwar von den unterschiedlichsten (Marken- und auch Noname-)Herstellern. Ich schätze den &amp;quot;Marktanteil&amp;quot; auf ca. 80% beim NEC-Protokoll. Fast alle Fernbedienungen im alltäglichen Einsatz verwenden bei mir den NEC-IR-Code. Das fängt beim Fernseher an, geht über vom DVD-Player zur Notebook-Fernbedienung und reicht bis zur Noname-MultiMedia-Festplatte - um nur einige Beispiele zu nennen.&lt;br /&gt;
&lt;br /&gt;
Der Source zu IRMP entstand im Rahmen des Projektes &#039;&#039;&#039;WordClock&#039;&#039;&#039;, siehe auch Artikel [http://www.mikrocontroller.net/articles/Word_Clock WordClock]&lt;br /&gt;
&lt;br /&gt;
Anlass für einen eigenen IRMP-Artikel ist folgender Thread in der Codesammlung: &lt;br /&gt;
[http://www.mikrocontroller.net/topic/162119 Beitrag: IRMP - Infrared Multi Protocol Decoder]&lt;br /&gt;
&lt;br /&gt;
== Download ==&lt;br /&gt;
&lt;br /&gt;
Download: [http://www.mikrocontroller.net/wikifiles/7/79/Irmp.zip Irmp.zip] Stand: 20.02.2010&lt;br /&gt;
&lt;br /&gt;
Änderungen:&lt;br /&gt;
&lt;br /&gt;
* 20.02.2010: Bugfix Denon-Protokoll: Wiederholungsframe grundsätzlich invertiert&lt;br /&gt;
* 19.02.2010: Erkennung von NEC-Protokoll-Varianten, z.B. Apple-Fernbedienung&lt;br /&gt;
* 19.02.2010: Erkennung von RC6- und Denon-Protokoll&lt;br /&gt;
* 19.02.2010: Verbesserung des RC5-Decoders (Bugfixes)&lt;br /&gt;
* 13.02.2010: Bugfix: Puls/Pausen-Counter um 1 zu niedrig, nun bessere Erkennung bei Protokollen mit sehr kurzen Pulszeiten&lt;br /&gt;
* 13.02.2010: Erkennung der NEC-Wiederholungssequenz&lt;br /&gt;
* 12.02.2010: RC5-Protokoll-Decoder hinzugefügt&lt;br /&gt;
* 05.02.2010: Konflikt zwischen Samsung- und Matsushita-Protokoll beseitigt&lt;br /&gt;
&lt;br /&gt;
== Protokolle ==&lt;br /&gt;
&lt;br /&gt;
Die von IRMP decodierten Protokolle haben etwas gemeinsames: Sie weisen alle ein Start-Bit auf, welches vom Timing her ausgezeichnet, d.h. einmalig ist.&lt;br /&gt;
&lt;br /&gt;
Anhand dieses Start-Bit-Timings werden die verschiedenen Protokolle unterschieden. IRMP misst also das Timing des Start-Bits und stellt dann &amp;quot;on-thy-fly&amp;quot; seine Timingtabellen auf das erkannte Protokoll um, damit die nach dem Start-Bit gesandten Daten in einem Rutsch eingelesen werden können, ohne das komplette Telegramm (Frame) erst speichern zu müssen.&lt;br /&gt;
&lt;br /&gt;
Die angegebenen Timingwerte sind Idealwerte. Bei einigen Fernbedienungen in der Praxis weichen sie um bis zu 40% voneinander ab. Deshalb arbeitet IRMP mit Minimum-/Maximumsgrenzen, um bzgl. des Zeitverhaltens tolerabel zu sein.&lt;br /&gt;
&lt;br /&gt;
[[Datei:nec-protocol.png|miniatur|NEC-Protokoll, Reichelt RGB-LED-Fernbedienung, T-&amp;gt;A: 9,14ms, A-&amp;gt;B: 4,42ms, B-&amp;gt;C: 660us]]&lt;br /&gt;
&lt;br /&gt;
Die Protokolle im einzelnen:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;SIRCS&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 40 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 Start-Bit + 12-20 Daten-Bits, kein Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 7 Kommando-Bits + 5 Adress-Bits + bis zu 8 zusätzliche Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 2400µs Puls, 600µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 600µs Puls, 600µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 1200µs Puls, 600µs Pause&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;NEC + extended NEC&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 36 kHz / 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 Start-Bit + 32 Daten-Bits + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten NEC || 8 Adress-Bits + 8 invertierte Adress-Bits + 8 Kommando-Bits + 8 invertierte Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Daten ext. NEC || 16 Adress-Bits + 8 Kommando-Bits + 8 invertierte Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 9000µs Puls, 4500µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 560µs Puls,  560µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 560µs Puls, 1690µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || 560µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || 9000µs Puls, 2250µs Pause, 560µs Puls, ~100ms Pause&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;SAMSUNG&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || ?? kHz&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 Start-Bit + 16 Daten(1)-Bits + 1 Sync-Bit + 20 Daten(2)-Bits + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten(1) || 16 Adress-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Daten(2) || 4 ID-Bits + 8 Kommando-Bits + 8 invertierte Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 4500µs Puls, 4500µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 550µs Puls,  450µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 550µs Puls, 1450µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Sync-Bit || 550µs Puls, 4500µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || 550µs Puls&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;MATSUSHITA&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 36 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 Start-Bit + 24 Daten-Bits + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 6 Hersteller-Bits + 6 Kommando-Bits + 12 Adress-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 3488µs Puls, 3488µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 872µs Puls,  872µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 872µs Puls, 2616µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || 872µs Puls&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;KASEIKYO&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 56 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 Start-Bit + 48 Daten-Bits + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 16 Hersteller-Bits + 4 Parity-Bits + 4 Genre1-Bits + 4 Genre2-Bits + 10 Kommando-Bits + 2 ID-Bits + 8 Parity-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 3380µs Puls, 1690µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 423µs Puls,  423µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 423µs Puls, 1269µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || 423µs Puls&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;RECS80&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 2 Start-Bits + 10 Daten-Bits + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 1 Toggle-Bit + 3 Adress-Bits + 6 Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 158µs Puls, 5060µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 158µs Puls, 5060µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 158µs Puls, 7600µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || 158µs Puls&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;RC5 + RC5X&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 36 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Frame RC5 || 2 Start-Bits + 12 Daten-Bits + 0 Stop-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Daten RC5 || 1 Toggle-Bit + 5 Adress-Bits + 6 Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Frame RC5X || 1 Start-Bit + 13 Daten-Bits + 0 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten RC5X || 1 invertiertes Kommando-Bit + 1 Toggle-Bit + 5 Adress-Bits + 6 Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 889µs Pause, 889µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 889µs Puls, 889µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 889µs Pause, 889µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || kein Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;DENON&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || ?? kHz&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 0 Start-Bits + 16 Data-Bits + 1 Stop-Bit + 65ms Pause + 16 invertierte Daten-Bits + 1 Stop-bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 5 Address-Bits + 10 Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || kein Start-Bit&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 275µs Puls, 1050µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 275µs Puls, 1900µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || 275µs Puls&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;RC6&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 36 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 Start-Bit + 1 Bit &amp;quot;1&amp;quot; + 3 Mode-Bits + 1 Toggle-Bit + 16 Daten-Bits + 2666 µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 8 Adress-Bits + 8 Kommando Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 2666µs Puls, 889µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Toggle 0-Bit || 889µs Pause, 889µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| Toggle 1-Bit || 889µs Puls, 889µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 444µs Pause, 444µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 444µs Puls, 444µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || kein Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Source-Code ==&lt;br /&gt;
&lt;br /&gt;
Der Source-Code lässt sich einfach übersetzen, indem man die Projekt-Datei irmp.aps in den WinAVR lädt. Aber auch für die Codevision Nutzer ist IRMP entsprechend angepasst: hier muss man die Zeile&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
  //#define CODEVISION&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
in main.c aktivieren, das heisst, die Kommentarzeichen entfernen.&lt;br /&gt;
&lt;br /&gt;
IRMP decodiert sämtliche oben aufgelisteten Protokolle in einer ISR, siehe irmp.c. Möchte man davon einige aus Speicherplatzgründen deaktivieren, sind die&lt;br /&gt;
entsprechenden Werte in irmp.c ...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
  #define IRMP_SUPPORT_SIRCS_PROTOCOL       1 // flag: support SIRCS,      1=yes, 0=no, uses ~100 bytes&lt;br /&gt;
  #define IRMP_SUPPORT_NEC_PROTOCOL         1 // flag: support NEC,        1=yes, 0=no, uses ~250 bytes&lt;br /&gt;
  #define IRMP_SUPPORT_SAMSUNG_PROTOCOL     1 // flag: support Samsung,    1=yes, 0=no, uses ~250 bytes&lt;br /&gt;
  #define IRMP_SUPPORT_MATSUSHITA_PROTOCOL  1 // flag: support Matsushita, 1=yes, 0=no, uses ~100 bytes&lt;br /&gt;
  #define IRMP_SUPPORT_KASEIKYO_PROTOCOL    1 // flag: support Kaseikyo,   1=yes, 0=no, uses ~100 bytes&lt;br /&gt;
  #define IRMP_SUPPORT_RECS80_PROTOCOL      1 // flag: support RECS80,     1=yes, 0=no, uses ~100 bytes&lt;br /&gt;
  #define IRMP_SUPPORT_RC5_PROTOCOL         1 // flag: support RC5,        1=yes, 0=no, uses ~250 bytes&lt;br /&gt;
  #define IRMP_SUPPORT_DENON_PROTOCOL       1 // flag: support DENON,      1=yes, 0=no, uses ~150 bytes&lt;br /&gt;
  #define IRMP_SUPPORT_RC6_PROTOCOL         1 // flag: support RC6,        1=yes, 0=no, uses ~250 bytes&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
auf 0 zu setzen. Dann wird der Decoder für diese Protokolle nicht mitübersetzt.&lt;br /&gt;
&lt;br /&gt;
Tipp:&lt;br /&gt;
&lt;br /&gt;
Jedes von IRMP unterstützte IR-Protokoll &amp;quot;verbrät&amp;quot; ungefähr den oben angegebenen Speicher an Code. Wer sparen muss, weil ihm der Flash-Speicher ausgeht, der sollte die Unterstützung von KASEIKYO, RECS80, DENON, MATSUSHITA und/oder RC6 ausschalten. Diese sind eher exotische Protokolle, ausserdem ist die Modulationsfrequenz von 56Khz beim Kaseikyo-Protokoll weit ab von den Frequenzen, die von den anderen Protokollen verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Die von IRMP unterstützten Protokolle weisen Bitlängen - teilweise variabel, teilweise fest - von 12 bis 48 Bit auf. Diese werden über Preprocessor-Defines beschrieben.&lt;br /&gt;
&lt;br /&gt;
IRMP trennt diese IR-Telegramme prinzipiell in 3 Bereiche:&lt;br /&gt;
&lt;br /&gt;
 1. ID für verwendetes Protokoll&lt;br /&gt;
 2. Adresse bzw. Herstellercode&lt;br /&gt;
 3. Kommando&lt;br /&gt;
&lt;br /&gt;
Mittels der Funktion&lt;br /&gt;
&lt;br /&gt;
   irmp_get_data (IRMP_DATA * irmp_data_p)&lt;br /&gt;
&lt;br /&gt;
kann man ein decodiertes Telegramm abrufen. Der Return-Wert ist 1, wenn ein Telegramm eingelesen wurde, sonst 0. Im ersten Fall werden die Struct-Members&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
    irmp_data_p-&amp;gt;protocol&lt;br /&gt;
    irmp_data_p-&amp;gt;address&lt;br /&gt;
    irmp_data_p-&amp;gt;command&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gefüllt.&lt;br /&gt;
&lt;br /&gt;
Das heisst: am Ende bekommt man dann über irmp_get_data() einfach drei&lt;br /&gt;
Werte, die man über ein if oder switch checken kann, z.B. hier eine&lt;br /&gt;
Routine, welche die Tasten 1-9 auf einer Fernbedienung auswertet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
   IRMP_DATA irmp_data;&lt;br /&gt;
&lt;br /&gt;
   if (irmp_get_data (&amp;amp;irmp_data))&lt;br /&gt;
   {&lt;br /&gt;
      if (irmp_data.protocol == IRMP_NEC_PROTOCOL &amp;amp;&amp;amp;     // NEC-Protokoll&lt;br /&gt;
          irmp_data.address == 0x00FF)                   // Adresse 0x00FF&lt;br /&gt;
      {&lt;br /&gt;
         switch (irmp_data.command)&lt;br /&gt;
         {&lt;br /&gt;
            case 0x0001: key1_pressed(); break;          // Taste 1&lt;br /&gt;
            case 0x0002: key2_pressed(); break;          // Taste 2&lt;br /&gt;
            ...&lt;br /&gt;
            case 0x0009: key9_pressed(); break;          // Taste 9&lt;br /&gt;
         }&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Werte muss man natürlich für eine unbekannte Fernbedienung einmal auslesen und dann über ein UART oder LC-Display ausgeben, um sie dann im Programm hart zu kodieren. Oder man hat eine kleine Anlernroutine, wo man einmal die gewünschten Tasten drücken muss, um sie anschließend im EEPROM abzuspeichern.&lt;br /&gt;
&lt;br /&gt;
Eine weitere Beispiel-Main-Funktion ist im Zip-File enthalten, da sieht man dann auch die Initialisierung des Timers.&lt;br /&gt;
&lt;br /&gt;
== Arbeitsweise ==&lt;br /&gt;
&lt;br /&gt;
Das &amp;quot;Working Horse&amp;quot; von IRMP ist die Interrupt Service Routine irmp_ISR() welche 10.000 mal pro Sekunde aufgerufen werden sollte. Weicht dieser Wert ab, muss die Preprocessor-Konstante F_INTERRUPTS angepasst werden. Dieser kann durchaus höher werden, aber nicht wesentlich kleiner. Sonst wird es kritisch mit der Protokoll-Erkennung.&lt;br /&gt;
&lt;br /&gt;
irmp_ISR detektiert zunächst die Länge und die Form des/der Startbits und ermittelt daraus das verwendete Protokoll. Sobald das Protokoll erkannt wurde, werden die weiter einzulesenden Bits parametrisiert, um dann möglichst effektiv in den weiteren Aufrufen das komplette IR-Telegramm einzulesen.&lt;br /&gt;
&lt;br /&gt;
Um direkt Kritikern den Wind aus den Segeln zu nehmen:&lt;br /&gt;
&lt;br /&gt;
Ich weiss, die ISR ist ziemlich groß. Aber da sie sich wie eine State Machine verhält, ist der tatsächlich ausgeführte Code pro Durchlauf relativ gering. Solange es &amp;quot;dunkel&amp;quot; ist (und das ist es ja die meiste Zeit ;-)) ist die aufgewendete Zeit sogar verschwindend gering. Im WordClock-Projekt werden mit ein- und demselben Timer 8 ISRs aufgerufen, davon ist die irmp_ISR() nur eine unter vielen. Bei mindestens 8 MHz CPU-Takt traten bisher keine Timining-Probleme auf. Daher sehe ich bei der Länge von irmp_ISR überhaupt kein Problem.&lt;br /&gt;
&lt;br /&gt;
Ein Quarz ist nicht unbedingt notwendig, es funktioniert auch mit dem internen Oszillator des AVRs, wenn man die Prescaler-Fuse entsprechend gesetzt hat, dass die CPU auch mit 8MHz rennt ... Die Fuse-Werte für einen ATMEGA88 findet man in main.c&lt;br /&gt;
&lt;br /&gt;
Zur Hardware: IRMP sollte so ziemlich für alle ATMegas übersetzbar sein,&lt;br /&gt;
das Beispiel-Projekt wurde auf ATMEGA88 eingestellt.&lt;br /&gt;
&lt;br /&gt;
Der Pin, an dem der IR-Empfänger angeschlossen wird, ist frei wählbar&lt;br /&gt;
und wird in irmp.c über&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
    #define IRMP_PORT  PORTB&lt;br /&gt;
    #define IRMP_DDR   DDRB&lt;br /&gt;
    #define IRMP_PIN   PINB&lt;br /&gt;
    #define IRMP_BIT   6       // use PB6 as IR input&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
eingestellt.&lt;br /&gt;
&lt;br /&gt;
== Scannen von unbekannten Protokollen ==&lt;br /&gt;
&lt;br /&gt;
Stellt man in der Zeile&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
    #define IRMP_LOGGING    0   // 1: log IR signal (scan), 0: do not (default)&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
den Wert für IRMP_LOGGING auf 1, wird in IRMP eine Protokollierung eingeschaltet: Es werden dann die Hell- und Dunkelphase auf dem UART des Microntrollers mit 9600Bd ausgegeben: 1=Dunkel, 0=Hell. Eventuell müssen dann die Konstanten in den Funktionen uart_init() und uart_putc() angepasst werden; das kommt auf den verwendeten AVR-µC an.&lt;br /&gt;
&lt;br /&gt;
Nimmt man diese Protokoll-Scans mit einem Terminal-Emulationsprogramm auf und speichert sie dann als normale Datei ab, kann man diese Scan-Dateien zur Analyse verwenden, um damit IRMP an das unbekannte Protokoll anzupassen - siehe nächstes Kapitel.&lt;br /&gt;
&lt;br /&gt;
Wer eine Fernbedienung hat, die nicht von IRMP unterstützt wird, kann mir  ([http://www.mikrocontroller.net/user/show/ukw ukw]) gern die Scan-Dateien zuschicken. Ich schaue dann, ob das Protokoll in das IRMP-Konzept passt und passe gegebenenfalls den Source an.&lt;br /&gt;
&lt;br /&gt;
== IRMP unter Linux und Windows ==&lt;br /&gt;
&lt;br /&gt;
irmp.c lässt sich auch unter Linux direkt kompilieren, um damit Infrarot-Scans, welche in Dateien gespeichert sind, direkt zu testen. Im Unterordner IR-Data finden sich solche Dateien, die man dem IRMP direkt zum &amp;quot;Fraß&amp;quot; vorwerfen kann, nämlich folgendermaßen:&lt;br /&gt;
&lt;br /&gt;
    cc irmp.c -o irmp                              # IRMP compilieren&lt;br /&gt;
    ./irmp.c &amp;lt; IR-Data/Samsung_DVD_Rec_00062C.txt  # irmp ausführen&lt;br /&gt;
&lt;br /&gt;
IRMP gibt dann das erkannte Protokoll und weitere Timing-Daten aus, zum Beispiel:&lt;br /&gt;
&lt;br /&gt;
    # dvd - IR-cmd: 0x00C7&lt;br /&gt;
    start-bit: pulse = 47, pause = 44&lt;br /&gt;
    protocol = SAMSUNG, start bit timings: pulse: 36 - 54, pause: 36 - 54&lt;br /&gt;
    pulse_1        =  3 -  8&lt;br /&gt;
    pause_1        =  7 - 22&lt;br /&gt;
    pulse_0        =  3 -  8&lt;br /&gt;
    pause_0        =  2 -  7&lt;br /&gt;
    command_offset = 21&lt;br /&gt;
    command_len    = 16&lt;br /&gt;
    complete_len   = 37&lt;br /&gt;
    stop_bit       = 1&lt;br /&gt;
    [bit  0: pulse =  6, pause =  4] 0&lt;br /&gt;
    [bit  1: pulse =  6, pause =  4] 0&lt;br /&gt;
    [bit  2: pulse =  6, pause =  4] 0&lt;br /&gt;
    ...&lt;br /&gt;
    [bit 16: pulse =  6, pause = 44] SYNC&lt;br /&gt;
    ...&lt;br /&gt;
    [bit 35: pulse =  6, pause =  4] 0&lt;br /&gt;
    [bit 36: pulse =  6, pause =  4] 0&lt;br /&gt;
    stop bit detected&lt;br /&gt;
    code detected, length = 37&lt;br /&gt;
    protcol = 3, address = 0x0400, code = 0x00c7&lt;br /&gt;
&lt;br /&gt;
Wegen der etwas langen Ausgabe empfiehlt sich auch ein, um seitenweise zu blättern:&lt;br /&gt;
&lt;br /&gt;
    ./irmp.c &amp;lt; IR-Data/Samsung_DVD_Rec_00062C.txt | less&lt;br /&gt;
&lt;br /&gt;
Die Scan-Dateien haben mir bei der Entwicklung des IRMP enorm geholfen, Dank an Vlad Tepesch und Klaus Leidinger, die mich mit Scan-Dateien entsprechend versorgt haben!&lt;br /&gt;
&lt;br /&gt;
Mittlerweile kann man IRMP auch unter Windows nutzen, nämlich folgendermaßen:&lt;br /&gt;
&lt;br /&gt;
* Eingabeaufforderung starten&lt;br /&gt;
* In das Verzeichnis irmp\IR-Data wechseln&lt;br /&gt;
* Aufruf von:&lt;br /&gt;
            irmp.exe &amp;lt;rc5x.txt&lt;br /&gt;
&lt;br /&gt;
Da manche Ausgaben sehr lang werden, empfiehlt es sich, diese in eine&lt;br /&gt;
Datei zu lenken oder in den more weiterzuleiten, damit man seitenweise&lt;br /&gt;
blättern kann:&lt;br /&gt;
&lt;br /&gt;
            irmp.exe &amp;lt;rc5x.txt | more&lt;br /&gt;
&lt;br /&gt;
Dank an Klaus Leidinger, der den IRMP unter Windows compiliert hat.&lt;br /&gt;
&lt;br /&gt;
Zusatz:&lt;br /&gt;
&lt;br /&gt;
Der Decoder für das Kaseikyo- und RECS80-RC5-Protokoll ist ungetestet und wurde anhand von Dokumentationen im Internet erstellt und lediglich mittels&lt;br /&gt;
künstlich erzeugten Scan-Dateien getestet... daher: keine Gewähr!&lt;br /&gt;
&lt;br /&gt;
== Diskussion ==&lt;br /&gt;
&lt;br /&gt;
Meinungen, Verbesserungsvorschläge, harsche Kritik und ähnliches kann im [http://www.mikrocontroller.net/topic/162119 Beitrag: Infrared Multi Protocol Decoder] geäussert werden.&lt;br /&gt;
&lt;br /&gt;
== Literatur ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SIRCS-Protokoll&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
http://www.sbprojects.com/knowledge/ir/sirc.htm&lt;br /&gt;
&lt;br /&gt;
http://www.ustr.net/infrared/sony.shtml&lt;br /&gt;
&lt;br /&gt;
http://users.telenet.be/davshomepage/sony.htm&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;NEC-Protokoll:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
http://www.sbprojects.com/knowledge/ir/nec.htm&lt;br /&gt;
&lt;br /&gt;
http://www.ustr.net/infrared/nec.shtml&lt;br /&gt;
&lt;br /&gt;
http://www.celadon.com/infrared_protocol/infrared_protocols_samples.pdf&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SAMSUNG-Protokoll:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
(wurde aus diversen Protokollen (Daewoo u.ä.) zusammengereimt, daher kein direkter Link auf irgendwelche SAMSUNG-Dokumentation verfügbar)&lt;br /&gt;
&lt;br /&gt;
Hier ein Link zum Daewoo-Protokoll, welches dasselbe Prinzip des Sync-Bits in der Mitte eines Frames nutzt, jedoch mit anderen Timing-Werten arbeitet:&lt;br /&gt;
&lt;br /&gt;
http://users.telenet.be/davshomepage/daewoo.htm&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MATSUHITA-Protokoll:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
http://www.celadon.com/infrared_protocol/infrared_protocols_samples.pdf&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KASEIKYO-Protokoll (auch &amp;quot;Japan-Protokoll&amp;quot;):&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
http://www.mikrocontroller.net/attachment/4246/IR-Protokolle_Diplomarbeit.pdf&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RECS80-Protokoll:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
http://www.sbprojects.com/knowledge/ir/recs80.htm&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RC5-Protokoll:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
http://www.sbprojects.com/knowledge/ir/rc5.htm&lt;br /&gt;
&lt;br /&gt;
http://users.telenet.be/davshomepage/rc5.htm&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Denon-Protokoll:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
http://www.mikrocontroller.com/de/IR-Protokolle.php#DENON&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RC6-Protokoll:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
http://www.sbprojects.com/knowledge/ir/rc6.htm&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Diverse Protokolle:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
http://www.mikrocontroller.net/attachment/4246/IR-Protokolle_Diplomarbeit.pdf&lt;br /&gt;
&lt;br /&gt;
http://www.celadon.com/infrared_protocol/infrared_protocols_samples.pdf&lt;br /&gt;
&lt;br /&gt;
Viel Spaß mit IRMP!&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Datenübertragung]]&lt;/div&gt;</summary>
		<author><name>Shortie</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR_Net-IO_Bausatz_von_Pollin&amp;diff=42535</id>
		<title>AVR Net-IO Bausatz von Pollin</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR_Net-IO_Bausatz_von_Pollin&amp;diff=42535"/>
		<updated>2010-01-24T22:36:57Z</updated>

		<summary type="html">&lt;p&gt;Shortie: /* Erweiterungsplatine */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Hier steht eine Beschreibung des Pollin Bausatzes [http://www.pollin.de/shop/shop.php?cf=detail.php&amp;amp;pg=NQ==&amp;amp;a=MTQ5OTgxOTk= AVR-NET-IO. Best.Nr. 810 058]&lt;br /&gt;
&lt;br /&gt;
Eine Liste von Features:&lt;br /&gt;
&lt;br /&gt;
Ethernet-Platine mit ATMega32 und Netzwerkcontroller ENC28J60. Die Platine verfügt über 8 digitale Ausgänge, 4 digitale und 4 ADC-Eingänge, welche alle über einen Netzwerkanschluss (TCP/IP) abgerufen bzw. geschaltet werden können.&lt;br /&gt;
&lt;br /&gt;
Technische Daten:&lt;br /&gt;
&lt;br /&gt;
* Betriebsspannung 9 V AC/DC&lt;br /&gt;
* Stromaufnahme ca. 190 mA&lt;br /&gt;
* 8 digitale Ausgänge (0/5 V) [PC0-PC7 an J3]&lt;br /&gt;
* 4 digitale Eingänge (0/5 V) [PA0-PA3 an J3]&lt;br /&gt;
* 4 ADC-Eingänge (10 Bit) [PA4-PA7 an Schraubklemmen]&lt;br /&gt;
* LCD-Anschluss (HD44780 komp. Controller nötig) [PD2-7,PB0,PB3 an EXT]&lt;br /&gt;
* [[ENC28J60]]&lt;br /&gt;
* [http://www.atmel.com/dyn/Products/Product_card.asp?part_id=2014 ATmega32] Mikrocontroller&lt;br /&gt;
&lt;br /&gt;
Maße (LxBxH): 108x76x22 mm.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
[[Bild:AVR-NET-IO.JPG|thumb|400px|AVR-NET-IO (links) mit zusätzlicher SUB-D Anschlussplatine (rechts, nicht im Lieferumfang). Ebenso ist zusätzlich ein nicht im Lieferumfang enthaltener kleiner Kühlkörper auf einem der Spannungsregler montiert und die Schraubklemmen sind nicht wie vorgesehen angereiht.]]Die Schaltung des AVR-NET-IO ist recht einfach:&lt;br /&gt;
* Ein ATmega32 Mikrocontroller enthält die gesamte Software&lt;br /&gt;
* Ein ENC28J60 Ethernet-Controller für das Senden und Empfangen von Ethernet Frames (MAC und PHY Ethernet Layer) ist über [[SPI]] mit dem ATmega32 verbunden&lt;br /&gt;
* Ein Ethernet RJ-45 MagJack TRJ 0011 BA NL von [http://www.trxcom.com/ Trxcom] mit eingebautem Übertrager und Anzeige-LEDs am ENC28J60.&lt;br /&gt;
* Ein MAX232 für die serielle Schnittstelle&lt;br /&gt;
* Zwei Spannungsregler, 5 V und 3,3 V&lt;br /&gt;
* &amp;quot;Hühnerfutter&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Fast alle I/O Pins des ATmega32 sind irgendwo auf Anschlüssen herausgeführt. Entweder auf dem SUB-D Stecker, dem EXT oder ISP Wannensteckern oder den blauen Anschlussklemmen. Sie sind nicht(!) besonders geschützt, es finden sich zum Beispiel keine Schutzdioden für die Pins in der Schaltung.&lt;br /&gt;
&lt;br /&gt;
Die blauen Anschlussklemmen haben eine Nut und eine Feder mit denen man&lt;br /&gt;
sie zusammenstecken kann, dadurch ist das Anlöten wesentlich leichter&lt;br /&gt;
und sie stehen auch sauber in der Reihe (nicht wie auf dem Foto; die Anschlussklemmen lassen sich sauber durch einen Steg zusammenstecken).&lt;br /&gt;
=== Erweiterungsplatine ===&lt;br /&gt;
Seit Januar 2010 gibt es auch eine Erweiterungsplatine.&lt;br /&gt;
&lt;br /&gt;
[http://www.pollin.de/shop/dt/Nzg4OTgxOTk-/Bausaetze/Diverse/Bausatz_Add_on_fuer_AVR_NET_IO.html Add-on für AVR-NET-IO-Board Best.Nr. 810 112]&lt;br /&gt;
&lt;br /&gt;
Diese Platine erweitert das NET-IO um:&lt;br /&gt;
&lt;br /&gt;
* SD-Karten-Slot über SPI&lt;br /&gt;
* Display über PCF 8574&lt;br /&gt;
* Infrarot&lt;br /&gt;
* RFM12 Funkmodul (nicht im Lieferumfang enthalten)&lt;br /&gt;
&lt;br /&gt;
Ausserdem soll es die 3.3V Versorgung der Hauptplatine verbessern. Dazu sollte man einen 4,7 kOhm Widerstand parallel zu R2 schalten. Sonst beträgt die Ausgangsspannung nur ca. 2,8V. (Tipp aus dem u.g. Thread im Forum)&lt;br /&gt;
&lt;br /&gt;
ISP-Anschluß nicht vollständig durchgeschleift. Keine Verbindung der RESET-Leitung zwischen ISP und ISP1.&lt;br /&gt;
&lt;br /&gt;
Erste Erfahrungsberichte im Forum http://www.mikrocontroller.net/topic/161354&lt;br /&gt;
&lt;br /&gt;
=== Hardware-Umbauten &amp;amp; -Verbesserungen ===&lt;br /&gt;
&lt;br /&gt;
* Kühlkörper auf dem 7805&lt;br /&gt;
* MAX232 nach anfänglicher Konfiguration nicht bestücken um Strom zu sparen oder um zwei weitere I/O-Pins zu gewinnen&lt;br /&gt;
* 10µF-Elkos für MAX232N (C14-C17) durch 1µF ersetzen. Eine 10µF-Version für den MAX232 gibt es nicht. Die 10µF-Elkos können auch Ursache einer nicht funktionierenden RS232 sein.&lt;br /&gt;
* Die IC-Fassungen aus &amp;quot;Pollins Resterampe&amp;quot; durch Fassungen mit gedrehten Kontakten ersetzen. &lt;br /&gt;
* &#039;&#039;Netz&#039;&#039; LED nicht bestücken oder größere Widerstände einlöten um Strom zu sparen &lt;br /&gt;
* Vorwiderstände der Ethernet-LEDs größer machen (z.B. verdoppeln) um Strom zu sparen&lt;br /&gt;
* Linear-Spannungsregler ersetzen&lt;br /&gt;
* Kondensator an AREF-Pin des ATmega32 (ATmega32 Datenblatt) (100nF gegen Masse)&lt;br /&gt;
* Kondensator an den RESET-Pin des ATmega32 ([http://www.atmel.com/dyn/resources/prod_documents/doc2521.pdf Atmel Application Note AVR042: AVR Hardware Design Considerations]) Wenn man diese Quelle genauer liest, ist das aber eher unnötig.&lt;br /&gt;
* Umbau auf 3,3 V:&lt;br /&gt;
** Ersatz der Spannungsregler durch einen einzigen 3,3 V Regler&lt;br /&gt;
** Anpassen (verkleinern) des LED-Vorwiderstands R3 für 3,3 Volt Betrieb&lt;br /&gt;
** Reduktion der Taktfrequenz (Austausch von Q2) auf den bei 3,3V erlaubten Bereich des ATmega32 ( ATmega32(L)  3.3V /8.0 Mhz Takt )&lt;br /&gt;
** Ersatz des MAX232 durch einen MAX3232&lt;br /&gt;
[[Bild:POWER.JPG|thumb|400px|5V Stromversorgung über USB Kabel, ohne 5 V Spannungsregler und Gleichrichterdioden, Vorsicht: kein Verpolungsschutz!  ]]&lt;br /&gt;
* ATmega32 vom ENC28J60 takten (OSC2)&lt;br /&gt;
* Betrieb mit Gleichspannung:&lt;br /&gt;
** Dioden D2 und D5 durch Drahtbrücken ersetzen, D1 und D4 nicht bestücken (komplette Entfernung des Brückengleichrichters, beinhaltet Verlust des Verpolungsschutzes)&lt;br /&gt;
** Diode D2 bestücken, D5 durch Drahtbrücke ersetzen, D1 und D4 nicht bestücken (Brückengleichrichter durch Verpolungsschutze ersetzen)&lt;br /&gt;
* Ersatz des ATmega32 durch einen ATmega644 mit mehr FLASH-Speicher.&lt;br /&gt;
&lt;br /&gt;
== Inbetriebnahme der Originalsoftware ==&lt;br /&gt;
=== Einleitung ===&lt;br /&gt;
&lt;br /&gt;
Die bei Auslieferung (Stand September 2008) in den ATmega32 gebrannte Firmware stellt sich manchmal recht zickig an. Es scheint dann weder die serielle Schnittstelle, noch die Netzwerkschnittstelle zu funktionieren. Falls es Probleme geben sollte kann mit den im folgenden beschriebenen Schritten die Inbetriebnahme der Software möglich sein. Dazu benötigt man:&lt;br /&gt;
&lt;br /&gt;
* Einen Windows-PC mit Ethernet-Schnittstelle und RS232-Schnittstelle (ein Prolific RS232-USB Konverter funktioniert)&lt;br /&gt;
* Entweder&lt;br /&gt;
**zwei normale (&#039;&#039;straight through&#039;&#039;) Ethernet-Kabel und einen Ethernet Switch/Hub, oder&lt;br /&gt;
**ein gekreuztes(&#039;&#039;cross over&#039;&#039;) Ethernet-Kabel&lt;br /&gt;
* Einen AVR Programmer (Hardware und Software). Zum Beispiel einen [[AVR Dragon]] oder [[STK500]] mit [[AVR Studio]] oder das [[Pollin ATMEL Evaluations-Board]] und [[avrdude]].&lt;br /&gt;
* Die [http://www.pollin.de/shop/shop.php?cf=downloads_suchergebnis.php&amp;amp;fp=OA==&amp;amp;pg=NQ==&amp;amp;a=MTQ5OTgxOTk= Pollin NetServer Software], Version 1.01 (oder neuer)&lt;br /&gt;
&lt;br /&gt;
=== Gelieferten ATmega32 richtig einstellen ===&lt;br /&gt;
&lt;br /&gt;
Die Fuses der gelieferten ATmega32s scheinen nicht immer mit den im Handbuch auf Seite 12 als erforderlich angegebenen Fuse-Einstellungen übereinzustimmen.&lt;br /&gt;
&lt;br /&gt;
Dies kann man mittels eines Programmers ändern. LFuse = 0xBF, HFuse = 0xD2. Das genaue Vorgehen hängt dabei vom verwendeten Programmer ab. Bei der Gelegenheit kann man ebenfalls eine Sicherheitskopie des ursprünglichen Flash-Inhalts und des EEPROMs anfertigen. Das EEPROM scheint die MAC-Adresse des Ethernet-Ports zu enthalten.&lt;br /&gt;
&lt;br /&gt;
Entgegen der Spezifikation im Handbuch von Pollin sollten die &#039;&#039;&#039;HFuses auf 0xC2&#039;&#039;&#039; gesetzt werden, d. h. CKOPT-Fuse programmiert. Das sorgt für einen stabilen Betrieb des AVR-Oszillators im &amp;quot;full rail-to-rail swing&amp;quot;-Mode bei 16 MHz. Atmel garantiert ansonsten nur stabilen Betrieb bis 8 MHz. Siehe ATmega32-Datenblatt, Kapitel 8.4, Crystal Oscillator.&lt;br /&gt;
&lt;br /&gt;
==== Funktionsfähige Konfiguration - AVR-Prog ====&lt;br /&gt;
&lt;br /&gt;
Benutzer von AVR-Prog können die nachfolgenden Einstellungen für die Lock- und Fuse-Bits verwenden. Hierbei handelt es sich um die ausgelesenen Einstellungen eines funktionsfähigen Controllers. Allerdings sollte, laut Handbuch des AVR-NET-IO-Boards, das Fuse-Bit EESAVE eigentlich gesetzt sein. &lt;br /&gt;
&lt;br /&gt;
[[Bild:Avrprog.png]]&lt;br /&gt;
&lt;br /&gt;
Alternativ kann auch per avrdude die Einstellung getroffen werden:&lt;br /&gt;
avrdude -c stk500v2 -pm32 -U lfuse:w:0xBF:m und &lt;br /&gt;
avrdude -c stk500v2 -pm32 -U hfuse:w:0xC2:m&lt;br /&gt;
&lt;br /&gt;
Anschließend muß noch der Bootloader und die Firmware aktualisiert werden (siehe Handbuch AVR-NET-IO-Board Seite 12 Punkt 3).&lt;br /&gt;
&lt;br /&gt;
=== PC Konfiguration ===&lt;br /&gt;
&lt;br /&gt;
==== PC normalerweise nicht im 192.168.0/24 Subnetz ====&lt;br /&gt;
&lt;br /&gt;
Betreibt man den PC normalerweise nicht im 192.168.0/24 Subnetz, muss er wie folgt umkonfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
Den PC vom normalen Netzwerk abstecken. Zur Umkonfiguration dazu bei Windows XP in der Systemsteuerung &#039;&#039;Netzwerkverbindungen&#039;&#039; aufrufen und die lokale &#039;&#039;LAN-Verbindung&#039;&#039; markieren. Dann in der rechten Leiste &#039;&#039;Einstellungen dieser Verbindung ändern&#039;&#039; aufrufen. &lt;br /&gt;
&lt;br /&gt;
Es erscheint der Dialog &#039;&#039;Eigenschaften von &amp;lt;Verbindungsname&amp;gt;&#039;&#039;. In der Liste im Dialog zu &#039;&#039;Internetprotokoll (TCP/IP)&#039;&#039; gehen. Ein Doppelklick auf den Eintrag öffnet den &#039;&#039;Eigenschaften von Internetprotokoll (TCP/IP)&#039;&#039; Dialog.&lt;br /&gt;
&lt;br /&gt;
In diesem Dialog &#039;&#039;Folgende IP-Adresse verwenden:&#039;&#039; auswählen und zum Beispiel&lt;br /&gt;
&lt;br /&gt;
IP-Adresse: &#039;&#039;&#039;192.168.0.100&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Subnetzmaske: &#039;&#039;&#039;255.255.255.0&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Standardgateway: &#039;&#039;&#039;192.168.0.1&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
eingeben. &lt;br /&gt;
&lt;br /&gt;
Alle geöffneten Dialoge nacheinander mit OK schließen.&lt;br /&gt;
&lt;br /&gt;
Alternativ bietet sich das Umprogrammieren des Boards über die serielle Schnittstelle an. Die Werte für IP-Adresse, Netzmaske und Standard-Gateway werden mit den dokumentierten SETxx-Befehlen geändert, das Board neu gestartet und ans vorhandene Netzwerk gesteckt.&lt;br /&gt;
&lt;br /&gt;
Im EEPROM sind folgende Werte vorprogrammiert:&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
3EE - 3F3 MAC-ADRESSE&amp;lt;br&amp;gt;&lt;br /&gt;
3F4 - 3F7 GATEWAY&amp;lt;br&amp;gt;&lt;br /&gt;
3F8 - 3FC NETMASK&amp;lt;br&amp;gt;&lt;br /&gt;
3FD - 3FF IP-ADRESSE&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== PC bereits im 192.168.0/24 Subnetz ====&lt;br /&gt;
&lt;br /&gt;
In diesem Fall muss man prüfen, ob die IP-Adresse 192.168.0.90 bereits im Subnetz verwendet wird. Ist dies der Fall, muss das verwendete Gerät mit dieser IP vorübergehend aus dem Subnetz entfernt werden. Es sei denn, dabei handelt es sich um den PC. In diesem Fall muss er wie zuvor umkonfiguriert werden. Ansonsten kann der unverändert im Netz verbleiben.&lt;br /&gt;
&lt;br /&gt;
Dem AVR-NET-IO gibt man eine neue, zuvor unbenutzte Adresse (siehe unten). Dann kann das abgekoppelte Gerät wieder angeschlossen werden, beziehungsweise der PC zurückkonfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
=== AVR-NET-IO anschließen ===&lt;br /&gt;
&lt;br /&gt;
Musste man den PC umkonfigurieren, so werden jetzt nur der PC und der AVR-NET-IO über Ethernet miteinander verbunden. Je nach Ethernet-Kabel benötigt man dazu einen Switch/Hub oder nicht.&lt;br /&gt;
&lt;br /&gt;
Musste man den PC nicht umkonfigurieren, so kann man den AVR-NET-IO wie einen normalen Rechner an das vorhandenen Netz anschließen.&lt;br /&gt;
&lt;br /&gt;
Zusätzlich schließt man die serielle Schnittstelle des AVR-NET-IO an den PC an.&lt;br /&gt;
&lt;br /&gt;
=== Firmware 1.01 einspielen ===&lt;br /&gt;
&lt;br /&gt;
Laut Handbuch sollte der AVR-NET-IO jetzt über Ethernet funktionieren. Ebenso sollte er über die serielle Schnittstelle und ein Terminalprogramm konfigurierbar sein. Beides ist offensichtlich im Auslieferungszustand selten der Fall.&lt;br /&gt;
&lt;br /&gt;
Auch wenn sich Pollins NetServer Software nicht mit dem AVR-NET-IO verbinden lässt, so ist sie jedoch in der Lage eine neue Firmware 1.01 einzuspielen. Das Vorgehen ist im Handbuch auf Seite 12 beschrieben. NetServer präsentiert dabei ein paar einfache Anweisungen denen man folgen sollte.&lt;br /&gt;
&lt;br /&gt;
=== Abschluss ===&lt;br /&gt;
&lt;br /&gt;
Jetzt sollte sich die NetServer Software mit dem AVR-NET-IO über Ethernet verbinden lassen. Dies macht es wiederum möglich, den AVR-NET-IO mit einer anderen IP-Adresse zu versehen. Will man den AVR-NET-IO in einem anderen Subnetz betreiben kann man dies jetzt einstellen.&lt;br /&gt;
&lt;br /&gt;
Nachdem man die IP-Adresse neu eingestellt hat, muss man den PC zurückkonfigurieren und kann dann sowohl den AVR-NET-IO und den PC zusammen betreiben.&lt;br /&gt;
&lt;br /&gt;
== Bekannte Fehler ==&lt;br /&gt;
&lt;br /&gt;
Siehe auch [[#Hardware-Umbauten_.26_-Verbesserungen|Hardware-Umbauten und Verbesserungen]]&lt;br /&gt;
&lt;br /&gt;
* Die Stückliste auf Seite 4 in den Anleitung mit den Versionsangaben&lt;br /&gt;
** &#039;&#039;Stand 20.08.2008, kloiber, #1100, wpe&#039;&#039; (gedruckt im Bausatz)&lt;br /&gt;
** &#039;&#039;Stand 20.08.2008, cd, #all, wpe&#039;&#039; (auf der CD)&lt;br /&gt;
:ist falsch. Pollin legt dem Bausatz irgendwann ab September 2008 einen gedruckten Korrekturzettel bei. Die Online-Version der Anleitung ist korrigiert.&lt;br /&gt;
* Im Schaltplan auf Seite 7 in den Anleitungen mit den Versionen&lt;br /&gt;
** &#039;&#039;Stand 20.08.2008, kloiber, #1100, wpe&#039;&#039; (gedruckt im Bausatz)&lt;br /&gt;
** &#039;&#039;Stand 20.08.2008, cd, #all, wpe&#039;&#039; (auf der CD)&lt;br /&gt;
** &#039;&#039;Stand 03.09.2008, online, #all, wpe&#039;&#039; (Online)&lt;br /&gt;
:ist eine 25-polige SUB-D Buchse gezeichnet. Geliefert wird und in der Stückliste verzeichnet ist ein Stecker.&lt;br /&gt;
&lt;br /&gt;
* Die September 2008 ausgelieferte Firmware im ATmega32  funktioniert bei vielen nicht und muss erst upgedatet werden (siehe [[#Inbetriebnahme der Originalsoftware|Inbetriebnahme der Originalsoftware]])&lt;br /&gt;
&lt;br /&gt;
* Im Flash der gelieferten AVR ist anders als beschrieben nur der Bootloader enthalten, die eigentliche Firmware muss erst mit Hilfe der Updatefunktion geladen werden. Wenn zusätzlich auch die Fuses falsch gebrannt sind, dann funktioniert das Update nicht, auch wenn das PC Programm was anderes behauptet.&lt;br /&gt;
&lt;br /&gt;
* Die Fuse-Einstellungen des ausgelieferten ATmega32 entspricht nicht der Anleitung (siehe [[#Inbetriebnahme der Originalsoftware|Inbetriebnahme der Originalsoftware]])&lt;br /&gt;
&lt;br /&gt;
* Käufer berichten von fehlenden Bauteilen im Bausatz (Wannenstecker, Widerstände, Kondensatoren, Induktivitäten). Für Reklamationen: [https://www.pollin.de/shop/kontakt_service/reklamation.html]&lt;br /&gt;
&lt;br /&gt;
* Bausatz, gekauft am 27.10.08, Anleitungsversion 19.09.08, ohne Probleme oder erkennbare Fehler zusammengebaut und in Betrieb genommen.&lt;br /&gt;
&lt;br /&gt;
* Bausatz gekauft 29.09.2008, Pinbelegung des 25 poligen D-Sub &amp;quot;Anschlusses&amp;quot; stimmt nicht mit der Anleitung überein. Der Aufdruck auf der Platine ist falsch. Pin1 &amp;lt;-&amp;gt; Pin13, Pin2 &amp;lt;-&amp;gt; Pin12 usw. Setzt man den D-Sub Stecker ein, so sind dessen Pinnummern korrekt.&lt;br /&gt;
&lt;br /&gt;
* 3 Bausätze Anf. Oktober 2008 gekauft, bei einem waren 2 LM317 dabei, dafür fehlte der 7805 - aus der Bastelkiste ersetzt. Alle haben jedoch auf Anhieb funktioniert&lt;br /&gt;
&lt;br /&gt;
* Bausatz gekauft Ende Januar 2009. Die Lock-Bits (u.a. für PonyProg2000) werden falsch beschrieben. Die in Klammern aufgeführten Werte stimmen bei einem Bit nicht. Die Texte &amp;quot;Programmiert/Unprogrammiert&amp;quot; hingegen schon. Bei den Bauteilen gab es 4 Kondensatoren mit der Aufschrift &amp;quot;220&amp;quot;, ich habe diese durch welche mit 22p ersetzt, da ich nicht sicher war ob wirklich 22p geliefert wurden. Dafür wurden statt einem zwei 7805 und statt einem mindestens vier LM317 mitgeliefert.&lt;br /&gt;
&lt;br /&gt;
* Bausatz geliefert 22.4.2009. Alles vollständig, zusammengebaut, läuft. Software-Version 1.03. Für den oben schon genannten Steckverbinder wurde eine Buchse geliefert. Allerdings stimmen die PIN-Nummern im Schaltplan nicht mit den PIN-Nummern auf der Buchse überein (sie sind gespiegelt), daher liefen die Test-LEDs zunächst nicht.&lt;br /&gt;
&lt;br /&gt;
* Bausatz geliefert 11.7.2009. Spannungsregler LM317T fehlt, grüne statt roter LED. Ein Kondensator 22pF zu viel. LM317T wurde auf Anfrage kostenlos nachgeliefert (27.7.). Inbetriebnahme problemlos.&lt;br /&gt;
&lt;br /&gt;
* Bausatz geliefert 24.7.2009. Ein Quarz 16MHz zu viel, ebenfalls grüne statt rote LED.&lt;br /&gt;
&lt;br /&gt;
* Bausatz geliefert 20.08.2009. Ein Kondensator 22pF zuviel und grüne statt rote LED.&lt;br /&gt;
&lt;br /&gt;
* Bausatz Juli &#039;09 gekauft, grüne statt rote LED&lt;br /&gt;
&lt;br /&gt;
* Bausatz 25.09.09 geliefert, grüne Betriebs-LED, ein ELKO zuviel, Fehler 1µF am MAX232 statt 100nF behoben, richtiger C wird mitgeliefert, Aufbau komplett nach Pollin Anleitung durchgeführt, auf Anhieb fehlerfrei!&lt;br /&gt;
&lt;br /&gt;
* Bausatz 17.10.09 geliefert, grüne Betriebs-LED, zwei 100nF Kondensatoren zu wenig. Aufbau und Inbetriebnahme problemlos.&lt;br /&gt;
&lt;br /&gt;
* Bausatz 21.10.09 gekauft, grüne Betriebs-LED. Aufbau problemlos, RS232 läuft nicht. LAN läuft&lt;br /&gt;
&lt;br /&gt;
* Bausatz Nov. 09 gekauft, grüne LED, alles o.k.&lt;br /&gt;
&lt;br /&gt;
* Bausatz Nov. 09 gekauft, grüne LED, ENC28J60, MAX232 und ATmega32 fehlen, Nachlieferung nach einer Woche&lt;br /&gt;
&lt;br /&gt;
*Bausatz Nov. 09 gekauft,Bauteile komplett.Verbindungsaufbau Seriell klappt erst nach mehreren Versuchen.Problem gelöst:Spannung an MAX und Mega zu niedrig&lt;br /&gt;
&lt;br /&gt;
* Bausatz Dez. 09 gekauft, grüne LED, 100µF Kondensator fehlt, alles o.k.&lt;br /&gt;
&lt;br /&gt;
* Bausatz August 09 gekauft, alle teile da nach Einstellen der fusebits lief alles perfekt&lt;br /&gt;
&lt;br /&gt;
* Bausatz Okt. 09 gekauft, ein 100nF Kondensator und 25MHz Quarz fehlten ... hab beim lokalen Elektronikhändler keinen 25Mhz Grundton Quarz sondern nur im 3. Oberton bekommen aber mit R2.2k parallel zum Quarz schwingt er in der Schaltung schön bei 25Mhz. Mit 1µF am MAX232 funktioniert jetzt auch die RS232.&lt;br /&gt;
&lt;br /&gt;
== Andere Software für den Client-PC ==&lt;br /&gt;
=== NetIOLib ===&lt;br /&gt;
&lt;br /&gt;
In C# geschriebene Bibliothek zur Ansteuerung der Platine im Orginalzustand. Inkl. Beispielsoftware und Quellcode (GNU GPL) &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
DLL: [http://www.tware.org/downloads/NetIOLib_dll.zip Download-Link]&lt;br /&gt;
Source: [http://www.tware.org/downloads/NetIOLib_src.zip Download-Link]&lt;br /&gt;
&lt;br /&gt;
=== ControlIO ===&lt;br /&gt;
Einfache Bibliothek zur Ansteuerung mit Originalfirmware.&lt;br /&gt;
http://www.mikrocontroller.net/topic/149695&lt;br /&gt;
&lt;br /&gt;
== Andere Software statt der Originalsoftware von Pollin ==&lt;br /&gt;
&lt;br /&gt;
Die Umrüstung auf einen Webserver durch Austausch der Software (und ev. des ATmega32) bietet sich an.&lt;br /&gt;
&lt;br /&gt;
=== Bascom Version von Hütti ===&lt;br /&gt;
&lt;br /&gt;
(Quelle: http://bascom-forum.de/index.php/topic,1781.45.html )&lt;br /&gt;
dort am Ende der Seite.&lt;br /&gt;
&lt;br /&gt;
=== Ben&#039;s Bascom Quellcode ===&lt;br /&gt;
&lt;br /&gt;
(Quelle: http://members.home.nl/bzijlstra/software/examples/enc28j60.htm )&lt;br /&gt;
&lt;br /&gt;
Muss aber für Bascom 1.11.9.3 angepasst werden, siehe Code von Hütti !&lt;br /&gt;
&lt;br /&gt;
=== U. Radigs Webserver ===&lt;br /&gt;
&lt;br /&gt;
Angepasster Sourcecode von U.Radig: http://www.mikrocontroller.net/attachment/40027/Webserver_MEGA32.hex&lt;br /&gt;
oder selbst anpassen: &lt;br /&gt;
Ändere im File ENC28J60.H&lt;br /&gt;
 #define ENC28J60_PIN_SS    3&lt;br /&gt;
 #define ENC28J60_PIN_CS    4&lt;br /&gt;
(Quelle: http://www.mikrocontroller.net/topic/109988#988386)&lt;br /&gt;
&lt;br /&gt;
Temporären Dateien (*.d, *,lst,*.o) vorher im Verzeichnis löschen &#039;&#039;make clean&#039;&#039;, damit neu compiliert wird.&lt;br /&gt;
&lt;br /&gt;
IP: 192.168.0.99&amp;lt;br&amp;gt;&lt;br /&gt;
User: admin&amp;lt;br&amp;gt;&lt;br /&gt;
Pass: uli1&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Den orginal SourceCode gibt&#039;s übrigens hier:http://www.ulrichradig.de/home/index.php/avr/eth_m32_ex&lt;br /&gt;
&lt;br /&gt;
Bei den Fuses BOOTRST ausschalten, da die Software keinen Bootloader enthält.&lt;br /&gt;
&lt;br /&gt;
Wer gerne als Link-LED die grüne nutzen möchte&lt;br /&gt;
(U.Radig-Source)&lt;br /&gt;
&lt;br /&gt;
enc28j60.c Zeile 150&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;enc28j60_write_phy(ENC28J60_PHY_PHLCON, 0x347A)&lt;br /&gt;
&lt;br /&gt;
Wert 0x347A in 0x374A ändern&lt;br /&gt;
&lt;br /&gt;
(Quelle: http://www.mikrocontroller.net/topic/109988#994943)&lt;br /&gt;
&lt;br /&gt;
IP: 192.168.1.90&amp;lt;br&amp;gt;&lt;br /&gt;
User: admin&amp;lt;br&amp;gt;&lt;br /&gt;
Pass: tim&amp;lt;br&amp;gt;&lt;br /&gt;
Test: http://beitz-online.dyndns.org&amp;lt;br&amp;gt;&lt;br /&gt;
Test: http://pieper-online.dyndns.org&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weiterentwicklung des Radig-Codes von RoBue: &amp;lt;br&amp;gt;&lt;br /&gt;
- 1-Wire-Unterstützung (Anschlus an PORTA7) &amp;lt;br&amp;gt;&lt;br /&gt;
- PORTA0-3 digitaler Eingang (ein/aus) &amp;lt;br&amp;gt;&lt;br /&gt;
- PORTA4-6 analoger Eingang (0 - 1023) &amp;lt;br&amp;gt;&lt;br /&gt;
- LCD an PORTC &amp;lt;br&amp;gt;&lt;br /&gt;
- Schalten in Abhängigkeit von Temperatur und analogem Wert &amp;lt;br&amp;gt;&lt;br /&gt;
- (Teilweise) Administration über Weboberfläche &amp;lt;br&amp;gt;&lt;br /&gt;
- Erweiterung des cmd-Befehlsatzes für telnet/rs232 &amp;lt;br&amp;gt;&lt;br /&gt;
Gedacht ist der Einsatz des AVR-NET-IO-Bausatzes für Heizungs- oder Haussteuerung) &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Test: http://df8jb.dyndns.org/&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(Quelle:&amp;lt;br&amp;gt;&lt;br /&gt;
http://www.mikrocontroller.net/attachment/43307/AVR-NET-IO_RoBue_V1.3.zip&amp;lt;br&amp;gt;&lt;br /&gt;
http://www.mikrocontroller.net/attachment/44569/AVR-NET-IO_RoBue_V1.4.zip&amp;lt;br&amp;gt;&lt;br /&gt;
http://www.mikrocontroller.net/attachment/46720/AVR-NET-IO_RoBue_1.5-final_hoffentlich_.zip)&lt;br /&gt;
&lt;br /&gt;
Bei der Ver 1.5 sind die Ports PD2+3 fürs 4bit LCD (Ext.) vertauscht ! Gruß B.P&lt;br /&gt;
&lt;br /&gt;
=== Simon Ks Webserver (uip-Stack) ===&lt;br /&gt;
Angepasster Sourcecode von Simon K: http://www.mikrocontroller.net/attachment/39939/uWebSrv.zip&lt;br /&gt;
IP: 192.168.0.93:8080&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ethersex Server ===&lt;br /&gt;
&lt;br /&gt;
http://www.ethersex.de - Einfach für atmega32 compilieren und funktioniert.&lt;br /&gt;
&lt;br /&gt;
Oder &lt;br /&gt;
[http://www.ethersex.de/firmware-builder/list.cgi hier] ein Firmware Image passend für das Pollin Net-IO mit eingebautem Webserver und Beispieldateien im Flash bauen lassen und flashen (firmware-builder). Einfacher geht´s nimmer. :-)&lt;br /&gt;
&lt;br /&gt;
=== Etherrape Server ===&lt;br /&gt;
&lt;br /&gt;
http://www.lochraster.org/etherrape/ &lt;br /&gt;
&lt;br /&gt;
ist in jedem Fall hier auch zu erwähnen zumal es sich beim etherrape um das Ursprungsprojekt von ethersex handelt.&lt;br /&gt;
Es scheint aber bei der Weiterentwicklung wenig zu passieren.&lt;br /&gt;
Ausführliche Dokumentation findet sich unter http://wiki.lochraster.org/wiki/Etherrape&lt;br /&gt;
&lt;br /&gt;
=== Mini SRCP Server (kommerziell, Closed-Source)===&lt;br /&gt;
&lt;br /&gt;
Damit wird die Platine zu einer Modellbahnsteuerung, die&lt;br /&gt;
über das Netzwerkprotokoll SRCP mit verschiedenen Programmen&lt;br /&gt;
gesteuert werden kann.&lt;br /&gt;
&lt;br /&gt;
[http://www.7soft.de/de/mini_srcp_server/index.html Infoseite] zur Hardware&lt;br /&gt;
und das zugrundeliegende [http://www.der-moba.de/index.php/Digitalprojekt Digitalprojekt].&lt;br /&gt;
&lt;br /&gt;
=== AvrArtNode ===&lt;br /&gt;
&lt;br /&gt;
Hiermit kann die Platine zu einem Art-Net Node werden, mit dem sich ein DMX-Universe über Ethernet übertragen lässt. Basiert auf den Quellen von Ulrich Radig.&lt;br /&gt;
&lt;br /&gt;
Dokumentation: [http://www.dmxcontrol.de/wiki/Art-Net-Node_f%C3%BCr_25_Euro Art-Net-Node für 25 Euro]&lt;br /&gt;
&lt;br /&gt;
=== Webserver von G. Menke ===&lt;br /&gt;
&lt;br /&gt;
Ein Webserver (basierend auf den Sourcen von U. Radig), der so angepasst ist, dass alle Ein- und Ausgänge wie bei der originalen Pollin-Software genutzt werden können (8xDIGOUT, 4xDIGIN, 4xADIN). Der Webserver kann daher direkt auf das Net-IO geladen werden. Im ZIP-File sind ein ReadMe und alle C-Sourcen enthalten. Download:&lt;br /&gt;
[http://gm.stream-center.de/webserver/ Webserver mit passender IO]&lt;br /&gt;
&lt;br /&gt;
=== OpenMCP ===&lt;br /&gt;
&lt;br /&gt;
Tolles Projekt, welches viele Features bietet und stabil läuft. Hervorzuheben ist die Übersichtlichkeit der Programmteile/Module und die vielleicht nicht ganz komplette Dokumentation. Man merkt das viel Arbeit und Liebe in diesen Projekt steckt. Herausgekommen ist dabei eine einfach zu handhabende Entwicklungsumgebung. Anfänger können, dank des gut durchdachten CGI-System welches sich um alle wichtigen Sachen kümmert, leicht eigene CGI implementieren. Alle Ausgaben erfolgen nur mit printf über die Standardausgabe und werden automatisch richtig per Netzwerk übertragen, dadurch ist es auch für den Anfänger recht gut geeignet, da man sich nicht mit der Netzwerkprogrammierung auseinander setzen muss.&lt;br /&gt;
&lt;br /&gt;
[http://wiki.neo-guerillaz.de Projekt und Doku]&lt;br /&gt;
&lt;br /&gt;
Der Autor stellt zwei über das Internet erreichbare Testboards bereit unter http://www.neo-guerillaz.de:81 und http://www.neo-guerillaz.de:82 die beide unter OpenMCP laufen, je auf einen AVR-NETIO mit einem ATmega644 und dem eigentlichen Board mit einem ATmega2561. Zusätzlich ist gerade eine Version für das myAVR in Arbeit die schon ordentlich Fortschritte macht.&lt;br /&gt;
&lt;br /&gt;
=== ENC28J60 I/O-Webserver von Thomas Heldt ===&lt;br /&gt;
&lt;br /&gt;
Ein Modul-Webserver (Softwarekompatibel zum Pollin Webserver), der durch div. Module erweitert werden kann, Software in Bascom basierend auf dem Code von Ben Zijlsta wurde erweitert und angepasst:&lt;br /&gt;
&lt;br /&gt;
[http://mikrocontroller.heldt.eu/index.php?page=enc28j60-io-webserver Projekt und Software]&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* Diskussion zu diesem Projekt: http://www.mikrocontroller.net/topic/109988&lt;br /&gt;
* [http://www.microchip.com/wwwproducts/Devices.aspx?dDocName=en022889 ENC28J60 Produktseite]&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/DeviceDoc/39662c.pdf ENC28J60 Datenblatt(pdf)]&lt;br /&gt;
* [http://son.ffdf-clan.de Forum für AVR-Net-IO]&lt;br /&gt;
* [http://bascom-forum.de/index.php/topic,1781.0.html Bascom Forum ]&lt;br /&gt;
&lt;br /&gt;
[[Category:AVR-Boards]]&lt;br /&gt;
[[Category:Ethernet|P]]&lt;/div&gt;</summary>
		<author><name>Shortie</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR_Net-IO_Bausatz_von_Pollin&amp;diff=42534</id>
		<title>AVR Net-IO Bausatz von Pollin</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR_Net-IO_Bausatz_von_Pollin&amp;diff=42534"/>
		<updated>2010-01-24T22:33:10Z</updated>

		<summary type="html">&lt;p&gt;Shortie: /* Erweiterungsplatine */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Hier steht eine Beschreibung des Pollin Bausatzes [http://www.pollin.de/shop/shop.php?cf=detail.php&amp;amp;pg=NQ==&amp;amp;a=MTQ5OTgxOTk= AVR-NET-IO. Best.Nr. 810 058]&lt;br /&gt;
&lt;br /&gt;
Eine Liste von Features:&lt;br /&gt;
&lt;br /&gt;
Ethernet-Platine mit ATMega32 und Netzwerkcontroller ENC28J60. Die Platine verfügt über 8 digitale Ausgänge, 4 digitale und 4 ADC-Eingänge, welche alle über einen Netzwerkanschluss (TCP/IP) abgerufen bzw. geschaltet werden können.&lt;br /&gt;
&lt;br /&gt;
Technische Daten:&lt;br /&gt;
&lt;br /&gt;
* Betriebsspannung 9 V AC/DC&lt;br /&gt;
* Stromaufnahme ca. 190 mA&lt;br /&gt;
* 8 digitale Ausgänge (0/5 V) [PC0-PC7 an J3]&lt;br /&gt;
* 4 digitale Eingänge (0/5 V) [PA0-PA3 an J3]&lt;br /&gt;
* 4 ADC-Eingänge (10 Bit) [PA4-PA7 an Schraubklemmen]&lt;br /&gt;
* LCD-Anschluss (HD44780 komp. Controller nötig) [PD2-7,PB0,PB3 an EXT]&lt;br /&gt;
* [[ENC28J60]]&lt;br /&gt;
* [http://www.atmel.com/dyn/Products/Product_card.asp?part_id=2014 ATmega32] Mikrocontroller&lt;br /&gt;
&lt;br /&gt;
Maße (LxBxH): 108x76x22 mm.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
[[Bild:AVR-NET-IO.JPG|thumb|400px|AVR-NET-IO (links) mit zusätzlicher SUB-D Anschlussplatine (rechts, nicht im Lieferumfang). Ebenso ist zusätzlich ein nicht im Lieferumfang enthaltener kleiner Kühlkörper auf einem der Spannungsregler montiert und die Schraubklemmen sind nicht wie vorgesehen angereiht.]]Die Schaltung des AVR-NET-IO ist recht einfach:&lt;br /&gt;
* Ein ATmega32 Mikrocontroller enthält die gesamte Software&lt;br /&gt;
* Ein ENC28J60 Ethernet-Controller für das Senden und Empfangen von Ethernet Frames (MAC und PHY Ethernet Layer) ist über [[SPI]] mit dem ATmega32 verbunden&lt;br /&gt;
* Ein Ethernet RJ-45 MagJack TRJ 0011 BA NL von [http://www.trxcom.com/ Trxcom] mit eingebautem Übertrager und Anzeige-LEDs am ENC28J60.&lt;br /&gt;
* Ein MAX232 für die serielle Schnittstelle&lt;br /&gt;
* Zwei Spannungsregler, 5 V und 3,3 V&lt;br /&gt;
* &amp;quot;Hühnerfutter&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Fast alle I/O Pins des ATmega32 sind irgendwo auf Anschlüssen herausgeführt. Entweder auf dem SUB-D Stecker, dem EXT oder ISP Wannensteckern oder den blauen Anschlussklemmen. Sie sind nicht(!) besonders geschützt, es finden sich zum Beispiel keine Schutzdioden für die Pins in der Schaltung.&lt;br /&gt;
&lt;br /&gt;
Die blauen Anschlussklemmen haben eine Nut und eine Feder mit denen man&lt;br /&gt;
sie zusammenstecken kann, dadurch ist das Anlöten wesentlich leichter&lt;br /&gt;
und sie stehen auch sauber in der Reihe (nicht wie auf dem Foto; die Anschlussklemmen lassen sich sauber durch einen Steg zusammenstecken).&lt;br /&gt;
=== Erweiterungsplatine ===&lt;br /&gt;
Seit Januar 2010 gibt es auch eine Erweiterungsplatine. Diese Platine erweitert das NET-IO um:&lt;br /&gt;
&lt;br /&gt;
* SD-Karten-Slot über SPI&lt;br /&gt;
* Display über PCF 8574&lt;br /&gt;
* Infrarot&lt;br /&gt;
* RFM12 Funkmodul (nicht im Lieferumfang enthalten)&lt;br /&gt;
&lt;br /&gt;
Ausserdem soll es die 3.3V Versorgung der Hauptplatine verbessern. Dazu sollte man einen 4,7 kOhm Widerstand parallel zu R2 schalten. Sonst beträgt die Ausgangsspannung nur ca. 2,8V. (Tipp aus dem u.g. Thread im Forum)&lt;br /&gt;
&lt;br /&gt;
ISP-Anschluß nicht vollständig durchgeschleift. Keine Verbindung der RESET-Leitung zwischen ISP und ISP1.&lt;br /&gt;
&lt;br /&gt;
http://www.pollin.de/shop/dt/Nzg4OTgxOTk-/Bausaetze/Diverse/Bausatz_Add_on_fuer_AVR_NET_IO.html&lt;br /&gt;
&lt;br /&gt;
Erste Erfahrungsberichte im Forum http://www.mikrocontroller.net/topic/161354&lt;br /&gt;
&lt;br /&gt;
=== Hardware-Umbauten &amp;amp; -Verbesserungen ===&lt;br /&gt;
&lt;br /&gt;
* Kühlkörper auf dem 7805&lt;br /&gt;
* MAX232 nach anfänglicher Konfiguration nicht bestücken um Strom zu sparen oder um zwei weitere I/O-Pins zu gewinnen&lt;br /&gt;
* 10µF-Elkos für MAX232N (C14-C17) durch 1µF ersetzen. Eine 10µF-Version für den MAX232 gibt es nicht. Die 10µF-Elkos können auch Ursache einer nicht funktionierenden RS232 sein.&lt;br /&gt;
* Die IC-Fassungen aus &amp;quot;Pollins Resterampe&amp;quot; durch Fassungen mit gedrehten Kontakten ersetzen. &lt;br /&gt;
* &#039;&#039;Netz&#039;&#039; LED nicht bestücken oder größere Widerstände einlöten um Strom zu sparen &lt;br /&gt;
* Vorwiderstände der Ethernet-LEDs größer machen (z.B. verdoppeln) um Strom zu sparen&lt;br /&gt;
* Linear-Spannungsregler ersetzen&lt;br /&gt;
* Kondensator an AREF-Pin des ATmega32 (ATmega32 Datenblatt) (100nF gegen Masse)&lt;br /&gt;
* Kondensator an den RESET-Pin des ATmega32 ([http://www.atmel.com/dyn/resources/prod_documents/doc2521.pdf Atmel Application Note AVR042: AVR Hardware Design Considerations]) Wenn man diese Quelle genauer liest, ist das aber eher unnötig.&lt;br /&gt;
* Umbau auf 3,3 V:&lt;br /&gt;
** Ersatz der Spannungsregler durch einen einzigen 3,3 V Regler&lt;br /&gt;
** Anpassen (verkleinern) des LED-Vorwiderstands R3 für 3,3 Volt Betrieb&lt;br /&gt;
** Reduktion der Taktfrequenz (Austausch von Q2) auf den bei 3,3V erlaubten Bereich des ATmega32 ( ATmega32(L)  3.3V /8.0 Mhz Takt )&lt;br /&gt;
** Ersatz des MAX232 durch einen MAX3232&lt;br /&gt;
[[Bild:POWER.JPG|thumb|400px|5V Stromversorgung über USB Kabel, ohne 5 V Spannungsregler und Gleichrichterdioden, Vorsicht: kein Verpolungsschutz!  ]]&lt;br /&gt;
* ATmega32 vom ENC28J60 takten (OSC2)&lt;br /&gt;
* Betrieb mit Gleichspannung:&lt;br /&gt;
** Dioden D2 und D5 durch Drahtbrücken ersetzen, D1 und D4 nicht bestücken (komplette Entfernung des Brückengleichrichters, beinhaltet Verlust des Verpolungsschutzes)&lt;br /&gt;
** Diode D2 bestücken, D5 durch Drahtbrücke ersetzen, D1 und D4 nicht bestücken (Brückengleichrichter durch Verpolungsschutze ersetzen)&lt;br /&gt;
* Ersatz des ATmega32 durch einen ATmega644 mit mehr FLASH-Speicher.&lt;br /&gt;
&lt;br /&gt;
== Inbetriebnahme der Originalsoftware ==&lt;br /&gt;
=== Einleitung ===&lt;br /&gt;
&lt;br /&gt;
Die bei Auslieferung (Stand September 2008) in den ATmega32 gebrannte Firmware stellt sich manchmal recht zickig an. Es scheint dann weder die serielle Schnittstelle, noch die Netzwerkschnittstelle zu funktionieren. Falls es Probleme geben sollte kann mit den im folgenden beschriebenen Schritten die Inbetriebnahme der Software möglich sein. Dazu benötigt man:&lt;br /&gt;
&lt;br /&gt;
* Einen Windows-PC mit Ethernet-Schnittstelle und RS232-Schnittstelle (ein Prolific RS232-USB Konverter funktioniert)&lt;br /&gt;
* Entweder&lt;br /&gt;
**zwei normale (&#039;&#039;straight through&#039;&#039;) Ethernet-Kabel und einen Ethernet Switch/Hub, oder&lt;br /&gt;
**ein gekreuztes(&#039;&#039;cross over&#039;&#039;) Ethernet-Kabel&lt;br /&gt;
* Einen AVR Programmer (Hardware und Software). Zum Beispiel einen [[AVR Dragon]] oder [[STK500]] mit [[AVR Studio]] oder das [[Pollin ATMEL Evaluations-Board]] und [[avrdude]].&lt;br /&gt;
* Die [http://www.pollin.de/shop/shop.php?cf=downloads_suchergebnis.php&amp;amp;fp=OA==&amp;amp;pg=NQ==&amp;amp;a=MTQ5OTgxOTk= Pollin NetServer Software], Version 1.01 (oder neuer)&lt;br /&gt;
&lt;br /&gt;
=== Gelieferten ATmega32 richtig einstellen ===&lt;br /&gt;
&lt;br /&gt;
Die Fuses der gelieferten ATmega32s scheinen nicht immer mit den im Handbuch auf Seite 12 als erforderlich angegebenen Fuse-Einstellungen übereinzustimmen.&lt;br /&gt;
&lt;br /&gt;
Dies kann man mittels eines Programmers ändern. LFuse = 0xBF, HFuse = 0xD2. Das genaue Vorgehen hängt dabei vom verwendeten Programmer ab. Bei der Gelegenheit kann man ebenfalls eine Sicherheitskopie des ursprünglichen Flash-Inhalts und des EEPROMs anfertigen. Das EEPROM scheint die MAC-Adresse des Ethernet-Ports zu enthalten.&lt;br /&gt;
&lt;br /&gt;
Entgegen der Spezifikation im Handbuch von Pollin sollten die &#039;&#039;&#039;HFuses auf 0xC2&#039;&#039;&#039; gesetzt werden, d. h. CKOPT-Fuse programmiert. Das sorgt für einen stabilen Betrieb des AVR-Oszillators im &amp;quot;full rail-to-rail swing&amp;quot;-Mode bei 16 MHz. Atmel garantiert ansonsten nur stabilen Betrieb bis 8 MHz. Siehe ATmega32-Datenblatt, Kapitel 8.4, Crystal Oscillator.&lt;br /&gt;
&lt;br /&gt;
==== Funktionsfähige Konfiguration - AVR-Prog ====&lt;br /&gt;
&lt;br /&gt;
Benutzer von AVR-Prog können die nachfolgenden Einstellungen für die Lock- und Fuse-Bits verwenden. Hierbei handelt es sich um die ausgelesenen Einstellungen eines funktionsfähigen Controllers. Allerdings sollte, laut Handbuch des AVR-NET-IO-Boards, das Fuse-Bit EESAVE eigentlich gesetzt sein. &lt;br /&gt;
&lt;br /&gt;
[[Bild:Avrprog.png]]&lt;br /&gt;
&lt;br /&gt;
Alternativ kann auch per avrdude die Einstellung getroffen werden:&lt;br /&gt;
avrdude -c stk500v2 -pm32 -U lfuse:w:0xBF:m und &lt;br /&gt;
avrdude -c stk500v2 -pm32 -U hfuse:w:0xC2:m&lt;br /&gt;
&lt;br /&gt;
Anschließend muß noch der Bootloader und die Firmware aktualisiert werden (siehe Handbuch AVR-NET-IO-Board Seite 12 Punkt 3).&lt;br /&gt;
&lt;br /&gt;
=== PC Konfiguration ===&lt;br /&gt;
&lt;br /&gt;
==== PC normalerweise nicht im 192.168.0/24 Subnetz ====&lt;br /&gt;
&lt;br /&gt;
Betreibt man den PC normalerweise nicht im 192.168.0/24 Subnetz, muss er wie folgt umkonfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
Den PC vom normalen Netzwerk abstecken. Zur Umkonfiguration dazu bei Windows XP in der Systemsteuerung &#039;&#039;Netzwerkverbindungen&#039;&#039; aufrufen und die lokale &#039;&#039;LAN-Verbindung&#039;&#039; markieren. Dann in der rechten Leiste &#039;&#039;Einstellungen dieser Verbindung ändern&#039;&#039; aufrufen. &lt;br /&gt;
&lt;br /&gt;
Es erscheint der Dialog &#039;&#039;Eigenschaften von &amp;lt;Verbindungsname&amp;gt;&#039;&#039;. In der Liste im Dialog zu &#039;&#039;Internetprotokoll (TCP/IP)&#039;&#039; gehen. Ein Doppelklick auf den Eintrag öffnet den &#039;&#039;Eigenschaften von Internetprotokoll (TCP/IP)&#039;&#039; Dialog.&lt;br /&gt;
&lt;br /&gt;
In diesem Dialog &#039;&#039;Folgende IP-Adresse verwenden:&#039;&#039; auswählen und zum Beispiel&lt;br /&gt;
&lt;br /&gt;
IP-Adresse: &#039;&#039;&#039;192.168.0.100&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Subnetzmaske: &#039;&#039;&#039;255.255.255.0&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Standardgateway: &#039;&#039;&#039;192.168.0.1&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
eingeben. &lt;br /&gt;
&lt;br /&gt;
Alle geöffneten Dialoge nacheinander mit OK schließen.&lt;br /&gt;
&lt;br /&gt;
Alternativ bietet sich das Umprogrammieren des Boards über die serielle Schnittstelle an. Die Werte für IP-Adresse, Netzmaske und Standard-Gateway werden mit den dokumentierten SETxx-Befehlen geändert, das Board neu gestartet und ans vorhandene Netzwerk gesteckt.&lt;br /&gt;
&lt;br /&gt;
Im EEPROM sind folgende Werte vorprogrammiert:&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
3EE - 3F3 MAC-ADRESSE&amp;lt;br&amp;gt;&lt;br /&gt;
3F4 - 3F7 GATEWAY&amp;lt;br&amp;gt;&lt;br /&gt;
3F8 - 3FC NETMASK&amp;lt;br&amp;gt;&lt;br /&gt;
3FD - 3FF IP-ADRESSE&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== PC bereits im 192.168.0/24 Subnetz ====&lt;br /&gt;
&lt;br /&gt;
In diesem Fall muss man prüfen, ob die IP-Adresse 192.168.0.90 bereits im Subnetz verwendet wird. Ist dies der Fall, muss das verwendete Gerät mit dieser IP vorübergehend aus dem Subnetz entfernt werden. Es sei denn, dabei handelt es sich um den PC. In diesem Fall muss er wie zuvor umkonfiguriert werden. Ansonsten kann der unverändert im Netz verbleiben.&lt;br /&gt;
&lt;br /&gt;
Dem AVR-NET-IO gibt man eine neue, zuvor unbenutzte Adresse (siehe unten). Dann kann das abgekoppelte Gerät wieder angeschlossen werden, beziehungsweise der PC zurückkonfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
=== AVR-NET-IO anschließen ===&lt;br /&gt;
&lt;br /&gt;
Musste man den PC umkonfigurieren, so werden jetzt nur der PC und der AVR-NET-IO über Ethernet miteinander verbunden. Je nach Ethernet-Kabel benötigt man dazu einen Switch/Hub oder nicht.&lt;br /&gt;
&lt;br /&gt;
Musste man den PC nicht umkonfigurieren, so kann man den AVR-NET-IO wie einen normalen Rechner an das vorhandenen Netz anschließen.&lt;br /&gt;
&lt;br /&gt;
Zusätzlich schließt man die serielle Schnittstelle des AVR-NET-IO an den PC an.&lt;br /&gt;
&lt;br /&gt;
=== Firmware 1.01 einspielen ===&lt;br /&gt;
&lt;br /&gt;
Laut Handbuch sollte der AVR-NET-IO jetzt über Ethernet funktionieren. Ebenso sollte er über die serielle Schnittstelle und ein Terminalprogramm konfigurierbar sein. Beides ist offensichtlich im Auslieferungszustand selten der Fall.&lt;br /&gt;
&lt;br /&gt;
Auch wenn sich Pollins NetServer Software nicht mit dem AVR-NET-IO verbinden lässt, so ist sie jedoch in der Lage eine neue Firmware 1.01 einzuspielen. Das Vorgehen ist im Handbuch auf Seite 12 beschrieben. NetServer präsentiert dabei ein paar einfache Anweisungen denen man folgen sollte.&lt;br /&gt;
&lt;br /&gt;
=== Abschluss ===&lt;br /&gt;
&lt;br /&gt;
Jetzt sollte sich die NetServer Software mit dem AVR-NET-IO über Ethernet verbinden lassen. Dies macht es wiederum möglich, den AVR-NET-IO mit einer anderen IP-Adresse zu versehen. Will man den AVR-NET-IO in einem anderen Subnetz betreiben kann man dies jetzt einstellen.&lt;br /&gt;
&lt;br /&gt;
Nachdem man die IP-Adresse neu eingestellt hat, muss man den PC zurückkonfigurieren und kann dann sowohl den AVR-NET-IO und den PC zusammen betreiben.&lt;br /&gt;
&lt;br /&gt;
== Bekannte Fehler ==&lt;br /&gt;
&lt;br /&gt;
Siehe auch [[#Hardware-Umbauten_.26_-Verbesserungen|Hardware-Umbauten und Verbesserungen]]&lt;br /&gt;
&lt;br /&gt;
* Die Stückliste auf Seite 4 in den Anleitung mit den Versionsangaben&lt;br /&gt;
** &#039;&#039;Stand 20.08.2008, kloiber, #1100, wpe&#039;&#039; (gedruckt im Bausatz)&lt;br /&gt;
** &#039;&#039;Stand 20.08.2008, cd, #all, wpe&#039;&#039; (auf der CD)&lt;br /&gt;
:ist falsch. Pollin legt dem Bausatz irgendwann ab September 2008 einen gedruckten Korrekturzettel bei. Die Online-Version der Anleitung ist korrigiert.&lt;br /&gt;
* Im Schaltplan auf Seite 7 in den Anleitungen mit den Versionen&lt;br /&gt;
** &#039;&#039;Stand 20.08.2008, kloiber, #1100, wpe&#039;&#039; (gedruckt im Bausatz)&lt;br /&gt;
** &#039;&#039;Stand 20.08.2008, cd, #all, wpe&#039;&#039; (auf der CD)&lt;br /&gt;
** &#039;&#039;Stand 03.09.2008, online, #all, wpe&#039;&#039; (Online)&lt;br /&gt;
:ist eine 25-polige SUB-D Buchse gezeichnet. Geliefert wird und in der Stückliste verzeichnet ist ein Stecker.&lt;br /&gt;
&lt;br /&gt;
* Die September 2008 ausgelieferte Firmware im ATmega32  funktioniert bei vielen nicht und muss erst upgedatet werden (siehe [[#Inbetriebnahme der Originalsoftware|Inbetriebnahme der Originalsoftware]])&lt;br /&gt;
&lt;br /&gt;
* Im Flash der gelieferten AVR ist anders als beschrieben nur der Bootloader enthalten, die eigentliche Firmware muss erst mit Hilfe der Updatefunktion geladen werden. Wenn zusätzlich auch die Fuses falsch gebrannt sind, dann funktioniert das Update nicht, auch wenn das PC Programm was anderes behauptet.&lt;br /&gt;
&lt;br /&gt;
* Die Fuse-Einstellungen des ausgelieferten ATmega32 entspricht nicht der Anleitung (siehe [[#Inbetriebnahme der Originalsoftware|Inbetriebnahme der Originalsoftware]])&lt;br /&gt;
&lt;br /&gt;
* Käufer berichten von fehlenden Bauteilen im Bausatz (Wannenstecker, Widerstände, Kondensatoren, Induktivitäten). Für Reklamationen: [https://www.pollin.de/shop/kontakt_service/reklamation.html]&lt;br /&gt;
&lt;br /&gt;
* Bausatz, gekauft am 27.10.08, Anleitungsversion 19.09.08, ohne Probleme oder erkennbare Fehler zusammengebaut und in Betrieb genommen.&lt;br /&gt;
&lt;br /&gt;
* Bausatz gekauft 29.09.2008, Pinbelegung des 25 poligen D-Sub &amp;quot;Anschlusses&amp;quot; stimmt nicht mit der Anleitung überein. Der Aufdruck auf der Platine ist falsch. Pin1 &amp;lt;-&amp;gt; Pin13, Pin2 &amp;lt;-&amp;gt; Pin12 usw. Setzt man den D-Sub Stecker ein, so sind dessen Pinnummern korrekt.&lt;br /&gt;
&lt;br /&gt;
* 3 Bausätze Anf. Oktober 2008 gekauft, bei einem waren 2 LM317 dabei, dafür fehlte der 7805 - aus der Bastelkiste ersetzt. Alle haben jedoch auf Anhieb funktioniert&lt;br /&gt;
&lt;br /&gt;
* Bausatz gekauft Ende Januar 2009. Die Lock-Bits (u.a. für PonyProg2000) werden falsch beschrieben. Die in Klammern aufgeführten Werte stimmen bei einem Bit nicht. Die Texte &amp;quot;Programmiert/Unprogrammiert&amp;quot; hingegen schon. Bei den Bauteilen gab es 4 Kondensatoren mit der Aufschrift &amp;quot;220&amp;quot;, ich habe diese durch welche mit 22p ersetzt, da ich nicht sicher war ob wirklich 22p geliefert wurden. Dafür wurden statt einem zwei 7805 und statt einem mindestens vier LM317 mitgeliefert.&lt;br /&gt;
&lt;br /&gt;
* Bausatz geliefert 22.4.2009. Alles vollständig, zusammengebaut, läuft. Software-Version 1.03. Für den oben schon genannten Steckverbinder wurde eine Buchse geliefert. Allerdings stimmen die PIN-Nummern im Schaltplan nicht mit den PIN-Nummern auf der Buchse überein (sie sind gespiegelt), daher liefen die Test-LEDs zunächst nicht.&lt;br /&gt;
&lt;br /&gt;
* Bausatz geliefert 11.7.2009. Spannungsregler LM317T fehlt, grüne statt roter LED. Ein Kondensator 22pF zu viel. LM317T wurde auf Anfrage kostenlos nachgeliefert (27.7.). Inbetriebnahme problemlos.&lt;br /&gt;
&lt;br /&gt;
* Bausatz geliefert 24.7.2009. Ein Quarz 16MHz zu viel, ebenfalls grüne statt rote LED.&lt;br /&gt;
&lt;br /&gt;
* Bausatz geliefert 20.08.2009. Ein Kondensator 22pF zuviel und grüne statt rote LED.&lt;br /&gt;
&lt;br /&gt;
* Bausatz Juli &#039;09 gekauft, grüne statt rote LED&lt;br /&gt;
&lt;br /&gt;
* Bausatz 25.09.09 geliefert, grüne Betriebs-LED, ein ELKO zuviel, Fehler 1µF am MAX232 statt 100nF behoben, richtiger C wird mitgeliefert, Aufbau komplett nach Pollin Anleitung durchgeführt, auf Anhieb fehlerfrei!&lt;br /&gt;
&lt;br /&gt;
* Bausatz 17.10.09 geliefert, grüne Betriebs-LED, zwei 100nF Kondensatoren zu wenig. Aufbau und Inbetriebnahme problemlos.&lt;br /&gt;
&lt;br /&gt;
* Bausatz 21.10.09 gekauft, grüne Betriebs-LED. Aufbau problemlos, RS232 läuft nicht. LAN läuft&lt;br /&gt;
&lt;br /&gt;
* Bausatz Nov. 09 gekauft, grüne LED, alles o.k.&lt;br /&gt;
&lt;br /&gt;
* Bausatz Nov. 09 gekauft, grüne LED, ENC28J60, MAX232 und ATmega32 fehlen, Nachlieferung nach einer Woche&lt;br /&gt;
&lt;br /&gt;
*Bausatz Nov. 09 gekauft,Bauteile komplett.Verbindungsaufbau Seriell klappt erst nach mehreren Versuchen.Problem gelöst:Spannung an MAX und Mega zu niedrig&lt;br /&gt;
&lt;br /&gt;
* Bausatz Dez. 09 gekauft, grüne LED, 100µF Kondensator fehlt, alles o.k.&lt;br /&gt;
&lt;br /&gt;
* Bausatz August 09 gekauft, alle teile da nach Einstellen der fusebits lief alles perfekt&lt;br /&gt;
&lt;br /&gt;
* Bausatz Okt. 09 gekauft, ein 100nF Kondensator und 25MHz Quarz fehlten ... hab beim lokalen Elektronikhändler keinen 25Mhz Grundton Quarz sondern nur im 3. Oberton bekommen aber mit R2.2k parallel zum Quarz schwingt er in der Schaltung schön bei 25Mhz. Mit 1µF am MAX232 funktioniert jetzt auch die RS232.&lt;br /&gt;
&lt;br /&gt;
== Andere Software für den Client-PC ==&lt;br /&gt;
=== NetIOLib ===&lt;br /&gt;
&lt;br /&gt;
In C# geschriebene Bibliothek zur Ansteuerung der Platine im Orginalzustand. Inkl. Beispielsoftware und Quellcode (GNU GPL) &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
DLL: [http://www.tware.org/downloads/NetIOLib_dll.zip Download-Link]&lt;br /&gt;
Source: [http://www.tware.org/downloads/NetIOLib_src.zip Download-Link]&lt;br /&gt;
&lt;br /&gt;
=== ControlIO ===&lt;br /&gt;
Einfache Bibliothek zur Ansteuerung mit Originalfirmware.&lt;br /&gt;
http://www.mikrocontroller.net/topic/149695&lt;br /&gt;
&lt;br /&gt;
== Andere Software statt der Originalsoftware von Pollin ==&lt;br /&gt;
&lt;br /&gt;
Die Umrüstung auf einen Webserver durch Austausch der Software (und ev. des ATmega32) bietet sich an.&lt;br /&gt;
&lt;br /&gt;
=== Bascom Version von Hütti ===&lt;br /&gt;
&lt;br /&gt;
(Quelle: http://bascom-forum.de/index.php/topic,1781.45.html )&lt;br /&gt;
dort am Ende der Seite.&lt;br /&gt;
&lt;br /&gt;
=== Ben&#039;s Bascom Quellcode ===&lt;br /&gt;
&lt;br /&gt;
(Quelle: http://members.home.nl/bzijlstra/software/examples/enc28j60.htm )&lt;br /&gt;
&lt;br /&gt;
Muss aber für Bascom 1.11.9.3 angepasst werden, siehe Code von Hütti !&lt;br /&gt;
&lt;br /&gt;
=== U. Radigs Webserver ===&lt;br /&gt;
&lt;br /&gt;
Angepasster Sourcecode von U.Radig: http://www.mikrocontroller.net/attachment/40027/Webserver_MEGA32.hex&lt;br /&gt;
oder selbst anpassen: &lt;br /&gt;
Ändere im File ENC28J60.H&lt;br /&gt;
 #define ENC28J60_PIN_SS    3&lt;br /&gt;
 #define ENC28J60_PIN_CS    4&lt;br /&gt;
(Quelle: http://www.mikrocontroller.net/topic/109988#988386)&lt;br /&gt;
&lt;br /&gt;
Temporären Dateien (*.d, *,lst,*.o) vorher im Verzeichnis löschen &#039;&#039;make clean&#039;&#039;, damit neu compiliert wird.&lt;br /&gt;
&lt;br /&gt;
IP: 192.168.0.99&amp;lt;br&amp;gt;&lt;br /&gt;
User: admin&amp;lt;br&amp;gt;&lt;br /&gt;
Pass: uli1&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Den orginal SourceCode gibt&#039;s übrigens hier:http://www.ulrichradig.de/home/index.php/avr/eth_m32_ex&lt;br /&gt;
&lt;br /&gt;
Bei den Fuses BOOTRST ausschalten, da die Software keinen Bootloader enthält.&lt;br /&gt;
&lt;br /&gt;
Wer gerne als Link-LED die grüne nutzen möchte&lt;br /&gt;
(U.Radig-Source)&lt;br /&gt;
&lt;br /&gt;
enc28j60.c Zeile 150&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;enc28j60_write_phy(ENC28J60_PHY_PHLCON, 0x347A)&lt;br /&gt;
&lt;br /&gt;
Wert 0x347A in 0x374A ändern&lt;br /&gt;
&lt;br /&gt;
(Quelle: http://www.mikrocontroller.net/topic/109988#994943)&lt;br /&gt;
&lt;br /&gt;
IP: 192.168.1.90&amp;lt;br&amp;gt;&lt;br /&gt;
User: admin&amp;lt;br&amp;gt;&lt;br /&gt;
Pass: tim&amp;lt;br&amp;gt;&lt;br /&gt;
Test: http://beitz-online.dyndns.org&amp;lt;br&amp;gt;&lt;br /&gt;
Test: http://pieper-online.dyndns.org&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weiterentwicklung des Radig-Codes von RoBue: &amp;lt;br&amp;gt;&lt;br /&gt;
- 1-Wire-Unterstützung (Anschlus an PORTA7) &amp;lt;br&amp;gt;&lt;br /&gt;
- PORTA0-3 digitaler Eingang (ein/aus) &amp;lt;br&amp;gt;&lt;br /&gt;
- PORTA4-6 analoger Eingang (0 - 1023) &amp;lt;br&amp;gt;&lt;br /&gt;
- LCD an PORTC &amp;lt;br&amp;gt;&lt;br /&gt;
- Schalten in Abhängigkeit von Temperatur und analogem Wert &amp;lt;br&amp;gt;&lt;br /&gt;
- (Teilweise) Administration über Weboberfläche &amp;lt;br&amp;gt;&lt;br /&gt;
- Erweiterung des cmd-Befehlsatzes für telnet/rs232 &amp;lt;br&amp;gt;&lt;br /&gt;
Gedacht ist der Einsatz des AVR-NET-IO-Bausatzes für Heizungs- oder Haussteuerung) &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Test: http://df8jb.dyndns.org/&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(Quelle:&amp;lt;br&amp;gt;&lt;br /&gt;
http://www.mikrocontroller.net/attachment/43307/AVR-NET-IO_RoBue_V1.3.zip&amp;lt;br&amp;gt;&lt;br /&gt;
http://www.mikrocontroller.net/attachment/44569/AVR-NET-IO_RoBue_V1.4.zip&amp;lt;br&amp;gt;&lt;br /&gt;
http://www.mikrocontroller.net/attachment/46720/AVR-NET-IO_RoBue_1.5-final_hoffentlich_.zip)&lt;br /&gt;
&lt;br /&gt;
Bei der Ver 1.5 sind die Ports PD2+3 fürs 4bit LCD (Ext.) vertauscht ! Gruß B.P&lt;br /&gt;
&lt;br /&gt;
=== Simon Ks Webserver (uip-Stack) ===&lt;br /&gt;
Angepasster Sourcecode von Simon K: http://www.mikrocontroller.net/attachment/39939/uWebSrv.zip&lt;br /&gt;
IP: 192.168.0.93:8080&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ethersex Server ===&lt;br /&gt;
&lt;br /&gt;
http://www.ethersex.de - Einfach für atmega32 compilieren und funktioniert.&lt;br /&gt;
&lt;br /&gt;
Oder &lt;br /&gt;
[http://www.ethersex.de/firmware-builder/list.cgi hier] ein Firmware Image passend für das Pollin Net-IO mit eingebautem Webserver und Beispieldateien im Flash bauen lassen und flashen (firmware-builder). Einfacher geht´s nimmer. :-)&lt;br /&gt;
&lt;br /&gt;
=== Etherrape Server ===&lt;br /&gt;
&lt;br /&gt;
http://www.lochraster.org/etherrape/ &lt;br /&gt;
&lt;br /&gt;
ist in jedem Fall hier auch zu erwähnen zumal es sich beim etherrape um das Ursprungsprojekt von ethersex handelt.&lt;br /&gt;
Es scheint aber bei der Weiterentwicklung wenig zu passieren.&lt;br /&gt;
Ausführliche Dokumentation findet sich unter http://wiki.lochraster.org/wiki/Etherrape&lt;br /&gt;
&lt;br /&gt;
=== Mini SRCP Server (kommerziell, Closed-Source)===&lt;br /&gt;
&lt;br /&gt;
Damit wird die Platine zu einer Modellbahnsteuerung, die&lt;br /&gt;
über das Netzwerkprotokoll SRCP mit verschiedenen Programmen&lt;br /&gt;
gesteuert werden kann.&lt;br /&gt;
&lt;br /&gt;
[http://www.7soft.de/de/mini_srcp_server/index.html Infoseite] zur Hardware&lt;br /&gt;
und das zugrundeliegende [http://www.der-moba.de/index.php/Digitalprojekt Digitalprojekt].&lt;br /&gt;
&lt;br /&gt;
=== AvrArtNode ===&lt;br /&gt;
&lt;br /&gt;
Hiermit kann die Platine zu einem Art-Net Node werden, mit dem sich ein DMX-Universe über Ethernet übertragen lässt. Basiert auf den Quellen von Ulrich Radig.&lt;br /&gt;
&lt;br /&gt;
Dokumentation: [http://www.dmxcontrol.de/wiki/Art-Net-Node_f%C3%BCr_25_Euro Art-Net-Node für 25 Euro]&lt;br /&gt;
&lt;br /&gt;
=== Webserver von G. Menke ===&lt;br /&gt;
&lt;br /&gt;
Ein Webserver (basierend auf den Sourcen von U. Radig), der so angepasst ist, dass alle Ein- und Ausgänge wie bei der originalen Pollin-Software genutzt werden können (8xDIGOUT, 4xDIGIN, 4xADIN). Der Webserver kann daher direkt auf das Net-IO geladen werden. Im ZIP-File sind ein ReadMe und alle C-Sourcen enthalten. Download:&lt;br /&gt;
[http://gm.stream-center.de/webserver/ Webserver mit passender IO]&lt;br /&gt;
&lt;br /&gt;
=== OpenMCP ===&lt;br /&gt;
&lt;br /&gt;
Tolles Projekt, welches viele Features bietet und stabil läuft. Hervorzuheben ist die Übersichtlichkeit der Programmteile/Module und die vielleicht nicht ganz komplette Dokumentation. Man merkt das viel Arbeit und Liebe in diesen Projekt steckt. Herausgekommen ist dabei eine einfach zu handhabende Entwicklungsumgebung. Anfänger können, dank des gut durchdachten CGI-System welches sich um alle wichtigen Sachen kümmert, leicht eigene CGI implementieren. Alle Ausgaben erfolgen nur mit printf über die Standardausgabe und werden automatisch richtig per Netzwerk übertragen, dadurch ist es auch für den Anfänger recht gut geeignet, da man sich nicht mit der Netzwerkprogrammierung auseinander setzen muss.&lt;br /&gt;
&lt;br /&gt;
[http://wiki.neo-guerillaz.de Projekt und Doku]&lt;br /&gt;
&lt;br /&gt;
Der Autor stellt zwei über das Internet erreichbare Testboards bereit unter http://www.neo-guerillaz.de:81 und http://www.neo-guerillaz.de:82 die beide unter OpenMCP laufen, je auf einen AVR-NETIO mit einem ATmega644 und dem eigentlichen Board mit einem ATmega2561. Zusätzlich ist gerade eine Version für das myAVR in Arbeit die schon ordentlich Fortschritte macht.&lt;br /&gt;
&lt;br /&gt;
=== ENC28J60 I/O-Webserver von Thomas Heldt ===&lt;br /&gt;
&lt;br /&gt;
Ein Modul-Webserver (Softwarekompatibel zum Pollin Webserver), der durch div. Module erweitert werden kann, Software in Bascom basierend auf dem Code von Ben Zijlsta wurde erweitert und angepasst:&lt;br /&gt;
&lt;br /&gt;
[http://mikrocontroller.heldt.eu/index.php?page=enc28j60-io-webserver Projekt und Software]&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* Diskussion zu diesem Projekt: http://www.mikrocontroller.net/topic/109988&lt;br /&gt;
* [http://www.microchip.com/wwwproducts/Devices.aspx?dDocName=en022889 ENC28J60 Produktseite]&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/DeviceDoc/39662c.pdf ENC28J60 Datenblatt(pdf)]&lt;br /&gt;
* [http://son.ffdf-clan.de Forum für AVR-Net-IO]&lt;br /&gt;
* [http://bascom-forum.de/index.php/topic,1781.0.html Bascom Forum ]&lt;br /&gt;
&lt;br /&gt;
[[Category:AVR-Boards]]&lt;br /&gt;
[[Category:Ethernet|P]]&lt;/div&gt;</summary>
		<author><name>Shortie</name></author>
	</entry>
</feed>