<?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=Tooki</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=Tooki"/>
	<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/articles/Spezial:Beitr%C3%A4ge/Tooki"/>
	<updated>2026-04-10T23:21:27Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.39.7</generator>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=IRSND_-_english&amp;diff=106084</id>
		<title>IRSND - english</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=IRSND_-_english&amp;diff=106084"/>
		<updated>2023-04-26T09:59:42Z</updated>

		<summary type="html">&lt;p&gt;Tooki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;By &#039;&#039;&#039;Frank M. ([http://www.mikrocontroller.net/user/show/ukw ukw])&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;This is the English translation of the [[IRSND#top|German ISRND documentation]].&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= IRSND - Infrared Multi Protocol Encoder =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[[Datei:irmp-title.png| |Waveform of an NEC-format remote control signal]]&lt;br /&gt;
&lt;br /&gt;
[[IRSND_-_english#top|IRSND]] is the counterpart to [[IRMP_-_english#top|IRMP]]. [[IRSND_-_english#top|IRSND]] encodes and transmits IR frames.&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
[[Datei:irsnd-sender.png|miniatur|A simple IR transmitter connected to a microcontroller.]]&lt;br /&gt;
&lt;br /&gt;
[[IRSND_-_english#top|IRSND]] is the counterpart to [[IRMP_-_english#top|IRMP]]: it reproduces the original IR frame from data received by [[IRMP_-_english#top|IRMP]], which can then be transmitted over an IR emitter.&lt;br /&gt;
&lt;br /&gt;
== Supported MCUs ==&lt;br /&gt;
&lt;br /&gt;
[[IRSND_-_english#top|IRSND]] runs on numerous MCU families:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AVR&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* ATtiny87,  ATtiny167&lt;br /&gt;
* ATtiny45,  ATtiny85&lt;br /&gt;
* ATtiny44,  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;
&#039;&#039;&#039;XMega&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* ATXmega128&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC&#039;&#039;&#039; (C18 Compiler)&lt;br /&gt;
&lt;br /&gt;
* PIC12F1840&lt;br /&gt;
* PIC18F4520&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;STM32&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* STM32F4xx&lt;br /&gt;
* STM32F10x&lt;br /&gt;
* STM32 with HAL library &#039;&#039;&#039;(NEW!)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TEENSY 3.0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* MK20DX256VLH7 (ARM Cortex-M4 72MHz)&lt;br /&gt;
&lt;br /&gt;
== Supported Protocols ==&lt;br /&gt;
&lt;br /&gt;
[[IRSND_-_english#top|IRSND]] supports the following IR protocols:&lt;br /&gt;
&lt;br /&gt;
* [[IRMP_-_english#A1TVBOX|A1TVBOX]]&lt;br /&gt;
* [[IRMP_-_english#AP24|ACP24]] &#039;&#039;&#039;(NEW!)&#039;&#039;&#039;&lt;br /&gt;
* [[IRMP_-_english#APPLE|APPLE]]&lt;br /&gt;
* [[IRMP_-_english#B&amp;amp;O|BANG_OLUFSON]]&lt;br /&gt;
* [[IRMP_-_english#BOSE|BOSE]] &#039;&#039;&#039;(NEW!)&#039;&#039;&#039;&lt;br /&gt;
* [[IRMP_-_english#DENON|DENON]]&lt;br /&gt;
* [[IRMP_-_english#FAN|FAN]] &#039;&#039;&#039;(NEW!)&#039;&#039;&#039;&lt;br /&gt;
* [[IRMP_-_english#FDC|FDC]] (minimum ~15kHz)&lt;br /&gt;
* [[IRMP_-_english#GRUNDIG_+_NOKIA|GRUNDIG]]&lt;br /&gt;
* [[IRMP_-_english#IR60 (SDA2008)|IR60 (SDA2008)]]&lt;br /&gt;
* [[IRMP_-_english#JVC|JVC]]&lt;br /&gt;
* [[IRMP_-_english#KASEIKYO|KASEIKYO]]&lt;br /&gt;
* [[IRMP_-_english#LEGO|LEGO]]&lt;br /&gt;
* [[IRMP_-_english#LGAIR|LGAIR]]&lt;br /&gt;
* [[IRMP_-_english#MATSUSHITA|MATSUSHITA]]&lt;br /&gt;
* [[IRMP_-_english#NEC_+_extended_NEC|NEC]]&lt;br /&gt;
* [[IRMP_-_english#NEC16|NEC16]]&lt;br /&gt;
* [[IRMP_-_english#NEC42|NEC42]]&lt;br /&gt;
* [[IRMP_-_english#NIKON|NIKON]]&lt;br /&gt;
* [[IRMP_-_english#GRUNDIG_+_NOKIA|NOKIA]]&lt;br /&gt;
* [[IRMP_-_english#NUBERT|NUBERT]]&lt;br /&gt;
* [[IRMP_-_english#PANASONIC|PANASONIC (Beamer)]] &#039;&#039;&#039;(NEW!)&#039;&#039;&#039;&lt;br /&gt;
* [[IRMP_-_english#PENTAX|PENTAX]] &#039;&#039;&#039;(NEW!)&#039;&#039;&#039;&lt;br /&gt;
* [[IRMP_-_english#RC5_+_RC5X|RC5]]&lt;br /&gt;
* [[IRMP_-_english#RC6_+_RC6A|RC6]]&lt;br /&gt;
* [[IRMP_-_english#RC6_+_RC6A|RC6A]]&lt;br /&gt;
* [[IRMP_-_english#RCCAR|RCCAR]] (minimum  ~15kHz)&lt;br /&gt;
* [[IRMP_-_english#RECS80|RECS80]] (bei mind. ~20kHz)&lt;br /&gt;
* [[IRMP_-_english#RECS80EXT|RECS80EXT]] (minimum  ~20kHz)&lt;br /&gt;
* [[IRMP_-_english#ROOMBA|ROOMBA]]&lt;br /&gt;
* [[IRMP_-_english#SAMSUNG|SAMSUNG]]&lt;br /&gt;
* [[IRMP_-_english#SAMSUNG32|SAMSUNG32]]&lt;br /&gt;
* [[IRMP_-_english#SAMSUNG48|SAMSUNG48]]&lt;br /&gt;
* [[IRMP_-_english#SIEMENS_+_RUWIDO|SIEMENS]] (minimum ~15kHz)&lt;br /&gt;
* [[IRMP_-_english#SPEAKER|SPEAKER]]&lt;br /&gt;
* [[IRMP_-_english#TELEFUNKEN|TELEFUNKEN]]&lt;br /&gt;
* [[IRMP_-_english#THOMSON|THOMSON]]&lt;br /&gt;
* [[IRMP_-_english#SIRCS|SIRCS]]&lt;br /&gt;
&lt;br /&gt;
[[IRSND_-_english#top|IRSND]] does &#039;&#039;&#039;NOT&#039;&#039;&#039; yet support the following protocols:&lt;br /&gt;
&lt;br /&gt;
* [[IRMP_-_english#KATHREIN|KATHREIN]]&lt;br /&gt;
* [[IRMP_-_english#NETBOX|NETBOX]]&lt;br /&gt;
* [[IRMP_-_english#ORTEK|ORTEK]]&lt;br /&gt;
* [[IRMP_-_english#RCMM|RCMM]]&lt;br /&gt;
* [[IRMP_-_english#MERLIN|MERLIN]]&lt;br /&gt;
&lt;br /&gt;
== Download ==&lt;br /&gt;
&lt;br /&gt;
Version 3.2.6, Date: 2021-01-27&lt;br /&gt;
&lt;br /&gt;
Download stable version: [http://www.mikrocontroller.net/wikifiles/c/c7/Irsnd.zip Irsnd.zip] &lt;br /&gt;
&lt;br /&gt;
[[IRMP_-_english#top|IRMP]] &amp;amp; [[IRSND_-_english#top|IRSND]] is also available by SVN: [http://www.mikrocontroller.net/svnbrowser/irmp/ IRMP in SVN]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;You can see the history of the software changes here: [[IRSND_-_english#Software_History|Software History]]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Source Code ==&lt;br /&gt;
&lt;br /&gt;
The source code can be easily compiled for AVR MCUs by loading the project file irsnd.aps in AVR Studio 4. &lt;br /&gt;
&lt;br /&gt;
For other development environments it is simple to create a project or makefile. The source includes:&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irsnd.c?view=markup irsnd.c] - the IR encoder core&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmpprotocols.h?view=markup irmpprotocols.h] - all protocol definitions&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmpsystem.h?view=markup irmpsystem.h] - target-dependent definitions for AVR/PIC/STM32&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irsnd.h?view=markup irsnd.h] - include file for the application&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irsndconfig.h?view=markup irsndconfig.h] - user configuration&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irsnd-main-avr.c?view=markup irsnd-main-avr.c] - example main&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IMPORTANT:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Include only [http://www.mikrocontroller.net/svnbrowser/irmp/irsnd.h?view=markup irsnd.h] in your application source code:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;irsnd.h&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
All other include files are included within [http://www.mikrocontroller.net/svnbrowser/irmp/irsnd.h?view=markup irsnd.h]. See also the sample application [http://www.mikrocontroller.net/svnbrowser/irmp/irsnd-main-avr.c?view=markup irsnd-main-avr.c].&lt;br /&gt;
&lt;br /&gt;
[[IRSND_-_english#top|IRSND]] encodes all protocols listed above in an interrupt service routine (ISR), see also [http://www.mikrocontroller.net/svnbrowser/irmp/irsnd.c?view=markup irsnd.c].&lt;br /&gt;
&lt;br /&gt;
=== Settings in irsndconfig.h ===&lt;br /&gt;
&lt;br /&gt;
==== F_INTERRUPTS ====&lt;br /&gt;
&lt;br /&gt;
Number of interrupts per second. The value can be set to a value between 10000 and 20000.&lt;br /&gt;
&lt;br /&gt;
Default value:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define F_INTERRUPTS                            15000      // interrupts per second&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== IRSND_SUPPORT_xxx_PROTOCOL ====&lt;br /&gt;
&lt;br /&gt;
Here you can select which protocols to enable in [[IRSND_-_english#top|IRSND]]. Common protocols are emabled by default. To enable additional protocols or disable others to save memory, set the corresponding values in [http://www.mikrocontroller.net/svnbrowser/irmp/irsndconfig.h?view=markup irsndconfig.h].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&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                 ~200 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                 ~300 bytes&lt;br /&gt;
&lt;br /&gt;
// more protocols, enable here!                 Enable  Remarks                 F_INTERRUPTS            Program Space&lt;br /&gt;
#define IRSND_SUPPORT_DENON_PROTOCOL            0       // DENON, Sharp         &amp;gt;= 10000                 ~200 bytes&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 (SDA2008)       &amp;gt;= 10000                 ~250 bytes&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;= 15000                 ~100 bytes&lt;br /&gt;
#define IRSND_SUPPORT_RECS80EXT_PROTOCOL        0       // RECS80EXT            &amp;gt;= 15000                 ~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_ROOMBA_PROTOCOL           0       // iRobot Roomba        &amp;gt;= 10000                 ~150 bytes&lt;br /&gt;
#define IRSND_SUPPORT_RUWIDO_PROTOCOL           0       // RUWIDO, T-Home       &amp;gt;= 15000                 ~250 bytes&lt;br /&gt;
#define IRSND_SUPPORT_A1TVBOX_PROTOCOL          0       // A1 TV BOX            &amp;gt;= 15000 (better 20000)  ~200 bytes&lt;br /&gt;
#define IRSND_SUPPORT_LEGO_PROTOCOL             0       // LEGO Power RC        &amp;gt;= 20000                 ~150 bytes&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To enable a protocol, set it to 1, to disable it, set it to 0. Disabled protocols will not be compiled. This saves program space in Flash. (See code comments above.) Refer to the article [[IRMP_-_english|IRMP]] for more tips on saving memory if absolutely necessary.&lt;br /&gt;
&lt;br /&gt;
When using the [[IRMP_-_english#APPLE|APPLE]] protocol, set IRSND_SUPPORT_NEC_PROTOCOL to 1, since it is simply a special case of the [[IRMP_-_english#NEC_+_extended_NEC|NEC]] protocol.&lt;br /&gt;
&lt;br /&gt;
==== IRSND_OCx ====&lt;br /&gt;
&lt;br /&gt;
To transmit IR signals, [[IRSND_-_english#top|IRSND]] needs a PWM-capable output pin, because the signal needs to be modulated. The following settings are possible:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Default value:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define IRSND_OCx                               IRSND_OC2B&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For PIC and STM32 MCUs use the appropriate values, see comments in [http://www.mikrocontroller.net/svnbrowser/irmp/irsndconfig.h?view=markup irsndconfig.h].&lt;br /&gt;
&lt;br /&gt;
==== IRSND_USE_CALLBACK ====&lt;br /&gt;
&lt;br /&gt;
Default value:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define IRSND_USE_CALLBACK                      0       // flag: 0 = don&#039;t use callbacks, 1 = use callbacks, default is 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If callbacks are enabled, your callback functions will be called whenever the IR signal changes (IR modulation on/off). This can by used to output an unmodulated signal on another pin, for example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define LED_PORT PORTD                                  // LED at PD6&lt;br /&gt;
#define LED_DDR  DDRD&lt;br /&gt;
#define LED_PIN  6&lt;br /&gt;
&lt;br /&gt;
/*-----------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
 * Called (back) from IRSND module&lt;br /&gt;
 * This example switches a LED (which is connected to Vcc)&lt;br /&gt;
 *-----------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
 */&lt;br /&gt;
void&lt;br /&gt;
led_callback (uint8_t on)&lt;br /&gt;
{&lt;br /&gt;
    if (on)&lt;br /&gt;
    {&lt;br /&gt;
       LED_PORT &amp;amp;= ~(1 &amp;lt;&amp;lt; LED_PIN);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
       LED_PORT |= (1 &amp;lt;&amp;lt; LED_PIN);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int&lt;br /&gt;
main ()&lt;br /&gt;
{&lt;br /&gt;
    ...&lt;br /&gt;
    LED_DDR |= (1 &amp;lt;&amp;lt; LED_PIN);         // LED pin to output&lt;br /&gt;
    LED_PORT |= (1 &amp;lt;&amp;lt; LED_PIN);        // switch LED off (active low)&lt;br /&gt;
    irsnd_init ();&lt;br /&gt;
    irsnd_set_callback_ptr (led_callback);&lt;br /&gt;
    sei ();&lt;br /&gt;
    ...&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Using IRSND ==&lt;br /&gt;
&lt;br /&gt;
[[IRSND_-_english#top|IRSND]] assembles the frame to be transmitted on the fly from the IRMP data structure. It includes:&lt;br /&gt;
&lt;br /&gt;
 1. ID for the protocol in use&lt;br /&gt;
 2. Address or vendor code&lt;br /&gt;
 3. Command&lt;br /&gt;
&lt;br /&gt;
To transmit the IR frame, call the function&lt;br /&gt;
&lt;br /&gt;
   irsnd_send_data (IRMP_DATA * irmp_data_p)&lt;br /&gt;
&lt;br /&gt;
The return value is 1 if the frame can be successfully transmitted, otherwise 0. In the first case the struct members&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
are read and then transmitted as a frame in the selected IR protocol.&lt;br /&gt;
&lt;br /&gt;
irmp_data_p-&amp;gt;flags specifies the number of repetitions, e.g.&lt;br /&gt;
&lt;br /&gt;
  irmp_data_p-&amp;gt;flags = 0: no repetition&lt;br /&gt;
  irmp_data_p-&amp;gt;flags = 1: 1 repetition&lt;br /&gt;
  irmp_data_p-&amp;gt;flags = 2: 2 repetitions&lt;br /&gt;
  usw.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important: Make sure that irmp_data_p-&amp;gt;flags has a defined value before calling irsnd_send_data()!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
   IRMP_DATA irmp_data;&lt;br /&gt;
&lt;br /&gt;
   irmp_data.protocol = IRMP_NEC_PROTOCOL;       // use NEC protocol&lt;br /&gt;
   irmp_data.address  = 0x00FF;                  // use address 0x00FF&lt;br /&gt;
   irmp_data.command  = 0x0001;                  // use command 0001&lt;br /&gt;
   irmp_data.flags    = 0;                       // no repetition!&lt;br /&gt;
&lt;br /&gt;
   (void) irsnd_send_data (&amp;amp;irmp_data, FALSE);   // transmit, don&#039;t wait&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The frame will be transmitted asynchronously by the interrupt routine irsnd_ISR(), so  the function irsnd_send_data() returns immediately. When repetitions are specified, depending on the protocol, the frame will be repeated after a wait specified in the protocol, or  a protocol-specific repeat frame (e.g. for NEC) will be sent.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== NEC Repeat Frames ===&lt;br /&gt;
&lt;br /&gt;
IRSND normally transmits repeat frames itself, according to the number of repetitions specified in the flags. (See above.)&lt;br /&gt;
&lt;br /&gt;
Starting with version 3.2.6 and specifically for the NEC protocol, repeat frames can be transmitted on their own. This is useful for IR repeaters in particular.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following flags must be set:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
   IRMP_DATA irmp_data;&lt;br /&gt;
&lt;br /&gt;
   irmp_data.protocol = IRMP_NEC_PROTOCOL;           // use NEC protocl&lt;br /&gt;
   irmp_data.address  = 0x00FF;                      // address is ignored&lt;br /&gt;
   irmp_data.command  = 0x0001;                      // command is ignored&lt;br /&gt;
   irmp_data.flags    = IRSND_RAW_REPETITION_FRAME;  // transmit NEC repeat frame&lt;br /&gt;
&lt;br /&gt;
   (void) irsnd_send_data (&amp;amp;irmp_data, TRUE);        // transmit and wait&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Multiple repeat frames can be transmitted by setting a repetition value as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
   irmp_data.flags    = IRSND_RAW_REPETITION_FRAME | 0x02;  // transmit NEC repeat frame and repeat 2 more times&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Up to 14 repetitions can be set, so up to 15 repeat frames.&lt;br /&gt;
&lt;br /&gt;
=== Waits ===&lt;br /&gt;
&lt;br /&gt;
When irsnd_send_data() is called again, it waits until the preceding frame has been transmitted completely. You can test whether [[IRSND_-_english#top|IRSND]] is busy or not:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
   while (irsnd_is_busy ())&lt;br /&gt;
   {&lt;br /&gt;
      ;                                          // wait here or do something else...&lt;br /&gt;
   }&lt;br /&gt;
   (void) irsnd_send_data (&amp;amp;irmp_data, FALSE);   // transmit without testing and without waiting&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When irsnd_send_data() is called with TRUE as the second argument, the function only returns once the frame has been transmitted completely.&lt;br /&gt;
&lt;br /&gt;
In the example source irsnd-main-avr.c, in addition to how to use irsnd_send_data(), the [[AVR-GCC-Tutorial/Die_Timer_und_Zähler_des_AVR|timer]] call is also demonstrated:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Using IRMP and IRSND Simultaneously ===&lt;br /&gt;
&lt;br /&gt;
To use [[IRMP_-_english#top|IRMP]] and [[IRSND_-_english#top|IRSND]] at the same time (that is, both transmitter and receiver), the ISR function should read as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This causes the receiver ISR to be called only when irsnd_ISR() is idle, and thus the receiver is disabled while irsnd_ISR() is transmitting data. &lt;br /&gt;
&lt;br /&gt;
The [[AVR-GCC-Tutorial/Die_Timer_und_Zähler_des_AVR|timer]] initialization routine is identical for [[IRMP_-_english#top|IRMP]] and [[IRSND_-_english#top|IRSND]].&lt;br /&gt;
&lt;br /&gt;
A combined main function could look like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
What the code above does is obvious: A received frame is fully decoded, then reencoded and finally transmitted with the IR emitting diode. This can be used to transmit signals around a corner, or extend them over a wire. &lt;br /&gt;
&lt;br /&gt;
Another application is protocol translation, for example to convert NEC frames to RC5 to substitute a lost RC5 remote control.&lt;br /&gt;
&lt;br /&gt;
Other uses are left to the reader&#039;s imagination. ;-)&lt;br /&gt;
&lt;br /&gt;
Here the possible values for irmp_data.protocol, see also  [http://www.mikrocontroller.net/svnbrowser/irmp/irmpprotocols.h?view=markup irmpprotocols.h]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&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 Media Receiver&lt;br /&gt;
#define IRMP_IR60_PROTOCOL                      24              // IR60 (SDA2008)&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;
#define IRMP_BOSE_PROTOCOL                      31              // BOSE&lt;br /&gt;
#define IRMP_A1TVBOX_PROTOCOL                   32              // A1 TV Box&lt;br /&gt;
#define IRMP_ORTEK_PROTOCOL                     33              // ORTEK - Hama&lt;br /&gt;
#define IRMP_TELEFUNKEN_PROTOCOL                34              // Telefunken (1560)&lt;br /&gt;
#define IRMP_ROOMBA_PROTOCOL                    35              // iRobot Roomba vacuum cleaner&lt;br /&gt;
#define IRMP_RCMM32_PROTOCOL                    36              // Fujitsu-Siemens (Activy remote control)&lt;br /&gt;
#define IRMP_RCMM24_PROTOCOL                    37              // Fujitsu-Siemens (Activy keyboard)&lt;br /&gt;
#define IRMP_RCMM12_PROTOCOL                    38              // Fujitsu-Siemens (Activy keyboard)&lt;br /&gt;
#define IRMP_SPEAKER_PROTOCOL                   39              // Another loudspeaker protocol, similar to Nubert&lt;br /&gt;
#define IRMP_LGAIR_PROTOCOL                     40              // LG air conditioner&lt;br /&gt;
#define IRMP_SAMSUNG48_PROTOCOL                 41              // air conditioner with SAMSUNG protocol (48 bits)&lt;br /&gt;
#define IRMP_MERLIN_PROTOCOL                    42              // Merlin (Pollin 620 185)&lt;br /&gt;
#define IRMP_PENTAX_PROTOCOL                    43              // Pentax camera&lt;br /&gt;
#define IRMP_FAN_PROTOCOL                       44              // FAN (ventilator), very similar to NUBERT, but last bit is data bit instead of stop bit&lt;br /&gt;
#define IRMP_S100_PROTOCOL                      45              // very similar to RC5, but 14 instead of 13 data bits&lt;br /&gt;
#define IRMP_ACP24_PROTOCOL                     46              // Stiebel Eltron ACP24 air conditioner&lt;br /&gt;
#define IRMP_TECHNICS_PROTOCOL                  47              // Technics, similar to Matsushita, but 22 instead of 24 bits&lt;br /&gt;
#define IRMP_PANASONIC_PROTOCOL                 48              // Panasonic (video projector), start bits similar to KASEIKYO&lt;br /&gt;
#define IRMP_MITSU_HEAVY_PROTOCOL               49              // Mitsubishi heavy air conditioner, similar timing to Panasonic video projector&lt;br /&gt;
#define IRMP_VINCENT_PROTOCOL                   50              // Vincent&lt;br /&gt;
#define IRMP_SAMSUNGAH_PROTOCOL                 51              // SAMSUNG AH&lt;br /&gt;
#define IRMP_IRMP16_PROTOCOL                    52              // IRMP specific protocol for data transfer, e.g. between two microcontrollers via IR&lt;br /&gt;
#define IRMP_GREE_PROTOCOL                      53              // Gree climate&lt;br /&gt;
#define IRMP_RCII_PROTOCOL                      54              // RC II Infrared Remote Control Protocol for FM8&lt;br /&gt;
#define IRMP_METZ_PROTOCOL                      55              // METZ&lt;br /&gt;
#define IRMP_ONKYO_PROTOCOL                     56              // Onkyo&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The best way to determine the address and command codes is to use [[IRMP_-_english|IRMP]], see above ;-)&lt;br /&gt;
&lt;br /&gt;
== IRSND under Linux and Windows ==&lt;br /&gt;
&lt;br /&gt;
=== Compiling IRSND ===&lt;br /&gt;
&lt;br /&gt;
 [http://www.mikrocontroller.net/svnbrowser/irmp/irsnd.c?view=markup irsnd.c] can be compiled under Linux to create frames in the same format as the IRMP scan files. Simply enter:&lt;br /&gt;
&lt;br /&gt;
    make -f makefile.unx&lt;br /&gt;
&lt;br /&gt;
=== Starting IRSND ===&lt;br /&gt;
&lt;br /&gt;
To start IRSND, enter:&lt;br /&gt;
&lt;br /&gt;
    ./irsnd protocol-number hex-address hex-command [repeat] &amp;gt; filename.txt&lt;br /&gt;
&lt;br /&gt;
Example for NEC protocol, address 0x00FF, command 0x0001:&lt;br /&gt;
&lt;br /&gt;
    ./irsnd 2 00FF 0001 &amp;gt; nec.txt                   # start irsnd&lt;br /&gt;
&lt;br /&gt;
=== IRSND under Windows ===&lt;br /&gt;
&lt;br /&gt;
You can also use [[IRSND_-_english#top|IRSND]] under Windows:&lt;br /&gt;
&lt;br /&gt;
* start the command line console&lt;br /&gt;
* change to the IRSND directory&lt;br /&gt;
* enter:&lt;br /&gt;
&lt;br /&gt;
            irsnd.exe 2 00FF 0001 &amp;gt; nec.txt&lt;br /&gt;
&lt;br /&gt;
You can then use [[IRMP_-_english#top|IRMP]] to check whether the frame generated by IRSND is correct:&lt;br /&gt;
&lt;br /&gt;
            ./irmp-15kHz &amp;lt; nec.txt&lt;br /&gt;
&lt;br /&gt;
or under Windows:&lt;br /&gt;
&lt;br /&gt;
            irmp.exe &amp;lt; nec.txt&lt;br /&gt;
&lt;br /&gt;
It also works without using an intermediate file, e.g.:&lt;br /&gt;
&lt;br /&gt;
            ./irsnd-15kHz 2 00FF 0001 | ./irmp-15kHz&lt;br /&gt;
&lt;br /&gt;
or under Windows:&lt;br /&gt;
&lt;br /&gt;
            irsnd.exe 2 00FF 0001 | irmp.exe&lt;br /&gt;
&lt;br /&gt;
The output of [[IRMP_-_english#top|IRMP]] is then as follows:&lt;br /&gt;
&lt;br /&gt;
            11111111000000001000000001111111 p =  2, a = 0x00ff, c = 0x0001, f = 0x00&lt;br /&gt;
&lt;br /&gt;
[[IRMP_-_english#top|IRMP]] identified the frame generated by [[IRSND_-_english#top|IRSND]] as protocol number 2, address 0x00FF and command 0x0001.&lt;br /&gt;
&lt;br /&gt;
 Under Linux/Windows, [[IRSND_-_english#top|IRSND]] always emulates a key press twice, with a wait between the frames. The output is therefore:&lt;br /&gt;
&lt;br /&gt;
            11111111000000001000000001111111 p =  2, a = 0x00ff, c = 0x0001, f = 0x00&lt;br /&gt;
            11111111000000001000000001111111 p =  2, a = 0x00ff, c = 0x0001, f = 0x00&lt;br /&gt;
&lt;br /&gt;
The reason is simple: This makes it easy to test whether [[IRSND_-_english#top|IRSND]] correctly handles the toggle bit used by some protocols:&lt;br /&gt;
&lt;br /&gt;
            ./irsnd-15kHz 7 2 3 0 | ./irmp-15kHz&lt;br /&gt;
            1100010000011 p= 7 (RC5), a=0x0002, c=0x0003, f=0x00  &#039;&#039;&#039;First key press&#039;&#039;&#039;&lt;br /&gt;
            1000010000011 p= 7 (RC5), a=0x0002, c=0x0003, f=0x00  &#039;&#039;&#039;Second key press&#039;&#039;&#039;&lt;br /&gt;
             ^&lt;br /&gt;
             Toggle bit&lt;br /&gt;
&lt;br /&gt;
Note: Depending on the protocol, the bit widths of addresses and commands can differ, see [[IRMP_-_english#IR_Protocols_in_Detail|IR Protocols in Detail]].&lt;br /&gt;
&lt;br /&gt;
Consequently, 16 bit addresses and commands cannot be transmitted transparently with every protocol.&lt;br /&gt;
&lt;br /&gt;
= Appendix =&lt;br /&gt;
&#039;&#039;&#039; &#039;&#039;&#039;&lt;br /&gt;
== Software History ==&lt;br /&gt;
&lt;br /&gt;
=== Changes to IRSND in 3.0.x ===&lt;br /&gt;
&lt;br /&gt;
Version 3.2.6:&lt;br /&gt;
&lt;br /&gt;
* 2021-01-27: &#039;&#039;&#039;New IR Protocol:&#039;&#039;&#039; [[IRMP#MELINERA|MELINERA]]&lt;br /&gt;
* 2021-01-27: Protocol [[IRMP#LEGO|LEGO]]: Improved timing&lt;br /&gt;
* 2021-01-27: Protocol [[IRMP#RUWIDO|RUWIDO]]: Improved timing&lt;br /&gt;
* 2021-01-27: Protocol [[IRMP#NEC|NEC]]: Implemented send of raw NEC reptition frames &lt;br /&gt;
&lt;br /&gt;
Version 3.2.5:&lt;br /&gt;
&lt;br /&gt;
* Modifications for Arduino&lt;br /&gt;
&lt;br /&gt;
Version 3.2.4:&lt;br /&gt;
&lt;br /&gt;
* changed some constants in irsnd.c&lt;br /&gt;
&lt;br /&gt;
Version 3.1.5:&lt;br /&gt;
&lt;br /&gt;
* 2019-08-28: New protocol: ONKYO&lt;br /&gt;
&lt;br /&gt;
Version 3.1.2:&lt;br /&gt;
&lt;br /&gt;
* 2018-09-06: Added support of STM32 with HAL library&lt;br /&gt;
&lt;br /&gt;
Version 3.0.9:&lt;br /&gt;
&lt;br /&gt;
* 2018-02-19: Minor changes&lt;br /&gt;
&lt;br /&gt;
Version 3.0.8:&lt;br /&gt;
&lt;br /&gt;
* 2017-08-25: New protocol: IRMP16 for transparent 16 bit data communication&lt;br /&gt;
&lt;br /&gt;
Version 3.0.2:&lt;br /&gt;
&lt;br /&gt;
* 2016-09-09: New protocol [[IRMP_-_english#MITSU_HEAVY|Mitsubishi Heavy (air conditioner)]]&lt;br /&gt;
* 2016-09-09: Some modifications for Compiler PIC C18&lt;br /&gt;
&lt;br /&gt;
Version 3.0.0:&lt;br /&gt;
&lt;br /&gt;
* Renamed example main file to irsnd-main-avr.c&lt;br /&gt;
&lt;br /&gt;
=== Older versions ===&lt;br /&gt;
&lt;br /&gt;
* 2015-11-17: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#BOSE|BOSE]]&lt;br /&gt;
* 2015-11-17: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#PANASONIC|PANASONIC (Beamer)]]&lt;br /&gt;
* 2015-11-17: Port to Teensy (3.x)&lt;br /&gt;
* 2015-09-20: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#TECHNICS|TECHNICS]]&lt;br /&gt;
* 2015-06-15: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#ACP24|ACP24]]&lt;br /&gt;
* 2015-05-28: Timing corrections for [[IRMP_-_english#FAN|FAN]] protocol&lt;br /&gt;
* 2015-05-27: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#MERLIN|MERLIN]]&lt;br /&gt;
* 2015-05-27: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#FAN|FAN]]&lt;br /&gt;
* 2015-05-18: Added F_CPU macro for STM32L1XX&lt;br /&gt;
* 2015-05-07: Some corrections of XMega port&lt;br /&gt;
* 2015-04-23: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#PENTAX|PENTAX]]&lt;br /&gt;
* 2015-04-23: Port to AVR XMega&lt;br /&gt;
* 2014-07-10: Some GPIO changes for STM32F10x (in IRSND).&lt;br /&gt;
* 2014-07-10: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#SAMSUNG48|SAMSUNG48]]&lt;br /&gt;
* 2014-06-23: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#LGAIR|LGAIR]]&lt;br /&gt;
* 2014-06-03: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#TELEFUNKEN|TELEFUNKEN]]&lt;br /&gt;
* 2014-05-30: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#SPEAKER|SPEAKER]]&lt;br /&gt;
* 2014-05-30: Optimized timings for [[IRMP_-_english#SAMSUNG|SAMSUNG]]&lt;br /&gt;
* 2014-02-20: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#SIEMENS_+_RUWIDO|RUWIDO]]&lt;br /&gt;
* 2013-04-09: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#ROOMBA|ROOMBA]]&lt;br /&gt;
* 2013-03-12: Allowed 15kHz for [[IRMP_-_english#RECS80|RECS80]] and  [[IRMP_-_english#RECS80EXT|RECS80EXT]]&lt;br /&gt;
* 2013-01-17: Added support for ATtiny44&lt;br /&gt;
* 2012-12-12: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#A1TVBOX|A1TVBOX]]&lt;br /&gt;
* 2012-12-07: Corrected timing of [[IRMP_-_english#NIKON|NIKON]] protocol&lt;br /&gt;
* 2012-10-26: Some timer corrections, adaptions to Arduino&lt;br /&gt;
* 2012-06-18: Added support ATtiny87/167&lt;br /&gt;
* 2012-06-05: Corrected port to ARM STM32 - now tested&lt;br /&gt;
* 2012-05-23: Port to ARM STM32 (untested!)&lt;br /&gt;
* 2012-05-23: Bugfix timing for 2nd frame of Denon protocol&lt;br /&gt;
* 2012-02-27: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#IR60 (SDA2008)|IR60 (SDA2008)]]&lt;br /&gt;
* 2012-02-27: Bugfix sending [[IRMP_-_english#Biphase|Biphase]] frames (Manchester)&lt;br /&gt;
* 2012-02-27: Port to C18 Compiler for PIC microcontrollers&lt;br /&gt;
* 2012-02-15: Bugfix: only the 1st Frame has been sended&lt;br /&gt;
* 2012-02-13: Timing corrections of [[IRMP_-_english#SAMSUNG|SAMSUNG]] and [[IRMP_-_english#SAMSUNG32|SAMSUNG32]]&lt;br /&gt;
* 2012-02-13: [[IRMP_-_english#KASEIKYO|KASEIKYO]]: Genre2 bits will be now stored in upper nibble of flags&lt;br /&gt;
* 2012-02-13: Additinak pause after sending the last frame&lt;br /&gt;
* 2011-09-20: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#THOMSON|THOMSON]]&lt;br /&gt;
* 2011-09-20: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#LEGO|LEGO]]&lt;br /&gt;
* 2011-09-20: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#NEC16|NEC16]]&lt;br /&gt;
* 2011-09-20: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#NEC42|NEC42]]&lt;br /&gt;
* 2011-09-20: Port to ATtiny84 und ATtiny85&lt;br /&gt;
* 2011-09-20: Some corrections for pause lengths&lt;br /&gt;
* 2011-09-20: Some corrections of irsnd_stop()&lt;br /&gt;
* 2011-09-20: Corrected: [[IRMP_-_english#SIEMENS_+_RUWIDO|SIEMENS]] timings&lt;br /&gt;
* 2011-09-20: Changed [[IRMP_-_english#DENON|DENON]] protocol to 36kHz modulation frequency&lt;br /&gt;
* 2011-09-20: Corrected Handling of additional bits in [[IRMP_-_english#SIRCS|SIRCS]] protocol&lt;br /&gt;
* 2011-01-18: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#RC6_+_RC6A|RC6A]]&lt;br /&gt;
* 2011-01-18: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#RC6_+_RC6A|RC6]]&lt;br /&gt;
* 2011-01-18: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#NIKON|NIKON]]&lt;br /&gt;
* 2011-01-18: Handling of additional bits (&amp;gt;12) in [[IRMP_-_english#SIRCS|SIRCS]] protocol&lt;br /&gt;
* 2011-01-18: Corrected some pause lengths&lt;br /&gt;
* 2011-01-18: timing corrections for [[IRMP_-_english#DENON|DENON]] protocol&lt;br /&gt;
&lt;br /&gt;
* 2010-09-02: New protocol: [[IRMP_-_english#JVC|JVC]]&lt;br /&gt;
* 2010-09-02: Corrected [[IRMP_-_english#APPLE|APPLE]] encoder - now compatible to IRMP-Version 1.7.3.&lt;br /&gt;
&lt;br /&gt;
* 2010-08-29: New protocol: [[IRMP_-_english#KASEIKYO|KASEIKYO]]&lt;br /&gt;
&lt;br /&gt;
* 2010-07-01: Bugfix: deactivating of [[IRMP_-_english#RECS80|RECS80]], [[IRMP_-_english#RECS80EXT|RECS80EXT]] &amp;amp; [[IRMP_-_english#SIEMENS_+_RUWIDO|SIEMENS]], if interrupt frequency is too low&lt;br /&gt;
&lt;br /&gt;
* 2010-06-25: New protocol: [[IRMP_-_english#RCCAR|RCCAR]]&lt;br /&gt;
&lt;br /&gt;
* 2010-06-09: New protocol: [[IRMP_-_english#FDC|FDC]] (IR-keyboard)&lt;br /&gt;
* 2010-06-09: Corrected timing for [[IRMP_-_english#DENON|DENON]] protocol&lt;br /&gt;
&lt;br /&gt;
* 2010-06-02: New protocol: [[IRMP_-_english#SIEMENS_+_RUWIDO|SIEMENS]] (Gigaset)&lt;br /&gt;
* 2010-06-02: Simulation of long key presses&lt;br /&gt;
&lt;br /&gt;
* 2010-05-26: New protocol: [[IRMP_-_english#GRUNDIG_+_NOKIA|NOKIA]]&lt;br /&gt;
&lt;br /&gt;
* 2010-05-17: New protocol: [[IRMP_-_english#GRUNDIG_+_NOKIA|GRUNDIG]]&lt;br /&gt;
* 2010-05-17: Handling of frame repetitions for [[IRMP_-_english#SIRCS|SIRCS]], [[IRMP_-_english#SAMSUNG32|SAMSUNG32]], and [[IRMP_-_english#NUBERT|NUBERT]]&lt;br /&gt;
&lt;br /&gt;
* 2010-04-28: Support of [[IRMP_-_english#APPLE|APPLE]] protocol&lt;br /&gt;
* 2010-04-28: added configuration by [http://www.mikrocontroller.net/svnbrowser/irmp/irsndconfig.h?view=markup irsndconfig.h]&lt;br /&gt;
&lt;br /&gt;
* 2010-04-16: Optimized all timing tolerancies&lt;br /&gt;
&lt;br /&gt;
* 2010-04-14: New protocol: [[IRMP_-_english#B&amp;amp;O|Bang &amp;amp; Olufsen]]&lt;br /&gt;
&lt;br /&gt;
* 2010-03-17: New protocol: [[IRMP_-_english#NUBERT|NUBERT]]&lt;br /&gt;
* 2010-03-17: Corrected length of pauses between frame repetitions&lt;br /&gt;
&lt;br /&gt;
* 2010-03-16: Corrected timer register TCCR2&lt;br /&gt;
* 2010-03-16: Corrected [[IRMP_-_english#RECS80|RECS80]] start bit timings&lt;br /&gt;
* 2010-03-16: New protocol: [[IRMP_-_english#RECS80EXT|RECS80 Extended]]&lt;br /&gt;
&lt;br /&gt;
* 2010-03-11: Adapted code to several ATMega types&lt;br /&gt;
&lt;br /&gt;
* 2010-03-07: Alpha version&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Infrarot]]&lt;br /&gt;
[[Kategorie:AVR-Projekte]]&lt;/div&gt;</summary>
		<author><name>Tooki</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=IRSND_-_english&amp;diff=106083</id>
		<title>IRSND - english</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=IRSND_-_english&amp;diff=106083"/>
		<updated>2023-04-26T09:56:07Z</updated>

		<summary type="html">&lt;p&gt;Tooki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;By &#039;&#039;&#039;Frank M. ([http://www.mikrocontroller.net/user/show/ukw ukw])&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;This is the English translation of the [[IRSND#top|german ISRND documentation]].&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= IRSND - Infrared Multi Protocol Encoder =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[[Datei:irmp-title.png| |Waveform of an NEC-format remote control signal]]&lt;br /&gt;
&lt;br /&gt;
[[IRSND_-_english#top|IRSND]] is the counterpart to [[IRMP_-_english#top|IRMP]]. [[IRSND_-_english#top|IRSND]] encodes and transmits IR frames.&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
[[Datei:irsnd-sender.png|miniatur|A simple IR transmitter connected to a microcontroller.]]&lt;br /&gt;
&lt;br /&gt;
[[IRSND_-_english#top|IRSND]] is the counterpart to [[IRMP_-_english#top|IRMP]]: it reproduces the original IR frame from data received by [[IRMP_-_english#top|IRMP]], which can then be transmitted over an IR emitter.&lt;br /&gt;
&lt;br /&gt;
== Supported MCUs ==&lt;br /&gt;
&lt;br /&gt;
[[IRSND_-_english#top|IRSND]] runs on numerous MCU families:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AVR&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* ATtiny87,  ATtiny167&lt;br /&gt;
* ATtiny45,  ATtiny85&lt;br /&gt;
* ATtiny44,  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;
&#039;&#039;&#039;XMega&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* ATXmega128&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC&#039;&#039;&#039; (C18 Compiler)&lt;br /&gt;
&lt;br /&gt;
* PIC12F1840&lt;br /&gt;
* PIC18F4520&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;STM32&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* STM32F4xx&lt;br /&gt;
* STM32F10x&lt;br /&gt;
* STM32 with HAL library &#039;&#039;&#039;(NEW!)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TEENSY 3.0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* MK20DX256VLH7 (ARM Cortex-M4 72MHz)&lt;br /&gt;
&lt;br /&gt;
== Supported Protocols ==&lt;br /&gt;
&lt;br /&gt;
[[IRSND_-_english#top|IRSND]] supports the following IR protocols:&lt;br /&gt;
&lt;br /&gt;
* [[IRMP_-_english#A1TVBOX|A1TVBOX]]&lt;br /&gt;
* [[IRMP_-_english#AP24|ACP24]] &#039;&#039;&#039;(NEW!)&#039;&#039;&#039;&lt;br /&gt;
* [[IRMP_-_english#APPLE|APPLE]]&lt;br /&gt;
* [[IRMP_-_english#B&amp;amp;O|BANG_OLUFSON]]&lt;br /&gt;
* [[IRMP_-_english#BOSE|BOSE]] &#039;&#039;&#039;(NEW!)&#039;&#039;&#039;&lt;br /&gt;
* [[IRMP_-_english#DENON|DENON]]&lt;br /&gt;
* [[IRMP_-_english#FAN|FAN]] &#039;&#039;&#039;(NEW!)&#039;&#039;&#039;&lt;br /&gt;
* [[IRMP_-_english#FDC|FDC]] (minimum ~15kHz)&lt;br /&gt;
* [[IRMP_-_english#GRUNDIG_+_NOKIA|GRUNDIG]]&lt;br /&gt;
* [[IRMP_-_english#IR60 (SDA2008)|IR60 (SDA2008)]]&lt;br /&gt;
* [[IRMP_-_english#JVC|JVC]]&lt;br /&gt;
* [[IRMP_-_english#KASEIKYO|KASEIKYO]]&lt;br /&gt;
* [[IRMP_-_english#LEGO|LEGO]]&lt;br /&gt;
* [[IRMP_-_english#LGAIR|LGAIR]]&lt;br /&gt;
* [[IRMP_-_english#MATSUSHITA|MATSUSHITA]]&lt;br /&gt;
* [[IRMP_-_english#NEC_+_extended_NEC|NEC]]&lt;br /&gt;
* [[IRMP_-_english#NEC16|NEC16]]&lt;br /&gt;
* [[IRMP_-_english#NEC42|NEC42]]&lt;br /&gt;
* [[IRMP_-_english#NIKON|NIKON]]&lt;br /&gt;
* [[IRMP_-_english#GRUNDIG_+_NOKIA|NOKIA]]&lt;br /&gt;
* [[IRMP_-_english#NUBERT|NUBERT]]&lt;br /&gt;
* [[IRMP_-_english#PANASONIC|PANASONIC (Beamer)]] &#039;&#039;&#039;(NEW!)&#039;&#039;&#039;&lt;br /&gt;
* [[IRMP_-_english#PENTAX|PENTAX]] &#039;&#039;&#039;(NEW!)&#039;&#039;&#039;&lt;br /&gt;
* [[IRMP_-_english#RC5_+_RC5X|RC5]]&lt;br /&gt;
* [[IRMP_-_english#RC6_+_RC6A|RC6]]&lt;br /&gt;
* [[IRMP_-_english#RC6_+_RC6A|RC6A]]&lt;br /&gt;
* [[IRMP_-_english#RCCAR|RCCAR]] (minimum  ~15kHz)&lt;br /&gt;
* [[IRMP_-_english#RECS80|RECS80]] (bei mind. ~20kHz)&lt;br /&gt;
* [[IRMP_-_english#RECS80EXT|RECS80EXT]] (minimum  ~20kHz)&lt;br /&gt;
* [[IRMP_-_english#ROOMBA|ROOMBA]]&lt;br /&gt;
* [[IRMP_-_english#SAMSUNG|SAMSUNG]]&lt;br /&gt;
* [[IRMP_-_english#SAMSUNG32|SAMSUNG32]]&lt;br /&gt;
* [[IRMP_-_english#SAMSUNG48|SAMSUNG48]]&lt;br /&gt;
* [[IRMP_-_english#SIEMENS_+_RUWIDO|SIEMENS]] (minimum ~15kHz)&lt;br /&gt;
* [[IRMP_-_english#SPEAKER|SPEAKER]]&lt;br /&gt;
* [[IRMP_-_english#TELEFUNKEN|TELEFUNKEN]]&lt;br /&gt;
* [[IRMP_-_english#THOMSON|THOMSON]]&lt;br /&gt;
* [[IRMP_-_english#SIRCS|SIRCS]]&lt;br /&gt;
&lt;br /&gt;
[[IRSND_-_english#top|IRSND]] does &#039;&#039;&#039;NOT&#039;&#039;&#039; yet support the following protocols:&lt;br /&gt;
&lt;br /&gt;
* [[IRMP_-_english#KATHREIN|KATHREIN]]&lt;br /&gt;
* [[IRMP_-_english#NETBOX|NETBOX]]&lt;br /&gt;
* [[IRMP_-_english#ORTEK|ORTEK]]&lt;br /&gt;
* [[IRMP_-_english#RCMM|RCMM]]&lt;br /&gt;
* [[IRMP_-_english#MERLIN|MERLIN]]&lt;br /&gt;
&lt;br /&gt;
== Download ==&lt;br /&gt;
&lt;br /&gt;
Version 3.2.6, Date: 2021-01-27&lt;br /&gt;
&lt;br /&gt;
Download stable version: [http://www.mikrocontroller.net/wikifiles/c/c7/Irsnd.zip Irsnd.zip] &lt;br /&gt;
&lt;br /&gt;
[[IRMP_-_english#top|IRMP]] &amp;amp; [[IRSND_-_english#top|IRSND]] is also available by SVN: [http://www.mikrocontroller.net/svnbrowser/irmp/ IRMP in SVN]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;You can see the history of the software changes here: [[IRSND_-_english#Software_History|Software History]]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Source Code ==&lt;br /&gt;
&lt;br /&gt;
The source code can be easily compiled for AVR MCUs by loading the project file irsnd.aps in AVR Studio 4. &lt;br /&gt;
&lt;br /&gt;
For other development environments it is simple to create a project or makefile. The source includes:&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irsnd.c?view=markup irsnd.c] - the IR encoder core&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmpprotocols.h?view=markup irmpprotocols.h] - all protocol definitions&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmpsystem.h?view=markup irmpsystem.h] - target-dependent definitions for AVR/PIC/STM32&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irsnd.h?view=markup irsnd.h] - include file for the application&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irsndconfig.h?view=markup irsndconfig.h] - user configuration&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irsnd-main-avr.c?view=markup irsnd-main-avr.c] - example main&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IMPORTANT:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Include only [http://www.mikrocontroller.net/svnbrowser/irmp/irsnd.h?view=markup irsnd.h] in your application source code:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;irsnd.h&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
All other include files are included within [http://www.mikrocontroller.net/svnbrowser/irmp/irsnd.h?view=markup irsnd.h]. See also the sample application [http://www.mikrocontroller.net/svnbrowser/irmp/irsnd-main-avr.c?view=markup irsnd-main-avr.c].&lt;br /&gt;
&lt;br /&gt;
[[IRSND_-_english#top|IRSND]] encodes all protocols listed above in an interrupt service routine (ISR), see also [http://www.mikrocontroller.net/svnbrowser/irmp/irsnd.c?view=markup irsnd.c].&lt;br /&gt;
&lt;br /&gt;
=== Settings in irsndconfig.h ===&lt;br /&gt;
&lt;br /&gt;
==== F_INTERRUPTS ====&lt;br /&gt;
&lt;br /&gt;
Number of interrupts per second. The value can be set to a value between 10000 and 20000.&lt;br /&gt;
&lt;br /&gt;
Default value:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define F_INTERRUPTS                            15000      // interrupts per second&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== IRSND_SUPPORT_xxx_PROTOCOL ====&lt;br /&gt;
&lt;br /&gt;
Here you can select which protocols to enable in [[IRSND_-_english#top|IRSND]]. Common protocols are emabled by default. To enable additional protocols or disable others to save memory, set the corresponding values in [http://www.mikrocontroller.net/svnbrowser/irmp/irsndconfig.h?view=markup irsndconfig.h].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&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                 ~200 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                 ~300 bytes&lt;br /&gt;
&lt;br /&gt;
// more protocols, enable here!                 Enable  Remarks                 F_INTERRUPTS            Program Space&lt;br /&gt;
#define IRSND_SUPPORT_DENON_PROTOCOL            0       // DENON, Sharp         &amp;gt;= 10000                 ~200 bytes&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 (SDA2008)       &amp;gt;= 10000                 ~250 bytes&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;= 15000                 ~100 bytes&lt;br /&gt;
#define IRSND_SUPPORT_RECS80EXT_PROTOCOL        0       // RECS80EXT            &amp;gt;= 15000                 ~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_ROOMBA_PROTOCOL           0       // iRobot Roomba        &amp;gt;= 10000                 ~150 bytes&lt;br /&gt;
#define IRSND_SUPPORT_RUWIDO_PROTOCOL           0       // RUWIDO, T-Home       &amp;gt;= 15000                 ~250 bytes&lt;br /&gt;
#define IRSND_SUPPORT_A1TVBOX_PROTOCOL          0       // A1 TV BOX            &amp;gt;= 15000 (better 20000)  ~200 bytes&lt;br /&gt;
#define IRSND_SUPPORT_LEGO_PROTOCOL             0       // LEGO Power RC        &amp;gt;= 20000                 ~150 bytes&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To enable a protocol, set it to 1, to disable it, set it to 0. Disabled protocols will not be compiled. This saves program space in Flash. (See code comments above.) Refer to the article [[IRMP_-_english|IRMP]] for more tips on saving memory if absolutely necessary.&lt;br /&gt;
&lt;br /&gt;
When using the [[IRMP_-_english#APPLE|APPLE]] protocol, set IRSND_SUPPORT_NEC_PROTOCOL to 1, since it is simply a special case of the [[IRMP_-_english#NEC_+_extended_NEC|NEC]] protocol.&lt;br /&gt;
&lt;br /&gt;
==== IRSND_OCx ====&lt;br /&gt;
&lt;br /&gt;
To transmit IR signals, [[IRSND_-_english#top|IRSND]] needs a PWM-capable output pin, because the signal needs to be modulated. The following settings are possible:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Default value:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define IRSND_OCx                               IRSND_OC2B&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For PIC and STM32 MCUs use the appropriate values, see comments in [http://www.mikrocontroller.net/svnbrowser/irmp/irsndconfig.h?view=markup irsndconfig.h].&lt;br /&gt;
&lt;br /&gt;
==== IRSND_USE_CALLBACK ====&lt;br /&gt;
&lt;br /&gt;
Default value:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define IRSND_USE_CALLBACK                      0       // flag: 0 = don&#039;t use callbacks, 1 = use callbacks, default is 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If callbacks are enabled, your callback functions will be called whenever the IR signal changes (IR modulation on/off). This can by used to output an unmodulated signal on another pin, for example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define LED_PORT PORTD                                  // LED at PD6&lt;br /&gt;
#define LED_DDR  DDRD&lt;br /&gt;
#define LED_PIN  6&lt;br /&gt;
&lt;br /&gt;
/*-----------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
 * Called (back) from IRSND module&lt;br /&gt;
 * This example switches a LED (which is connected to Vcc)&lt;br /&gt;
 *-----------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
 */&lt;br /&gt;
void&lt;br /&gt;
led_callback (uint8_t on)&lt;br /&gt;
{&lt;br /&gt;
    if (on)&lt;br /&gt;
    {&lt;br /&gt;
       LED_PORT &amp;amp;= ~(1 &amp;lt;&amp;lt; LED_PIN);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
       LED_PORT |= (1 &amp;lt;&amp;lt; LED_PIN);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int&lt;br /&gt;
main ()&lt;br /&gt;
{&lt;br /&gt;
    ...&lt;br /&gt;
    LED_DDR |= (1 &amp;lt;&amp;lt; LED_PIN);         // LED pin to output&lt;br /&gt;
    LED_PORT |= (1 &amp;lt;&amp;lt; LED_PIN);        // switch LED off (active low)&lt;br /&gt;
    irsnd_init ();&lt;br /&gt;
    irsnd_set_callback_ptr (led_callback);&lt;br /&gt;
    sei ();&lt;br /&gt;
    ...&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Using IRSND ==&lt;br /&gt;
&lt;br /&gt;
[[IRSND_-_english#top|IRSND]] assembles the frame to be transmitted on the fly from the IRMP data structure. It includes:&lt;br /&gt;
&lt;br /&gt;
 1. ID for the protocol in use&lt;br /&gt;
 2. Address or vendor code&lt;br /&gt;
 3. Command&lt;br /&gt;
&lt;br /&gt;
To transmit the IR frame, call the function&lt;br /&gt;
&lt;br /&gt;
   irsnd_send_data (IRMP_DATA * irmp_data_p)&lt;br /&gt;
&lt;br /&gt;
The return value is 1 if the frame can be successfully transmitted, otherwise 0. In the first case the struct members&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
are read and then transmitted as a frame in the selected IR protocol.&lt;br /&gt;
&lt;br /&gt;
irmp_data_p-&amp;gt;flags specifies the number of repetitions, e.g.&lt;br /&gt;
&lt;br /&gt;
  irmp_data_p-&amp;gt;flags = 0: no repetition&lt;br /&gt;
  irmp_data_p-&amp;gt;flags = 1: 1 repetition&lt;br /&gt;
  irmp_data_p-&amp;gt;flags = 2: 2 repetitions&lt;br /&gt;
  usw.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important: Make sure that irmp_data_p-&amp;gt;flags has a defined value before calling irsnd_send_data()!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
   IRMP_DATA irmp_data;&lt;br /&gt;
&lt;br /&gt;
   irmp_data.protocol = IRMP_NEC_PROTOCOL;       // use NEC protocol&lt;br /&gt;
   irmp_data.address  = 0x00FF;                  // use address 0x00FF&lt;br /&gt;
   irmp_data.command  = 0x0001;                  // use command 0001&lt;br /&gt;
   irmp_data.flags    = 0;                       // no repetition!&lt;br /&gt;
&lt;br /&gt;
   (void) irsnd_send_data (&amp;amp;irmp_data, FALSE);   // transmit, don&#039;t wait&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The frame will be transmitted asynchronously by the interrupt routine irsnd_ISR(), so  the function irsnd_send_data() returns immediately. When repetitions are specified, depending on the protocol, the frame will be repeated after a wait specified in the protocol, or  a protocol-specific repeat frame (e.g. for NEC) will be sent.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== NEC Repeat Frames ===&lt;br /&gt;
&lt;br /&gt;
IRSND normally transmits repeat frames itself, according to the number of repetitions specified in the flags. (See above.)&lt;br /&gt;
&lt;br /&gt;
Starting with version 3.2.6 and specifically for the NEC protocol, repeat frames can be transmitted on their own. This is useful for IR repeaters in particular.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following flags must be set:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
   IRMP_DATA irmp_data;&lt;br /&gt;
&lt;br /&gt;
   irmp_data.protocol = IRMP_NEC_PROTOCOL;           // use NEC protocl&lt;br /&gt;
   irmp_data.address  = 0x00FF;                      // address is ignored&lt;br /&gt;
   irmp_data.command  = 0x0001;                      // command is ignored&lt;br /&gt;
   irmp_data.flags    = IRSND_RAW_REPETITION_FRAME;  // transmit NEC repeat frame&lt;br /&gt;
&lt;br /&gt;
   (void) irsnd_send_data (&amp;amp;irmp_data, TRUE);        // transmit and wait&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Multiple repeat frames can be transmitted by setting a repetition value as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
   irmp_data.flags    = IRSND_RAW_REPETITION_FRAME | 0x02;  // transmit NEC repeat frame and repeat 2 more times&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Up to 14 repetitions can be set, so up to 15 repeat frames.&lt;br /&gt;
&lt;br /&gt;
=== Waits ===&lt;br /&gt;
&lt;br /&gt;
When irsnd_send_data() is called again, it waits until the preceding frame has been transmitted completely. You can test whether [[IRSND_-_english#top|IRSND]] is busy or not:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
   while (irsnd_is_busy ())&lt;br /&gt;
   {&lt;br /&gt;
      ;                                          // wait here or do something else...&lt;br /&gt;
   }&lt;br /&gt;
   (void) irsnd_send_data (&amp;amp;irmp_data, FALSE);   // transmit without testing and without waiting&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When irsnd_send_data() is called with TRUE as the second argument, the function only returns once the frame has been transmitted completely.&lt;br /&gt;
&lt;br /&gt;
In the example source irsnd-main-avr.c, in addition to how to use irsnd_send_data(), the [[AVR-GCC-Tutorial/Die_Timer_und_Zähler_des_AVR|timer]] call is also demonstrated:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Using IRMP and IRSND Simultaneously ===&lt;br /&gt;
&lt;br /&gt;
To use [[IRMP_-_english#top|IRMP]] and [[IRSND_-_english#top|IRSND]] at the same time (that is, both transmitter and receiver), the ISR function should read as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This causes the receiver ISR to be called only when irsnd_ISR() is idle, and thus the receiver is disabled while irsnd_ISR() is transmitting data. &lt;br /&gt;
&lt;br /&gt;
The [[AVR-GCC-Tutorial/Die_Timer_und_Zähler_des_AVR|timer]] initialization routine is identical for [[IRMP_-_english#top|IRMP]] and [[IRSND_-_english#top|IRSND]].&lt;br /&gt;
&lt;br /&gt;
A combined main function could look like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
What the code above does is obvious: A received frame is fully decoded, then reencoded and finally transmitted with the IR emitting diode. This can be used to transmit signals around a corner, or extend them over a wire. &lt;br /&gt;
&lt;br /&gt;
Another application is protocol translation, for example to convert NEC frames to RC5 to substitute a lost RC5 remote control.&lt;br /&gt;
&lt;br /&gt;
Other uses are left to the reader&#039;s imagination. ;-)&lt;br /&gt;
&lt;br /&gt;
Here the possible values for irmp_data.protocol, see also  [http://www.mikrocontroller.net/svnbrowser/irmp/irmpprotocols.h?view=markup irmpprotocols.h]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&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 Media Receiver&lt;br /&gt;
#define IRMP_IR60_PROTOCOL                      24              // IR60 (SDA2008)&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;
#define IRMP_BOSE_PROTOCOL                      31              // BOSE&lt;br /&gt;
#define IRMP_A1TVBOX_PROTOCOL                   32              // A1 TV Box&lt;br /&gt;
#define IRMP_ORTEK_PROTOCOL                     33              // ORTEK - Hama&lt;br /&gt;
#define IRMP_TELEFUNKEN_PROTOCOL                34              // Telefunken (1560)&lt;br /&gt;
#define IRMP_ROOMBA_PROTOCOL                    35              // iRobot Roomba vacuum cleaner&lt;br /&gt;
#define IRMP_RCMM32_PROTOCOL                    36              // Fujitsu-Siemens (Activy remote control)&lt;br /&gt;
#define IRMP_RCMM24_PROTOCOL                    37              // Fujitsu-Siemens (Activy keyboard)&lt;br /&gt;
#define IRMP_RCMM12_PROTOCOL                    38              // Fujitsu-Siemens (Activy keyboard)&lt;br /&gt;
#define IRMP_SPEAKER_PROTOCOL                   39              // Another loudspeaker protocol, similar to Nubert&lt;br /&gt;
#define IRMP_LGAIR_PROTOCOL                     40              // LG air conditioner&lt;br /&gt;
#define IRMP_SAMSUNG48_PROTOCOL                 41              // air conditioner with SAMSUNG protocol (48 bits)&lt;br /&gt;
#define IRMP_MERLIN_PROTOCOL                    42              // Merlin (Pollin 620 185)&lt;br /&gt;
#define IRMP_PENTAX_PROTOCOL                    43              // Pentax camera&lt;br /&gt;
#define IRMP_FAN_PROTOCOL                       44              // FAN (ventilator), very similar to NUBERT, but last bit is data bit instead of stop bit&lt;br /&gt;
#define IRMP_S100_PROTOCOL                      45              // very similar to RC5, but 14 instead of 13 data bits&lt;br /&gt;
#define IRMP_ACP24_PROTOCOL                     46              // Stiebel Eltron ACP24 air conditioner&lt;br /&gt;
#define IRMP_TECHNICS_PROTOCOL                  47              // Technics, similar to Matsushita, but 22 instead of 24 bits&lt;br /&gt;
#define IRMP_PANASONIC_PROTOCOL                 48              // Panasonic (video projector), start bits similar to KASEIKYO&lt;br /&gt;
#define IRMP_MITSU_HEAVY_PROTOCOL               49              // Mitsubishi heavy air conditioner, similar timing to Panasonic video projector&lt;br /&gt;
#define IRMP_VINCENT_PROTOCOL                   50              // Vincent&lt;br /&gt;
#define IRMP_SAMSUNGAH_PROTOCOL                 51              // SAMSUNG AH&lt;br /&gt;
#define IRMP_IRMP16_PROTOCOL                    52              // IRMP specific protocol for data transfer, e.g. between two microcontrollers via IR&lt;br /&gt;
#define IRMP_GREE_PROTOCOL                      53              // Gree climate&lt;br /&gt;
#define IRMP_RCII_PROTOCOL                      54              // RC II Infrared Remote Control Protocol for FM8&lt;br /&gt;
#define IRMP_METZ_PROTOCOL                      55              // METZ&lt;br /&gt;
#define IRMP_ONKYO_PROTOCOL                     56              // Onkyo&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The best way to determine the address and command codes is to use [[IRMP_-_english|IRMP]], see above ;-)&lt;br /&gt;
&lt;br /&gt;
== IRSND under Linux and Windows ==&lt;br /&gt;
&lt;br /&gt;
=== Compiling IRSND ===&lt;br /&gt;
&lt;br /&gt;
 [http://www.mikrocontroller.net/svnbrowser/irmp/irsnd.c?view=markup irsnd.c] can be compiled under Linux to create frames in the same format as the IRMP scan files. Simply enter:&lt;br /&gt;
&lt;br /&gt;
    make -f makefile.unx&lt;br /&gt;
&lt;br /&gt;
=== Starting IRSND ===&lt;br /&gt;
&lt;br /&gt;
To start IRSND, enter:&lt;br /&gt;
&lt;br /&gt;
    ./irsnd protocol-number hex-address hex-command [repeat] &amp;gt; filename.txt&lt;br /&gt;
&lt;br /&gt;
Example for NEC protocol, address 0x00FF, command 0x0001:&lt;br /&gt;
&lt;br /&gt;
    ./irsnd 2 00FF 0001 &amp;gt; nec.txt                   # start irsnd&lt;br /&gt;
&lt;br /&gt;
=== IRSND under Windows ===&lt;br /&gt;
&lt;br /&gt;
You can also use [[IRSND_-_english#top|IRSND]] under Windows:&lt;br /&gt;
&lt;br /&gt;
* start the command line console&lt;br /&gt;
* change to the IRSND directory&lt;br /&gt;
* enter:&lt;br /&gt;
&lt;br /&gt;
            irsnd.exe 2 00FF 0001 &amp;gt; nec.txt&lt;br /&gt;
&lt;br /&gt;
You can then use [[IRMP_-_english#top|IRMP]] to check whether the frame generated by IRSND is correct:&lt;br /&gt;
&lt;br /&gt;
            ./irmp-15kHz &amp;lt; nec.txt&lt;br /&gt;
&lt;br /&gt;
or under Windows:&lt;br /&gt;
&lt;br /&gt;
            irmp.exe &amp;lt; nec.txt&lt;br /&gt;
&lt;br /&gt;
It also works without using an intermediate file, e.g.:&lt;br /&gt;
&lt;br /&gt;
            ./irsnd-15kHz 2 00FF 0001 | ./irmp-15kHz&lt;br /&gt;
&lt;br /&gt;
or under Windows:&lt;br /&gt;
&lt;br /&gt;
            irsnd.exe 2 00FF 0001 | irmp.exe&lt;br /&gt;
&lt;br /&gt;
The output of [[IRMP_-_english#top|IRMP]] is then as follows:&lt;br /&gt;
&lt;br /&gt;
            11111111000000001000000001111111 p =  2, a = 0x00ff, c = 0x0001, f = 0x00&lt;br /&gt;
&lt;br /&gt;
[[IRMP_-_english#top|IRMP]] identified the frame generated by [[IRSND_-_english#top|IRSND]] as protocol number 2, address 0x00FF and command 0x0001.&lt;br /&gt;
&lt;br /&gt;
 Under Linux/Windows, [[IRSND_-_english#top|IRSND]] always emulates a key press twice, with a wait between the frames. The output is therefore:&lt;br /&gt;
&lt;br /&gt;
            11111111000000001000000001111111 p =  2, a = 0x00ff, c = 0x0001, f = 0x00&lt;br /&gt;
            11111111000000001000000001111111 p =  2, a = 0x00ff, c = 0x0001, f = 0x00&lt;br /&gt;
&lt;br /&gt;
The reason is simple: This makes it easy to test whether [[IRSND_-_english#top|IRSND]] correctly handles the toggle bit used by some protocols:&lt;br /&gt;
&lt;br /&gt;
            ./irsnd-15kHz 7 2 3 0 | ./irmp-15kHz&lt;br /&gt;
            1100010000011 p= 7 (RC5), a=0x0002, c=0x0003, f=0x00  &#039;&#039;&#039;First key press&#039;&#039;&#039;&lt;br /&gt;
            1000010000011 p= 7 (RC5), a=0x0002, c=0x0003, f=0x00  &#039;&#039;&#039;Second key press&#039;&#039;&#039;&lt;br /&gt;
             ^&lt;br /&gt;
             Toggle bit&lt;br /&gt;
&lt;br /&gt;
Note: Depending on the protocol, the bit widths of addresses and commands can differ, see [[IRMP_-_english#IR_Protocols_in_Detail|IR Protocols in Detail]].&lt;br /&gt;
&lt;br /&gt;
Consequently, 16 bit addresses and commands cannot be transmitted transparently with every protocol.&lt;br /&gt;
&lt;br /&gt;
= Appendix =&lt;br /&gt;
&#039;&#039;&#039; &#039;&#039;&#039;&lt;br /&gt;
== Software History ==&lt;br /&gt;
&lt;br /&gt;
=== Changes to IRSND in 3.0.x ===&lt;br /&gt;
&lt;br /&gt;
Version 3.2.6:&lt;br /&gt;
&lt;br /&gt;
* 2021-01-27: &#039;&#039;&#039;New IR Protocol:&#039;&#039;&#039; [[IRMP#MELINERA|MELINERA]]&lt;br /&gt;
* 2021-01-27: Protocol [[IRMP#LEGO|LEGO]]: Improved timing&lt;br /&gt;
* 2021-01-27: Protocol [[IRMP#RUWIDO|RUWIDO]]: Improved timing&lt;br /&gt;
* 2021-01-27: Protocol [[IRMP#NEC|NEC]]: Implemented send of raw NEC reptition frames &lt;br /&gt;
&lt;br /&gt;
Version 3.2.5:&lt;br /&gt;
&lt;br /&gt;
* Modifications for Arduino&lt;br /&gt;
&lt;br /&gt;
Version 3.2.4:&lt;br /&gt;
&lt;br /&gt;
* changed some constants in irsnd.c&lt;br /&gt;
&lt;br /&gt;
Version 3.1.5:&lt;br /&gt;
&lt;br /&gt;
* 2019-08-28: New protocol: ONKYO&lt;br /&gt;
&lt;br /&gt;
Version 3.1.2:&lt;br /&gt;
&lt;br /&gt;
* 2018-09-06: Added support of STM32 with HAL library&lt;br /&gt;
&lt;br /&gt;
Version 3.0.9:&lt;br /&gt;
&lt;br /&gt;
* 2018-02-19: Minor changes&lt;br /&gt;
&lt;br /&gt;
Version 3.0.8:&lt;br /&gt;
&lt;br /&gt;
* 2017-08-25: New protocol: IRMP16 for transparent 16 bit data communication&lt;br /&gt;
&lt;br /&gt;
Version 3.0.2:&lt;br /&gt;
&lt;br /&gt;
* 2016-09-09: New protocol [[IRMP_-_english#MITSU_HEAVY|Mitsubishi Heavy (air conditioner)]]&lt;br /&gt;
* 2016-09-09: Some modifications for Compiler PIC C18&lt;br /&gt;
&lt;br /&gt;
Version 3.0.0:&lt;br /&gt;
&lt;br /&gt;
* Renamed example main file to irsnd-main-avr.c&lt;br /&gt;
&lt;br /&gt;
=== Older versions ===&lt;br /&gt;
&lt;br /&gt;
* 2015-11-17: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#BOSE|BOSE]]&lt;br /&gt;
* 2015-11-17: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#PANASONIC|PANASONIC (Beamer)]]&lt;br /&gt;
* 2015-11-17: Port to Teensy (3.x)&lt;br /&gt;
* 2015-09-20: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#TECHNICS|TECHNICS]]&lt;br /&gt;
* 2015-06-15: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#ACP24|ACP24]]&lt;br /&gt;
* 2015-05-28: Timing corrections for [[IRMP_-_english#FAN|FAN]] protocol&lt;br /&gt;
* 2015-05-27: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#MERLIN|MERLIN]]&lt;br /&gt;
* 2015-05-27: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#FAN|FAN]]&lt;br /&gt;
* 2015-05-18: Added F_CPU macro for STM32L1XX&lt;br /&gt;
* 2015-05-07: Some corrections of XMega port&lt;br /&gt;
* 2015-04-23: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#PENTAX|PENTAX]]&lt;br /&gt;
* 2015-04-23: Port to AVR XMega&lt;br /&gt;
* 2014-07-10: Some GPIO changes for STM32F10x (in IRSND).&lt;br /&gt;
* 2014-07-10: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#SAMSUNG48|SAMSUNG48]]&lt;br /&gt;
* 2014-06-23: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#LGAIR|LGAIR]]&lt;br /&gt;
* 2014-06-03: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#TELEFUNKEN|TELEFUNKEN]]&lt;br /&gt;
* 2014-05-30: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#SPEAKER|SPEAKER]]&lt;br /&gt;
* 2014-05-30: Optimized timings for [[IRMP_-_english#SAMSUNG|SAMSUNG]]&lt;br /&gt;
* 2014-02-20: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#SIEMENS_+_RUWIDO|RUWIDO]]&lt;br /&gt;
* 2013-04-09: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#ROOMBA|ROOMBA]]&lt;br /&gt;
* 2013-03-12: Allowed 15kHz for [[IRMP_-_english#RECS80|RECS80]] and  [[IRMP_-_english#RECS80EXT|RECS80EXT]]&lt;br /&gt;
* 2013-01-17: Added support for ATtiny44&lt;br /&gt;
* 2012-12-12: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#A1TVBOX|A1TVBOX]]&lt;br /&gt;
* 2012-12-07: Corrected timing of [[IRMP_-_english#NIKON|NIKON]] protocol&lt;br /&gt;
* 2012-10-26: Some timer corrections, adaptions to Arduino&lt;br /&gt;
* 2012-06-18: Added support ATtiny87/167&lt;br /&gt;
* 2012-06-05: Corrected port to ARM STM32 - now tested&lt;br /&gt;
* 2012-05-23: Port to ARM STM32 (untested!)&lt;br /&gt;
* 2012-05-23: Bugfix timing for 2nd frame of Denon protocol&lt;br /&gt;
* 2012-02-27: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#IR60 (SDA2008)|IR60 (SDA2008)]]&lt;br /&gt;
* 2012-02-27: Bugfix sending [[IRMP_-_english#Biphase|Biphase]] frames (Manchester)&lt;br /&gt;
* 2012-02-27: Port to C18 Compiler for PIC microcontrollers&lt;br /&gt;
* 2012-02-15: Bugfix: only the 1st Frame has been sended&lt;br /&gt;
* 2012-02-13: Timing corrections of [[IRMP_-_english#SAMSUNG|SAMSUNG]] and [[IRMP_-_english#SAMSUNG32|SAMSUNG32]]&lt;br /&gt;
* 2012-02-13: [[IRMP_-_english#KASEIKYO|KASEIKYO]]: Genre2 bits will be now stored in upper nibble of flags&lt;br /&gt;
* 2012-02-13: Additinak pause after sending the last frame&lt;br /&gt;
* 2011-09-20: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#THOMSON|THOMSON]]&lt;br /&gt;
* 2011-09-20: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#LEGO|LEGO]]&lt;br /&gt;
* 2011-09-20: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#NEC16|NEC16]]&lt;br /&gt;
* 2011-09-20: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#NEC42|NEC42]]&lt;br /&gt;
* 2011-09-20: Port to ATtiny84 und ATtiny85&lt;br /&gt;
* 2011-09-20: Some corrections for pause lengths&lt;br /&gt;
* 2011-09-20: Some corrections of irsnd_stop()&lt;br /&gt;
* 2011-09-20: Corrected: [[IRMP_-_english#SIEMENS_+_RUWIDO|SIEMENS]] timings&lt;br /&gt;
* 2011-09-20: Changed [[IRMP_-_english#DENON|DENON]] protocol to 36kHz modulation frequency&lt;br /&gt;
* 2011-09-20: Corrected Handling of additional bits in [[IRMP_-_english#SIRCS|SIRCS]] protocol&lt;br /&gt;
* 2011-01-18: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#RC6_+_RC6A|RC6A]]&lt;br /&gt;
* 2011-01-18: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#RC6_+_RC6A|RC6]]&lt;br /&gt;
* 2011-01-18: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#NIKON|NIKON]]&lt;br /&gt;
* 2011-01-18: Handling of additional bits (&amp;gt;12) in [[IRMP_-_english#SIRCS|SIRCS]] protocol&lt;br /&gt;
* 2011-01-18: Corrected some pause lengths&lt;br /&gt;
* 2011-01-18: timing corrections for [[IRMP_-_english#DENON|DENON]] protocol&lt;br /&gt;
&lt;br /&gt;
* 2010-09-02: New protocol: [[IRMP_-_english#JVC|JVC]]&lt;br /&gt;
* 2010-09-02: Corrected [[IRMP_-_english#APPLE|APPLE]] encoder - now compatible to IRMP-Version 1.7.3.&lt;br /&gt;
&lt;br /&gt;
* 2010-08-29: New protocol: [[IRMP_-_english#KASEIKYO|KASEIKYO]]&lt;br /&gt;
&lt;br /&gt;
* 2010-07-01: Bugfix: deactivating of [[IRMP_-_english#RECS80|RECS80]], [[IRMP_-_english#RECS80EXT|RECS80EXT]] &amp;amp; [[IRMP_-_english#SIEMENS_+_RUWIDO|SIEMENS]], if interrupt frequency is too low&lt;br /&gt;
&lt;br /&gt;
* 2010-06-25: New protocol: [[IRMP_-_english#RCCAR|RCCAR]]&lt;br /&gt;
&lt;br /&gt;
* 2010-06-09: New protocol: [[IRMP_-_english#FDC|FDC]] (IR-keyboard)&lt;br /&gt;
* 2010-06-09: Corrected timing for [[IRMP_-_english#DENON|DENON]] protocol&lt;br /&gt;
&lt;br /&gt;
* 2010-06-02: New protocol: [[IRMP_-_english#SIEMENS_+_RUWIDO|SIEMENS]] (Gigaset)&lt;br /&gt;
* 2010-06-02: Simulation of long key presses&lt;br /&gt;
&lt;br /&gt;
* 2010-05-26: New protocol: [[IRMP_-_english#GRUNDIG_+_NOKIA|NOKIA]]&lt;br /&gt;
&lt;br /&gt;
* 2010-05-17: New protocol: [[IRMP_-_english#GRUNDIG_+_NOKIA|GRUNDIG]]&lt;br /&gt;
* 2010-05-17: Handling of frame repetitions for [[IRMP_-_english#SIRCS|SIRCS]], [[IRMP_-_english#SAMSUNG32|SAMSUNG32]], and [[IRMP_-_english#NUBERT|NUBERT]]&lt;br /&gt;
&lt;br /&gt;
* 2010-04-28: Support of [[IRMP_-_english#APPLE|APPLE]] protocol&lt;br /&gt;
* 2010-04-28: added configuration by [http://www.mikrocontroller.net/svnbrowser/irmp/irsndconfig.h?view=markup irsndconfig.h]&lt;br /&gt;
&lt;br /&gt;
* 2010-04-16: Optimized all timing tolerancies&lt;br /&gt;
&lt;br /&gt;
* 2010-04-14: New protocol: [[IRMP_-_english#B&amp;amp;O|Bang &amp;amp; Olufsen]]&lt;br /&gt;
&lt;br /&gt;
* 2010-03-17: New protocol: [[IRMP_-_english#NUBERT|NUBERT]]&lt;br /&gt;
* 2010-03-17: Corrected length of pauses between frame repetitions&lt;br /&gt;
&lt;br /&gt;
* 2010-03-16: Corrected timer register TCCR2&lt;br /&gt;
* 2010-03-16: Corrected [[IRMP_-_english#RECS80|RECS80]] start bit timings&lt;br /&gt;
* 2010-03-16: New protocol: [[IRMP_-_english#RECS80EXT|RECS80 Extended]]&lt;br /&gt;
&lt;br /&gt;
* 2010-03-11: Adapted code to several ATMega types&lt;br /&gt;
&lt;br /&gt;
* 2010-03-07: Alpha version&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Infrarot]]&lt;br /&gt;
[[Kategorie:AVR-Projekte]]&lt;/div&gt;</summary>
		<author><name>Tooki</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=IRSND_-_english&amp;diff=106082</id>
		<title>IRSND - english</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=IRSND_-_english&amp;diff=106082"/>
		<updated>2023-04-26T09:55:27Z</updated>

		<summary type="html">&lt;p&gt;Tooki: Überarbeitung der englischen Übersetzung durch erfahrenen Englischmuttersprachler (ehem. tech. Redaktor und -Übersetzer)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;By &#039;&#039;&#039;Frank M. ([http://www.mikrocontroller.net/user/show/ukw ukw])&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;This is the English translation of the [[IRSND#top|german ISRND documentation]].&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= IRSND - Infrared Multi Protocol Encoder =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[[Datei:irmp-title.png| |Waveform of an NEC-format remote control signal]]&lt;br /&gt;
&lt;br /&gt;
[[IRSND_-_english#top|IRSND]] is the counterpart to [[IRMP_-_english#top|IRMP]]. [[IRSND_-_english#top|IRSND]] encodes and transmits IR frames.&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
[[Datei:irsnd-sender.png|miniatur|A simple IR emitter connected to a microcontroller.]]&lt;br /&gt;
&lt;br /&gt;
[[IRSND_-_english#top|IRSND]] is the counterpart to [[IRMP_-_english#top|IRMP]]: it reproduces the original IR frame from data received by [[IRMP_-_english#top|IRMP]], which can then be transmitted over an IR emitter.&lt;br /&gt;
&lt;br /&gt;
== Supported MCUs ==&lt;br /&gt;
&lt;br /&gt;
[[IRSND_-_english#top|IRSND]] runs on numerous MCU families:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AVR&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* ATtiny87,  ATtiny167&lt;br /&gt;
* ATtiny45,  ATtiny85&lt;br /&gt;
* ATtiny44,  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;
&#039;&#039;&#039;XMega&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* ATXmega128&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC&#039;&#039;&#039; (C18 Compiler)&lt;br /&gt;
&lt;br /&gt;
* PIC12F1840&lt;br /&gt;
* PIC18F4520&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;STM32&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* STM32F4xx&lt;br /&gt;
* STM32F10x&lt;br /&gt;
* STM32 with HAL library &#039;&#039;&#039;(NEW!)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TEENSY 3.0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* MK20DX256VLH7 (ARM Cortex-M4 72MHz)&lt;br /&gt;
&lt;br /&gt;
== Supported Protocols ==&lt;br /&gt;
&lt;br /&gt;
[[IRSND_-_english#top|IRSND]] supports the following IR protocols:&lt;br /&gt;
&lt;br /&gt;
* [[IRMP_-_english#A1TVBOX|A1TVBOX]]&lt;br /&gt;
* [[IRMP_-_english#AP24|ACP24]] &#039;&#039;&#039;(NEW!)&#039;&#039;&#039;&lt;br /&gt;
* [[IRMP_-_english#APPLE|APPLE]]&lt;br /&gt;
* [[IRMP_-_english#B&amp;amp;O|BANG_OLUFSON]]&lt;br /&gt;
* [[IRMP_-_english#BOSE|BOSE]] &#039;&#039;&#039;(NEW!)&#039;&#039;&#039;&lt;br /&gt;
* [[IRMP_-_english#DENON|DENON]]&lt;br /&gt;
* [[IRMP_-_english#FAN|FAN]] &#039;&#039;&#039;(NEW!)&#039;&#039;&#039;&lt;br /&gt;
* [[IRMP_-_english#FDC|FDC]] (minimum ~15kHz)&lt;br /&gt;
* [[IRMP_-_english#GRUNDIG_+_NOKIA|GRUNDIG]]&lt;br /&gt;
* [[IRMP_-_english#IR60 (SDA2008)|IR60 (SDA2008)]]&lt;br /&gt;
* [[IRMP_-_english#JVC|JVC]]&lt;br /&gt;
* [[IRMP_-_english#KASEIKYO|KASEIKYO]]&lt;br /&gt;
* [[IRMP_-_english#LEGO|LEGO]]&lt;br /&gt;
* [[IRMP_-_english#LGAIR|LGAIR]]&lt;br /&gt;
* [[IRMP_-_english#MATSUSHITA|MATSUSHITA]]&lt;br /&gt;
* [[IRMP_-_english#NEC_+_extended_NEC|NEC]]&lt;br /&gt;
* [[IRMP_-_english#NEC16|NEC16]]&lt;br /&gt;
* [[IRMP_-_english#NEC42|NEC42]]&lt;br /&gt;
* [[IRMP_-_english#NIKON|NIKON]]&lt;br /&gt;
* [[IRMP_-_english#GRUNDIG_+_NOKIA|NOKIA]]&lt;br /&gt;
* [[IRMP_-_english#NUBERT|NUBERT]]&lt;br /&gt;
* [[IRMP_-_english#PANASONIC|PANASONIC (Beamer)]] &#039;&#039;&#039;(NEW!)&#039;&#039;&#039;&lt;br /&gt;
* [[IRMP_-_english#PENTAX|PENTAX]] &#039;&#039;&#039;(NEW!)&#039;&#039;&#039;&lt;br /&gt;
* [[IRMP_-_english#RC5_+_RC5X|RC5]]&lt;br /&gt;
* [[IRMP_-_english#RC6_+_RC6A|RC6]]&lt;br /&gt;
* [[IRMP_-_english#RC6_+_RC6A|RC6A]]&lt;br /&gt;
* [[IRMP_-_english#RCCAR|RCCAR]] (minimum  ~15kHz)&lt;br /&gt;
* [[IRMP_-_english#RECS80|RECS80]] (bei mind. ~20kHz)&lt;br /&gt;
* [[IRMP_-_english#RECS80EXT|RECS80EXT]] (minimum  ~20kHz)&lt;br /&gt;
* [[IRMP_-_english#ROOMBA|ROOMBA]]&lt;br /&gt;
* [[IRMP_-_english#SAMSUNG|SAMSUNG]]&lt;br /&gt;
* [[IRMP_-_english#SAMSUNG32|SAMSUNG32]]&lt;br /&gt;
* [[IRMP_-_english#SAMSUNG48|SAMSUNG48]]&lt;br /&gt;
* [[IRMP_-_english#SIEMENS_+_RUWIDO|SIEMENS]] (minimum ~15kHz)&lt;br /&gt;
* [[IRMP_-_english#SPEAKER|SPEAKER]]&lt;br /&gt;
* [[IRMP_-_english#TELEFUNKEN|TELEFUNKEN]]&lt;br /&gt;
* [[IRMP_-_english#THOMSON|THOMSON]]&lt;br /&gt;
* [[IRMP_-_english#SIRCS|SIRCS]]&lt;br /&gt;
&lt;br /&gt;
[[IRSND_-_english#top|IRSND]] does &#039;&#039;&#039;NOT&#039;&#039;&#039; yet support the following protocols:&lt;br /&gt;
&lt;br /&gt;
* [[IRMP_-_english#KATHREIN|KATHREIN]]&lt;br /&gt;
* [[IRMP_-_english#NETBOX|NETBOX]]&lt;br /&gt;
* [[IRMP_-_english#ORTEK|ORTEK]]&lt;br /&gt;
* [[IRMP_-_english#RCMM|RCMM]]&lt;br /&gt;
* [[IRMP_-_english#MERLIN|MERLIN]]&lt;br /&gt;
&lt;br /&gt;
== Download ==&lt;br /&gt;
&lt;br /&gt;
Version 3.2.6, Date: 2021-01-27&lt;br /&gt;
&lt;br /&gt;
Download stable version: [http://www.mikrocontroller.net/wikifiles/c/c7/Irsnd.zip Irsnd.zip] &lt;br /&gt;
&lt;br /&gt;
[[IRMP_-_english#top|IRMP]] &amp;amp; [[IRSND_-_english#top|IRSND]] is also available by SVN: [http://www.mikrocontroller.net/svnbrowser/irmp/ IRMP in SVN]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;You can see the history of the software changes here: [[IRSND_-_english#Software_History|Software History]]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Source Code ==&lt;br /&gt;
&lt;br /&gt;
The source code can be easily compiled for AVR MCUs by loading the project file irsnd.aps in AVR Studio 4. &lt;br /&gt;
&lt;br /&gt;
For other development environments it is simple to create a project or makefile. The source includes:&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irsnd.c?view=markup irsnd.c] - the IR encoder core&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmpprotocols.h?view=markup irmpprotocols.h] - all protocol definitions&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmpsystem.h?view=markup irmpsystem.h] - target-dependent definitions for AVR/PIC/STM32&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irsnd.h?view=markup irsnd.h] - include file for the application&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irsndconfig.h?view=markup irsndconfig.h] - user configuration&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irsnd-main-avr.c?view=markup irsnd-main-avr.c] - example main&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IMPORTANT:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Include only [http://www.mikrocontroller.net/svnbrowser/irmp/irsnd.h?view=markup irsnd.h] in your application source code:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;irsnd.h&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
All other include files are included within [http://www.mikrocontroller.net/svnbrowser/irmp/irsnd.h?view=markup irsnd.h]. See also the sample application [http://www.mikrocontroller.net/svnbrowser/irmp/irsnd-main-avr.c?view=markup irsnd-main-avr.c].&lt;br /&gt;
&lt;br /&gt;
[[IRSND_-_english#top|IRSND]] encodes all protocols listed above in an interrupt service routine (ISR), see also [http://www.mikrocontroller.net/svnbrowser/irmp/irsnd.c?view=markup irsnd.c].&lt;br /&gt;
&lt;br /&gt;
=== Settings in irsndconfig.h ===&lt;br /&gt;
&lt;br /&gt;
==== F_INTERRUPTS ====&lt;br /&gt;
&lt;br /&gt;
Number of interrupts per second. The value can be set to a value between 10000 and 20000.&lt;br /&gt;
&lt;br /&gt;
Default value:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define F_INTERRUPTS                            15000      // interrupts per second&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== IRSND_SUPPORT_xxx_PROTOCOL ====&lt;br /&gt;
&lt;br /&gt;
Here you can select which protocols to enable in [[IRSND_-_english#top|IRSND]]. Common protocols are emabled by default. To enable additional protocols or disable others to save memory, set the corresponding values in [http://www.mikrocontroller.net/svnbrowser/irmp/irsndconfig.h?view=markup irsndconfig.h].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&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                 ~200 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                 ~300 bytes&lt;br /&gt;
&lt;br /&gt;
// more protocols, enable here!                 Enable  Remarks                 F_INTERRUPTS            Program Space&lt;br /&gt;
#define IRSND_SUPPORT_DENON_PROTOCOL            0       // DENON, Sharp         &amp;gt;= 10000                 ~200 bytes&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 (SDA2008)       &amp;gt;= 10000                 ~250 bytes&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;= 15000                 ~100 bytes&lt;br /&gt;
#define IRSND_SUPPORT_RECS80EXT_PROTOCOL        0       // RECS80EXT            &amp;gt;= 15000                 ~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_ROOMBA_PROTOCOL           0       // iRobot Roomba        &amp;gt;= 10000                 ~150 bytes&lt;br /&gt;
#define IRSND_SUPPORT_RUWIDO_PROTOCOL           0       // RUWIDO, T-Home       &amp;gt;= 15000                 ~250 bytes&lt;br /&gt;
#define IRSND_SUPPORT_A1TVBOX_PROTOCOL          0       // A1 TV BOX            &amp;gt;= 15000 (better 20000)  ~200 bytes&lt;br /&gt;
#define IRSND_SUPPORT_LEGO_PROTOCOL             0       // LEGO Power RC        &amp;gt;= 20000                 ~150 bytes&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To enable a protocol, set it to 1, to disable it, set it to 0. Disabled protocols will not be compiled. This saves program space in Flash. (See code comments above.) Refer to the article [[IRMP_-_english|IRMP]] for more tips on saving memory if absolutely necessary.&lt;br /&gt;
&lt;br /&gt;
When using the [[IRMP_-_english#APPLE|APPLE]] protocol, set IRSND_SUPPORT_NEC_PROTOCOL to 1, since it is simply a special case of the [[IRMP_-_english#NEC_+_extended_NEC|NEC]] protocol.&lt;br /&gt;
&lt;br /&gt;
==== IRSND_OCx ====&lt;br /&gt;
&lt;br /&gt;
To transmit IR signals, [[IRSND_-_english#top|IRSND]] needs a PWM-capable output pin, because the signal needs to be modulated. The following settings are possible:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Default value:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define IRSND_OCx                               IRSND_OC2B&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For PIC and STM32 MCUs use the appropriate values, see comments in [http://www.mikrocontroller.net/svnbrowser/irmp/irsndconfig.h?view=markup irsndconfig.h].&lt;br /&gt;
&lt;br /&gt;
==== IRSND_USE_CALLBACK ====&lt;br /&gt;
&lt;br /&gt;
Default value:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define IRSND_USE_CALLBACK                      0       // flag: 0 = don&#039;t use callbacks, 1 = use callbacks, default is 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If callbacks are enabled, your callback functions will be called whenever the IR signal changes (IR modulation on/off). This can by used to output an unmodulated signal on another pin, for example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define LED_PORT PORTD                                  // LED at PD6&lt;br /&gt;
#define LED_DDR  DDRD&lt;br /&gt;
#define LED_PIN  6&lt;br /&gt;
&lt;br /&gt;
/*-----------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
 * Called (back) from IRSND module&lt;br /&gt;
 * This example switches a LED (which is connected to Vcc)&lt;br /&gt;
 *-----------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
 */&lt;br /&gt;
void&lt;br /&gt;
led_callback (uint8_t on)&lt;br /&gt;
{&lt;br /&gt;
    if (on)&lt;br /&gt;
    {&lt;br /&gt;
       LED_PORT &amp;amp;= ~(1 &amp;lt;&amp;lt; LED_PIN);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
       LED_PORT |= (1 &amp;lt;&amp;lt; LED_PIN);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int&lt;br /&gt;
main ()&lt;br /&gt;
{&lt;br /&gt;
    ...&lt;br /&gt;
    LED_DDR |= (1 &amp;lt;&amp;lt; LED_PIN);         // LED pin to output&lt;br /&gt;
    LED_PORT |= (1 &amp;lt;&amp;lt; LED_PIN);        // switch LED off (active low)&lt;br /&gt;
    irsnd_init ();&lt;br /&gt;
    irsnd_set_callback_ptr (led_callback);&lt;br /&gt;
    sei ();&lt;br /&gt;
    ...&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Using IRSND ==&lt;br /&gt;
&lt;br /&gt;
[[IRSND_-_english#top|IRSND]] assembles the frame to be transmitted on the fly from the IRMP data structure. It includes:&lt;br /&gt;
&lt;br /&gt;
 1. ID for the protocol in use&lt;br /&gt;
 2. Address or vendor code&lt;br /&gt;
 3. Command&lt;br /&gt;
&lt;br /&gt;
To transmit the IR frame, call the function&lt;br /&gt;
&lt;br /&gt;
   irsnd_send_data (IRMP_DATA * irmp_data_p)&lt;br /&gt;
&lt;br /&gt;
The return value is 1 if the frame can be successfully transmitted, otherwise 0. In the first case the struct members&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
are read and then transmitted as a frame in the selected IR protocol.&lt;br /&gt;
&lt;br /&gt;
irmp_data_p-&amp;gt;flags specifies the number of repetitions, e.g.&lt;br /&gt;
&lt;br /&gt;
  irmp_data_p-&amp;gt;flags = 0: no repetition&lt;br /&gt;
  irmp_data_p-&amp;gt;flags = 1: 1 repetition&lt;br /&gt;
  irmp_data_p-&amp;gt;flags = 2: 2 repetitions&lt;br /&gt;
  usw.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important: Make sure that irmp_data_p-&amp;gt;flags has a defined value before calling irsnd_send_data()!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
   IRMP_DATA irmp_data;&lt;br /&gt;
&lt;br /&gt;
   irmp_data.protocol = IRMP_NEC_PROTOCOL;       // use NEC protocol&lt;br /&gt;
   irmp_data.address  = 0x00FF;                  // use address 0x00FF&lt;br /&gt;
   irmp_data.command  = 0x0001;                  // use command 0001&lt;br /&gt;
   irmp_data.flags    = 0;                       // no repetition!&lt;br /&gt;
&lt;br /&gt;
   (void) irsnd_send_data (&amp;amp;irmp_data, FALSE);   // transmit, don&#039;t wait&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The frame will be transmitted asynchronously by the interrupt routine irsnd_ISR(), so  the function irsnd_send_data() returns immediately. When repetitions are specified, depending on the protocol, the frame will be repeated after a wait specified in the protocol, or  a protocol-specific repeat frame (e.g. for NEC) will be sent.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== NEC Repeat Frames ===&lt;br /&gt;
&lt;br /&gt;
IRSND normally transmits repeat frames itself, according to the number of repetitions specified in the flags. (See above.)&lt;br /&gt;
&lt;br /&gt;
Starting with version 3.2.6 and specifically for the NEC protocol, repeat frames can be transmitted on their own. This is useful for IR repeaters in particular.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following flags must be set:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
   IRMP_DATA irmp_data;&lt;br /&gt;
&lt;br /&gt;
   irmp_data.protocol = IRMP_NEC_PROTOCOL;           // use NEC protocl&lt;br /&gt;
   irmp_data.address  = 0x00FF;                      // address is ignored&lt;br /&gt;
   irmp_data.command  = 0x0001;                      // command is ignored&lt;br /&gt;
   irmp_data.flags    = IRSND_RAW_REPETITION_FRAME;  // transmit NEC repeat frame&lt;br /&gt;
&lt;br /&gt;
   (void) irsnd_send_data (&amp;amp;irmp_data, TRUE);        // transmit and wait&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Multiple repeat frames can be transmitted by setting a repetition value as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
   irmp_data.flags    = IRSND_RAW_REPETITION_FRAME | 0x02;  // transmit NEC repeat frame and repeat 2 more times&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Up to 14 repetitions can be set, so up to 15 repeat frames.&lt;br /&gt;
&lt;br /&gt;
=== Waits ===&lt;br /&gt;
&lt;br /&gt;
When irsnd_send_data() is called again, it waits until the preceding frame has been transmitted completely. You can test whether [[IRSND_-_english#top|IRSND]] is busy or not:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
   while (irsnd_is_busy ())&lt;br /&gt;
   {&lt;br /&gt;
      ;                                          // wait here or do something else...&lt;br /&gt;
   }&lt;br /&gt;
   (void) irsnd_send_data (&amp;amp;irmp_data, FALSE);   // transmit without testing and without waiting&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When irsnd_send_data() is called with TRUE as the second argument, the function only returns once the frame has been transmitted completely.&lt;br /&gt;
&lt;br /&gt;
In the example source irsnd-main-avr.c, in addition to how to use irsnd_send_data(), the [[AVR-GCC-Tutorial/Die_Timer_und_Zähler_des_AVR|timer]] call is also demonstrated:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Using IRMP and IRSND Simultaneously ===&lt;br /&gt;
&lt;br /&gt;
To use [[IRMP_-_english#top|IRMP]] and [[IRSND_-_english#top|IRSND]] at the same time (that is, both transmitter and receiver), the ISR function should read as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This causes the receiver ISR to be called only when irsnd_ISR() is idle, and thus the receiver is disabled while irsnd_ISR() is transmitting data. &lt;br /&gt;
&lt;br /&gt;
The [[AVR-GCC-Tutorial/Die_Timer_und_Zähler_des_AVR|timer]] initialization routine is identical for [[IRMP_-_english#top|IRMP]] and [[IRSND_-_english#top|IRSND]].&lt;br /&gt;
&lt;br /&gt;
A combined main function could look like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
What the code above does is obvious: A received frame is fully decoded, then reencoded and finally transmitted with the IR emitting diode. This can be used to transmit signals around a corner, or extend them over a wire. &lt;br /&gt;
&lt;br /&gt;
Another application is protocol translation, for example to convert NEC frames to RC5 to substitute a lost RC5 remote control.&lt;br /&gt;
&lt;br /&gt;
Other uses are left to the reader&#039;s imagination. ;-)&lt;br /&gt;
&lt;br /&gt;
Here the possible values for irmp_data.protocol, see also  [http://www.mikrocontroller.net/svnbrowser/irmp/irmpprotocols.h?view=markup irmpprotocols.h]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&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 Media Receiver&lt;br /&gt;
#define IRMP_IR60_PROTOCOL                      24              // IR60 (SDA2008)&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;
#define IRMP_BOSE_PROTOCOL                      31              // BOSE&lt;br /&gt;
#define IRMP_A1TVBOX_PROTOCOL                   32              // A1 TV Box&lt;br /&gt;
#define IRMP_ORTEK_PROTOCOL                     33              // ORTEK - Hama&lt;br /&gt;
#define IRMP_TELEFUNKEN_PROTOCOL                34              // Telefunken (1560)&lt;br /&gt;
#define IRMP_ROOMBA_PROTOCOL                    35              // iRobot Roomba vacuum cleaner&lt;br /&gt;
#define IRMP_RCMM32_PROTOCOL                    36              // Fujitsu-Siemens (Activy remote control)&lt;br /&gt;
#define IRMP_RCMM24_PROTOCOL                    37              // Fujitsu-Siemens (Activy keyboard)&lt;br /&gt;
#define IRMP_RCMM12_PROTOCOL                    38              // Fujitsu-Siemens (Activy keyboard)&lt;br /&gt;
#define IRMP_SPEAKER_PROTOCOL                   39              // Another loudspeaker protocol, similar to Nubert&lt;br /&gt;
#define IRMP_LGAIR_PROTOCOL                     40              // LG air conditioner&lt;br /&gt;
#define IRMP_SAMSUNG48_PROTOCOL                 41              // air conditioner with SAMSUNG protocol (48 bits)&lt;br /&gt;
#define IRMP_MERLIN_PROTOCOL                    42              // Merlin (Pollin 620 185)&lt;br /&gt;
#define IRMP_PENTAX_PROTOCOL                    43              // Pentax camera&lt;br /&gt;
#define IRMP_FAN_PROTOCOL                       44              // FAN (ventilator), very similar to NUBERT, but last bit is data bit instead of stop bit&lt;br /&gt;
#define IRMP_S100_PROTOCOL                      45              // very similar to RC5, but 14 instead of 13 data bits&lt;br /&gt;
#define IRMP_ACP24_PROTOCOL                     46              // Stiebel Eltron ACP24 air conditioner&lt;br /&gt;
#define IRMP_TECHNICS_PROTOCOL                  47              // Technics, similar to Matsushita, but 22 instead of 24 bits&lt;br /&gt;
#define IRMP_PANASONIC_PROTOCOL                 48              // Panasonic (video projector), start bits similar to KASEIKYO&lt;br /&gt;
#define IRMP_MITSU_HEAVY_PROTOCOL               49              // Mitsubishi heavy air conditioner, similar timing to Panasonic video projector&lt;br /&gt;
#define IRMP_VINCENT_PROTOCOL                   50              // Vincent&lt;br /&gt;
#define IRMP_SAMSUNGAH_PROTOCOL                 51              // SAMSUNG AH&lt;br /&gt;
#define IRMP_IRMP16_PROTOCOL                    52              // IRMP specific protocol for data transfer, e.g. between two microcontrollers via IR&lt;br /&gt;
#define IRMP_GREE_PROTOCOL                      53              // Gree climate&lt;br /&gt;
#define IRMP_RCII_PROTOCOL                      54              // RC II Infrared Remote Control Protocol for FM8&lt;br /&gt;
#define IRMP_METZ_PROTOCOL                      55              // METZ&lt;br /&gt;
#define IRMP_ONKYO_PROTOCOL                     56              // Onkyo&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The best way to determine the address and command codes is to use [[IRMP_-_english|IRMP]], see above ;-)&lt;br /&gt;
&lt;br /&gt;
== IRSND under Linux and Windows ==&lt;br /&gt;
&lt;br /&gt;
=== Compiling IRSND ===&lt;br /&gt;
&lt;br /&gt;
 [http://www.mikrocontroller.net/svnbrowser/irmp/irsnd.c?view=markup irsnd.c] can be compiled under Linux to create frames in the same format as the IRMP scan files. Simply enter:&lt;br /&gt;
&lt;br /&gt;
    make -f makefile.unx&lt;br /&gt;
&lt;br /&gt;
=== Starting IRSND ===&lt;br /&gt;
&lt;br /&gt;
To start IRSND, enter:&lt;br /&gt;
&lt;br /&gt;
    ./irsnd protocol-number hex-address hex-command [repeat] &amp;gt; filename.txt&lt;br /&gt;
&lt;br /&gt;
Example for NEC protocol, address 0x00FF, command 0x0001:&lt;br /&gt;
&lt;br /&gt;
    ./irsnd 2 00FF 0001 &amp;gt; nec.txt                   # start irsnd&lt;br /&gt;
&lt;br /&gt;
=== IRSND under Windows ===&lt;br /&gt;
&lt;br /&gt;
You can also use [[IRSND_-_english#top|IRSND]] under Windows:&lt;br /&gt;
&lt;br /&gt;
* start the command line console&lt;br /&gt;
* change to the IRSND directory&lt;br /&gt;
* enter:&lt;br /&gt;
&lt;br /&gt;
            irsnd.exe 2 00FF 0001 &amp;gt; nec.txt&lt;br /&gt;
&lt;br /&gt;
You can then use [[IRMP_-_english#top|IRMP]] to check whether the frame generated by IRSND is correct:&lt;br /&gt;
&lt;br /&gt;
            ./irmp-15kHz &amp;lt; nec.txt&lt;br /&gt;
&lt;br /&gt;
or under Windows:&lt;br /&gt;
&lt;br /&gt;
            irmp.exe &amp;lt; nec.txt&lt;br /&gt;
&lt;br /&gt;
It also works without using an intermediate file, e.g.:&lt;br /&gt;
&lt;br /&gt;
            ./irsnd-15kHz 2 00FF 0001 | ./irmp-15kHz&lt;br /&gt;
&lt;br /&gt;
or under Windows:&lt;br /&gt;
&lt;br /&gt;
            irsnd.exe 2 00FF 0001 | irmp.exe&lt;br /&gt;
&lt;br /&gt;
The output of [[IRMP_-_english#top|IRMP]] is then as follows:&lt;br /&gt;
&lt;br /&gt;
            11111111000000001000000001111111 p =  2, a = 0x00ff, c = 0x0001, f = 0x00&lt;br /&gt;
&lt;br /&gt;
[[IRMP_-_english#top|IRMP]] identified the frame generated by [[IRSND_-_english#top|IRSND]] as protocol number 2, address 0x00FF and command 0x0001.&lt;br /&gt;
&lt;br /&gt;
 Under Linux/Windows, [[IRSND_-_english#top|IRSND]] always emulates a key press twice, with a wait between the frames. The output is therefore:&lt;br /&gt;
&lt;br /&gt;
            11111111000000001000000001111111 p =  2, a = 0x00ff, c = 0x0001, f = 0x00&lt;br /&gt;
            11111111000000001000000001111111 p =  2, a = 0x00ff, c = 0x0001, f = 0x00&lt;br /&gt;
&lt;br /&gt;
The reason is simple: This makes it easy to test whether [[IRSND_-_english#top|IRSND]] correctly handles the toggle bit used by some protocols:&lt;br /&gt;
&lt;br /&gt;
            ./irsnd-15kHz 7 2 3 0 | ./irmp-15kHz&lt;br /&gt;
            1100010000011 p= 7 (RC5), a=0x0002, c=0x0003, f=0x00  &#039;&#039;&#039;First key press&#039;&#039;&#039;&lt;br /&gt;
            1000010000011 p= 7 (RC5), a=0x0002, c=0x0003, f=0x00  &#039;&#039;&#039;Second key press&#039;&#039;&#039;&lt;br /&gt;
             ^&lt;br /&gt;
             Toggle bit&lt;br /&gt;
&lt;br /&gt;
Note: Depending on the protocol, the bit widths of addresses and commands can differ, see [[IRMP_-_english#IR_Protocols_in_Detail|IR Protocols in Detail]].&lt;br /&gt;
&lt;br /&gt;
Consequently, 16 bit addresses and commands cannot be transmitted transparently with every protocol.&lt;br /&gt;
&lt;br /&gt;
= Appendix =&lt;br /&gt;
&#039;&#039;&#039; &#039;&#039;&#039;&lt;br /&gt;
== Software History ==&lt;br /&gt;
&lt;br /&gt;
=== Changes to IRSND in 3.0.x ===&lt;br /&gt;
&lt;br /&gt;
Version 3.2.6:&lt;br /&gt;
&lt;br /&gt;
* 2021-01-27: &#039;&#039;&#039;New IR Protocol:&#039;&#039;&#039; [[IRMP#MELINERA|MELINERA]]&lt;br /&gt;
* 2021-01-27: Protocol [[IRMP#LEGO|LEGO]]: Improved timing&lt;br /&gt;
* 2021-01-27: Protocol [[IRMP#RUWIDO|RUWIDO]]: Improved timing&lt;br /&gt;
* 2021-01-27: Protocol [[IRMP#NEC|NEC]]: Implemented send of raw NEC reptition frames &lt;br /&gt;
&lt;br /&gt;
Version 3.2.5:&lt;br /&gt;
&lt;br /&gt;
* Modifications for Arduino&lt;br /&gt;
&lt;br /&gt;
Version 3.2.4:&lt;br /&gt;
&lt;br /&gt;
* changed some constants in irsnd.c&lt;br /&gt;
&lt;br /&gt;
Version 3.1.5:&lt;br /&gt;
&lt;br /&gt;
* 2019-08-28: New protocol: ONKYO&lt;br /&gt;
&lt;br /&gt;
Version 3.1.2:&lt;br /&gt;
&lt;br /&gt;
* 2018-09-06: Added support of STM32 with HAL library&lt;br /&gt;
&lt;br /&gt;
Version 3.0.9:&lt;br /&gt;
&lt;br /&gt;
* 2018-02-19: Minor changes&lt;br /&gt;
&lt;br /&gt;
Version 3.0.8:&lt;br /&gt;
&lt;br /&gt;
* 2017-08-25: New protocol: IRMP16 for transparent 16 bit data communication&lt;br /&gt;
&lt;br /&gt;
Version 3.0.2:&lt;br /&gt;
&lt;br /&gt;
* 2016-09-09: New protocol [[IRMP_-_english#MITSU_HEAVY|Mitsubishi Heavy (air conditioner)]]&lt;br /&gt;
* 2016-09-09: Some modifications for Compiler PIC C18&lt;br /&gt;
&lt;br /&gt;
Version 3.0.0:&lt;br /&gt;
&lt;br /&gt;
* Renamed example main file to irsnd-main-avr.c&lt;br /&gt;
&lt;br /&gt;
=== Older versions ===&lt;br /&gt;
&lt;br /&gt;
* 2015-11-17: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#BOSE|BOSE]]&lt;br /&gt;
* 2015-11-17: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#PANASONIC|PANASONIC (Beamer)]]&lt;br /&gt;
* 2015-11-17: Port to Teensy (3.x)&lt;br /&gt;
* 2015-09-20: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#TECHNICS|TECHNICS]]&lt;br /&gt;
* 2015-06-15: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#ACP24|ACP24]]&lt;br /&gt;
* 2015-05-28: Timing corrections for [[IRMP_-_english#FAN|FAN]] protocol&lt;br /&gt;
* 2015-05-27: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#MERLIN|MERLIN]]&lt;br /&gt;
* 2015-05-27: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#FAN|FAN]]&lt;br /&gt;
* 2015-05-18: Added F_CPU macro for STM32L1XX&lt;br /&gt;
* 2015-05-07: Some corrections of XMega port&lt;br /&gt;
* 2015-04-23: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#PENTAX|PENTAX]]&lt;br /&gt;
* 2015-04-23: Port to AVR XMega&lt;br /&gt;
* 2014-07-10: Some GPIO changes for STM32F10x (in IRSND).&lt;br /&gt;
* 2014-07-10: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#SAMSUNG48|SAMSUNG48]]&lt;br /&gt;
* 2014-06-23: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#LGAIR|LGAIR]]&lt;br /&gt;
* 2014-06-03: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#TELEFUNKEN|TELEFUNKEN]]&lt;br /&gt;
* 2014-05-30: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#SPEAKER|SPEAKER]]&lt;br /&gt;
* 2014-05-30: Optimized timings for [[IRMP_-_english#SAMSUNG|SAMSUNG]]&lt;br /&gt;
* 2014-02-20: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#SIEMENS_+_RUWIDO|RUWIDO]]&lt;br /&gt;
* 2013-04-09: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#ROOMBA|ROOMBA]]&lt;br /&gt;
* 2013-03-12: Allowed 15kHz for [[IRMP_-_english#RECS80|RECS80]] and  [[IRMP_-_english#RECS80EXT|RECS80EXT]]&lt;br /&gt;
* 2013-01-17: Added support for ATtiny44&lt;br /&gt;
* 2012-12-12: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#A1TVBOX|A1TVBOX]]&lt;br /&gt;
* 2012-12-07: Corrected timing of [[IRMP_-_english#NIKON|NIKON]] protocol&lt;br /&gt;
* 2012-10-26: Some timer corrections, adaptions to Arduino&lt;br /&gt;
* 2012-06-18: Added support ATtiny87/167&lt;br /&gt;
* 2012-06-05: Corrected port to ARM STM32 - now tested&lt;br /&gt;
* 2012-05-23: Port to ARM STM32 (untested!)&lt;br /&gt;
* 2012-05-23: Bugfix timing for 2nd frame of Denon protocol&lt;br /&gt;
* 2012-02-27: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#IR60 (SDA2008)|IR60 (SDA2008)]]&lt;br /&gt;
* 2012-02-27: Bugfix sending [[IRMP_-_english#Biphase|Biphase]] frames (Manchester)&lt;br /&gt;
* 2012-02-27: Port to C18 Compiler for PIC microcontrollers&lt;br /&gt;
* 2012-02-15: Bugfix: only the 1st Frame has been sended&lt;br /&gt;
* 2012-02-13: Timing corrections of [[IRMP_-_english#SAMSUNG|SAMSUNG]] and [[IRMP_-_english#SAMSUNG32|SAMSUNG32]]&lt;br /&gt;
* 2012-02-13: [[IRMP_-_english#KASEIKYO|KASEIKYO]]: Genre2 bits will be now stored in upper nibble of flags&lt;br /&gt;
* 2012-02-13: Additinak pause after sending the last frame&lt;br /&gt;
* 2011-09-20: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#THOMSON|THOMSON]]&lt;br /&gt;
* 2011-09-20: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#LEGO|LEGO]]&lt;br /&gt;
* 2011-09-20: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#NEC16|NEC16]]&lt;br /&gt;
* 2011-09-20: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#NEC42|NEC42]]&lt;br /&gt;
* 2011-09-20: Port to ATtiny84 und ATtiny85&lt;br /&gt;
* 2011-09-20: Some corrections for pause lengths&lt;br /&gt;
* 2011-09-20: Some corrections of irsnd_stop()&lt;br /&gt;
* 2011-09-20: Corrected: [[IRMP_-_english#SIEMENS_+_RUWIDO|SIEMENS]] timings&lt;br /&gt;
* 2011-09-20: Changed [[IRMP_-_english#DENON|DENON]] protocol to 36kHz modulation frequency&lt;br /&gt;
* 2011-09-20: Corrected Handling of additional bits in [[IRMP_-_english#SIRCS|SIRCS]] protocol&lt;br /&gt;
* 2011-01-18: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#RC6_+_RC6A|RC6A]]&lt;br /&gt;
* 2011-01-18: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#RC6_+_RC6A|RC6]]&lt;br /&gt;
* 2011-01-18: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#NIKON|NIKON]]&lt;br /&gt;
* 2011-01-18: Handling of additional bits (&amp;gt;12) in [[IRMP_-_english#SIRCS|SIRCS]] protocol&lt;br /&gt;
* 2011-01-18: Corrected some pause lengths&lt;br /&gt;
* 2011-01-18: timing corrections for [[IRMP_-_english#DENON|DENON]] protocol&lt;br /&gt;
&lt;br /&gt;
* 2010-09-02: New protocol: [[IRMP_-_english#JVC|JVC]]&lt;br /&gt;
* 2010-09-02: Corrected [[IRMP_-_english#APPLE|APPLE]] encoder - now compatible to IRMP-Version 1.7.3.&lt;br /&gt;
&lt;br /&gt;
* 2010-08-29: New protocol: [[IRMP_-_english#KASEIKYO|KASEIKYO]]&lt;br /&gt;
&lt;br /&gt;
* 2010-07-01: Bugfix: deactivating of [[IRMP_-_english#RECS80|RECS80]], [[IRMP_-_english#RECS80EXT|RECS80EXT]] &amp;amp; [[IRMP_-_english#SIEMENS_+_RUWIDO|SIEMENS]], if interrupt frequency is too low&lt;br /&gt;
&lt;br /&gt;
* 2010-06-25: New protocol: [[IRMP_-_english#RCCAR|RCCAR]]&lt;br /&gt;
&lt;br /&gt;
* 2010-06-09: New protocol: [[IRMP_-_english#FDC|FDC]] (IR-keyboard)&lt;br /&gt;
* 2010-06-09: Corrected timing for [[IRMP_-_english#DENON|DENON]] protocol&lt;br /&gt;
&lt;br /&gt;
* 2010-06-02: New protocol: [[IRMP_-_english#SIEMENS_+_RUWIDO|SIEMENS]] (Gigaset)&lt;br /&gt;
* 2010-06-02: Simulation of long key presses&lt;br /&gt;
&lt;br /&gt;
* 2010-05-26: New protocol: [[IRMP_-_english#GRUNDIG_+_NOKIA|NOKIA]]&lt;br /&gt;
&lt;br /&gt;
* 2010-05-17: New protocol: [[IRMP_-_english#GRUNDIG_+_NOKIA|GRUNDIG]]&lt;br /&gt;
* 2010-05-17: Handling of frame repetitions for [[IRMP_-_english#SIRCS|SIRCS]], [[IRMP_-_english#SAMSUNG32|SAMSUNG32]], and [[IRMP_-_english#NUBERT|NUBERT]]&lt;br /&gt;
&lt;br /&gt;
* 2010-04-28: Support of [[IRMP_-_english#APPLE|APPLE]] protocol&lt;br /&gt;
* 2010-04-28: added configuration by [http://www.mikrocontroller.net/svnbrowser/irmp/irsndconfig.h?view=markup irsndconfig.h]&lt;br /&gt;
&lt;br /&gt;
* 2010-04-16: Optimized all timing tolerancies&lt;br /&gt;
&lt;br /&gt;
* 2010-04-14: New protocol: [[IRMP_-_english#B&amp;amp;O|Bang &amp;amp; Olufsen]]&lt;br /&gt;
&lt;br /&gt;
* 2010-03-17: New protocol: [[IRMP_-_english#NUBERT|NUBERT]]&lt;br /&gt;
* 2010-03-17: Corrected length of pauses between frame repetitions&lt;br /&gt;
&lt;br /&gt;
* 2010-03-16: Corrected timer register TCCR2&lt;br /&gt;
* 2010-03-16: Corrected [[IRMP_-_english#RECS80|RECS80]] start bit timings&lt;br /&gt;
* 2010-03-16: New protocol: [[IRMP_-_english#RECS80EXT|RECS80 Extended]]&lt;br /&gt;
&lt;br /&gt;
* 2010-03-11: Adapted code to several ATMega types&lt;br /&gt;
&lt;br /&gt;
* 2010-03-07: Alpha version&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Infrarot]]&lt;br /&gt;
[[Kategorie:AVR-Projekte]]&lt;/div&gt;</summary>
		<author><name>Tooki</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=IRMP_-_english&amp;diff=106081</id>
		<title>IRMP - english</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=IRMP_-_english&amp;diff=106081"/>
		<updated>2023-04-26T08:37:47Z</updated>

		<summary type="html">&lt;p&gt;Tooki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;By &#039;&#039;&#039;Frank M. ([http://www.mikrocontroller.net/user/show/ukw ukw])&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;This is the English translation of the [[IRMP#top|German IRMP documentation]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[[Datei:irmp-title.png| |Waveform of an NEC-format remote control signal]]&lt;br /&gt;
&lt;br /&gt;
Project Intent:&lt;br /&gt;
&lt;br /&gt;
Because RC5 is not only outdated, but obsolete, and because more and more electronic devices from Asian consumer electronics manufacturers are found in the home, it is time to develop an IR decoder that can &#039;understand&#039; about 90% of IR remotes that are used in our daily life.&lt;br /&gt;
&lt;br /&gt;
This article introduces &#039;IRMP&#039; as &amp;quot;Infrared Multi Protocol Decoder&amp;quot; in detail. The counterpart, the [[IRSND_-_english|IRSND]] IR encoder, can be found in this [[IRSND_-_english|document]].&lt;br /&gt;
&lt;br /&gt;
= IRMP - Infrared Multi Protocol Decoder =&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width: 80%;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 20%;&amp;quot; |&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
=== Supported MCUs ===&lt;br /&gt;
&lt;br /&gt;
[[IRMP_-_english#top|IRMP]] runs on numerous MCU families:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AVR&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* ATtiny87,  ATtiny167&lt;br /&gt;
* ATtiny45,  ATtiny85&lt;br /&gt;
* ATtiny44,  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;
&#039;&#039;&#039;XMega&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* ATXmega128&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC&#039;&#039;&#039; (CCS and XC8/C18 compiler)&lt;br /&gt;
&lt;br /&gt;
* PIC12F1840&lt;br /&gt;
* PIC18F4520&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;STM32&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* STM32F4xx (tested on STM32F401RE/F411RE Nucleo, STM32F4 Discovery)&lt;br /&gt;
* STM32F10x (tested on STM32F103C8T6 Mini Development Board)&lt;br /&gt;
* STM32 with HAL library &#039;&#039;&#039;(NEW!)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;STM8&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* STM8S103F3&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TI Stellaris&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* LM4F120 Launchpad (ARM Cortex M4)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ESP8266 (NEW!)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* ESP8266-EVB&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TEENSY 3.0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* MK20DX256VLH7 (ARM Cortex-M4 72MHz)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MBED (NEW!)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* LPC1347 Cortex-M3 72 MHz&lt;br /&gt;
* LPC4088 (Embedded Artists)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ChibiOS HAL (NEW!)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Various ARM Cortex MCUss, for example STM32, Kinetis, and NRF5&lt;br /&gt;
* [https://sourceforge.net/p/chibios/svn2/HEAD/tree/trunk/os/hal/ports/ Officially supported MCU series]&lt;br /&gt;
* [https://github.com/ChibiOS/ChibiOS-Contrib/tree/master/os/hal/ports More MCU series, community supported]&lt;br /&gt;
||&lt;br /&gt;
[[Datei:irmp-empfaenger.png|miniatur|Connection of a IR receiver module to MCU]]&lt;br /&gt;
|}&lt;br /&gt;
=== Supported IR Protocols ===&lt;br /&gt;
&lt;br /&gt;
[[IRMP_-_english#top|IRMP]] - the infrared remote decoder, which can decode several protocols at once - is capable of decoding the following protocols (in alphabetical order):&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|+ &#039;&#039;&#039;Supported Protocols&#039;&#039;&#039;&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! style=&amp;quot;width:15%&amp;quot; | Protocol || Vendor&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#A1TVBOX|A1TVBOX]] || ADB (Advanced Digital Broadcast), e.g. A1 TV Box&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#APPLE|APPLE]] || Apple&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#ACP24|ACP24]] || Stiebel Eltron&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#B&amp;amp;O|B&amp;amp;O]] || Bang &amp;amp; Olufsen&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#BOSE|BOSE]] || Bose&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#DENON|DENON]] || Denon, Sharp&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#FAN|FAN]] || FAN, remote for fans&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#FDC|FDC]] || FDC Keyboard&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#GRUNDIG_+_NOKIA|GRUNDIG]] || Grundig&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#GRUNDIG_+_NOKIA|NOKIA]] || Nokia, e.g. D-Box&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#IR60 (SDA2008)|IR60 (SDA2008)]] || various European vendors&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#JVC|JVC]] || JVC&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#KASEIKYO|KASEIKYO]] || Panasonic, Technics, Denon and other vendors which are members of the Japanese &amp;quot;Association for Electric Home Appliances&amp;quot; (AEHA).&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#KATHREIN|KATHREIN]]  || KATHREIN&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#LEGO|LEGO]]   || Lego&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#LGAIR|LGAIR]]   || LG air conditioners&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#MATSUSHITA|MATSUSHITA]] || Matsushita&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#MITSU_HEAVY|MITSU_HEAVY]] || Mitsubishi air conditioners&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#NEC16|NEC16]]  || JVC, Daewoo&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#NEC42|NEC42]]  || JVC&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#MERLIN|MERLIN]]  || MERLIN remote (Pollin article number: 620 185)&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#NEC_+_extended_NEC|NEC]] || NEC, Yamaha, Canon, Tevion, Harman/Kardon, Hitachi, JVC, Pioneer, Toshiba, Xoro, Orion, generic and many other Asian vendors.&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#NETBOX|NETBOX]]  || Netbox&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#Nikon|Nikon]] || Nikon&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#NUBERT|NUBERT]] || Nubert, e.g. Subwoofer Systems&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#ORTEK|ORTEK]] || Ortek, Hama&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#PANASONIC|PANASONIC]] || PANASONIC video projectors&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#PENTAX|PENTAX]] || PENTAX&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#RC5_+_RC5X|RC5]] || Philips and other European vendors&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#RC6_+_RC6A|RC6A]] || Philips, Kathrein and others, e.g. XBOX&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#RC6_+_RC6A|RC6]] || Philips and other European vendors&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#RCCAR|RCCAR]] || RC Car: IR remote for RC toys &lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#RCII|RCII]] || T+A &#039;&#039;&#039;(NEW!)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#RECS80|RECS80]] || Philips, Nokia, Thomson, Nordmende, Telefunken, Saba&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#RECS80EXT|RECS80EXT]] || Philips, Technisat, Thomson, Nordmende, Telefunken, Saba&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#RCMM|RCMM]] || Fujitsu-Siemens e.g. Activy keyboard&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#ROOMBA|ROOMBA]] || iRobot Roomba vacuum cleaner&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#S100|S100]] || similar to RC5, but 14 instead of 13 bits and 56kHz modulation. Vendor unknown.&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#SAMSUNG32|SAMSUNG32]] || Samsung&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#SAMSUNG48|SAMSUNG48]] || various air conditioners&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#SAMSUNG|SAMSUNG]] || Samsung&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#SIEMENS_+_RUWIDO|RUWIDO]] || RUWIDO (e.g. T-Home Media Receiver, MERLIN keyboard(Pollin))&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#SIEMENS_+_RUWIDO|SIEMENS]] || Siemens, e.g. Gigaset M740AV&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#SIRCS|SIRCS]] || Sony&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#SPEAKER|SPEAKER]] || Speaker systems like X-Tensions&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#TECHNICS|TECHNICS]] || Technics&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#TELEFUNKEN|TELEFUNKEN]] || Telefunken&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#THOMSON|THOMSON]] || Thomson&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#VINCENT|VINCENT]] || Vincent&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#FF0000&amp;quot;&amp;gt;&#039;&#039;&#039;New:&#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Starting with version 3.2, IRMP can also decode 433 MHz RF radio protocols.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|+ &#039;&#039;&#039;Supported RF Protocols&#039;&#039;&#039;&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! style=&amp;quot;width:15%&amp;quot; | Protocol&lt;br /&gt;
! style=&amp;quot;width:100em&amp;quot; | Vendor&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP#RF_GEN24|RF_GEN24]] || Generiv 24-bit format, e.g. Pollin 550666 radio-controlled receptacle&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP#RF_X10|RF_X10]] || X10 PC RF remote control (Medion), Pollin 721815&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Each of these protocols can be activated separately. If you want, you can activate all protocols. If you need only one protocol, you can disable all others. Only the code selected by the user will be compiled .&lt;br /&gt;
&lt;br /&gt;
=== History ===&lt;br /&gt;
&lt;br /&gt;
The [[IRMP_-_english#top|IRMP]] source for the AVR and PIC MCUs was created as part of the [[Word Clock]] project.&lt;br /&gt;
&lt;br /&gt;
=== Thread in Forum ===&lt;br /&gt;
&lt;br /&gt;
Intention for an own IRMP article is the following thread in Projects&amp;amp;Code [http://www.mikrocontroller.net/topic/162119 IRMP - Infrared Multi Protocol Decoder] (in German language).&lt;br /&gt;
&lt;br /&gt;
== IR Protocols ==&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width: 80%;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 20%;&amp;quot; |&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
Some vendors use their own proprietary protocols, such as Sony, Samsung, and Matsushita. Philips developed and used [[IRMP_-_english#RC5 + RC5X|RC5]].&lt;br /&gt;
[[IRMP_-_english#RC5 + RC5X|RC5]] was seen in Europe as &#039;&#039;the&#039;&#039; standard IR protocol which was adopted by many European vendors. Nowadays [[IRMP_-_english#RC5 + RC5X|RC5]] is practically not used and can be considered &amp;quot;dead&amp;quot;. Although the successor [[IRMP_-_english#RC6_+_RC6A|RC6]] is used in current European hardware, it is also used rarely.&lt;br /&gt;
&lt;br /&gt;
Japanese vendors also tried to establish their own standard, the so called [[IRMP_-_english#KASEIKYO|Kaseikyo]] (or &amp;quot;Japan&amp;quot;) protocol. With a word length of 48 bits, it is more versatile. But it has not found wide use, though it is found in some appliances.&lt;br /&gt;
&lt;br /&gt;
Nowadays the [[IRMP_-_english#NEC_+_extended_NEC|NEC]] protocol is used (also mainly in Japanese devices) in both premium and generic products. I estimate the market share at 80% for the [[IRMP_-_english#NEC_+_extended_NEC|NEC]] protocol. Nearly all remotes in my daily use utilize the [[IRMP_-_english#NEC_+_extended_NEC|NEC]] IR code. This starts with the TV set, continues with the DVD player and the notebook remote all the way to the generic multimedia hard drive, just to mention a few examples.&lt;br /&gt;
||&lt;br /&gt;
[[Datei:nec-protocol.png|miniatur|NEC protocol, RGB remote control, T-&amp;gt;A: 9.14ms, A-&amp;gt;B: 4.42ms, B-&amp;gt;C: 660us]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Coding methods ==&lt;br /&gt;
&lt;br /&gt;
[[IRMP_-_english#top|IRMP]] supports the following IR coding methods:&lt;br /&gt;
&lt;br /&gt;
* [[IRMP_-_english#Pulse Distance|Pulse Distance]], typ. Example: [[IRMP_-_english#NEC_+_extended_NEC|NEC]]&lt;br /&gt;
* [[IRMP_-_english#Pulse Width|Pulse Width]], typ. Example: [[IRMP_-_english#SIRCS|Sony SIRCS]]&lt;br /&gt;
* [[IRMP_-_english#Biphase|Biphase (Manchester)]], typ. Example: Philips [[IRMP_-_english#RC5_+_RC5X|RC5]], [[IRMP_-_english#RC6_+_RC6A|RC6]]&lt;br /&gt;
* [[IRMP_-_english#Pulse Position|Pulse Position (NRZ)]], typ. Example: [[IRMP_-_english#NETBOX|Netbox]]&lt;br /&gt;
* [[IRMP_-_english#Pulse Distance Width|Pulse Distance Width]], typ. Example: [[IRMP_-_english#NUBERT|Nubert]]&lt;br /&gt;
&lt;br /&gt;
The pulses are modulated - usually at 36 kHz or 38 kHz - to reduce environmental influences such as indoor lighting or sunlight.&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width: 80%;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 20%;&amp;quot; |&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
=== Pulse Distance ===&lt;br /&gt;
&lt;br /&gt;
Pulse distance coding can be identified by the following rule:&lt;br /&gt;
&lt;br /&gt;
* there is only &#039;&#039;&#039;one pulse length&#039;&#039;&#039; and there are &#039;&#039;&#039;two different space lengths&#039;&#039;&#039;&lt;br /&gt;
||&lt;br /&gt;
[[Datei:Pulse-Distance.png|miniatur|Pulse distance coding]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width: 80%;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 20%;&amp;quot; |&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
=== Pulse Width ===&lt;br /&gt;
&lt;br /&gt;
Pulse width coding can be identified by the following rule: &lt;br /&gt;
&lt;br /&gt;
* there are &#039;&#039;&#039;two different pulse lengths&#039;&#039;&#039; and &#039;&#039;&#039;only one space length&#039;&#039;&#039;&lt;br /&gt;
||&lt;br /&gt;
[[Datei:Pulse-Width.png|miniatur|Pulse width coding]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width: 80%;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 20%;&amp;quot; |&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
=== Pulse Distance Width ===&lt;br /&gt;
&lt;br /&gt;
This is a mix of pulse distance and pulse width coding. Often the sum of pulse and space length is constant. The rule is:&lt;br /&gt;
&lt;br /&gt;
* there are &#039;&#039;&#039;two different pulse lengths&#039;&#039;&#039; and &#039;&#039;&#039;two different space lengths.&#039;&#039;&#039;&lt;br /&gt;
||&lt;br /&gt;
[[Datei:Pulse-Distance-Width.png|miniatur|Pulse distance width coding]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width: 80%;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 20%;&amp;quot; |&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
=== Biphase ===&lt;br /&gt;
&lt;br /&gt;
In biphase coding the order of pulse and space gives the bit value.&lt;br /&gt;
Therefore a biphase boding can be identified by this criteria:&lt;br /&gt;
&lt;br /&gt;
* there is exactly &#039;&#039;&#039;one&#039;&#039;&#039; pulse and space length, as well as the &#039;&#039;&#039;double&#039;&#039;&#039; pulse/space length&lt;br /&gt;
&lt;br /&gt;
Usually the length for the pulse and space are equal, meaning that the signal shape is symmetric. But IRMP also recognizes protocols which use different pulse and space lengths, for example the [[IRMP_-_english#A1TVBOX|A1TVBOX]] protocol.&lt;br /&gt;
||&lt;br /&gt;
[[Datei:Biphase-Coding.png|miniatur|Biphase coding]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width: 80%;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 20%;&amp;quot; |&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
=== Pulse Position ===&lt;br /&gt;
&lt;br /&gt;
Pulse position coding is known from commmon UARTs. Here, every bit has a fixed length. Depending on the value (0 or 1), it is a pulse or a space.&lt;br /&gt;
&lt;br /&gt;
Typical criteria for a &#039;&#039;&#039;pulse position protocol&#039;&#039;&#039; are:&lt;br /&gt;
* there are &#039;&#039;&#039;multiples&#039;&#039;&#039; of a basic pulse/space length&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A tabular listing of different IR protocols can be found here: [[IRMP_-_english#IR_Protocols_in_Detail|IR Protocols in Detail]].&#039;&#039;&#039;&lt;br /&gt;
The specified timings are typical values. In some remotes they differ up to 40% in real life. Therefore [[IRMP_-_english#top|IRMP]] uses minimum/maximum limits to be tolerant with the timing.&lt;br /&gt;
||&lt;br /&gt;
[[Datei:Pulse-Position.png|miniatur|Pulse position coding]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Protocol Detection ==&lt;br /&gt;
&lt;br /&gt;
Most of the protocols [[IRMP_-_english#top|IRMP]] decodes have something in common: they exhibit a start bit whose timing is unique.&lt;br /&gt;
&lt;br /&gt;
According to this start bit timing, most protocols can be identified. [[IRMP_-_english#top|IRMP]] measures the timing of the start bit and adjusts its timing tables &amp;quot;on-the-fly&amp;quot; to the discovered protocol. Subsequent bits can then be read sequentially without the need to first store a complete frame.&lt;br /&gt;
Thus, [[IRMP_-_english#top|IRMP]] does not wait to read a complete frame but starts decoding directly after detecting the first pulse.&lt;br /&gt;
&lt;br /&gt;
If the start bit is not unique, [[IRMP_-_english#top|IRMP]] proceeds in parallel with multiple possible protocols. For example with two candidate protocols, once plausible reasons disqualify one protocol, the other protocol is used.&lt;br /&gt;
&lt;br /&gt;
Detection is implemented as an interrupt-driven [[Statemachine|state machine]] which is called at a frequency of typically 15000 times per second. Among others, the [[Statemachine|state machine]] has the following states:&lt;br /&gt;
&lt;br /&gt;
* detect the first pulse length of the start bit&lt;br /&gt;
* detect the space length of the start bit&lt;br /&gt;
* detect the space length of the first data bit&lt;br /&gt;
&lt;br /&gt;
After that, the pulse and space lengths of the start bit are known. Now all enabled protocols are searched for these lengths. If a protocol matches, the timing table for this protocol is loaded. Subsequent bits are checked against the timing table to ensure they conform to it.&lt;br /&gt;
&lt;br /&gt;
The [[Statemachine|state machine]] continues with the following states:&lt;br /&gt;
&lt;br /&gt;
* detect the spaces of the data bits&lt;br /&gt;
* detect the pulse length of the data bits&lt;br /&gt;
* check timing. If different, switch back to another valid IR protocol, otherwise return&lt;br /&gt;
* detect the stop bit, if present in the protocol&lt;br /&gt;
* check data for plausibility, like CRC or other redundancy bits&lt;br /&gt;
* convert data to device address and command&lt;br /&gt;
* detect code repetition by long key press, set corresponding flag&lt;br /&gt;
&lt;br /&gt;
Indeed the [[Statemachine|state machine]] is even more complex because some protocols have no start bit (e.g. [[IRMP_-_english#DENON|Denon]]) or have multiple start bits (4 in [[IRMP_-_english#B.26O|B&amp;amp;O]]) or have another sync bit within the frame (e.g. [[IRMP_-_english#SAMSUNG|Samsung]]). These extra conditions are caught in the code by protocol-specific &amp;quot;special cases&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Switching to an other protocol can happen multiple times while receiving a frame, e.g. from [[IRMP_-_english#NEC42|NEC42]] (42 bits) to [[IRMP_-_english#NEC16|NEC16]] (8 bits + sync bit + 8 bits), if a premature sync bit is detected. Or from [[IRMP_-_english#NEC + extended NEC|NEC]]/[[IRMP_-_english#NEC42|NEC42]] (32/42 bits) to [[IRMP_-_english#JVC|JVC]] (16 bits) if the stop bit occurs prematurely. It becomes difficult when, after detecting the start bit, two possible protocols use different coding methods, e.g. when the one protocol uses [[IRMP_-_english#Pulse Distance|pulse distance coding]] and the other uses [[IRMP_-_english#Biphase|biphase coding (Manchester)]]. In this case [[IRMP_-_english#top|IRMP]] stores the necessary bits for both coding methods and later discards one or the other.&lt;br /&gt;
&lt;br /&gt;
Furthermore, some remotes using particular protocols transmit repeat frames, either for redundancy (error detection) or for long key presses. Both kinds are detected by IRMP: error detection frames are detected by IRMP, but not passed to the application. Others are detected as long key presses and flagged by IRMP.&lt;br /&gt;
&lt;br /&gt;
== Download ==&lt;br /&gt;
&lt;br /&gt;
Version 3.2.6, Date: 2021-01-27&lt;br /&gt;
&lt;br /&gt;
Download stable version: [http://www.mikrocontroller.net/wikifiles/7/79/Irmp.zip Irmp.zip] &lt;br /&gt;
&lt;br /&gt;
Current development version of [[IRMP_-_english#top|IRMP]] &amp;amp; [[IRSND_-_english|IRSND]]:&lt;br /&gt;
&lt;br /&gt;
* SVN link: [svn://mikrocontroller.net/irmp/ SVN]&lt;br /&gt;
* SVN browser: [http://www.mikrocontroller.net/svnbrowser/irmp/ IRMP in SVN]&lt;br /&gt;
* Download tarball: [http://www.mikrocontroller.net/svnbrowser/irmp/?view=tar Tarball].&lt;br /&gt;
&lt;br /&gt;
Download Arduino library: [https://github.com/ukw100/IRMP GitHub] or use Arduino &amp;quot;&#039;&#039;Tools / Manage Libraries...&#039;&#039;&amp;quot; and search for IRMP.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;You can see the history of the software changes here: [[IRMP_-_english#Software_History|Software History]]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== License ==&lt;br /&gt;
&lt;br /&gt;
IRMP is Open Source Software and is released under the [https://www.gnu.org/licenses/old-licenses/gpl-2.0.html GPL v2], or&lt;br /&gt;
(at your option) any later version.&lt;br /&gt;
&lt;br /&gt;
== Source Code ==&lt;br /&gt;
&lt;br /&gt;
The source code can be easily compiled for AVR MCUs by loading the project file irmp.aps in AVR Studio 4.&lt;br /&gt;
&lt;br /&gt;
For other development environments it is simple to create a project or makefile. The source includes:&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmp.c?view=markup irmp.c] - IR decoder core&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmpprotocols.h?view=markup irmpprotocols.h] - all protocol definitions&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmpsystem.h?view=markup irmpsystem.h] - target-independent definitions for AVR/PIC/STM32&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmp.h?view=markup irmp.h] - include file for the application&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmpconfig.h?view=markup irmpconfig.h] - user configuration&lt;br /&gt;
&lt;br /&gt;
Sample applications (main functions and timer configurations):&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-avr.c?view=markup irmp-main-avr.c] - AVR&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-avr-uart.c?view=markup irmp-main-avr-uart.c] - AVR with UART output&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-pic-xc8.c?view=markup irmp-main-pic-xc8.c] - PIC18F4520&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-pic-12F1840.c?view=markup irmp-main-pic-12F1840.c] - PIC12F1840&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-stm32.c?view=markup irmp-main-stm32.c] - STM32&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-stellaris-arm.c?view=markup irmp-main-stellaris-arm.c] - TI Stellaris LM4F120 Launchpad&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-esp8266.c?view=markup irmp-main-esp8266.c] - ESP8266&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-mbed.cpp?view=markup irmp-main-mbed.cpp] - MBED&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/examples/Arduino/Arduino.ino?view=markup examples/Arduino/Arduino.ino] - Teensy 3.x&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-chibios.c?view=markup irmp-main-chibios.c] - ChibiOS&lt;br /&gt;
&lt;br /&gt;
{{Warnung|&lt;br /&gt;
;Important: include only irmp.h in your application:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;irmp.h&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
All other include files are included within irmp.h. See also the sample application irmp-main-avr.c.&lt;br /&gt;
&lt;br /&gt;
Furthermore, the preprocessor constant &#039;&#039;&#039;F_CPU in project or makefile&#039;&#039;&#039; must be defined. This should have at least the value of 8000000UL, processor speed should be at least 8 MHz. This applies to AVR targets and not for MCUs with PLL. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[IRMP_-_english#top|IRMP]] also runs on PIC processors. For the PIC-CCS compiler the necessary preprocessor defines are already set, such that [http://www.mikrocontroller.net/svnbrowser/irmp/irmp.c?view=markup irmp.c] can be directly used in the CCS environment. Only a short interrupt service routine like &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
must be added. The interrupt period time must be set to 66 µs (15 kHz).&lt;br /&gt;
&lt;br /&gt;
For AVR processors you will find an example for the usage of [[IRMP_-_english#top|IRMP]] in [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-avr.c?view=markup irmp-main-avr.c]. The main things are the [[AVR-GCC-Tutorial/Die_Timer_und_Zähler_des_AVR|Timer]] initializing of the timer and the processing of received IR commands. The received protocol, the device address and the command will be output on the HW-UART.&lt;br /&gt;
&lt;br /&gt;
For the Stellaris LM4F120 Launchpad from TI (ARM Cortex M4) is a propriate timer init function already integrated in [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-avr.c?view=markup irmp-main-avr.c].&lt;br /&gt;
&lt;br /&gt;
[[IRMP_-_english#top|IRMP]] can be used also with STM32 microcontrollers.&lt;br /&gt;
&lt;br /&gt;
Another new implementation is available on the mbed platform.&lt;br /&gt;
&lt;br /&gt;
=== avr-gcc Optimizations ===&lt;br /&gt;
&lt;br /&gt;
From version 4.7.x of avr-gcc, the [https://gcc.gnu.org/onlinedocs/gccint/LTO.html#LTO LTO option] can be used to make the call of the external function irmp_ISR() from the main ISR more efficient. This improves the performance of the ISR a little.&lt;br /&gt;
&lt;br /&gt;
Add the following compiler and linker options:&lt;br /&gt;
&lt;br /&gt;
* additional compiler option: -flto&lt;br /&gt;
* additional linker options: -flto -Os&lt;br /&gt;
&lt;br /&gt;
If you forget the additional linker option -Os, the binary will be significantly larger as it will not be optimized further. Also, the option -flto must be passed to the linker, otherwise link time optimization will not work.&lt;br /&gt;
&lt;br /&gt;
=== Configuration ===&lt;br /&gt;
&lt;br /&gt;
[[IRMP_-_english#top|IRMP]] is configured by parameters in  [http://www.mikrocontroller.net/svnbrowser/irmp/irmpconfig.h?view=markup irmpconfig.h]:&lt;br /&gt;
&lt;br /&gt;
* [[IRMP_-_english#F_INTERRUPTS|number of interrupts per second]]&lt;br /&gt;
* [[IRMP_-_english#IRMP_SUPPORT_xxx_PROTOCOL|supported IR protocols]]&lt;br /&gt;
* [[IRMP_-_english#IRMP_PORT_LETTER + IRMP_BIT_NUMBER|hardware pin for IR receiver]]&lt;br /&gt;
* [[IRMP_-_english#IRMP_LOGGING|IR logging]]&lt;br /&gt;
&lt;br /&gt;
=== Settings in irmpconfig.h ===&lt;br /&gt;
&lt;br /&gt;
[[IRMP_-_english#top|IRMP]] will decode all protocols listed above in one ISR. For this, some settings are needed. These are set in [http://www.mikrocontroller.net/svnbrowser/irmp/irmpconfig.h?view=markup irmpconfig.h].&lt;br /&gt;
&lt;br /&gt;
==== F_INTERRUPTS ====&lt;br /&gt;
&lt;br /&gt;
Number of interrupts per second. Should be set to a value from 10000 to 20000. The higher the value, the better the resolution and therefore the quality of detection. But a higher interrupt rate means also higher CPU load. A value of 15000 is usually a good compromise.&lt;br /&gt;
&lt;br /&gt;
Default value:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
#define F_INTERRUPTS                            15000      // interrupts per second&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On AVR controllers, the [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-avr.c?view=markup irmp-main-avr.c] example uses Timer1 with 16 bits of resolution. If for any reasons Timer1 is not available, you can also use Timer2 with 8 bits of resolution.&lt;br /&gt;
&lt;br /&gt;
In that case, configure Timer2 as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
OCR2   =  (uint8_t) ((F_CPU / F_INTERRUPTS) / 8) - 1 + 0.5);   // Compare Register OCR2&lt;br /&gt;
TCCR2  = (1 &amp;lt;&amp;lt; WGM21) | (1 &amp;lt;&amp;lt; CS21);                           // CTC Mode, prescaler = 8&lt;br /&gt;
TIMSK  = 1 &amp;lt;&amp;lt; OCIE2;                                           // enable Timer2 interrupt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The above example is valid for ATmega88/ATmega168/ATmega328. For other AVR MCUs check the datasheet.&lt;br /&gt;
&lt;br /&gt;
You must not forget to change the ISR to Timer2 as well:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
ISR(TIMER2_COMP_vect)&lt;br /&gt;
{&lt;br /&gt;
  (void) irmp_ISR(); &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== IRMP_SUPPORT_xxx_PROTOCOL ====&lt;br /&gt;
&lt;br /&gt;
Here you can select which protocols to enable in [[IRMP_-_english#top|IRMP]]. Common protocols are emabled by default.&lt;br /&gt;
&lt;br /&gt;
To enable additional protocols or disable others to save memory, set the corresponding values in [http://www.mikrocontroller.net/svnbrowser/irmp/irmpconfig.h?view=markup irmpconfig.h].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&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;
&lt;br /&gt;
// more protocols, enable here!                 Enable  Remarks                 F_INTERRUPTS            Program Space&lt;br /&gt;
#define IRMP_SUPPORT_DENON_PROTOCOL             0       // DENON, Sharp         &amp;gt;= 10000                 ~250 bytes&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 (SDA2008)       &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_BOSE_PROTOCOL              0       // BOSE                 &amp;gt;= 10000                 ~150 bytes&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_ORTEK_PROTOCOL             0       // ORTEK (Hama)         &amp;gt;= 10000                 ~150 bytes&lt;br /&gt;
#define IRMP_SUPPORT_TELEFUNKEN_PROTOCOL        0       // Telefunken 1560      &amp;gt;= 10000                 ~150 bytes&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_ROOMBA_PROTOCOL            0       // iRobot Roomba        &amp;gt;= 10000                 ~150 bytes&lt;br /&gt;
#define IRMP_SUPPORT_RUWIDO_PROTOCOL            0       // RUWIDO, T-Home       &amp;gt;= 15000                 ~550 bytes&lt;br /&gt;
#define IRMP_SUPPORT_A1TVBOX_PROTOCOL           0       // A1 TV BOX            &amp;gt;= 15000 (better 20000)  ~300 bytes&lt;br /&gt;
#define IRMP_SUPPORT_LEGO_PROTOCOL              0       // LEGO Power RC        &amp;gt;= 20000                 ~150 bytes&lt;br /&gt;
#define IRMP_SUPPORT_RCMM_PROTOCOL              0       // RCMM 12, 24, or 32    &amp;gt;= 20000                 ~150 bytes&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each IR protocol enabled in [[IRMP_-_english#top|IRMP]]  consumes the amount of code noted above. Here you can apply optimizations: for example, the modulation frequency of 455 kHz for the [[IRMP_-_english#B&amp;amp;O|B&amp;amp;O]] protocol is far away from the frequencies that are used by other protocols. This usually requires a different IR receiver, so without that, you can disable these protocols. For example, you cannot receive the [[IRMP_-_english#B&amp;amp;O|B&amp;amp;O]] protocol (455kHz) with a TSOP1738/TSOP31238.&lt;br /&gt;
&lt;br /&gt;
Additionally, the [[IRMP_-_english#SIEMENS_+_RUWIDO|SIEMENS]]/[[IRMP_-_english#FDC|FDC]]/[[IRMP_-_english#RCCAR|RCCAR]] can only be detected reliably at a frequency of 15 kHz or higher. For [[IRMP_-_english#LEGO|LEGO]], 20 kHz is needed. To use these protocols, you must modify [[IRMP_-_english#F_INTERRUPTS|F_INTERRUPTS]]. Otherwise, during compilation you will get a warning and the corresponding protocols will automatically be disabled.&lt;br /&gt;
&lt;br /&gt;
==== IRMP_PORT_LETTER + IRMP_BIT_NUMBER ====&lt;br /&gt;
&lt;br /&gt;
This constant defines the pin where the IR receiver is connected.&lt;br /&gt;
&lt;br /&gt;
Default value is PORT B6:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
/*---------------------------------------------------------------------------&lt;br /&gt;
 * Change hardware pin here for ATMEL AVR&lt;br /&gt;
 *---------------------------------------------------------------------------&lt;br /&gt;
 */&lt;br /&gt;
#if defined (ATMEL_AVR)                         // use PB6 as IR input on AVR&lt;br /&gt;
#  define IRMP_PORT_LETTER                      B&lt;br /&gt;
#  define IRMP_BIT_NUMBER                       6&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These two values must match your hardware configuration.&lt;br /&gt;
&lt;br /&gt;
This applies also to STM32 MCUs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
/*----------------------------------------------------------------------------&lt;br /&gt;
 * Change hardware pin here for ARM STM32&lt;br /&gt;
 *----------------------------------------------------------------------------&lt;br /&gt;
 */&lt;br /&gt;
#elif defined (ARM_STM32)                       // use C13 as IR input on STM32&lt;br /&gt;
#  define IRMP_PORT_LETTER                      C&lt;br /&gt;
#  define IRMP_BIT_NUMBER                       13&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When using STM32 HAL library, define the constants IRSND_Transmit_GPIO_Port and IRSND_Transmit_Pin in STM32Cube (Main.h). In this case, it is not necessary to change the constants in irmpconfig.h:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
/*---------------------------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
 * ARM STM32 with HAL section - don&#039;t change here, define IRSND_Transmit_GPIO_Port &amp;amp; IRSND_Transmit_Pin in STM32Cube (Main.h)&lt;br /&gt;
 *---------------------------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
 */&lt;br /&gt;
#elif defined (ARM_STM32_HAL)                                           // IRSND_Transmit_GPIO_Port &amp;amp; IRSND_Transmit_Pin must be defined in STM32Cube&lt;br /&gt;
#  define IRSND_PORT_LETTER                     IRSND_Transmit_GPIO_Port//Port of Transmit PWM Pin e.g.&lt;br /&gt;
#  define IRSND_BIT_NUMBER                      IRSND_Transmit_Pin      //Pim of Transmit PWM Pin e.g.&lt;br /&gt;
#  define IRSND_TIMER_HANDLER                   htim2                   //Handler of Timer e.g. htim (see tim.h)&lt;br /&gt;
#  define IRSND_TIMER_CHANNEL_NUMBER            TIM_CHANNEL_2           //Channel of the used Timer PWM Pin e.g. TIM_CHANNEL_2&lt;br /&gt;
#  define IRSND_TIMER_SPEED_APBX                64000000                //Speed of the corresponding APBx. (see STM32CubeMX: Clock Configuration)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And the corresponding section for STM8 MCUs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
/*----------------------------------------------------------------------------&lt;br /&gt;
 * Change hardware pin here for STM8&lt;br /&gt;
 *----------------------------------------------------------------------------&lt;br /&gt;
 */&lt;br /&gt;
#elif defined (SDCC_STM8)                       // use PA1 as IR input on STM8&lt;br /&gt;
#  define IRMP_PORT_LETTER                      A&lt;br /&gt;
#  define IRMP_BIT_NUMBER                       1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For PIC microcontrollers only the constant &#039;&#039;&#039;IRMP_PIN&#039;&#039;&#039; needs to be changed - depending on the compiler:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
/*----------------------------------------------------------------------------&lt;br /&gt;
 * Change hardware pin here for PIC C18 compiler&lt;br /&gt;
 *----------------------------------------------------------------------------&lt;br /&gt;
 */&lt;br /&gt;
#elif defined (PIC_C18)                         // use RB4 as IR input on PIC&lt;br /&gt;
#  define IRMP_PIN                              PORTBbits.RB4&lt;br /&gt;
&lt;br /&gt;
/*----------------------------------------------------------------------------&lt;br /&gt;
 * Change hardware pin here for PIC CCS compiler&lt;br /&gt;
 *----------------------------------------------------------------------------&lt;br /&gt;
 */&lt;br /&gt;
#elif defined (PIC_CCS)                         // use PB4 as IR input on PIC&lt;br /&gt;
#  define IRMP_PIN                              PIN_B4&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When using ChibiOS HAL, define a pin with the name &#039;&#039;&#039;IR_IN&#039;&#039;&#039; in your board config (board.chcfg) of ChibiOS and regenerate the board files. To use another name for the pin, edit the constant &#039;&#039;&#039;IRMP_PIN&#039;&#039;&#039; in irmpconfig.h. Use the name of the pin from the board config and prefix it with &amp;quot;LINE_&amp;quot;, as IRMP is using the &amp;quot;line&amp;quot; variant of the PAL interface:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
/*---------------------------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
 * Change hardware pin here for ChibiOS HAL&lt;br /&gt;
 *---------------------------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
 */&lt;br /&gt;
#elif defined(_CHIBIOS_HAL_)&lt;br /&gt;
#  define IRMP_PIN                              LINE_IR_IN              // use pin names as defined in the board config file, prefixed with &amp;quot;LINE_&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== IRMP_HIGH_ACTIVE ====&lt;br /&gt;
&lt;br /&gt;
Default value:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
#  define IRMP_HIGH_ACTIVE                      0                       // set to 1 if you use a RF receiver!&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Most RF receivers use active-high signals, so when using an RF receiver instead of an IR sensor, set this value to 1.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#FF0000&amp;quot;&amp;gt;&#039;&#039;&#039;NEU:&#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== IRMP_ENABLE_RELEASE_DETECTION ====&lt;br /&gt;
&lt;br /&gt;
Default value:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
#  define IRMP_ENABLE_RELEASE_DETECTION         0                       //  enable detection of key releases&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Set this value to 1 to enable detection of button release events. The function irmp_get_data() then sets the IRMP_FLAG_RELEASE bit in the struct member irmp_data.flags once code transmission ends. See the example in the section  &#039;&#039;&#039;[[IRMP_-_english#Debouncing|Debouncing]]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== IRMP_USE_CALLBACK ====&lt;br /&gt;
&lt;br /&gt;
Default value:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
#define IRMP_USE_CALLBACK                      0        // flag: 0 = don&#039;t use callbacks, 1 = use callbacks, default is 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When you turn on callbacks, any level change at the input causes the callback function to be called. This can be used to visualize incoming IR signals by driving another output pin.&lt;br /&gt;
&lt;br /&gt;
Here is an example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
#define LED_PORT PORTD                                  // LED at PD6&lt;br /&gt;
#define LED_DDR  DDRD&lt;br /&gt;
#define LED_PIN  6&lt;br /&gt;
&lt;br /&gt;
/*-----------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
 * Called (back) from IRMP module&lt;br /&gt;
 * This example switches a LED (which is connected to Vcc)&lt;br /&gt;
 *-----------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
 */&lt;br /&gt;
void&lt;br /&gt;
led_callback (uint_fast8_t on)&lt;br /&gt;
{&lt;br /&gt;
    if (on)&lt;br /&gt;
    {&lt;br /&gt;
       LED_PORT &amp;amp;= ~(1 &amp;lt;&amp;lt; LED_PIN);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
       LED_PORT |= (1 &amp;lt;&amp;lt; LED_PIN);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int&lt;br /&gt;
main ()&lt;br /&gt;
{&lt;br /&gt;
    ...&lt;br /&gt;
    irmp_init ();&lt;br /&gt;
&lt;br /&gt;
    LED_DDR |= (1 &amp;lt;&amp;lt; LED_PIN);         // LED pin to output&lt;br /&gt;
    LED_PORT |= (1 &amp;lt;&amp;lt; LED_PIN);        // switch LED off (active low)&lt;br /&gt;
    irmp_set_callback_ptr (led_callback);&lt;br /&gt;
&lt;br /&gt;
    sei ();&lt;br /&gt;
    ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== IRMP_USE_IDLE_CALL ====&lt;br /&gt;
&lt;br /&gt;
Normally the irmp_ISR() function is called continuously at the F_INTERRUPTS (10-20kHz) frequency. The microcontroller can rarely enter an energy-saving sleep mode, or must constantly wake up from it. If power consumption is important, e.g. on battery power, this approach is not optimal.&lt;br /&gt;
&lt;br /&gt;
If &#039;&#039;IRMP_USE_IDLE_CALL&#039;&#039;&#039; is enabled, IRMP detects if no IR transmission is ongoing and then calls the function &#039;&#039;&#039;irmp_idle()&#039;&#039;&#039;. This is microcontroller-specific and must be provided and linked by the user. The microcontroller can then be put to sleep while there is no ongoing transmission, thus reducing energy consumption.&lt;br /&gt;
&lt;br /&gt;
It is recommended to deactivate the timer interrupt in irmp_idle() and to activate a pin change interrupt instead. Then the microcontroller can be put to sleep. When a falling edge is detected on the IR input pin, the pin change interrupt is disabled, the timer is reenabled and irmp_ISR() is called immediately. You can find an example for the use of irmp_idle() in [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-chibios.c?view=markup irmp-main-chibios.c].&lt;br /&gt;
&lt;br /&gt;
Using IRMP purely with pin change interrupts and without timer interrupts is not supported.&lt;br /&gt;
&lt;br /&gt;
==== IRMP_USE_EVENT ====&lt;br /&gt;
&lt;br /&gt;
When using IRMP with ChibiOS/RT or ChibiOS/NIL, you can use their Event module to wake a thread as soon as new IR data is received and decoded.&lt;br /&gt;
&lt;br /&gt;
Set the &#039;&#039;&#039;IRMP_USE_EVENT&#039;&#039;&#039; constant in irmpconfig.h to 1 to enable this. &#039;&#039;&#039;IRMP_EVENT_BIT&#039;&#039;&#039; definies the value in the Event bitmask that should symbolize the IRMP event. Use &#039;&#039;&#039;IRMP_EVENT_THREAD_PTR&#039;&#039;&#039; to define the variable name of the thread pointer that the event is sent to.&lt;br /&gt;
&lt;br /&gt;
Change irmpconfig.h like this:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
/*------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
 * Use ChibiOS Events to signal that valid IR data was received&lt;br /&gt;
 *------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
 */&lt;br /&gt;
#if defined(_CHIBIOS_RT_) || defined(_CHIBIOS_NIL_)&lt;br /&gt;
&lt;br /&gt;
#  ifndef IRMP_USE_EVENT&lt;br /&gt;
#    define IRMP_USE_EVENT                      1                     // 1: use event. 0: do not. default is 0&lt;br /&gt;
#  endif&lt;br /&gt;
&lt;br /&gt;
#  if IRMP_USE_EVENT == 1 &amp;amp;&amp;amp; !defined(IRMP_EVENT_BIT)&lt;br /&gt;
#    define IRMP_EVENT_BIT                      1                     // event flag or bit to send&lt;br /&gt;
#  endif&lt;br /&gt;
#  if IRMP_USE_EVENT == 1 &amp;amp;&amp;amp; !defined(IRMP_EVENT_THREAD_PTR)&lt;br /&gt;
#    define IRMP_EVENT_THREAD_PTR               ir_receive_thread_p   // pointer to the thread to send the event to&lt;br /&gt;
extern thread_t *IRMP_EVENT_THREAD_PTR;                               // the pointer must be defined and initialized elsewhere&lt;br /&gt;
#  endif&lt;br /&gt;
&lt;br /&gt;
#endif // _CHIBIOS_RT_ || _CHIBIOS_NIL_&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now you can use the event in your ChibiOS project like this:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
thread_t *ir_receive_thread_p = NULL;&lt;br /&gt;
&lt;br /&gt;
static THD_FUNCTION(IRThread, arg)&lt;br /&gt;
{&lt;br /&gt;
    ir_receive_thread_p = chThdGetSelfX();&lt;br /&gt;
    [...]&lt;br /&gt;
    while (true)&lt;br /&gt;
    {&lt;br /&gt;
        // wait for event sent from irmp_ISR&lt;br /&gt;
        chEvtWaitAnyTimeout(ALL_EVENTS,TIME_INFINITE);&lt;br /&gt;
&lt;br /&gt;
        if (irmp_get_data (&amp;amp;irmp_data))&lt;br /&gt;
            // use data in irmp_data&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== IRMP_LOGGING ====&lt;br /&gt;
&lt;br /&gt;
With IRMP_LOGGING the logging of received IR frames can be turned on.&lt;br /&gt;
&lt;br /&gt;
Default value:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
#define IRMP_LOGGING                            0       // 1: log IR signal (scan), 0: do not. default is 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Further documentation can be found here: [[IRMP_-_english#Scanning_unknown_IR_Protocols|Scanning Unknown IR Protocols]].&lt;br /&gt;
&lt;br /&gt;
=== Using IRMP ===&lt;br /&gt;
&lt;br /&gt;
The protocols supported by [[IRMP_-_english#top|IRMP]] use partly variable, partly fixed bit lengths from 2 up to 48 bits. These are described by preprocessor defines.&lt;br /&gt;
&lt;br /&gt;
[[IRMP_-_english#top|IRMP]] separates these IR frames into 3 sections:&lt;br /&gt;
&lt;br /&gt;
 1. protocol ID&lt;br /&gt;
 2. address or vendor code&lt;br /&gt;
 3. command&lt;br /&gt;
&lt;br /&gt;
With the function&lt;br /&gt;
&lt;br /&gt;
   irmp_get_data (IRMP_DATA * irmp_data_p)&lt;br /&gt;
&lt;br /&gt;
you can recall a decoded message. The return value is 1 if a message has been received, otherwise it is 0. In the first case the struct members&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
    irmp_data_p-&amp;gt;protocol (8 Bit)&lt;br /&gt;
    irmp_data_p-&amp;gt;address (16 Bit)&lt;br /&gt;
    irmp_data_p-&amp;gt;command (16 Bit)&lt;br /&gt;
    irmp_data_p-&amp;gt;flags (8 Bit)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
contain valid information.&lt;br /&gt;
&lt;br /&gt;
That means that ultimately, you have three values (protocol, address and command) that can be evaluated with an if or switch statement. &lt;br /&gt;
Here is a sample decoder which listens for keys 1-9 on a remote:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&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 protocol&lt;br /&gt;
          irmp_data.address == 0x1234)                   // Address 0x1234&lt;br /&gt;
      {&lt;br /&gt;
         switch (irmp_data.command)&lt;br /&gt;
         {&lt;br /&gt;
            case 0x0001: key1_pressed(); break;          // Key 1&lt;br /&gt;
            case 0x0002: key2_pressed(); break;          // Key 2&lt;br /&gt;
            ...&lt;br /&gt;
            case 0x0009: key9_pressed(); break;          // Key 9&lt;br /&gt;
         }&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here are possible constants for irmp_data.protocol, see also [http://www.mikrocontroller.net/svnbrowser/irmp/irmpprotocols.h?view=markup irmpprotocols.h]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
#define IRMP_SIRCS_PROTOCOL                      1              // Sony&lt;br /&gt;
#define IRMP_NEC_PROTOCOL                        2              // NEC, Pioneer, JVC, Toshiba, generic, 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 Media Receiver&lt;br /&gt;
#define IRMP_IR60_PROTOCOL                      24              // IR60 (SDA2008)&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;
#define IRMP_BOSE_PROTOCOL                      31              // BOSE&lt;br /&gt;
#define IRMP_A1TVBOX_PROTOCOL                   32              // A1 TV Box&lt;br /&gt;
#define IRMP_ORTEK_PROTOCOL                     33              // ORTEK - Hama&lt;br /&gt;
#define IRMP_TELEFUNKEN_PROTOCOL                34              // Telefunken (1560)&lt;br /&gt;
#define IRMP_ROOMBA_PROTOCOL                    35              // iRobot Roomba vacuum cleaner&lt;br /&gt;
#define IRMP_RCMM32_PROTOCOL                    36              // Fujitsu-Siemens (Activy remote control)&lt;br /&gt;
#define IRMP_RCMM24_PROTOCOL                    37              // Fujitsu-Siemens (Activy keyboard)&lt;br /&gt;
#define IRMP_RCMM12_PROTOCOL                    38              // Fujitsu-Siemens (Activy keyboard)&lt;br /&gt;
#define IRMP_SPEAKER_PROTOCOL                   39              // Another loudspeaker protocol, similar to Nubert&lt;br /&gt;
#define IRMP_LGAIR_PROTOCOL                     40              // LG air conditioner&lt;br /&gt;
#define IRMP_SAMSUNG48_PROTOCOL                 41              // air conditioner with Samsung protocol (48 bits)&lt;br /&gt;
#define IRMP_MERLIN_PROTOCOL                    42              // Merlin (Pollin 620 185)&lt;br /&gt;
#define IRMP_PENTAX_PROTOCOL                    43              // Pentax camera&lt;br /&gt;
#define IRMP_FAN_PROTOCOL                       44              // FAN (ventilator), very similar to NUBERT, but last bit is data bit instead of stop bit&lt;br /&gt;
#define IRMP_S100_PROTOCOL                      45              // very similar to RC5, but 14 instead of 13 data bits&lt;br /&gt;
#define IRMP_ACP24_PROTOCOL                     46              // Stiebel Eltron ACP24 air conditioner&lt;br /&gt;
#define IRMP_TECHNICS_PROTOCOL                  47              // Technics, similar to Matsushita, but 22 instead of 24 bits&lt;br /&gt;
#define IRMP_PANASONIC_PROTOCOL                 48              // Panasonic (video projector), start bits similar to KASEIKYO&lt;br /&gt;
#define IRMP_MITSU_HEAVY_PROTOCOL               49              // Mitsubishi heavy air conditioner, similar timing to Panasonic video projector&lt;br /&gt;
#define IRMP_VINCENT_PROTOCOL                   50              // Vincent&lt;br /&gt;
#define IRMP_SAMSUNGAH_PROTOCOL                 51              // Samsung AH&lt;br /&gt;
#define IRMP_IRMP16_PROTOCOL                    52              // IRMP specific protocol for data transfer, e.g. between two microcontrollers via IR&lt;br /&gt;
#define IRMP_GREE_PROTOCOL                      53              // Gree climate&lt;br /&gt;
#define IRMP_RCII_PROTOCOL                      54              // RC II Infrared Remote Control Protocol for FM8&lt;br /&gt;
#define IRMP_METZ_PROTOCOL                      55              // METZ&lt;br /&gt;
#define IRMP_ONKYO_PROTOCOL                     56              // Onkyo&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The values of address and the command code of an unknown remote can be received and printed to UART or LCD. Then these values can be hard-coded in your decoder routine. Or you can write a learning routine, where you press keys to store the code into EEPROM. A sample for this can be found in [http://www.mikrocontroller.net/articles/DIY_Lernfähige_Fernbedienung_mit_IRMP Lernfähige IR-Fernbedienung mit IRMP].&lt;br /&gt;
&lt;br /&gt;
Another [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-avr.c?view=markup example main function] is included in the zip file, showing also the timer initialization.&lt;br /&gt;
&lt;br /&gt;
=== Debouncing ===&lt;br /&gt;
&lt;br /&gt;
To distinguish between a long key press or a single press, the IRMP_FLAG_REPETITION bit is provided. It is set in the struct member &#039;&#039;&#039;flags&#039;&#039;&#039; when a key on the remote is held, causing the same command to be repeated within a short period of time.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
    if (irmp_data.flags &amp;amp; IRMP_FLAG_REPETITION)&lt;br /&gt;
    {&lt;br /&gt;
      // long key press&lt;br /&gt;
      // either:&lt;br /&gt;
      //   ignore the (repeated) key&lt;br /&gt;
      // or:&lt;br /&gt;
      //   use this information for a repeat function&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
      // key was pressed again&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This can be used to debounce the keys 0-9 by ignoring commands with the IRMP_FLAG_REPETITION bit set. For keys like &#039;VOLUME+&#039; or &#039;VOLUME-&#039; using the repetition can be useful, for example to [[LED-Fading|fade a LED]].&lt;br /&gt;
&lt;br /&gt;
If you want to decode only single keys, you can reduce the block above to:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
    if (! (irmp_data.flags &amp;amp; IRMP_FLAG_REPETITION))&lt;br /&gt;
    {&lt;br /&gt;
      // New key&lt;br /&gt;
      // ACTION!&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#FF0000&amp;quot;&amp;gt;&#039;&#039;&#039;NEW:&#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From version 3.2.2, key releases can be detected. In this case, the IRMP_FLAG_RELEASE flag is set once the remote control has ceased sending IR or RF frames.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
    IRMP_DATA irmp_data;&lt;br /&gt;
&lt;br /&gt;
    while (1)&lt;br /&gt;
    {&lt;br /&gt;
        if (irmp_get_data (&amp;amp;irmp_data))&lt;br /&gt;
        {&lt;br /&gt;
            if (irmp_data.protocol == NEC_PROTOCOL &amp;amp;&amp;amp; irmp_data.address == 0x1234)&lt;br /&gt;
            {&lt;br /&gt;
                 if (irmp_data.command == 0x42 &amp;amp;&amp;amp; irmp_data.flags == 0x00) // First frame, flags not set&lt;br /&gt;
                 {&lt;br /&gt;
                     motor_on ();&lt;br /&gt;
                 }&lt;br /&gt;
                 else if (irmp_data.flags &amp;amp; IRMP_FLAG_RELEASE)             // Key is released&lt;br /&gt;
                 {&lt;br /&gt;
                     motor_off ();&lt;br /&gt;
                 }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the above example, a motor is turned on when a specific button on the remote control is pressed. The motor will not stop again until you release the button.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important when evaluating IRMP_FLAG_RELEASE:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
You must not rely on irmp_data.command to still contain the original command code (0x42 here). There are remote controls (e.g. RF remotes for remote controlled receptacles) which send a special key release code when the key is released. Simply check that the irmp_data.address matches before evaluating the flag.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;This feature must be enabled explicitly in irmpconfig.h by changing the configuration variable IRMP_ENABLE_RELEASE_DETECTION&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Principles of Operation ==&lt;br /&gt;
&lt;br /&gt;
The  &amp;quot;workhorse&amp;quot; of [[IRMP_-_english#top|IRMP]] is the interrupt service routine irmp_ISR() which should be called 15000 times per second. When using a different rate, the constant [[IRMP_-_english#F_INTERRUPTS|F_INTERRUPTS]] in [http://www.mikrocontroller.net/svnbrowser/irmp/irmpconfig.h?view=markup irmpconfig.h] needs to be modified accordingly.&lt;br /&gt;
&lt;br /&gt;
First, irmp_ISR() detects the length and the type of the start bit(s) and uses this to determine the protocol in use. As soon as the protocol is identified, subsequent bits are parametrized to read them efficiently until the IR transmission is complete.&lt;br /&gt;
&lt;br /&gt;
To cut off critics:&lt;br /&gt;
&lt;br /&gt;
I know that the ISR is quite large. But since it behaves like a state machine, the effective executed code per cycle is relatively small. As long as the input is &amp;quot;dark&amp;quot; (and that is the case most of the time ;-)) the spent time is vanishingly short. In the WordClock project for example, 8 ISRs are called with the same timer, of which irmp_ISR() just one of many. With a MCU clock of at least 8 MHz, no timing problems occured. Consequently, I see no problem with the length of the ISR.&lt;br /&gt;
&lt;br /&gt;
A crystal is not mandatory, it works well with the internal AVR oscillator. Remember to set the correct fuses for the CPU to run at 8 MHz, check [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-avr.c?view=markup irmp-main-avr.c] for correct values for an ATMEGA88.&lt;br /&gt;
&lt;br /&gt;
== Scanning Unknown IR Protocols ==&lt;br /&gt;
&lt;br /&gt;
To enable logging in [[IRMP_-_english#top|IRMP]], modify the value of [[IRMP_-_english#IRMP_LOGGING|IRMP_LOGGING]] to 1 of [http://www.mikrocontroller.net/svnbrowser/irmp/irmpconfig.h?view=markup irmpconfig.h] on the line&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
    #define IRMP_LOGGING    0   // 1: log IR signal (scan), 0: do not (default)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When logging is enabled, the bright and dark phases are sent via UART at 9600 bits/s: 1=dark, 0=bright. The constants in the functions uart_init() and uart_putc() may need to be modified,  depending on the AVR MCU used.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note: for PIC microcontrollers there is a dedicated logging module named [http://www.mikrocontroller.net/svnbrowser/irmp/irmpextlog.c?view=markup irmpextlog.c]. This makes it possible to log via USB. This does not apply to the AVR version&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
By capturing these protocol scans with a terminal program and saving them to a text file, you can use these files to analyze the frames in order to add new protocols to [[IRMP_-_english#top|IRMP]] - see next chapter.&lt;br /&gt;
&lt;br /&gt;
If you have a remote control that is not supported by [[IRMP_-_english#top|IRMP]], you can send me ([http://www.mikrocontroller.net/user/show/ukw ukw]) the scan files. Then I can check if the protocol is compatible with the IRMP model and modify the source code if applicable.&lt;br /&gt;
&lt;br /&gt;
== IRMP under Linux and Windows ==&lt;br /&gt;
&lt;br /&gt;
=== Compilation ===&lt;br /&gt;
&lt;br /&gt;
[http://www.mikrocontroller.net/svnbrowser/irmp/irmp.c?view=markup irmp.c] can be compiled under Linux for testing IR scans in textfiles. In the subdirectory &#039;IR-Data&#039; you will find such files that you can use as input files for [[IRMP_-_english#top|IRMP]].&lt;br /&gt;
&lt;br /&gt;
To compile [[IRMP_-_english#top|IRMP]], enter:&lt;br /&gt;
&lt;br /&gt;
    make -f makefile.lnx&lt;br /&gt;
&lt;br /&gt;
This will generate 3 IRMP versions:&lt;br /&gt;
&lt;br /&gt;
* irmp-10kHz: Version for 10kHz scans&lt;br /&gt;
* irmp-15kHz: Version for 15kHz scans&lt;br /&gt;
* irmp-20kHz: Version for 20kHz scans&lt;br /&gt;
&lt;br /&gt;
=== Starting IRMP ===&lt;br /&gt;
&lt;br /&gt;
The calling syntax is:&lt;br /&gt;
&lt;br /&gt;
  ./irmp-nnkHz [-l|-p|-a|-v] &amp;lt; scan-file&lt;br /&gt;
&lt;br /&gt;
Options are mutually exclusive, so only one option per call is valid:&lt;br /&gt;
&lt;br /&gt;
Option:&lt;br /&gt;
&lt;br /&gt;
   -l  List             print a list with pulses and pauses&lt;br /&gt;
   -a analyze           analyse the pulses/pauses and write a &amp;quot;spectrum&amp;quot; in ASCII format&lt;br /&gt;
   -v verbose           verbose output&lt;br /&gt;
   -p  Print Timings    print a timing table for all protocols&lt;br /&gt;
&lt;br /&gt;
Samples:&lt;br /&gt;
&lt;br /&gt;
=== Normal Output ===&lt;br /&gt;
&lt;br /&gt;
   ./irmp-10kHz &amp;lt; IR-Data/orion_vcr_07660BM070.txt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Output Lists ===&lt;br /&gt;
&lt;br /&gt;
   ./irmp-10kHz -l &amp;lt; IR-Data/orion_vcr_07660BM070.txt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Analysis ===&lt;br /&gt;
&lt;br /&gt;
   ./irmp-10kHz -a &amp;lt; IR-Data/orion_vcr_07660BM070.txt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here you see the measured times of all pulses and pauses (spaces) as horizontal bar graphs, whose distributions are not ideal bell curves due to the ASCII formatting. The narrower the measured peaks, the better the timing of the remote.&lt;br /&gt;
&lt;br /&gt;
The above output can be read as:&lt;br /&gt;
&lt;br /&gt;
* the start bit has a pulse length between 9000 and 9200 µs, on average 9102 µs. The deviation from this average is about 1.1%&lt;br /&gt;
&lt;br /&gt;
* the start bit has a space length between 4300 and 4500 µs, the average is 4424 µs. The error is about 2.8%.&lt;br /&gt;
&lt;br /&gt;
* the pulse length of a data bit is between 500 and 700 µs, on average 650 µs, the error is (quite large!) 23.1%&lt;br /&gt;
&lt;br /&gt;
Further there are two more spaces of different lengths (for bits 0 and 1). Reading these is left as an exercise to the reader. ;-)&lt;br /&gt;
&lt;br /&gt;
=== Verbose Output ===&lt;br /&gt;
&lt;br /&gt;
    ./irmp-10kHz -v &amp;lt; IR-Data/orion_vcr_07660BM070.txt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
# 1 - IR-cmd: 0x0001&lt;br /&gt;
   0.200ms [starting pulse]&lt;br /&gt;
  13.700ms [start-bit: pulse = 91, pause = 44]&lt;br /&gt;
protocol = NEC, start bit timings: pulse:  62 - 118, pause:  30 -  60&lt;br /&gt;
pulse_1:   3 -   8&lt;br /&gt;
pause_1:  11 -  23&lt;br /&gt;
pulse_0:   3 -   8&lt;br /&gt;
pause_0:   3 -   8&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;
  14.800ms [bit  0: pulse =   6, pause =   5] 0&lt;br /&gt;
  16.000ms [bit  1: pulse =   6, pause =   6] 0&lt;br /&gt;
  17.100ms [bit  2: pulse =   6, pause =   5] 0&lt;br /&gt;
  18.200ms [bit  3: pulse =   6, pause =   5] 0&lt;br /&gt;
  19.300ms [bit  4: pulse =   6, pause =   5] 0&lt;br /&gt;
  20.500ms [bit  5: pulse =   6, pause =   6] 0&lt;br /&gt;
  21.600ms [bit  6: pulse =   6, pause =   5] 0&lt;br /&gt;
  23.800ms [bit  7: pulse =   6, pause =  16] 1&lt;br /&gt;
  26.100ms [bit  8: pulse =   6, pause =  17] 1&lt;br /&gt;
  28.300ms [bit  9: pulse =   6, pause =  16] 1&lt;br /&gt;
  29.500ms [bit 10: pulse =   6, pause =   6] 0&lt;br /&gt;
  31.700ms [bit 11: pulse =   6, pause =  16] 1&lt;br /&gt;
  34.000ms [bit 12: pulse =   6, pause =  17] 1&lt;br /&gt;
  36.200ms [bit 13: pulse =   6, pause =  16] 1&lt;br /&gt;
  38.500ms [bit 14: pulse =   6, pause =  17] 1&lt;br /&gt;
  39.600ms [bit 15: pulse =   6, pause =   5] 0&lt;br /&gt;
  41.900ms [bit 16: pulse =   6, pause =  17] 1&lt;br /&gt;
  43.000ms [bit 17: pulse =   6, pause =   5] 0&lt;br /&gt;
  44.100ms [bit 18: pulse =   6, pause =   5] 0&lt;br /&gt;
  45.200ms [bit 19: pulse =   6, pause =   5] 0&lt;br /&gt;
  46.400ms [bit 20: pulse =   7, pause =   5] 0&lt;br /&gt;
  47.500ms [bit 21: pulse =   6, pause =   5] 0&lt;br /&gt;
  48.600ms [bit 22: pulse =   6, pause =   5] 0&lt;br /&gt;
  49.800ms [bit 23: pulse =   6, pause =   6] 0&lt;br /&gt;
  50.900ms [bit 24: pulse =   5, pause =   6] 0&lt;br /&gt;
  53.100ms [bit 25: pulse =   6, pause =  16] 1&lt;br /&gt;
  55.400ms [bit 26: pulse =   6, pause =  17] 1&lt;br /&gt;
  57.600ms [bit 27: pulse =   6, pause =  16] 1&lt;br /&gt;
  59.900ms [bit 28: pulse =   6, pause =  17] 1&lt;br /&gt;
  62.100ms [bit 29: pulse =   6, pause =  16] 1&lt;br /&gt;
  64.400ms [bit 30: pulse =   6, pause =  17] 1&lt;br /&gt;
  66.700ms [bit 31: pulse =   6, pause =  17] 1&lt;br /&gt;
stop bit detected&lt;br /&gt;
  67.300ms code detected, length = 32&lt;br /&gt;
  67.300ms p =  2, a = 0x7b80, c = 0x0001, f = 0x00&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Starting under Windows ===&lt;br /&gt;
&lt;br /&gt;
[[IRMP_-_english#top|IRMP]] can be used under Windows as well:&lt;br /&gt;
&lt;br /&gt;
* start command line console&lt;br /&gt;
* change to directory &#039;irmp&#039;&lt;br /&gt;
* enter:&lt;br /&gt;
            irmp-10kHz.exe &amp;lt; IR-Data\rc5x.txt&lt;br /&gt;
&lt;br /&gt;
The same options apply as for the Linux version.&lt;br /&gt;
&lt;br /&gt;
=== Long Output ===&lt;br /&gt;
&lt;br /&gt;
As some output is very long, it is recommended to redirect the output to a file or filter for paging:&lt;br /&gt;
&lt;br /&gt;
Linux:&lt;br /&gt;
&lt;br /&gt;
            ./irmp-10kHz &amp;lt; IR-Data/rc5x.txt | less&lt;br /&gt;
&lt;br /&gt;
Windows:&lt;br /&gt;
&lt;br /&gt;
            irmp-10kHz.exe &amp;lt; IR-Data\rc5x.txt | more&lt;br /&gt;
&lt;br /&gt;
== Remote Controls ==&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! Protocol || Name || Device || Device Address&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#NEC_+_extended_NEC|NEC]] || Toshiba CT-9859 || TV || 0x5F40&lt;br /&gt;
|-&lt;br /&gt;
VCR|-&lt;br /&gt;
| || Elta 8848 MP 4 || DVD player || 0x7F00&lt;br /&gt;
|-&lt;br /&gt;
| || AS-218 || Askey TV-View CHP03X (TV tuner card) || 0x3B86&lt;br /&gt;
|-&lt;br /&gt;
| || Cyberhome ??? || Cyberhome DVD player || 0x6D72&lt;br /&gt;
|-&lt;br /&gt;
| || WD TV Live || Western Digital Multimediaplayer || 0x1F30&lt;br /&gt;
|-&lt;br /&gt;
| || Canon WL-DC100 || Kamera Canon PowerShot G5 || 0xB1CA&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#NEC16|NEC16]] || Daewoo || VCR || 0x0015&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#KASEIKYO|KASEIKYO]] || Technics EUR646497 || SA-AX 730 AV receiver || 0x2002&lt;br /&gt;
|-&lt;br /&gt;
| || Panasonic TV || TX-L32EW6 TV || 0x2002&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#RC5_+_RC5X|RC5]] || Loewe Assist/RC3/RC4 || TV (remote control in TV mode) || 0x0000&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#RC6_+_RC6A|RC6]] || Philips TV || TV (remote control in TV mode) || 0x0000&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#SIRCS|SIRCS]] || Sony RM-816 || TV (remote control in TV mode) || 0x0000&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#DENON|DENON]] || DENON RC970 || AVR3805 AV receiver || 0x0008&lt;br /&gt;
|-&lt;br /&gt;
| || DENON RC970 || DVD/CD player || 0x0002&lt;br /&gt;
|-&lt;br /&gt;
| || DENON RC970 || Tuner || 0x0006&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#SAMSUNG32|SAMSUNG32]] || Samsung AA59-00484A || LE40D550 TV || 0x0707&lt;br /&gt;
|-&lt;br /&gt;
| || LG AKB72033901 || BD370 Blu-Ray player  || 0x2D2D&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#APPLE|APPLE]] || Apple || Apple iPod Dock || 0x0020&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Cameras ==&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width: 80%;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 20%;&amp;quot; |&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
[[IRMP_-_english#top|IRMP]] supports more and more camera remotes like:&lt;br /&gt;
&lt;br /&gt;
* [[IRMP_-_english#PENTAX|PENTAX]]&lt;br /&gt;
* [[IRMP_-_english#Nikon|Nikon]]&lt;br /&gt;
&lt;br /&gt;
The array of commands is quite limited. Cameras understand only the shutter release command.&lt;br /&gt;
||&lt;br /&gt;
[[Datei:Irmp-pentax.png|miniatur|PENTAX protocol]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Here is a short table for [[IRMP_-_english#PENTAX|PENTAX]] cameras:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! Command || Function&lt;br /&gt;
|-&lt;br /&gt;
| 0x0000 || Shutter release&lt;br /&gt;
|-&lt;br /&gt;
| 0x0001 || change zoom level&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Because there is no address designated in the [[IRMP_-_english#PENTAX|PENTAX]] protocol, for transmitting, it should be set to 0x0000 in [[IRSND_-_english|IRSND]]. &lt;br /&gt;
&lt;br /&gt;
For Nikon cameras, a crystal should be used because these cameras are quite sensitive to timing accuracy.&lt;br /&gt;
&lt;br /&gt;
== IR Keyboards ==&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width: 80%;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 20%;&amp;quot; |&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
From version 1.7.0 on, [[IRMP_-_english#top|IRMP]] also supports IR keyboards, namely the FDC-3402 &amp;lt;s&amp;gt; from www.pollin.de (partno. 711 056) for less than 2 Euro.&amp;lt;/s&amp;gt; (not available as of 19.09.2017 )&lt;br /&gt;
&lt;br /&gt;
On detection of a key press the following data is returned:&lt;br /&gt;
&lt;br /&gt;
 Protocol number  (irmp_data.protocol): 18&lt;br /&gt;
 Address          (irmp_data.address) : 0x003F&lt;br /&gt;
||&lt;br /&gt;
[[Datei:irmp-fdc3402.jpg|miniatur|FDC-3402 keyboard]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The following values are returned as commands (irmp_data.command) :&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size:50%; text-align:center;&amp;quot;&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! Code || Key   || Code || Key   || Code || Key   || Code || Key   || Code || Key   || Code || Key   || Code || Key   || Code || Key   &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;
Special keys on the left:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! Code || Key   &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;
The above values are for pressing a key. On release, [[IRMP_-_english#top|IRMP]] sets also bit 8 (0x80) in the command.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
      Key &#039;a&#039; pressed:   0x001F&lt;br /&gt;
      Key &#039;a&#039; released:  0x009F&lt;br /&gt;
&lt;br /&gt;
The ON/OFF key is an exception: This key only sends a code for a key press, not for the release.&lt;br /&gt;
&lt;br /&gt;
If a key is held, this is indicated in irmp_data.flag.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
                           command   flag&lt;br /&gt;
      Key &#039;a&#039; pressed:   0x001F    0x00&lt;br /&gt;
      Key &#039;a&#039; pressed:   0x001F    0x01&lt;br /&gt;
      Key &#039;a&#039; pressed:   0x001F    0x01&lt;br /&gt;
      Key &#039;a&#039; pressed:   0x001F    0x01&lt;br /&gt;
      ....&lt;br /&gt;
      Key &#039;a&#039; released:  0x009F    0x00&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
When key combinations (like a capital &#039;A&#039;) are pressed, then the return values are a sequence like this:&lt;br /&gt;
&lt;br /&gt;
      Left SHIFT-key pressed:    0x0002&lt;br /&gt;
      Key &#039;a&#039; pressed:           0x001F&lt;br /&gt;
      Key &#039;a&#039; released:          0x009F&lt;br /&gt;
      Left SHIFT-key released:   0x0082&lt;br /&gt;
&lt;br /&gt;
In [http://www.mikrocontroller.net/svnbrowser/irmp/irmp.c?view=markup irmp.c] you will find a function get_fdc_key() for the Linux version, which can be used as a template to convert the FDC keycodes into the corresponding ASCII codes. This function can be used either locally on the MCU to decode the keycodes, or on the host system (e.g. PC) where the IRMP data structure is sent to. Therefore the function including preprocessor constants should be copied to your application code.&lt;br /&gt;
&lt;br /&gt;
Here is an excerpt:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&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;,  0xDF, &#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;,  0xFC, &#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;, 0xF6, 0xE4, &#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;,  0xDC, &#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;, 0xD6, 0xC4, &#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 = 0xB2;    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 = 0xB5;    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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As a final example, use of the get_fdc_key() function:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Non-printable characters are coded as follows:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! Key               || Constant                || Value&lt;br /&gt;
|-&lt;br /&gt;
| ESC               || KEY_ESCAPE              || 0x1B&lt;br /&gt;
|-&lt;br /&gt;
| Menu              || KEY_MENUE               || 0x80&lt;br /&gt;
|-&lt;br /&gt;
| Back              || KEY_BACK                || 0x81&lt;br /&gt;
|-&lt;br /&gt;
| Forward           || KEY_FORWARD             || 0x82&lt;br /&gt;
|-&lt;br /&gt;
| Adress            || KEY_ADDRESS             || 0x83&lt;br /&gt;
|-&lt;br /&gt;
| Window            || KEY_WINDOW              || 0x84&lt;br /&gt;
|-&lt;br /&gt;
| 1. Page           || 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;
| New Page          || KEY_NEW_PAGE            || 0x89&lt;br /&gt;
|-&lt;br /&gt;
| Setup             || KEY_SETUP               || 0x8A&lt;br /&gt;
|-&lt;br /&gt;
| Font              || KEY_FONT                || 0x8B&lt;br /&gt;
|-&lt;br /&gt;
| Print             || KEY_PRINT               || 0x8C&lt;br /&gt;
|-&lt;br /&gt;
| On/Off            || 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;
| Insert            || KEY_INSERT              || 0x90&lt;br /&gt;
|-&lt;br /&gt;
| Delete            || KEY_DELETE              || 0x91&lt;br /&gt;
|-&lt;br /&gt;
| Cursor left       || KEY_LEFT                || 0x92&lt;br /&gt;
|-&lt;br /&gt;
| Pos1              || KEY_HOME                || 0x93&lt;br /&gt;
|-&lt;br /&gt;
| End               || KEY_END                 || 0x94&lt;br /&gt;
|-&lt;br /&gt;
| Cursor right      || KEY_UP                  || 0x95&lt;br /&gt;
|-&lt;br /&gt;
| Cursor down       || KEY_DOWN                || 0x96&lt;br /&gt;
|-&lt;br /&gt;
| Page up           || KEY_PAGE_UP             || 0x97&lt;br /&gt;
|-&lt;br /&gt;
| Page down         || KEY_PAGE_DOWN           || 0x98&lt;br /&gt;
|-&lt;br /&gt;
| Cursor left       || KEY_RIGHT               || 0x99&lt;br /&gt;
|-&lt;br /&gt;
| Left Mousebutton  || KEY_MOUSE_1             || 0x9E&lt;br /&gt;
|-&lt;br /&gt;
| Right Mousebutton || KEY_MOUSE_2             || 0x9F&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The get_fdc_key() function considers the state of the Shift, Ctrl, and Alt keys. As a result, not only capital letters can be entered, but also special characters with Alt + key combinations, e.g. Alt + m -&amp;gt; µ or Alt + q -&amp;gt; @. You can also send Ctrl + A to Ctrl + Z by using the Ctrl key. The Caps Lock key is ignored, as I regard this key as the most unnecessary key at all ;-)&lt;br /&gt;
&lt;br /&gt;
= Appendix =&lt;br /&gt;
&lt;br /&gt;
== IR Protocols in Detail ==&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width: 80%;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 20%;&amp;quot; |&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
=== Pulse Distance Protocols ===&lt;br /&gt;
||&lt;br /&gt;
[[Datei:Pulse-Distance.png|miniatur|Pulse Distance Coding]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== NEC + extended NEC ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#NEC Protocol|NEC + extended NEC]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 36 kHz / 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 32 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data NEC || 8 address bits + 8 inverted address bits + 8 command bits + 8 inverted command bits&lt;br /&gt;
|-&lt;br /&gt;
| Data ext. NEC || 16 address bits + 8 command bits + 8 inverted command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 9000µs pulse, 4500µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 560µs pulse,  560µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 560µs pulse, 1690µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 560µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || 9000µs pulse, 2250µs pause, 560µs pulse, ~100ms pause&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== JVC ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#NEC16 Protocol (JVC)|JVC]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 16 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 4 address bits + 12 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 9000µs pulse, 4500µs pause, 6000µs pause if key repeat&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 560µs pulse,  560µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 560µs pulse, 1690µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 560µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after pause of 25ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== NEC16 ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;NEC16&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 8 address bits + 1 sync bit + 8 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 9000µs pulse, 4500µs pause&lt;br /&gt;
|-&lt;br /&gt;
| sync bit || 560µs pulse, 4500µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 560µs pulse,  560µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 560µs pulse, 1690µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 560µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after pause of 25ms?&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== NEC42 ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;NEC42&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 42 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 13 address bits + 13 inverted address bits + 8 command bits + 8 inverted command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 9000µs pulse, 4500µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 560µs pulse,  560µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 560µs pulse, 1690µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 560µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after 110ms (beginning from start bit), 9000µs pulse, 2250µs pause, 560µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== ACP24 ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#ACP24 Protocol|ACP24]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 70 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 0 address bits + 70 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 390µs pulse, 950µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 390µs pulse,  950µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 390µs pulse, 13000µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 390µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || unknown&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== LGAIR ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#LGAIR Protocol|LGAIR]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 28 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 8 address bits + 16 command bits + 4 checksum bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 9000µs pulse, 4500µs pause (identical to [[IRMP_-_english#NEC_.2B_extended_NEC|NEC]])&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 560µs pulse,  560µs pause (identical to [[IRMP_-_english#NEC_.2B_extended_NEC|NEC]])&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 560µs pulse, 1690µs pause (identical to [[IRMP_-_english#NEC_.2B_extended_NEC|NEC]])&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 560µs pulse (identical to [[IRMP_-_english#NEC_.2B_extended_NEC|NEC]])&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || unknown&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first (&#039;&#039;&#039;differs&#039;&#039;&#039; from [[IRMP_-_english#NEC_.2B_extended_NEC|NEC]])&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SAMSUNG ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#SAMSUNG Protocol|SAMSUNG]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || ?? kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 16 data(1) bits + 1 sync bit + 20 data(2)-bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data(1) || 16 address bits&lt;br /&gt;
|-&lt;br /&gt;
| Data(2) || 4 ID bits + 8 command bits + 8 inverted command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 4500µs pulse, 4500µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 550µs pulse, 550µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 550µs pulse, 1650µs pause&lt;br /&gt;
|-&lt;br /&gt;
| sync bit || 550µs pulse, 4500µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 550µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after approx. 100ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SAMSUNG32 ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;SAMSUNG32&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 32 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 16 address bits + 16 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 4500µs pulse, 4500µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 550µs pulse,  550µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 550µs pulse, 1650µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 550µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after approx. 47msec&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SAMSUNG48 ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;SAMSUNG48&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 48 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 16 address bits + 32 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Command || 8 bits + 8 inverted bits + 8 bits + 8 inverted bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 4500µs pulse, 4500µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 550µs pulse,  550µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 550µs pulse, 1650µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 550µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || one after approx. 5 msec&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after approx. 45 msec&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== MATSUSHITA ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#MATSUHITA Protocol|MATSUSHITA]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 36 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance, timing identical to [[IRMP_-_english#TECHNICS|TECHNICS]]&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 24 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 6 customer bits + 6 command bits + 12 address bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 3488µs pulse, 3488µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 872µs pulse,  872µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 872µs pulse, 2616µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 872µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after 40ms pause&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first?&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== TECHNICS ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;TECHNICS&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 36 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance, timing identical to [[IRMP_-_english#MATSUSHITA|MATSUSHITA]]&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 22 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 11 command bits + 11 inverted command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 3488µs pulse, 3488µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 872µs pulse,  872µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 872µs pulse, 2616µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 872µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after 40ms pause&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first?&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== KASEIKYO ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#KASEIKYO_Protocol_.28.22Japan Protocol.22.29|KASEIKYO]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 48 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 16 customer bits + 4 parity bits + 4 genre1 bits + 4 genre2 bits + 10 command bits + 2 ID bits + 8 parity bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 3380µs pulse, 1690µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 423µs pulse,  423µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 423µs pulse, 1269µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 423µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after approx. 80ms pause&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first?&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== RECS80 ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#RECS80 and RECS80 Extended Protocol|RECS80]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bits + 10 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 1 toggle bit + 3 address bits + 6 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 158µs pulse, 7432µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 158µs pulse, 4902µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 158µs pulse, 7432µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 158µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after approx. 100ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== RECS80EXT ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#RECS80 and RECS80 Extended Protocol|RECS80EXT]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 2 start bits + 11 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 1 toggle bit + 4 address bits + 6 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 158µs pulse, 3637µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 158µs pulse, 4902µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 158µs pulse, 7432µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 158µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after approx. 100ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== DENON ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#Denon Protocol|DENON]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz (in practice, theoretically: 32 kHz)&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 0 start bits + 15 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 5 address bits + 10 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Command || 6 data bits + 2 extension bits + 2 data construction bits (normal: 00, inverted: 11)&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || none&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 310µs pulse, 745µs pause (in practice, theoretically: 275µs pulse, 775µs pause)&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 310µs pulse, 1780µs pause (in practice, theoretically: 275µs pulse, 1900µs pause)&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 310µs pulse (310µs pulse, 745µs pause (in practice, theoretically: 275µs pulse)&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || after 65ms with inverted command bits (data construction bits = 11)&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || both frames after 65ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== APPLE ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;APPLE&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 32 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 16 address bits + 11100000 + 8 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || see [[IRMP_-_english#NEC_+_extended_NEC|NEC]]&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || see [[IRMP_-_english#NEC_+_extended_NEC|NEC]]&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || see [[IRMP_-_english#NEC_+_extended_NEC|NEC]]&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || see [[IRMP_-_english#NEC_+_extended_NEC|NEC]]&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after approx. 100ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== BOSE ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;BOSE&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 16 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 0 address bits + 8 command bits + 8 inverted command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 1060µs pulse, 1425µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 550µs pulse,  437µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 550µs pulse, 1425µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 550µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || unknown&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== B&amp;amp;O ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#Bang &amp;amp; Olufsen|B&amp;amp;O]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 455 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 4 start bits + 16 data bits + 1 trailer bit + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 0 address bits + 16 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit 1 || 200µs pulse, 2925µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Start bit 2 || 200µs pulse, 2925µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Start bit 3 || 200µs pulse, 15425µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Start bit 4 || 200µs pulse, 2925µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 200µs pulse, 2925µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 200µs pulse, 9175µs pause&lt;br /&gt;
|-&lt;br /&gt;
| R bit || 200µs pulse, 6050µs pause, repeats the last bit&lt;br /&gt;
|-&lt;br /&gt;
| Trailer bit || 200µs pulse, 12300µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 200µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after approx. 100ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== FDC ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;FDC&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 40 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 8 address bits + 12 x 0 bits + 4 press/release bits + 8 command bits + 8 inverted command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 2085µs pulse, 966µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 300µs pulse,  220µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 300µs pulse, 715µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 300µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Press Key || press/release bits = 0000&lt;br /&gt;
|-&lt;br /&gt;
| Release Key || press/release bits = 1111&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after pause of approx. 60ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Nikon ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;Nikon&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 2 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 2 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 2200µs pulse, 27100µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 500µs pulse,  1500µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 500µs pulse, 3500µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 500µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || unknown&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== PANASONIC ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;PANASONIC&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 56 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 24 bits (010000000000010000000001) + 16 address bits + 16 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 3600µs pulse, 1600µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 565µs pulse,  316µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 565µs pulse, 1140µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 565µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || unknown&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first?&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== PENTAX ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;PENTAX&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 6 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 6 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 2200µs pulse, 27100µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 1000µs pulse,  1000µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 1000µs pulse, 3000µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 1000µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || unknown&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== KATHREIN ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;KATHREIN&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 11 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 4 address bits + 7 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 210µs pulse, 6218µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 210µs pulse,  1400µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 210µs pulse, 3000µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 210µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after 35ms?&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== LEGO ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#LEGO Power Functions RC|LEGO]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 16 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 12 command bits + 4 crc bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 158µs pulse, 1026µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 158µs pulse,  263µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 158µs pulse, 553µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 158µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || unknown&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== VINCENT ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#VINCENT|VINCENT]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 32 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 16 address bits + 8 command bits + 8 repeated command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 2500µs pulse, 4600µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 550µs pulse,  550µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 550µs pulse, 1540µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 550µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || unknown&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first?&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== THOMSON ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;THOMSON&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 33 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 0 start bits + 12 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 4 address bits + 1 toggle bit + 7 command bits&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 550µs pulse,  2000µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 550µs pulse, 4500µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 550µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after 35ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first?&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== TELEFUNKEN ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;TELEFUNKEN&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 15 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 0 address bits + 15 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 600µs pulse, 1500µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 600µs pulse, 600µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 600µs pulse, 1500µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 600µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || unknown&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first?&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== RCCAR ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;RCCAR&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 13 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 13 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 2000µs pulse, 2000µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 600µs pulse,  900µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 600µs pulse, 450µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 600µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after 40ms?&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== RCMM ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#RCMM_Protocol|RCMM]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 36 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame RCMM32 || 1 start bit + 32 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Frame RCMM24 || 1 start bit + 24 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Frame RCMM12 || 1 start bit + 12 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data RCMM32 || 16 address bits (= 4 mode bits + 12 device bits) + 1 toggle bit + 15 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Data RCMM24 || 16 address bits (= 4 mode bits + 12 device bits) + 1 toggle bit + 7 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Data RCMM12 || 4 address bits (= 2 mode bits + 2 device bits) + 8 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 500µs pulse, 220µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 00 bits || 230µs pulse, 220µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 01 bits || 230µs pulse, 380µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 10 bits || 230µs pulse, 550µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 11 bits || 230µs pulse, 720µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 230µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after 80ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width: 80%;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 20%;&amp;quot; |&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
=== Pulse Width Protocols ===&lt;br /&gt;
||&lt;br /&gt;
[[Datei:Pulse-Width.png|miniatur|Pulse Width Coding]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SIRCS ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#SIRCS_Protocol|SIRCS]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|Frequency ||40 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse width&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 12-20 data bits, no stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 7 command bits + 5 address bits + up to 8 additional bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 2400µs pulse, 600µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 600µs pulse, 600µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 1200µs pulse, 600µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || twice after approx. 25ms, that means: 2nd and 3rd frame&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || starting with 4th identical frame, distance approx. 25ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width: 80%;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 20%;&amp;quot; |&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
=== Pulse distance Width Protocols ===&lt;br /&gt;
||&lt;br /&gt;
[[Datei:Pulse-Distance-Width.png|miniatur|Pulse Distance Width Coding]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== NUBERT ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;NUBERT&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 36 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance width&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 10 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 0 address bits + 10 command bits ?&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 1340µs pulse, 340µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 500µs pulse, 1300µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 1340µs pulse, 340µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 500µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || once after 35ms&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || 3rd, 5th, 7th etc. indentical frame&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first?&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== FAN ====&lt;br /&gt;
&lt;br /&gt;
This protocol is very similar to [[IRMP_-_english#NUBERT|NUBERT]], but here it will be sent only one frame. Additionally there are 11 instead of 10 data bits and no stop bit. The pause time between frame repetitions is substantial lower.&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;FAN &#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 36 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance width&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 11 data bits + 0 stop bits&lt;br /&gt;
|-&lt;br /&gt;
| Data || 0 address bits + 11 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 1280µs pulse, 380µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 380µs pulse, 1280µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 1280µs pulse, 380µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 500µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after 6.6ms pause&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SPEAKER ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;SPEAKER&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance width&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 10 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 0 address bits + 10 command bits ?&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 440µs pulse, 1250µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 440µs pulse, 1250µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 1250µs pulse, 440µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 440µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || once after approx. 38ms&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || 3rd, 5th, 7th ... identical frame&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first?&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== ROOMBA ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;ROOMBA&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance width&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 7 data bits + 0 stop bits&lt;br /&gt;
|-&lt;br /&gt;
| Data || 0 address bits + 7 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 2790µs pulse, 930µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 930µs pulse, 2790µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 2790µs pulse, 930µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || no stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || 3 times after 18ms?&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || unknown&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width: 80%;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 20%;&amp;quot; |&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
=== Biphase Protocols ===&lt;br /&gt;
||&lt;br /&gt;
[[Datei:Biphase-Coding.png|miniatur|Biphase Coding]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== RC5 + RC5X ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#RC5 and RC5x Protocol|RC5 + RC5X]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 36 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || Biphase (Manchester)&lt;br /&gt;
|-&lt;br /&gt;
| Frame RC5 || 2 start bits + 12 data bits + 0 stop bits&lt;br /&gt;
|-&lt;br /&gt;
| Data RC5 || 1 toggle bit + 5 address bits + 6 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Frame RC5X || 1 start bit + 13 data bits + 0 stop bits&lt;br /&gt;
|-&lt;br /&gt;
| Data RC5X || 1 inverteds command bit + 1 toggle bit + 5 address bits + 6 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 889µs pause, 889µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 889µs pulse, 889µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 889µs pause, 889µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || no stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after approx. 100ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== RCII ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;RCII&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 31.25 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || Biphase (Manchester)&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 pre bit + 1 start bit + 9 data bits + 0 stop bits&lt;br /&gt;
|-&lt;br /&gt;
| Data || 0 address bits + 9 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Pre Bit || 512µs pulse, 2560µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 1024µs pulse, &#039;&#039;&#039;no space&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 512µs pause, 512µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 512µs pulse, 512µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || no stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after approx. 118ms&lt;br /&gt;
|-&lt;br /&gt;
| Remarks || An end command (111111111 = 0x1FF) is sent immediately after the button is released.&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== S100 ====&lt;br /&gt;
&lt;br /&gt;
Similar to RC5x, but 14 instead of 13 data bits and 56kHz modulation&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;S100&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 56 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || Biphase (Manchester)&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 14 data bits + 0 stop bits&lt;br /&gt;
|-&lt;br /&gt;
| Data || 1 inverted command bit + 1 toggle bit + 5 address bits + 7 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 889µs pause, 889µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 889µs pulse, 889µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 889µs pause, 889µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || no stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after approx. 100ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== RC6 + RC6A ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#RC6 and RC6A Protocol|RC6 + RC6A]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 36 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || Biphase (Manchester)&lt;br /&gt;
|-&lt;br /&gt;
| Frame RC6 || 1 start bit + 1 bit &amp;quot;1&amp;quot; + 3 mode bits (&amp;quot;000&amp;quot;) + 1 toggle bit + 16 data 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 (&amp;quot;110&amp;quot;) + 1 toggle bit + 31 data bits + 2666µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Data RC6 || 8 address bits + 8 Command Bits&lt;br /&gt;
|-&lt;br /&gt;
| Data RC6A || &amp;quot;1&amp;quot; + 14 customer bits + 8 system bits + 8 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Data RC6A Pace (Sky) || &amp;quot;1&amp;quot; + 3 mode bits (&amp;quot;110&amp;quot;) + 1 toggle bit (UNUSED &amp;quot;0&amp;quot;) + 16 bits + 1 toggle(!) + 15 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 2666µs pulse, 889µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Toggle 0 bit || 889µs pause, 889µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Toggle 1 bit || 889µs pulse, 889µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 444µs pause, 444µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 444µs pulse, 444µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || no stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after approx. 100ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== GRUNDIG + NOKIA ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#Grundig Protocol|GRUNDIG + NOKIA]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz (?)&lt;br /&gt;
|-&lt;br /&gt;
| Coding || Biphase (Manchester)&lt;br /&gt;
|-&lt;br /&gt;
| Frame packet || 1 start frame + 19.968ms pause + N data frames + 117.76ms pause + 1 stop frame&lt;br /&gt;
|-&lt;br /&gt;
| Start frame || 1 pre bit + 1 start bit + 9 data bits (all 1) + 0 stop bits&lt;br /&gt;
|-&lt;br /&gt;
| Data frame || 1 pre bit + 1 start bit + 9 data bits + 0 stop bits&lt;br /&gt;
|-&lt;br /&gt;
| Stop frame || 1 pre bit + 1 start bit + 9 data bits (all 1) + 0 stop bits&lt;br /&gt;
|-&lt;br /&gt;
| Data Grundig || 9 command bits + 0 address bits&lt;br /&gt;
|-&lt;br /&gt;
| Data Nokia || 8 command bits + 8 address bits&lt;br /&gt;
|-&lt;br /&gt;
| Pre bit || 528µs pulse, 2639µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 528µs pulse, 528µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 528µs pause, 528µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 528µs pulse, 528µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || no stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after approx. 117.76ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== IR60 (SDA2008) ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#IR60_.28SDA2008_and_MC14497P.29|IR60]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 30 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || Biphase (Manchester)&lt;br /&gt;
|-&lt;br /&gt;
| Start frame || 1 start bit + 101111 + 0 stop bits + 22ms pause&lt;br /&gt;
|-&lt;br /&gt;
| Data frame || 1 start bit + 7 data bits + 0 stop bits&lt;br /&gt;
|-&lt;br /&gt;
| Data || 0 address bits + 7 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 528µs pulse, 2639µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 528µs pause, 528µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 528µs pulse, 528µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || no stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after approx. 117.76ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SIEMENS + RUWIDO ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;SIEMENS + RUWIDO&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 36 kHz? (Merlin keyboard with Ruwido protocol: 56 kHz)&lt;br /&gt;
|-&lt;br /&gt;
| Coding || Biphase (Manchester)&lt;br /&gt;
|-&lt;br /&gt;
| Frame Siemens || 1 start bit + 22 data bits + 0 stop bits&lt;br /&gt;
|-&lt;br /&gt;
| Frame Ruwido || 1 start bit + 17 data bits + 0 stop bits&lt;br /&gt;
|-&lt;br /&gt;
| Data Siemens || 11 address bits + 10 command bits + 1 inverted bit (preceding bit inverted)&lt;br /&gt;
|-&lt;br /&gt;
| Data Ruwido || 9 address bits + 7 command bits + 1 inverted bit (preceding bit inverted)&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 275µs pulse, 275µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 275µs pause, 275µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 275µs pulse, 275µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || no stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || once with repeat bit set (?)&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after approx. 100ms (?)&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== A1TVBOX ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;A1TVBOX&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || Biphase (Manchester) asymmetric&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 2 start bits + 16 data bits + 0 stop bits&lt;br /&gt;
|-&lt;br /&gt;
| Data || 8 address bits + 8 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bits || &amp;quot;10&amp;quot;, also 250µs pulse, 150µs + 150µs pause, 250µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 150µs pause, 250µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 250µs pulse, 150µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || no stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || unknown&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== MERLIN ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;MERLIN&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 56 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || Biphase (Manchester) asymmetric&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 2 start bits + 18 data bits + 0 stop bits&lt;br /&gt;
|-&lt;br /&gt;
| Data || 8 address bits + 10 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bits || &amp;quot;10&amp;quot;, also 210µs pulse, 210µs + 210µs pause, 210µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 210µs pause, 210µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 210µs pulse, 210µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || no stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || unknown&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== ORTEK ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;ORTEK&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || Biphase (Manchester) symmetric&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 2 start bits + 18 data bits + 0 stop bits&lt;br /&gt;
|-&lt;br /&gt;
| Data || 6 address bits + 2 special bits +  6 command bits + 4 special bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 2000µs pulse, 1000µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 500µs pause, 500µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 500µs pulse, 500µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || no stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || 2 additional frames with special bits set&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || only repeats the 2nd frame&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Pulse Position Protocols ===&lt;br /&gt;
&lt;br /&gt;
==== NETBOX ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;NETBOX&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse position&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 16 data bits, no stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 3 address bits + 13 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 2400µs pulse, 800µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Bit Length || 800µs&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after approx. 35ms?&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Software History ==&lt;br /&gt;
&lt;br /&gt;
=== Changes of IRMP in 3.2.x === &lt;br /&gt;
&lt;br /&gt;
Version 3.2.6:&lt;br /&gt;
&lt;br /&gt;
* 2021-01-27: &#039;&#039;&#039;New IR Protocol:&#039;&#039;&#039; [[IRMP#MELINERA|MELINERA]]&lt;br /&gt;
* 2021-01-27: Protocol [[IRMP#LEGO|LEGO]]: Improved timing&lt;br /&gt;
* 2021-01-27: Protocol [[IRMP#RUWIDO|RUWIDO]]: Improved timing&lt;br /&gt;
* 2021-01-27: Protocol [[IRMP#NEC|NEC]]: Implemented send of raw NEC repetition frames &lt;br /&gt;
&lt;br /&gt;
Version 3.2.3:&lt;br /&gt;
&lt;br /&gt;
* 2020-08-15: &#039;&#039;&#039;New RF Protocol:&#039;&#039;&#039; [[IRMP#RF_MEDION|RF_MEDION]]&lt;br /&gt;
&lt;br /&gt;
Version 3.2.2:&lt;br /&gt;
&lt;br /&gt;
* 2020-07-09: Additional recognition of the radio channels with the RF_X10 protocol&lt;br /&gt;
* 2020-07-09: Improved RF frame detection with new stop bit handling.&lt;br /&gt;
* 2020-07-09: Improved detection of RF_GEN24 protocols&lt;br /&gt;
* 2020-07-09: &amp;lt;span style=&amp;quot;color:#FF0000&amp;quot;&amp;gt;&#039;&#039;&#039;NEU:&#039;&#039;&#039;&amp;lt;/span&amp;gt; Detection if/when a remote control button is released, see chapter &#039;&#039;&#039;[[IRMP_-_english#Debouncing|Debouncing]]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Version 3.2.1:&lt;br /&gt;
&lt;br /&gt;
* 2020-06-22: Mini bugfix&lt;br /&gt;
&lt;br /&gt;
Version 3.2.0:&lt;br /&gt;
&lt;br /&gt;
* 2020-06-22: Support of 433MHz RF modules&lt;br /&gt;
* 2020-06-22: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP#RF_GEN24|RF_GEN24]]&lt;br /&gt;
* 2020-06-22: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP#X10|X10]]&lt;br /&gt;
&lt;br /&gt;
=== Older Versions ===&lt;br /&gt;
&lt;br /&gt;
* 2019-08-26: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: METZ&lt;br /&gt;
* 2019-08-26: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: ONKYO&lt;br /&gt;
* 2018-09-10: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP#RCII|RCII]]&lt;br /&gt;
* 2018-09-06: Added support of STM32 mit HAL-Library&lt;br /&gt;
* 2018-08-30: New option: IRMP_USE_IDLE_CALL&lt;br /&gt;
* 2018-08-29: Port to ChibiOS&lt;br /&gt;
* 2018-08-29: New protocol: GREE&lt;br /&gt;
* 2018-02-19: corrected handling of irmp_flags for invalid frames&lt;br /&gt;
* 2017-08-25: New protocol: IRMP16 for transparent 16 bit data communication&lt;br /&gt;
* 2016-11-18: Corrected buffer overflow in irmp-main-avr-uart.c&lt;br /&gt;
* 2016-09-19: New protocol [[IRMP#VINCENT|VINCENT]]&lt;br /&gt;
* 2016-09-09: New protocol [[IRMP#MITSU_HEAVY|Mitsubishi Heavy (air conditioner)]]&lt;br /&gt;
* 2016-09-09: Some modifications for Compiler PIC C18&lt;br /&gt;
* 2016-01-16: Some corrections of port to ESP8266&lt;br /&gt;
* 2016-01-16: Added port to MBED&lt;br /&gt;
* 2016-01-16: Added several hardware dependent example main source files&lt;br /&gt;
* 2015-11-17: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#PANASONIC|PANASONIC (Beamer)]]&lt;br /&gt;
* 2015-11-17: Port to ESP8266&lt;br /&gt;
* 2015-11-17: Port to Teensy (3.x)&lt;br /&gt;
* 2015-11-10: Added support for STM8 microcontroller&lt;br /&gt;
* 2015-09-20: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#TECHNICS|TECHNICS]]&lt;br /&gt;
* 2015-06-15: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#ACP24|ACP24]]&lt;br /&gt;
* 2015-05-29: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#S100|S100]]&lt;br /&gt;
* 2015-05-29: Some smaller corrections&lt;br /&gt;
* 2015-05-28: Added Logging for XMega&lt;br /&gt;
* 2015-05-28: Timing corrections  for FAN protocol&lt;br /&gt;
* 2015-05-27: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#MERLIN|MERLIN]]&lt;br /&gt;
* 2015-05-27: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#FAN|FAN]]&lt;br /&gt;
* 2015-05-18: Added F_CPU macro for STM32L1XX&lt;br /&gt;
* 2015-05-18: Some corrections for XMega port&lt;br /&gt;
* 2015-04-23: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#PENTAX|PENTAX]]&lt;br /&gt;
* 2015-04-23: Port to AVR XMega&lt;br /&gt;
* 2014-09-19: Bugfix: added missing newline before #else&lt;br /&gt;
* 2014-09-18: Added logging for ARM STM32F10X&lt;br /&gt;
* 2014-09-17: Corrected PROGMEM access to array irmp_protocol_names[].&lt;br /&gt;
* 2014-09-15: Changed timing tolerances for [[IRMP_-_english#KASEIKYO|KASEIKYO]] protocol&lt;br /&gt;
* 2014-09-15: Moved  irmp_protocol_names to flash, additional UART routines in irmp-main-avr-uart.c&lt;br /&gt;
* 2014-07-21: Port to PIC 12F1840&lt;br /&gt;
* 2014-07-09: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#SAMSUNG48|SAMSUNG48]]&lt;br /&gt;
* 2014-07-09: Some small corrections&lt;br /&gt;
* 2014-07-01: Added logging for ARM_STM32F4XX&lt;br /&gt;
* 2014-07-01: IRMP port for PIC XC8 compiler, removed variadic macros because of stupid XC8 compiler :-(&lt;br /&gt;
* 2014-06-05: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#LGAIR|LGAIR]]&lt;br /&gt;
* 2014-05-30: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#SPEAKER|SPEAKER]]&lt;br /&gt;
* 2014-05-30: Optimized timings for [[IRMP_-_english#SAMSUNG|SAMSUNG]] protocol&lt;br /&gt;
* 2014-02-20: Corrected decoding of [[IRMP_-_english#SIEMENS_+_RUWIDO|SIEMENS]] protocol&lt;br /&gt;
* 2014-02-19: &#039;&#039;&#039;New protocols&#039;&#039;&#039;: [[IRMP_-_english#RCMM|RCMM32, RCMM24 and RCMM12]]&lt;br /&gt;
* 2014-09-17: Optimized timing for [[IRMP_-_english#ROOMBA|ROOMBA]]&lt;br /&gt;
* 2013-04-09: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#ROOMBA|ROOMBA]]&lt;br /&gt;
* 2013-04-09: Optimized detection of [[IRMP_-_english#ORTEK|ORTEK (Hama)]] frames&lt;br /&gt;
* 2013-03-19: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#ORTEK|ORTEK (Hama)]]&lt;br /&gt;
* 2013-03-19: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#TELEFUNKEN|TELEFUNKEN]]&lt;br /&gt;
* 2013-03-12: Changed timing tolerancies for [[IRMP_-_english#RECS80|RECS80]]- and  [[IRMP_-_english#RECS80EXT|RECS80EXT]] protocol&lt;br /&gt;
* 2013-01-21: Corrected detection of repetition frame beim [[IRMP_-_english#DENON|DENON]] protocol&lt;br /&gt;
* 2013-01-17: Corrected frame detection beim [[IRMP_-_english#DENON|DENON]] protocol&lt;br /&gt;
* 2012-12-11: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#A1TVBOX|A1TVBOX]]&lt;br /&gt;
* 2012-12-07: Improved detection von [[IRMP_-_english#DENON|DENON]] repetition frame&lt;br /&gt;
* 2012-11-19: Port to Stellaris LM4F120 TI Launchpad (ARM Cortex M4)&lt;br /&gt;
* 2012-11-06: Corrected [[IRMP_-_english#DENON|DENON]] frame detection&lt;br /&gt;
* 2012-10-26: Some timer corrections and adaptations for Arduino&lt;br /&gt;
* 2012-07-11: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#BOSE|BOSE]]&lt;br /&gt;
* 2012-06-18: Added support for ATtiny87/167&lt;br /&gt;
* 2012-06-05: Some smaller corrections of port to ARM STM32&lt;br /&gt;
* 2012-06-05: Correction of include in [http://www.mikrocontroller.net/svnbrowser/irmp/irmpextlog.c?view=markup irmpextlog.c]&lt;br /&gt;
* 2012-06-05: Bugfix, if only [[IRMP_-_english#NEC_+_extended_NEC|NEC]] and [[IRMP_-_english#NEC42|NEC42]] activated&lt;br /&gt;
* 2012-05-23: Port to ARM STM32&lt;br /&gt;
* 2012-05-23: Bugfix frame detection for [[IRMP_-_english#DENON|DENON]] protocol&lt;br /&gt;
* 2012-02-27: Bugfix in IR60-Decoder&lt;br /&gt;
* 2012-02-27: Bugfix in CRC calculation of  [[IRMP_-_english#KASEIKYO|KASEIKYO]] frames&lt;br /&gt;
* 2012-02-27: Port to C18 Compiler for PIC microcontrollers&lt;br /&gt;
* 2012-02-13: Bugfix: most significant bit in Address wrong in [[IRMP_-_english#NEC_+_extended_NEC|NEC]] protocol, if [[IRMP_-_english#NEC42|NEC42]] protocol activated, too&lt;br /&gt;
* 2012-02-13: Corrected timing of [[IRMP_-_english#SAMSUNG|SAMSUNG]]- and [[IRMP_-_english#SAMSUNG32|SAMSUNG32]] protocol&lt;br /&gt;
* 2012-02-13: [[IRMP_-_english#KASEIKYO|KASEIKYO]]: Genre2 bits will be now stored in upper nibble of flags&lt;br /&gt;
* 2011-09-20: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#KATHREIN|KATHREIN]]&lt;br /&gt;
* 2011-09-20: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#SIEMENS_+_RUWIDO|RUWIDO]]&lt;br /&gt;
* 2011-09-20: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#THOMSON|THOMSON]]&lt;br /&gt;
* 2011-09-20: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#IR60 (SDA2008)|IR60 (SDA2008)]]&lt;br /&gt;
* 2011-09-20: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#LEGO|LEGO]]&lt;br /&gt;
* 2011-09-20: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#NEC16|NEC16]]&lt;br /&gt;
* 2011-09-20: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#NEC42|NEC42]]&lt;br /&gt;
* 2011-09-20: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#NETBOX|NETBOX]]&lt;br /&gt;
* 2011-09-20: Port to ATtiny84 and ATtiny85&lt;br /&gt;
* 2011-09-20: Improved key repetition detection in [[IRMP_-_english#RC5_+_RC5X|RC5]] protocol&lt;br /&gt;
* 2011-09-20: Improved decoding of [[IRMP_-_english#Biphase|Biphase]] protocols&lt;br /&gt;
* 2011-09-20: Fixed some smaller bugs in [[IRMP_-_english#RECS80|RECS80]] decoder&lt;br /&gt;
* 2011-09-20: Corrected detection of additional bits in SIRCS protocol&lt;br /&gt;
* 2011-01-18: Some corrections for [[IRMP_-_english#SIEMENS_+_RUWIDO|SIEMENS]] protocol&lt;br /&gt;
* 2011-01-18: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#Nikon|Nikon]]&lt;br /&gt;
* 2011-01-18: [[IRMP_-_english#SIRCS|SIRCS]]: additional bits (&amp;gt;12) will be stored in address&lt;br /&gt;
* 2011-01-18: Some timing corrections for [[IRMP_-_english#DENON|DENON]] protocol&lt;br /&gt;
* 2010-09-04: Bugfix for F_INTERRUPTS &amp;gt;= 16000&lt;br /&gt;
* 2010-09-02: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#RC6_+_RC6A|RC6A]]&lt;br /&gt;
* 2010-08-29: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#JVC|JVC]]&lt;br /&gt;
* 2010-08-29: [[IRMP_-_english#KASEIKYO|KASEIKYO]] protocol: genre bits will be now stored&lt;br /&gt;
* 2010-08-29: [[IRMP_-_english#KASEIKYO|KASEIKYO]] protocol: Improved handling of repetition frames&lt;br /&gt;
* 2010-08-29: Improved support of [[IRMP_-_english#APPLE|APPLE]] protocols.&lt;br /&gt;
* 2010-07-01: Bugfix: added a timeout for [[IRMP_-_english#NEC_+_extended_NEC|NEC]] repetition frames. This avoids &#039;ghost commands&#039;.&lt;br /&gt;
* 2010-06-26: Bugfix: deactivated [[IRMP_-_english#RECS80|RECS80]], [[IRMP_-_english#RECS80EXT|RECS80EXT]] &amp;amp; [[IRMP_-_english#SIEMENS_+_RUWIDO|SIEMENS]] if interrupts frequency is low&lt;br /&gt;
* 2010-06-25: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#RCCAR|RCCAR]]&lt;br /&gt;
* 2010-06-25: Extended keyboard detection for [[IRMP_-_english#FDC|FDC]] protocol (IR keyboard)&lt;br /&gt;
* 2010-06-25: Interrupt frequency now up to 20kHz possible&lt;br /&gt;
* 2010-06-09: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#FDC|FDC]] (IR-keyboard)&lt;br /&gt;
* 2010-06-09: Corrected timing for [[IRMP_-_english#DENON|DENON]] protocol&lt;br /&gt;
* 2010-06-02: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#SIEMENS_+_RUWIDO|SIEMENS]] (Gigaset)&lt;br /&gt;
* 2010-05-26: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#GRUNDIG_+_NOKIA|NOKIA]]&lt;br /&gt;
* 2010-05-26: Bugfix: detection of long keyboard press for [[IRMP_-_english#GRUNDIG_+_NOKIA|GRUNDIG]] protocol&lt;br /&gt;
* 2010-05-17: Bugfix [[IRMP_-_english#SAMSUNG32|SAMSUNG32]] protocol: corrected command bit mask&lt;br /&gt;
* 2010-05-16: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#GRUNDIG_+_NOKIA|GRUNDIG]]&lt;br /&gt;
* 2010-05-16: Improved handling of automatic frame repetitions for [[IRMP_-_english#SIRCS|SIRCS]]-, [[IRMP_-_english#SAMSUNG32|SAMSUNG32]]-, and [[IRMP_-_english#NUBERT|NUBERT]] protocol&lt;br /&gt;
* 2010-04-28: Only some cosmetic code optimizations&lt;br /&gt;
* 2010-04-16: Improved all timing tolerancies&lt;br /&gt;
* 2010-04-12: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#B&amp;amp;O|Bang &amp;amp; Olufsen]]&lt;br /&gt;
* 2010-03-29: Bugfix: detection of multiple [[IRMP_-_english#NEC_+_extended_NEC|NEC]] repetition frames&lt;br /&gt;
* 2010-03-29: Moved configuration data to  [http://www.mikrocontroller.net/svnbrowser/irmp/irmpconfig.h?view=markup irmpconfig.h]&lt;br /&gt;
* 2010-03-29: Introduced a program version in README.txt: Version 1.0&lt;br /&gt;
* 2010-03-17: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#NUBERT|NUBERT]]&lt;br /&gt;
* 2010-03-16: Correction of RECS80 start bit timings&lt;br /&gt;
* 2010-03-16: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#RECS80EXT|RECS80 Extended]]&lt;br /&gt;
* 2010-03-15: Some optimizations&lt;br /&gt;
* 2010-03-14: Port to PIC&lt;br /&gt;
* 2010-03-11: Some adjustements for some ATMegas&lt;br /&gt;
* 2010-03-07: Bugfix: Reset of state machine after a incomplete [[IRMP_-_english#RC5_+_RC5X|RC5]] frame&lt;br /&gt;
* 2010-03-05: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#APPLE|APPLE]]&lt;br /&gt;
* 2010-03-05: Data  irmp_data.addr + irmp_data.command will be now stored in the bit order of the appropriate protocol&lt;br /&gt;
* 2010-03-04: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#SAMSUNG32|SAMSUNG32]] (Mix aus [[IRMP_-_english#SAMSUNG|SAMSUNG]] &amp;amp; [[IRMP_-_english#NEC_+_extended_NEC|NEC]] protocol)&lt;br /&gt;
* 2010-03-04: Changed some timer tolerances changes of [[IRMP_-_english#SIRCS|SIRCS]]- and [[IRMP_-_english#KASEIKYO|KASEIKYO]]&lt;br /&gt;
* 2010-03-02: [[IRMP_-_english#SIRCS|SIRCS]]: corrected detection and suppression of automatic frame repetitions&lt;br /&gt;
* 2010-03-02: [[IRMP_-_english#SIRCS|SIRCS]]: device ID bits will be now stored in irmp_data.command (not irmp_data.address anymore)&lt;br /&gt;
* 2010-03-02: Enlargement of scan buffers (for logging)&lt;br /&gt;
* 2010-02-24: New variable flags in IRMP_DATA for detection of long key press&lt;br /&gt;
* 2010-02-20: Bugfix [[IRMP_-_english#DENON|DENON]] protocol: repetition frame is now basically inverted&lt;br /&gt;
* 2010-02-19: Detection of [[IRMP_-_english#NEC_+_extended_NEC|NEC]] protocol-Varianten, z.&amp;amp;nbsp;B. [[IRMP_-_english#APPLE|APPLE]]-Fernbedienung&lt;br /&gt;
* 2010-02-19: Detection of [[IRMP_-_english#RC6_+_RC6A|RC6]]- and [[IRMP_-_english#DENON|DENON]] protocol&lt;br /&gt;
* 2010-02-19: Some improvements for [[IRMP_-_english#RC5_+_RC5X|RC5]] decoders (Bugfixes)&lt;br /&gt;
* 2010-02-13: Bugfix: Puls/Pause counters were 1 too low, now better detection of protokols with very short pulses&lt;br /&gt;
* 2010-02-13: Improved detection of [[IRMP_-_english#NEC_+_extended_NEC|NEC]] repetition frames&lt;br /&gt;
* 2010-02-12: New: [[IRMP_-_english#RC5_+_RC5X|RC5]] protocol&lt;br /&gt;
* 2010-02-05: Eliminated a conflict between [[IRMP_-_english#SAMSUNG|SAMSUNG]]- and [[IRMP_-_english#MATSUSHITA|MATSUSHITA]] protocol&lt;br /&gt;
* 2010-01-07: First version&lt;br /&gt;
&lt;br /&gt;
== Literature ==&lt;br /&gt;
&lt;br /&gt;
=== IR Abstract ===&lt;br /&gt;
&lt;br /&gt;
* http://www.sbprojects.net/knowledge/ir/index.php&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&lt;br /&gt;
* http://mc.mikrocontroller.com/de/IR-Protokolle.php&lt;br /&gt;
&lt;br /&gt;
=== SIRCS Protocol ===&lt;br /&gt;
&lt;br /&gt;
* http://www.sbprojects.net/knowledge/ir/sirc.php&lt;br /&gt;
* http://mc.mikrocontroller.com/de/IR-Protokolle.php#SIRCS&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;
* http://www.celadon.com/infrared_protocol/infrared_protocols_samples.pdf&lt;br /&gt;
&lt;br /&gt;
=== NEC Protocol ===&lt;br /&gt;
&lt;br /&gt;
* http://www.sbprojects.net/knowledge/ir/nec.php&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;
=== ACP24 Protocol ===&lt;br /&gt;
&lt;br /&gt;
The ACP24-Protocol is used by Stiebel-Eltron-Aircons&lt;br /&gt;
&lt;br /&gt;
The structure of the 70 databits is :&lt;br /&gt;
&lt;br /&gt;
              1         2         3         4         5         6&lt;br /&gt;
    0123456789012345678901234567890123456789012345678901234567890123456789&lt;br /&gt;
    N VVMMM    ? ???    t vmA x                 y                     TTTT&lt;br /&gt;
    0011001000000111000010001010000000000000000010000000000000000000001111on, temp=30&lt;br /&gt;
&lt;br /&gt;
These are converted into the following 16 bits from irmp_data.command:&lt;br /&gt;
&lt;br /&gt;
        5432109876543210&lt;br /&gt;
        NAVVvMMMmtxyTTTT&lt;br /&gt;
&lt;br /&gt;
Meaning of the symbols:&lt;br /&gt;
&lt;br /&gt;
    TTTT = Temperature + 15 degree&lt;br /&gt;
            TTTT&lt;br /&gt;
            ----------&lt;br /&gt;
            0000        ???&lt;br /&gt;
            0001        ???&lt;br /&gt;
            0010        ???&lt;br /&gt;
            0011        18 degree&lt;br /&gt;
            0100        19 degree&lt;br /&gt;
            0101        20 degree&lt;br /&gt;
            0110        21 degree&lt;br /&gt;
            ...&lt;br /&gt;
            1111        30 degree&lt;br /&gt;
&lt;br /&gt;
    N    = Nightmode&lt;br /&gt;
            N&lt;br /&gt;
            ----------&lt;br /&gt;
            0           off&lt;br /&gt;
            1           on&lt;br /&gt;
&lt;br /&gt;
    VV   = fan, v must be 1!&lt;br /&gt;
            VV   v&lt;br /&gt;
            ----------&lt;br /&gt;
            00   1      level 1&lt;br /&gt;
            01   1      level 2&lt;br /&gt;
            10   1      level 3&lt;br /&gt;
            11   1      Automatic&lt;br /&gt;
&lt;br /&gt;
    MMM  = Mode&lt;br /&gt;
            MMM  m&lt;br /&gt;
            ----------&lt;br /&gt;
            000  0      turn off&lt;br /&gt;
            001  0      turn on&lt;br /&gt;
            001  1      cooling&lt;br /&gt;
            010  1      fan&lt;br /&gt;
            011  1      demist&lt;br /&gt;
            100  1      ???&lt;br /&gt;
            101  1      ---&lt;br /&gt;
            110  1      ---&lt;br /&gt;
            111  1      ---&lt;br /&gt;
&lt;br /&gt;
    A    = Automatic-Programm&lt;br /&gt;
            A&lt;br /&gt;
            ----------&lt;br /&gt;
            0           off&lt;br /&gt;
            1           on&lt;br /&gt;
&lt;br /&gt;
    t   = Timer&lt;br /&gt;
            t   x y&lt;br /&gt;
            ----------&lt;br /&gt;
            1   1 0     Timer 1&lt;br /&gt;
            1   0 1     Timer 2&lt;br /&gt;
&lt;br /&gt;
To control the air con via [[IRSND_-_english|IRSND]], the following functions can be used:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;irmp.h&amp;quot;&lt;br /&gt;
#include &amp;quot;irsnd.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#define IRMP_ACP24_TEMPERATURE_MASK         0x000F                                          // TTTT&lt;br /&gt;
&lt;br /&gt;
#define IRMP_ACP24_SET_TIMER_MASK           (1&amp;lt;&amp;lt;6)                                          // t&lt;br /&gt;
#define IRMP_ACP24_TIMER1_MASK              (1&amp;lt;&amp;lt;5)                                          // x&lt;br /&gt;
#define IRMP_ACP24_TIMER2_MASK              (1&amp;lt;&amp;lt;4)                                          // y&lt;br /&gt;
&lt;br /&gt;
#define IRMP_ACP24_SET_MODE_MASK            (1&amp;lt;&amp;lt;7)                                          // m&lt;br /&gt;
#define IRMP_ACP24_MODE_POWER_ON_MASK       (1&amp;lt;&amp;lt;8)                                          // MMMm = 0010 Einschalten&lt;br /&gt;
#define IRMP_ACP24_MODE_COOLING_MASK        (IRMP_ACP24_SET_MODE_MASK | (1&amp;lt;&amp;lt;8))             // MMMm = 0011 Kuehlen&lt;br /&gt;
#define IRMP_ACP24_MODE_VENTING_MASK        (IRMP_ACP24_SET_MODE_MASK | (1&amp;lt;&amp;lt;9))             // MMMm = 0101 Lueften&lt;br /&gt;
#define IRMP_ACP24_MODE_DEMISTING_MASK      (IRMP_ACP24_SET_MODE_MASK | (1&amp;lt;&amp;lt;10) | (1&amp;lt;&amp;lt;8))   // MMMm = 1001 Entfeuchten&lt;br /&gt;
&lt;br /&gt;
#define IRMP_ACP24_SET_FAN_STEP_MASK        (1&amp;lt;&amp;lt;11)                                         // v&lt;br /&gt;
#define IRMP_ACP24_FAN_STEP_MASK            0x3000                                          // VV&lt;br /&gt;
#define IRMP24_ACP_FAN_STEP_BIT             12                                              // VV&lt;br /&gt;
#define IRMP_ACP24_AUTOMATIC_MASK           (1&amp;lt;&amp;lt;14)                                         // A&lt;br /&gt;
#define IRMP_ACP24_NIGHT_MASK               (1&amp;lt;&amp;lt;15)                                         // N&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// possible values for acp24_set_mode();&lt;br /&gt;
#define ACP24_MODE_COOLING                  1&lt;br /&gt;
#define ACP24_MODE_VENTING                  2&lt;br /&gt;
#define ACP24_MODE_DEMISTING                3&lt;br /&gt;
&lt;br /&gt;
static uint8_t temperature = 18;                                                    // 18 degrees&lt;br /&gt;
&lt;br /&gt;
static void&lt;br /&gt;
acp24_send (uint16_t cmd)&lt;br /&gt;
{&lt;br /&gt;
    IRMP_DATA irmp_data;&lt;br /&gt;
&lt;br /&gt;
    cmd |=  (temperature - 15) &amp;amp; IRMP_ACP24_TEMPERATURE_MASK;&lt;br /&gt;
&lt;br /&gt;
    irmp_data.protocol = IRMP_ACP24_PROTOCOL;&lt;br /&gt;
    irmp_data.address  = 0x0000;&lt;br /&gt;
    irmp_data.command  = cmd;&lt;br /&gt;
    irmp_data.flags    = 0;&lt;br /&gt;
&lt;br /&gt;
    irsnd_send_data (&amp;amp;irmp_data, 1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void&lt;br /&gt;
acp24_set_temperature (uint8_t temp)&lt;br /&gt;
{&lt;br /&gt;
    uint16_t    cmd = IRMP_ACP24_MODE_POWER_ON_MASK;&lt;br /&gt;
&lt;br /&gt;
    temperature = temp;&lt;br /&gt;
    acp24_send (cmd);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void&lt;br /&gt;
acp24_off (void)&lt;br /&gt;
{&lt;br /&gt;
    uint16_t    cmd = 0;&lt;br /&gt;
    acp24_send (cmd);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#define ACP_FAN_STEP1       0&lt;br /&gt;
#define ACP_FAN_STEP2       1&lt;br /&gt;
#define ACP_FAN_STEP3       2&lt;br /&gt;
#define ACP_FAN_AUTOMATIC   3&lt;br /&gt;
&lt;br /&gt;
void&lt;br /&gt;
acp24_fan (uint8_t fan_step)&lt;br /&gt;
{&lt;br /&gt;
    uint16_t    cmd = IRMP_ACP24_MODE_POWER_ON_MASK;&lt;br /&gt;
&lt;br /&gt;
    cmd |= IRMP_ACP24_SET_FAN_STEP_MASK | ((fan_step &amp;lt;&amp;lt; IRMP24_ACP_FAN_STEP_BIT) &amp;amp; IRMP_ACP24_FAN_STEP_MASK);&lt;br /&gt;
&lt;br /&gt;
    acp24_send (cmd);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void&lt;br /&gt;
acp24_set_mode (uint8_t mode)&lt;br /&gt;
{&lt;br /&gt;
    uint16_t    cmd = 0;&lt;br /&gt;
&lt;br /&gt;
    switch (mode)&lt;br /&gt;
    {&lt;br /&gt;
        case ACP24_MODE_COOLING:    cmd = IRMP_ACP24_MODE_COOLING_MASK;     break;&lt;br /&gt;
        case ACP24_MODE_VENTING:    cmd = IRMP_ACP24_MODE_VENTING_MASK;     break;&lt;br /&gt;
        case ACP24_MODE_DEMISTING:  cmd = IRMP_ACP24_MODE_DEMISTING_MASK;   break;&lt;br /&gt;
        default: return;&lt;br /&gt;
    }&lt;br /&gt;
    acp24_send (cmd);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void&lt;br /&gt;
acp24_program_automatic (void)&lt;br /&gt;
{&lt;br /&gt;
    uint16_t    cmd = IRMP_ACP24_MODE_POWER_ON_MASK | IRMP_ACP24_AUTOMATIC_MASK;&lt;br /&gt;
    acp24_send (cmd);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void&lt;br /&gt;
acp24_program_night (void)&lt;br /&gt;
{&lt;br /&gt;
    uint16_t    cmd = IRMP_ACP24_MODE_POWER_ON_MASK | IRMP_ACP24_NIGHT_MASK;&lt;br /&gt;
    acp24_send (cmd);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== LGAIR Protocol ===&lt;br /&gt;
&lt;br /&gt;
The LG Air Con is controlled by an &#039;intelligent&#039; remote. These are the encoded data:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    Command                 AAAAAAAA  PW  Z  S  T  mmm  tttt  vvvv  PPPP&lt;br /&gt;
    --------------------------------------------------------------------&lt;br /&gt;
    ON 23C                  10001000  00  0  0  0  000  1000  0100  1100&lt;br /&gt;
    ON 26C                  10001000  00  0  0  0  000  1011  0100  1111&lt;br /&gt;
&lt;br /&gt;
    OFF                     10001000  11  0  0  0  000  0000  0101  0001&lt;br /&gt;
    TURN OFF                10001000  11  0  0  0  000  0000  0101  0001  (18C currently, identical to off)&lt;br /&gt;
&lt;br /&gt;
    TEMP DOWN 23C           10001000  00  0  0  1  000  1000  0100  0100&lt;br /&gt;
    MODE (to mode0, 23C)    10001000  00  0  0  1  000  1000  0100  0100&lt;br /&gt;
&lt;br /&gt;
    TEMP UP (24C)           10001000  00  0  0  1  000  1001  0100  0101&lt;br /&gt;
    TEMP DOWN 24C           10001000  00  0  0  1  000  1001  0100  0101&lt;br /&gt;
&lt;br /&gt;
    TEMP UP (25C)           10001000  00  0  0  1  000  1010  0100  0110&lt;br /&gt;
    TEMP DOWN 25C           10001000  00  0  0  1  000  1010  0100  0110&lt;br /&gt;
&lt;br /&gt;
    TEMP UP (26C)           10001000  00  0  0  1  000  1011  0100  0111&lt;br /&gt;
&lt;br /&gt;
    MODE                    10001000  00  0  0  1  011  0111  0100  0110  (to mode1, 22C - when switching to mode1 temp automaticall sets to 22C)&lt;br /&gt;
    ON (mode1, 22C)         10001000  00  0  0  0  011  0111  0100  1110&lt;br /&gt;
&lt;br /&gt;
    MODE                    10001000  00  0  0  1  001  1000  0100  0101  (to mode2, no temperature displayed)&lt;br /&gt;
    ON (mode2)              10001000  00  0  0  0  001  1000  0100  1101&lt;br /&gt;
    MODE (to mode3, 23C)    10001000  00  0  0  1  100  1000  0100  1000&lt;br /&gt;
    ON (mode3, 23C)         10001000  00  0  0  0  100  1000  0100  0000&lt;br /&gt;
&lt;br /&gt;
    VENTILATION SLOW        10001000  00  0  0  1  000  0011  0000  1011&lt;br /&gt;
    VENTILATION MEDIUM      10001000  00  0  0  1  000  0011  0010  1101&lt;br /&gt;
    VENTILATION HIGH        10001000  00  0  0  1  000  0011  0100  1111&lt;br /&gt;
    VENTILATION LIGHT       10001000  00  0  0  1  000  0011  0101  0000&lt;br /&gt;
&lt;br /&gt;
    SWING ON/OFF            10001000  00  0  1  0  000  0000  0000  0001&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    Format:     1 start bit + 8 address bits + 16 data bits + 4 checksum bits + 1 stop bit&lt;br /&gt;
&lt;br /&gt;
    Address:    AAAAAAAA = 0x88 (8 bits)&lt;br /&gt;
&lt;br /&gt;
    Data:       PW Z S T MMM tttt vvvv PPPP (16 bits)&lt;br /&gt;
&lt;br /&gt;
                PW:         Power:     00 = On, 11 = Off&lt;br /&gt;
&lt;br /&gt;
                Z:          N/A:       Always 0&lt;br /&gt;
&lt;br /&gt;
                S:          Swing:     1 = Toggle swing, all other data bits are zeros.&lt;br /&gt;
&lt;br /&gt;
                T:          Temp/Vent: 1 = Set temperature and ventilation&lt;br /&gt;
&lt;br /&gt;
                MMM:        Mode, can be combined with temperature&lt;br /&gt;
                            000=Mode 0&lt;br /&gt;
                            001=Mode 2&lt;br /&gt;
                            010=????&lt;br /&gt;
                            011=Mode 1&lt;br /&gt;
                            100=Mode 3&lt;br /&gt;
                            101=???&lt;br /&gt;
                            111=???&lt;br /&gt;
&lt;br /&gt;
                tttt:       Temperature:&lt;br /&gt;
                            0000=used by OFF command&lt;br /&gt;
                            0001=????&lt;br /&gt;
                            0010=????&lt;br /&gt;
                            0011=18°C&lt;br /&gt;
                            0100=19°C&lt;br /&gt;
                            0101=20°C&lt;br /&gt;
                            0110=21°C&lt;br /&gt;
                            0111=22°C&lt;br /&gt;
                            1000=23°C&lt;br /&gt;
                            1001=24°C&lt;br /&gt;
                            1010=25°C&lt;br /&gt;
                            1011=26°C&lt;br /&gt;
                            1011=27°C&lt;br /&gt;
                            1100=28°C&lt;br /&gt;
                            1101=29°C&lt;br /&gt;
                            1111=30°C&lt;br /&gt;
&lt;br /&gt;
                vvvv:       Ventilation:&lt;br /&gt;
                            0000=slow&lt;br /&gt;
                            0010=medium&lt;br /&gt;
                            0011=????&lt;br /&gt;
                            0100=high&lt;br /&gt;
                            0101=light&lt;br /&gt;
                            0110=????&lt;br /&gt;
                            0111=????&lt;br /&gt;
                            ...&lt;br /&gt;
                            1111=????&lt;br /&gt;
&lt;br /&gt;
    Checksum:   PPPP = (DataNibble1 + DataNibble2 + DataNibble3 + DataNibble4) &amp;amp; 0x0F&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== NEC16 Protocol (JVC) ===&lt;br /&gt;
&lt;br /&gt;
* http://www.sbprojects.net/knowledge/ir/jvc.php&lt;br /&gt;
* http://www.ustr.net/infrared/jvc.shtml&lt;br /&gt;
&lt;br /&gt;
=== Samsung Protocol ===&lt;br /&gt;
&lt;br /&gt;
(was reverse engineered by several protocols (Daewoo or similar), so no direct link to Samsung documents is available)&lt;br /&gt;
&lt;br /&gt;
Here is a link to the Daewoo-protocol, which uses the same principle of the sync-bits in the center of a frame, but words with different timings:&lt;br /&gt;
&lt;br /&gt;
* http://users.telenet.be/davshomepage/daewoo.htm&lt;br /&gt;
&lt;br /&gt;
=== MATSUHITA Protocol ===&lt;br /&gt;
&lt;br /&gt;
* http://www.celadon.com/infrared_protocol/infrared_protocols_samples.pdf&lt;br /&gt;
&lt;br /&gt;
=== KASEIKYO Protocol (&amp;quot;Japan Protocol&amp;quot;) ===&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;
=== RECS80 and RECS80 Extended Protocol ===&lt;br /&gt;
&lt;br /&gt;
* http://www.sbprojects.net/knowledge/ir/recs80.php&lt;br /&gt;
&lt;br /&gt;
=== RC5 and RC5x Protocol ===&lt;br /&gt;
&lt;br /&gt;
* http://www.sbprojects.net/knowledge/ir/rc5.php&lt;br /&gt;
* http://mc.mikrocontroller.com/de/IR-Protokolle.php#RC5&lt;br /&gt;
* http://users.telenet.be/davshomepage/rc5.htm&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;
&lt;br /&gt;
=== Denon Protocol ===&lt;br /&gt;
&lt;br /&gt;
* http://www.mikrocontroller.com/de/IR-Protokolle.php#DENON&lt;br /&gt;
* http://www.manualowl.com/m/Denon/AVR-3803/Manual/170243&lt;br /&gt;
&lt;br /&gt;
=== RC6 and RC6A Protocol ===&lt;br /&gt;
&lt;br /&gt;
* http://www.sbprojects.net/knowledge/ir/rc6.php&lt;br /&gt;
* http://www.picbasic.nl/info_rc6_uk.htm&lt;br /&gt;
&lt;br /&gt;
=== Bang &amp;amp; Olufsen ===&lt;br /&gt;
&lt;br /&gt;
* http://www.mikrocontroller.net/attachment/33137/datalink.pdf&lt;br /&gt;
&lt;br /&gt;
=== Grundig Protocol ===&lt;br /&gt;
&lt;br /&gt;
* http://www.see-solutions.de/sonstiges/Grundig_10bit.pdf&lt;br /&gt;
&lt;br /&gt;
=== Nokia Protocol ===&lt;br /&gt;
&lt;br /&gt;
* http://www.sbprojects.net/knowledge/ir/nrc17.php&lt;br /&gt;
&lt;br /&gt;
=== IR60 (SDA2008 and MC14497P) ===&lt;br /&gt;
&lt;br /&gt;
* http://www.datasheetcatalog.org/datasheet/motorola/MC14497P.pdf&lt;br /&gt;
&lt;br /&gt;
=== LEGO Power Functions RC ===&lt;br /&gt;
&lt;br /&gt;
* http://www.philohome.com/pf/LEGO_Power_Functions_RC_v110.pdf&lt;br /&gt;
&lt;br /&gt;
=== RCMM Protocol ===&lt;br /&gt;
&lt;br /&gt;
* http://www.sbprojects.net/knowledge/ir/rcmm.php&lt;br /&gt;
&lt;br /&gt;
=== Other Protocols ===&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.roboternetz.de/phpBB2/files/entwicklung_und_realisierung_einer_universalinfrarotfernbedienung_mit_timerfunktionen.pdf&lt;br /&gt;
&lt;br /&gt;
== IRMP on Youtube ==&lt;br /&gt;
&lt;br /&gt;
* http://www.youtube.com/watch?v=Q7DJvLIyTEI&lt;br /&gt;
&lt;br /&gt;
* http://www.youtube.com/watch?v=1tQ_aqayWZk&lt;br /&gt;
&lt;br /&gt;
* http://www.youtube.com/watch?v=W4tI2axR3-w&lt;br /&gt;
&lt;br /&gt;
* http://www.youtube.com/watch?v=SRs98dIe2WE&lt;br /&gt;
&lt;br /&gt;
== Other Artikels ==&lt;br /&gt;
&lt;br /&gt;
[http://www.infineon.com/dgdl/RF2ir+WhitePaper+V1.0.pdf?folderId=db3a3043191a246301192dd3ee2c2ae4&amp;amp;fileId=db3a30432b57a660012b5c16272c2e81 Whitepaper von Martin Gotschlich, Infineon Technologies AG]&lt;br /&gt;
&lt;br /&gt;
== Hardware / IRMP Projects ==&lt;br /&gt;
&lt;br /&gt;
=== Remote IRMP ===&lt;br /&gt;
&lt;br /&gt;
Infrared sender und receiver controlled via ip network with Android smartphone as remote control:&lt;br /&gt;
&lt;br /&gt;
 * http://www.mikrocontroller.net/articles/Remote_IRMP&lt;br /&gt;
&lt;br /&gt;
=== IR Tester ===&lt;br /&gt;
&lt;br /&gt;
IR tester with LCD by Klaus Leidinger:&lt;br /&gt;
&lt;br /&gt;
* http://www.mikrocontroller-projekte.de/Mikrocontroller/index.html&lt;br /&gt;
&lt;br /&gt;
=== IR Tester with AVR-NET-IO ===&lt;br /&gt;
&lt;br /&gt;
IR tester for Pollin AVR-NET-IO with Pollin ADD-ON Board:&lt;br /&gt;
&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 ===&lt;br /&gt;
&lt;br /&gt;
USB IR remote receiver by Hugo Portisch:&lt;br /&gt;
* http://www.mikrocontroller.net/articles/USB_IR_Remote_Receiver&lt;br /&gt;
&lt;br /&gt;
=== USB IR Receiver/Sender/Switch with Wakeup-Timer ===&lt;br /&gt;
&lt;br /&gt;
* http://www.vdr-portal.de/board18-vdr-hardware/board13-fernbedienungen/123572-fertig-irmp-auf-stm32-ein-usb-ir-empf%C3%A4nger-sender-einschalter-mit-wakeup-timer/&lt;br /&gt;
&lt;br /&gt;
* http://www.mikrocontroller.net/articles/IRMP_auf_STM32_-_ein_USB_IR_Empf%C3%A4nger/Sender/Einschalter_mit_Wakeup-Timer&lt;br /&gt;
&lt;br /&gt;
=== USBASP ===&lt;br /&gt;
&lt;br /&gt;
IR switch based on USBasp&lt;br /&gt;
* http://wiki.easy-vdr.de/index.php?title=USBASP_Einschalter&lt;br /&gt;
&lt;br /&gt;
=== Servo controlled IR Sender ===&lt;br /&gt;
&lt;br /&gt;
Servo controlled IR Sender (adaptive) by Stefan Pendsa:&lt;br /&gt;
* http://forum.mikrokopter.de/topic-21060.html&lt;br /&gt;
* [http://svn.mikrokopter.de/listing.php?repname=Projects&amp;amp;path=%2FServo-Controlled+IR-Transmitter%2F&amp;amp;#Ad2417800d6aa14bf08c571a896e9def7 SVN]&lt;br /&gt;
&lt;br /&gt;
=== Adaptive IR Remote Control ===&lt;br /&gt;
&lt;br /&gt;
Adaptive IR remote control by Robert and Frank M.&lt;br /&gt;
* http://www.mikrocontroller.net/articles/DIY_Lernfähige_Fernbedienung_mit_IRMP&lt;br /&gt;
&lt;br /&gt;
=== AVR Moodlight ===&lt;br /&gt;
&lt;br /&gt;
AVR Moodlight by Axel Schwenke&lt;br /&gt;
* http://www.mikrocontroller.net/topic/244768&lt;br /&gt;
&lt;br /&gt;
STM8 Moodlight by Axel Schwenke&lt;br /&gt;
* https://www.mikrocontroller.net/topic/380098&lt;br /&gt;
&lt;br /&gt;
=== Infinity Mirror LED Ceiling Lamp ===&lt;br /&gt;
&lt;br /&gt;
Infinity Mirror LED ceiling lamp with remote control by Philipp Meißner&lt;br /&gt;
* http://digital-nw.de/Infinity-Mirror.htm&lt;br /&gt;
&lt;br /&gt;
=== Cinema Control ===&lt;br /&gt;
&lt;br /&gt;
Cinema control by Owagner&lt;br /&gt;
* http://ccc.zerties.org/index.php/Benutzer:Owagner&lt;br /&gt;
&lt;br /&gt;
=== Leading-Edge Control ===&lt;br /&gt;
&lt;br /&gt;
leading-edge control:&lt;br /&gt;
&lt;br /&gt;
* http://flosserver.dyndns.org/phasenanschnittsdimmer.php&lt;br /&gt;
&lt;br /&gt;
=== IRDioder – Ikea Dioder Hack ===&lt;br /&gt;
&lt;br /&gt;
Ikea Dioder Hack:&lt;br /&gt;
&lt;br /&gt;
* http://marco-difeo.de/tag/infrared/&lt;br /&gt;
&lt;br /&gt;
=== Expedit Coffee Bar ===&lt;br /&gt;
&lt;br /&gt;
Ikea Expedit as coffee bar:&lt;br /&gt;
&lt;br /&gt;
* http://chaozlabs.blogspot.de/2013/09/expedit-coffee-bar.html&lt;br /&gt;
&lt;br /&gt;
=== Arduino as IR Receiver ===&lt;br /&gt;
&lt;br /&gt;
Arduino as IR Receiver:&lt;br /&gt;
&lt;br /&gt;
* http://www.vdr-portal.de/board18-vdr-hardware/board13-fernbedienungen/110918-arduino-als-ir-empf%C3%A4nger-einsetzen/&lt;br /&gt;
&lt;br /&gt;
More example from the Arduino library:&lt;br /&gt;
&lt;br /&gt;
* https://github.com/ukw100/IRMP/tree/master/examples&lt;br /&gt;
&lt;br /&gt;
=== IR Volume Control with Stellaris Launchpad ===&lt;br /&gt;
&lt;br /&gt;
volume control with Stellaris Launchpad (ARM Cortex-M4F):&lt;br /&gt;
&lt;br /&gt;
* http://www.anthonyvh.com/2013/03/31/ir-volume-control/&lt;br /&gt;
&lt;br /&gt;
=== RemotePi Board ===&lt;br /&gt;
&lt;br /&gt;
Shutdown RaspPI with IR remote control:&lt;br /&gt;
&lt;br /&gt;
* http://www.msldigital.com/pages/more-information&lt;br /&gt;
&lt;br /&gt;
=== Ethernut &amp;amp; IRMP ===&lt;br /&gt;
&lt;br /&gt;
IRMP under RTOS Ethernut:&lt;br /&gt;
&lt;br /&gt;
* http://www.klkl.de/ethernut.html&lt;br /&gt;
&lt;br /&gt;
=== LED strip Remote Control ===&lt;br /&gt;
&lt;br /&gt;
LED strip remote control:&lt;br /&gt;
&lt;br /&gt;
* http://www.solderlab.de/index.php/misc/led-strip-remote-control&lt;br /&gt;
&lt;br /&gt;
=== ADAT Audio Mixer ===&lt;br /&gt;
&lt;br /&gt;
Audio Mixer:&lt;br /&gt;
&lt;br /&gt;
* http://mailtonne.de/adat-audio-mixer/&lt;br /&gt;
&lt;br /&gt;
=== Ethersex &amp;amp; IRMP ===&lt;br /&gt;
&lt;br /&gt;
IRMP + IRSND Modul in Ethersex, a modular Firmware for AVR MCUs&lt;br /&gt;
&lt;br /&gt;
* http://ethersex.de/index.php/IRMP&lt;br /&gt;
&lt;br /&gt;
=== Mastermind Solver ===&lt;br /&gt;
&lt;br /&gt;
Mastermind solver with LED stripes and IR remote control:&lt;br /&gt;
&lt;br /&gt;
* http://www.mystrobl.de/Plone/basteleien/weitere-bulls-and-cows-mastermind-implementationen/mm-v1821/mastermind-solver-mit-led-streifen-und-ir-fernbedienung&lt;br /&gt;
&lt;br /&gt;
=== A MythTV Remote Control without LIRC ===&lt;br /&gt;
&lt;br /&gt;
PC Remote Control with ATtiny85&lt;br /&gt;
&lt;br /&gt;
* http://tomscircuits.blogspot.de/2014/12/a-mythtv-remote-control-without-lirc.html&lt;br /&gt;
&lt;br /&gt;
=== IRMP + IRSND Library for STM32F4 ===&lt;br /&gt;
&lt;br /&gt;
IRMP for STM32F4&lt;br /&gt;
&lt;br /&gt;
* http://mikrocontroller.bplaced.net/wordpress/?page_id=1516&lt;br /&gt;
&lt;br /&gt;
IRSND for STM32F4&lt;br /&gt;
&lt;br /&gt;
* http://mikrocontroller.bplaced.net/wordpress/?page_id=1940&lt;br /&gt;
&lt;br /&gt;
=== IRMP on STM32 - Construction Guidance ===&lt;br /&gt;
&lt;br /&gt;
* http://www.mikrocontroller.net/articles/IRMP_auf_STM32_-_Bauanleitung&lt;br /&gt;
&lt;br /&gt;
=== Seminar Paper - Extension of Arduino Platform ===&lt;br /&gt;
&lt;br /&gt;
* www.eislab.fim.uni-passau.de/files/publications/2010/StudentDiener_ErweiterungDerArduinoPlattform.pdf&lt;br /&gt;
&lt;br /&gt;
== Acknowledgment ==&lt;br /&gt;
&lt;br /&gt;
I thank Vlad Tepesch, Klaus Leidinger, Peter K., and Dániel Körmendi, who sent me many scan files of their IR remote controls.&lt;br /&gt;
&lt;br /&gt;
I thank Christian F. for his tipps relating to the port to PIC MCUs, gera for the port to PIC-C18 compiler, kichi (Michael K.) for the port to ARM STM32, Markus Schuster for the port to TI&#039;s Stellaris LM4F120 Launchpad (ARM Cortex M4), Matthias Frank for the port to XMega, Wolfgang S. for the port to ESP8266, Achill Hasler for the port to Teensy, Axel Schwenke for the port to STM8.&lt;br /&gt;
&lt;br /&gt;
Thanks to Dániel Körmendi, who added the LG-AIR protocol to [[IRSND_-_english|IRSND]]. Thanks to Ulrich v.d. Kammer for the Pentax protocol extension in [[IRSND_-_english|IRSND]].&lt;br /&gt;
&lt;br /&gt;
At least I will thank Jojo S. for his great job translating this documentation!&lt;br /&gt;
&lt;br /&gt;
== Discussion ==&lt;br /&gt;
&lt;br /&gt;
You can discuss IRMP &amp;amp; IRSND in the German thread [http://www.mikrocontroller.net/topic/162119 Infrared Multi Protocol Decoder].&lt;br /&gt;
&lt;br /&gt;
Have fun with IRMP!&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Infrarot]]&lt;br /&gt;
[[Kategorie:AVR-Projekte]]&lt;/div&gt;</summary>
		<author><name>Tooki</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=IRMP_-_english&amp;diff=106080</id>
		<title>IRMP - english</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=IRMP_-_english&amp;diff=106080"/>
		<updated>2023-04-26T08:28:20Z</updated>

		<summary type="html">&lt;p&gt;Tooki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;By &#039;&#039;&#039;Frank M. ([http://www.mikrocontroller.net/user/show/ukw ukw])&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;This is the English translation of the [[IRMP#top|German IRMP documentation]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[[Datei:irmp-title.png| |Waveform of an NEC-format remote control signal]]&lt;br /&gt;
&lt;br /&gt;
Project Intent:&lt;br /&gt;
&lt;br /&gt;
Because RC5 is not only outdated, but obsolete, and because more and more electronic devices from Asian consumer electronics manufacturers are found in the home, it is time to develop an IR decoder that can &#039;understand&#039; about 90% of IR remotes that are used in our daily life.&lt;br /&gt;
&lt;br /&gt;
This article introduces &#039;IRMP&#039; as &amp;quot;Infrared Multi Protocol Decoder&amp;quot; in detail. The counterpart, the [[IRSND_-_english|IRSND]] IR encoder, can be found in this [[IRSND_-_english|document]].&lt;br /&gt;
&lt;br /&gt;
= IRMP - Infrared Multi Protocol Decoder =&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width: 80%;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 20%;&amp;quot; |&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
=== Supported MCUs ===&lt;br /&gt;
&lt;br /&gt;
[[IRMP_-_english#top|IRMP]] runs on numerous MCU families:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AVR&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* ATtiny87,  ATtiny167&lt;br /&gt;
* ATtiny45,  ATtiny85&lt;br /&gt;
* ATtiny44,  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;
&#039;&#039;&#039;XMega&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* ATXmega128&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC&#039;&#039;&#039; (CCS and XC8/C18 compiler)&lt;br /&gt;
&lt;br /&gt;
* PIC12F1840&lt;br /&gt;
* PIC18F4520&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;STM32&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* STM32F4xx (tested on STM32F401RE/F411RE Nucleo, STM32F4 Discovery)&lt;br /&gt;
* STM32F10x (tested on STM32F103C8T6 Mini Development Board)&lt;br /&gt;
* STM32 with HAL library &#039;&#039;&#039;(NEW!)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;STM8&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* STM8S103F3&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TI Stellaris&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* LM4F120 Launchpad (ARM Cortex M4)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ESP8266 (NEW!)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* ESP8266-EVB&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TEENSY 3.0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* MK20DX256VLH7 (ARM Cortex-M4 72MHz)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MBED (NEW!)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* LPC1347 Cortex-M3 72 MHz&lt;br /&gt;
* LPC4088 (Embedded Artists)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ChibiOS HAL (NEW!)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Various ARM Cortex MCUss, for example STM32, Kinetis, and NRF5&lt;br /&gt;
* [https://sourceforge.net/p/chibios/svn2/HEAD/tree/trunk/os/hal/ports/ Officially supported MCU series]&lt;br /&gt;
* [https://github.com/ChibiOS/ChibiOS-Contrib/tree/master/os/hal/ports More MCU series, community supported]&lt;br /&gt;
||&lt;br /&gt;
[[Datei:irmp-empfaenger.png|miniatur|Connection of a IR receiver module to MCU]]&lt;br /&gt;
|}&lt;br /&gt;
=== Supported IR Protocols ===&lt;br /&gt;
&lt;br /&gt;
[[IRMP_-_english#top|IRMP]] - the infrared remote decoder, which can decode several protocols at once - is capable of decoding the following protocols (in alphabetical order):&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|+ &#039;&#039;&#039;Supported Protocols&#039;&#039;&#039;&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! style=&amp;quot;width:15%&amp;quot; | Protocol || Vendor&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#A1TVBOX|A1TVBOX]] || ADB (Advanced Digital Broadcast), e.g. A1 TV Box&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#APPLE|APPLE]] || Apple&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#ACP24|ACP24]] || Stiebel Eltron&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#B&amp;amp;O|B&amp;amp;O]] || Bang &amp;amp; Olufsen&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#BOSE|BOSE]] || Bose&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#DENON|DENON]] || Denon, Sharp&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#FAN|FAN]] || FAN, remote for fans&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#FDC|FDC]] || FDC Keyboard&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#GRUNDIG_+_NOKIA|GRUNDIG]] || Grundig&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#GRUNDIG_+_NOKIA|NOKIA]] || Nokia, e.g. D-Box&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#IR60 (SDA2008)|IR60 (SDA2008)]] || various European vendors&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#JVC|JVC]] || JVC&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#KASEIKYO|KASEIKYO]] || Panasonic, Technics, Denon and other vendors which are members of the Japanese &amp;quot;Association for Electric Home Appliances&amp;quot; (AEHA).&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#KATHREIN|KATHREIN]]  || KATHREIN&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#LEGO|LEGO]]   || Lego&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#LGAIR|LGAIR]]   || LG air conditioners&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#MATSUSHITA|MATSUSHITA]] || Matsushita&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#MITSU_HEAVY|MITSU_HEAVY]] || Mitsubishi air conditioners&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#NEC16|NEC16]]  || JVC, Daewoo&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#NEC42|NEC42]]  || JVC&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#MERLIN|MERLIN]]  || MERLIN remote (Pollin article number: 620 185)&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#NEC_+_extended_NEC|NEC]] || NEC, Yamaha, Canon, Tevion, Harman/Kardon, Hitachi, JVC, Pioneer, Toshiba, Xoro, Orion, generic and many other Asian vendors.&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#NETBOX|NETBOX]]  || Netbox&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#Nikon|Nikon]] || Nikon&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#NUBERT|NUBERT]] || Nubert, e.g. Subwoofer Systems&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#ORTEK|ORTEK]] || Ortek, Hama&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#PANASONIC|PANASONIC]] || PANASONIC video projectors&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#PENTAX|PENTAX]] || PENTAX&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#RC5_+_RC5X|RC5]] || Philips and other European vendors&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#RC6_+_RC6A|RC6A]] || Philips, Kathrein and others, e.g. XBOX&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#RC6_+_RC6A|RC6]] || Philips and other European vendors&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#RCCAR|RCCAR]] || RC Car: IR remote for RC toys &lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#RCII|RCII]] || T+A &#039;&#039;&#039;(NEW!)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#RECS80|RECS80]] || Philips, Nokia, Thomson, Nordmende, Telefunken, Saba&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#RECS80EXT|RECS80EXT]] || Philips, Technisat, Thomson, Nordmende, Telefunken, Saba&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#RCMM|RCMM]] || Fujitsu-Siemens e.g. Activy keyboard&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#ROOMBA|ROOMBA]] || iRobot Roomba vacuum cleaner&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#S100|S100]] || similar to RC5, but 14 instead of 13 bits and 56kHz modulation. Vendor unknown.&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#SAMSUNG32|SAMSUNG32]] || Samsung&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#SAMSUNG48|SAMSUNG48]] || various air conditioners&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#SAMSUNG|SAMSUNG]] || Samsung&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#SIEMENS_+_RUWIDO|RUWIDO]] || RUWIDO (e.g. T-Home Media Receiver, MERLIN keyboard(Pollin))&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#SIEMENS_+_RUWIDO|SIEMENS]] || Siemens, e.g. Gigaset M740AV&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#SIRCS|SIRCS]] || Sony&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#SPEAKER|SPEAKER]] || Speaker systems like X-Tensions&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#TECHNICS|TECHNICS]] || Technics&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#TELEFUNKEN|TELEFUNKEN]] || Telefunken&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#THOMSON|THOMSON]] || Thomson&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#VINCENT|VINCENT]] || Vincent&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#FF0000&amp;quot;&amp;gt;&#039;&#039;&#039;New:&#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Starting with version 3.2, IRMP can also decode 433 MHz RF radio protocols.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|+ &#039;&#039;&#039;Supported RF Protocols&#039;&#039;&#039;&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! style=&amp;quot;width:15%&amp;quot; | Protocol&lt;br /&gt;
! style=&amp;quot;width:100em&amp;quot; | Vendor&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP#RF_GEN24|RF_GEN24]] || Generiv 24-bit format, e.g. Pollin 550666 radio-controlled receptacle&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP#RF_X10|RF_X10]] || X10 PC RF remote control (Medion), Pollin 721815&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Each of these protocols can be activated separately. If you want, you can activate all protocols. If you need only one protocol, you can disable all others. Only the code selected by the user will be compiled .&lt;br /&gt;
&lt;br /&gt;
=== History ===&lt;br /&gt;
&lt;br /&gt;
The [[IRMP_-_english#top|IRMP]] source for the AVR and PIC MCUs was created as part of the [[Word Clock]] project.&lt;br /&gt;
&lt;br /&gt;
=== Thread in Forum ===&lt;br /&gt;
&lt;br /&gt;
Intention for an own IRMP article is the following thread in Projects&amp;amp;Code [http://www.mikrocontroller.net/topic/162119 IRMP - Infrared Multi Protocol Decoder] (in German language).&lt;br /&gt;
&lt;br /&gt;
== IR Protocols ==&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width: 80%;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 20%;&amp;quot; |&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
Some vendors use their own proprietary protocols, such as Sony, Samsung, and Matsushita. Philips developed and used [[IRMP_-_english#RC5 + RC5X|RC5]].&lt;br /&gt;
[[IRMP_-_english#RC5 + RC5X|RC5]] was seen in Europe as &#039;&#039;the&#039;&#039; standard IR protocol which was adopted by many European vendors. Nowadays [[IRMP_-_english#RC5 + RC5X|RC5]] is practically not used and can be considered &amp;quot;dead&amp;quot;. Although the successor [[IRMP_-_english#RC6_+_RC6A|RC6]] is used in current European hardware, it is also used rarely.&lt;br /&gt;
&lt;br /&gt;
Japanese vendors also tried to establish their own standard, the so called [[IRMP_-_english#KASEIKYO|Kaseikyo]] (or &amp;quot;Japan&amp;quot;) protocol. With a word length of 48 bits, it is more versatile. But it has not found wide use, though it is found in some appliances.&lt;br /&gt;
&lt;br /&gt;
Nowadays the [[IRMP_-_english#NEC_+_extended_NEC|NEC]] protocol is used (also mainly in Japanese devices) in both premium and generic products. I estimate the market share at 80% for the [[IRMP_-_english#NEC_+_extended_NEC|NEC]] protocol. Nearly all remotes in my daily use utilize the [[IRMP_-_english#NEC_+_extended_NEC|NEC]] IR code. This starts with the TV set, continues with the DVD player and the notebook remote all the way to the generic multimedia hard drive, just to mention a few examples.&lt;br /&gt;
||&lt;br /&gt;
[[Datei:nec-protocol.png|miniatur|NEC protocol, RGB remote control, T-&amp;gt;A: 9.14ms, A-&amp;gt;B: 4.42ms, B-&amp;gt;C: 660us]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Coding methods ==&lt;br /&gt;
&lt;br /&gt;
[[IRMP_-_english#top|IRMP]] supports the following IR coding methods:&lt;br /&gt;
&lt;br /&gt;
* [[IRMP_-_english#Pulse Distance|Pulse Distance]], typ. Example: [[IRMP_-_english#NEC_+_extended_NEC|NEC]]&lt;br /&gt;
* [[IRMP_-_english#Pulse Width|Pulse Width]], typ. Example: [[IRMP_-_english#SIRCS|Sony SIRCS]]&lt;br /&gt;
* [[IRMP_-_english#Biphase|Biphase (Manchester)]], typ. Example: Philips [[IRMP_-_english#RC5_+_RC5X|RC5]], [[IRMP_-_english#RC6_+_RC6A|RC6]]&lt;br /&gt;
* [[IRMP_-_english#Pulse Position|Pulse Position (NRZ)]], typ. Example: [[IRMP_-_english#NETBOX|Netbox]]&lt;br /&gt;
* [[IRMP_-_english#Pulse Distance Width|Pulse Distance Width]], typ. Example: [[IRMP_-_english#NUBERT|Nubert]]&lt;br /&gt;
&lt;br /&gt;
The pulses are modulated - usually at 36 kHz or 38 kHz - to reduce environmental influences such as indoor lighting or sunlight.&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width: 80%;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 20%;&amp;quot; |&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
=== Pulse Distance ===&lt;br /&gt;
&lt;br /&gt;
Pulse distance coding can be identified by the following rule:&lt;br /&gt;
&lt;br /&gt;
* there is only &#039;&#039;&#039;one pulse length&#039;&#039;&#039; and there are &#039;&#039;&#039;two different space lengths&#039;&#039;&#039;&lt;br /&gt;
||&lt;br /&gt;
[[Datei:Pulse-Distance.png|miniatur|Pulse distance coding]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width: 80%;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 20%;&amp;quot; |&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
=== Pulse Width ===&lt;br /&gt;
&lt;br /&gt;
Pulse width coding can be identified by the following rule: &lt;br /&gt;
&lt;br /&gt;
* there are &#039;&#039;&#039;two different pulse lengths&#039;&#039;&#039; and &#039;&#039;&#039;only one space length&#039;&#039;&#039;&lt;br /&gt;
||&lt;br /&gt;
[[Datei:Pulse-Width.png|miniatur|Pulse width coding]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width: 80%;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 20%;&amp;quot; |&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
=== Pulse Distance Width ===&lt;br /&gt;
&lt;br /&gt;
This is a mix of pulse distance and pulse width coding. Often the sum of pulse and space length is constant. The rule is:&lt;br /&gt;
&lt;br /&gt;
* there are &#039;&#039;&#039;two different pulse lengths&#039;&#039;&#039; and &#039;&#039;&#039;two different space lengths.&#039;&#039;&#039;&lt;br /&gt;
||&lt;br /&gt;
[[Datei:Pulse-Distance-Width.png|miniatur|Pulse distance width coding]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width: 80%;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 20%;&amp;quot; |&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
=== Biphase ===&lt;br /&gt;
&lt;br /&gt;
In biphase coding the order of pulse and space gives the bit value.&lt;br /&gt;
Therefore a biphase boding can be identified by this criteria:&lt;br /&gt;
&lt;br /&gt;
* there is exactly &#039;&#039;&#039;one&#039;&#039;&#039; pulse and space length, as well as the &#039;&#039;&#039;double&#039;&#039;&#039; pulse/space length&lt;br /&gt;
&lt;br /&gt;
Usually the length for the pulse and space are equal, meaning that the signal shape is symmetric. But IRMP also recognizes protocols which use different pulse and space lengths, for example the [[IRMP_-_english#A1TVBOX|A1TVBOX]] protocol.&lt;br /&gt;
||&lt;br /&gt;
[[Datei:Biphase-Coding.png|miniatur|Biphase coding]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width: 80%;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 20%;&amp;quot; |&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
=== Pulse Position ===&lt;br /&gt;
&lt;br /&gt;
Pulse position coding is known from commmon UARTs. Here, every bit has a fixed length. Depending on the value (0 or 1), it is a pulse or a space.&lt;br /&gt;
&lt;br /&gt;
Typical criteria for a &#039;&#039;&#039;pulse position protocol&#039;&#039;&#039; are:&lt;br /&gt;
* there are &#039;&#039;&#039;multiples&#039;&#039;&#039; of a basic pulse/space length&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A tabular listing of different IR protocols can be found here: [[IRMP_-_english#IR_Protocols_in_Detail|IR Protocols in Detail]].&#039;&#039;&#039;&lt;br /&gt;
The specified timings are typical values. In some remotes they differ up to 40% in real life. Therefore [[IRMP_-_english#top|IRMP]] uses minimum/maximum limits to be tolerant with the timing.&lt;br /&gt;
||&lt;br /&gt;
[[Datei:Pulse-Position.png|miniatur|Pulse position coding]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Protocol Detection ==&lt;br /&gt;
&lt;br /&gt;
Most of the protocols [[IRMP_-_english#top|IRMP]] decodes have something in common: they exhibit a start bit whose timing is unique.&lt;br /&gt;
&lt;br /&gt;
According to this start bit timing, most protocols can be identified. [[IRMP_-_english#top|IRMP]] measures the timing of the start bit and adjusts its timing tables &amp;quot;on-the-fly&amp;quot; to the discovered protocol. Subsequent bits can then be read sequentially without the need to first store a complete frame.&lt;br /&gt;
Thus, [[IRMP_-_english#top|IRMP]] does not wait to read a complete frame but starts decoding directly after detecting the first pulse.&lt;br /&gt;
&lt;br /&gt;
If the start bit is not unique, [[IRMP_-_english#top|IRMP]] proceeds in parallel with multiple possible protocols. For example with two candidate protocols, once plausible reasons disqualify one protocol, the other protocol is used.&lt;br /&gt;
&lt;br /&gt;
Detection is implemented as an interrupt-driven [[Statemachine|state machine]] which is called at a frequency of typically 15000 times per second. Among others, the [[Statemachine|state machine]] has the following states:&lt;br /&gt;
&lt;br /&gt;
* detect the first pulse length of the start bit&lt;br /&gt;
* detect the space length of the start bit&lt;br /&gt;
* detect the space length of the first data bit&lt;br /&gt;
&lt;br /&gt;
After that, the pulse and space lengths of the start bit are known. Now all enabled protocols are searched for these lengths. If a protocol matches, the timing table for this protocol is loaded. Subsequent bits are checked against the timing table to ensure they conform to it.&lt;br /&gt;
&lt;br /&gt;
The [[Statemachine|state machine]] continues with the following states:&lt;br /&gt;
&lt;br /&gt;
* detect the spaces of the data bits&lt;br /&gt;
* detect the pulse length of the data bits&lt;br /&gt;
* check timing. If different, switch back to another valid IR protocol, otherwise return&lt;br /&gt;
* detect the stop bit, if present in the protocol&lt;br /&gt;
* check data for plausibility, like CRC or other redundancy bits&lt;br /&gt;
* convert data to device address and command&lt;br /&gt;
* detect code repetition by long key press, set corresponding flag&lt;br /&gt;
&lt;br /&gt;
Indeed the [[Statemachine|state machine]] is even more complex because some protocols have no start bit (e.g. [[IRMP_-_english#DENON|Denon]]) or have multiple start bits (4 in [[IRMP_-_english#B.26O|B&amp;amp;O]]) or have another sync bit within the frame (e.g. [[IRMP_-_english#SAMSUNG|Samsung]]). These extra conditions are caught in the code by protocol-specific &amp;quot;special cases&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Switching to an other protocol can happen multiple times while receiving a frame, e.g. from [[IRMP_-_english#NEC42|NEC42]] (42 bits) to [[IRMP_-_english#NEC16|NEC16]] (8 bits + sync bit + 8 bits), if a premature sync bit is detected. Or from [[IRMP_-_english#NEC + extended NEC|NEC]]/[[IRMP_-_english#NEC42|NEC42]] (32/42 bits) to [[IRMP_-_english#JVC|JVC]] (16 bits) if the stop bit occurs prematurely. It becomes difficult when, after detecting the start bit, two possible protocols use different coding methods, e.g. when the one protocol uses [[IRMP_-_english#Pulse Distance|pulse distance coding]] and the other uses [[IRMP_-_english#Biphase|biphase coding (Manchester)]]. In this case [[IRMP_-_english#top|IRMP]] stores the necessary bits for both coding methods and later discards one or the other.&lt;br /&gt;
&lt;br /&gt;
Furthermore, some remotes using particular protocols transmit repeat frames, either for redundancy (error detection) or for long key presses. Both kinds are detected by IRMP: error detection frames are detected by IRMP, but not passed to the application. Others are detected as long key presses and flagged by IRMP.&lt;br /&gt;
&lt;br /&gt;
== Download ==&lt;br /&gt;
&lt;br /&gt;
Version 3.2.6, Date: 2021-01-27&lt;br /&gt;
&lt;br /&gt;
Download stable version: [http://www.mikrocontroller.net/wikifiles/7/79/Irmp.zip Irmp.zip] &lt;br /&gt;
&lt;br /&gt;
Current development version of [[IRMP_-_english#top|IRMP]] &amp;amp; [[IRSND_-_english|IRSND]]:&lt;br /&gt;
&lt;br /&gt;
* SVN link: [svn://mikrocontroller.net/irmp/ SVN]&lt;br /&gt;
* SVN browser: [http://www.mikrocontroller.net/svnbrowser/irmp/ IRMP in SVN]&lt;br /&gt;
* Download tarball: [http://www.mikrocontroller.net/svnbrowser/irmp/?view=tar Tarball].&lt;br /&gt;
&lt;br /&gt;
Download Arduino library: [https://github.com/ukw100/IRMP GitHub] or use Arduino &amp;quot;&#039;&#039;Tools / Manage Libraries...&#039;&#039;&amp;quot; and search for IRMP.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;You can see the history of the software changes here: [[IRMP_-_english#Software_History|Software History]]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== License ==&lt;br /&gt;
&lt;br /&gt;
IRMP is Open Source Software and is released under the [https://www.gnu.org/licenses/old-licenses/gpl-2.0.html GPL v2], or&lt;br /&gt;
(at your option) any later version.&lt;br /&gt;
&lt;br /&gt;
== Source Code ==&lt;br /&gt;
&lt;br /&gt;
The source code can be easily compiled for AVR MCUs by loading the project file irmp.aps in AVR Studio 4.&lt;br /&gt;
&lt;br /&gt;
For other development environments it is simple to create a project or makefile. The source includes:&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmp.c?view=markup irmp.c] - IR decoder core&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmpprotocols.h?view=markup irmpprotocols.h] - all protocol definitions&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmpsystem.h?view=markup irmpsystem.h] - target-independent definitions for AVR/PIC/STM32&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmp.h?view=markup irmp.h] - include file for the application&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmpconfig.h?view=markup irmpconfig.h] - user configuration&lt;br /&gt;
&lt;br /&gt;
Sample applications (main functions and timer configurations):&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-avr.c?view=markup irmp-main-avr.c] - AVR&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-avr-uart.c?view=markup irmp-main-avr-uart.c] - AVR with UART output&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-pic-xc8.c?view=markup irmp-main-pic-xc8.c] - PIC18F4520&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-pic-12F1840.c?view=markup irmp-main-pic-12F1840.c] - PIC12F1840&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-stm32.c?view=markup irmp-main-stm32.c] - STM32&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-stellaris-arm.c?view=markup irmp-main-stellaris-arm.c] - TI Stellaris LM4F120 Launchpad&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-esp8266.c?view=markup irmp-main-esp8266.c] - ESP8266&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-mbed.cpp?view=markup irmp-main-mbed.cpp] - MBED&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/examples/Arduino/Arduino.ino?view=markup examples/Arduino/Arduino.ino] - Teensy 3.x&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-chibios.c?view=markup irmp-main-chibios.c] - ChibiOS&lt;br /&gt;
&lt;br /&gt;
{{Warnung|&lt;br /&gt;
;Important: include only irmp.h in your application:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;irmp.h&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
All other include files are included within irmp.h. See also the sample application irmp-main-avr.c.&lt;br /&gt;
&lt;br /&gt;
Furthermore, the preprocessor constant &#039;&#039;&#039;F_CPU in project or makefile&#039;&#039;&#039; must be defined. This should have at least the value of 8000000UL, processor speed should be at least 8 MHz. This applies to AVR targets and not for MCUs with PLL. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[IRMP_-_english#top|IRMP]] also runs on PIC processors. For the PIC-CCS compiler the necessary preprocessor defines are already set, such that [http://www.mikrocontroller.net/svnbrowser/irmp/irmp.c?view=markup irmp.c] can be directly used in the CCS environment. Only a short interrupt service routine like &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
must be added. The interrupt period time must be set to 66 µs (15 kHz).&lt;br /&gt;
&lt;br /&gt;
For AVR processors you will find an example for the usage of [[IRMP_-_english#top|IRMP]] in [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-avr.c?view=markup irmp-main-avr.c]. The main things are the [[AVR-GCC-Tutorial/Die_Timer_und_Zähler_des_AVR|Timer]] initializing of the timer and the processing of received IR commands. The received protocol, the device address and the command will be output on the HW-UART.&lt;br /&gt;
&lt;br /&gt;
For the Stellaris LM4F120 Launchpad from TI (ARM Cortex M4) is a propriate timer init function already integrated in [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-avr.c?view=markup irmp-main-avr.c].&lt;br /&gt;
&lt;br /&gt;
[[IRMP_-_english#top|IRMP]] can be used also with STM32 microcontrollers.&lt;br /&gt;
&lt;br /&gt;
Another new implementation is available on the mbed platform.&lt;br /&gt;
&lt;br /&gt;
=== avr-gcc Optimizations ===&lt;br /&gt;
&lt;br /&gt;
From version 4.7.x of avr-gcc, the [https://gcc.gnu.org/onlinedocs/gccint/LTO.html#LTO LTO option] can be used to make the call of the external function irmp_ISR() from the main ISR more efficient. This improves the performance of the ISR a little.&lt;br /&gt;
&lt;br /&gt;
Add the following compiler and linker options:&lt;br /&gt;
&lt;br /&gt;
* additional compiler option: -flto&lt;br /&gt;
* additional linker options: -flto -Os&lt;br /&gt;
&lt;br /&gt;
If you forget the additional linker option -Os, the binary will be significantly larger as it will not be optimized further. Also, the option -flto must be passed to the linker, otherwise link time optimization will not work.&lt;br /&gt;
&lt;br /&gt;
=== Configuration ===&lt;br /&gt;
&lt;br /&gt;
[[IRMP_-_english#top|IRMP]] is configured by parameters in  [http://www.mikrocontroller.net/svnbrowser/irmp/irmpconfig.h?view=markup irmpconfig.h]:&lt;br /&gt;
&lt;br /&gt;
* [[IRMP_-_english#F_INTERRUPTS|number of interrupts per second]]&lt;br /&gt;
* [[IRMP_-_english#IRMP_SUPPORT_xxx_PROTOCOL|supported IR protocols]]&lt;br /&gt;
* [[IRMP_-_english#IRMP_PORT_LETTER + IRMP_BIT_NUMBER|hardware pin for IR receiver]]&lt;br /&gt;
* [[IRMP_-_english#IRMP_LOGGING|IR logging]]&lt;br /&gt;
&lt;br /&gt;
=== Settings in irmpconfig.h ===&lt;br /&gt;
&lt;br /&gt;
[[IRMP_-_english#top|IRMP]] will decode all protocols listed above in one ISR. For this, some settings are needed. These are set in [http://www.mikrocontroller.net/svnbrowser/irmp/irmpconfig.h?view=markup irmpconfig.h].&lt;br /&gt;
&lt;br /&gt;
==== F_INTERRUPTS ====&lt;br /&gt;
&lt;br /&gt;
Number of interrupts per second. Should be set to a value from 10000 to 20000. The higher the value, the better the resolution and therefore the quality of detection. But a higher interrupt rate means also higher CPU load. A value of 15000 is usually a good compromise.&lt;br /&gt;
&lt;br /&gt;
Default value:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
#define F_INTERRUPTS                            15000      // interrupts per second&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On AVR controllers, the [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-avr.c?view=markup irmp-main-avr.c] example uses Timer1 with 16 bits of resolution. If for any reasons Timer1 is not available, you can also use Timer2 with 8 bits of resolution.&lt;br /&gt;
&lt;br /&gt;
In that case, configure Timer2 as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
OCR2   =  (uint8_t) ((F_CPU / F_INTERRUPTS) / 8) - 1 + 0.5);   // Compare Register OCR2&lt;br /&gt;
TCCR2  = (1 &amp;lt;&amp;lt; WGM21) | (1 &amp;lt;&amp;lt; CS21);                           // CTC Mode, prescaler = 8&lt;br /&gt;
TIMSK  = 1 &amp;lt;&amp;lt; OCIE2;                                           // enable Timer2 interrupt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The above example is valid for ATmega88/ATmega168/ATmega328. For other AVR MCUs check the datasheet.&lt;br /&gt;
&lt;br /&gt;
You must not forget to change the ISR to Timer2 as well:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
ISR(TIMER2_COMP_vect)&lt;br /&gt;
{&lt;br /&gt;
  (void) irmp_ISR(); &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== IRMP_SUPPORT_xxx_PROTOCOL ====&lt;br /&gt;
&lt;br /&gt;
Here you can select which protocols to enable in [[IRMP_-_english#top|IRMP]]. Common protocols are emabled by default.&lt;br /&gt;
&lt;br /&gt;
To enable additional protocols or disable others to save memory, set the corresponding values in [http://www.mikrocontroller.net/svnbrowser/irmp/irmpconfig.h?view=markup irmpconfig.h].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&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;
&lt;br /&gt;
// more protocols, enable here!                 Enable  Remarks                 F_INTERRUPTS            Program Space&lt;br /&gt;
#define IRMP_SUPPORT_DENON_PROTOCOL             0       // DENON, Sharp         &amp;gt;= 10000                 ~250 bytes&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 (SDA2008)       &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_BOSE_PROTOCOL              0       // BOSE                 &amp;gt;= 10000                 ~150 bytes&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_ORTEK_PROTOCOL             0       // ORTEK (Hama)         &amp;gt;= 10000                 ~150 bytes&lt;br /&gt;
#define IRMP_SUPPORT_TELEFUNKEN_PROTOCOL        0       // Telefunken 1560      &amp;gt;= 10000                 ~150 bytes&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_ROOMBA_PROTOCOL            0       // iRobot Roomba        &amp;gt;= 10000                 ~150 bytes&lt;br /&gt;
#define IRMP_SUPPORT_RUWIDO_PROTOCOL            0       // RUWIDO, T-Home       &amp;gt;= 15000                 ~550 bytes&lt;br /&gt;
#define IRMP_SUPPORT_A1TVBOX_PROTOCOL           0       // A1 TV BOX            &amp;gt;= 15000 (better 20000)  ~300 bytes&lt;br /&gt;
#define IRMP_SUPPORT_LEGO_PROTOCOL              0       // LEGO Power RC        &amp;gt;= 20000                 ~150 bytes&lt;br /&gt;
#define IRMP_SUPPORT_RCMM_PROTOCOL              0       // RCMM 12, 24, or 32    &amp;gt;= 20000                 ~150 bytes&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each [[IRMP_-_english#top|IRMP]] enabled IR protocol consumes amount of code noted above. Here you can apply optimizations: for example, the modulation frequency of 455 kHz for the [[IRMP_-_english#B&amp;amp;O|B&amp;amp;O]] protocol is far away from the frequencies that are used by other protocols. This usually requires a different IR receiver, so without that, you can disable these protocols. For example, you cannot receive the [[IRMP_-_english#B&amp;amp;O|B&amp;amp;O]] protocol (455kHz) with a TSOP1738/TSOP31238.&lt;br /&gt;
&lt;br /&gt;
Additionally, the [[IRMP_-_english#SIEMENS_+_RUWIDO|SIEMENS]]/[[IRMP_-_english#FDC|FDC]]/[[IRMP_-_english#RCCAR|RCCAR]] can only be detected reliably at a frequency of 15 kHz or higher. For [[IRMP_-_english#LEGO|LEGO]], 20 kHz is needed. To use these protocols, you must modify [[IRMP_-_english#F_INTERRUPTS|F_INTERRUPTS]]. Otherwise, during compilation you will get a warning and the corresponding protocols will automatically be disabled.&lt;br /&gt;
&lt;br /&gt;
==== IRMP_PORT_LETTER + IRMP_BIT_NUMBER ====&lt;br /&gt;
&lt;br /&gt;
This constant defines the pin where the IR receiver is connected.&lt;br /&gt;
&lt;br /&gt;
Default value is PORT B6:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
/*---------------------------------------------------------------------------&lt;br /&gt;
 * Change hardware pin here for ATMEL AVR&lt;br /&gt;
 *---------------------------------------------------------------------------&lt;br /&gt;
 */&lt;br /&gt;
#if defined (ATMEL_AVR)                         // use PB6 as IR input on AVR&lt;br /&gt;
#  define IRMP_PORT_LETTER                      B&lt;br /&gt;
#  define IRMP_BIT_NUMBER                       6&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These two values must match your hardware configuration.&lt;br /&gt;
&lt;br /&gt;
This applies also to STM32 MCUs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
/*----------------------------------------------------------------------------&lt;br /&gt;
 * Change hardware pin here for ARM STM32&lt;br /&gt;
 *----------------------------------------------------------------------------&lt;br /&gt;
 */&lt;br /&gt;
#elif defined (ARM_STM32)                       // use C13 as IR input on STM32&lt;br /&gt;
#  define IRMP_PORT_LETTER                      C&lt;br /&gt;
#  define IRMP_BIT_NUMBER                       13&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When using STM32 HAL library, define the constants IRSND_Transmit_GPIO_Port and IRSND_Transmit_Pin in STM32Cube (Main.h). In this case, it is not necessary to change the constants in irmpconfig.h:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
/*---------------------------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
 * ARM STM32 with HAL section - don&#039;t change here, define IRSND_Transmit_GPIO_Port &amp;amp; IRSND_Transmit_Pin in STM32Cube (Main.h)&lt;br /&gt;
 *---------------------------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
 */&lt;br /&gt;
#elif defined (ARM_STM32_HAL)                                           // IRSND_Transmit_GPIO_Port &amp;amp; IRSND_Transmit_Pin must be defined in STM32Cube&lt;br /&gt;
#  define IRSND_PORT_LETTER                     IRSND_Transmit_GPIO_Port//Port of Transmit PWM Pin e.g.&lt;br /&gt;
#  define IRSND_BIT_NUMBER                      IRSND_Transmit_Pin      //Pim of Transmit PWM Pin e.g.&lt;br /&gt;
#  define IRSND_TIMER_HANDLER                   htim2                   //Handler of Timer e.g. htim (see tim.h)&lt;br /&gt;
#  define IRSND_TIMER_CHANNEL_NUMBER            TIM_CHANNEL_2           //Channel of the used Timer PWM Pin e.g. TIM_CHANNEL_2&lt;br /&gt;
#  define IRSND_TIMER_SPEED_APBX                64000000                //Speed of the corresponding APBx. (see STM32CubeMX: Clock Configuration)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And the corresponding section for STM8 MCUs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
/*----------------------------------------------------------------------------&lt;br /&gt;
 * Change hardware pin here for STM8&lt;br /&gt;
 *----------------------------------------------------------------------------&lt;br /&gt;
 */&lt;br /&gt;
#elif defined (SDCC_STM8)                       // use PA1 as IR input on STM8&lt;br /&gt;
#  define IRMP_PORT_LETTER                      A&lt;br /&gt;
#  define IRMP_BIT_NUMBER                       1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For PIC microcontrollers only the constant &#039;&#039;&#039;IRMP_PIN&#039;&#039;&#039; needs to be changed - depending on the compiler:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
/*----------------------------------------------------------------------------&lt;br /&gt;
 * Change hardware pin here for PIC C18 compiler&lt;br /&gt;
 *----------------------------------------------------------------------------&lt;br /&gt;
 */&lt;br /&gt;
#elif defined (PIC_C18)                         // use RB4 as IR input on PIC&lt;br /&gt;
#  define IRMP_PIN                              PORTBbits.RB4&lt;br /&gt;
&lt;br /&gt;
/*----------------------------------------------------------------------------&lt;br /&gt;
 * Change hardware pin here for PIC CCS compiler&lt;br /&gt;
 *----------------------------------------------------------------------------&lt;br /&gt;
 */&lt;br /&gt;
#elif defined (PIC_CCS)                         // use PB4 as IR input on PIC&lt;br /&gt;
#  define IRMP_PIN                              PIN_B4&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When using ChibiOS HAL, define a pin with the name &#039;&#039;&#039;IR_IN&#039;&#039;&#039; in your board config (board.chcfg) of ChibiOS and regenerate the board files. To use another name for the pin, edit the constant &#039;&#039;&#039;IRMP_PIN&#039;&#039;&#039; in irmpconfig.h. Use the name of the pin from the board config and prefix it with &amp;quot;LINE_&amp;quot;, as IRMP is using the &amp;quot;line&amp;quot; variant of the PAL interface:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
/*---------------------------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
 * Change hardware pin here for ChibiOS HAL&lt;br /&gt;
 *---------------------------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
 */&lt;br /&gt;
#elif defined(_CHIBIOS_HAL_)&lt;br /&gt;
#  define IRMP_PIN                              LINE_IR_IN              // use pin names as defined in the board config file, prefixed with &amp;quot;LINE_&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== IRMP_HIGH_ACTIVE ====&lt;br /&gt;
&lt;br /&gt;
Default value:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
#  define IRMP_HIGH_ACTIVE                      0                       // set to 1 if you use a RF receiver!&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Most RF receivers use active-high signals, so when using an RF receiver instead of an IR sensor, set this value to 1.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#FF0000&amp;quot;&amp;gt;&#039;&#039;&#039;NEU:&#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== IRMP_ENABLE_RELEASE_DETECTION ====&lt;br /&gt;
&lt;br /&gt;
Default value:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
#  define IRMP_ENABLE_RELEASE_DETECTION         0                       //  enable detection of key releases&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Set this value to 1 to enable detection of button release events. The function irmp_get_data() then sets the IRMP_FLAG_RELEASE bit in the struct member irmp_data.flags once code transmission ends. See the example in the section  &#039;&#039;&#039;[[IRMP_-_english#Debouncing|Debouncing]]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== IRMP_USE_CALLBACK ====&lt;br /&gt;
&lt;br /&gt;
Default value:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
#define IRMP_USE_CALLBACK                      0        // flag: 0 = don&#039;t use callbacks, 1 = use callbacks, default is 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When you turn on callbacks, any level change at the input causes the callback function to be called. This can be used to visualize incoming IR signals by driving another output pin.&lt;br /&gt;
&lt;br /&gt;
Here is an example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
#define LED_PORT PORTD                                  // LED at PD6&lt;br /&gt;
#define LED_DDR  DDRD&lt;br /&gt;
#define LED_PIN  6&lt;br /&gt;
&lt;br /&gt;
/*-----------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
 * Called (back) from IRMP module&lt;br /&gt;
 * This example switches a LED (which is connected to Vcc)&lt;br /&gt;
 *-----------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
 */&lt;br /&gt;
void&lt;br /&gt;
led_callback (uint_fast8_t on)&lt;br /&gt;
{&lt;br /&gt;
    if (on)&lt;br /&gt;
    {&lt;br /&gt;
       LED_PORT &amp;amp;= ~(1 &amp;lt;&amp;lt; LED_PIN);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
       LED_PORT |= (1 &amp;lt;&amp;lt; LED_PIN);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int&lt;br /&gt;
main ()&lt;br /&gt;
{&lt;br /&gt;
    ...&lt;br /&gt;
    irmp_init ();&lt;br /&gt;
&lt;br /&gt;
    LED_DDR |= (1 &amp;lt;&amp;lt; LED_PIN);         // LED pin to output&lt;br /&gt;
    LED_PORT |= (1 &amp;lt;&amp;lt; LED_PIN);        // switch LED off (active low)&lt;br /&gt;
    irmp_set_callback_ptr (led_callback);&lt;br /&gt;
&lt;br /&gt;
    sei ();&lt;br /&gt;
    ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== IRMP_USE_IDLE_CALL ====&lt;br /&gt;
&lt;br /&gt;
Normally the irmp_ISR() function is called continuously at the F_INTERRUPTS (10-20kHz) frequency. The microcontroller can rarely enter an energy-saving sleep mode, or must constantly wake up from it. If power consumption is important, e.g. on battery power, this approach is not optimal.&lt;br /&gt;
&lt;br /&gt;
If &#039;&#039;IRMP_USE_IDLE_CALL&#039;&#039;&#039; is enabled, IRMP detects if no IR transmission is ongoing and then calls the function &#039;&#039;&#039;irmp_idle()&#039;&#039;&#039;. This is microcontroller-specific and must be provided and linked by the user. The microcontroller can then be put to sleep while there is no ongoing transmission, thus reducing energy consumption.&lt;br /&gt;
&lt;br /&gt;
It is recommended to deactivate the timer interrupt in irmp_idle() and to activate a pin change interrupt instead. Then the microcontroller can be put to sleep. When a falling edge is detected on the IR input pin, the pin change interrupt is disabled, the timer is reenabled and irmp_ISR() is called immediately. You can find an example for the use of irmp_idle() in [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-chibios.c?view=markup irmp-main-chibios.c].&lt;br /&gt;
&lt;br /&gt;
Using IRMP purely with pin change interrupts and without timer interrupts is not supported.&lt;br /&gt;
&lt;br /&gt;
==== IRMP_USE_EVENT ====&lt;br /&gt;
&lt;br /&gt;
When using IRMP with ChibiOS/RT or ChibiOS/NIL, you can use their Event module to wake a thread as soon as new IR data is received and decoded.&lt;br /&gt;
&lt;br /&gt;
Set the &#039;&#039;&#039;IRMP_USE_EVENT&#039;&#039;&#039; constant in irmpconfig.h to 1 to enable this. &#039;&#039;&#039;IRMP_EVENT_BIT&#039;&#039;&#039; definies the value in the Event bitmask that should symbolize the IRMP event. Use &#039;&#039;&#039;IRMP_EVENT_THREAD_PTR&#039;&#039;&#039; to define the variable name of the thread pointer that the event is sent to.&lt;br /&gt;
&lt;br /&gt;
Change irmpconfig.h like this:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
/*------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
 * Use ChibiOS Events to signal that valid IR data was received&lt;br /&gt;
 *------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
 */&lt;br /&gt;
#if defined(_CHIBIOS_RT_) || defined(_CHIBIOS_NIL_)&lt;br /&gt;
&lt;br /&gt;
#  ifndef IRMP_USE_EVENT&lt;br /&gt;
#    define IRMP_USE_EVENT                      1                     // 1: use event. 0: do not. default is 0&lt;br /&gt;
#  endif&lt;br /&gt;
&lt;br /&gt;
#  if IRMP_USE_EVENT == 1 &amp;amp;&amp;amp; !defined(IRMP_EVENT_BIT)&lt;br /&gt;
#    define IRMP_EVENT_BIT                      1                     // event flag or bit to send&lt;br /&gt;
#  endif&lt;br /&gt;
#  if IRMP_USE_EVENT == 1 &amp;amp;&amp;amp; !defined(IRMP_EVENT_THREAD_PTR)&lt;br /&gt;
#    define IRMP_EVENT_THREAD_PTR               ir_receive_thread_p   // pointer to the thread to send the event to&lt;br /&gt;
extern thread_t *IRMP_EVENT_THREAD_PTR;                               // the pointer must be defined and initialized elsewhere&lt;br /&gt;
#  endif&lt;br /&gt;
&lt;br /&gt;
#endif // _CHIBIOS_RT_ || _CHIBIOS_NIL_&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now you can use the event in your ChibiOS project like this:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
thread_t *ir_receive_thread_p = NULL;&lt;br /&gt;
&lt;br /&gt;
static THD_FUNCTION(IRThread, arg)&lt;br /&gt;
{&lt;br /&gt;
    ir_receive_thread_p = chThdGetSelfX();&lt;br /&gt;
    [...]&lt;br /&gt;
    while (true)&lt;br /&gt;
    {&lt;br /&gt;
        // wait for event sent from irmp_ISR&lt;br /&gt;
        chEvtWaitAnyTimeout(ALL_EVENTS,TIME_INFINITE);&lt;br /&gt;
&lt;br /&gt;
        if (irmp_get_data (&amp;amp;irmp_data))&lt;br /&gt;
            // use data in irmp_data&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== IRMP_LOGGING ====&lt;br /&gt;
&lt;br /&gt;
With IRMP_LOGGING the logging of received IR frames can be turned on.&lt;br /&gt;
&lt;br /&gt;
Default value:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
#define IRMP_LOGGING                            0       // 1: log IR signal (scan), 0: do not. default is 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Further documentation can be found here: [[IRMP_-_english#Scanning_unknown_IR_Protocols|Scanning Unknown IR Protocols]].&lt;br /&gt;
&lt;br /&gt;
=== Using IRMP ===&lt;br /&gt;
&lt;br /&gt;
The protocols supported by [[IRMP_-_english#top|IRMP]] use partly variable, partly fixed bit lengths from 2 up to 48 bits. These are described by preprocessor defines.&lt;br /&gt;
&lt;br /&gt;
[[IRMP_-_english#top|IRMP]] separates these IR frames into 3 sections:&lt;br /&gt;
&lt;br /&gt;
 1. protocol ID&lt;br /&gt;
 2. address or vendor code&lt;br /&gt;
 3. command&lt;br /&gt;
&lt;br /&gt;
With the function&lt;br /&gt;
&lt;br /&gt;
   irmp_get_data (IRMP_DATA * irmp_data_p)&lt;br /&gt;
&lt;br /&gt;
you can recall a decoded message. The return value is 1 if a message has been received, otherwise it is 0. In the first case the struct members&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
    irmp_data_p-&amp;gt;protocol (8 Bit)&lt;br /&gt;
    irmp_data_p-&amp;gt;address (16 Bit)&lt;br /&gt;
    irmp_data_p-&amp;gt;command (16 Bit)&lt;br /&gt;
    irmp_data_p-&amp;gt;flags (8 Bit)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
contain valid information.&lt;br /&gt;
&lt;br /&gt;
That means that ultimately, you have three values (protocol, address and command) that can be evaluated with an if or switch statement. &lt;br /&gt;
Here is a sample decoder which listens for keys 1-9 on a remote:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&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 protocol&lt;br /&gt;
          irmp_data.address == 0x1234)                   // Address 0x1234&lt;br /&gt;
      {&lt;br /&gt;
         switch (irmp_data.command)&lt;br /&gt;
         {&lt;br /&gt;
            case 0x0001: key1_pressed(); break;          // Key 1&lt;br /&gt;
            case 0x0002: key2_pressed(); break;          // Key 2&lt;br /&gt;
            ...&lt;br /&gt;
            case 0x0009: key9_pressed(); break;          // Key 9&lt;br /&gt;
         }&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here are possible constants for irmp_data.protocol, see also [http://www.mikrocontroller.net/svnbrowser/irmp/irmpprotocols.h?view=markup irmpprotocols.h]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
#define IRMP_SIRCS_PROTOCOL                      1              // Sony&lt;br /&gt;
#define IRMP_NEC_PROTOCOL                        2              // NEC, Pioneer, JVC, Toshiba, generic, 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 Media Receiver&lt;br /&gt;
#define IRMP_IR60_PROTOCOL                      24              // IR60 (SDA2008)&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;
#define IRMP_BOSE_PROTOCOL                      31              // BOSE&lt;br /&gt;
#define IRMP_A1TVBOX_PROTOCOL                   32              // A1 TV Box&lt;br /&gt;
#define IRMP_ORTEK_PROTOCOL                     33              // ORTEK - Hama&lt;br /&gt;
#define IRMP_TELEFUNKEN_PROTOCOL                34              // Telefunken (1560)&lt;br /&gt;
#define IRMP_ROOMBA_PROTOCOL                    35              // iRobot Roomba vacuum cleaner&lt;br /&gt;
#define IRMP_RCMM32_PROTOCOL                    36              // Fujitsu-Siemens (Activy remote control)&lt;br /&gt;
#define IRMP_RCMM24_PROTOCOL                    37              // Fujitsu-Siemens (Activy keyboard)&lt;br /&gt;
#define IRMP_RCMM12_PROTOCOL                    38              // Fujitsu-Siemens (Activy keyboard)&lt;br /&gt;
#define IRMP_SPEAKER_PROTOCOL                   39              // Another loudspeaker protocol, similar to Nubert&lt;br /&gt;
#define IRMP_LGAIR_PROTOCOL                     40              // LG air conditioner&lt;br /&gt;
#define IRMP_SAMSUNG48_PROTOCOL                 41              // air conditioner with Samsung protocol (48 bits)&lt;br /&gt;
#define IRMP_MERLIN_PROTOCOL                    42              // Merlin (Pollin 620 185)&lt;br /&gt;
#define IRMP_PENTAX_PROTOCOL                    43              // Pentax camera&lt;br /&gt;
#define IRMP_FAN_PROTOCOL                       44              // FAN (ventilator), very similar to NUBERT, but last bit is data bit instead of stop bit&lt;br /&gt;
#define IRMP_S100_PROTOCOL                      45              // very similar to RC5, but 14 instead of 13 data bits&lt;br /&gt;
#define IRMP_ACP24_PROTOCOL                     46              // Stiebel Eltron ACP24 air conditioner&lt;br /&gt;
#define IRMP_TECHNICS_PROTOCOL                  47              // Technics, similar to Matsushita, but 22 instead of 24 bits&lt;br /&gt;
#define IRMP_PANASONIC_PROTOCOL                 48              // Panasonic (video projector), start bits similar to KASEIKYO&lt;br /&gt;
#define IRMP_MITSU_HEAVY_PROTOCOL               49              // Mitsubishi heavy air conditioner, similar timing to Panasonic video projector&lt;br /&gt;
#define IRMP_VINCENT_PROTOCOL                   50              // Vincent&lt;br /&gt;
#define IRMP_SAMSUNGAH_PROTOCOL                 51              // Samsung AH&lt;br /&gt;
#define IRMP_IRMP16_PROTOCOL                    52              // IRMP specific protocol for data transfer, e.g. between two microcontrollers via IR&lt;br /&gt;
#define IRMP_GREE_PROTOCOL                      53              // Gree climate&lt;br /&gt;
#define IRMP_RCII_PROTOCOL                      54              // RC II Infrared Remote Control Protocol for FM8&lt;br /&gt;
#define IRMP_METZ_PROTOCOL                      55              // METZ&lt;br /&gt;
#define IRMP_ONKYO_PROTOCOL                     56              // Onkyo&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The values of address and the command code of an unknown remote can be received and printed to UART or LCD. Then these values can be hard-coded in your decoder routine. Or you can write a learning routine, where you press keys to store the code into EEPROM. A sample for this can be found in [http://www.mikrocontroller.net/articles/DIY_Lernfähige_Fernbedienung_mit_IRMP Lernfähige IR-Fernbedienung mit IRMP].&lt;br /&gt;
&lt;br /&gt;
Another [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-avr.c?view=markup example main function] is included in the zip file, showing also the timer initialization.&lt;br /&gt;
&lt;br /&gt;
=== Debouncing ===&lt;br /&gt;
&lt;br /&gt;
To distinguish between a long key press or a single press, the IRMP_FLAG_REPETITION bit is provided. It is set in the struct member &#039;&#039;&#039;flags&#039;&#039;&#039; when a key on the remote is held, causing the same command to be repeated within a short period of time.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
    if (irmp_data.flags &amp;amp; IRMP_FLAG_REPETITION)&lt;br /&gt;
    {&lt;br /&gt;
      // long key press&lt;br /&gt;
      // either:&lt;br /&gt;
      //   ignore the (repeated) key&lt;br /&gt;
      // or:&lt;br /&gt;
      //   use this information for a repeat function&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
      // key was pressed again&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This can be used to debounce the keys 0-9 by ignoring commands with the IRMP_FLAG_REPETITION bit set. For keys like &#039;VOLUME+&#039; or &#039;VOLUME-&#039; using the repetition can be useful, for example to [[LED-Fading|fade a LED]].&lt;br /&gt;
&lt;br /&gt;
If you want to decode only single keys, you can reduce the block above to:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
    if (! (irmp_data.flags &amp;amp; IRMP_FLAG_REPETITION))&lt;br /&gt;
    {&lt;br /&gt;
      // New key&lt;br /&gt;
      // ACTION!&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#FF0000&amp;quot;&amp;gt;&#039;&#039;&#039;NEW:&#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From version 3.2.2, key releases can be detected. In this case, the IRMP_FLAG_RELEASE flag is set once the remote control has ceased sending IR or RF frames.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
    IRMP_DATA irmp_data;&lt;br /&gt;
&lt;br /&gt;
    while (1)&lt;br /&gt;
    {&lt;br /&gt;
        if (irmp_get_data (&amp;amp;irmp_data))&lt;br /&gt;
        {&lt;br /&gt;
            if (irmp_data.protocol == NEC_PROTOCOL &amp;amp;&amp;amp; irmp_data.address == 0x1234)&lt;br /&gt;
            {&lt;br /&gt;
                 if (irmp_data.command == 0x42 &amp;amp;&amp;amp; irmp_data.flags == 0x00) // First frame, flags not set&lt;br /&gt;
                 {&lt;br /&gt;
                     motor_on ();&lt;br /&gt;
                 }&lt;br /&gt;
                 else if (irmp_data.flags &amp;amp; IRMP_FLAG_RELEASE)             // Key is released&lt;br /&gt;
                 {&lt;br /&gt;
                     motor_off ();&lt;br /&gt;
                 }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the above example, a motor is turned on when a specific button on the remote control is pressed. The motor will not stop again until you release the button.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important when evaluating IRMP_FLAG_RELEASE:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
You must not rely on irmp_data.command to still contain the original command code (0x42 here). There are remote controls (e.g. RF remotes for remote controlled receptacles) which send a special key release code when the key is released. Simply check that the irmp_data.address matches before evaluating the flag.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;This feature must be enabled explicitly in irmpconfig.h by changing the configuration variable IRMP_ENABLE_RELEASE_DETECTION&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Principles of Operation ==&lt;br /&gt;
&lt;br /&gt;
The  &amp;quot;workhorse&amp;quot; of [[IRMP_-_english#top|IRMP]] is the interrupt service routine irmp_ISR() which should be called 15000 times per second. When using a different rate, the constant [[IRMP_-_english#F_INTERRUPTS|F_INTERRUPTS]] in [http://www.mikrocontroller.net/svnbrowser/irmp/irmpconfig.h?view=markup irmpconfig.h] needs to be modified accordingly.&lt;br /&gt;
&lt;br /&gt;
First, irmp_ISR() detects the length and the type of the start bit(s) and uses this to determine the protocol in use. As soon as the protocol is identified, subsequent bits are parametrized to read them efficiently until the IR transmission is complete.&lt;br /&gt;
&lt;br /&gt;
To cut off critics:&lt;br /&gt;
&lt;br /&gt;
I know that the ISR is quite large. But since it behaves like a state machine, the effective executed code per cycle is relatively small. As long as the input is &amp;quot;dark&amp;quot; (and that is the case most of the time ;-)) the spent time is vanishingly short. In the WordClock project for example, 8 ISRs are called with the same timer, of which irmp_ISR() just one of many. With a MCU clock of at least 8 MHz, no timing problems occured. Consequently, I see no problem with the length of the ISR.&lt;br /&gt;
&lt;br /&gt;
A crystal is not mandatory, it works well with the internal AVR oscillator. Remember to set the correct fuses for the CPU to run at 8 MHz, check [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-avr.c?view=markup irmp-main-avr.c] for correct values for an ATMEGA88.&lt;br /&gt;
&lt;br /&gt;
== Scanning Unknown IR Protocols ==&lt;br /&gt;
&lt;br /&gt;
To enable logging in [[IRMP_-_english#top|IRMP]], modify the value of [[IRMP_-_english#IRMP_LOGGING|IRMP_LOGGING]] to 1 of [http://www.mikrocontroller.net/svnbrowser/irmp/irmpconfig.h?view=markup irmpconfig.h] on the line&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
    #define IRMP_LOGGING    0   // 1: log IR signal (scan), 0: do not (default)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When logging is enabled, the bright and dark phases are sent via UART at 9600 bits/s: 1=dark, 0=bright. The constants in the functions uart_init() and uart_putc() may need to be modified,  depending on the AVR MCU used.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note: for PIC microcontrollers there is a dedicated logging module named [http://www.mikrocontroller.net/svnbrowser/irmp/irmpextlog.c?view=markup irmpextlog.c]. This makes it possible to log via USB. This does not apply to the AVR version&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
By capturing these protocol scans with a terminal program and saving them to a text file, you can use these files to analyze the frames in order to add new protocols to [[IRMP_-_english#top|IRMP]] - see next chapter.&lt;br /&gt;
&lt;br /&gt;
If you have a remote control that is not supported by [[IRMP_-_english#top|IRMP]], you can send me ([http://www.mikrocontroller.net/user/show/ukw ukw]) the scan files. Then I can check if the protocol is compatible with the IRMP model and modify the source code if applicable.&lt;br /&gt;
&lt;br /&gt;
== IRMP under Linux and Windows ==&lt;br /&gt;
&lt;br /&gt;
=== Compilation ===&lt;br /&gt;
&lt;br /&gt;
[http://www.mikrocontroller.net/svnbrowser/irmp/irmp.c?view=markup irmp.c] can be compiled under Linux for testing IR scans in textfiles. In the subdirectory &#039;IR-Data&#039; you will find such files that you can use as input files for [[IRMP_-_english#top|IRMP]].&lt;br /&gt;
&lt;br /&gt;
To compile [[IRMP_-_english#top|IRMP]], enter:&lt;br /&gt;
&lt;br /&gt;
    make -f makefile.lnx&lt;br /&gt;
&lt;br /&gt;
This will generate 3 IRMP versions:&lt;br /&gt;
&lt;br /&gt;
* irmp-10kHz: Version for 10kHz scans&lt;br /&gt;
* irmp-15kHz: Version for 15kHz scans&lt;br /&gt;
* irmp-20kHz: Version for 20kHz scans&lt;br /&gt;
&lt;br /&gt;
=== Starting IRMP ===&lt;br /&gt;
&lt;br /&gt;
The calling syntax is:&lt;br /&gt;
&lt;br /&gt;
  ./irmp-nnkHz [-l|-p|-a|-v] &amp;lt; scan-file&lt;br /&gt;
&lt;br /&gt;
Options are mutually exclusive, so only one option per call is valid:&lt;br /&gt;
&lt;br /&gt;
Option:&lt;br /&gt;
&lt;br /&gt;
   -l  List             print a list with pulses and pauses&lt;br /&gt;
   -a analyze           analyse the pulses/pauses and write a &amp;quot;spectrum&amp;quot; in ASCII format&lt;br /&gt;
   -v verbose           verbose output&lt;br /&gt;
   -p  Print Timings    print a timing table for all protocols&lt;br /&gt;
&lt;br /&gt;
Samples:&lt;br /&gt;
&lt;br /&gt;
=== Normal Output ===&lt;br /&gt;
&lt;br /&gt;
   ./irmp-10kHz &amp;lt; IR-Data/orion_vcr_07660BM070.txt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Output Lists ===&lt;br /&gt;
&lt;br /&gt;
   ./irmp-10kHz -l &amp;lt; IR-Data/orion_vcr_07660BM070.txt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Analysis ===&lt;br /&gt;
&lt;br /&gt;
   ./irmp-10kHz -a &amp;lt; IR-Data/orion_vcr_07660BM070.txt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here you see the measured times of all pulses and pauses (spaces) as horizontal bar graphs, whose distributions are not ideal bell curves due to the ASCII formatting. The narrower the measured peaks, the better the timing of the remote.&lt;br /&gt;
&lt;br /&gt;
The above output can be read as:&lt;br /&gt;
&lt;br /&gt;
* the start bit has a pulse length between 9000 and 9200 µs, on average 9102 µs. The deviation from this average is about 1.1%&lt;br /&gt;
&lt;br /&gt;
* the start bit has a space length between 4300 and 4500 µs, the average is 4424 µs. The error is about 2.8%.&lt;br /&gt;
&lt;br /&gt;
* the pulse length of a data bit is between 500 and 700 µs, on average 650 µs, the error is (quite large!) 23.1%&lt;br /&gt;
&lt;br /&gt;
Further there are two more spaces of different lengths (for bits 0 and 1). Reading these is left as an exercise to the reader. ;-)&lt;br /&gt;
&lt;br /&gt;
=== Verbose Output ===&lt;br /&gt;
&lt;br /&gt;
    ./irmp-10kHz -v &amp;lt; IR-Data/orion_vcr_07660BM070.txt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
# 1 - IR-cmd: 0x0001&lt;br /&gt;
   0.200ms [starting pulse]&lt;br /&gt;
  13.700ms [start-bit: pulse = 91, pause = 44]&lt;br /&gt;
protocol = NEC, start bit timings: pulse:  62 - 118, pause:  30 -  60&lt;br /&gt;
pulse_1:   3 -   8&lt;br /&gt;
pause_1:  11 -  23&lt;br /&gt;
pulse_0:   3 -   8&lt;br /&gt;
pause_0:   3 -   8&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;
  14.800ms [bit  0: pulse =   6, pause =   5] 0&lt;br /&gt;
  16.000ms [bit  1: pulse =   6, pause =   6] 0&lt;br /&gt;
  17.100ms [bit  2: pulse =   6, pause =   5] 0&lt;br /&gt;
  18.200ms [bit  3: pulse =   6, pause =   5] 0&lt;br /&gt;
  19.300ms [bit  4: pulse =   6, pause =   5] 0&lt;br /&gt;
  20.500ms [bit  5: pulse =   6, pause =   6] 0&lt;br /&gt;
  21.600ms [bit  6: pulse =   6, pause =   5] 0&lt;br /&gt;
  23.800ms [bit  7: pulse =   6, pause =  16] 1&lt;br /&gt;
  26.100ms [bit  8: pulse =   6, pause =  17] 1&lt;br /&gt;
  28.300ms [bit  9: pulse =   6, pause =  16] 1&lt;br /&gt;
  29.500ms [bit 10: pulse =   6, pause =   6] 0&lt;br /&gt;
  31.700ms [bit 11: pulse =   6, pause =  16] 1&lt;br /&gt;
  34.000ms [bit 12: pulse =   6, pause =  17] 1&lt;br /&gt;
  36.200ms [bit 13: pulse =   6, pause =  16] 1&lt;br /&gt;
  38.500ms [bit 14: pulse =   6, pause =  17] 1&lt;br /&gt;
  39.600ms [bit 15: pulse =   6, pause =   5] 0&lt;br /&gt;
  41.900ms [bit 16: pulse =   6, pause =  17] 1&lt;br /&gt;
  43.000ms [bit 17: pulse =   6, pause =   5] 0&lt;br /&gt;
  44.100ms [bit 18: pulse =   6, pause =   5] 0&lt;br /&gt;
  45.200ms [bit 19: pulse =   6, pause =   5] 0&lt;br /&gt;
  46.400ms [bit 20: pulse =   7, pause =   5] 0&lt;br /&gt;
  47.500ms [bit 21: pulse =   6, pause =   5] 0&lt;br /&gt;
  48.600ms [bit 22: pulse =   6, pause =   5] 0&lt;br /&gt;
  49.800ms [bit 23: pulse =   6, pause =   6] 0&lt;br /&gt;
  50.900ms [bit 24: pulse =   5, pause =   6] 0&lt;br /&gt;
  53.100ms [bit 25: pulse =   6, pause =  16] 1&lt;br /&gt;
  55.400ms [bit 26: pulse =   6, pause =  17] 1&lt;br /&gt;
  57.600ms [bit 27: pulse =   6, pause =  16] 1&lt;br /&gt;
  59.900ms [bit 28: pulse =   6, pause =  17] 1&lt;br /&gt;
  62.100ms [bit 29: pulse =   6, pause =  16] 1&lt;br /&gt;
  64.400ms [bit 30: pulse =   6, pause =  17] 1&lt;br /&gt;
  66.700ms [bit 31: pulse =   6, pause =  17] 1&lt;br /&gt;
stop bit detected&lt;br /&gt;
  67.300ms code detected, length = 32&lt;br /&gt;
  67.300ms p =  2, a = 0x7b80, c = 0x0001, f = 0x00&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Starting under Windows ===&lt;br /&gt;
&lt;br /&gt;
[[IRMP_-_english#top|IRMP]] can be used under Windows as well:&lt;br /&gt;
&lt;br /&gt;
* start command line console&lt;br /&gt;
* change to directory &#039;irmp&#039;&lt;br /&gt;
* enter:&lt;br /&gt;
            irmp-10kHz.exe &amp;lt; IR-Data\rc5x.txt&lt;br /&gt;
&lt;br /&gt;
The same options apply as for the Linux version.&lt;br /&gt;
&lt;br /&gt;
=== Long Output ===&lt;br /&gt;
&lt;br /&gt;
As some output is very long, it is recommended to redirect the output to a file or filter for paging:&lt;br /&gt;
&lt;br /&gt;
Linux:&lt;br /&gt;
&lt;br /&gt;
            ./irmp-10kHz &amp;lt; IR-Data/rc5x.txt | less&lt;br /&gt;
&lt;br /&gt;
Windows:&lt;br /&gt;
&lt;br /&gt;
            irmp-10kHz.exe &amp;lt; IR-Data\rc5x.txt | more&lt;br /&gt;
&lt;br /&gt;
== Remote Controls ==&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! Protocol || Name || Device || Device Address&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#NEC_+_extended_NEC|NEC]] || Toshiba CT-9859 || TV || 0x5F40&lt;br /&gt;
|-&lt;br /&gt;
VCR|-&lt;br /&gt;
| || Elta 8848 MP 4 || DVD player || 0x7F00&lt;br /&gt;
|-&lt;br /&gt;
| || AS-218 || Askey TV-View CHP03X (TV tuner card) || 0x3B86&lt;br /&gt;
|-&lt;br /&gt;
| || Cyberhome ??? || Cyberhome DVD player || 0x6D72&lt;br /&gt;
|-&lt;br /&gt;
| || WD TV Live || Western Digital Multimediaplayer || 0x1F30&lt;br /&gt;
|-&lt;br /&gt;
| || Canon WL-DC100 || Kamera Canon PowerShot G5 || 0xB1CA&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#NEC16|NEC16]] || Daewoo || VCR || 0x0015&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#KASEIKYO|KASEIKYO]] || Technics EUR646497 || SA-AX 730 AV receiver || 0x2002&lt;br /&gt;
|-&lt;br /&gt;
| || Panasonic TV || TX-L32EW6 TV || 0x2002&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#RC5_+_RC5X|RC5]] || Loewe Assist/RC3/RC4 || TV (remote control in TV mode) || 0x0000&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#RC6_+_RC6A|RC6]] || Philips TV || TV (remote control in TV mode) || 0x0000&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#SIRCS|SIRCS]] || Sony RM-816 || TV (remote control in TV mode) || 0x0000&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#DENON|DENON]] || DENON RC970 || AVR3805 AV receiver || 0x0008&lt;br /&gt;
|-&lt;br /&gt;
| || DENON RC970 || DVD/CD player || 0x0002&lt;br /&gt;
|-&lt;br /&gt;
| || DENON RC970 || Tuner || 0x0006&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#SAMSUNG32|SAMSUNG32]] || Samsung AA59-00484A || LE40D550 TV || 0x0707&lt;br /&gt;
|-&lt;br /&gt;
| || LG AKB72033901 || BD370 Blu-Ray player  || 0x2D2D&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#APPLE|APPLE]] || Apple || Apple iPod Dock || 0x0020&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Cameras ==&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width: 80%;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 20%;&amp;quot; |&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
[[IRMP_-_english#top|IRMP]] supports more and more camera remotes like:&lt;br /&gt;
&lt;br /&gt;
* [[IRMP_-_english#PENTAX|PENTAX]]&lt;br /&gt;
* [[IRMP_-_english#Nikon|Nikon]]&lt;br /&gt;
&lt;br /&gt;
The array of commands is quite limited. Cameras understand only the shutter release command.&lt;br /&gt;
||&lt;br /&gt;
[[Datei:Irmp-pentax.png|miniatur|PENTAX protocol]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Here is a short table for [[IRMP_-_english#PENTAX|PENTAX]] cameras:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! Command || Function&lt;br /&gt;
|-&lt;br /&gt;
| 0x0000 || Shutter release&lt;br /&gt;
|-&lt;br /&gt;
| 0x0001 || change zoom level&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Because there is no address designated in the [[IRMP_-_english#PENTAX|PENTAX]] protocol, for transmitting, it should be set to 0x0000 in [[IRSND_-_english|IRSND]]. &lt;br /&gt;
&lt;br /&gt;
For Nikon cameras, a crystal should be used because these cameras are quite sensitive to timing accuracy.&lt;br /&gt;
&lt;br /&gt;
== IR Keyboards ==&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width: 80%;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 20%;&amp;quot; |&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
From version 1.7.0 on, [[IRMP_-_english#top|IRMP]] also supports IR keyboards, namely the FDC-3402 &amp;lt;s&amp;gt; from www.pollin.de (partno. 711 056) for less than 2 Euro.&amp;lt;/s&amp;gt; (not available as of 19.09.2017 )&lt;br /&gt;
&lt;br /&gt;
On detection of a key press the following data is returned:&lt;br /&gt;
&lt;br /&gt;
 Protocol number  (irmp_data.protocol): 18&lt;br /&gt;
 Address          (irmp_data.address) : 0x003F&lt;br /&gt;
||&lt;br /&gt;
[[Datei:irmp-fdc3402.jpg|miniatur|FDC-3402 keyboard]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The following values are returned as commands (irmp_data.command) :&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size:50%; text-align:center;&amp;quot;&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! Code || Key   || Code || Key   || Code || Key   || Code || Key   || Code || Key   || Code || Key   || Code || Key   || Code || Key   &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;
Special keys on the left:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! Code || Key   &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;
The above values are for pressing a key. On release, [[IRMP_-_english#top|IRMP]] sets also bit 8 (0x80) in the command.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
      Key &#039;a&#039; pressed:   0x001F&lt;br /&gt;
      Key &#039;a&#039; released:  0x009F&lt;br /&gt;
&lt;br /&gt;
The ON/OFF key is an exception: This key only sends a code for a key press, not for the release.&lt;br /&gt;
&lt;br /&gt;
If a key is held, this is indicated in irmp_data.flag.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
                           command   flag&lt;br /&gt;
      Key &#039;a&#039; pressed:   0x001F    0x00&lt;br /&gt;
      Key &#039;a&#039; pressed:   0x001F    0x01&lt;br /&gt;
      Key &#039;a&#039; pressed:   0x001F    0x01&lt;br /&gt;
      Key &#039;a&#039; pressed:   0x001F    0x01&lt;br /&gt;
      ....&lt;br /&gt;
      Key &#039;a&#039; released:  0x009F    0x00&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
When key combinations (like a capital &#039;A&#039;) are pressed, then the return values are a sequence like this:&lt;br /&gt;
&lt;br /&gt;
      Left SHIFT-key pressed:    0x0002&lt;br /&gt;
      Key &#039;a&#039; pressed:           0x001F&lt;br /&gt;
      Key &#039;a&#039; released:          0x009F&lt;br /&gt;
      Left SHIFT-key released:   0x0082&lt;br /&gt;
&lt;br /&gt;
In [http://www.mikrocontroller.net/svnbrowser/irmp/irmp.c?view=markup irmp.c] you will find a function get_fdc_key() for the Linux version, which can be used as a template to convert the FDC keycodes into the corresponding ASCII codes. This function can be used either locally on the MCU to decode the keycodes, or on the host system (e.g. PC) where the IRMP data structure is sent to. Therefore the function including preprocessor constants should be copied to your application code.&lt;br /&gt;
&lt;br /&gt;
Here is an excerpt:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&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;,  0xDF, &#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;,  0xFC, &#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;, 0xF6, 0xE4, &#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;,  0xDC, &#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;, 0xD6, 0xC4, &#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 = 0xB2;    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 = 0xB5;    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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As a final example, use of the get_fdc_key() function:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Non-printable characters are coded as follows:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! Key               || Constant                || Value&lt;br /&gt;
|-&lt;br /&gt;
| ESC               || KEY_ESCAPE              || 0x1B&lt;br /&gt;
|-&lt;br /&gt;
| Menu              || KEY_MENUE               || 0x80&lt;br /&gt;
|-&lt;br /&gt;
| Back              || KEY_BACK                || 0x81&lt;br /&gt;
|-&lt;br /&gt;
| Forward           || KEY_FORWARD             || 0x82&lt;br /&gt;
|-&lt;br /&gt;
| Adress            || KEY_ADDRESS             || 0x83&lt;br /&gt;
|-&lt;br /&gt;
| Window            || KEY_WINDOW              || 0x84&lt;br /&gt;
|-&lt;br /&gt;
| 1. Page           || 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;
| New Page          || KEY_NEW_PAGE            || 0x89&lt;br /&gt;
|-&lt;br /&gt;
| Setup             || KEY_SETUP               || 0x8A&lt;br /&gt;
|-&lt;br /&gt;
| Font              || KEY_FONT                || 0x8B&lt;br /&gt;
|-&lt;br /&gt;
| Print             || KEY_PRINT               || 0x8C&lt;br /&gt;
|-&lt;br /&gt;
| On/Off            || 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;
| Insert            || KEY_INSERT              || 0x90&lt;br /&gt;
|-&lt;br /&gt;
| Delete            || KEY_DELETE              || 0x91&lt;br /&gt;
|-&lt;br /&gt;
| Cursor left       || KEY_LEFT                || 0x92&lt;br /&gt;
|-&lt;br /&gt;
| Pos1              || KEY_HOME                || 0x93&lt;br /&gt;
|-&lt;br /&gt;
| End               || KEY_END                 || 0x94&lt;br /&gt;
|-&lt;br /&gt;
| Cursor right      || KEY_UP                  || 0x95&lt;br /&gt;
|-&lt;br /&gt;
| Cursor down       || KEY_DOWN                || 0x96&lt;br /&gt;
|-&lt;br /&gt;
| Page up           || KEY_PAGE_UP             || 0x97&lt;br /&gt;
|-&lt;br /&gt;
| Page down         || KEY_PAGE_DOWN           || 0x98&lt;br /&gt;
|-&lt;br /&gt;
| Cursor left       || KEY_RIGHT               || 0x99&lt;br /&gt;
|-&lt;br /&gt;
| Left Mousebutton  || KEY_MOUSE_1             || 0x9E&lt;br /&gt;
|-&lt;br /&gt;
| Right Mousebutton || KEY_MOUSE_2             || 0x9F&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The get_fdc_key() function considers the state of the Shift, Ctrl, and Alt keys. As a result, not only capital letters can be entered, but also special characters with Alt + key combinations, e.g. Alt + m -&amp;gt; µ or Alt + q -&amp;gt; @. You can also send Ctrl + A to Ctrl + Z by using the Ctrl key. The Caps Lock key is ignored, as I regard this key as the most unnecessary key at all ;-)&lt;br /&gt;
&lt;br /&gt;
= Appendix =&lt;br /&gt;
&lt;br /&gt;
== IR Protocols in Detail ==&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width: 80%;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 20%;&amp;quot; |&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
=== Pulse Distance Protocols ===&lt;br /&gt;
||&lt;br /&gt;
[[Datei:Pulse-Distance.png|miniatur|Pulse Distance Coding]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== NEC + extended NEC ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#NEC Protocol|NEC + extended NEC]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 36 kHz / 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 32 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data NEC || 8 address bits + 8 inverted address bits + 8 command bits + 8 inverted command bits&lt;br /&gt;
|-&lt;br /&gt;
| Data ext. NEC || 16 address bits + 8 command bits + 8 inverted command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 9000µs pulse, 4500µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 560µs pulse,  560µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 560µs pulse, 1690µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 560µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || 9000µs pulse, 2250µs pause, 560µs pulse, ~100ms pause&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== JVC ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#NEC16 Protocol (JVC)|JVC]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 16 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 4 address bits + 12 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 9000µs pulse, 4500µs pause, 6000µs pause if key repeat&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 560µs pulse,  560µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 560µs pulse, 1690µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 560µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after pause of 25ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== NEC16 ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;NEC16&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 8 address bits + 1 sync bit + 8 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 9000µs pulse, 4500µs pause&lt;br /&gt;
|-&lt;br /&gt;
| sync bit || 560µs pulse, 4500µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 560µs pulse,  560µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 560µs pulse, 1690µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 560µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after pause of 25ms?&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== NEC42 ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;NEC42&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 42 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 13 address bits + 13 inverted address bits + 8 command bits + 8 inverted command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 9000µs pulse, 4500µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 560µs pulse,  560µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 560µs pulse, 1690µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 560µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after 110ms (beginning from start bit), 9000µs pulse, 2250µs pause, 560µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== ACP24 ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#ACP24 Protocol|ACP24]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 70 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 0 address bits + 70 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 390µs pulse, 950µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 390µs pulse,  950µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 390µs pulse, 13000µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 390µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || unknown&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== LGAIR ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#LGAIR Protocol|LGAIR]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 28 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 8 address bits + 16 command bits + 4 checksum bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 9000µs pulse, 4500µs pause (identical to [[IRMP_-_english#NEC_.2B_extended_NEC|NEC]])&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 560µs pulse,  560µs pause (identical to [[IRMP_-_english#NEC_.2B_extended_NEC|NEC]])&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 560µs pulse, 1690µs pause (identical to [[IRMP_-_english#NEC_.2B_extended_NEC|NEC]])&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 560µs pulse (identical to [[IRMP_-_english#NEC_.2B_extended_NEC|NEC]])&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || unknown&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first (&#039;&#039;&#039;differs&#039;&#039;&#039; from [[IRMP_-_english#NEC_.2B_extended_NEC|NEC]])&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SAMSUNG ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#SAMSUNG Protocol|SAMSUNG]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || ?? kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 16 data(1) bits + 1 sync bit + 20 data(2)-bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data(1) || 16 address bits&lt;br /&gt;
|-&lt;br /&gt;
| Data(2) || 4 ID bits + 8 command bits + 8 inverted command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 4500µs pulse, 4500µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 550µs pulse, 550µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 550µs pulse, 1650µs pause&lt;br /&gt;
|-&lt;br /&gt;
| sync bit || 550µs pulse, 4500µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 550µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after approx. 100ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SAMSUNG32 ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;SAMSUNG32&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 32 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 16 address bits + 16 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 4500µs pulse, 4500µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 550µs pulse,  550µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 550µs pulse, 1650µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 550µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after approx. 47msec&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SAMSUNG48 ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;SAMSUNG48&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 48 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 16 address bits + 32 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Command || 8 bits + 8 inverted bits + 8 bits + 8 inverted bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 4500µs pulse, 4500µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 550µs pulse,  550µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 550µs pulse, 1650µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 550µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || one after approx. 5 msec&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after approx. 45 msec&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== MATSUSHITA ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#MATSUHITA Protocol|MATSUSHITA]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 36 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance, timing identical to [[IRMP_-_english#TECHNICS|TECHNICS]]&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 24 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 6 customer bits + 6 command bits + 12 address bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 3488µs pulse, 3488µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 872µs pulse,  872µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 872µs pulse, 2616µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 872µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after 40ms pause&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first?&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== TECHNICS ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;TECHNICS&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 36 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance, timing identical to [[IRMP_-_english#MATSUSHITA|MATSUSHITA]]&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 22 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 11 command bits + 11 inverted command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 3488µs pulse, 3488µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 872µs pulse,  872µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 872µs pulse, 2616µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 872µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after 40ms pause&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first?&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== KASEIKYO ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#KASEIKYO_Protocol_.28.22Japan Protocol.22.29|KASEIKYO]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 48 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 16 customer bits + 4 parity bits + 4 genre1 bits + 4 genre2 bits + 10 command bits + 2 ID bits + 8 parity bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 3380µs pulse, 1690µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 423µs pulse,  423µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 423µs pulse, 1269µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 423µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after approx. 80ms pause&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first?&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== RECS80 ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#RECS80 and RECS80 Extended Protocol|RECS80]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bits + 10 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 1 toggle bit + 3 address bits + 6 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 158µs pulse, 7432µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 158µs pulse, 4902µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 158µs pulse, 7432µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 158µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after approx. 100ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== RECS80EXT ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#RECS80 and RECS80 Extended Protocol|RECS80EXT]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 2 start bits + 11 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 1 toggle bit + 4 address bits + 6 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 158µs pulse, 3637µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 158µs pulse, 4902µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 158µs pulse, 7432µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 158µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after approx. 100ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== DENON ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#Denon Protocol|DENON]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz (in practice, theoretically: 32 kHz)&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 0 start bits + 15 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 5 address bits + 10 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Command || 6 data bits + 2 extension bits + 2 data construction bits (normal: 00, inverted: 11)&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || none&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 310µs pulse, 745µs pause (in practice, theoretically: 275µs pulse, 775µs pause)&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 310µs pulse, 1780µs pause (in practice, theoretically: 275µs pulse, 1900µs pause)&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 310µs pulse (310µs pulse, 745µs pause (in practice, theoretically: 275µs pulse)&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || after 65ms with inverted command bits (data construction bits = 11)&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || both frames after 65ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== APPLE ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;APPLE&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 32 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 16 address bits + 11100000 + 8 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || see [[IRMP_-_english#NEC_+_extended_NEC|NEC]]&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || see [[IRMP_-_english#NEC_+_extended_NEC|NEC]]&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || see [[IRMP_-_english#NEC_+_extended_NEC|NEC]]&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || see [[IRMP_-_english#NEC_+_extended_NEC|NEC]]&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after approx. 100ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== BOSE ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;BOSE&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 16 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 0 address bits + 8 command bits + 8 inverted command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 1060µs pulse, 1425µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 550µs pulse,  437µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 550µs pulse, 1425µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 550µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || unknown&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== B&amp;amp;O ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#Bang &amp;amp; Olufsen|B&amp;amp;O]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 455 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 4 start bits + 16 data bits + 1 trailer bit + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 0 address bits + 16 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit 1 || 200µs pulse, 2925µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Start bit 2 || 200µs pulse, 2925µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Start bit 3 || 200µs pulse, 15425µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Start bit 4 || 200µs pulse, 2925µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 200µs pulse, 2925µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 200µs pulse, 9175µs pause&lt;br /&gt;
|-&lt;br /&gt;
| R bit || 200µs pulse, 6050µs pause, repeats the last bit&lt;br /&gt;
|-&lt;br /&gt;
| Trailer bit || 200µs pulse, 12300µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 200µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after approx. 100ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== FDC ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;FDC&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 40 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 8 address bits + 12 x 0 bits + 4 press/release bits + 8 command bits + 8 inverted command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 2085µs pulse, 966µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 300µs pulse,  220µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 300µs pulse, 715µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 300µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Press Key || press/release bits = 0000&lt;br /&gt;
|-&lt;br /&gt;
| Release Key || press/release bits = 1111&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after pause of approx. 60ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Nikon ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;Nikon&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 2 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 2 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 2200µs pulse, 27100µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 500µs pulse,  1500µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 500µs pulse, 3500µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 500µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || unknown&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== PANASONIC ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;PANASONIC&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 56 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 24 bits (010000000000010000000001) + 16 address bits + 16 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 3600µs pulse, 1600µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 565µs pulse,  316µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 565µs pulse, 1140µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 565µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || unknown&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first?&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== PENTAX ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;PENTAX&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 6 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 6 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 2200µs pulse, 27100µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 1000µs pulse,  1000µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 1000µs pulse, 3000µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 1000µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || unknown&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== KATHREIN ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;KATHREIN&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 11 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 4 address bits + 7 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 210µs pulse, 6218µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 210µs pulse,  1400µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 210µs pulse, 3000µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 210µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after 35ms?&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== LEGO ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#LEGO Power Functions RC|LEGO]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 16 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 12 command bits + 4 crc bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 158µs pulse, 1026µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 158µs pulse,  263µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 158µs pulse, 553µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 158µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || unknown&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== VINCENT ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#VINCENT|VINCENT]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 32 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 16 address bits + 8 command bits + 8 repeated command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 2500µs pulse, 4600µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 550µs pulse,  550µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 550µs pulse, 1540µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 550µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || unknown&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first?&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== THOMSON ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;THOMSON&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 33 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 0 start bits + 12 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 4 address bits + 1 toggle bit + 7 command bits&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 550µs pulse,  2000µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 550µs pulse, 4500µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 550µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after 35ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first?&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== TELEFUNKEN ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;TELEFUNKEN&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 15 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 0 address bits + 15 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 600µs pulse, 1500µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 600µs pulse, 600µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 600µs pulse, 1500µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 600µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || unknown&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first?&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== RCCAR ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;RCCAR&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 13 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 13 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 2000µs pulse, 2000µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 600µs pulse,  900µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 600µs pulse, 450µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 600µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after 40ms?&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== RCMM ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#RCMM_Protocol|RCMM]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 36 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame RCMM32 || 1 start bit + 32 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Frame RCMM24 || 1 start bit + 24 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Frame RCMM12 || 1 start bit + 12 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data RCMM32 || 16 address bits (= 4 mode bits + 12 device bits) + 1 toggle bit + 15 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Data RCMM24 || 16 address bits (= 4 mode bits + 12 device bits) + 1 toggle bit + 7 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Data RCMM12 || 4 address bits (= 2 mode bits + 2 device bits) + 8 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 500µs pulse, 220µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 00 bits || 230µs pulse, 220µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 01 bits || 230µs pulse, 380µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 10 bits || 230µs pulse, 550µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 11 bits || 230µs pulse, 720µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 230µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after 80ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width: 80%;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 20%;&amp;quot; |&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
=== Pulse Width Protocols ===&lt;br /&gt;
||&lt;br /&gt;
[[Datei:Pulse-Width.png|miniatur|Pulse Width Coding]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SIRCS ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#SIRCS_Protocol|SIRCS]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|Frequency ||40 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse width&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 12-20 data bits, no stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 7 command bits + 5 address bits + up to 8 additional bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 2400µs pulse, 600µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 600µs pulse, 600µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 1200µs pulse, 600µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || twice after approx. 25ms, that means: 2nd and 3rd frame&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || starting with 4th identical frame, distance approx. 25ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width: 80%;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 20%;&amp;quot; |&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
=== Pulse distance Width Protocols ===&lt;br /&gt;
||&lt;br /&gt;
[[Datei:Pulse-Distance-Width.png|miniatur|Pulse Distance Width Coding]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== NUBERT ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;NUBERT&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 36 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance width&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 10 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 0 address bits + 10 command bits ?&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 1340µs pulse, 340µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 500µs pulse, 1300µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 1340µs pulse, 340µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 500µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || once after 35ms&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || 3rd, 5th, 7th etc. indentical frame&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first?&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== FAN ====&lt;br /&gt;
&lt;br /&gt;
This protocol is very similar to [[IRMP_-_english#NUBERT|NUBERT]], but here it will be sent only one frame. Additionally there are 11 instead of 10 data bits and no stop bit. The pause time between frame repetitions is substantial lower.&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;FAN &#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 36 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance width&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 11 data bits + 0 stop bits&lt;br /&gt;
|-&lt;br /&gt;
| Data || 0 address bits + 11 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 1280µs pulse, 380µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 380µs pulse, 1280µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 1280µs pulse, 380µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 500µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after 6.6ms pause&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SPEAKER ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;SPEAKER&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance width&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 10 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 0 address bits + 10 command bits ?&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 440µs pulse, 1250µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 440µs pulse, 1250µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 1250µs pulse, 440µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 440µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || once after approx. 38ms&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || 3rd, 5th, 7th ... identical frame&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first?&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== ROOMBA ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;ROOMBA&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance width&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 7 data bits + 0 stop bits&lt;br /&gt;
|-&lt;br /&gt;
| Data || 0 address bits + 7 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 2790µs pulse, 930µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 930µs pulse, 2790µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 2790µs pulse, 930µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || no stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || 3 times after 18ms?&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || unknown&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width: 80%;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 20%;&amp;quot; |&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
=== Biphase Protocols ===&lt;br /&gt;
||&lt;br /&gt;
[[Datei:Biphase-Coding.png|miniatur|Biphase Coding]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== RC5 + RC5X ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#RC5 and RC5x Protocol|RC5 + RC5X]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 36 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || Biphase (Manchester)&lt;br /&gt;
|-&lt;br /&gt;
| Frame RC5 || 2 start bits + 12 data bits + 0 stop bits&lt;br /&gt;
|-&lt;br /&gt;
| Data RC5 || 1 toggle bit + 5 address bits + 6 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Frame RC5X || 1 start bit + 13 data bits + 0 stop bits&lt;br /&gt;
|-&lt;br /&gt;
| Data RC5X || 1 inverteds command bit + 1 toggle bit + 5 address bits + 6 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 889µs pause, 889µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 889µs pulse, 889µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 889µs pause, 889µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || no stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after approx. 100ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== RCII ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;RCII&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 31.25 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || Biphase (Manchester)&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 pre bit + 1 start bit + 9 data bits + 0 stop bits&lt;br /&gt;
|-&lt;br /&gt;
| Data || 0 address bits + 9 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Pre Bit || 512µs pulse, 2560µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 1024µs pulse, &#039;&#039;&#039;no space&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 512µs pause, 512µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 512µs pulse, 512µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || no stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after approx. 118ms&lt;br /&gt;
|-&lt;br /&gt;
| Remarks || An end command (111111111 = 0x1FF) is sent immediately after the button is released.&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== S100 ====&lt;br /&gt;
&lt;br /&gt;
Similar to RC5x, but 14 instead of 13 data bits and 56kHz modulation&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;S100&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 56 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || Biphase (Manchester)&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 14 data bits + 0 stop bits&lt;br /&gt;
|-&lt;br /&gt;
| Data || 1 inverted command bit + 1 toggle bit + 5 address bits + 7 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 889µs pause, 889µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 889µs pulse, 889µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 889µs pause, 889µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || no stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after approx. 100ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== RC6 + RC6A ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#RC6 and RC6A Protocol|RC6 + RC6A]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 36 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || Biphase (Manchester)&lt;br /&gt;
|-&lt;br /&gt;
| Frame RC6 || 1 start bit + 1 bit &amp;quot;1&amp;quot; + 3 mode bits (&amp;quot;000&amp;quot;) + 1 toggle bit + 16 data 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 (&amp;quot;110&amp;quot;) + 1 toggle bit + 31 data bits + 2666µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Data RC6 || 8 address bits + 8 Command Bits&lt;br /&gt;
|-&lt;br /&gt;
| Data RC6A || &amp;quot;1&amp;quot; + 14 customer bits + 8 system bits + 8 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Data RC6A Pace (Sky) || &amp;quot;1&amp;quot; + 3 mode bits (&amp;quot;110&amp;quot;) + 1 toggle bit (UNUSED &amp;quot;0&amp;quot;) + 16 bits + 1 toggle(!) + 15 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 2666µs pulse, 889µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Toggle 0 bit || 889µs pause, 889µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Toggle 1 bit || 889µs pulse, 889µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 444µs pause, 444µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 444µs pulse, 444µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || no stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after approx. 100ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== GRUNDIG + NOKIA ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#Grundig Protocol|GRUNDIG + NOKIA]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz (?)&lt;br /&gt;
|-&lt;br /&gt;
| Coding || Biphase (Manchester)&lt;br /&gt;
|-&lt;br /&gt;
| Frame packet || 1 start frame + 19.968ms pause + N data frames + 117.76ms pause + 1 stop frame&lt;br /&gt;
|-&lt;br /&gt;
| Start frame || 1 pre bit + 1 start bit + 9 data bits (all 1) + 0 stop bits&lt;br /&gt;
|-&lt;br /&gt;
| Data frame || 1 pre bit + 1 start bit + 9 data bits + 0 stop bits&lt;br /&gt;
|-&lt;br /&gt;
| Stop frame || 1 pre bit + 1 start bit + 9 data bits (all 1) + 0 stop bits&lt;br /&gt;
|-&lt;br /&gt;
| Data Grundig || 9 command bits + 0 address bits&lt;br /&gt;
|-&lt;br /&gt;
| Data Nokia || 8 command bits + 8 address bits&lt;br /&gt;
|-&lt;br /&gt;
| Pre bit || 528µs pulse, 2639µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 528µs pulse, 528µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 528µs pause, 528µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 528µs pulse, 528µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || no stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after approx. 117.76ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== IR60 (SDA2008) ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#IR60_.28SDA2008_and_MC14497P.29|IR60]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 30 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || Biphase (Manchester)&lt;br /&gt;
|-&lt;br /&gt;
| Start frame || 1 start bit + 101111 + 0 stop bits + 22ms pause&lt;br /&gt;
|-&lt;br /&gt;
| Data frame || 1 start bit + 7 data bits + 0 stop bits&lt;br /&gt;
|-&lt;br /&gt;
| Data || 0 address bits + 7 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 528µs pulse, 2639µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 528µs pause, 528µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 528µs pulse, 528µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || no stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after approx. 117.76ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SIEMENS + RUWIDO ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;SIEMENS + RUWIDO&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 36 kHz? (Merlin keyboard with Ruwido protocol: 56 kHz)&lt;br /&gt;
|-&lt;br /&gt;
| Coding || Biphase (Manchester)&lt;br /&gt;
|-&lt;br /&gt;
| Frame Siemens || 1 start bit + 22 data bits + 0 stop bits&lt;br /&gt;
|-&lt;br /&gt;
| Frame Ruwido || 1 start bit + 17 data bits + 0 stop bits&lt;br /&gt;
|-&lt;br /&gt;
| Data Siemens || 11 address bits + 10 command bits + 1 inverted bit (preceding bit inverted)&lt;br /&gt;
|-&lt;br /&gt;
| Data Ruwido || 9 address bits + 7 command bits + 1 inverted bit (preceding bit inverted)&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 275µs pulse, 275µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 275µs pause, 275µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 275µs pulse, 275µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || no stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || once with repeat bit set (?)&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after approx. 100ms (?)&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== A1TVBOX ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;A1TVBOX&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || Biphase (Manchester) asymmetric&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 2 start bits + 16 data bits + 0 stop bits&lt;br /&gt;
|-&lt;br /&gt;
| Data || 8 address bits + 8 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bits || &amp;quot;10&amp;quot;, also 250µs pulse, 150µs + 150µs pause, 250µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 150µs pause, 250µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 250µs pulse, 150µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || no stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || unknown&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== MERLIN ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;MERLIN&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 56 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || Biphase (Manchester) asymmetric&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 2 start bits + 18 data bits + 0 stop bits&lt;br /&gt;
|-&lt;br /&gt;
| Data || 8 address bits + 10 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bits || &amp;quot;10&amp;quot;, also 210µs pulse, 210µs + 210µs pause, 210µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 210µs pause, 210µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 210µs pulse, 210µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || no stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || unknown&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== ORTEK ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;ORTEK&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || Biphase (Manchester) symmetric&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 2 start bits + 18 data bits + 0 stop bits&lt;br /&gt;
|-&lt;br /&gt;
| Data || 6 address bits + 2 special bits +  6 command bits + 4 special bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 2000µs pulse, 1000µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 500µs pause, 500µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 500µs pulse, 500µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || no stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || 2 additional frames with special bits set&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || only repeats the 2nd frame&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Pulse Position Protocols ===&lt;br /&gt;
&lt;br /&gt;
==== NETBOX ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;NETBOX&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse position&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 16 data bits, no stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 3 address bits + 13 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 2400µs pulse, 800µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Bit Length || 800µs&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after approx. 35ms?&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Software History ==&lt;br /&gt;
&lt;br /&gt;
=== Changes of IRMP in 3.2.x === &lt;br /&gt;
&lt;br /&gt;
Version 3.2.6:&lt;br /&gt;
&lt;br /&gt;
* 2021-01-27: &#039;&#039;&#039;New IR Protocol:&#039;&#039;&#039; [[IRMP#MELINERA|MELINERA]]&lt;br /&gt;
* 2021-01-27: Protocol [[IRMP#LEGO|LEGO]]: Improved timing&lt;br /&gt;
* 2021-01-27: Protocol [[IRMP#RUWIDO|RUWIDO]]: Improved timing&lt;br /&gt;
* 2021-01-27: Protocol [[IRMP#NEC|NEC]]: Implemented send of raw NEC repetition frames &lt;br /&gt;
&lt;br /&gt;
Version 3.2.3:&lt;br /&gt;
&lt;br /&gt;
* 2020-08-15: &#039;&#039;&#039;New RF Protocol:&#039;&#039;&#039; [[IRMP#RF_MEDION|RF_MEDION]]&lt;br /&gt;
&lt;br /&gt;
Version 3.2.2:&lt;br /&gt;
&lt;br /&gt;
* 2020-07-09: Additional recognition of the radio channels with the RF_X10 protocol&lt;br /&gt;
* 2020-07-09: Improved RF frame detection with new stop bit handling.&lt;br /&gt;
* 2020-07-09: Improved detection of RF_GEN24 protocols&lt;br /&gt;
* 2020-07-09: &amp;lt;span style=&amp;quot;color:#FF0000&amp;quot;&amp;gt;&#039;&#039;&#039;NEU:&#039;&#039;&#039;&amp;lt;/span&amp;gt; Detection if/when a remote control button is released, see chapter &#039;&#039;&#039;[[IRMP_-_english#Debouncing|Debouncing]]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Version 3.2.1:&lt;br /&gt;
&lt;br /&gt;
* 2020-06-22: Mini bugfix&lt;br /&gt;
&lt;br /&gt;
Version 3.2.0:&lt;br /&gt;
&lt;br /&gt;
* 2020-06-22: Support of 433MHz RF modules&lt;br /&gt;
* 2020-06-22: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP#RF_GEN24|RF_GEN24]]&lt;br /&gt;
* 2020-06-22: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP#X10|X10]]&lt;br /&gt;
&lt;br /&gt;
=== Older Versions ===&lt;br /&gt;
&lt;br /&gt;
* 2019-08-26: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: METZ&lt;br /&gt;
* 2019-08-26: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: ONKYO&lt;br /&gt;
* 2018-09-10: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP#RCII|RCII]]&lt;br /&gt;
* 2018-09-06: Added support of STM32 mit HAL-Library&lt;br /&gt;
* 2018-08-30: New option: IRMP_USE_IDLE_CALL&lt;br /&gt;
* 2018-08-29: Port to ChibiOS&lt;br /&gt;
* 2018-08-29: New protocol: GREE&lt;br /&gt;
* 2018-02-19: corrected handling of irmp_flags for invalid frames&lt;br /&gt;
* 2017-08-25: New protocol: IRMP16 for transparent 16 bit data communication&lt;br /&gt;
* 2016-11-18: Corrected buffer overflow in irmp-main-avr-uart.c&lt;br /&gt;
* 2016-09-19: New protocol [[IRMP#VINCENT|VINCENT]]&lt;br /&gt;
* 2016-09-09: New protocol [[IRMP#MITSU_HEAVY|Mitsubishi Heavy (air conditioner)]]&lt;br /&gt;
* 2016-09-09: Some modifications for Compiler PIC C18&lt;br /&gt;
* 2016-01-16: Some corrections of port to ESP8266&lt;br /&gt;
* 2016-01-16: Added port to MBED&lt;br /&gt;
* 2016-01-16: Added several hardware dependent example main source files&lt;br /&gt;
* 2015-11-17: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#PANASONIC|PANASONIC (Beamer)]]&lt;br /&gt;
* 2015-11-17: Port to ESP8266&lt;br /&gt;
* 2015-11-17: Port to Teensy (3.x)&lt;br /&gt;
* 2015-11-10: Added support for STM8 microcontroller&lt;br /&gt;
* 2015-09-20: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#TECHNICS|TECHNICS]]&lt;br /&gt;
* 2015-06-15: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#ACP24|ACP24]]&lt;br /&gt;
* 2015-05-29: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#S100|S100]]&lt;br /&gt;
* 2015-05-29: Some smaller corrections&lt;br /&gt;
* 2015-05-28: Added Logging for XMega&lt;br /&gt;
* 2015-05-28: Timing corrections  for FAN protocol&lt;br /&gt;
* 2015-05-27: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#MERLIN|MERLIN]]&lt;br /&gt;
* 2015-05-27: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#FAN|FAN]]&lt;br /&gt;
* 2015-05-18: Added F_CPU macro for STM32L1XX&lt;br /&gt;
* 2015-05-18: Some corrections for XMega port&lt;br /&gt;
* 2015-04-23: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#PENTAX|PENTAX]]&lt;br /&gt;
* 2015-04-23: Port to AVR XMega&lt;br /&gt;
* 2014-09-19: Bugfix: added missing newline before #else&lt;br /&gt;
* 2014-09-18: Added logging for ARM STM32F10X&lt;br /&gt;
* 2014-09-17: Corrected PROGMEM access to array irmp_protocol_names[].&lt;br /&gt;
* 2014-09-15: Changed timing tolerances for [[IRMP_-_english#KASEIKYO|KASEIKYO]] protocol&lt;br /&gt;
* 2014-09-15: Moved  irmp_protocol_names to flash, additional UART routines in irmp-main-avr-uart.c&lt;br /&gt;
* 2014-07-21: Port to PIC 12F1840&lt;br /&gt;
* 2014-07-09: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#SAMSUNG48|SAMSUNG48]]&lt;br /&gt;
* 2014-07-09: Some small corrections&lt;br /&gt;
* 2014-07-01: Added logging for ARM_STM32F4XX&lt;br /&gt;
* 2014-07-01: IRMP port for PIC XC8 compiler, removed variadic macros because of stupid XC8 compiler :-(&lt;br /&gt;
* 2014-06-05: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#LGAIR|LGAIR]]&lt;br /&gt;
* 2014-05-30: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#SPEAKER|SPEAKER]]&lt;br /&gt;
* 2014-05-30: Optimized timings for [[IRMP_-_english#SAMSUNG|SAMSUNG]] protocol&lt;br /&gt;
* 2014-02-20: Corrected decoding of [[IRMP_-_english#SIEMENS_+_RUWIDO|SIEMENS]] protocol&lt;br /&gt;
* 2014-02-19: &#039;&#039;&#039;New protocols&#039;&#039;&#039;: [[IRMP_-_english#RCMM|RCMM32, RCMM24 and RCMM12]]&lt;br /&gt;
* 2014-09-17: Optimized timing for [[IRMP_-_english#ROOMBA|ROOMBA]]&lt;br /&gt;
* 2013-04-09: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#ROOMBA|ROOMBA]]&lt;br /&gt;
* 2013-04-09: Optimized detection of [[IRMP_-_english#ORTEK|ORTEK (Hama)]] frames&lt;br /&gt;
* 2013-03-19: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#ORTEK|ORTEK (Hama)]]&lt;br /&gt;
* 2013-03-19: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#TELEFUNKEN|TELEFUNKEN]]&lt;br /&gt;
* 2013-03-12: Changed timing tolerancies for [[IRMP_-_english#RECS80|RECS80]]- and  [[IRMP_-_english#RECS80EXT|RECS80EXT]] protocol&lt;br /&gt;
* 2013-01-21: Corrected detection of repetition frame beim [[IRMP_-_english#DENON|DENON]] protocol&lt;br /&gt;
* 2013-01-17: Corrected frame detection beim [[IRMP_-_english#DENON|DENON]] protocol&lt;br /&gt;
* 2012-12-11: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#A1TVBOX|A1TVBOX]]&lt;br /&gt;
* 2012-12-07: Improved detection von [[IRMP_-_english#DENON|DENON]] repetition frame&lt;br /&gt;
* 2012-11-19: Port to Stellaris LM4F120 TI Launchpad (ARM Cortex M4)&lt;br /&gt;
* 2012-11-06: Corrected [[IRMP_-_english#DENON|DENON]] frame detection&lt;br /&gt;
* 2012-10-26: Some timer corrections and adaptations for Arduino&lt;br /&gt;
* 2012-07-11: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#BOSE|BOSE]]&lt;br /&gt;
* 2012-06-18: Added support for ATtiny87/167&lt;br /&gt;
* 2012-06-05: Some smaller corrections of port to ARM STM32&lt;br /&gt;
* 2012-06-05: Correction of include in [http://www.mikrocontroller.net/svnbrowser/irmp/irmpextlog.c?view=markup irmpextlog.c]&lt;br /&gt;
* 2012-06-05: Bugfix, if only [[IRMP_-_english#NEC_+_extended_NEC|NEC]] and [[IRMP_-_english#NEC42|NEC42]] activated&lt;br /&gt;
* 2012-05-23: Port to ARM STM32&lt;br /&gt;
* 2012-05-23: Bugfix frame detection for [[IRMP_-_english#DENON|DENON]] protocol&lt;br /&gt;
* 2012-02-27: Bugfix in IR60-Decoder&lt;br /&gt;
* 2012-02-27: Bugfix in CRC calculation of  [[IRMP_-_english#KASEIKYO|KASEIKYO]] frames&lt;br /&gt;
* 2012-02-27: Port to C18 Compiler for PIC microcontrollers&lt;br /&gt;
* 2012-02-13: Bugfix: most significant bit in Address wrong in [[IRMP_-_english#NEC_+_extended_NEC|NEC]] protocol, if [[IRMP_-_english#NEC42|NEC42]] protocol activated, too&lt;br /&gt;
* 2012-02-13: Corrected timing of [[IRMP_-_english#SAMSUNG|SAMSUNG]]- and [[IRMP_-_english#SAMSUNG32|SAMSUNG32]] protocol&lt;br /&gt;
* 2012-02-13: [[IRMP_-_english#KASEIKYO|KASEIKYO]]: Genre2 bits will be now stored in upper nibble of flags&lt;br /&gt;
* 2011-09-20: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#KATHREIN|KATHREIN]]&lt;br /&gt;
* 2011-09-20: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#SIEMENS_+_RUWIDO|RUWIDO]]&lt;br /&gt;
* 2011-09-20: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#THOMSON|THOMSON]]&lt;br /&gt;
* 2011-09-20: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#IR60 (SDA2008)|IR60 (SDA2008)]]&lt;br /&gt;
* 2011-09-20: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#LEGO|LEGO]]&lt;br /&gt;
* 2011-09-20: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#NEC16|NEC16]]&lt;br /&gt;
* 2011-09-20: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#NEC42|NEC42]]&lt;br /&gt;
* 2011-09-20: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#NETBOX|NETBOX]]&lt;br /&gt;
* 2011-09-20: Port to ATtiny84 and ATtiny85&lt;br /&gt;
* 2011-09-20: Improved key repetition detection in [[IRMP_-_english#RC5_+_RC5X|RC5]] protocol&lt;br /&gt;
* 2011-09-20: Improved decoding of [[IRMP_-_english#Biphase|Biphase]] protocols&lt;br /&gt;
* 2011-09-20: Fixed some smaller bugs in [[IRMP_-_english#RECS80|RECS80]] decoder&lt;br /&gt;
* 2011-09-20: Corrected detection of additional bits in SIRCS protocol&lt;br /&gt;
* 2011-01-18: Some corrections for [[IRMP_-_english#SIEMENS_+_RUWIDO|SIEMENS]] protocol&lt;br /&gt;
* 2011-01-18: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#Nikon|Nikon]]&lt;br /&gt;
* 2011-01-18: [[IRMP_-_english#SIRCS|SIRCS]]: additional bits (&amp;gt;12) will be stored in address&lt;br /&gt;
* 2011-01-18: Some timing corrections for [[IRMP_-_english#DENON|DENON]] protocol&lt;br /&gt;
* 2010-09-04: Bugfix for F_INTERRUPTS &amp;gt;= 16000&lt;br /&gt;
* 2010-09-02: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#RC6_+_RC6A|RC6A]]&lt;br /&gt;
* 2010-08-29: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#JVC|JVC]]&lt;br /&gt;
* 2010-08-29: [[IRMP_-_english#KASEIKYO|KASEIKYO]] protocol: genre bits will be now stored&lt;br /&gt;
* 2010-08-29: [[IRMP_-_english#KASEIKYO|KASEIKYO]] protocol: Improved handling of repetition frames&lt;br /&gt;
* 2010-08-29: Improved support of [[IRMP_-_english#APPLE|APPLE]] protocols.&lt;br /&gt;
* 2010-07-01: Bugfix: added a timeout for [[IRMP_-_english#NEC_+_extended_NEC|NEC]] repetition frames. This avoids &#039;ghost commands&#039;.&lt;br /&gt;
* 2010-06-26: Bugfix: deactivated [[IRMP_-_english#RECS80|RECS80]], [[IRMP_-_english#RECS80EXT|RECS80EXT]] &amp;amp; [[IRMP_-_english#SIEMENS_+_RUWIDO|SIEMENS]] if interrupts frequency is low&lt;br /&gt;
* 2010-06-25: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#RCCAR|RCCAR]]&lt;br /&gt;
* 2010-06-25: Extended keyboard detection for [[IRMP_-_english#FDC|FDC]] protocol (IR keyboard)&lt;br /&gt;
* 2010-06-25: Interrupt frequency now up to 20kHz possible&lt;br /&gt;
* 2010-06-09: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#FDC|FDC]] (IR-keyboard)&lt;br /&gt;
* 2010-06-09: Corrected timing for [[IRMP_-_english#DENON|DENON]] protocol&lt;br /&gt;
* 2010-06-02: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#SIEMENS_+_RUWIDO|SIEMENS]] (Gigaset)&lt;br /&gt;
* 2010-05-26: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#GRUNDIG_+_NOKIA|NOKIA]]&lt;br /&gt;
* 2010-05-26: Bugfix: detection of long keyboard press for [[IRMP_-_english#GRUNDIG_+_NOKIA|GRUNDIG]] protocol&lt;br /&gt;
* 2010-05-17: Bugfix [[IRMP_-_english#SAMSUNG32|SAMSUNG32]] protocol: corrected command bit mask&lt;br /&gt;
* 2010-05-16: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#GRUNDIG_+_NOKIA|GRUNDIG]]&lt;br /&gt;
* 2010-05-16: Improved handling of automatic frame repetitions for [[IRMP_-_english#SIRCS|SIRCS]]-, [[IRMP_-_english#SAMSUNG32|SAMSUNG32]]-, and [[IRMP_-_english#NUBERT|NUBERT]] protocol&lt;br /&gt;
* 2010-04-28: Only some cosmetic code optimizations&lt;br /&gt;
* 2010-04-16: Improved all timing tolerancies&lt;br /&gt;
* 2010-04-12: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#B&amp;amp;O|Bang &amp;amp; Olufsen]]&lt;br /&gt;
* 2010-03-29: Bugfix: detection of multiple [[IRMP_-_english#NEC_+_extended_NEC|NEC]] repetition frames&lt;br /&gt;
* 2010-03-29: Moved configuration data to  [http://www.mikrocontroller.net/svnbrowser/irmp/irmpconfig.h?view=markup irmpconfig.h]&lt;br /&gt;
* 2010-03-29: Introduced a program version in README.txt: Version 1.0&lt;br /&gt;
* 2010-03-17: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#NUBERT|NUBERT]]&lt;br /&gt;
* 2010-03-16: Correction of RECS80 start bit timings&lt;br /&gt;
* 2010-03-16: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#RECS80EXT|RECS80 Extended]]&lt;br /&gt;
* 2010-03-15: Some optimizations&lt;br /&gt;
* 2010-03-14: Port to PIC&lt;br /&gt;
* 2010-03-11: Some adjustements for some ATMegas&lt;br /&gt;
* 2010-03-07: Bugfix: Reset of state machine after a incomplete [[IRMP_-_english#RC5_+_RC5X|RC5]] frame&lt;br /&gt;
* 2010-03-05: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#APPLE|APPLE]]&lt;br /&gt;
* 2010-03-05: Data  irmp_data.addr + irmp_data.command will be now stored in the bit order of the appropriate protocol&lt;br /&gt;
* 2010-03-04: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#SAMSUNG32|SAMSUNG32]] (Mix aus [[IRMP_-_english#SAMSUNG|SAMSUNG]] &amp;amp; [[IRMP_-_english#NEC_+_extended_NEC|NEC]] protocol)&lt;br /&gt;
* 2010-03-04: Changed some timer tolerances changes of [[IRMP_-_english#SIRCS|SIRCS]]- and [[IRMP_-_english#KASEIKYO|KASEIKYO]]&lt;br /&gt;
* 2010-03-02: [[IRMP_-_english#SIRCS|SIRCS]]: corrected detection and suppression of automatic frame repetitions&lt;br /&gt;
* 2010-03-02: [[IRMP_-_english#SIRCS|SIRCS]]: device ID bits will be now stored in irmp_data.command (not irmp_data.address anymore)&lt;br /&gt;
* 2010-03-02: Enlargement of scan buffers (for logging)&lt;br /&gt;
* 2010-02-24: New variable flags in IRMP_DATA for detection of long key press&lt;br /&gt;
* 2010-02-20: Bugfix [[IRMP_-_english#DENON|DENON]] protocol: repetition frame is now basically inverted&lt;br /&gt;
* 2010-02-19: Detection of [[IRMP_-_english#NEC_+_extended_NEC|NEC]] protocol-Varianten, z.&amp;amp;nbsp;B. [[IRMP_-_english#APPLE|APPLE]]-Fernbedienung&lt;br /&gt;
* 2010-02-19: Detection of [[IRMP_-_english#RC6_+_RC6A|RC6]]- and [[IRMP_-_english#DENON|DENON]] protocol&lt;br /&gt;
* 2010-02-19: Some improvements for [[IRMP_-_english#RC5_+_RC5X|RC5]] decoders (Bugfixes)&lt;br /&gt;
* 2010-02-13: Bugfix: Puls/Pause counters were 1 too low, now better detection of protokols with very short pulses&lt;br /&gt;
* 2010-02-13: Improved detection of [[IRMP_-_english#NEC_+_extended_NEC|NEC]] repetition frames&lt;br /&gt;
* 2010-02-12: New: [[IRMP_-_english#RC5_+_RC5X|RC5]] protocol&lt;br /&gt;
* 2010-02-05: Eliminated a conflict between [[IRMP_-_english#SAMSUNG|SAMSUNG]]- and [[IRMP_-_english#MATSUSHITA|MATSUSHITA]] protocol&lt;br /&gt;
* 2010-01-07: First version&lt;br /&gt;
&lt;br /&gt;
== Literature ==&lt;br /&gt;
&lt;br /&gt;
=== IR Abstract ===&lt;br /&gt;
&lt;br /&gt;
* http://www.sbprojects.net/knowledge/ir/index.php&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&lt;br /&gt;
* http://mc.mikrocontroller.com/de/IR-Protokolle.php&lt;br /&gt;
&lt;br /&gt;
=== SIRCS Protocol ===&lt;br /&gt;
&lt;br /&gt;
* http://www.sbprojects.net/knowledge/ir/sirc.php&lt;br /&gt;
* http://mc.mikrocontroller.com/de/IR-Protokolle.php#SIRCS&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;
* http://www.celadon.com/infrared_protocol/infrared_protocols_samples.pdf&lt;br /&gt;
&lt;br /&gt;
=== NEC Protocol ===&lt;br /&gt;
&lt;br /&gt;
* http://www.sbprojects.net/knowledge/ir/nec.php&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;
=== ACP24 Protocol ===&lt;br /&gt;
&lt;br /&gt;
The ACP24-Protocol is used by Stiebel-Eltron-Aircons&lt;br /&gt;
&lt;br /&gt;
The structure of the 70 databits is :&lt;br /&gt;
&lt;br /&gt;
              1         2         3         4         5         6&lt;br /&gt;
    0123456789012345678901234567890123456789012345678901234567890123456789&lt;br /&gt;
    N VVMMM    ? ???    t vmA x                 y                     TTTT&lt;br /&gt;
    0011001000000111000010001010000000000000000010000000000000000000001111on, temp=30&lt;br /&gt;
&lt;br /&gt;
These are converted into the following 16 bits from irmp_data.command:&lt;br /&gt;
&lt;br /&gt;
        5432109876543210&lt;br /&gt;
        NAVVvMMMmtxyTTTT&lt;br /&gt;
&lt;br /&gt;
Meaning of the symbols:&lt;br /&gt;
&lt;br /&gt;
    TTTT = Temperature + 15 degree&lt;br /&gt;
            TTTT&lt;br /&gt;
            ----------&lt;br /&gt;
            0000        ???&lt;br /&gt;
            0001        ???&lt;br /&gt;
            0010        ???&lt;br /&gt;
            0011        18 degree&lt;br /&gt;
            0100        19 degree&lt;br /&gt;
            0101        20 degree&lt;br /&gt;
            0110        21 degree&lt;br /&gt;
            ...&lt;br /&gt;
            1111        30 degree&lt;br /&gt;
&lt;br /&gt;
    N    = Nightmode&lt;br /&gt;
            N&lt;br /&gt;
            ----------&lt;br /&gt;
            0           off&lt;br /&gt;
            1           on&lt;br /&gt;
&lt;br /&gt;
    VV   = fan, v must be 1!&lt;br /&gt;
            VV   v&lt;br /&gt;
            ----------&lt;br /&gt;
            00   1      level 1&lt;br /&gt;
            01   1      level 2&lt;br /&gt;
            10   1      level 3&lt;br /&gt;
            11   1      Automatic&lt;br /&gt;
&lt;br /&gt;
    MMM  = Mode&lt;br /&gt;
            MMM  m&lt;br /&gt;
            ----------&lt;br /&gt;
            000  0      turn off&lt;br /&gt;
            001  0      turn on&lt;br /&gt;
            001  1      cooling&lt;br /&gt;
            010  1      fan&lt;br /&gt;
            011  1      demist&lt;br /&gt;
            100  1      ???&lt;br /&gt;
            101  1      ---&lt;br /&gt;
            110  1      ---&lt;br /&gt;
            111  1      ---&lt;br /&gt;
&lt;br /&gt;
    A    = Automatic-Programm&lt;br /&gt;
            A&lt;br /&gt;
            ----------&lt;br /&gt;
            0           off&lt;br /&gt;
            1           on&lt;br /&gt;
&lt;br /&gt;
    t   = Timer&lt;br /&gt;
            t   x y&lt;br /&gt;
            ----------&lt;br /&gt;
            1   1 0     Timer 1&lt;br /&gt;
            1   0 1     Timer 2&lt;br /&gt;
&lt;br /&gt;
To control the air con via [[IRSND_-_english|IRSND]], the following functions can be used:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;irmp.h&amp;quot;&lt;br /&gt;
#include &amp;quot;irsnd.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#define IRMP_ACP24_TEMPERATURE_MASK         0x000F                                          // TTTT&lt;br /&gt;
&lt;br /&gt;
#define IRMP_ACP24_SET_TIMER_MASK           (1&amp;lt;&amp;lt;6)                                          // t&lt;br /&gt;
#define IRMP_ACP24_TIMER1_MASK              (1&amp;lt;&amp;lt;5)                                          // x&lt;br /&gt;
#define IRMP_ACP24_TIMER2_MASK              (1&amp;lt;&amp;lt;4)                                          // y&lt;br /&gt;
&lt;br /&gt;
#define IRMP_ACP24_SET_MODE_MASK            (1&amp;lt;&amp;lt;7)                                          // m&lt;br /&gt;
#define IRMP_ACP24_MODE_POWER_ON_MASK       (1&amp;lt;&amp;lt;8)                                          // MMMm = 0010 Einschalten&lt;br /&gt;
#define IRMP_ACP24_MODE_COOLING_MASK        (IRMP_ACP24_SET_MODE_MASK | (1&amp;lt;&amp;lt;8))             // MMMm = 0011 Kuehlen&lt;br /&gt;
#define IRMP_ACP24_MODE_VENTING_MASK        (IRMP_ACP24_SET_MODE_MASK | (1&amp;lt;&amp;lt;9))             // MMMm = 0101 Lueften&lt;br /&gt;
#define IRMP_ACP24_MODE_DEMISTING_MASK      (IRMP_ACP24_SET_MODE_MASK | (1&amp;lt;&amp;lt;10) | (1&amp;lt;&amp;lt;8))   // MMMm = 1001 Entfeuchten&lt;br /&gt;
&lt;br /&gt;
#define IRMP_ACP24_SET_FAN_STEP_MASK        (1&amp;lt;&amp;lt;11)                                         // v&lt;br /&gt;
#define IRMP_ACP24_FAN_STEP_MASK            0x3000                                          // VV&lt;br /&gt;
#define IRMP24_ACP_FAN_STEP_BIT             12                                              // VV&lt;br /&gt;
#define IRMP_ACP24_AUTOMATIC_MASK           (1&amp;lt;&amp;lt;14)                                         // A&lt;br /&gt;
#define IRMP_ACP24_NIGHT_MASK               (1&amp;lt;&amp;lt;15)                                         // N&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// possible values for acp24_set_mode();&lt;br /&gt;
#define ACP24_MODE_COOLING                  1&lt;br /&gt;
#define ACP24_MODE_VENTING                  2&lt;br /&gt;
#define ACP24_MODE_DEMISTING                3&lt;br /&gt;
&lt;br /&gt;
static uint8_t temperature = 18;                                                    // 18 degrees&lt;br /&gt;
&lt;br /&gt;
static void&lt;br /&gt;
acp24_send (uint16_t cmd)&lt;br /&gt;
{&lt;br /&gt;
    IRMP_DATA irmp_data;&lt;br /&gt;
&lt;br /&gt;
    cmd |=  (temperature - 15) &amp;amp; IRMP_ACP24_TEMPERATURE_MASK;&lt;br /&gt;
&lt;br /&gt;
    irmp_data.protocol = IRMP_ACP24_PROTOCOL;&lt;br /&gt;
    irmp_data.address  = 0x0000;&lt;br /&gt;
    irmp_data.command  = cmd;&lt;br /&gt;
    irmp_data.flags    = 0;&lt;br /&gt;
&lt;br /&gt;
    irsnd_send_data (&amp;amp;irmp_data, 1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void&lt;br /&gt;
acp24_set_temperature (uint8_t temp)&lt;br /&gt;
{&lt;br /&gt;
    uint16_t    cmd = IRMP_ACP24_MODE_POWER_ON_MASK;&lt;br /&gt;
&lt;br /&gt;
    temperature = temp;&lt;br /&gt;
    acp24_send (cmd);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void&lt;br /&gt;
acp24_off (void)&lt;br /&gt;
{&lt;br /&gt;
    uint16_t    cmd = 0;&lt;br /&gt;
    acp24_send (cmd);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#define ACP_FAN_STEP1       0&lt;br /&gt;
#define ACP_FAN_STEP2       1&lt;br /&gt;
#define ACP_FAN_STEP3       2&lt;br /&gt;
#define ACP_FAN_AUTOMATIC   3&lt;br /&gt;
&lt;br /&gt;
void&lt;br /&gt;
acp24_fan (uint8_t fan_step)&lt;br /&gt;
{&lt;br /&gt;
    uint16_t    cmd = IRMP_ACP24_MODE_POWER_ON_MASK;&lt;br /&gt;
&lt;br /&gt;
    cmd |= IRMP_ACP24_SET_FAN_STEP_MASK | ((fan_step &amp;lt;&amp;lt; IRMP24_ACP_FAN_STEP_BIT) &amp;amp; IRMP_ACP24_FAN_STEP_MASK);&lt;br /&gt;
&lt;br /&gt;
    acp24_send (cmd);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void&lt;br /&gt;
acp24_set_mode (uint8_t mode)&lt;br /&gt;
{&lt;br /&gt;
    uint16_t    cmd = 0;&lt;br /&gt;
&lt;br /&gt;
    switch (mode)&lt;br /&gt;
    {&lt;br /&gt;
        case ACP24_MODE_COOLING:    cmd = IRMP_ACP24_MODE_COOLING_MASK;     break;&lt;br /&gt;
        case ACP24_MODE_VENTING:    cmd = IRMP_ACP24_MODE_VENTING_MASK;     break;&lt;br /&gt;
        case ACP24_MODE_DEMISTING:  cmd = IRMP_ACP24_MODE_DEMISTING_MASK;   break;&lt;br /&gt;
        default: return;&lt;br /&gt;
    }&lt;br /&gt;
    acp24_send (cmd);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void&lt;br /&gt;
acp24_program_automatic (void)&lt;br /&gt;
{&lt;br /&gt;
    uint16_t    cmd = IRMP_ACP24_MODE_POWER_ON_MASK | IRMP_ACP24_AUTOMATIC_MASK;&lt;br /&gt;
    acp24_send (cmd);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void&lt;br /&gt;
acp24_program_night (void)&lt;br /&gt;
{&lt;br /&gt;
    uint16_t    cmd = IRMP_ACP24_MODE_POWER_ON_MASK | IRMP_ACP24_NIGHT_MASK;&lt;br /&gt;
    acp24_send (cmd);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== LGAIR Protocol ===&lt;br /&gt;
&lt;br /&gt;
The LG Air Con is controlled by an &#039;intelligent&#039; remote. These are the encoded data:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    Command                 AAAAAAAA  PW  Z  S  T  mmm  tttt  vvvv  PPPP&lt;br /&gt;
    --------------------------------------------------------------------&lt;br /&gt;
    ON 23C                  10001000  00  0  0  0  000  1000  0100  1100&lt;br /&gt;
    ON 26C                  10001000  00  0  0  0  000  1011  0100  1111&lt;br /&gt;
&lt;br /&gt;
    OFF                     10001000  11  0  0  0  000  0000  0101  0001&lt;br /&gt;
    TURN OFF                10001000  11  0  0  0  000  0000  0101  0001  (18C currently, identical to off)&lt;br /&gt;
&lt;br /&gt;
    TEMP DOWN 23C           10001000  00  0  0  1  000  1000  0100  0100&lt;br /&gt;
    MODE (to mode0, 23C)    10001000  00  0  0  1  000  1000  0100  0100&lt;br /&gt;
&lt;br /&gt;
    TEMP UP (24C)           10001000  00  0  0  1  000  1001  0100  0101&lt;br /&gt;
    TEMP DOWN 24C           10001000  00  0  0  1  000  1001  0100  0101&lt;br /&gt;
&lt;br /&gt;
    TEMP UP (25C)           10001000  00  0  0  1  000  1010  0100  0110&lt;br /&gt;
    TEMP DOWN 25C           10001000  00  0  0  1  000  1010  0100  0110&lt;br /&gt;
&lt;br /&gt;
    TEMP UP (26C)           10001000  00  0  0  1  000  1011  0100  0111&lt;br /&gt;
&lt;br /&gt;
    MODE                    10001000  00  0  0  1  011  0111  0100  0110  (to mode1, 22C - when switching to mode1 temp automaticall sets to 22C)&lt;br /&gt;
    ON (mode1, 22C)         10001000  00  0  0  0  011  0111  0100  1110&lt;br /&gt;
&lt;br /&gt;
    MODE                    10001000  00  0  0  1  001  1000  0100  0101  (to mode2, no temperature displayed)&lt;br /&gt;
    ON (mode2)              10001000  00  0  0  0  001  1000  0100  1101&lt;br /&gt;
    MODE (to mode3, 23C)    10001000  00  0  0  1  100  1000  0100  1000&lt;br /&gt;
    ON (mode3, 23C)         10001000  00  0  0  0  100  1000  0100  0000&lt;br /&gt;
&lt;br /&gt;
    VENTILATION SLOW        10001000  00  0  0  1  000  0011  0000  1011&lt;br /&gt;
    VENTILATION MEDIUM      10001000  00  0  0  1  000  0011  0010  1101&lt;br /&gt;
    VENTILATION HIGH        10001000  00  0  0  1  000  0011  0100  1111&lt;br /&gt;
    VENTILATION LIGHT       10001000  00  0  0  1  000  0011  0101  0000&lt;br /&gt;
&lt;br /&gt;
    SWING ON/OFF            10001000  00  0  1  0  000  0000  0000  0001&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    Format:     1 start bit + 8 address bits + 16 data bits + 4 checksum bits + 1 stop bit&lt;br /&gt;
&lt;br /&gt;
    Address:    AAAAAAAA = 0x88 (8 bits)&lt;br /&gt;
&lt;br /&gt;
    Data:       PW Z S T MMM tttt vvvv PPPP (16 bits)&lt;br /&gt;
&lt;br /&gt;
                PW:         Power:     00 = On, 11 = Off&lt;br /&gt;
&lt;br /&gt;
                Z:          N/A:       Always 0&lt;br /&gt;
&lt;br /&gt;
                S:          Swing:     1 = Toggle swing, all other data bits are zeros.&lt;br /&gt;
&lt;br /&gt;
                T:          Temp/Vent: 1 = Set temperature and ventilation&lt;br /&gt;
&lt;br /&gt;
                MMM:        Mode, can be combined with temperature&lt;br /&gt;
                            000=Mode 0&lt;br /&gt;
                            001=Mode 2&lt;br /&gt;
                            010=????&lt;br /&gt;
                            011=Mode 1&lt;br /&gt;
                            100=Mode 3&lt;br /&gt;
                            101=???&lt;br /&gt;
                            111=???&lt;br /&gt;
&lt;br /&gt;
                tttt:       Temperature:&lt;br /&gt;
                            0000=used by OFF command&lt;br /&gt;
                            0001=????&lt;br /&gt;
                            0010=????&lt;br /&gt;
                            0011=18°C&lt;br /&gt;
                            0100=19°C&lt;br /&gt;
                            0101=20°C&lt;br /&gt;
                            0110=21°C&lt;br /&gt;
                            0111=22°C&lt;br /&gt;
                            1000=23°C&lt;br /&gt;
                            1001=24°C&lt;br /&gt;
                            1010=25°C&lt;br /&gt;
                            1011=26°C&lt;br /&gt;
                            1011=27°C&lt;br /&gt;
                            1100=28°C&lt;br /&gt;
                            1101=29°C&lt;br /&gt;
                            1111=30°C&lt;br /&gt;
&lt;br /&gt;
                vvvv:       Ventilation:&lt;br /&gt;
                            0000=slow&lt;br /&gt;
                            0010=medium&lt;br /&gt;
                            0011=????&lt;br /&gt;
                            0100=high&lt;br /&gt;
                            0101=light&lt;br /&gt;
                            0110=????&lt;br /&gt;
                            0111=????&lt;br /&gt;
                            ...&lt;br /&gt;
                            1111=????&lt;br /&gt;
&lt;br /&gt;
    Checksum:   PPPP = (DataNibble1 + DataNibble2 + DataNibble3 + DataNibble4) &amp;amp; 0x0F&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== NEC16 Protocol (JVC) ===&lt;br /&gt;
&lt;br /&gt;
* http://www.sbprojects.net/knowledge/ir/jvc.php&lt;br /&gt;
* http://www.ustr.net/infrared/jvc.shtml&lt;br /&gt;
&lt;br /&gt;
=== Samsung Protocol ===&lt;br /&gt;
&lt;br /&gt;
(was reverse engineered by several protocols (Daewoo or similar), so no direct link to Samsung documents is available)&lt;br /&gt;
&lt;br /&gt;
Here is a link to the Daewoo-protocol, which uses the same principle of the sync-bits in the center of a frame, but words with different timings:&lt;br /&gt;
&lt;br /&gt;
* http://users.telenet.be/davshomepage/daewoo.htm&lt;br /&gt;
&lt;br /&gt;
=== MATSUHITA Protocol ===&lt;br /&gt;
&lt;br /&gt;
* http://www.celadon.com/infrared_protocol/infrared_protocols_samples.pdf&lt;br /&gt;
&lt;br /&gt;
=== KASEIKYO Protocol (&amp;quot;Japan Protocol&amp;quot;) ===&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;
=== RECS80 and RECS80 Extended Protocol ===&lt;br /&gt;
&lt;br /&gt;
* http://www.sbprojects.net/knowledge/ir/recs80.php&lt;br /&gt;
&lt;br /&gt;
=== RC5 and RC5x Protocol ===&lt;br /&gt;
&lt;br /&gt;
* http://www.sbprojects.net/knowledge/ir/rc5.php&lt;br /&gt;
* http://mc.mikrocontroller.com/de/IR-Protokolle.php#RC5&lt;br /&gt;
* http://users.telenet.be/davshomepage/rc5.htm&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;
&lt;br /&gt;
=== Denon Protocol ===&lt;br /&gt;
&lt;br /&gt;
* http://www.mikrocontroller.com/de/IR-Protokolle.php#DENON&lt;br /&gt;
* http://www.manualowl.com/m/Denon/AVR-3803/Manual/170243&lt;br /&gt;
&lt;br /&gt;
=== RC6 and RC6A Protocol ===&lt;br /&gt;
&lt;br /&gt;
* http://www.sbprojects.net/knowledge/ir/rc6.php&lt;br /&gt;
* http://www.picbasic.nl/info_rc6_uk.htm&lt;br /&gt;
&lt;br /&gt;
=== Bang &amp;amp; Olufsen ===&lt;br /&gt;
&lt;br /&gt;
* http://www.mikrocontroller.net/attachment/33137/datalink.pdf&lt;br /&gt;
&lt;br /&gt;
=== Grundig Protocol ===&lt;br /&gt;
&lt;br /&gt;
* http://www.see-solutions.de/sonstiges/Grundig_10bit.pdf&lt;br /&gt;
&lt;br /&gt;
=== Nokia Protocol ===&lt;br /&gt;
&lt;br /&gt;
* http://www.sbprojects.net/knowledge/ir/nrc17.php&lt;br /&gt;
&lt;br /&gt;
=== IR60 (SDA2008 and MC14497P) ===&lt;br /&gt;
&lt;br /&gt;
* http://www.datasheetcatalog.org/datasheet/motorola/MC14497P.pdf&lt;br /&gt;
&lt;br /&gt;
=== LEGO Power Functions RC ===&lt;br /&gt;
&lt;br /&gt;
* http://www.philohome.com/pf/LEGO_Power_Functions_RC_v110.pdf&lt;br /&gt;
&lt;br /&gt;
=== RCMM Protocol ===&lt;br /&gt;
&lt;br /&gt;
* http://www.sbprojects.net/knowledge/ir/rcmm.php&lt;br /&gt;
&lt;br /&gt;
=== Other Protocols ===&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.roboternetz.de/phpBB2/files/entwicklung_und_realisierung_einer_universalinfrarotfernbedienung_mit_timerfunktionen.pdf&lt;br /&gt;
&lt;br /&gt;
== IRMP on Youtube ==&lt;br /&gt;
&lt;br /&gt;
* http://www.youtube.com/watch?v=Q7DJvLIyTEI&lt;br /&gt;
&lt;br /&gt;
* http://www.youtube.com/watch?v=1tQ_aqayWZk&lt;br /&gt;
&lt;br /&gt;
* http://www.youtube.com/watch?v=W4tI2axR3-w&lt;br /&gt;
&lt;br /&gt;
* http://www.youtube.com/watch?v=SRs98dIe2WE&lt;br /&gt;
&lt;br /&gt;
== Other Artikels ==&lt;br /&gt;
&lt;br /&gt;
[http://www.infineon.com/dgdl/RF2ir+WhitePaper+V1.0.pdf?folderId=db3a3043191a246301192dd3ee2c2ae4&amp;amp;fileId=db3a30432b57a660012b5c16272c2e81 Whitepaper von Martin Gotschlich, Infineon Technologies AG]&lt;br /&gt;
&lt;br /&gt;
== Hardware / IRMP Projects ==&lt;br /&gt;
&lt;br /&gt;
=== Remote IRMP ===&lt;br /&gt;
&lt;br /&gt;
Infrared sender und receiver controlled via ip network with Android smartphone as remote control:&lt;br /&gt;
&lt;br /&gt;
 * http://www.mikrocontroller.net/articles/Remote_IRMP&lt;br /&gt;
&lt;br /&gt;
=== IR Tester ===&lt;br /&gt;
&lt;br /&gt;
IR tester with LCD by Klaus Leidinger:&lt;br /&gt;
&lt;br /&gt;
* http://www.mikrocontroller-projekte.de/Mikrocontroller/index.html&lt;br /&gt;
&lt;br /&gt;
=== IR Tester with AVR-NET-IO ===&lt;br /&gt;
&lt;br /&gt;
IR tester for Pollin AVR-NET-IO with Pollin ADD-ON Board:&lt;br /&gt;
&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 ===&lt;br /&gt;
&lt;br /&gt;
USB IR remote receiver by Hugo Portisch:&lt;br /&gt;
* http://www.mikrocontroller.net/articles/USB_IR_Remote_Receiver&lt;br /&gt;
&lt;br /&gt;
=== USB IR Receiver/Sender/Switch with Wakeup-Timer ===&lt;br /&gt;
&lt;br /&gt;
* http://www.vdr-portal.de/board18-vdr-hardware/board13-fernbedienungen/123572-fertig-irmp-auf-stm32-ein-usb-ir-empf%C3%A4nger-sender-einschalter-mit-wakeup-timer/&lt;br /&gt;
&lt;br /&gt;
* http://www.mikrocontroller.net/articles/IRMP_auf_STM32_-_ein_USB_IR_Empf%C3%A4nger/Sender/Einschalter_mit_Wakeup-Timer&lt;br /&gt;
&lt;br /&gt;
=== USBASP ===&lt;br /&gt;
&lt;br /&gt;
IR switch based on USBasp&lt;br /&gt;
* http://wiki.easy-vdr.de/index.php?title=USBASP_Einschalter&lt;br /&gt;
&lt;br /&gt;
=== Servo controlled IR Sender ===&lt;br /&gt;
&lt;br /&gt;
Servo controlled IR Sender (adaptive) by Stefan Pendsa:&lt;br /&gt;
* http://forum.mikrokopter.de/topic-21060.html&lt;br /&gt;
* [http://svn.mikrokopter.de/listing.php?repname=Projects&amp;amp;path=%2FServo-Controlled+IR-Transmitter%2F&amp;amp;#Ad2417800d6aa14bf08c571a896e9def7 SVN]&lt;br /&gt;
&lt;br /&gt;
=== Adaptive IR Remote Control ===&lt;br /&gt;
&lt;br /&gt;
Adaptive IR remote control by Robert and Frank M.&lt;br /&gt;
* http://www.mikrocontroller.net/articles/DIY_Lernfähige_Fernbedienung_mit_IRMP&lt;br /&gt;
&lt;br /&gt;
=== AVR Moodlight ===&lt;br /&gt;
&lt;br /&gt;
AVR Moodlight by Axel Schwenke&lt;br /&gt;
* http://www.mikrocontroller.net/topic/244768&lt;br /&gt;
&lt;br /&gt;
STM8 Moodlight by Axel Schwenke&lt;br /&gt;
* https://www.mikrocontroller.net/topic/380098&lt;br /&gt;
&lt;br /&gt;
=== Infinity Mirror LED Ceiling Lamp ===&lt;br /&gt;
&lt;br /&gt;
Infinity Mirror LED ceiling lamp with remote control by Philipp Meißner&lt;br /&gt;
* http://digital-nw.de/Infinity-Mirror.htm&lt;br /&gt;
&lt;br /&gt;
=== Cinema Control ===&lt;br /&gt;
&lt;br /&gt;
Cinema control by Owagner&lt;br /&gt;
* http://ccc.zerties.org/index.php/Benutzer:Owagner&lt;br /&gt;
&lt;br /&gt;
=== Leading-Edge Control ===&lt;br /&gt;
&lt;br /&gt;
leading-edge control:&lt;br /&gt;
&lt;br /&gt;
* http://flosserver.dyndns.org/phasenanschnittsdimmer.php&lt;br /&gt;
&lt;br /&gt;
=== IRDioder – Ikea Dioder Hack ===&lt;br /&gt;
&lt;br /&gt;
Ikea Dioder Hack:&lt;br /&gt;
&lt;br /&gt;
* http://marco-difeo.de/tag/infrared/&lt;br /&gt;
&lt;br /&gt;
=== Expedit Coffee Bar ===&lt;br /&gt;
&lt;br /&gt;
Ikea Expedit as coffee bar:&lt;br /&gt;
&lt;br /&gt;
* http://chaozlabs.blogspot.de/2013/09/expedit-coffee-bar.html&lt;br /&gt;
&lt;br /&gt;
=== Arduino as IR Receiver ===&lt;br /&gt;
&lt;br /&gt;
Arduino as IR Receiver:&lt;br /&gt;
&lt;br /&gt;
* http://www.vdr-portal.de/board18-vdr-hardware/board13-fernbedienungen/110918-arduino-als-ir-empf%C3%A4nger-einsetzen/&lt;br /&gt;
&lt;br /&gt;
More example from the Arduino library:&lt;br /&gt;
&lt;br /&gt;
* https://github.com/ukw100/IRMP/tree/master/examples&lt;br /&gt;
&lt;br /&gt;
=== IR Volume Control with Stellaris Launchpad ===&lt;br /&gt;
&lt;br /&gt;
volume control with Stellaris Launchpad (ARM Cortex-M4F):&lt;br /&gt;
&lt;br /&gt;
* http://www.anthonyvh.com/2013/03/31/ir-volume-control/&lt;br /&gt;
&lt;br /&gt;
=== RemotePi Board ===&lt;br /&gt;
&lt;br /&gt;
Shutdown RaspPI with IR remote control:&lt;br /&gt;
&lt;br /&gt;
* http://www.msldigital.com/pages/more-information&lt;br /&gt;
&lt;br /&gt;
=== Ethernut &amp;amp; IRMP ===&lt;br /&gt;
&lt;br /&gt;
IRMP under RTOS Ethernut:&lt;br /&gt;
&lt;br /&gt;
* http://www.klkl.de/ethernut.html&lt;br /&gt;
&lt;br /&gt;
=== LED strip Remote Control ===&lt;br /&gt;
&lt;br /&gt;
LED strip remote control:&lt;br /&gt;
&lt;br /&gt;
* http://www.solderlab.de/index.php/misc/led-strip-remote-control&lt;br /&gt;
&lt;br /&gt;
=== ADAT Audio Mixer ===&lt;br /&gt;
&lt;br /&gt;
Audio Mixer:&lt;br /&gt;
&lt;br /&gt;
* http://mailtonne.de/adat-audio-mixer/&lt;br /&gt;
&lt;br /&gt;
=== Ethersex &amp;amp; IRMP ===&lt;br /&gt;
&lt;br /&gt;
IRMP + IRSND Modul in Ethersex, a modular Firmware for AVR MCUs&lt;br /&gt;
&lt;br /&gt;
* http://ethersex.de/index.php/IRMP&lt;br /&gt;
&lt;br /&gt;
=== Mastermind Solver ===&lt;br /&gt;
&lt;br /&gt;
Mastermind solver with LED stripes and IR remote control:&lt;br /&gt;
&lt;br /&gt;
* http://www.mystrobl.de/Plone/basteleien/weitere-bulls-and-cows-mastermind-implementationen/mm-v1821/mastermind-solver-mit-led-streifen-und-ir-fernbedienung&lt;br /&gt;
&lt;br /&gt;
=== A MythTV Remote Control without LIRC ===&lt;br /&gt;
&lt;br /&gt;
PC Remote Control with ATtiny85&lt;br /&gt;
&lt;br /&gt;
* http://tomscircuits.blogspot.de/2014/12/a-mythtv-remote-control-without-lirc.html&lt;br /&gt;
&lt;br /&gt;
=== IRMP + IRSND Library for STM32F4 ===&lt;br /&gt;
&lt;br /&gt;
IRMP for STM32F4&lt;br /&gt;
&lt;br /&gt;
* http://mikrocontroller.bplaced.net/wordpress/?page_id=1516&lt;br /&gt;
&lt;br /&gt;
IRSND for STM32F4&lt;br /&gt;
&lt;br /&gt;
* http://mikrocontroller.bplaced.net/wordpress/?page_id=1940&lt;br /&gt;
&lt;br /&gt;
=== IRMP on STM32 - Construction Guidance ===&lt;br /&gt;
&lt;br /&gt;
* http://www.mikrocontroller.net/articles/IRMP_auf_STM32_-_Bauanleitung&lt;br /&gt;
&lt;br /&gt;
=== Seminar Paper - Extension of Arduino Platform ===&lt;br /&gt;
&lt;br /&gt;
* www.eislab.fim.uni-passau.de/files/publications/2010/StudentDiener_ErweiterungDerArduinoPlattform.pdf&lt;br /&gt;
&lt;br /&gt;
== Acknowledgment ==&lt;br /&gt;
&lt;br /&gt;
I thank Vlad Tepesch, Klaus Leidinger, Peter K., and Dániel Körmendi, who sent me many scan files of their IR remote controls.&lt;br /&gt;
&lt;br /&gt;
I thank Christian F. for his tipps relating to the port to PIC MCUs, gera for the port to PIC-C18 compiler, kichi (Michael K.) for the port to ARM STM32, Markus Schuster for the port to TI&#039;s Stellaris LM4F120 Launchpad (ARM Cortex M4), Matthias Frank for the port to XMega, Wolfgang S. for the port to ESP8266, Achill Hasler for the port to Teensy, Axel Schwenke for the port to STM8.&lt;br /&gt;
&lt;br /&gt;
Thanks to Dániel Körmendi, who added the LG-AIR protocol to [[IRSND_-_english|IRSND]]. Thanks to Ulrich v.d. Kammer for the Pentax protocol extension in [[IRSND_-_english|IRSND]].&lt;br /&gt;
&lt;br /&gt;
At least I will thank Jojo S. for his great job translating this documentation!&lt;br /&gt;
&lt;br /&gt;
== Discussion ==&lt;br /&gt;
&lt;br /&gt;
You can discuss IRMP &amp;amp; IRSND in the German thread [http://www.mikrocontroller.net/topic/162119 Infrared Multi Protocol Decoder].&lt;br /&gt;
&lt;br /&gt;
Have fun with IRMP!&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Infrarot]]&lt;br /&gt;
[[Kategorie:AVR-Projekte]]&lt;/div&gt;</summary>
		<author><name>Tooki</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=IRMP_-_english&amp;diff=106079</id>
		<title>IRMP - english</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=IRMP_-_english&amp;diff=106079"/>
		<updated>2023-04-26T08:17:46Z</updated>

		<summary type="html">&lt;p&gt;Tooki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;By &#039;&#039;&#039;Frank M. ([http://www.mikrocontroller.net/user/show/ukw ukw])&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;This is the English translation of the [[IRMP#top|German IRMP documentation]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[[Datei:irmp-title.png| |Waveform of an NEC-format remote control signal]]&lt;br /&gt;
&lt;br /&gt;
Project Intent:&lt;br /&gt;
&lt;br /&gt;
Because RC5 is not only outdated, but obsolete, and because more and more electronic devices from Asian consumer electronics manufacturers are found in the home, it is time to develop an IR decoder that can &#039;understand&#039; about 90% of IR remotes that are used in our daily life.&lt;br /&gt;
&lt;br /&gt;
This article introduces &#039;IRMP&#039; as &amp;quot;Infrared Multi Protocol Decoder&amp;quot; in detail. The counterpart, the [[IRSND_-_english|IRSND]] IR encoder, can be found in this [[IRSND_-_english|document]].&lt;br /&gt;
&lt;br /&gt;
= IRMP - Infrared Multi Protocol Decoder =&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width: 80%;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 20%;&amp;quot; |&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
=== Supported MCUs ===&lt;br /&gt;
&lt;br /&gt;
[[IRMP_-_english#top|IRMP]] runs on numerous MCU families:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AVR&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* ATtiny87,  ATtiny167&lt;br /&gt;
* ATtiny45,  ATtiny85&lt;br /&gt;
* ATtiny44,  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;
&#039;&#039;&#039;XMega&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* ATXmega128&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC&#039;&#039;&#039; (CCS and XC8/C18 compiler)&lt;br /&gt;
&lt;br /&gt;
* PIC12F1840&lt;br /&gt;
* PIC18F4520&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;STM32&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* STM32F4xx (tested on STM32F401RE/F411RE Nucleo, STM32F4 Discovery)&lt;br /&gt;
* STM32F10x (tested on STM32F103C8T6 Mini Development Board)&lt;br /&gt;
* STM32 with HAL library &#039;&#039;&#039;(NEW!)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;STM8&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* STM8S103F3&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TI Stellaris&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* LM4F120 Launchpad (ARM Cortex M4)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ESP8266 (NEW!)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* ESP8266-EVB&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TEENSY 3.0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* MK20DX256VLH7 (ARM Cortex-M4 72MHz)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MBED (NEW!)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* LPC1347 Cortex-M3 72 MHz&lt;br /&gt;
* LPC4088 (Embedded Artists)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ChibiOS HAL (NEW!)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Various ARM Cortex MCUss, for example STM32, Kinetis, and NRF5&lt;br /&gt;
* [https://sourceforge.net/p/chibios/svn2/HEAD/tree/trunk/os/hal/ports/ Officially supported MCU series]&lt;br /&gt;
* [https://github.com/ChibiOS/ChibiOS-Contrib/tree/master/os/hal/ports More MCU series, community supported]&lt;br /&gt;
||&lt;br /&gt;
[[Datei:irmp-empfaenger.png|miniatur|Connection of a IR receiver module to MCU]]&lt;br /&gt;
|}&lt;br /&gt;
=== Supported IR Protocols ===&lt;br /&gt;
&lt;br /&gt;
[[IRMP_-_english#top|IRMP]] - the infrared remote decoder, which can decode several protocols at once - is capable of decoding the following protocols (in alphabetical order):&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|+ &#039;&#039;&#039;Supported Protocols&#039;&#039;&#039;&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! style=&amp;quot;width:15%&amp;quot; | Protocol || Vendor&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#A1TVBOX|A1TVBOX]] || ADB (Advanced Digital Broadcast), e.g. A1 TV Box&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#APPLE|APPLE]] || Apple&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#ACP24|ACP24]] || Stiebel Eltron&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#B&amp;amp;O|B&amp;amp;O]] || Bang &amp;amp; Olufsen&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#BOSE|BOSE]] || Bose&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#DENON|DENON]] || Denon, Sharp&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#FAN|FAN]] || FAN, remote for fans&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#FDC|FDC]] || FDC Keyboard&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#GRUNDIG_+_NOKIA|GRUNDIG]] || Grundig&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#GRUNDIG_+_NOKIA|NOKIA]] || Nokia, e.g. D-Box&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#IR60 (SDA2008)|IR60 (SDA2008)]] || various European vendors&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#JVC|JVC]] || JVC&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#KASEIKYO|KASEIKYO]] || Panasonic, Technics, Denon and other vendors which are members of the Japanese &amp;quot;Association for Electric Home Appliances&amp;quot; (AEHA).&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#KATHREIN|KATHREIN]]  || KATHREIN&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#LEGO|LEGO]]   || Lego&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#LGAIR|LGAIR]]   || LG air conditioners&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#MATSUSHITA|MATSUSHITA]] || Matsushita&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#MITSU_HEAVY|MITSU_HEAVY]] || Mitsubishi air conditioners&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#NEC16|NEC16]]  || JVC, Daewoo&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#NEC42|NEC42]]  || JVC&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#MERLIN|MERLIN]]  || MERLIN remote (Pollin article number: 620 185)&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#NEC_+_extended_NEC|NEC]] || NEC, Yamaha, Canon, Tevion, Harman/Kardon, Hitachi, JVC, Pioneer, Toshiba, Xoro, Orion, generic and many other Asian vendors.&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#NETBOX|NETBOX]]  || Netbox&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#Nikon|Nikon]] || Nikon&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#NUBERT|NUBERT]] || Nubert, e.g. Subwoofer Systems&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#ORTEK|ORTEK]] || Ortek, Hama&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#PANASONIC|PANASONIC]] || PANASONIC video projectors&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#PENTAX|PENTAX]] || PENTAX&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#RC5_+_RC5X|RC5]] || Philips and other European vendors&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#RC6_+_RC6A|RC6A]] || Philips, Kathrein and others, e.g. XBOX&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#RC6_+_RC6A|RC6]] || Philips and other European vendors&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#RCCAR|RCCAR]] || RC Car: IR remote for RC toys &lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#RCII|RCII]] || T+A &#039;&#039;&#039;(NEW!)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#RECS80|RECS80]] || Philips, Nokia, Thomson, Nordmende, Telefunken, Saba&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#RECS80EXT|RECS80EXT]] || Philips, Technisat, Thomson, Nordmende, Telefunken, Saba&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#RCMM|RCMM]] || Fujitsu-Siemens e.g. Activy keyboard&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#ROOMBA|ROOMBA]] || iRobot Roomba vacuum cleaner&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#S100|S100]] || similar to RC5, but 14 instead of 13 bits and 56kHz modulation. Vendor unknown.&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#SAMSUNG32|SAMSUNG32]] || Samsung&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#SAMSUNG48|SAMSUNG48]] || various air conditioners&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#SAMSUNG|SAMSUNG]] || Samsung&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#SIEMENS_+_RUWIDO|RUWIDO]] || RUWIDO (e.g. T-Home Media Receiver, MERLIN keyboard(Pollin))&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#SIEMENS_+_RUWIDO|SIEMENS]] || Siemens, e.g. Gigaset M740AV&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#SIRCS|SIRCS]] || Sony&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#SPEAKER|SPEAKER]] || Speaker systems like X-Tensions&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#TECHNICS|TECHNICS]] || Technics&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#TELEFUNKEN|TELEFUNKEN]] || Telefunken&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#THOMSON|THOMSON]] || Thomson&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#VINCENT|VINCENT]] || Vincent&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#FF0000&amp;quot;&amp;gt;&#039;&#039;&#039;New:&#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Starting with version 3.2, IRMP can also decode 433 MHz RF radio protocols.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|+ &#039;&#039;&#039;Supported RF Protocols&#039;&#039;&#039;&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! style=&amp;quot;width:15%&amp;quot; | Protocol&lt;br /&gt;
! style=&amp;quot;width:100em&amp;quot; | Vendor&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP#RF_GEN24|RF_GEN24]] || Generiv 24-bit format, e.g. Pollin 550666 radio-controlled receptacle&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP#RF_X10|RF_X10]] || X10 PC RF remote control (Medion), Pollin 721815&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Each of these protocols can be activated separately. If you want, you can activate all protocols. If you need only one protocol, you can disable all others. Only the code selected by the user will be compiled .&lt;br /&gt;
&lt;br /&gt;
=== History ===&lt;br /&gt;
&lt;br /&gt;
The [[IRMP_-_english#top|IRMP]] source for the AVR and PIC MCUs was created as part of the [[Word Clock]] project.&lt;br /&gt;
&lt;br /&gt;
=== Thread in Forum ===&lt;br /&gt;
&lt;br /&gt;
Intention for an own IRMP article is the following thread in Projects&amp;amp;Code [http://www.mikrocontroller.net/topic/162119 IRMP - Infrared Multi Protocol Decoder] (in German language).&lt;br /&gt;
&lt;br /&gt;
== IR Protocols ==&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width: 80%;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 20%;&amp;quot; |&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
Some vendors use their own proprietary protocols, such as Sony, Samsung, and Matsushita. Philips developed and used [[IRMP_-_english#RC5 + RC5X|RC5]].&lt;br /&gt;
[[IRMP_-_english#RC5 + RC5X|RC5]] was seen in Europe as &#039;&#039;the&#039;&#039; standard IR protocol which was adopted by many European vendors. Nowadays [[IRMP_-_english#RC5 + RC5X|RC5]] is practically not used and can be considered &amp;quot;dead&amp;quot;. Although the successor [[IRMP_-_english#RC6_+_RC6A|RC6]] is used in current European hardware, it is also used rarely.&lt;br /&gt;
&lt;br /&gt;
Japanese vendors also tried to establish their own standard, the so called [[IRMP_-_english#KASEIKYO|Kaseikyo]] (or &amp;quot;Japan&amp;quot;) protocol. With a word length of 48 bits, it is more versatile. But it has not found wide use, though it is found in some appliances.&lt;br /&gt;
&lt;br /&gt;
Nowadays the [[IRMP_-_english#NEC_+_extended_NEC|NEC]] protocol is used (also mainly in Japanese devices) in both premium and generic products. I estimate the market share at 80% for the [[IRMP_-_english#NEC_+_extended_NEC|NEC]] protocol. Nearly all remotes in my daily use utilize the [[IRMP_-_english#NEC_+_extended_NEC|NEC]] IR code. This starts with the TV set, continues with the DVD player and the notebook remote all the way to the generic multimedia hard drive, just to mention a few examples.&lt;br /&gt;
||&lt;br /&gt;
[[Datei:nec-protocol.png|miniatur|NEC protocol, RGB remote control, T-&amp;gt;A: 9.14ms, A-&amp;gt;B: 4.42ms, B-&amp;gt;C: 660us]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Coding methods ==&lt;br /&gt;
&lt;br /&gt;
[[IRMP_-_english#top|IRMP]] supports the following IR coding methods:&lt;br /&gt;
&lt;br /&gt;
* [[IRMP_-_english#Pulse Distance|Pulse Distance]], typ. Example: [[IRMP_-_english#NEC_+_extended_NEC|NEC]]&lt;br /&gt;
* [[IRMP_-_english#Pulse Width|Pulse Width]], typ. Example: [[IRMP_-_english#SIRCS|Sony SIRCS]]&lt;br /&gt;
* [[IRMP_-_english#Biphase|Biphase (Manchester)]], typ. Example: Philips [[IRMP_-_english#RC5_+_RC5X|RC5]], [[IRMP_-_english#RC6_+_RC6A|RC6]]&lt;br /&gt;
* [[IRMP_-_english#Pulse Position|Pulse Position (NRZ)]], typ. Example: [[IRMP_-_english#NETBOX|Netbox]]&lt;br /&gt;
* [[IRMP_-_english#Pulse Distance Width|Pulse Distance Width]], typ. Example: [[IRMP_-_english#NUBERT|Nubert]]&lt;br /&gt;
&lt;br /&gt;
The pulses are modulated - usually at 36 kHz or 38 kHz - to reduce environmental influences such as indoor lighting or sunlight.&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width: 80%;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 20%;&amp;quot; |&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
=== Pulse Distance ===&lt;br /&gt;
&lt;br /&gt;
Pulse distance coding can be identified by the following rule:&lt;br /&gt;
&lt;br /&gt;
* there is only &#039;&#039;&#039;one pulse length&#039;&#039;&#039; and there are &#039;&#039;&#039;two different space lengths&#039;&#039;&#039;&lt;br /&gt;
||&lt;br /&gt;
[[Datei:Pulse-Distance.png|miniatur|Pulse distance coding]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width: 80%;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 20%;&amp;quot; |&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
=== Pulse Width ===&lt;br /&gt;
&lt;br /&gt;
Pulse width coding can be identified by the following rule: &lt;br /&gt;
&lt;br /&gt;
* there are &#039;&#039;&#039;two different pulse lengths&#039;&#039;&#039; and &#039;&#039;&#039;only one space length&#039;&#039;&#039;&lt;br /&gt;
||&lt;br /&gt;
[[Datei:Pulse-Width.png|miniatur|Pulse width coding]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width: 80%;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 20%;&amp;quot; |&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
=== Pulse Distance Width ===&lt;br /&gt;
&lt;br /&gt;
This is a mix of pulse distance and pulse width coding. Often the sum of pulse and space length is constant. The rule is:&lt;br /&gt;
&lt;br /&gt;
* there are &#039;&#039;&#039;two different pulse lengths&#039;&#039;&#039; and &#039;&#039;&#039;two different space lengths.&#039;&#039;&#039;&lt;br /&gt;
||&lt;br /&gt;
[[Datei:Pulse-Distance-Width.png|miniatur|Pulse distance width coding]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width: 80%;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 20%;&amp;quot; |&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
=== Biphase ===&lt;br /&gt;
&lt;br /&gt;
In biphase coding the order of pulse and space gives the bit value.&lt;br /&gt;
Therefore a biphase boding can be identified by this criteria:&lt;br /&gt;
&lt;br /&gt;
* there is exactly &#039;&#039;&#039;one&#039;&#039;&#039; pulse and space length, as well as the &#039;&#039;&#039;double&#039;&#039;&#039; pulse/space length&lt;br /&gt;
&lt;br /&gt;
Usually the length for the pulse and space are equal, meaning that the signal shape is symmetric. But IRMP also recognizes protocols which use different pulse and space lengths, for example the [[IRMP_-_english#A1TVBOX|A1TVBOX]] protocol.&lt;br /&gt;
||&lt;br /&gt;
[[Datei:Biphase-Coding.png|miniatur|Biphase coding]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width: 80%;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 20%;&amp;quot; |&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
=== Pulse Position ===&lt;br /&gt;
&lt;br /&gt;
Pulse position coding is known from commmon UARTs. Here, every bit has a fixed length. Depending on the value (0 or 1), it is a pulse or a space.&lt;br /&gt;
&lt;br /&gt;
Typical criteria for a &#039;&#039;&#039;pulse position protocol&#039;&#039;&#039; are:&lt;br /&gt;
* there are &#039;&#039;&#039;multiples&#039;&#039;&#039; of a basic pulse/space length&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A tabular listing of different IR protocols can be found here: [[IRMP_-_english#IR_Protocols_in_Detail|IR Protocols in Detail]].&#039;&#039;&#039;&lt;br /&gt;
The specified timings are typical values. In some remotes they differ up to 40% in real life. Therefore [[IRMP_-_english#top|IRMP]] uses minimum/maximum limits to be tolerant with the timing.&lt;br /&gt;
||&lt;br /&gt;
[[Datei:Pulse-Position.png|miniatur|Pulse position coding]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Protocol Detection ==&lt;br /&gt;
&lt;br /&gt;
Most of the protocols [[IRMP_-_english#top|IRMP]] decodes have something in common: they exhibit a start bit whose timing is unique.&lt;br /&gt;
&lt;br /&gt;
According to this start bit timing, most protocols can be identified. [[IRMP_-_english#top|IRMP]] measures the timing of the start bit and adjusts its timing tables &amp;quot;on-the-fly&amp;quot; to the discovered protocol. Subsequent bits can then be read sequentially without the need to first store a complete frame.&lt;br /&gt;
Thus, [[IRMP_-_english#top|IRMP]] does not wait to read a complete frame but starts decoding directly after detecting the first pulse.&lt;br /&gt;
&lt;br /&gt;
If the start bit is not unique, [[IRMP_-_english#top|IRMP]] proceeds in parallel with multiple possible protocols. For example with two candidate protocols, once plausible reasons disqualify one protocol, the other protocol is used.&lt;br /&gt;
&lt;br /&gt;
Detection is implemented as an interrupt-driven [[Statemachine|state machine]] which is called at a frequency of typically 15000 times per second. Among others, the [[Statemachine|state machine]] has the following states:&lt;br /&gt;
&lt;br /&gt;
* detect the first pulse length of the start bit&lt;br /&gt;
* detect the space length of the start bit&lt;br /&gt;
* detect the space length of the first data bit&lt;br /&gt;
&lt;br /&gt;
After that, the pulse and space lengths of the start bit are known. Now all enabled protocols are searched for these lengths. If a protocol matches, the timing table for this protocol is loaded. Subsequent bits are checked against the timing table to ensure they conform to it.&lt;br /&gt;
&lt;br /&gt;
The [[Statemachine|state machine]] continues with the following states:&lt;br /&gt;
&lt;br /&gt;
* detect the spaces of the data bits&lt;br /&gt;
* detect the pulse length of the data bits&lt;br /&gt;
* check timing. If different, switch back to another valid IR protocol, otherwise return&lt;br /&gt;
* detect the stop bit, if present in the protocol&lt;br /&gt;
* check data for plausibility, like CRC or other redundancy bits&lt;br /&gt;
* convert data to device address and command&lt;br /&gt;
* detect code repetition by long key press, set corresponding flag&lt;br /&gt;
&lt;br /&gt;
Indeed the [[Statemachine|state machine]] is even more complex because some protocols have no start bit (e.g. [[IRMP_-_english#DENON|Denon]]) or have multiple start bits (4 in [[IRMP_-_english#B.26O|B&amp;amp;O]]) or have another sync bit within the frame (e.g. [[IRMP_-_english#SAMSUNG|Samsung]]). These extra conditions are caught in the code by protocol-specific &amp;quot;special cases&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Switching to an other protocol can happen multiple times while receiving a frame, e.g. from [[IRMP_-_english#NEC42|NEC42]] (42 bits) to [[IRMP_-_english#NEC16|NEC16]] (8 bits + sync bit + 8 bits), if a premature sync bit is detected. Or from [[IRMP_-_english#NEC + extended NEC|NEC]]/[[IRMP_-_english#NEC42|NEC42]] (32/42 bits) to [[IRMP_-_english#JVC|JVC]] (16 bits) if the stop bit occurs prematurely. It becomes difficult when, after detecting the start bit, two possible protocols use different coding methods, e.g. when the one protocol uses [[IRMP_-_english#Pulse Distance|pulse distance coding]] and the other uses [[IRMP_-_english#Biphase|biphase coding (Manchester)]]. In this case [[IRMP_-_english#top|IRMP]] stores the necessary bits for both coding methods and later discards one or the other.&lt;br /&gt;
&lt;br /&gt;
Furthermore, some remotes using particular protocols transmit repeat frames, either for redundancy (error detection) or for long key presses. Both kinds are detected by IRMP: error detection frames are detected by IRMP, but not passed to the application. Others are detected as long key presses and flagged by IRMP.&lt;br /&gt;
&lt;br /&gt;
== Download ==&lt;br /&gt;
&lt;br /&gt;
Version 3.2.6, Date: 2021-01-27&lt;br /&gt;
&lt;br /&gt;
Download stable version: [http://www.mikrocontroller.net/wikifiles/7/79/Irmp.zip Irmp.zip] &lt;br /&gt;
&lt;br /&gt;
Current development version of [[IRMP_-_english#top|IRMP]] &amp;amp; [[IRSND_-_english|IRSND]]:&lt;br /&gt;
&lt;br /&gt;
* SVN link: [svn://mikrocontroller.net/irmp/ SVN]&lt;br /&gt;
* SVN browser: [http://www.mikrocontroller.net/svnbrowser/irmp/ IRMP in SVN]&lt;br /&gt;
* Download tarball: [http://www.mikrocontroller.net/svnbrowser/irmp/?view=tar Tarball].&lt;br /&gt;
&lt;br /&gt;
Download Arduino library: [https://github.com/ukw100/IRMP GitHub] or use Arduino &amp;quot;&#039;&#039;Tools / Manage Libraries...&#039;&#039;&amp;quot; and search for IRMP.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;You can see the history of the software changes here: [[IRMP_-_english#Software_History|Software History]]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== License ==&lt;br /&gt;
&lt;br /&gt;
IRMP is Open Source Software and is released under the [https://www.gnu.org/licenses/old-licenses/gpl-2.0.html GPL v2], or&lt;br /&gt;
(at your option) any later version.&lt;br /&gt;
&lt;br /&gt;
== Source Code ==&lt;br /&gt;
&lt;br /&gt;
The source code can be easily compiled for AVR MCUs by loading the project file irmp.aps in AVR Studio 4.&lt;br /&gt;
&lt;br /&gt;
For other development environments it is simple to create a project or makefile. The source includes:&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmp.c?view=markup irmp.c] - IR decoder core&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmpprotocols.h?view=markup irmpprotocols.h] - all protocol definitions&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmpsystem.h?view=markup irmpsystem.h] - target-independent definitions for AVR/PIC/STM32&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmp.h?view=markup irmp.h] - include file for the application&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmpconfig.h?view=markup irmpconfig.h] - user configuration&lt;br /&gt;
&lt;br /&gt;
Sample applications (main functions and timer configurations):&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-avr.c?view=markup irmp-main-avr.c] - AVR&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-avr-uart.c?view=markup irmp-main-avr-uart.c] - AVR with UART output&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-pic-xc8.c?view=markup irmp-main-pic-xc8.c] - PIC18F4520&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-pic-12F1840.c?view=markup irmp-main-pic-12F1840.c] - PIC12F1840&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-stm32.c?view=markup irmp-main-stm32.c] - STM32&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-stellaris-arm.c?view=markup irmp-main-stellaris-arm.c] - TI Stellaris LM4F120 Launchpad&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-esp8266.c?view=markup irmp-main-esp8266.c] - ESP8266&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-mbed.cpp?view=markup irmp-main-mbed.cpp] - MBED&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/examples/Arduino/Arduino.ino?view=markup examples/Arduino/Arduino.ino] - Teensy 3.x&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-chibios.c?view=markup irmp-main-chibios.c] - ChibiOS&lt;br /&gt;
&lt;br /&gt;
{{Warnung|&lt;br /&gt;
;Important: include only irmp.h in your application:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;irmp.h&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
All other include files are included within irmp.h. See also the sample application irmp-main-avr.c.&lt;br /&gt;
&lt;br /&gt;
Furthermore, the preprocessor constant &#039;&#039;&#039;F_CPU in project or makefile&#039;&#039;&#039; must be defined. This should have at least the value of 8000000UL, processor speed should be at least 8 MHz. This applies to AVR targets and not for MCUs with PLL. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[IRMP_-_english#top|IRMP]] also runs on PIC processors. For the PIC-CCS compiler the necessary preprocessor defines are already set, such that [http://www.mikrocontroller.net/svnbrowser/irmp/irmp.c?view=markup irmp.c] can be directly used in the CCS environment. Only a short interrupt service routine like &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
must be added. The interrupt period time must be set to 66 µs (15 kHz).&lt;br /&gt;
&lt;br /&gt;
For AVR processors you will find an example for the usage of [[IRMP_-_english#top|IRMP]] in [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-avr.c?view=markup irmp-main-avr.c]. The main things are the [[AVR-GCC-Tutorial/Die_Timer_und_Zähler_des_AVR|Timer]] initializing of the timer and the processing of received IR commands. The received protocol, the device address and the command will be output on the HW-UART.&lt;br /&gt;
&lt;br /&gt;
For the Stellaris LM4F120 Launchpad from TI (ARM Cortex M4) is a propriate timer init function already integrated in [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-avr.c?view=markup irmp-main-avr.c].&lt;br /&gt;
&lt;br /&gt;
[[IRMP_-_english#top|IRMP]] can be used also with STM32 microcontrollers.&lt;br /&gt;
&lt;br /&gt;
Another new implementation is available on the mbed platform.&lt;br /&gt;
&lt;br /&gt;
=== avr-gcc Optimizations ===&lt;br /&gt;
&lt;br /&gt;
From version 4.7.x of avr-gcc, the [https://gcc.gnu.org/onlinedocs/gccint/LTO.html#LTO LTO option] can be used to make the call of the external function irmp_ISR() from the main ISR more efficient. This improves the performance of the ISR a little.&lt;br /&gt;
&lt;br /&gt;
Add the following compiler and linker options:&lt;br /&gt;
&lt;br /&gt;
* additional compiler option: -flto&lt;br /&gt;
* additional linker options: -flto -Os&lt;br /&gt;
&lt;br /&gt;
If you forget the additional linker option -Os, the binary will be significantly larger as it will not be optimized further. Also, the option -flto must be passed to the linker, otherwise link time optimization will not work.&lt;br /&gt;
&lt;br /&gt;
=== Configuration ===&lt;br /&gt;
&lt;br /&gt;
[[IRMP_-_english#top|IRMP]] is configured by parameters in  [http://www.mikrocontroller.net/svnbrowser/irmp/irmpconfig.h?view=markup irmpconfig.h]:&lt;br /&gt;
&lt;br /&gt;
* [[IRMP_-_english#F_INTERRUPTS|number of interrupts per second]]&lt;br /&gt;
* [[IRMP_-_english#IRMP_SUPPORT_xxx_PROTOCOL|supported IR protocols]]&lt;br /&gt;
* [[IRMP_-_english#IRMP_PORT_LETTER + IRMP_BIT_NUMBER|hardware pin for IR receiver]]&lt;br /&gt;
* [[IRMP_-_english#IRMP_LOGGING|IR logging]]&lt;br /&gt;
&lt;br /&gt;
=== Settings in irmpconfig.h ===&lt;br /&gt;
&lt;br /&gt;
[[IRMP_-_english#top|IRMP]] will decode all protocols listed above in one ISR. For this, some settings are needed. These are set in [http://www.mikrocontroller.net/svnbrowser/irmp/irmpconfig.h?view=markup irmpconfig.h].&lt;br /&gt;
&lt;br /&gt;
==== F_INTERRUPTS ====&lt;br /&gt;
&lt;br /&gt;
Number of interrupts per second. Should be set to a value from 10000 to 20000. The higher the value, the better the resolution and therefore the quality of detection. But a higher interrupt rate means also higher CPU load. A value of 15000 is usually a good compromise.&lt;br /&gt;
&lt;br /&gt;
Default value:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
#define F_INTERRUPTS                            15000      // interrupts per second&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On AVR controllers, the [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-avr.c?view=markup irmp-main-avr.c] example uses Timer1 with 16 bits of resolution. If for any reasons Timer1 is not available, you can also use Timer2 with 8 bits of resolution.&lt;br /&gt;
&lt;br /&gt;
In that case, configure Timer2 as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
OCR2   =  (uint8_t) ((F_CPU / F_INTERRUPTS) / 8) - 1 + 0.5);   // Compare Register OCR2&lt;br /&gt;
TCCR2  = (1 &amp;lt;&amp;lt; WGM21) | (1 &amp;lt;&amp;lt; CS21);                           // CTC Mode, prescaler = 8&lt;br /&gt;
TIMSK  = 1 &amp;lt;&amp;lt; OCIE2;                                           // enable Timer2 interrupt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The above example is valid for ATmega88/ATmega168/ATmega328. For other AVR MCUs check the datasheet.&lt;br /&gt;
&lt;br /&gt;
You must not forget to change the ISR to Timer2 as well:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
ISR(TIMER2_COMP_vect)&lt;br /&gt;
{&lt;br /&gt;
  (void) irmp_ISR(); &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== IRMP_SUPPORT_xxx_PROTOCOL ====&lt;br /&gt;
&lt;br /&gt;
Here you can select which protocols to enable in [[IRMP_-_english#top|IRMP]]. Common protocols are emabled by default.&lt;br /&gt;
&lt;br /&gt;
To enable additional protocols or disable others to save memory, set the corresponding values in [http://www.mikrocontroller.net/svnbrowser/irmp/irmpconfig.h?view=markup irmpconfig.h].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&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;
&lt;br /&gt;
// more protocols, enable here!                 Enable  Remarks                 F_INTERRUPTS            Program Space&lt;br /&gt;
#define IRMP_SUPPORT_DENON_PROTOCOL             0       // DENON, Sharp         &amp;gt;= 10000                 ~250 bytes&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 (SDA2008)       &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_BOSE_PROTOCOL              0       // BOSE                 &amp;gt;= 10000                 ~150 bytes&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_ORTEK_PROTOCOL             0       // ORTEK (Hama)         &amp;gt;= 10000                 ~150 bytes&lt;br /&gt;
#define IRMP_SUPPORT_TELEFUNKEN_PROTOCOL        0       // Telefunken 1560      &amp;gt;= 10000                 ~150 bytes&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_ROOMBA_PROTOCOL            0       // iRobot Roomba        &amp;gt;= 10000                 ~150 bytes&lt;br /&gt;
#define IRMP_SUPPORT_RUWIDO_PROTOCOL            0       // RUWIDO, T-Home       &amp;gt;= 15000                 ~550 bytes&lt;br /&gt;
#define IRMP_SUPPORT_A1TVBOX_PROTOCOL           0       // A1 TV BOX            &amp;gt;= 15000 (better 20000)  ~300 bytes&lt;br /&gt;
#define IRMP_SUPPORT_LEGO_PROTOCOL              0       // LEGO Power RC        &amp;gt;= 20000                 ~150 bytes&lt;br /&gt;
#define IRMP_SUPPORT_RCMM_PROTOCOL              0       // RCMM 12, 24, or 32    &amp;gt;= 20000                 ~150 bytes&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each [[IRMP_-_english#top|IRMP]] supported IR protocol consumes the noted amount of code. Here you can apply optimizations: for example, the modulation frequency of 455 kHz for the [[IRMP_-_english#B&amp;amp;O|B&amp;amp;O]] protocol is far away from the frequencies that are used by other protocols. This usually requires a different IR receiver, so without that, you can disable these protocols. For example, you cannot receive the [[IRMP_-_english#B&amp;amp;O|B&amp;amp;O]] protocol (455kHz) with a TSOP1738/TSOP31238.&lt;br /&gt;
&lt;br /&gt;
Additionally, the [[IRMP_-_english#SIEMENS_+_RUWIDO|SIEMENS]]/[[IRMP_-_english#FDC|FDC]]/[[IRMP_-_english#RCCAR|RCCAR]] can only be detected reliably at a frequency of 15 kHz or higher. For [[IRMP_-_english#LEGO|LEGO]], 20 kHz is needed. To use these protocols, you must modify [[IRMP_-_english#F_INTERRUPTS|F_INTERRUPTS]]. Otherwise, during compilation you will get a warning and the corresponding protocols will automatically be disabled.&lt;br /&gt;
&lt;br /&gt;
==== IRMP_PORT_LETTER + IRMP_BIT_NUMBER ====&lt;br /&gt;
&lt;br /&gt;
This constant defines the pin where the IR receiver is connected.&lt;br /&gt;
&lt;br /&gt;
Default value is PORT B6:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
/*---------------------------------------------------------------------------&lt;br /&gt;
 * Change hardware pin here for ATMEL AVR&lt;br /&gt;
 *---------------------------------------------------------------------------&lt;br /&gt;
 */&lt;br /&gt;
#if defined (ATMEL_AVR)                         // use PB6 as IR input on AVR&lt;br /&gt;
#  define IRMP_PORT_LETTER                      B&lt;br /&gt;
#  define IRMP_BIT_NUMBER                       6&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These two values must match your hardware configuration.&lt;br /&gt;
&lt;br /&gt;
This applies also to STM32 MCUs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
/*----------------------------------------------------------------------------&lt;br /&gt;
 * Change hardware pin here for ARM STM32&lt;br /&gt;
 *----------------------------------------------------------------------------&lt;br /&gt;
 */&lt;br /&gt;
#elif defined (ARM_STM32)                       // use C13 as IR input on STM32&lt;br /&gt;
#  define IRMP_PORT_LETTER                      C&lt;br /&gt;
#  define IRMP_BIT_NUMBER                       13&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When using STM32 HAL library, define the constants IRSND_Transmit_GPIO_Port and IRSND_Transmit_Pin in STM32Cube (Main.h). In this case, it is not necessary to change the constants in irmpconfig.h:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
/*---------------------------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
 * ARM STM32 with HAL section - don&#039;t change here, define IRSND_Transmit_GPIO_Port &amp;amp; IRSND_Transmit_Pin in STM32Cube (Main.h)&lt;br /&gt;
 *---------------------------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
 */&lt;br /&gt;
#elif defined (ARM_STM32_HAL)                                           // IRSND_Transmit_GPIO_Port &amp;amp; IRSND_Transmit_Pin must be defined in STM32Cube&lt;br /&gt;
#  define IRSND_PORT_LETTER                     IRSND_Transmit_GPIO_Port//Port of Transmit PWM Pin e.g.&lt;br /&gt;
#  define IRSND_BIT_NUMBER                      IRSND_Transmit_Pin      //Pim of Transmit PWM Pin e.g.&lt;br /&gt;
#  define IRSND_TIMER_HANDLER                   htim2                   //Handler of Timer e.g. htim (see tim.h)&lt;br /&gt;
#  define IRSND_TIMER_CHANNEL_NUMBER            TIM_CHANNEL_2           //Channel of the used Timer PWM Pin e.g. TIM_CHANNEL_2&lt;br /&gt;
#  define IRSND_TIMER_SPEED_APBX                64000000                //Speed of the corresponding APBx. (see STM32CubeMX: Clock Configuration)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And the corresponding section for STM8 MCUs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
/*----------------------------------------------------------------------------&lt;br /&gt;
 * Change hardware pin here for STM8&lt;br /&gt;
 *----------------------------------------------------------------------------&lt;br /&gt;
 */&lt;br /&gt;
#elif defined (SDCC_STM8)                       // use PA1 as IR input on STM8&lt;br /&gt;
#  define IRMP_PORT_LETTER                      A&lt;br /&gt;
#  define IRMP_BIT_NUMBER                       1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For PIC microcontrollers only the constant &#039;&#039;&#039;IRMP_PIN&#039;&#039;&#039; needs to be changed - depending on the compiler:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
/*----------------------------------------------------------------------------&lt;br /&gt;
 * Change hardware pin here for PIC C18 compiler&lt;br /&gt;
 *----------------------------------------------------------------------------&lt;br /&gt;
 */&lt;br /&gt;
#elif defined (PIC_C18)                         // use RB4 as IR input on PIC&lt;br /&gt;
#  define IRMP_PIN                              PORTBbits.RB4&lt;br /&gt;
&lt;br /&gt;
/*----------------------------------------------------------------------------&lt;br /&gt;
 * Change hardware pin here for PIC CCS compiler&lt;br /&gt;
 *----------------------------------------------------------------------------&lt;br /&gt;
 */&lt;br /&gt;
#elif defined (PIC_CCS)                         // use PB4 as IR input on PIC&lt;br /&gt;
#  define IRMP_PIN                              PIN_B4&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When using ChibiOS HAL, define a pin with the name &#039;&#039;&#039;IR_IN&#039;&#039;&#039; in your board config (board.chcfg) of ChibiOS and regenerate the board files. To use another name for the pin, edit the constant &#039;&#039;&#039;IRMP_PIN&#039;&#039;&#039; in irmpconfig.h. Use the name of the pin from the board config and prefix it with &amp;quot;LINE_&amp;quot;, as IRMP is using the &amp;quot;line&amp;quot; variant of the PAL interface:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
/*---------------------------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
 * Change hardware pin here for ChibiOS HAL&lt;br /&gt;
 *---------------------------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
 */&lt;br /&gt;
#elif defined(_CHIBIOS_HAL_)&lt;br /&gt;
#  define IRMP_PIN                              LINE_IR_IN              // use pin names as defined in the board config file, prefixed with &amp;quot;LINE_&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== IRMP_HIGH_ACTIVE ====&lt;br /&gt;
&lt;br /&gt;
Default value:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
#  define IRMP_HIGH_ACTIVE                      0                       // set to 1 if you use a RF receiver!&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Most RF receivers use active-high signals, so when using an RF receiver instead of an IR sensor, set this value to 1.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#FF0000&amp;quot;&amp;gt;&#039;&#039;&#039;NEU:&#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== IRMP_ENABLE_RELEASE_DETECTION ====&lt;br /&gt;
&lt;br /&gt;
Default value:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
#  define IRMP_ENABLE_RELEASE_DETECTION         0                       //  enable detection of key releases&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Set this value to 1 to enable detection of button release events. The function irmp_get_data() then sets the IRMP_FLAG_RELEASE bit in the struct member irmp_data.flags once code transmission ends. See the example in the section  &#039;&#039;&#039;[[IRMP_-_english#Debouncing|Debouncing]]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== IRMP_USE_CALLBACK ====&lt;br /&gt;
&lt;br /&gt;
Default value:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
#define IRMP_USE_CALLBACK                      0        // flag: 0 = don&#039;t use callbacks, 1 = use callbacks, default is 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When you turn on callbacks, any level change at the input causes the callback function to be called. This can be used to visualize incoming IR signals by driving another output pin.&lt;br /&gt;
&lt;br /&gt;
Here is an example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
#define LED_PORT PORTD                                  // LED at PD6&lt;br /&gt;
#define LED_DDR  DDRD&lt;br /&gt;
#define LED_PIN  6&lt;br /&gt;
&lt;br /&gt;
/*-----------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
 * Called (back) from IRMP module&lt;br /&gt;
 * This example switches a LED (which is connected to Vcc)&lt;br /&gt;
 *-----------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
 */&lt;br /&gt;
void&lt;br /&gt;
led_callback (uint_fast8_t on)&lt;br /&gt;
{&lt;br /&gt;
    if (on)&lt;br /&gt;
    {&lt;br /&gt;
       LED_PORT &amp;amp;= ~(1 &amp;lt;&amp;lt; LED_PIN);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
       LED_PORT |= (1 &amp;lt;&amp;lt; LED_PIN);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int&lt;br /&gt;
main ()&lt;br /&gt;
{&lt;br /&gt;
    ...&lt;br /&gt;
    irmp_init ();&lt;br /&gt;
&lt;br /&gt;
    LED_DDR |= (1 &amp;lt;&amp;lt; LED_PIN);         // LED pin to output&lt;br /&gt;
    LED_PORT |= (1 &amp;lt;&amp;lt; LED_PIN);        // switch LED off (active low)&lt;br /&gt;
    irmp_set_callback_ptr (led_callback);&lt;br /&gt;
&lt;br /&gt;
    sei ();&lt;br /&gt;
    ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== IRMP_USE_IDLE_CALL ====&lt;br /&gt;
&lt;br /&gt;
Normally the irmp_ISR() function is called continuously at the F_INTERRUPTS (10-20kHz) frequency. The microcontroller can rarely enter an energy-saving sleep mode, or must constantly wake up from it. If power consumption is important, e.g. on battery power, this approach is not optimal.&lt;br /&gt;
&lt;br /&gt;
If &#039;&#039;IRMP_USE_IDLE_CALL&#039;&#039;&#039; is enabled, IRMP detects if no IR transmission is ongoing and then calls the function &#039;&#039;&#039;irmp_idle()&#039;&#039;&#039;. This is microcontroller-specific and must be provided and linked by the user. The microcontroller can then be put to sleep while there is no ongoing transmission, thus reducing energy consumption.&lt;br /&gt;
&lt;br /&gt;
It is recommended to deactivate the timer interrupt in irmp_idle() and to activate a pin change interrupt instead. Then the microcontroller can be put to sleep. When a falling edge is detected on the IR input pin, the pin change interrupt is disabled, the timer is reenabled and irmp_ISR() is called immediately. You can find an example for the use of irmp_idle() in [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-chibios.c?view=markup irmp-main-chibios.c].&lt;br /&gt;
&lt;br /&gt;
Using IRMP purely with pin change interrupts and without timer interrupts is not supported.&lt;br /&gt;
&lt;br /&gt;
==== IRMP_USE_EVENT ====&lt;br /&gt;
&lt;br /&gt;
When using IRMP with ChibiOS/RT or ChibiOS/NIL, you can use their Event module to wake a thread as soon as new IR data is received and decoded.&lt;br /&gt;
&lt;br /&gt;
Set the &#039;&#039;&#039;IRMP_USE_EVENT&#039;&#039;&#039; constant in irmpconfig.h to 1 to enable this. &#039;&#039;&#039;IRMP_EVENT_BIT&#039;&#039;&#039; definies the value in the Event bitmask that should symbolize the IRMP event. Use &#039;&#039;&#039;IRMP_EVENT_THREAD_PTR&#039;&#039;&#039; to define the variable name of the thread pointer that the event is sent to.&lt;br /&gt;
&lt;br /&gt;
Change irmpconfig.h like this:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
/*------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
 * Use ChibiOS Events to signal that valid IR data was received&lt;br /&gt;
 *------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
 */&lt;br /&gt;
#if defined(_CHIBIOS_RT_) || defined(_CHIBIOS_NIL_)&lt;br /&gt;
&lt;br /&gt;
#  ifndef IRMP_USE_EVENT&lt;br /&gt;
#    define IRMP_USE_EVENT                      1                     // 1: use event. 0: do not. default is 0&lt;br /&gt;
#  endif&lt;br /&gt;
&lt;br /&gt;
#  if IRMP_USE_EVENT == 1 &amp;amp;&amp;amp; !defined(IRMP_EVENT_BIT)&lt;br /&gt;
#    define IRMP_EVENT_BIT                      1                     // event flag or bit to send&lt;br /&gt;
#  endif&lt;br /&gt;
#  if IRMP_USE_EVENT == 1 &amp;amp;&amp;amp; !defined(IRMP_EVENT_THREAD_PTR)&lt;br /&gt;
#    define IRMP_EVENT_THREAD_PTR               ir_receive_thread_p   // pointer to the thread to send the event to&lt;br /&gt;
extern thread_t *IRMP_EVENT_THREAD_PTR;                               // the pointer must be defined and initialized elsewhere&lt;br /&gt;
#  endif&lt;br /&gt;
&lt;br /&gt;
#endif // _CHIBIOS_RT_ || _CHIBIOS_NIL_&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now you can use the event in your ChibiOS project like this:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
thread_t *ir_receive_thread_p = NULL;&lt;br /&gt;
&lt;br /&gt;
static THD_FUNCTION(IRThread, arg)&lt;br /&gt;
{&lt;br /&gt;
    ir_receive_thread_p = chThdGetSelfX();&lt;br /&gt;
    [...]&lt;br /&gt;
    while (true)&lt;br /&gt;
    {&lt;br /&gt;
        // wait for event sent from irmp_ISR&lt;br /&gt;
        chEvtWaitAnyTimeout(ALL_EVENTS,TIME_INFINITE);&lt;br /&gt;
&lt;br /&gt;
        if (irmp_get_data (&amp;amp;irmp_data))&lt;br /&gt;
            // use data in irmp_data&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== IRMP_LOGGING ====&lt;br /&gt;
&lt;br /&gt;
With IRMP_LOGGING the logging of received IR frames can be turned on.&lt;br /&gt;
&lt;br /&gt;
Default value:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
#define IRMP_LOGGING                            0       // 1: log IR signal (scan), 0: do not. default is 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Further documentation can be found here: [[IRMP_-_english#Scanning_unknown_IR_Protocols|Scanning Unknown IR Protocols]].&lt;br /&gt;
&lt;br /&gt;
=== Using IRMP ===&lt;br /&gt;
&lt;br /&gt;
The protocols supported by [[IRMP_-_english#top|IRMP]] use partly variable, partly fixed bit lengths from 2 up to 48 bits. These are described by preprocessor defines.&lt;br /&gt;
&lt;br /&gt;
[[IRMP_-_english#top|IRMP]] separates these IR frames into 3 sections:&lt;br /&gt;
&lt;br /&gt;
 1. protocol ID&lt;br /&gt;
 2. address or vendor code&lt;br /&gt;
 3. command&lt;br /&gt;
&lt;br /&gt;
With the function&lt;br /&gt;
&lt;br /&gt;
   irmp_get_data (IRMP_DATA * irmp_data_p)&lt;br /&gt;
&lt;br /&gt;
you can recall a decoded message. The return value is 1 if a message has been received, otherwise it is 0. In the first case the struct members&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
    irmp_data_p-&amp;gt;protocol (8 Bit)&lt;br /&gt;
    irmp_data_p-&amp;gt;address (16 Bit)&lt;br /&gt;
    irmp_data_p-&amp;gt;command (16 Bit)&lt;br /&gt;
    irmp_data_p-&amp;gt;flags (8 Bit)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
contain valid information.&lt;br /&gt;
&lt;br /&gt;
That means that ultimately, you have three values (protocol, address and command) that can be evaluated with an if or switch statement. &lt;br /&gt;
Here is a sample decoder which listens for keys 1-9 on a remote:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&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 protocol&lt;br /&gt;
          irmp_data.address == 0x1234)                   // Address 0x1234&lt;br /&gt;
      {&lt;br /&gt;
         switch (irmp_data.command)&lt;br /&gt;
         {&lt;br /&gt;
            case 0x0001: key1_pressed(); break;          // Key 1&lt;br /&gt;
            case 0x0002: key2_pressed(); break;          // Key 2&lt;br /&gt;
            ...&lt;br /&gt;
            case 0x0009: key9_pressed(); break;          // Key 9&lt;br /&gt;
         }&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here are possible constants for irmp_data.protocol, see also [http://www.mikrocontroller.net/svnbrowser/irmp/irmpprotocols.h?view=markup irmpprotocols.h]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
#define IRMP_SIRCS_PROTOCOL                      1              // Sony&lt;br /&gt;
#define IRMP_NEC_PROTOCOL                        2              // NEC, Pioneer, JVC, Toshiba, generic, 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 Media Receiver&lt;br /&gt;
#define IRMP_IR60_PROTOCOL                      24              // IR60 (SDA2008)&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;
#define IRMP_BOSE_PROTOCOL                      31              // BOSE&lt;br /&gt;
#define IRMP_A1TVBOX_PROTOCOL                   32              // A1 TV Box&lt;br /&gt;
#define IRMP_ORTEK_PROTOCOL                     33              // ORTEK - Hama&lt;br /&gt;
#define IRMP_TELEFUNKEN_PROTOCOL                34              // Telefunken (1560)&lt;br /&gt;
#define IRMP_ROOMBA_PROTOCOL                    35              // iRobot Roomba vacuum cleaner&lt;br /&gt;
#define IRMP_RCMM32_PROTOCOL                    36              // Fujitsu-Siemens (Activy remote control)&lt;br /&gt;
#define IRMP_RCMM24_PROTOCOL                    37              // Fujitsu-Siemens (Activy keyboard)&lt;br /&gt;
#define IRMP_RCMM12_PROTOCOL                    38              // Fujitsu-Siemens (Activy keyboard)&lt;br /&gt;
#define IRMP_SPEAKER_PROTOCOL                   39              // Another loudspeaker protocol, similar to Nubert&lt;br /&gt;
#define IRMP_LGAIR_PROTOCOL                     40              // LG air conditioner&lt;br /&gt;
#define IRMP_SAMSUNG48_PROTOCOL                 41              // air conditioner with Samsung protocol (48 bits)&lt;br /&gt;
#define IRMP_MERLIN_PROTOCOL                    42              // Merlin (Pollin 620 185)&lt;br /&gt;
#define IRMP_PENTAX_PROTOCOL                    43              // Pentax camera&lt;br /&gt;
#define IRMP_FAN_PROTOCOL                       44              // FAN (ventilator), very similar to NUBERT, but last bit is data bit instead of stop bit&lt;br /&gt;
#define IRMP_S100_PROTOCOL                      45              // very similar to RC5, but 14 instead of 13 data bits&lt;br /&gt;
#define IRMP_ACP24_PROTOCOL                     46              // Stiebel Eltron ACP24 air conditioner&lt;br /&gt;
#define IRMP_TECHNICS_PROTOCOL                  47              // Technics, similar to Matsushita, but 22 instead of 24 bits&lt;br /&gt;
#define IRMP_PANASONIC_PROTOCOL                 48              // Panasonic (video projector), start bits similar to KASEIKYO&lt;br /&gt;
#define IRMP_MITSU_HEAVY_PROTOCOL               49              // Mitsubishi heavy air conditioner, similar timing to Panasonic video projector&lt;br /&gt;
#define IRMP_VINCENT_PROTOCOL                   50              // Vincent&lt;br /&gt;
#define IRMP_SAMSUNGAH_PROTOCOL                 51              // Samsung AH&lt;br /&gt;
#define IRMP_IRMP16_PROTOCOL                    52              // IRMP specific protocol for data transfer, e.g. between two microcontrollers via IR&lt;br /&gt;
#define IRMP_GREE_PROTOCOL                      53              // Gree climate&lt;br /&gt;
#define IRMP_RCII_PROTOCOL                      54              // RC II Infrared Remote Control Protocol for FM8&lt;br /&gt;
#define IRMP_METZ_PROTOCOL                      55              // METZ&lt;br /&gt;
#define IRMP_ONKYO_PROTOCOL                     56              // Onkyo&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The values of address and the command code of an unknown remote can be received and printed to UART or LCD. Then these values can be hard-coded in your decoder routine. Or you can write a learning routine, where you press keys to store the code into EEPROM. A sample for this can be found in [http://www.mikrocontroller.net/articles/DIY_Lernfähige_Fernbedienung_mit_IRMP Lernfähige IR-Fernbedienung mit IRMP].&lt;br /&gt;
&lt;br /&gt;
Another [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-avr.c?view=markup example main function] is included in the zip file, showing also the timer initialization.&lt;br /&gt;
&lt;br /&gt;
=== Debouncing ===&lt;br /&gt;
&lt;br /&gt;
To distinguish between a long key press or a single press, the IRMP_FLAG_REPETITION bit is provided. It is set in the struct member &#039;&#039;&#039;flags&#039;&#039;&#039; when a key on the remote is held, causing the same command to be repeated within a short period of time.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
    if (irmp_data.flags &amp;amp; IRMP_FLAG_REPETITION)&lt;br /&gt;
    {&lt;br /&gt;
      // long key press&lt;br /&gt;
      // either:&lt;br /&gt;
      //   ignore the (repeated) key&lt;br /&gt;
      // or:&lt;br /&gt;
      //   use this information for a repeat function&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
      // key was pressed again&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This can be used to debounce the keys 0-9 by ignoring commands with the IRMP_FLAG_REPETITION bit set. For keys like &#039;VOLUME+&#039; or &#039;VOLUME-&#039; using the repetition can be useful, for example to [[LED-Fading|fade a LED]].&lt;br /&gt;
&lt;br /&gt;
If you want to decode only single keys, you can reduce the block above to:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
    if (! (irmp_data.flags &amp;amp; IRMP_FLAG_REPETITION))&lt;br /&gt;
    {&lt;br /&gt;
      // New key&lt;br /&gt;
      // ACTION!&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#FF0000&amp;quot;&amp;gt;&#039;&#039;&#039;NEW:&#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From version 3.2.2, key releases can be detected. In this case, the IRMP_FLAG_RELEASE flag is set once the remote control has ceased sending IR or RF frames.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
    IRMP_DATA irmp_data;&lt;br /&gt;
&lt;br /&gt;
    while (1)&lt;br /&gt;
    {&lt;br /&gt;
        if (irmp_get_data (&amp;amp;irmp_data))&lt;br /&gt;
        {&lt;br /&gt;
            if (irmp_data.protocol == NEC_PROTOCOL &amp;amp;&amp;amp; irmp_data.address == 0x1234)&lt;br /&gt;
            {&lt;br /&gt;
                 if (irmp_data.command == 0x42 &amp;amp;&amp;amp; irmp_data.flags == 0x00) // First frame, flags not set&lt;br /&gt;
                 {&lt;br /&gt;
                     motor_on ();&lt;br /&gt;
                 }&lt;br /&gt;
                 else if (irmp_data.flags &amp;amp; IRMP_FLAG_RELEASE)             // Key is released&lt;br /&gt;
                 {&lt;br /&gt;
                     motor_off ();&lt;br /&gt;
                 }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the above example, a motor is turned on when a specific button on the remote control is pressed. The motor will not stop again until you release the button.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important when evaluating IRMP_FLAG_RELEASE:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
You must not rely on irmp_data.command to still contain the original command code (0x42 here). There are remote controls (e.g. RF remotes for remote controlled receptacles) which send a special key release code when the key is released. Simply check that the irmp_data.address matches before evaluating the flag.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;This feature must be enabled explicitly in irmpconfig.h by changing the configuration variable IRMP_ENABLE_RELEASE_DETECTION&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Principles of Operation ==&lt;br /&gt;
&lt;br /&gt;
The  &amp;quot;workhorse&amp;quot; of [[IRMP_-_english#top|IRMP]] is the interrupt service routine irmp_ISR() which should be called 15000 times per second. When using a different rate, the constant [[IRMP_-_english#F_INTERRUPTS|F_INTERRUPTS]] in [http://www.mikrocontroller.net/svnbrowser/irmp/irmpconfig.h?view=markup irmpconfig.h] needs to be modified accordingly.&lt;br /&gt;
&lt;br /&gt;
First, irmp_ISR() detects the length and the type of the start bit(s) and uses this to determine the protocol in use. As soon as the protocol is identified, subsequent bits are parametrized to read them efficiently until the IR transmission is complete.&lt;br /&gt;
&lt;br /&gt;
To cut off critics:&lt;br /&gt;
&lt;br /&gt;
I know that the ISR is quite large. But since it behaves like a state machine, the effective executed code per cycle is relatively small. As long as the input is &amp;quot;dark&amp;quot; (and that is the case most of the time ;-)) the spent time is vanishingly short. In the WordClock project for example, 8 ISRs are called with the same timer, of which irmp_ISR() just one of many. With a MCU clock of at least 8 MHz, no timing problems occured. Consequently, I see no problem with the length of the ISR.&lt;br /&gt;
&lt;br /&gt;
A crystal is not mandatory, it works well with the internal AVR oscillator. Remember to set the correct fuses for the CPU to run at 8 MHz, check [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-avr.c?view=markup irmp-main-avr.c] for correct values for an ATMEGA88.&lt;br /&gt;
&lt;br /&gt;
== Scanning Unknown IR Protocols ==&lt;br /&gt;
&lt;br /&gt;
To enable logging in [[IRMP_-_english#top|IRMP]], modify the value of [[IRMP_-_english#IRMP_LOGGING|IRMP_LOGGING]] to 1 of [http://www.mikrocontroller.net/svnbrowser/irmp/irmpconfig.h?view=markup irmpconfig.h] on the line&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
    #define IRMP_LOGGING    0   // 1: log IR signal (scan), 0: do not (default)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When logging is enabled, the bright and dark phases are sent via UART at 9600 bits/s: 1=dark, 0=bright. The constants in the functions uart_init() and uart_putc() may need to be modified,  depending on the AVR MCU used.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note: for PIC microcontrollers there is a dedicated logging module named [http://www.mikrocontroller.net/svnbrowser/irmp/irmpextlog.c?view=markup irmpextlog.c]. This makes it possible to log via USB. This does not apply to the AVR version&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
By capturing these protocol scans with a terminal program and saving them to a text file, you can use these files to analyze the frames in order to add new protocols to [[IRMP_-_english#top|IRMP]] - see next chapter.&lt;br /&gt;
&lt;br /&gt;
If you have a remote control that is not supported by [[IRMP_-_english#top|IRMP]], you can send me ([http://www.mikrocontroller.net/user/show/ukw ukw]) the scan files. Then I can check if the protocol is compatible with the IRMP model and modify the source code if applicable.&lt;br /&gt;
&lt;br /&gt;
== IRMP under Linux and Windows ==&lt;br /&gt;
&lt;br /&gt;
=== Compilation ===&lt;br /&gt;
&lt;br /&gt;
[http://www.mikrocontroller.net/svnbrowser/irmp/irmp.c?view=markup irmp.c] can be compiled under Linux for testing IR scans in textfiles. In the subdirectory &#039;IR-Data&#039; you will find such files that you can use as input files for [[IRMP_-_english#top|IRMP]].&lt;br /&gt;
&lt;br /&gt;
To compile [[IRMP_-_english#top|IRMP]], enter:&lt;br /&gt;
&lt;br /&gt;
    make -f makefile.lnx&lt;br /&gt;
&lt;br /&gt;
This will generate 3 IRMP versions:&lt;br /&gt;
&lt;br /&gt;
* irmp-10kHz: Version for 10kHz scans&lt;br /&gt;
* irmp-15kHz: Version for 15kHz scans&lt;br /&gt;
* irmp-20kHz: Version for 20kHz scans&lt;br /&gt;
&lt;br /&gt;
=== Starting IRMP ===&lt;br /&gt;
&lt;br /&gt;
The calling syntax is:&lt;br /&gt;
&lt;br /&gt;
  ./irmp-nnkHz [-l|-p|-a|-v] &amp;lt; scan-file&lt;br /&gt;
&lt;br /&gt;
Options are mutually exclusive, so only one option per call is valid:&lt;br /&gt;
&lt;br /&gt;
Option:&lt;br /&gt;
&lt;br /&gt;
   -l  List             print a list with pulses and pauses&lt;br /&gt;
   -a analyze           analyse the pulses/pauses and write a &amp;quot;spectrum&amp;quot; in ASCII format&lt;br /&gt;
   -v verbose           verbose output&lt;br /&gt;
   -p  Print Timings    print a timing table for all protocols&lt;br /&gt;
&lt;br /&gt;
Samples:&lt;br /&gt;
&lt;br /&gt;
=== Normal Output ===&lt;br /&gt;
&lt;br /&gt;
   ./irmp-10kHz &amp;lt; IR-Data/orion_vcr_07660BM070.txt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Output Lists ===&lt;br /&gt;
&lt;br /&gt;
   ./irmp-10kHz -l &amp;lt; IR-Data/orion_vcr_07660BM070.txt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Analysis ===&lt;br /&gt;
&lt;br /&gt;
   ./irmp-10kHz -a &amp;lt; IR-Data/orion_vcr_07660BM070.txt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here you see the measured times of all pulses and pauses (spaces) as horizontal bar graphs, whose distributions are not ideal bell curves due to the ASCII formatting. The narrower the measured peaks, the better the timing of the remote.&lt;br /&gt;
&lt;br /&gt;
The above output can be read as:&lt;br /&gt;
&lt;br /&gt;
* the start bit has a pulse length between 9000 and 9200 µs, on average 9102 µs. The deviation from this average is about 1.1%&lt;br /&gt;
&lt;br /&gt;
* the start bit has a space length between 4300 and 4500 µs, the average is 4424 µs. The error is about 2.8%.&lt;br /&gt;
&lt;br /&gt;
* the pulse length of a data bit is between 500 and 700 µs, on average 650 µs, the error is (quite large!) 23.1%&lt;br /&gt;
&lt;br /&gt;
Further there are two more spaces of different lengths (for bits 0 and 1). Reading these is left as an exercise to the reader. ;-)&lt;br /&gt;
&lt;br /&gt;
=== Verbose Output ===&lt;br /&gt;
&lt;br /&gt;
    ./irmp-10kHz -v &amp;lt; IR-Data/orion_vcr_07660BM070.txt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
# 1 - IR-cmd: 0x0001&lt;br /&gt;
   0.200ms [starting pulse]&lt;br /&gt;
  13.700ms [start-bit: pulse = 91, pause = 44]&lt;br /&gt;
protocol = NEC, start bit timings: pulse:  62 - 118, pause:  30 -  60&lt;br /&gt;
pulse_1:   3 -   8&lt;br /&gt;
pause_1:  11 -  23&lt;br /&gt;
pulse_0:   3 -   8&lt;br /&gt;
pause_0:   3 -   8&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;
  14.800ms [bit  0: pulse =   6, pause =   5] 0&lt;br /&gt;
  16.000ms [bit  1: pulse =   6, pause =   6] 0&lt;br /&gt;
  17.100ms [bit  2: pulse =   6, pause =   5] 0&lt;br /&gt;
  18.200ms [bit  3: pulse =   6, pause =   5] 0&lt;br /&gt;
  19.300ms [bit  4: pulse =   6, pause =   5] 0&lt;br /&gt;
  20.500ms [bit  5: pulse =   6, pause =   6] 0&lt;br /&gt;
  21.600ms [bit  6: pulse =   6, pause =   5] 0&lt;br /&gt;
  23.800ms [bit  7: pulse =   6, pause =  16] 1&lt;br /&gt;
  26.100ms [bit  8: pulse =   6, pause =  17] 1&lt;br /&gt;
  28.300ms [bit  9: pulse =   6, pause =  16] 1&lt;br /&gt;
  29.500ms [bit 10: pulse =   6, pause =   6] 0&lt;br /&gt;
  31.700ms [bit 11: pulse =   6, pause =  16] 1&lt;br /&gt;
  34.000ms [bit 12: pulse =   6, pause =  17] 1&lt;br /&gt;
  36.200ms [bit 13: pulse =   6, pause =  16] 1&lt;br /&gt;
  38.500ms [bit 14: pulse =   6, pause =  17] 1&lt;br /&gt;
  39.600ms [bit 15: pulse =   6, pause =   5] 0&lt;br /&gt;
  41.900ms [bit 16: pulse =   6, pause =  17] 1&lt;br /&gt;
  43.000ms [bit 17: pulse =   6, pause =   5] 0&lt;br /&gt;
  44.100ms [bit 18: pulse =   6, pause =   5] 0&lt;br /&gt;
  45.200ms [bit 19: pulse =   6, pause =   5] 0&lt;br /&gt;
  46.400ms [bit 20: pulse =   7, pause =   5] 0&lt;br /&gt;
  47.500ms [bit 21: pulse =   6, pause =   5] 0&lt;br /&gt;
  48.600ms [bit 22: pulse =   6, pause =   5] 0&lt;br /&gt;
  49.800ms [bit 23: pulse =   6, pause =   6] 0&lt;br /&gt;
  50.900ms [bit 24: pulse =   5, pause =   6] 0&lt;br /&gt;
  53.100ms [bit 25: pulse =   6, pause =  16] 1&lt;br /&gt;
  55.400ms [bit 26: pulse =   6, pause =  17] 1&lt;br /&gt;
  57.600ms [bit 27: pulse =   6, pause =  16] 1&lt;br /&gt;
  59.900ms [bit 28: pulse =   6, pause =  17] 1&lt;br /&gt;
  62.100ms [bit 29: pulse =   6, pause =  16] 1&lt;br /&gt;
  64.400ms [bit 30: pulse =   6, pause =  17] 1&lt;br /&gt;
  66.700ms [bit 31: pulse =   6, pause =  17] 1&lt;br /&gt;
stop bit detected&lt;br /&gt;
  67.300ms code detected, length = 32&lt;br /&gt;
  67.300ms p =  2, a = 0x7b80, c = 0x0001, f = 0x00&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Starting under Windows ===&lt;br /&gt;
&lt;br /&gt;
[[IRMP_-_english#top|IRMP]] can be used under Windows as well:&lt;br /&gt;
&lt;br /&gt;
* start command line console&lt;br /&gt;
* change to directory &#039;irmp&#039;&lt;br /&gt;
* enter:&lt;br /&gt;
            irmp-10kHz.exe &amp;lt; IR-Data\rc5x.txt&lt;br /&gt;
&lt;br /&gt;
The same options apply as for the Linux version.&lt;br /&gt;
&lt;br /&gt;
=== Long Output ===&lt;br /&gt;
&lt;br /&gt;
As some output is very long, it is recommended to redirect the output to a file or filter for paging:&lt;br /&gt;
&lt;br /&gt;
Linux:&lt;br /&gt;
&lt;br /&gt;
            ./irmp-10kHz &amp;lt; IR-Data/rc5x.txt | less&lt;br /&gt;
&lt;br /&gt;
Windows:&lt;br /&gt;
&lt;br /&gt;
            irmp-10kHz.exe &amp;lt; IR-Data\rc5x.txt | more&lt;br /&gt;
&lt;br /&gt;
== Remote Controls ==&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! Protocol || Name || Device || Device Address&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#NEC_+_extended_NEC|NEC]] || Toshiba CT-9859 || TV || 0x5F40&lt;br /&gt;
|-&lt;br /&gt;
VCR|-&lt;br /&gt;
| || Elta 8848 MP 4 || DVD player || 0x7F00&lt;br /&gt;
|-&lt;br /&gt;
| || AS-218 || Askey TV-View CHP03X (TV tuner card) || 0x3B86&lt;br /&gt;
|-&lt;br /&gt;
| || Cyberhome ??? || Cyberhome DVD player || 0x6D72&lt;br /&gt;
|-&lt;br /&gt;
| || WD TV Live || Western Digital Multimediaplayer || 0x1F30&lt;br /&gt;
|-&lt;br /&gt;
| || Canon WL-DC100 || Kamera Canon PowerShot G5 || 0xB1CA&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#NEC16|NEC16]] || Daewoo || VCR || 0x0015&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#KASEIKYO|KASEIKYO]] || Technics EUR646497 || SA-AX 730 AV receiver || 0x2002&lt;br /&gt;
|-&lt;br /&gt;
| || Panasonic TV || TX-L32EW6 TV || 0x2002&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#RC5_+_RC5X|RC5]] || Loewe Assist/RC3/RC4 || TV (remote control in TV mode) || 0x0000&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#RC6_+_RC6A|RC6]] || Philips TV || TV (remote control in TV mode) || 0x0000&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#SIRCS|SIRCS]] || Sony RM-816 || TV (remote control in TV mode) || 0x0000&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#DENON|DENON]] || DENON RC970 || AVR3805 AV receiver || 0x0008&lt;br /&gt;
|-&lt;br /&gt;
| || DENON RC970 || DVD/CD player || 0x0002&lt;br /&gt;
|-&lt;br /&gt;
| || DENON RC970 || Tuner || 0x0006&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#SAMSUNG32|SAMSUNG32]] || Samsung AA59-00484A || LE40D550 TV || 0x0707&lt;br /&gt;
|-&lt;br /&gt;
| || LG AKB72033901 || BD370 Blu-Ray player  || 0x2D2D&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#APPLE|APPLE]] || Apple || Apple iPod Dock || 0x0020&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Cameras ==&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width: 80%;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 20%;&amp;quot; |&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
[[IRMP_-_english#top|IRMP]] supports more and more camera remotes like:&lt;br /&gt;
&lt;br /&gt;
* [[IRMP_-_english#PENTAX|PENTAX]]&lt;br /&gt;
* [[IRMP_-_english#Nikon|Nikon]]&lt;br /&gt;
&lt;br /&gt;
The array of commands is quite limited. Cameras understand only the shutter release command.&lt;br /&gt;
||&lt;br /&gt;
[[Datei:Irmp-pentax.png|miniatur|PENTAX protocol]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Here is a short table for [[IRMP_-_english#PENTAX|PENTAX]] cameras:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! Command || Function&lt;br /&gt;
|-&lt;br /&gt;
| 0x0000 || Shutter release&lt;br /&gt;
|-&lt;br /&gt;
| 0x0001 || change zoom level&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Because there is no address designated in the [[IRMP_-_english#PENTAX|PENTAX]] protocol, for transmitting, it should be set to 0x0000 in [[IRSND_-_english|IRSND]]. &lt;br /&gt;
&lt;br /&gt;
For Nikon cameras, a crystal should be used because these cameras are quite sensitive to timing accuracy.&lt;br /&gt;
&lt;br /&gt;
== IR Keyboards ==&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width: 80%;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 20%;&amp;quot; |&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
From version 1.7.0 on, [[IRMP_-_english#top|IRMP]] also supports IR keyboards, namely the FDC-3402 &amp;lt;s&amp;gt; from www.pollin.de (partno. 711 056) for less than 2 Euro.&amp;lt;/s&amp;gt; (not available as of 19.09.2017 )&lt;br /&gt;
&lt;br /&gt;
On detection of a key press the following data is returned:&lt;br /&gt;
&lt;br /&gt;
 Protocol number  (irmp_data.protocol): 18&lt;br /&gt;
 Address          (irmp_data.address) : 0x003F&lt;br /&gt;
||&lt;br /&gt;
[[Datei:irmp-fdc3402.jpg|miniatur|FDC-3402 keyboard]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The following values are returned as commands (irmp_data.command) :&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size:50%; text-align:center;&amp;quot;&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! Code || Key   || Code || Key   || Code || Key   || Code || Key   || Code || Key   || Code || Key   || Code || Key   || Code || Key   &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;
Special keys on the left:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! Code || Key   &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;
The above values are for pressing a key. On release, [[IRMP_-_english#top|IRMP]] sets also bit 8 (0x80) in the command.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
      Key &#039;a&#039; pressed:   0x001F&lt;br /&gt;
      Key &#039;a&#039; released:  0x009F&lt;br /&gt;
&lt;br /&gt;
The ON/OFF key is an exception: This key only sends a code for a key press, not for the release.&lt;br /&gt;
&lt;br /&gt;
If a key is held, this is indicated in irmp_data.flag.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
                           command   flag&lt;br /&gt;
      Key &#039;a&#039; pressed:   0x001F    0x00&lt;br /&gt;
      Key &#039;a&#039; pressed:   0x001F    0x01&lt;br /&gt;
      Key &#039;a&#039; pressed:   0x001F    0x01&lt;br /&gt;
      Key &#039;a&#039; pressed:   0x001F    0x01&lt;br /&gt;
      ....&lt;br /&gt;
      Key &#039;a&#039; released:  0x009F    0x00&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
When key combinations (like a capital &#039;A&#039;) are pressed, then the return values are a sequence like this:&lt;br /&gt;
&lt;br /&gt;
      Left SHIFT-key pressed:    0x0002&lt;br /&gt;
      Key &#039;a&#039; pressed:           0x001F&lt;br /&gt;
      Key &#039;a&#039; released:          0x009F&lt;br /&gt;
      Left SHIFT-key released:   0x0082&lt;br /&gt;
&lt;br /&gt;
In [http://www.mikrocontroller.net/svnbrowser/irmp/irmp.c?view=markup irmp.c] you will find a function get_fdc_key() for the Linux version, which can be used as a template to convert the FDC keycodes into the corresponding ASCII codes. This function can be used either locally on the MCU to decode the keycodes, or on the host system (e.g. PC) where the IRMP data structure is sent to. Therefore the function including preprocessor constants should be copied to your application code.&lt;br /&gt;
&lt;br /&gt;
Here is an excerpt:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&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;,  0xDF, &#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;,  0xFC, &#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;, 0xF6, 0xE4, &#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;,  0xDC, &#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;, 0xD6, 0xC4, &#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 = 0xB2;    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 = 0xB5;    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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As a final example, use of the get_fdc_key() function:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Non-printable characters are coded as follows:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! Key               || Constant                || Value&lt;br /&gt;
|-&lt;br /&gt;
| ESC               || KEY_ESCAPE              || 0x1B&lt;br /&gt;
|-&lt;br /&gt;
| Menu              || KEY_MENUE               || 0x80&lt;br /&gt;
|-&lt;br /&gt;
| Back              || KEY_BACK                || 0x81&lt;br /&gt;
|-&lt;br /&gt;
| Forward           || KEY_FORWARD             || 0x82&lt;br /&gt;
|-&lt;br /&gt;
| Adress            || KEY_ADDRESS             || 0x83&lt;br /&gt;
|-&lt;br /&gt;
| Window            || KEY_WINDOW              || 0x84&lt;br /&gt;
|-&lt;br /&gt;
| 1. Page           || 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;
| New Page          || KEY_NEW_PAGE            || 0x89&lt;br /&gt;
|-&lt;br /&gt;
| Setup             || KEY_SETUP               || 0x8A&lt;br /&gt;
|-&lt;br /&gt;
| Font              || KEY_FONT                || 0x8B&lt;br /&gt;
|-&lt;br /&gt;
| Print             || KEY_PRINT               || 0x8C&lt;br /&gt;
|-&lt;br /&gt;
| On/Off            || 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;
| Insert            || KEY_INSERT              || 0x90&lt;br /&gt;
|-&lt;br /&gt;
| Delete            || KEY_DELETE              || 0x91&lt;br /&gt;
|-&lt;br /&gt;
| Cursor left       || KEY_LEFT                || 0x92&lt;br /&gt;
|-&lt;br /&gt;
| Pos1              || KEY_HOME                || 0x93&lt;br /&gt;
|-&lt;br /&gt;
| End               || KEY_END                 || 0x94&lt;br /&gt;
|-&lt;br /&gt;
| Cursor right      || KEY_UP                  || 0x95&lt;br /&gt;
|-&lt;br /&gt;
| Cursor down       || KEY_DOWN                || 0x96&lt;br /&gt;
|-&lt;br /&gt;
| Page up           || KEY_PAGE_UP             || 0x97&lt;br /&gt;
|-&lt;br /&gt;
| Page down         || KEY_PAGE_DOWN           || 0x98&lt;br /&gt;
|-&lt;br /&gt;
| Cursor left       || KEY_RIGHT               || 0x99&lt;br /&gt;
|-&lt;br /&gt;
| Left Mousebutton  || KEY_MOUSE_1             || 0x9E&lt;br /&gt;
|-&lt;br /&gt;
| Right Mousebutton || KEY_MOUSE_2             || 0x9F&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The get_fdc_key() function considers the state of the Shift, Ctrl, and Alt keys. As a result, not only capital letters can be entered, but also special characters with Alt + key combinations, e.g. Alt + m -&amp;gt; µ or Alt + q -&amp;gt; @. You can also send Ctrl + A to Ctrl + Z by using the Ctrl key. The Caps Lock key is ignored, as I regard this key as the most unnecessary key at all ;-)&lt;br /&gt;
&lt;br /&gt;
= Appendix =&lt;br /&gt;
&lt;br /&gt;
== IR Protocols in Detail ==&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width: 80%;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 20%;&amp;quot; |&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
=== Pulse Distance Protocols ===&lt;br /&gt;
||&lt;br /&gt;
[[Datei:Pulse-Distance.png|miniatur|Pulse Distance Coding]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== NEC + extended NEC ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#NEC Protocol|NEC + extended NEC]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 36 kHz / 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 32 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data NEC || 8 address bits + 8 inverted address bits + 8 command bits + 8 inverted command bits&lt;br /&gt;
|-&lt;br /&gt;
| Data ext. NEC || 16 address bits + 8 command bits + 8 inverted command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 9000µs pulse, 4500µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 560µs pulse,  560µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 560µs pulse, 1690µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 560µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || 9000µs pulse, 2250µs pause, 560µs pulse, ~100ms pause&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== JVC ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#NEC16 Protocol (JVC)|JVC]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 16 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 4 address bits + 12 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 9000µs pulse, 4500µs pause, 6000µs pause if key repeat&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 560µs pulse,  560µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 560µs pulse, 1690µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 560µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after pause of 25ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== NEC16 ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;NEC16&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 8 address bits + 1 sync bit + 8 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 9000µs pulse, 4500µs pause&lt;br /&gt;
|-&lt;br /&gt;
| sync bit || 560µs pulse, 4500µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 560µs pulse,  560µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 560µs pulse, 1690µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 560µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after pause of 25ms?&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== NEC42 ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;NEC42&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 42 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 13 address bits + 13 inverted address bits + 8 command bits + 8 inverted command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 9000µs pulse, 4500µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 560µs pulse,  560µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 560µs pulse, 1690µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 560µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after 110ms (beginning from start bit), 9000µs pulse, 2250µs pause, 560µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== ACP24 ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#ACP24 Protocol|ACP24]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 70 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 0 address bits + 70 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 390µs pulse, 950µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 390µs pulse,  950µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 390µs pulse, 13000µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 390µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || unknown&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== LGAIR ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#LGAIR Protocol|LGAIR]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 28 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 8 address bits + 16 command bits + 4 checksum bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 9000µs pulse, 4500µs pause (identical to [[IRMP_-_english#NEC_.2B_extended_NEC|NEC]])&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 560µs pulse,  560µs pause (identical to [[IRMP_-_english#NEC_.2B_extended_NEC|NEC]])&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 560µs pulse, 1690µs pause (identical to [[IRMP_-_english#NEC_.2B_extended_NEC|NEC]])&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 560µs pulse (identical to [[IRMP_-_english#NEC_.2B_extended_NEC|NEC]])&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || unknown&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first (&#039;&#039;&#039;differs&#039;&#039;&#039; from [[IRMP_-_english#NEC_.2B_extended_NEC|NEC]])&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SAMSUNG ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#SAMSUNG Protocol|SAMSUNG]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || ?? kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 16 data(1) bits + 1 sync bit + 20 data(2)-bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data(1) || 16 address bits&lt;br /&gt;
|-&lt;br /&gt;
| Data(2) || 4 ID bits + 8 command bits + 8 inverted command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 4500µs pulse, 4500µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 550µs pulse, 550µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 550µs pulse, 1650µs pause&lt;br /&gt;
|-&lt;br /&gt;
| sync bit || 550µs pulse, 4500µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 550µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after approx. 100ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SAMSUNG32 ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;SAMSUNG32&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 32 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 16 address bits + 16 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 4500µs pulse, 4500µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 550µs pulse,  550µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 550µs pulse, 1650µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 550µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after approx. 47msec&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SAMSUNG48 ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;SAMSUNG48&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 48 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 16 address bits + 32 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Command || 8 bits + 8 inverted bits + 8 bits + 8 inverted bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 4500µs pulse, 4500µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 550µs pulse,  550µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 550µs pulse, 1650µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 550µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || one after approx. 5 msec&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after approx. 45 msec&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== MATSUSHITA ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#MATSUHITA Protocol|MATSUSHITA]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 36 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance, timing identical to [[IRMP_-_english#TECHNICS|TECHNICS]]&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 24 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 6 customer bits + 6 command bits + 12 address bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 3488µs pulse, 3488µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 872µs pulse,  872µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 872µs pulse, 2616µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 872µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after 40ms pause&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first?&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== TECHNICS ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;TECHNICS&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 36 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance, timing identical to [[IRMP_-_english#MATSUSHITA|MATSUSHITA]]&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 22 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 11 command bits + 11 inverted command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 3488µs pulse, 3488µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 872µs pulse,  872µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 872µs pulse, 2616µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 872µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after 40ms pause&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first?&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== KASEIKYO ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#KASEIKYO_Protocol_.28.22Japan Protocol.22.29|KASEIKYO]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 48 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 16 customer bits + 4 parity bits + 4 genre1 bits + 4 genre2 bits + 10 command bits + 2 ID bits + 8 parity bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 3380µs pulse, 1690µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 423µs pulse,  423µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 423µs pulse, 1269µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 423µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after approx. 80ms pause&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first?&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== RECS80 ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#RECS80 and RECS80 Extended Protocol|RECS80]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bits + 10 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 1 toggle bit + 3 address bits + 6 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 158µs pulse, 7432µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 158µs pulse, 4902µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 158µs pulse, 7432µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 158µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after approx. 100ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== RECS80EXT ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#RECS80 and RECS80 Extended Protocol|RECS80EXT]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 2 start bits + 11 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 1 toggle bit + 4 address bits + 6 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 158µs pulse, 3637µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 158µs pulse, 4902µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 158µs pulse, 7432µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 158µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after approx. 100ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== DENON ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#Denon Protocol|DENON]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz (in practice, theoretically: 32 kHz)&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 0 start bits + 15 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 5 address bits + 10 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Command || 6 data bits + 2 extension bits + 2 data construction bits (normal: 00, inverted: 11)&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || none&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 310µs pulse, 745µs pause (in practice, theoretically: 275µs pulse, 775µs pause)&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 310µs pulse, 1780µs pause (in practice, theoretically: 275µs pulse, 1900µs pause)&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 310µs pulse (310µs pulse, 745µs pause (in practice, theoretically: 275µs pulse)&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || after 65ms with inverted command bits (data construction bits = 11)&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || both frames after 65ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== APPLE ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;APPLE&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 32 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 16 address bits + 11100000 + 8 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || see [[IRMP_-_english#NEC_+_extended_NEC|NEC]]&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || see [[IRMP_-_english#NEC_+_extended_NEC|NEC]]&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || see [[IRMP_-_english#NEC_+_extended_NEC|NEC]]&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || see [[IRMP_-_english#NEC_+_extended_NEC|NEC]]&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after approx. 100ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== BOSE ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;BOSE&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 16 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 0 address bits + 8 command bits + 8 inverted command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 1060µs pulse, 1425µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 550µs pulse,  437µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 550µs pulse, 1425µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 550µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || unknown&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== B&amp;amp;O ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#Bang &amp;amp; Olufsen|B&amp;amp;O]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 455 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 4 start bits + 16 data bits + 1 trailer bit + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 0 address bits + 16 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit 1 || 200µs pulse, 2925µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Start bit 2 || 200µs pulse, 2925µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Start bit 3 || 200µs pulse, 15425µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Start bit 4 || 200µs pulse, 2925µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 200µs pulse, 2925µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 200µs pulse, 9175µs pause&lt;br /&gt;
|-&lt;br /&gt;
| R bit || 200µs pulse, 6050µs pause, repeats the last bit&lt;br /&gt;
|-&lt;br /&gt;
| Trailer bit || 200µs pulse, 12300µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 200µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after approx. 100ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== FDC ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;FDC&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 40 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 8 address bits + 12 x 0 bits + 4 press/release bits + 8 command bits + 8 inverted command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 2085µs pulse, 966µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 300µs pulse,  220µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 300µs pulse, 715µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 300µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Press Key || press/release bits = 0000&lt;br /&gt;
|-&lt;br /&gt;
| Release Key || press/release bits = 1111&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after pause of approx. 60ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Nikon ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;Nikon&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 2 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 2 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 2200µs pulse, 27100µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 500µs pulse,  1500µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 500µs pulse, 3500µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 500µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || unknown&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== PANASONIC ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;PANASONIC&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 56 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 24 bits (010000000000010000000001) + 16 address bits + 16 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 3600µs pulse, 1600µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 565µs pulse,  316µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 565µs pulse, 1140µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 565µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || unknown&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first?&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== PENTAX ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;PENTAX&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 6 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 6 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 2200µs pulse, 27100µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 1000µs pulse,  1000µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 1000µs pulse, 3000µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 1000µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || unknown&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== KATHREIN ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;KATHREIN&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 11 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 4 address bits + 7 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 210µs pulse, 6218µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 210µs pulse,  1400µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 210µs pulse, 3000µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 210µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after 35ms?&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== LEGO ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#LEGO Power Functions RC|LEGO]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 16 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 12 command bits + 4 crc bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 158µs pulse, 1026µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 158µs pulse,  263µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 158µs pulse, 553µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 158µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || unknown&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== VINCENT ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#VINCENT|VINCENT]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 32 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 16 address bits + 8 command bits + 8 repeated command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 2500µs pulse, 4600µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 550µs pulse,  550µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 550µs pulse, 1540µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 550µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || unknown&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first?&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== THOMSON ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;THOMSON&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 33 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 0 start bits + 12 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 4 address bits + 1 toggle bit + 7 command bits&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 550µs pulse,  2000µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 550µs pulse, 4500µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 550µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after 35ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first?&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== TELEFUNKEN ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;TELEFUNKEN&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 15 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 0 address bits + 15 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 600µs pulse, 1500µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 600µs pulse, 600µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 600µs pulse, 1500µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 600µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || unknown&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first?&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== RCCAR ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;RCCAR&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 13 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 13 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 2000µs pulse, 2000µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 600µs pulse,  900µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 600µs pulse, 450µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 600µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after 40ms?&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== RCMM ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#RCMM_Protocol|RCMM]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 36 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame RCMM32 || 1 start bit + 32 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Frame RCMM24 || 1 start bit + 24 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Frame RCMM12 || 1 start bit + 12 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data RCMM32 || 16 address bits (= 4 mode bits + 12 device bits) + 1 toggle bit + 15 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Data RCMM24 || 16 address bits (= 4 mode bits + 12 device bits) + 1 toggle bit + 7 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Data RCMM12 || 4 address bits (= 2 mode bits + 2 device bits) + 8 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 500µs pulse, 220µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 00 bits || 230µs pulse, 220µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 01 bits || 230µs pulse, 380µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 10 bits || 230µs pulse, 550µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 11 bits || 230µs pulse, 720µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 230µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after 80ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width: 80%;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 20%;&amp;quot; |&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
=== Pulse Width Protocols ===&lt;br /&gt;
||&lt;br /&gt;
[[Datei:Pulse-Width.png|miniatur|Pulse Width Coding]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SIRCS ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#SIRCS_Protocol|SIRCS]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|Frequency ||40 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse width&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 12-20 data bits, no stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 7 command bits + 5 address bits + up to 8 additional bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 2400µs pulse, 600µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 600µs pulse, 600µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 1200µs pulse, 600µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || twice after approx. 25ms, that means: 2nd and 3rd frame&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || starting with 4th identical frame, distance approx. 25ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width: 80%;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 20%;&amp;quot; |&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
=== Pulse distance Width Protocols ===&lt;br /&gt;
||&lt;br /&gt;
[[Datei:Pulse-Distance-Width.png|miniatur|Pulse Distance Width Coding]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== NUBERT ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;NUBERT&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 36 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance width&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 10 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 0 address bits + 10 command bits ?&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 1340µs pulse, 340µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 500µs pulse, 1300µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 1340µs pulse, 340µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 500µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || once after 35ms&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || 3rd, 5th, 7th etc. indentical frame&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first?&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== FAN ====&lt;br /&gt;
&lt;br /&gt;
This protocol is very similar to [[IRMP_-_english#NUBERT|NUBERT]], but here it will be sent only one frame. Additionally there are 11 instead of 10 data bits and no stop bit. The pause time between frame repetitions is substantial lower.&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;FAN &#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 36 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance width&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 11 data bits + 0 stop bits&lt;br /&gt;
|-&lt;br /&gt;
| Data || 0 address bits + 11 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 1280µs pulse, 380µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 380µs pulse, 1280µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 1280µs pulse, 380µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 500µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after 6.6ms pause&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SPEAKER ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;SPEAKER&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance width&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 10 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 0 address bits + 10 command bits ?&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 440µs pulse, 1250µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 440µs pulse, 1250µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 1250µs pulse, 440µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 440µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || once after approx. 38ms&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || 3rd, 5th, 7th ... identical frame&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first?&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== ROOMBA ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;ROOMBA&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance width&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 7 data bits + 0 stop bits&lt;br /&gt;
|-&lt;br /&gt;
| Data || 0 address bits + 7 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 2790µs pulse, 930µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 930µs pulse, 2790µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 2790µs pulse, 930µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || no stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || 3 times after 18ms?&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || unknown&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width: 80%;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 20%;&amp;quot; |&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
=== Biphase Protocols ===&lt;br /&gt;
||&lt;br /&gt;
[[Datei:Biphase-Coding.png|miniatur|Biphase Coding]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== RC5 + RC5X ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#RC5 and RC5x Protocol|RC5 + RC5X]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 36 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || Biphase (Manchester)&lt;br /&gt;
|-&lt;br /&gt;
| Frame RC5 || 2 start bits + 12 data bits + 0 stop bits&lt;br /&gt;
|-&lt;br /&gt;
| Data RC5 || 1 toggle bit + 5 address bits + 6 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Frame RC5X || 1 start bit + 13 data bits + 0 stop bits&lt;br /&gt;
|-&lt;br /&gt;
| Data RC5X || 1 inverteds command bit + 1 toggle bit + 5 address bits + 6 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 889µs pause, 889µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 889µs pulse, 889µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 889µs pause, 889µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || no stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after approx. 100ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== RCII ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;RCII&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 31.25 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || Biphase (Manchester)&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 pre bit + 1 start bit + 9 data bits + 0 stop bits&lt;br /&gt;
|-&lt;br /&gt;
| Data || 0 address bits + 9 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Pre Bit || 512µs pulse, 2560µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 1024µs pulse, &#039;&#039;&#039;no space&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 512µs pause, 512µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 512µs pulse, 512µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || no stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after approx. 118ms&lt;br /&gt;
|-&lt;br /&gt;
| Remarks || An end command (111111111 = 0x1FF) is sent immediately after the button is released.&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== S100 ====&lt;br /&gt;
&lt;br /&gt;
Similar to RC5x, but 14 instead of 13 data bits and 56kHz modulation&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;S100&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 56 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || Biphase (Manchester)&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 14 data bits + 0 stop bits&lt;br /&gt;
|-&lt;br /&gt;
| Data || 1 inverted command bit + 1 toggle bit + 5 address bits + 7 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 889µs pause, 889µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 889µs pulse, 889µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 889µs pause, 889µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || no stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after approx. 100ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== RC6 + RC6A ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#RC6 and RC6A Protocol|RC6 + RC6A]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 36 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || Biphase (Manchester)&lt;br /&gt;
|-&lt;br /&gt;
| Frame RC6 || 1 start bit + 1 bit &amp;quot;1&amp;quot; + 3 mode bits (&amp;quot;000&amp;quot;) + 1 toggle bit + 16 data 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 (&amp;quot;110&amp;quot;) + 1 toggle bit + 31 data bits + 2666µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Data RC6 || 8 address bits + 8 Command Bits&lt;br /&gt;
|-&lt;br /&gt;
| Data RC6A || &amp;quot;1&amp;quot; + 14 customer bits + 8 system bits + 8 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Data RC6A Pace (Sky) || &amp;quot;1&amp;quot; + 3 mode bits (&amp;quot;110&amp;quot;) + 1 toggle bit (UNUSED &amp;quot;0&amp;quot;) + 16 bits + 1 toggle(!) + 15 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 2666µs pulse, 889µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Toggle 0 bit || 889µs pause, 889µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Toggle 1 bit || 889µs pulse, 889µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 444µs pause, 444µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 444µs pulse, 444µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || no stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after approx. 100ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== GRUNDIG + NOKIA ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#Grundig Protocol|GRUNDIG + NOKIA]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz (?)&lt;br /&gt;
|-&lt;br /&gt;
| Coding || Biphase (Manchester)&lt;br /&gt;
|-&lt;br /&gt;
| Frame packet || 1 start frame + 19.968ms pause + N data frames + 117.76ms pause + 1 stop frame&lt;br /&gt;
|-&lt;br /&gt;
| Start frame || 1 pre bit + 1 start bit + 9 data bits (all 1) + 0 stop bits&lt;br /&gt;
|-&lt;br /&gt;
| Data frame || 1 pre bit + 1 start bit + 9 data bits + 0 stop bits&lt;br /&gt;
|-&lt;br /&gt;
| Stop frame || 1 pre bit + 1 start bit + 9 data bits (all 1) + 0 stop bits&lt;br /&gt;
|-&lt;br /&gt;
| Data Grundig || 9 command bits + 0 address bits&lt;br /&gt;
|-&lt;br /&gt;
| Data Nokia || 8 command bits + 8 address bits&lt;br /&gt;
|-&lt;br /&gt;
| Pre bit || 528µs pulse, 2639µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 528µs pulse, 528µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 528µs pause, 528µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 528µs pulse, 528µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || no stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after approx. 117.76ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== IR60 (SDA2008) ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#IR60_.28SDA2008_and_MC14497P.29|IR60]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 30 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || Biphase (Manchester)&lt;br /&gt;
|-&lt;br /&gt;
| Start frame || 1 start bit + 101111 + 0 stop bits + 22ms pause&lt;br /&gt;
|-&lt;br /&gt;
| Data frame || 1 start bit + 7 data bits + 0 stop bits&lt;br /&gt;
|-&lt;br /&gt;
| Data || 0 address bits + 7 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 528µs pulse, 2639µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 528µs pause, 528µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 528µs pulse, 528µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || no stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after approx. 117.76ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SIEMENS + RUWIDO ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;SIEMENS + RUWIDO&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 36 kHz? (Merlin keyboard with Ruwido protocol: 56 kHz)&lt;br /&gt;
|-&lt;br /&gt;
| Coding || Biphase (Manchester)&lt;br /&gt;
|-&lt;br /&gt;
| Frame Siemens || 1 start bit + 22 data bits + 0 stop bits&lt;br /&gt;
|-&lt;br /&gt;
| Frame Ruwido || 1 start bit + 17 data bits + 0 stop bits&lt;br /&gt;
|-&lt;br /&gt;
| Data Siemens || 11 address bits + 10 command bits + 1 inverted bit (preceding bit inverted)&lt;br /&gt;
|-&lt;br /&gt;
| Data Ruwido || 9 address bits + 7 command bits + 1 inverted bit (preceding bit inverted)&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 275µs pulse, 275µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 275µs pause, 275µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 275µs pulse, 275µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || no stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || once with repeat bit set (?)&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after approx. 100ms (?)&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== A1TVBOX ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;A1TVBOX&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || Biphase (Manchester) asymmetric&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 2 start bits + 16 data bits + 0 stop bits&lt;br /&gt;
|-&lt;br /&gt;
| Data || 8 address bits + 8 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bits || &amp;quot;10&amp;quot;, also 250µs pulse, 150µs + 150µs pause, 250µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 150µs pause, 250µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 250µs pulse, 150µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || no stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || unknown&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== MERLIN ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;MERLIN&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 56 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || Biphase (Manchester) asymmetric&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 2 start bits + 18 data bits + 0 stop bits&lt;br /&gt;
|-&lt;br /&gt;
| Data || 8 address bits + 10 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bits || &amp;quot;10&amp;quot;, also 210µs pulse, 210µs + 210µs pause, 210µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 210µs pause, 210µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 210µs pulse, 210µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || no stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || unknown&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== ORTEK ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;ORTEK&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || Biphase (Manchester) symmetric&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 2 start bits + 18 data bits + 0 stop bits&lt;br /&gt;
|-&lt;br /&gt;
| Data || 6 address bits + 2 special bits +  6 command bits + 4 special bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 2000µs pulse, 1000µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 500µs pause, 500µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 500µs pulse, 500µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || no stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || 2 additional frames with special bits set&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || only repeats the 2nd frame&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Pulse Position Protocols ===&lt;br /&gt;
&lt;br /&gt;
==== NETBOX ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;NETBOX&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse position&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 16 data bits, no stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 3 address bits + 13 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 2400µs pulse, 800µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Bit Length || 800µs&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after approx. 35ms?&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Software History ==&lt;br /&gt;
&lt;br /&gt;
=== Changes of IRMP in 3.2.x === &lt;br /&gt;
&lt;br /&gt;
Version 3.2.6:&lt;br /&gt;
&lt;br /&gt;
* 2021-01-27: &#039;&#039;&#039;New IR Protocol:&#039;&#039;&#039; [[IRMP#MELINERA|MELINERA]]&lt;br /&gt;
* 2021-01-27: Protocol [[IRMP#LEGO|LEGO]]: Improved timing&lt;br /&gt;
* 2021-01-27: Protocol [[IRMP#RUWIDO|RUWIDO]]: Improved timing&lt;br /&gt;
* 2021-01-27: Protocol [[IRMP#NEC|NEC]]: Implemented send of raw NEC repetition frames &lt;br /&gt;
&lt;br /&gt;
Version 3.2.3:&lt;br /&gt;
&lt;br /&gt;
* 2020-08-15: &#039;&#039;&#039;New RF Protocol:&#039;&#039;&#039; [[IRMP#RF_MEDION|RF_MEDION]]&lt;br /&gt;
&lt;br /&gt;
Version 3.2.2:&lt;br /&gt;
&lt;br /&gt;
* 2020-07-09: Additional recognition of the radio channels with the RF_X10 protocol&lt;br /&gt;
* 2020-07-09: Improved RF frame detection with new stop bit handling.&lt;br /&gt;
* 2020-07-09: Improved detection of RF_GEN24 protocols&lt;br /&gt;
* 2020-07-09: &amp;lt;span style=&amp;quot;color:#FF0000&amp;quot;&amp;gt;&#039;&#039;&#039;NEU:&#039;&#039;&#039;&amp;lt;/span&amp;gt; Detection if/when a remote control button is released, see chapter &#039;&#039;&#039;[[IRMP_-_english#Debouncing|Debouncing]]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Version 3.2.1:&lt;br /&gt;
&lt;br /&gt;
* 2020-06-22: Mini bugfix&lt;br /&gt;
&lt;br /&gt;
Version 3.2.0:&lt;br /&gt;
&lt;br /&gt;
* 2020-06-22: Support of 433MHz RF modules&lt;br /&gt;
* 2020-06-22: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP#RF_GEN24|RF_GEN24]]&lt;br /&gt;
* 2020-06-22: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP#X10|X10]]&lt;br /&gt;
&lt;br /&gt;
=== Older Versions ===&lt;br /&gt;
&lt;br /&gt;
* 2019-08-26: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: METZ&lt;br /&gt;
* 2019-08-26: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: ONKYO&lt;br /&gt;
* 2018-09-10: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP#RCII|RCII]]&lt;br /&gt;
* 2018-09-06: Added support of STM32 mit HAL-Library&lt;br /&gt;
* 2018-08-30: New option: IRMP_USE_IDLE_CALL&lt;br /&gt;
* 2018-08-29: Port to ChibiOS&lt;br /&gt;
* 2018-08-29: New protocol: GREE&lt;br /&gt;
* 2018-02-19: corrected handling of irmp_flags for invalid frames&lt;br /&gt;
* 2017-08-25: New protocol: IRMP16 for transparent 16 bit data communication&lt;br /&gt;
* 2016-11-18: Corrected buffer overflow in irmp-main-avr-uart.c&lt;br /&gt;
* 2016-09-19: New protocol [[IRMP#VINCENT|VINCENT]]&lt;br /&gt;
* 2016-09-09: New protocol [[IRMP#MITSU_HEAVY|Mitsubishi Heavy (air conditioner)]]&lt;br /&gt;
* 2016-09-09: Some modifications for Compiler PIC C18&lt;br /&gt;
* 2016-01-16: Some corrections of port to ESP8266&lt;br /&gt;
* 2016-01-16: Added port to MBED&lt;br /&gt;
* 2016-01-16: Added several hardware dependent example main source files&lt;br /&gt;
* 2015-11-17: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#PANASONIC|PANASONIC (Beamer)]]&lt;br /&gt;
* 2015-11-17: Port to ESP8266&lt;br /&gt;
* 2015-11-17: Port to Teensy (3.x)&lt;br /&gt;
* 2015-11-10: Added support for STM8 microcontroller&lt;br /&gt;
* 2015-09-20: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#TECHNICS|TECHNICS]]&lt;br /&gt;
* 2015-06-15: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#ACP24|ACP24]]&lt;br /&gt;
* 2015-05-29: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#S100|S100]]&lt;br /&gt;
* 2015-05-29: Some smaller corrections&lt;br /&gt;
* 2015-05-28: Added Logging for XMega&lt;br /&gt;
* 2015-05-28: Timing corrections  for FAN protocol&lt;br /&gt;
* 2015-05-27: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#MERLIN|MERLIN]]&lt;br /&gt;
* 2015-05-27: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#FAN|FAN]]&lt;br /&gt;
* 2015-05-18: Added F_CPU macro for STM32L1XX&lt;br /&gt;
* 2015-05-18: Some corrections for XMega port&lt;br /&gt;
* 2015-04-23: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#PENTAX|PENTAX]]&lt;br /&gt;
* 2015-04-23: Port to AVR XMega&lt;br /&gt;
* 2014-09-19: Bugfix: added missing newline before #else&lt;br /&gt;
* 2014-09-18: Added logging for ARM STM32F10X&lt;br /&gt;
* 2014-09-17: Corrected PROGMEM access to array irmp_protocol_names[].&lt;br /&gt;
* 2014-09-15: Changed timing tolerances for [[IRMP_-_english#KASEIKYO|KASEIKYO]] protocol&lt;br /&gt;
* 2014-09-15: Moved  irmp_protocol_names to flash, additional UART routines in irmp-main-avr-uart.c&lt;br /&gt;
* 2014-07-21: Port to PIC 12F1840&lt;br /&gt;
* 2014-07-09: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#SAMSUNG48|SAMSUNG48]]&lt;br /&gt;
* 2014-07-09: Some small corrections&lt;br /&gt;
* 2014-07-01: Added logging for ARM_STM32F4XX&lt;br /&gt;
* 2014-07-01: IRMP port for PIC XC8 compiler, removed variadic macros because of stupid XC8 compiler :-(&lt;br /&gt;
* 2014-06-05: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#LGAIR|LGAIR]]&lt;br /&gt;
* 2014-05-30: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#SPEAKER|SPEAKER]]&lt;br /&gt;
* 2014-05-30: Optimized timings for [[IRMP_-_english#SAMSUNG|SAMSUNG]] protocol&lt;br /&gt;
* 2014-02-20: Corrected decoding of [[IRMP_-_english#SIEMENS_+_RUWIDO|SIEMENS]] protocol&lt;br /&gt;
* 2014-02-19: &#039;&#039;&#039;New protocols&#039;&#039;&#039;: [[IRMP_-_english#RCMM|RCMM32, RCMM24 and RCMM12]]&lt;br /&gt;
* 2014-09-17: Optimized timing for [[IRMP_-_english#ROOMBA|ROOMBA]]&lt;br /&gt;
* 2013-04-09: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#ROOMBA|ROOMBA]]&lt;br /&gt;
* 2013-04-09: Optimized detection of [[IRMP_-_english#ORTEK|ORTEK (Hama)]] frames&lt;br /&gt;
* 2013-03-19: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#ORTEK|ORTEK (Hama)]]&lt;br /&gt;
* 2013-03-19: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#TELEFUNKEN|TELEFUNKEN]]&lt;br /&gt;
* 2013-03-12: Changed timing tolerancies for [[IRMP_-_english#RECS80|RECS80]]- and  [[IRMP_-_english#RECS80EXT|RECS80EXT]] protocol&lt;br /&gt;
* 2013-01-21: Corrected detection of repetition frame beim [[IRMP_-_english#DENON|DENON]] protocol&lt;br /&gt;
* 2013-01-17: Corrected frame detection beim [[IRMP_-_english#DENON|DENON]] protocol&lt;br /&gt;
* 2012-12-11: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#A1TVBOX|A1TVBOX]]&lt;br /&gt;
* 2012-12-07: Improved detection von [[IRMP_-_english#DENON|DENON]] repetition frame&lt;br /&gt;
* 2012-11-19: Port to Stellaris LM4F120 TI Launchpad (ARM Cortex M4)&lt;br /&gt;
* 2012-11-06: Corrected [[IRMP_-_english#DENON|DENON]] frame detection&lt;br /&gt;
* 2012-10-26: Some timer corrections and adaptations for Arduino&lt;br /&gt;
* 2012-07-11: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#BOSE|BOSE]]&lt;br /&gt;
* 2012-06-18: Added support for ATtiny87/167&lt;br /&gt;
* 2012-06-05: Some smaller corrections of port to ARM STM32&lt;br /&gt;
* 2012-06-05: Correction of include in [http://www.mikrocontroller.net/svnbrowser/irmp/irmpextlog.c?view=markup irmpextlog.c]&lt;br /&gt;
* 2012-06-05: Bugfix, if only [[IRMP_-_english#NEC_+_extended_NEC|NEC]] and [[IRMP_-_english#NEC42|NEC42]] activated&lt;br /&gt;
* 2012-05-23: Port to ARM STM32&lt;br /&gt;
* 2012-05-23: Bugfix frame detection for [[IRMP_-_english#DENON|DENON]] protocol&lt;br /&gt;
* 2012-02-27: Bugfix in IR60-Decoder&lt;br /&gt;
* 2012-02-27: Bugfix in CRC calculation of  [[IRMP_-_english#KASEIKYO|KASEIKYO]] frames&lt;br /&gt;
* 2012-02-27: Port to C18 Compiler for PIC microcontrollers&lt;br /&gt;
* 2012-02-13: Bugfix: most significant bit in Address wrong in [[IRMP_-_english#NEC_+_extended_NEC|NEC]] protocol, if [[IRMP_-_english#NEC42|NEC42]] protocol activated, too&lt;br /&gt;
* 2012-02-13: Corrected timing of [[IRMP_-_english#SAMSUNG|SAMSUNG]]- and [[IRMP_-_english#SAMSUNG32|SAMSUNG32]] protocol&lt;br /&gt;
* 2012-02-13: [[IRMP_-_english#KASEIKYO|KASEIKYO]]: Genre2 bits will be now stored in upper nibble of flags&lt;br /&gt;
* 2011-09-20: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#KATHREIN|KATHREIN]]&lt;br /&gt;
* 2011-09-20: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#SIEMENS_+_RUWIDO|RUWIDO]]&lt;br /&gt;
* 2011-09-20: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#THOMSON|THOMSON]]&lt;br /&gt;
* 2011-09-20: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#IR60 (SDA2008)|IR60 (SDA2008)]]&lt;br /&gt;
* 2011-09-20: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#LEGO|LEGO]]&lt;br /&gt;
* 2011-09-20: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#NEC16|NEC16]]&lt;br /&gt;
* 2011-09-20: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#NEC42|NEC42]]&lt;br /&gt;
* 2011-09-20: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#NETBOX|NETBOX]]&lt;br /&gt;
* 2011-09-20: Port to ATtiny84 and ATtiny85&lt;br /&gt;
* 2011-09-20: Improved key repetition detection in [[IRMP_-_english#RC5_+_RC5X|RC5]] protocol&lt;br /&gt;
* 2011-09-20: Improved decoding of [[IRMP_-_english#Biphase|Biphase]] protocols&lt;br /&gt;
* 2011-09-20: Fixed some smaller bugs in [[IRMP_-_english#RECS80|RECS80]] decoder&lt;br /&gt;
* 2011-09-20: Corrected detection of additional bits in SIRCS protocol&lt;br /&gt;
* 2011-01-18: Some corrections for [[IRMP_-_english#SIEMENS_+_RUWIDO|SIEMENS]] protocol&lt;br /&gt;
* 2011-01-18: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#Nikon|Nikon]]&lt;br /&gt;
* 2011-01-18: [[IRMP_-_english#SIRCS|SIRCS]]: additional bits (&amp;gt;12) will be stored in address&lt;br /&gt;
* 2011-01-18: Some timing corrections for [[IRMP_-_english#DENON|DENON]] protocol&lt;br /&gt;
* 2010-09-04: Bugfix for F_INTERRUPTS &amp;gt;= 16000&lt;br /&gt;
* 2010-09-02: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#RC6_+_RC6A|RC6A]]&lt;br /&gt;
* 2010-08-29: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#JVC|JVC]]&lt;br /&gt;
* 2010-08-29: [[IRMP_-_english#KASEIKYO|KASEIKYO]] protocol: genre bits will be now stored&lt;br /&gt;
* 2010-08-29: [[IRMP_-_english#KASEIKYO|KASEIKYO]] protocol: Improved handling of repetition frames&lt;br /&gt;
* 2010-08-29: Improved support of [[IRMP_-_english#APPLE|APPLE]] protocols.&lt;br /&gt;
* 2010-07-01: Bugfix: added a timeout for [[IRMP_-_english#NEC_+_extended_NEC|NEC]] repetition frames. This avoids &#039;ghost commands&#039;.&lt;br /&gt;
* 2010-06-26: Bugfix: deactivated [[IRMP_-_english#RECS80|RECS80]], [[IRMP_-_english#RECS80EXT|RECS80EXT]] &amp;amp; [[IRMP_-_english#SIEMENS_+_RUWIDO|SIEMENS]] if interrupts frequency is low&lt;br /&gt;
* 2010-06-25: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#RCCAR|RCCAR]]&lt;br /&gt;
* 2010-06-25: Extended keyboard detection for [[IRMP_-_english#FDC|FDC]] protocol (IR keyboard)&lt;br /&gt;
* 2010-06-25: Interrupt frequency now up to 20kHz possible&lt;br /&gt;
* 2010-06-09: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#FDC|FDC]] (IR-keyboard)&lt;br /&gt;
* 2010-06-09: Corrected timing for [[IRMP_-_english#DENON|DENON]] protocol&lt;br /&gt;
* 2010-06-02: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#SIEMENS_+_RUWIDO|SIEMENS]] (Gigaset)&lt;br /&gt;
* 2010-05-26: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#GRUNDIG_+_NOKIA|NOKIA]]&lt;br /&gt;
* 2010-05-26: Bugfix: detection of long keyboard press for [[IRMP_-_english#GRUNDIG_+_NOKIA|GRUNDIG]] protocol&lt;br /&gt;
* 2010-05-17: Bugfix [[IRMP_-_english#SAMSUNG32|SAMSUNG32]] protocol: corrected command bit mask&lt;br /&gt;
* 2010-05-16: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#GRUNDIG_+_NOKIA|GRUNDIG]]&lt;br /&gt;
* 2010-05-16: Improved handling of automatic frame repetitions for [[IRMP_-_english#SIRCS|SIRCS]]-, [[IRMP_-_english#SAMSUNG32|SAMSUNG32]]-, and [[IRMP_-_english#NUBERT|NUBERT]] protocol&lt;br /&gt;
* 2010-04-28: Only some cosmetic code optimizations&lt;br /&gt;
* 2010-04-16: Improved all timing tolerancies&lt;br /&gt;
* 2010-04-12: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#B&amp;amp;O|Bang &amp;amp; Olufsen]]&lt;br /&gt;
* 2010-03-29: Bugfix: detection of multiple [[IRMP_-_english#NEC_+_extended_NEC|NEC]] repetition frames&lt;br /&gt;
* 2010-03-29: Moved configuration data to  [http://www.mikrocontroller.net/svnbrowser/irmp/irmpconfig.h?view=markup irmpconfig.h]&lt;br /&gt;
* 2010-03-29: Introduced a program version in README.txt: Version 1.0&lt;br /&gt;
* 2010-03-17: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#NUBERT|NUBERT]]&lt;br /&gt;
* 2010-03-16: Correction of RECS80 start bit timings&lt;br /&gt;
* 2010-03-16: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#RECS80EXT|RECS80 Extended]]&lt;br /&gt;
* 2010-03-15: Some optimizations&lt;br /&gt;
* 2010-03-14: Port to PIC&lt;br /&gt;
* 2010-03-11: Some adjustements for some ATMegas&lt;br /&gt;
* 2010-03-07: Bugfix: Reset of state machine after a incomplete [[IRMP_-_english#RC5_+_RC5X|RC5]] frame&lt;br /&gt;
* 2010-03-05: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#APPLE|APPLE]]&lt;br /&gt;
* 2010-03-05: Data  irmp_data.addr + irmp_data.command will be now stored in the bit order of the appropriate protocol&lt;br /&gt;
* 2010-03-04: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#SAMSUNG32|SAMSUNG32]] (Mix aus [[IRMP_-_english#SAMSUNG|SAMSUNG]] &amp;amp; [[IRMP_-_english#NEC_+_extended_NEC|NEC]] protocol)&lt;br /&gt;
* 2010-03-04: Changed some timer tolerances changes of [[IRMP_-_english#SIRCS|SIRCS]]- and [[IRMP_-_english#KASEIKYO|KASEIKYO]]&lt;br /&gt;
* 2010-03-02: [[IRMP_-_english#SIRCS|SIRCS]]: corrected detection and suppression of automatic frame repetitions&lt;br /&gt;
* 2010-03-02: [[IRMP_-_english#SIRCS|SIRCS]]: device ID bits will be now stored in irmp_data.command (not irmp_data.address anymore)&lt;br /&gt;
* 2010-03-02: Enlargement of scan buffers (for logging)&lt;br /&gt;
* 2010-02-24: New variable flags in IRMP_DATA for detection of long key press&lt;br /&gt;
* 2010-02-20: Bugfix [[IRMP_-_english#DENON|DENON]] protocol: repetition frame is now basically inverted&lt;br /&gt;
* 2010-02-19: Detection of [[IRMP_-_english#NEC_+_extended_NEC|NEC]] protocol-Varianten, z.&amp;amp;nbsp;B. [[IRMP_-_english#APPLE|APPLE]]-Fernbedienung&lt;br /&gt;
* 2010-02-19: Detection of [[IRMP_-_english#RC6_+_RC6A|RC6]]- and [[IRMP_-_english#DENON|DENON]] protocol&lt;br /&gt;
* 2010-02-19: Some improvements for [[IRMP_-_english#RC5_+_RC5X|RC5]] decoders (Bugfixes)&lt;br /&gt;
* 2010-02-13: Bugfix: Puls/Pause counters were 1 too low, now better detection of protokols with very short pulses&lt;br /&gt;
* 2010-02-13: Improved detection of [[IRMP_-_english#NEC_+_extended_NEC|NEC]] repetition frames&lt;br /&gt;
* 2010-02-12: New: [[IRMP_-_english#RC5_+_RC5X|RC5]] protocol&lt;br /&gt;
* 2010-02-05: Eliminated a conflict between [[IRMP_-_english#SAMSUNG|SAMSUNG]]- and [[IRMP_-_english#MATSUSHITA|MATSUSHITA]] protocol&lt;br /&gt;
* 2010-01-07: First version&lt;br /&gt;
&lt;br /&gt;
== Literature ==&lt;br /&gt;
&lt;br /&gt;
=== IR Abstract ===&lt;br /&gt;
&lt;br /&gt;
* http://www.sbprojects.net/knowledge/ir/index.php&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&lt;br /&gt;
* http://mc.mikrocontroller.com/de/IR-Protokolle.php&lt;br /&gt;
&lt;br /&gt;
=== SIRCS Protocol ===&lt;br /&gt;
&lt;br /&gt;
* http://www.sbprojects.net/knowledge/ir/sirc.php&lt;br /&gt;
* http://mc.mikrocontroller.com/de/IR-Protokolle.php#SIRCS&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;
* http://www.celadon.com/infrared_protocol/infrared_protocols_samples.pdf&lt;br /&gt;
&lt;br /&gt;
=== NEC Protocol ===&lt;br /&gt;
&lt;br /&gt;
* http://www.sbprojects.net/knowledge/ir/nec.php&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;
=== ACP24 Protocol ===&lt;br /&gt;
&lt;br /&gt;
The ACP24-Protocol is used by Stiebel-Eltron-Aircons&lt;br /&gt;
&lt;br /&gt;
The structure of the 70 databits is :&lt;br /&gt;
&lt;br /&gt;
              1         2         3         4         5         6&lt;br /&gt;
    0123456789012345678901234567890123456789012345678901234567890123456789&lt;br /&gt;
    N VVMMM    ? ???    t vmA x                 y                     TTTT&lt;br /&gt;
    0011001000000111000010001010000000000000000010000000000000000000001111on, temp=30&lt;br /&gt;
&lt;br /&gt;
These are converted into the following 16 bits from irmp_data.command:&lt;br /&gt;
&lt;br /&gt;
        5432109876543210&lt;br /&gt;
        NAVVvMMMmtxyTTTT&lt;br /&gt;
&lt;br /&gt;
Meaning of the symbols:&lt;br /&gt;
&lt;br /&gt;
    TTTT = Temperature + 15 degree&lt;br /&gt;
            TTTT&lt;br /&gt;
            ----------&lt;br /&gt;
            0000        ???&lt;br /&gt;
            0001        ???&lt;br /&gt;
            0010        ???&lt;br /&gt;
            0011        18 degree&lt;br /&gt;
            0100        19 degree&lt;br /&gt;
            0101        20 degree&lt;br /&gt;
            0110        21 degree&lt;br /&gt;
            ...&lt;br /&gt;
            1111        30 degree&lt;br /&gt;
&lt;br /&gt;
    N    = Nightmode&lt;br /&gt;
            N&lt;br /&gt;
            ----------&lt;br /&gt;
            0           off&lt;br /&gt;
            1           on&lt;br /&gt;
&lt;br /&gt;
    VV   = fan, v must be 1!&lt;br /&gt;
            VV   v&lt;br /&gt;
            ----------&lt;br /&gt;
            00   1      level 1&lt;br /&gt;
            01   1      level 2&lt;br /&gt;
            10   1      level 3&lt;br /&gt;
            11   1      Automatic&lt;br /&gt;
&lt;br /&gt;
    MMM  = Mode&lt;br /&gt;
            MMM  m&lt;br /&gt;
            ----------&lt;br /&gt;
            000  0      turn off&lt;br /&gt;
            001  0      turn on&lt;br /&gt;
            001  1      cooling&lt;br /&gt;
            010  1      fan&lt;br /&gt;
            011  1      demist&lt;br /&gt;
            100  1      ???&lt;br /&gt;
            101  1      ---&lt;br /&gt;
            110  1      ---&lt;br /&gt;
            111  1      ---&lt;br /&gt;
&lt;br /&gt;
    A    = Automatic-Programm&lt;br /&gt;
            A&lt;br /&gt;
            ----------&lt;br /&gt;
            0           off&lt;br /&gt;
            1           on&lt;br /&gt;
&lt;br /&gt;
    t   = Timer&lt;br /&gt;
            t   x y&lt;br /&gt;
            ----------&lt;br /&gt;
            1   1 0     Timer 1&lt;br /&gt;
            1   0 1     Timer 2&lt;br /&gt;
&lt;br /&gt;
To control the air con via [[IRSND_-_english|IRSND]], the following functions can be used:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;irmp.h&amp;quot;&lt;br /&gt;
#include &amp;quot;irsnd.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#define IRMP_ACP24_TEMPERATURE_MASK         0x000F                                          // TTTT&lt;br /&gt;
&lt;br /&gt;
#define IRMP_ACP24_SET_TIMER_MASK           (1&amp;lt;&amp;lt;6)                                          // t&lt;br /&gt;
#define IRMP_ACP24_TIMER1_MASK              (1&amp;lt;&amp;lt;5)                                          // x&lt;br /&gt;
#define IRMP_ACP24_TIMER2_MASK              (1&amp;lt;&amp;lt;4)                                          // y&lt;br /&gt;
&lt;br /&gt;
#define IRMP_ACP24_SET_MODE_MASK            (1&amp;lt;&amp;lt;7)                                          // m&lt;br /&gt;
#define IRMP_ACP24_MODE_POWER_ON_MASK       (1&amp;lt;&amp;lt;8)                                          // MMMm = 0010 Einschalten&lt;br /&gt;
#define IRMP_ACP24_MODE_COOLING_MASK        (IRMP_ACP24_SET_MODE_MASK | (1&amp;lt;&amp;lt;8))             // MMMm = 0011 Kuehlen&lt;br /&gt;
#define IRMP_ACP24_MODE_VENTING_MASK        (IRMP_ACP24_SET_MODE_MASK | (1&amp;lt;&amp;lt;9))             // MMMm = 0101 Lueften&lt;br /&gt;
#define IRMP_ACP24_MODE_DEMISTING_MASK      (IRMP_ACP24_SET_MODE_MASK | (1&amp;lt;&amp;lt;10) | (1&amp;lt;&amp;lt;8))   // MMMm = 1001 Entfeuchten&lt;br /&gt;
&lt;br /&gt;
#define IRMP_ACP24_SET_FAN_STEP_MASK        (1&amp;lt;&amp;lt;11)                                         // v&lt;br /&gt;
#define IRMP_ACP24_FAN_STEP_MASK            0x3000                                          // VV&lt;br /&gt;
#define IRMP24_ACP_FAN_STEP_BIT             12                                              // VV&lt;br /&gt;
#define IRMP_ACP24_AUTOMATIC_MASK           (1&amp;lt;&amp;lt;14)                                         // A&lt;br /&gt;
#define IRMP_ACP24_NIGHT_MASK               (1&amp;lt;&amp;lt;15)                                         // N&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// possible values for acp24_set_mode();&lt;br /&gt;
#define ACP24_MODE_COOLING                  1&lt;br /&gt;
#define ACP24_MODE_VENTING                  2&lt;br /&gt;
#define ACP24_MODE_DEMISTING                3&lt;br /&gt;
&lt;br /&gt;
static uint8_t temperature = 18;                                                    // 18 degrees&lt;br /&gt;
&lt;br /&gt;
static void&lt;br /&gt;
acp24_send (uint16_t cmd)&lt;br /&gt;
{&lt;br /&gt;
    IRMP_DATA irmp_data;&lt;br /&gt;
&lt;br /&gt;
    cmd |=  (temperature - 15) &amp;amp; IRMP_ACP24_TEMPERATURE_MASK;&lt;br /&gt;
&lt;br /&gt;
    irmp_data.protocol = IRMP_ACP24_PROTOCOL;&lt;br /&gt;
    irmp_data.address  = 0x0000;&lt;br /&gt;
    irmp_data.command  = cmd;&lt;br /&gt;
    irmp_data.flags    = 0;&lt;br /&gt;
&lt;br /&gt;
    irsnd_send_data (&amp;amp;irmp_data, 1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void&lt;br /&gt;
acp24_set_temperature (uint8_t temp)&lt;br /&gt;
{&lt;br /&gt;
    uint16_t    cmd = IRMP_ACP24_MODE_POWER_ON_MASK;&lt;br /&gt;
&lt;br /&gt;
    temperature = temp;&lt;br /&gt;
    acp24_send (cmd);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void&lt;br /&gt;
acp24_off (void)&lt;br /&gt;
{&lt;br /&gt;
    uint16_t    cmd = 0;&lt;br /&gt;
    acp24_send (cmd);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#define ACP_FAN_STEP1       0&lt;br /&gt;
#define ACP_FAN_STEP2       1&lt;br /&gt;
#define ACP_FAN_STEP3       2&lt;br /&gt;
#define ACP_FAN_AUTOMATIC   3&lt;br /&gt;
&lt;br /&gt;
void&lt;br /&gt;
acp24_fan (uint8_t fan_step)&lt;br /&gt;
{&lt;br /&gt;
    uint16_t    cmd = IRMP_ACP24_MODE_POWER_ON_MASK;&lt;br /&gt;
&lt;br /&gt;
    cmd |= IRMP_ACP24_SET_FAN_STEP_MASK | ((fan_step &amp;lt;&amp;lt; IRMP24_ACP_FAN_STEP_BIT) &amp;amp; IRMP_ACP24_FAN_STEP_MASK);&lt;br /&gt;
&lt;br /&gt;
    acp24_send (cmd);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void&lt;br /&gt;
acp24_set_mode (uint8_t mode)&lt;br /&gt;
{&lt;br /&gt;
    uint16_t    cmd = 0;&lt;br /&gt;
&lt;br /&gt;
    switch (mode)&lt;br /&gt;
    {&lt;br /&gt;
        case ACP24_MODE_COOLING:    cmd = IRMP_ACP24_MODE_COOLING_MASK;     break;&lt;br /&gt;
        case ACP24_MODE_VENTING:    cmd = IRMP_ACP24_MODE_VENTING_MASK;     break;&lt;br /&gt;
        case ACP24_MODE_DEMISTING:  cmd = IRMP_ACP24_MODE_DEMISTING_MASK;   break;&lt;br /&gt;
        default: return;&lt;br /&gt;
    }&lt;br /&gt;
    acp24_send (cmd);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void&lt;br /&gt;
acp24_program_automatic (void)&lt;br /&gt;
{&lt;br /&gt;
    uint16_t    cmd = IRMP_ACP24_MODE_POWER_ON_MASK | IRMP_ACP24_AUTOMATIC_MASK;&lt;br /&gt;
    acp24_send (cmd);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void&lt;br /&gt;
acp24_program_night (void)&lt;br /&gt;
{&lt;br /&gt;
    uint16_t    cmd = IRMP_ACP24_MODE_POWER_ON_MASK | IRMP_ACP24_NIGHT_MASK;&lt;br /&gt;
    acp24_send (cmd);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== LGAIR Protocol ===&lt;br /&gt;
&lt;br /&gt;
The LG Air Con is controlled by an &#039;intelligent&#039; remote. These are the encoded data:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    Command                 AAAAAAAA  PW  Z  S  T  mmm  tttt  vvvv  PPPP&lt;br /&gt;
    --------------------------------------------------------------------&lt;br /&gt;
    ON 23C                  10001000  00  0  0  0  000  1000  0100  1100&lt;br /&gt;
    ON 26C                  10001000  00  0  0  0  000  1011  0100  1111&lt;br /&gt;
&lt;br /&gt;
    OFF                     10001000  11  0  0  0  000  0000  0101  0001&lt;br /&gt;
    TURN OFF                10001000  11  0  0  0  000  0000  0101  0001  (18C currently, identical to off)&lt;br /&gt;
&lt;br /&gt;
    TEMP DOWN 23C           10001000  00  0  0  1  000  1000  0100  0100&lt;br /&gt;
    MODE (to mode0, 23C)    10001000  00  0  0  1  000  1000  0100  0100&lt;br /&gt;
&lt;br /&gt;
    TEMP UP (24C)           10001000  00  0  0  1  000  1001  0100  0101&lt;br /&gt;
    TEMP DOWN 24C           10001000  00  0  0  1  000  1001  0100  0101&lt;br /&gt;
&lt;br /&gt;
    TEMP UP (25C)           10001000  00  0  0  1  000  1010  0100  0110&lt;br /&gt;
    TEMP DOWN 25C           10001000  00  0  0  1  000  1010  0100  0110&lt;br /&gt;
&lt;br /&gt;
    TEMP UP (26C)           10001000  00  0  0  1  000  1011  0100  0111&lt;br /&gt;
&lt;br /&gt;
    MODE                    10001000  00  0  0  1  011  0111  0100  0110  (to mode1, 22C - when switching to mode1 temp automaticall sets to 22C)&lt;br /&gt;
    ON (mode1, 22C)         10001000  00  0  0  0  011  0111  0100  1110&lt;br /&gt;
&lt;br /&gt;
    MODE                    10001000  00  0  0  1  001  1000  0100  0101  (to mode2, no temperature displayed)&lt;br /&gt;
    ON (mode2)              10001000  00  0  0  0  001  1000  0100  1101&lt;br /&gt;
    MODE (to mode3, 23C)    10001000  00  0  0  1  100  1000  0100  1000&lt;br /&gt;
    ON (mode3, 23C)         10001000  00  0  0  0  100  1000  0100  0000&lt;br /&gt;
&lt;br /&gt;
    VENTILATION SLOW        10001000  00  0  0  1  000  0011  0000  1011&lt;br /&gt;
    VENTILATION MEDIUM      10001000  00  0  0  1  000  0011  0010  1101&lt;br /&gt;
    VENTILATION HIGH        10001000  00  0  0  1  000  0011  0100  1111&lt;br /&gt;
    VENTILATION LIGHT       10001000  00  0  0  1  000  0011  0101  0000&lt;br /&gt;
&lt;br /&gt;
    SWING ON/OFF            10001000  00  0  1  0  000  0000  0000  0001&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    Format:     1 start bit + 8 address bits + 16 data bits + 4 checksum bits + 1 stop bit&lt;br /&gt;
&lt;br /&gt;
    Address:    AAAAAAAA = 0x88 (8 bits)&lt;br /&gt;
&lt;br /&gt;
    Data:       PW Z S T MMM tttt vvvv PPPP (16 bits)&lt;br /&gt;
&lt;br /&gt;
                PW:         Power:     00 = On, 11 = Off&lt;br /&gt;
&lt;br /&gt;
                Z:          N/A:       Always 0&lt;br /&gt;
&lt;br /&gt;
                S:          Swing:     1 = Toggle swing, all other data bits are zeros.&lt;br /&gt;
&lt;br /&gt;
                T:          Temp/Vent: 1 = Set temperature and ventilation&lt;br /&gt;
&lt;br /&gt;
                MMM:        Mode, can be combined with temperature&lt;br /&gt;
                            000=Mode 0&lt;br /&gt;
                            001=Mode 2&lt;br /&gt;
                            010=????&lt;br /&gt;
                            011=Mode 1&lt;br /&gt;
                            100=Mode 3&lt;br /&gt;
                            101=???&lt;br /&gt;
                            111=???&lt;br /&gt;
&lt;br /&gt;
                tttt:       Temperature:&lt;br /&gt;
                            0000=used by OFF command&lt;br /&gt;
                            0001=????&lt;br /&gt;
                            0010=????&lt;br /&gt;
                            0011=18°C&lt;br /&gt;
                            0100=19°C&lt;br /&gt;
                            0101=20°C&lt;br /&gt;
                            0110=21°C&lt;br /&gt;
                            0111=22°C&lt;br /&gt;
                            1000=23°C&lt;br /&gt;
                            1001=24°C&lt;br /&gt;
                            1010=25°C&lt;br /&gt;
                            1011=26°C&lt;br /&gt;
                            1011=27°C&lt;br /&gt;
                            1100=28°C&lt;br /&gt;
                            1101=29°C&lt;br /&gt;
                            1111=30°C&lt;br /&gt;
&lt;br /&gt;
                vvvv:       Ventilation:&lt;br /&gt;
                            0000=slow&lt;br /&gt;
                            0010=medium&lt;br /&gt;
                            0011=????&lt;br /&gt;
                            0100=high&lt;br /&gt;
                            0101=light&lt;br /&gt;
                            0110=????&lt;br /&gt;
                            0111=????&lt;br /&gt;
                            ...&lt;br /&gt;
                            1111=????&lt;br /&gt;
&lt;br /&gt;
    Checksum:   PPPP = (DataNibble1 + DataNibble2 + DataNibble3 + DataNibble4) &amp;amp; 0x0F&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== NEC16 Protocol (JVC) ===&lt;br /&gt;
&lt;br /&gt;
* http://www.sbprojects.net/knowledge/ir/jvc.php&lt;br /&gt;
* http://www.ustr.net/infrared/jvc.shtml&lt;br /&gt;
&lt;br /&gt;
=== Samsung Protocol ===&lt;br /&gt;
&lt;br /&gt;
(was reverse engineered by several protocols (Daewoo or similar), so no direct link to Samsung documents is available)&lt;br /&gt;
&lt;br /&gt;
Here is a link to the Daewoo-protocol, which uses the same principle of the sync-bits in the center of a frame, but words with different timings:&lt;br /&gt;
&lt;br /&gt;
* http://users.telenet.be/davshomepage/daewoo.htm&lt;br /&gt;
&lt;br /&gt;
=== MATSUHITA Protocol ===&lt;br /&gt;
&lt;br /&gt;
* http://www.celadon.com/infrared_protocol/infrared_protocols_samples.pdf&lt;br /&gt;
&lt;br /&gt;
=== KASEIKYO Protocol (&amp;quot;Japan Protocol&amp;quot;) ===&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;
=== RECS80 and RECS80 Extended Protocol ===&lt;br /&gt;
&lt;br /&gt;
* http://www.sbprojects.net/knowledge/ir/recs80.php&lt;br /&gt;
&lt;br /&gt;
=== RC5 and RC5x Protocol ===&lt;br /&gt;
&lt;br /&gt;
* http://www.sbprojects.net/knowledge/ir/rc5.php&lt;br /&gt;
* http://mc.mikrocontroller.com/de/IR-Protokolle.php#RC5&lt;br /&gt;
* http://users.telenet.be/davshomepage/rc5.htm&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;
&lt;br /&gt;
=== Denon Protocol ===&lt;br /&gt;
&lt;br /&gt;
* http://www.mikrocontroller.com/de/IR-Protokolle.php#DENON&lt;br /&gt;
* http://www.manualowl.com/m/Denon/AVR-3803/Manual/170243&lt;br /&gt;
&lt;br /&gt;
=== RC6 and RC6A Protocol ===&lt;br /&gt;
&lt;br /&gt;
* http://www.sbprojects.net/knowledge/ir/rc6.php&lt;br /&gt;
* http://www.picbasic.nl/info_rc6_uk.htm&lt;br /&gt;
&lt;br /&gt;
=== Bang &amp;amp; Olufsen ===&lt;br /&gt;
&lt;br /&gt;
* http://www.mikrocontroller.net/attachment/33137/datalink.pdf&lt;br /&gt;
&lt;br /&gt;
=== Grundig Protocol ===&lt;br /&gt;
&lt;br /&gt;
* http://www.see-solutions.de/sonstiges/Grundig_10bit.pdf&lt;br /&gt;
&lt;br /&gt;
=== Nokia Protocol ===&lt;br /&gt;
&lt;br /&gt;
* http://www.sbprojects.net/knowledge/ir/nrc17.php&lt;br /&gt;
&lt;br /&gt;
=== IR60 (SDA2008 and MC14497P) ===&lt;br /&gt;
&lt;br /&gt;
* http://www.datasheetcatalog.org/datasheet/motorola/MC14497P.pdf&lt;br /&gt;
&lt;br /&gt;
=== LEGO Power Functions RC ===&lt;br /&gt;
&lt;br /&gt;
* http://www.philohome.com/pf/LEGO_Power_Functions_RC_v110.pdf&lt;br /&gt;
&lt;br /&gt;
=== RCMM Protocol ===&lt;br /&gt;
&lt;br /&gt;
* http://www.sbprojects.net/knowledge/ir/rcmm.php&lt;br /&gt;
&lt;br /&gt;
=== Other Protocols ===&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.roboternetz.de/phpBB2/files/entwicklung_und_realisierung_einer_universalinfrarotfernbedienung_mit_timerfunktionen.pdf&lt;br /&gt;
&lt;br /&gt;
== IRMP on Youtube ==&lt;br /&gt;
&lt;br /&gt;
* http://www.youtube.com/watch?v=Q7DJvLIyTEI&lt;br /&gt;
&lt;br /&gt;
* http://www.youtube.com/watch?v=1tQ_aqayWZk&lt;br /&gt;
&lt;br /&gt;
* http://www.youtube.com/watch?v=W4tI2axR3-w&lt;br /&gt;
&lt;br /&gt;
* http://www.youtube.com/watch?v=SRs98dIe2WE&lt;br /&gt;
&lt;br /&gt;
== Other Artikels ==&lt;br /&gt;
&lt;br /&gt;
[http://www.infineon.com/dgdl/RF2ir+WhitePaper+V1.0.pdf?folderId=db3a3043191a246301192dd3ee2c2ae4&amp;amp;fileId=db3a30432b57a660012b5c16272c2e81 Whitepaper von Martin Gotschlich, Infineon Technologies AG]&lt;br /&gt;
&lt;br /&gt;
== Hardware / IRMP Projects ==&lt;br /&gt;
&lt;br /&gt;
=== Remote IRMP ===&lt;br /&gt;
&lt;br /&gt;
Infrared sender und receiver controlled via ip network with Android smartphone as remote control:&lt;br /&gt;
&lt;br /&gt;
 * http://www.mikrocontroller.net/articles/Remote_IRMP&lt;br /&gt;
&lt;br /&gt;
=== IR Tester ===&lt;br /&gt;
&lt;br /&gt;
IR tester with LCD by Klaus Leidinger:&lt;br /&gt;
&lt;br /&gt;
* http://www.mikrocontroller-projekte.de/Mikrocontroller/index.html&lt;br /&gt;
&lt;br /&gt;
=== IR Tester with AVR-NET-IO ===&lt;br /&gt;
&lt;br /&gt;
IR tester for Pollin AVR-NET-IO with Pollin ADD-ON Board:&lt;br /&gt;
&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 ===&lt;br /&gt;
&lt;br /&gt;
USB IR remote receiver by Hugo Portisch:&lt;br /&gt;
* http://www.mikrocontroller.net/articles/USB_IR_Remote_Receiver&lt;br /&gt;
&lt;br /&gt;
=== USB IR Receiver/Sender/Switch with Wakeup-Timer ===&lt;br /&gt;
&lt;br /&gt;
* http://www.vdr-portal.de/board18-vdr-hardware/board13-fernbedienungen/123572-fertig-irmp-auf-stm32-ein-usb-ir-empf%C3%A4nger-sender-einschalter-mit-wakeup-timer/&lt;br /&gt;
&lt;br /&gt;
* http://www.mikrocontroller.net/articles/IRMP_auf_STM32_-_ein_USB_IR_Empf%C3%A4nger/Sender/Einschalter_mit_Wakeup-Timer&lt;br /&gt;
&lt;br /&gt;
=== USBASP ===&lt;br /&gt;
&lt;br /&gt;
IR switch based on USBasp&lt;br /&gt;
* http://wiki.easy-vdr.de/index.php?title=USBASP_Einschalter&lt;br /&gt;
&lt;br /&gt;
=== Servo controlled IR Sender ===&lt;br /&gt;
&lt;br /&gt;
Servo controlled IR Sender (adaptive) by Stefan Pendsa:&lt;br /&gt;
* http://forum.mikrokopter.de/topic-21060.html&lt;br /&gt;
* [http://svn.mikrokopter.de/listing.php?repname=Projects&amp;amp;path=%2FServo-Controlled+IR-Transmitter%2F&amp;amp;#Ad2417800d6aa14bf08c571a896e9def7 SVN]&lt;br /&gt;
&lt;br /&gt;
=== Adaptive IR Remote Control ===&lt;br /&gt;
&lt;br /&gt;
Adaptive IR remote control by Robert and Frank M.&lt;br /&gt;
* http://www.mikrocontroller.net/articles/DIY_Lernfähige_Fernbedienung_mit_IRMP&lt;br /&gt;
&lt;br /&gt;
=== AVR Moodlight ===&lt;br /&gt;
&lt;br /&gt;
AVR Moodlight by Axel Schwenke&lt;br /&gt;
* http://www.mikrocontroller.net/topic/244768&lt;br /&gt;
&lt;br /&gt;
STM8 Moodlight by Axel Schwenke&lt;br /&gt;
* https://www.mikrocontroller.net/topic/380098&lt;br /&gt;
&lt;br /&gt;
=== Infinity Mirror LED Ceiling Lamp ===&lt;br /&gt;
&lt;br /&gt;
Infinity Mirror LED ceiling lamp with remote control by Philipp Meißner&lt;br /&gt;
* http://digital-nw.de/Infinity-Mirror.htm&lt;br /&gt;
&lt;br /&gt;
=== Cinema Control ===&lt;br /&gt;
&lt;br /&gt;
Cinema control by Owagner&lt;br /&gt;
* http://ccc.zerties.org/index.php/Benutzer:Owagner&lt;br /&gt;
&lt;br /&gt;
=== Leading-Edge Control ===&lt;br /&gt;
&lt;br /&gt;
leading-edge control:&lt;br /&gt;
&lt;br /&gt;
* http://flosserver.dyndns.org/phasenanschnittsdimmer.php&lt;br /&gt;
&lt;br /&gt;
=== IRDioder – Ikea Dioder Hack ===&lt;br /&gt;
&lt;br /&gt;
Ikea Dioder Hack:&lt;br /&gt;
&lt;br /&gt;
* http://marco-difeo.de/tag/infrared/&lt;br /&gt;
&lt;br /&gt;
=== Expedit Coffee Bar ===&lt;br /&gt;
&lt;br /&gt;
Ikea Expedit as coffee bar:&lt;br /&gt;
&lt;br /&gt;
* http://chaozlabs.blogspot.de/2013/09/expedit-coffee-bar.html&lt;br /&gt;
&lt;br /&gt;
=== Arduino as IR Receiver ===&lt;br /&gt;
&lt;br /&gt;
Arduino as IR Receiver:&lt;br /&gt;
&lt;br /&gt;
* http://www.vdr-portal.de/board18-vdr-hardware/board13-fernbedienungen/110918-arduino-als-ir-empf%C3%A4nger-einsetzen/&lt;br /&gt;
&lt;br /&gt;
More example from the Arduino library:&lt;br /&gt;
&lt;br /&gt;
* https://github.com/ukw100/IRMP/tree/master/examples&lt;br /&gt;
&lt;br /&gt;
=== IR Volume Control with Stellaris Launchpad ===&lt;br /&gt;
&lt;br /&gt;
volume control with Stellaris Launchpad (ARM Cortex-M4F):&lt;br /&gt;
&lt;br /&gt;
* http://www.anthonyvh.com/2013/03/31/ir-volume-control/&lt;br /&gt;
&lt;br /&gt;
=== RemotePi Board ===&lt;br /&gt;
&lt;br /&gt;
Shutdown RaspPI with IR remote control:&lt;br /&gt;
&lt;br /&gt;
* http://www.msldigital.com/pages/more-information&lt;br /&gt;
&lt;br /&gt;
=== Ethernut &amp;amp; IRMP ===&lt;br /&gt;
&lt;br /&gt;
IRMP under RTOS Ethernut:&lt;br /&gt;
&lt;br /&gt;
* http://www.klkl.de/ethernut.html&lt;br /&gt;
&lt;br /&gt;
=== LED strip Remote Control ===&lt;br /&gt;
&lt;br /&gt;
LED strip remote control:&lt;br /&gt;
&lt;br /&gt;
* http://www.solderlab.de/index.php/misc/led-strip-remote-control&lt;br /&gt;
&lt;br /&gt;
=== ADAT Audio Mixer ===&lt;br /&gt;
&lt;br /&gt;
Audio Mixer:&lt;br /&gt;
&lt;br /&gt;
* http://mailtonne.de/adat-audio-mixer/&lt;br /&gt;
&lt;br /&gt;
=== Ethersex &amp;amp; IRMP ===&lt;br /&gt;
&lt;br /&gt;
IRMP + IRSND Modul in Ethersex, a modular Firmware for AVR MCUs&lt;br /&gt;
&lt;br /&gt;
* http://ethersex.de/index.php/IRMP&lt;br /&gt;
&lt;br /&gt;
=== Mastermind Solver ===&lt;br /&gt;
&lt;br /&gt;
Mastermind solver with LED stripes and IR remote control:&lt;br /&gt;
&lt;br /&gt;
* http://www.mystrobl.de/Plone/basteleien/weitere-bulls-and-cows-mastermind-implementationen/mm-v1821/mastermind-solver-mit-led-streifen-und-ir-fernbedienung&lt;br /&gt;
&lt;br /&gt;
=== A MythTV Remote Control without LIRC ===&lt;br /&gt;
&lt;br /&gt;
PC Remote Control with ATtiny85&lt;br /&gt;
&lt;br /&gt;
* http://tomscircuits.blogspot.de/2014/12/a-mythtv-remote-control-without-lirc.html&lt;br /&gt;
&lt;br /&gt;
=== IRMP + IRSND Library for STM32F4 ===&lt;br /&gt;
&lt;br /&gt;
IRMP for STM32F4&lt;br /&gt;
&lt;br /&gt;
* http://mikrocontroller.bplaced.net/wordpress/?page_id=1516&lt;br /&gt;
&lt;br /&gt;
IRSND for STM32F4&lt;br /&gt;
&lt;br /&gt;
* http://mikrocontroller.bplaced.net/wordpress/?page_id=1940&lt;br /&gt;
&lt;br /&gt;
=== IRMP on STM32 - Construction Guidance ===&lt;br /&gt;
&lt;br /&gt;
* http://www.mikrocontroller.net/articles/IRMP_auf_STM32_-_Bauanleitung&lt;br /&gt;
&lt;br /&gt;
=== Seminar Paper - Extension of Arduino Platform ===&lt;br /&gt;
&lt;br /&gt;
* www.eislab.fim.uni-passau.de/files/publications/2010/StudentDiener_ErweiterungDerArduinoPlattform.pdf&lt;br /&gt;
&lt;br /&gt;
== Acknowledgment ==&lt;br /&gt;
&lt;br /&gt;
I thank Vlad Tepesch, Klaus Leidinger, Peter K., and Dániel Körmendi, who sent me many scan files of their IR remote controls.&lt;br /&gt;
&lt;br /&gt;
I thank Christian F. for his tipps relating to the port to PIC MCUs, gera for the port to PIC-C18 compiler, kichi (Michael K.) for the port to ARM STM32, Markus Schuster for the port to TI&#039;s Stellaris LM4F120 Launchpad (ARM Cortex M4), Matthias Frank for the port to XMega, Wolfgang S. for the port to ESP8266, Achill Hasler for the port to Teensy, Axel Schwenke for the port to STM8.&lt;br /&gt;
&lt;br /&gt;
Thanks to Dániel Körmendi, who added the LG-AIR protocol to [[IRSND_-_english|IRSND]]. Thanks to Ulrich v.d. Kammer for the Pentax protocol extension in [[IRSND_-_english|IRSND]].&lt;br /&gt;
&lt;br /&gt;
At least I will thank Jojo S. for his great job translating this documentation!&lt;br /&gt;
&lt;br /&gt;
== Discussion ==&lt;br /&gt;
&lt;br /&gt;
You can discuss IRMP &amp;amp; IRSND in the German thread [http://www.mikrocontroller.net/topic/162119 Infrared Multi Protocol Decoder].&lt;br /&gt;
&lt;br /&gt;
Have fun with IRMP!&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Infrarot]]&lt;br /&gt;
[[Kategorie:AVR-Projekte]]&lt;/div&gt;</summary>
		<author><name>Tooki</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=IRMP_-_english&amp;diff=106078</id>
		<title>IRMP - english</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=IRMP_-_english&amp;diff=106078"/>
		<updated>2023-04-26T08:15:01Z</updated>

		<summary type="html">&lt;p&gt;Tooki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;By &#039;&#039;&#039;Frank M. ([http://www.mikrocontroller.net/user/show/ukw ukw])&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;This is the English translation of the [[IRMP#top|German IRMP documentation]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[[Datei:irmp-title.png| |Waveform of an NEC-format remote control signal]]&lt;br /&gt;
&lt;br /&gt;
Project Intent:&lt;br /&gt;
&lt;br /&gt;
Because RC5 is not only outdated, but obsolete, and because more and more electronic devices from Asian consumer electronics manufacturers are found in the home, it is time to develop an IR decoder that can &#039;understand&#039; about 90% of IR remotes that are used in our daily life.&lt;br /&gt;
&lt;br /&gt;
This article introduces &#039;IRMP&#039; as &amp;quot;Infrared Multi Protocol Decoder&amp;quot; in detail. The counterpart, the [[IRSND_-_english|IRSND]] IR encoder, can be found in this [[IRSND_-_english|document]].&lt;br /&gt;
&lt;br /&gt;
= IRMP - Infrared Multi Protocol Decoder =&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width: 80%;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 20%;&amp;quot; |&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
=== Supported MCUs ===&lt;br /&gt;
&lt;br /&gt;
[[IRMP_-_english#top|IRMP]] runs on numerous MCU families:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AVR&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* ATtiny87,  ATtiny167&lt;br /&gt;
* ATtiny45,  ATtiny85&lt;br /&gt;
* ATtiny44,  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;
&#039;&#039;&#039;XMega&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* ATXmega128&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC&#039;&#039;&#039; (CCS and XC8/C18 compiler)&lt;br /&gt;
&lt;br /&gt;
* PIC12F1840&lt;br /&gt;
* PIC18F4520&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;STM32&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* STM32F4xx (tested on STM32F401RE/F411RE Nucleo, STM32F4 Discovery)&lt;br /&gt;
* STM32F10x (tested on STM32F103C8T6 Mini Development Board)&lt;br /&gt;
* STM32 with HAL library &#039;&#039;&#039;(NEW!)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;STM8&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* STM8S103F3&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TI Stellaris&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* LM4F120 Launchpad (ARM Cortex M4)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ESP8266 (NEW!)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* ESP8266-EVB&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TEENSY 3.0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* MK20DX256VLH7 (ARM Cortex-M4 72MHz)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MBED (NEW!)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* LPC1347 Cortex-M3 72 MHz&lt;br /&gt;
* LPC4088 (Embedded Artists)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ChibiOS HAL (NEW!)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Various ARM Cortex MCUss, for example STM32, Kinetis, and NRF5&lt;br /&gt;
* [https://sourceforge.net/p/chibios/svn2/HEAD/tree/trunk/os/hal/ports/ Officially supported MCU series]&lt;br /&gt;
* [https://github.com/ChibiOS/ChibiOS-Contrib/tree/master/os/hal/ports More MCU series, community supported]&lt;br /&gt;
||&lt;br /&gt;
[[Datei:irmp-empfaenger.png|miniatur|Connection of a IR receiver module to MCU]]&lt;br /&gt;
|}&lt;br /&gt;
=== Supported IR Protocols ===&lt;br /&gt;
&lt;br /&gt;
[[IRMP_-_english#top|IRMP]] - the infrared remote decoder, which can decode several protocols at once - is capable of decoding the following protocols (in alphabetical order):&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|+ &#039;&#039;&#039;Supported Protocols&#039;&#039;&#039;&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! style=&amp;quot;width:15%&amp;quot; | Protocol || Vendor&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#A1TVBOX|A1TVBOX]] || ADB (Advanced Digital Broadcast), e.g. A1 TV Box&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#APPLE|APPLE]] || Apple&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#ACP24|ACP24]] || Stiebel Eltron&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#B&amp;amp;O|B&amp;amp;O]] || Bang &amp;amp; Olufsen&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#BOSE|BOSE]] || Bose&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#DENON|DENON]] || Denon, Sharp&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#FAN|FAN]] || FAN, remote for fans&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#FDC|FDC]] || FDC Keyboard&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#GRUNDIG_+_NOKIA|GRUNDIG]] || Grundig&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#GRUNDIG_+_NOKIA|NOKIA]] || Nokia, e.g. D-Box&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#IR60 (SDA2008)|IR60 (SDA2008)]] || various European vendors&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#JVC|JVC]] || JVC&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#KASEIKYO|KASEIKYO]] || Panasonic, Technics, Denon and other vendors which are members of the Japanese &amp;quot;Association for Electric Home Appliances&amp;quot; (AEHA).&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#KATHREIN|KATHREIN]]  || KATHREIN&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#LEGO|LEGO]]   || Lego&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#LGAIR|LGAIR]]   || LG air conditioners&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#MATSUSHITA|MATSUSHITA]] || Matsushita&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#MITSU_HEAVY|MITSU_HEAVY]] || Mitsubishi air conditioners&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#NEC16|NEC16]]  || JVC, Daewoo&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#NEC42|NEC42]]  || JVC&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#MERLIN|MERLIN]]  || MERLIN remote (Pollin article number: 620 185)&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#NEC_+_extended_NEC|NEC]] || NEC, Yamaha, Canon, Tevion, Harman/Kardon, Hitachi, JVC, Pioneer, Toshiba, Xoro, Orion, generic and many other Asian vendors.&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#NETBOX|NETBOX]]  || Netbox&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#Nikon|Nikon]] || Nikon&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#NUBERT|NUBERT]] || Nubert, e.g. Subwoofer Systems&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#ORTEK|ORTEK]] || Ortek, Hama&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#PANASONIC|PANASONIC]] || PANASONIC video projectors&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#PENTAX|PENTAX]] || PENTAX&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#RC5_+_RC5X|RC5]] || Philips and other European vendors&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#RC6_+_RC6A|RC6A]] || Philips, Kathrein and others, e.g. XBOX&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#RC6_+_RC6A|RC6]] || Philips and other European vendors&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#RCCAR|RCCAR]] || RC Car: IR remote for RC toys &lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#RCII|RCII]] || T+A &#039;&#039;&#039;(NEW!)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#RECS80|RECS80]] || Philips, Nokia, Thomson, Nordmende, Telefunken, Saba&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#RECS80EXT|RECS80EXT]] || Philips, Technisat, Thomson, Nordmende, Telefunken, Saba&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#RCMM|RCMM]] || Fujitsu-Siemens e.g. Activy keyboard&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#ROOMBA|ROOMBA]] || iRobot Roomba vacuum cleaner&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#S100|S100]] || similar to RC5, but 14 instead of 13 bits and 56kHz modulation. Vendor unknown.&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#SAMSUNG32|SAMSUNG32]] || Samsung&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#SAMSUNG48|SAMSUNG48]] || various air conditioners&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#SAMSUNG|SAMSUNG]] || Samsung&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#SIEMENS_+_RUWIDO|RUWIDO]] || RUWIDO (e.g. T-Home Media Receiver, MERLIN keyboard(Pollin))&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#SIEMENS_+_RUWIDO|SIEMENS]] || Siemens, e.g. Gigaset M740AV&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#SIRCS|SIRCS]] || Sony&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#SPEAKER|SPEAKER]] || Speaker systems like X-Tensions&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#TECHNICS|TECHNICS]] || Technics&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#TELEFUNKEN|TELEFUNKEN]] || Telefunken&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#THOMSON|THOMSON]] || Thomson&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#VINCENT|VINCENT]] || Vincent&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#FF0000&amp;quot;&amp;gt;&#039;&#039;&#039;New:&#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Starting with version 3.2, IRMP can also decode 433 MHz RF radio protocols.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|+ &#039;&#039;&#039;Supported RF Protocols&#039;&#039;&#039;&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! style=&amp;quot;width:15%&amp;quot; | Protocol&lt;br /&gt;
! style=&amp;quot;width:100em&amp;quot; | Vendor&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP#RF_GEN24|RF_GEN24]] || Generiv 24-bit format, e.g. Pollin 550666 radio-controlled receptacle&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP#RF_X10|RF_X10]] || X10 PC RF remote control (Medion), Pollin 721815&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Each of these protocols can be activated separately. If you want, you can activate all protocols. If you need only one protocol, you can disable all others. Only the code selected by the user will be compiled .&lt;br /&gt;
&lt;br /&gt;
=== History ===&lt;br /&gt;
&lt;br /&gt;
The [[IRMP_-_english#top|IRMP]] source for the AVR and PIC MCUs was created as part of the [[Word Clock]] project.&lt;br /&gt;
&lt;br /&gt;
=== Thread in Forum ===&lt;br /&gt;
&lt;br /&gt;
Intention for an own IRMP article is the following thread in Projects&amp;amp;Code [http://www.mikrocontroller.net/topic/162119 IRMP - Infrared Multi Protocol Decoder] (in German language).&lt;br /&gt;
&lt;br /&gt;
== IR Protocols ==&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width: 80%;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 20%;&amp;quot; |&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
Some vendors use their own proprietary protocols, such as Sony, Samsung, and Matsushita. Philips developed and used [[IRMP_-_english#RC5 + RC5X|RC5]].&lt;br /&gt;
[[IRMP_-_english#RC5 + RC5X|RC5]] was seen in Europe as &#039;&#039;the&#039;&#039; standard IR protocol which was adopted by many European vendors. Nowadays [[IRMP_-_english#RC5 + RC5X|RC5]] is practically not used and can be considered &amp;quot;dead&amp;quot;. Although the successor [[IRMP_-_english#RC6_+_RC6A|RC6]] is used in current European hardware, it is also used rarely.&lt;br /&gt;
&lt;br /&gt;
Japanese vendors also tried to establish their own standard, the so called [[IRMP_-_english#KASEIKYO|Kaseikyo]] (or &amp;quot;Japan&amp;quot;) protocol. With a word length of 48 bits, it is more versatile. But it has not found wide use, though it is found in some appliances.&lt;br /&gt;
&lt;br /&gt;
Nowadays the [[IRMP_-_english#NEC_+_extended_NEC|NEC]] protocol is used (also mainly in Japanese devices) in both premium and generic products. I estimate the market share at 80% for the [[IRMP_-_english#NEC_+_extended_NEC|NEC]] protocol. Nearly all remotes in my daily use utilize the [[IRMP_-_english#NEC_+_extended_NEC|NEC]] IR code. This starts with the TV set, continues with the DVD player and the notebook remote all the way to the generic multimedia hard drive, just to mention a few examples.&lt;br /&gt;
||&lt;br /&gt;
[[Datei:nec-protocol.png|miniatur|NEC protocol, RGB remote control, T-&amp;gt;A: 9.14ms, A-&amp;gt;B: 4.42ms, B-&amp;gt;C: 660us]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Coding methods ==&lt;br /&gt;
&lt;br /&gt;
[[IRMP_-_english#top|IRMP]] supports the following IR coding methods:&lt;br /&gt;
&lt;br /&gt;
* [[IRMP_-_english#Pulse Distance|Pulse Distance]], typ. Example: [[IRMP_-_english#NEC_+_extended_NEC|NEC]]&lt;br /&gt;
* [[IRMP_-_english#Pulse Width|Pulse Width]], typ. Example: [[IRMP_-_english#SIRCS|Sony SIRCS]]&lt;br /&gt;
* [[IRMP_-_english#Biphase|Biphase (Manchester)]], typ. Example: Philips [[IRMP_-_english#RC5_+_RC5X|RC5]], [[IRMP_-_english#RC6_+_RC6A|RC6]]&lt;br /&gt;
* [[IRMP_-_english#Pulse Position|Pulse Position (NRZ)]], typ. Example: [[IRMP_-_english#NETBOX|Netbox]]&lt;br /&gt;
* [[IRMP_-_english#Pulse Distance Width|Pulse Distance Width]], typ. Example: [[IRMP_-_english#NUBERT|Nubert]]&lt;br /&gt;
&lt;br /&gt;
The pulses are modulated - usually at 36 kHz or 38 kHz - to reduce environmental influences such as indoor lighting or sunlight.&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width: 80%;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 20%;&amp;quot; |&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
=== Pulse Distance ===&lt;br /&gt;
&lt;br /&gt;
Pulse distance coding can be identified by the following rule:&lt;br /&gt;
&lt;br /&gt;
* there is only &#039;&#039;&#039;one pulse length&#039;&#039;&#039; and there are &#039;&#039;&#039;two different space lengths&#039;&#039;&#039;&lt;br /&gt;
||&lt;br /&gt;
[[Datei:Pulse-Distance.png|miniatur|Pulse distance coding]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width: 80%;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 20%;&amp;quot; |&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
=== Pulse Width ===&lt;br /&gt;
&lt;br /&gt;
Pulse width coding can be identified by the following rule: &lt;br /&gt;
&lt;br /&gt;
* there are &#039;&#039;&#039;two different pulse lengths&#039;&#039;&#039; and &#039;&#039;&#039;only one space length&#039;&#039;&#039;&lt;br /&gt;
||&lt;br /&gt;
[[Datei:Pulse-Width.png|miniatur|Pulse width coding]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width: 80%;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 20%;&amp;quot; |&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
=== Pulse Distance Width ===&lt;br /&gt;
&lt;br /&gt;
This is a mix of pulse distance and pulse width coding. Often the sum of pulse and space length is constant. The rule is:&lt;br /&gt;
&lt;br /&gt;
* there are &#039;&#039;&#039;two different pulse lengths&#039;&#039;&#039; and &#039;&#039;&#039;two different space lengths.&#039;&#039;&#039;&lt;br /&gt;
||&lt;br /&gt;
[[Datei:Pulse-Distance-Width.png|miniatur|Pulse distance width coding]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width: 80%;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 20%;&amp;quot; |&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
=== Biphase ===&lt;br /&gt;
&lt;br /&gt;
In biphase coding the order of pulse and space gives the bit value.&lt;br /&gt;
Therefore a biphase boding can be identified by this criteria:&lt;br /&gt;
&lt;br /&gt;
* there is exactly &#039;&#039;&#039;one&#039;&#039;&#039; pulse and space length, as well as the &#039;&#039;&#039;double&#039;&#039;&#039; pulse/space length&lt;br /&gt;
&lt;br /&gt;
Usually the length for the pulse and space are equal, meaning that the signal shape is symmetric. But IRMP also recognizes protocols which use different pulse and space lengths, for example the [[IRMP_-_english#A1TVBOX|A1TVBOX]] protocol.&lt;br /&gt;
||&lt;br /&gt;
[[Datei:Biphase-Coding.png|miniatur|Biphase coding]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width: 80%;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 20%;&amp;quot; |&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
=== Pulse Position ===&lt;br /&gt;
&lt;br /&gt;
Pulse position coding is known from commmon UARTs. Here, every bit has a fixed length. Depending on the value (0 or 1), it is a pulse or a space.&lt;br /&gt;
&lt;br /&gt;
Typical criteria for a &#039;&#039;&#039;pulse position protocol&#039;&#039;&#039; are:&lt;br /&gt;
* there are &#039;&#039;&#039;multiples&#039;&#039;&#039; of a basic pulse/space length&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A tabular listing of different IR protocols can be found here: [[IRMP_-_english#IR_Protocols_in_Detail|IR Protocols in Detail]].&#039;&#039;&#039;&lt;br /&gt;
The specified timings are typical values. In some remotes they differ up to 40% in real life. Therefore [[IRMP_-_english#top|IRMP]] uses minimum/maximum limits to be tolerant with the timing.&lt;br /&gt;
||&lt;br /&gt;
[[Datei:Pulse-Position.png|miniatur|Pulse position coding]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Protocol Detection ==&lt;br /&gt;
&lt;br /&gt;
Most of the protocols [[IRMP_-_english#top|IRMP]] decodes have something in common: they exhibit a start bit whose timing is unique.&lt;br /&gt;
&lt;br /&gt;
According to this start bit timing, most protocols can be identified. [[IRMP_-_english#top|IRMP]] measures the timing of the start bit and adjusts its timing tables &amp;quot;on-the-fly&amp;quot; to the discovered protocol. Subsequent bits can then be read sequentially without the need to first store a complete frame.&lt;br /&gt;
Thus, [[IRMP_-_english#top|IRMP]] does not wait to read a complete frame but starts decoding directly after detecting the first pulse.&lt;br /&gt;
&lt;br /&gt;
If the start bit is not unique, [[IRMP_-_english#top|IRMP]] proceeds in parallel with multiple possible protocols. For example with two candidate protocols, once plausible reasons disqualify one protocol, the other protocol is used.&lt;br /&gt;
&lt;br /&gt;
Detection is implemented as an interrupt-driven [[Statemachine|state machine]] which is called at a frequency of typically 15000 times per second. Among others, the [[Statemachine|state machine]] has the following states:&lt;br /&gt;
&lt;br /&gt;
* detect the first pulse length of the start bit&lt;br /&gt;
* detect the space length of the start bit&lt;br /&gt;
* detect the space length of the first data bit&lt;br /&gt;
&lt;br /&gt;
After that, the pulse and space lengths of the start bit are known. Now all enabled protocols are searched for these lengths. If a protocol matches, the timing table for this protocol is loaded. Subsequent bits are checked against the timing table to ensure they conform to it.&lt;br /&gt;
&lt;br /&gt;
The [[Statemachine|state machine]] continues with the following states:&lt;br /&gt;
&lt;br /&gt;
* detect the spaces of the data bits&lt;br /&gt;
* detect the pulse length of the data bits&lt;br /&gt;
* check timing. If different, switch back to another valid IR protocol, otherwise return&lt;br /&gt;
* detect the stop bit, if present in the protocol&lt;br /&gt;
* check data for plausibility, like CRC or other redundancy bits&lt;br /&gt;
* convert data to device address and command&lt;br /&gt;
* detect code repetition by long key press, set corresponding flag&lt;br /&gt;
&lt;br /&gt;
Indeed the [[Statemachine|state machine]] is even more complex because some protocols have no start bit (e.g. [[IRMP_-_english#DENON|Denon]]) or have multiple start bits (4 in [[IRMP_-_english#B.26O|B&amp;amp;O]]) or have another sync bit within the frame (e.g. [[IRMP_-_english#SAMSUNG|Samsung]]). These extra conditions are caught in the code by protocol-specific &amp;quot;special cases&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Switching to an other protocol can happen multiple times while receiving a frame, e.g. from [[IRMP_-_english#NEC42|NEC42]] (42 bits) to [[IRMP_-_english#NEC16|NEC16]] (8 bits + sync bit + 8 bits), if a premature sync bit is detected. Or from [[IRMP_-_english#NEC + extended NEC|NEC]]/[[IRMP_-_english#NEC42|NEC42]] (32/42 bits) to [[IRMP_-_english#JVC|JVC]] (16 bits) if the stop bit occurs prematurely. It becomes difficult when, after detecting the start bit, two possible protocols use different coding methods, e.g. when the one protocol uses [[IRMP_-_english#Pulse Distance|pulse distance coding]] and the other uses [[IRMP_-_english#Biphase|biphase coding (Manchester)]]. In this case [[IRMP_-_english#top|IRMP]] stores the necessary bits for both coding methods and later discards one or the other.&lt;br /&gt;
&lt;br /&gt;
Furthermore, some remotes using particular protocols transmit repeat frames, either for redundancy (error detection) or for long key presses. Both kinds are detected by IRMP: error detection frames are detected by IRMP, but not passed to the application. Others are detected as long key presses and flagged by IRMP.&lt;br /&gt;
&lt;br /&gt;
== Download ==&lt;br /&gt;
&lt;br /&gt;
Version 3.2.6, Date: 2021-01-27&lt;br /&gt;
&lt;br /&gt;
Download stable version: [http://www.mikrocontroller.net/wikifiles/7/79/Irmp.zip Irmp.zip] &lt;br /&gt;
&lt;br /&gt;
Current development version of [[IRMP_-_english#top|IRMP]] &amp;amp; [[IRSND_-_english|IRSND]]:&lt;br /&gt;
&lt;br /&gt;
* SVN link: [svn://mikrocontroller.net/irmp/ SVN]&lt;br /&gt;
* SVN browser: [http://www.mikrocontroller.net/svnbrowser/irmp/ IRMP in SVN]&lt;br /&gt;
* Download tarball: [http://www.mikrocontroller.net/svnbrowser/irmp/?view=tar Tarball].&lt;br /&gt;
&lt;br /&gt;
Download Arduino library: [https://github.com/ukw100/IRMP GitHub] or use Arduino &amp;quot;&#039;&#039;Tools / Manage Libraries...&#039;&#039;&amp;quot; and search for IRMP.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;You can see the history of the software changes here: [[IRMP_-_english#Software_History|Software History]]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== License ==&lt;br /&gt;
&lt;br /&gt;
IRMP is Open Source Software and is released under the [https://www.gnu.org/licenses/old-licenses/gpl-2.0.html GPL v2], or&lt;br /&gt;
(at your option) any later version.&lt;br /&gt;
&lt;br /&gt;
== Source Code ==&lt;br /&gt;
&lt;br /&gt;
The source code can be easily compiled for AVR MCUs by loading the project file irmp.aps in AVR Studio 4.&lt;br /&gt;
&lt;br /&gt;
For other development environments it is simple to create a project or makefile. The source includes:&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmp.c?view=markup irmp.c] - IR decoder core&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmpprotocols.h?view=markup irmpprotocols.h] - all protocoll definitions&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmpsystem.h?view=markup irmpsystem.h] - target-independent definitions for AVR/PIC/STM32&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmp.h?view=markup irmp.h] - include file for the application&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmpconfig.h?view=markup irmpconfig.h] - user configuration&lt;br /&gt;
&lt;br /&gt;
Sample applications (main functions and timer configurations):&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-avr.c?view=markup irmp-main-avr.c] - AVR&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-avr-uart.c?view=markup irmp-main-avr-uart.c] - AVR with UART output&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-pic-xc8.c?view=markup irmp-main-pic-xc8.c] - PIC18F4520&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-pic-12F1840.c?view=markup irmp-main-pic-12F1840.c] - PIC12F1840&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-stm32.c?view=markup irmp-main-stm32.c] - STM32&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-stellaris-arm.c?view=markup irmp-main-stellaris-arm.c] - TI Stellaris LM4F120 Launchpad&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-esp8266.c?view=markup irmp-main-esp8266.c] - ESP8266&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-mbed.cpp?view=markup irmp-main-mbed.cpp] - MBED&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/examples/Arduino/Arduino.ino?view=markup examples/Arduino/Arduino.ino] - Teensy 3.x&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-chibios.c?view=markup irmp-main-chibios.c] - ChibiOS&lt;br /&gt;
&lt;br /&gt;
{{Warnung|&lt;br /&gt;
;Important: include only irmp.h in your application:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;irmp.h&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
All other include files are included within irmp.h. See also the sample application irmp-main-avr.c.&lt;br /&gt;
&lt;br /&gt;
Furthermore, the preprocessor constant &#039;&#039;&#039;F_CPU in project or makefile&#039;&#039;&#039; must be defined. This should have at least the value of 8000000UL, processor speed should be at least 8 MHz. This applies to AVR targets and not for MCUs with PLL. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[IRMP_-_english#top|IRMP]] also runs on PIC processors. For the PIC-CCS compiler the necessary preprocessor defines are already set, such that [http://www.mikrocontroller.net/svnbrowser/irmp/irmp.c?view=markup irmp.c] can be directly used in the CCS environment. Only a short interrupt service routine like &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
must be added. The interrupt period time must be set to 66 µs (15 kHz).&lt;br /&gt;
&lt;br /&gt;
For AVR processors you will find an example for the usage of [[IRMP_-_english#top|IRMP]] in [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-avr.c?view=markup irmp-main-avr.c]. The main things are the [[AVR-GCC-Tutorial/Die_Timer_und_Zähler_des_AVR|Timer]] initializing of the timer and the processing of received IR commands. The received protocoll, the device address and the command will be output on the HW-UART.&lt;br /&gt;
&lt;br /&gt;
For the Stellaris LM4F120 Launchpad from TI (ARM Cortex M4) is a propriate timer init function already integrated in [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-avr.c?view=markup irmp-main-avr.c].&lt;br /&gt;
&lt;br /&gt;
[[IRMP_-_english#top|IRMP]] can be used also with STM32 microcontrollers.&lt;br /&gt;
&lt;br /&gt;
Another new implementation is available on the mbed platform.&lt;br /&gt;
&lt;br /&gt;
=== avr-gcc Optimizations ===&lt;br /&gt;
&lt;br /&gt;
From version 4.7.x of avr-gcc, the [https://gcc.gnu.org/onlinedocs/gccint/LTO.html#LTO LTO option] can be used to make the call of the external function irmp_ISR() from the main ISR more efficient. This improves the performance of the ISR a little.&lt;br /&gt;
&lt;br /&gt;
Add the following compiler and linker options:&lt;br /&gt;
&lt;br /&gt;
* additional compiler option: -flto&lt;br /&gt;
* additional linker options: -flto -Os&lt;br /&gt;
&lt;br /&gt;
If you forget the additional linker option -Os, the binary will be significantly larger as it will not be optimized further. Also, the option -flto must be passed to the linker, otherwise link time optimization will not work.&lt;br /&gt;
&lt;br /&gt;
=== Configuration ===&lt;br /&gt;
&lt;br /&gt;
[[IRMP_-_english#top|IRMP]] is configured by parameters in  [http://www.mikrocontroller.net/svnbrowser/irmp/irmpconfig.h?view=markup irmpconfig.h]:&lt;br /&gt;
&lt;br /&gt;
* [[IRMP_-_english#F_INTERRUPTS|number of interrupts per second]]&lt;br /&gt;
* [[IRMP_-_english#IRMP_SUPPORT_xxx_PROTOCOL|supported IR protocols]]&lt;br /&gt;
* [[IRMP_-_english#IRMP_PORT_LETTER + IRMP_BIT_NUMBER|hardware pin for IR receiver]]&lt;br /&gt;
* [[IRMP_-_english#IRMP_LOGGING|IR logging]]&lt;br /&gt;
&lt;br /&gt;
=== Settings in irmpconfig.h ===&lt;br /&gt;
&lt;br /&gt;
[[IRMP_-_english#top|IRMP]] will decode all protocols listed above in one ISR. For this, some settings are needed. These are set in [http://www.mikrocontroller.net/svnbrowser/irmp/irmpconfig.h?view=markup irmpconfig.h].&lt;br /&gt;
&lt;br /&gt;
==== F_INTERRUPTS ====&lt;br /&gt;
&lt;br /&gt;
Number of interrupts per second. Should be set to a value from 10000 to 20000. The higher the value, the better the resolution and therefore the quality of detection. But a higher interrupt rate means also higher CPU load. A value of 15000 is usually a good compromise.&lt;br /&gt;
&lt;br /&gt;
Default value:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
#define F_INTERRUPTS                            15000      // interrupts per second&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On AVR controllers, the [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-avr.c?view=markup irmp-main-avr.c] example uses Timer1 with 16 bits of resolution. If for any reasons Timer1 is not available, you can also use Timer2 with 8 bits of resolution.&lt;br /&gt;
&lt;br /&gt;
In that case, configure Timer2 as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
OCR2   =  (uint8_t) ((F_CPU / F_INTERRUPTS) / 8) - 1 + 0.5);   // Compare Register OCR2&lt;br /&gt;
TCCR2  = (1 &amp;lt;&amp;lt; WGM21) | (1 &amp;lt;&amp;lt; CS21);                           // CTC Mode, prescaler = 8&lt;br /&gt;
TIMSK  = 1 &amp;lt;&amp;lt; OCIE2;                                           // enable Timer2 interrupt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The above example is valid for ATmega88/ATmega168/ATmega328. For other AVR MCUs check the datasheet.&lt;br /&gt;
&lt;br /&gt;
You must not forget to change the ISR to Timer2 as well:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
ISR(TIMER2_COMP_vect)&lt;br /&gt;
{&lt;br /&gt;
  (void) irmp_ISR(); &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== IRMP_SUPPORT_xxx_PROTOCOL ====&lt;br /&gt;
&lt;br /&gt;
Here you can select which protocols to enable in [[IRMP_-_english#top|IRMP]]. Common protocols are emabled by default.&lt;br /&gt;
&lt;br /&gt;
To enable additional protocols or disable others to save memory, set the corresponding values in [http://www.mikrocontroller.net/svnbrowser/irmp/irmpconfig.h?view=markup irmpconfig.h].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&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;
&lt;br /&gt;
// more protocols, enable here!                 Enable  Remarks                 F_INTERRUPTS            Program Space&lt;br /&gt;
#define IRMP_SUPPORT_DENON_PROTOCOL             0       // DENON, Sharp         &amp;gt;= 10000                 ~250 bytes&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 (SDA2008)       &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_BOSE_PROTOCOL              0       // BOSE                 &amp;gt;= 10000                 ~150 bytes&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_ORTEK_PROTOCOL             0       // ORTEK (Hama)         &amp;gt;= 10000                 ~150 bytes&lt;br /&gt;
#define IRMP_SUPPORT_TELEFUNKEN_PROTOCOL        0       // Telefunken 1560      &amp;gt;= 10000                 ~150 bytes&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_ROOMBA_PROTOCOL            0       // iRobot Roomba        &amp;gt;= 10000                 ~150 bytes&lt;br /&gt;
#define IRMP_SUPPORT_RUWIDO_PROTOCOL            0       // RUWIDO, T-Home       &amp;gt;= 15000                 ~550 bytes&lt;br /&gt;
#define IRMP_SUPPORT_A1TVBOX_PROTOCOL           0       // A1 TV BOX            &amp;gt;= 15000 (better 20000)  ~300 bytes&lt;br /&gt;
#define IRMP_SUPPORT_LEGO_PROTOCOL              0       // LEGO Power RC        &amp;gt;= 20000                 ~150 bytes&lt;br /&gt;
#define IRMP_SUPPORT_RCMM_PROTOCOL              0       // RCMM 12, 24, or 32    &amp;gt;= 20000                 ~150 bytes&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each [[IRMP_-_english#top|IRMP]] supported IR protocol consumes the noted amount of code. Here you can apply optimizations: for example, the modulation frequency of 455 kHz for the [[IRMP_-_english#B&amp;amp;O|B&amp;amp;O]] protocol is far away from the frequencies that are used by other protocols. This usually requires a different IR receiver, so without that, you can disable these protocols. For example, you cannot receive the [[IRMP_-_english#B&amp;amp;O|B&amp;amp;O]] protocol (455kHz) with a TSOP1738/TSOP31238.&lt;br /&gt;
&lt;br /&gt;
Additionally, the [[IRMP_-_english#SIEMENS_+_RUWIDO|SIEMENS]]/[[IRMP_-_english#FDC|FDC]]/[[IRMP_-_english#RCCAR|RCCAR]] can only be detected reliably at a frequency of 15 kHz or higher. For [[IRMP_-_english#LEGO|LEGO]], 20 kHz is needed. To use these protocols, you must modify [[IRMP_-_english#F_INTERRUPTS|F_INTERRUPTS]]. Otherwise, during compilation you will get a warning and the corresponding protocols will automatically be disabled.&lt;br /&gt;
&lt;br /&gt;
==== IRMP_PORT_LETTER + IRMP_BIT_NUMBER ====&lt;br /&gt;
&lt;br /&gt;
This constant defines the pin where the IR receiver is connected.&lt;br /&gt;
&lt;br /&gt;
Default value is PORT B6:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
/*---------------------------------------------------------------------------&lt;br /&gt;
 * Change hardware pin here for ATMEL AVR&lt;br /&gt;
 *---------------------------------------------------------------------------&lt;br /&gt;
 */&lt;br /&gt;
#if defined (ATMEL_AVR)                         // use PB6 as IR input on AVR&lt;br /&gt;
#  define IRMP_PORT_LETTER                      B&lt;br /&gt;
#  define IRMP_BIT_NUMBER                       6&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These two values must match your hardware configuration.&lt;br /&gt;
&lt;br /&gt;
This applies also to STM32 MCUs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
/*----------------------------------------------------------------------------&lt;br /&gt;
 * Change hardware pin here for ARM STM32&lt;br /&gt;
 *----------------------------------------------------------------------------&lt;br /&gt;
 */&lt;br /&gt;
#elif defined (ARM_STM32)                       // use C13 as IR input on STM32&lt;br /&gt;
#  define IRMP_PORT_LETTER                      C&lt;br /&gt;
#  define IRMP_BIT_NUMBER                       13&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When using STM32 HAL library, define the constants IRSND_Transmit_GPIO_Port and IRSND_Transmit_Pin in STM32Cube (Main.h). In this case, it is not necessary to change the constants in irmpconfig.h:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
/*---------------------------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
 * ARM STM32 with HAL section - don&#039;t change here, define IRSND_Transmit_GPIO_Port &amp;amp; IRSND_Transmit_Pin in STM32Cube (Main.h)&lt;br /&gt;
 *---------------------------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
 */&lt;br /&gt;
#elif defined (ARM_STM32_HAL)                                           // IRSND_Transmit_GPIO_Port &amp;amp; IRSND_Transmit_Pin must be defined in STM32Cube&lt;br /&gt;
#  define IRSND_PORT_LETTER                     IRSND_Transmit_GPIO_Port//Port of Transmit PWM Pin e.g.&lt;br /&gt;
#  define IRSND_BIT_NUMBER                      IRSND_Transmit_Pin      //Pim of Transmit PWM Pin e.g.&lt;br /&gt;
#  define IRSND_TIMER_HANDLER                   htim2                   //Handler of Timer e.g. htim (see tim.h)&lt;br /&gt;
#  define IRSND_TIMER_CHANNEL_NUMBER            TIM_CHANNEL_2           //Channel of the used Timer PWM Pin e.g. TIM_CHANNEL_2&lt;br /&gt;
#  define IRSND_TIMER_SPEED_APBX                64000000                //Speed of the corresponding APBx. (see STM32CubeMX: Clock Configuration)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And the corresponding section for STM8 MCUs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
/*----------------------------------------------------------------------------&lt;br /&gt;
 * Change hardware pin here for STM8&lt;br /&gt;
 *----------------------------------------------------------------------------&lt;br /&gt;
 */&lt;br /&gt;
#elif defined (SDCC_STM8)                       // use PA1 as IR input on STM8&lt;br /&gt;
#  define IRMP_PORT_LETTER                      A&lt;br /&gt;
#  define IRMP_BIT_NUMBER                       1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For PIC microcontrollers only the constant &#039;&#039;&#039;IRMP_PIN&#039;&#039;&#039; needs to be changed - depending on the compiler:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
/*----------------------------------------------------------------------------&lt;br /&gt;
 * Change hardware pin here for PIC C18 compiler&lt;br /&gt;
 *----------------------------------------------------------------------------&lt;br /&gt;
 */&lt;br /&gt;
#elif defined (PIC_C18)                         // use RB4 as IR input on PIC&lt;br /&gt;
#  define IRMP_PIN                              PORTBbits.RB4&lt;br /&gt;
&lt;br /&gt;
/*----------------------------------------------------------------------------&lt;br /&gt;
 * Change hardware pin here for PIC CCS compiler&lt;br /&gt;
 *----------------------------------------------------------------------------&lt;br /&gt;
 */&lt;br /&gt;
#elif defined (PIC_CCS)                         // use PB4 as IR input on PIC&lt;br /&gt;
#  define IRMP_PIN                              PIN_B4&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When using ChibiOS HAL, define a pin with the name &#039;&#039;&#039;IR_IN&#039;&#039;&#039; in your board config (board.chcfg) of ChibiOS and regenerate the board files. To use another name for the pin, edit the constant &#039;&#039;&#039;IRMP_PIN&#039;&#039;&#039; in irmpconfig.h. Use the name of the pin from the board config and prefix it with &amp;quot;LINE_&amp;quot;, as IRMP is using the &amp;quot;line&amp;quot; variant of the PAL interface:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
/*---------------------------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
 * Change hardware pin here for ChibiOS HAL&lt;br /&gt;
 *---------------------------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
 */&lt;br /&gt;
#elif defined(_CHIBIOS_HAL_)&lt;br /&gt;
#  define IRMP_PIN                              LINE_IR_IN              // use pin names as defined in the board config file, prefixed with &amp;quot;LINE_&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== IRMP_HIGH_ACTIVE ====&lt;br /&gt;
&lt;br /&gt;
Default value:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
#  define IRMP_HIGH_ACTIVE                      0                       // set to 1 if you use a RF receiver!&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Most RF receivers use active-high signals, so when using an RF receiver instead of an IR sensor, set this value to 1.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#FF0000&amp;quot;&amp;gt;&#039;&#039;&#039;NEU:&#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== IRMP_ENABLE_RELEASE_DETECTION ====&lt;br /&gt;
&lt;br /&gt;
Default value:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
#  define IRMP_ENABLE_RELEASE_DETECTION         0                       //  enable detection of key releases&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Set this value to 1 to enable detection of button release events. The function irmp_get_data() then sets the IRMP_FLAG_RELEASE bit in the struct member irmp_data.flags once code transmission ends. See the example in the section  &#039;&#039;&#039;[[IRMP_-_english#Debouncing|Debouncing]]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== IRMP_USE_CALLBACK ====&lt;br /&gt;
&lt;br /&gt;
Default value:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
#define IRMP_USE_CALLBACK                      0        // flag: 0 = don&#039;t use callbacks, 1 = use callbacks, default is 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When you turn on callbacks, any level change at the input causes the callback function to be called. This can be used to visualize incoming IR signals by driving another output pin.&lt;br /&gt;
&lt;br /&gt;
Here is an example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
#define LED_PORT PORTD                                  // LED at PD6&lt;br /&gt;
#define LED_DDR  DDRD&lt;br /&gt;
#define LED_PIN  6&lt;br /&gt;
&lt;br /&gt;
/*-----------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
 * Called (back) from IRMP module&lt;br /&gt;
 * This example switches a LED (which is connected to Vcc)&lt;br /&gt;
 *-----------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
 */&lt;br /&gt;
void&lt;br /&gt;
led_callback (uint_fast8_t on)&lt;br /&gt;
{&lt;br /&gt;
    if (on)&lt;br /&gt;
    {&lt;br /&gt;
       LED_PORT &amp;amp;= ~(1 &amp;lt;&amp;lt; LED_PIN);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
       LED_PORT |= (1 &amp;lt;&amp;lt; LED_PIN);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int&lt;br /&gt;
main ()&lt;br /&gt;
{&lt;br /&gt;
    ...&lt;br /&gt;
    irmp_init ();&lt;br /&gt;
&lt;br /&gt;
    LED_DDR |= (1 &amp;lt;&amp;lt; LED_PIN);         // LED pin to output&lt;br /&gt;
    LED_PORT |= (1 &amp;lt;&amp;lt; LED_PIN);        // switch LED off (active low)&lt;br /&gt;
    irmp_set_callback_ptr (led_callback);&lt;br /&gt;
&lt;br /&gt;
    sei ();&lt;br /&gt;
    ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== IRMP_USE_IDLE_CALL ====&lt;br /&gt;
&lt;br /&gt;
Normally the irmp_ISR() function is called continuously at the F_INTERRUPTS (10-20kHz) frequency. The microcontroller can rarely enter an energy-saving sleep mode, or must constantly wake up from it. If power consumption is important, e.g. on battery power, this approach is not optimal.&lt;br /&gt;
&lt;br /&gt;
If &#039;&#039;IRMP_USE_IDLE_CALL&#039;&#039;&#039; is enabled, IRMP detects if no IR transmission is ongoing and then calls the function &#039;&#039;&#039;irmp_idle()&#039;&#039;&#039;. This is microcontroller-specific and must be provided and linked by the user. The microcontroller can then be put to sleep while there is no ongoing transmission, thus reducing energy consumption.&lt;br /&gt;
&lt;br /&gt;
It is recommended to deactivate the timer interrupt in irmp_idle() and to activate a pin change interrupt instead. Then the microcontroller can be put to sleep. When a falling edge is detected on the IR input pin, the pin change interrupt is disabled, the timer is reenabled and irmp_ISR() is called immediately. You can find an example for the use of irmp_idle() in [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-chibios.c?view=markup irmp-main-chibios.c].&lt;br /&gt;
&lt;br /&gt;
Using IRMP purely with pin change interrupts and without timer interrupts is not supported.&lt;br /&gt;
&lt;br /&gt;
==== IRMP_USE_EVENT ====&lt;br /&gt;
&lt;br /&gt;
When using IRMP with ChibiOS/RT or ChibiOS/NIL, you can use their Event module to wake a thread as soon as new IR data is received and decoded.&lt;br /&gt;
&lt;br /&gt;
Set the &#039;&#039;&#039;IRMP_USE_EVENT&#039;&#039;&#039; constant in irmpconfig.h to 1 to enable this. &#039;&#039;&#039;IRMP_EVENT_BIT&#039;&#039;&#039; definies the value in the Event bitmask that should symbolize the IRMP event. Use &#039;&#039;&#039;IRMP_EVENT_THREAD_PTR&#039;&#039;&#039; to define the variable name of the thread pointer that the event is sent to.&lt;br /&gt;
&lt;br /&gt;
Change irmpconfig.h like this:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
/*------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
 * Use ChibiOS Events to signal that valid IR data was received&lt;br /&gt;
 *------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
 */&lt;br /&gt;
#if defined(_CHIBIOS_RT_) || defined(_CHIBIOS_NIL_)&lt;br /&gt;
&lt;br /&gt;
#  ifndef IRMP_USE_EVENT&lt;br /&gt;
#    define IRMP_USE_EVENT                      1                     // 1: use event. 0: do not. default is 0&lt;br /&gt;
#  endif&lt;br /&gt;
&lt;br /&gt;
#  if IRMP_USE_EVENT == 1 &amp;amp;&amp;amp; !defined(IRMP_EVENT_BIT)&lt;br /&gt;
#    define IRMP_EVENT_BIT                      1                     // event flag or bit to send&lt;br /&gt;
#  endif&lt;br /&gt;
#  if IRMP_USE_EVENT == 1 &amp;amp;&amp;amp; !defined(IRMP_EVENT_THREAD_PTR)&lt;br /&gt;
#    define IRMP_EVENT_THREAD_PTR               ir_receive_thread_p   // pointer to the thread to send the event to&lt;br /&gt;
extern thread_t *IRMP_EVENT_THREAD_PTR;                               // the pointer must be defined and initialized elsewhere&lt;br /&gt;
#  endif&lt;br /&gt;
&lt;br /&gt;
#endif // _CHIBIOS_RT_ || _CHIBIOS_NIL_&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now you can use the event in your ChibiOS project like this:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
thread_t *ir_receive_thread_p = NULL;&lt;br /&gt;
&lt;br /&gt;
static THD_FUNCTION(IRThread, arg)&lt;br /&gt;
{&lt;br /&gt;
    ir_receive_thread_p = chThdGetSelfX();&lt;br /&gt;
    [...]&lt;br /&gt;
    while (true)&lt;br /&gt;
    {&lt;br /&gt;
        // wait for event sent from irmp_ISR&lt;br /&gt;
        chEvtWaitAnyTimeout(ALL_EVENTS,TIME_INFINITE);&lt;br /&gt;
&lt;br /&gt;
        if (irmp_get_data (&amp;amp;irmp_data))&lt;br /&gt;
            // use data in irmp_data&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== IRMP_LOGGING ====&lt;br /&gt;
&lt;br /&gt;
With IRMP_LOGGING the logging of received IR frames can be turned on.&lt;br /&gt;
&lt;br /&gt;
Default value:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
#define IRMP_LOGGING                            0       // 1: log IR signal (scan), 0: do not. default is 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Further documentation can be found here: [[IRMP_-_english#Scanning_unknown_IR_Protocols|Scanning Unknown IR Protocols]].&lt;br /&gt;
&lt;br /&gt;
=== Using IRMP ===&lt;br /&gt;
&lt;br /&gt;
The protocols supported by [[IRMP_-_english#top|IRMP]] use partly variable, partly fixed bit lengths from 2 up to 48 bits. These are described by preprocessor defines.&lt;br /&gt;
&lt;br /&gt;
[[IRMP_-_english#top|IRMP]] separates these IR frames into 3 sections:&lt;br /&gt;
&lt;br /&gt;
 1. protocol ID&lt;br /&gt;
 2. address or vendor code&lt;br /&gt;
 3. command&lt;br /&gt;
&lt;br /&gt;
With the function&lt;br /&gt;
&lt;br /&gt;
   irmp_get_data (IRMP_DATA * irmp_data_p)&lt;br /&gt;
&lt;br /&gt;
you can recall a decoded message. The return value is 1 if a message has been received, otherwise it is 0. In the first case the struct members&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
    irmp_data_p-&amp;gt;protocol (8 Bit)&lt;br /&gt;
    irmp_data_p-&amp;gt;address (16 Bit)&lt;br /&gt;
    irmp_data_p-&amp;gt;command (16 Bit)&lt;br /&gt;
    irmp_data_p-&amp;gt;flags (8 Bit)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
contain valid information.&lt;br /&gt;
&lt;br /&gt;
That means that ultimately, you have three values (protocol, address and command) that can be evaluated with an if or switch statement. &lt;br /&gt;
Here is a sample decoder which listens for keys 1-9 on a remote:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&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 protocol&lt;br /&gt;
          irmp_data.address == 0x1234)                   // Address 0x1234&lt;br /&gt;
      {&lt;br /&gt;
         switch (irmp_data.command)&lt;br /&gt;
         {&lt;br /&gt;
            case 0x0001: key1_pressed(); break;          // Key 1&lt;br /&gt;
            case 0x0002: key2_pressed(); break;          // Key 2&lt;br /&gt;
            ...&lt;br /&gt;
            case 0x0009: key9_pressed(); break;          // Key 9&lt;br /&gt;
         }&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here are possible constants for irmp_data.protocol, see also [http://www.mikrocontroller.net/svnbrowser/irmp/irmpprotocols.h?view=markup irmpprotocols.h]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
#define IRMP_SIRCS_PROTOCOL                      1              // Sony&lt;br /&gt;
#define IRMP_NEC_PROTOCOL                        2              // NEC, Pioneer, JVC, Toshiba, generic, 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 Media Receiver&lt;br /&gt;
#define IRMP_IR60_PROTOCOL                      24              // IR60 (SDA2008)&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;
#define IRMP_BOSE_PROTOCOL                      31              // BOSE&lt;br /&gt;
#define IRMP_A1TVBOX_PROTOCOL                   32              // A1 TV Box&lt;br /&gt;
#define IRMP_ORTEK_PROTOCOL                     33              // ORTEK - Hama&lt;br /&gt;
#define IRMP_TELEFUNKEN_PROTOCOL                34              // Telefunken (1560)&lt;br /&gt;
#define IRMP_ROOMBA_PROTOCOL                    35              // iRobot Roomba vacuum cleaner&lt;br /&gt;
#define IRMP_RCMM32_PROTOCOL                    36              // Fujitsu-Siemens (Activy remote control)&lt;br /&gt;
#define IRMP_RCMM24_PROTOCOL                    37              // Fujitsu-Siemens (Activy keyboard)&lt;br /&gt;
#define IRMP_RCMM12_PROTOCOL                    38              // Fujitsu-Siemens (Activy keyboard)&lt;br /&gt;
#define IRMP_SPEAKER_PROTOCOL                   39              // Another loudspeaker protocol, similar to Nubert&lt;br /&gt;
#define IRMP_LGAIR_PROTOCOL                     40              // LG air conditioner&lt;br /&gt;
#define IRMP_SAMSUNG48_PROTOCOL                 41              // air conditioner with Samsung protocol (48 bits)&lt;br /&gt;
#define IRMP_MERLIN_PROTOCOL                    42              // Merlin (Pollin 620 185)&lt;br /&gt;
#define IRMP_PENTAX_PROTOCOL                    43              // Pentax camera&lt;br /&gt;
#define IRMP_FAN_PROTOCOL                       44              // FAN (ventilator), very similar to NUBERT, but last bit is data bit instead of stop bit&lt;br /&gt;
#define IRMP_S100_PROTOCOL                      45              // very similar to RC5, but 14 instead of 13 data bits&lt;br /&gt;
#define IRMP_ACP24_PROTOCOL                     46              // Stiebel Eltron ACP24 air conditioner&lt;br /&gt;
#define IRMP_TECHNICS_PROTOCOL                  47              // Technics, similar to Matsushita, but 22 instead of 24 bits&lt;br /&gt;
#define IRMP_PANASONIC_PROTOCOL                 48              // Panasonic (video projector), start bits similar to KASEIKYO&lt;br /&gt;
#define IRMP_MITSU_HEAVY_PROTOCOL               49              // Mitsubishi heavy air conditioner, similar timing to Panasonic video projector&lt;br /&gt;
#define IRMP_VINCENT_PROTOCOL                   50              // Vincent&lt;br /&gt;
#define IRMP_SAMSUNGAH_PROTOCOL                 51              // Samsung AH&lt;br /&gt;
#define IRMP_IRMP16_PROTOCOL                    52              // IRMP specific protocol for data transfer, e.g. between two microcontrollers via IR&lt;br /&gt;
#define IRMP_GREE_PROTOCOL                      53              // Gree climate&lt;br /&gt;
#define IRMP_RCII_PROTOCOL                      54              // RC II Infrared Remote Control Protocol for FM8&lt;br /&gt;
#define IRMP_METZ_PROTOCOL                      55              // METZ&lt;br /&gt;
#define IRMP_ONKYO_PROTOCOL                     56              // Onkyo&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The values of address and the command code of an unknown remote can be received and printed to UART or LCD. Then these values can be hard-coded in your decoder routine. Or you can write a learning routine, where you press keys to store the code into EEPROM. A sample for this can be found in [http://www.mikrocontroller.net/articles/DIY_Lernfähige_Fernbedienung_mit_IRMP Lernfähige IR-Fernbedienung mit IRMP].&lt;br /&gt;
&lt;br /&gt;
Another [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-avr.c?view=markup example main function] is included in the zip file, showing also the timer initialization.&lt;br /&gt;
&lt;br /&gt;
=== Debouncing ===&lt;br /&gt;
&lt;br /&gt;
To distinguish between a long key press or a single press, the IRMP_FLAG_REPETITION bit is provided. It is set in the struct member &#039;&#039;&#039;flags&#039;&#039;&#039; when a key on the remote is held, causing the same command to be repeated within a short period of time.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
    if (irmp_data.flags &amp;amp; IRMP_FLAG_REPETITION)&lt;br /&gt;
    {&lt;br /&gt;
      // long key press&lt;br /&gt;
      // either:&lt;br /&gt;
      //   ignore the (repeated) key&lt;br /&gt;
      // or:&lt;br /&gt;
      //   use this information for a repeat function&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
      // key was pressed again&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This can be used to debounce the keys 0-9 by ignoring commands with the IRMP_FLAG_REPETITION bit set. For keys like &#039;VOLUME+&#039; or &#039;VOLUME-&#039; using the repetition can be useful, for example to [[LED-Fading|fade a LED]].&lt;br /&gt;
&lt;br /&gt;
If you want to decode only single keys, you can reduce the block above to:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
    if (! (irmp_data.flags &amp;amp; IRMP_FLAG_REPETITION))&lt;br /&gt;
    {&lt;br /&gt;
      // New key&lt;br /&gt;
      // ACTION!&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#FF0000&amp;quot;&amp;gt;&#039;&#039;&#039;NEW:&#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From version 3.2.2, key releases can be detected. In this case, the IRMP_FLAG_RELEASE flag is set once the remote control has ceased sending IR or RF frames.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
    IRMP_DATA irmp_data;&lt;br /&gt;
&lt;br /&gt;
    while (1)&lt;br /&gt;
    {&lt;br /&gt;
        if (irmp_get_data (&amp;amp;irmp_data))&lt;br /&gt;
        {&lt;br /&gt;
            if (irmp_data.protocol == NEC_PROTOCOL &amp;amp;&amp;amp; irmp_data.address == 0x1234)&lt;br /&gt;
            {&lt;br /&gt;
                 if (irmp_data.command == 0x42 &amp;amp;&amp;amp; irmp_data.flags == 0x00) // First frame, flags not set&lt;br /&gt;
                 {&lt;br /&gt;
                     motor_on ();&lt;br /&gt;
                 }&lt;br /&gt;
                 else if (irmp_data.flags &amp;amp; IRMP_FLAG_RELEASE)             // Key is released&lt;br /&gt;
                 {&lt;br /&gt;
                     motor_off ();&lt;br /&gt;
                 }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the above example, a motor is turned on when a specific button on the remote control is pressed. The motor will not stop again until you release the button.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important when evaluating IRMP_FLAG_RELEASE:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
You must not rely on irmp_data.command to still contain the original command code (0x42 here). There are remote controls (e.g. RF remotes for remote controlled receptacles) which send a special key release code when the key is released. Simply check that the irmp_data.address matches before evaluating the flag.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;This feature must be enabled explicitly in irmpconfig.h by changing the configuration variable IRMP_ENABLE_RELEASE_DETECTION&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Principles of Operation ==&lt;br /&gt;
&lt;br /&gt;
The  &amp;quot;workhorse&amp;quot; of [[IRMP_-_english#top|IRMP]] is the interrupt service routine irmp_ISR() which should be called 15000 times per second. When using a different rate, the constant [[IRMP_-_english#F_INTERRUPTS|F_INTERRUPTS]] in [http://www.mikrocontroller.net/svnbrowser/irmp/irmpconfig.h?view=markup irmpconfig.h] needs to be modified accordingly.&lt;br /&gt;
&lt;br /&gt;
First, irmp_ISR() detects the length and the type of the start bit(s) and uses this to determine the protocol in use. As soon as the protocol is identified, subsequent bits are parametrized to read them efficiently until the IR transmission is complete.&lt;br /&gt;
&lt;br /&gt;
To cut off critics:&lt;br /&gt;
&lt;br /&gt;
I know that the ISR is quite large. But since it behaves like a state machine, the effective executed code per cycle is relatively small. As long as the input is &amp;quot;dark&amp;quot; (and that is the case most of the time ;-)) the spent time is vanishingly short. In the WordClock project for example, 8 ISRs are called with the same timer, of which irmp_ISR() just one of many. With a MCU clock of at least 8 MHz, no timing problems occured. Consequently, I see no problem with the length of the ISR.&lt;br /&gt;
&lt;br /&gt;
A crystal is not mandatory, it works well with the internal AVR oscillator. Remember to set the correct fuses for the CPU to run at 8 MHz, check [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-avr.c?view=markup irmp-main-avr.c] for correct values for an ATMEGA88.&lt;br /&gt;
&lt;br /&gt;
== Scanning Unknown IR Protocols ==&lt;br /&gt;
&lt;br /&gt;
To enable logging in [[IRMP_-_english#top|IRMP]], modify the value of [[IRMP_-_english#IRMP_LOGGING|IRMP_LOGGING]] to 1 of [http://www.mikrocontroller.net/svnbrowser/irmp/irmpconfig.h?view=markup irmpconfig.h] on the line&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
    #define IRMP_LOGGING    0   // 1: log IR signal (scan), 0: do not (default)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When logging is enabled, the bright and dark phases are sent via UART at 9600 bits/s: 1=dark, 0=bright. The constants in the functions uart_init() and uart_putc() may need to be modified,  depending on the AVR MCU used.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note: for PIC microcontrollers there is a dedicated logging module named [http://www.mikrocontroller.net/svnbrowser/irmp/irmpextlog.c?view=markup irmpextlog.c]. This makes it possible to log via USB. This does not apply to the AVR version&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
By capturing these protocol scans with a terminal program and saving them to a text file, you can use these files to analyze the frames in order to add new protocols to [[IRMP_-_english#top|IRMP]] - see next chapter.&lt;br /&gt;
&lt;br /&gt;
If you have a remote control that is not supported by [[IRMP_-_english#top|IRMP]], you can send me ([http://www.mikrocontroller.net/user/show/ukw ukw]) the scan files. Then I can check if the protocol is compatible with the IRMP model and modify the source code if applicable.&lt;br /&gt;
&lt;br /&gt;
== IRMP under Linux and Windows ==&lt;br /&gt;
&lt;br /&gt;
=== Compilation ===&lt;br /&gt;
&lt;br /&gt;
[http://www.mikrocontroller.net/svnbrowser/irmp/irmp.c?view=markup irmp.c] can be compiled under Linux for testing IR scans in textfiles. In the subdirectory &#039;IR-Data&#039; you will find such files that you can use as input files for [[IRMP_-_english#top|IRMP]].&lt;br /&gt;
&lt;br /&gt;
To compile [[IRMP_-_english#top|IRMP]], enter:&lt;br /&gt;
&lt;br /&gt;
    make -f makefile.lnx&lt;br /&gt;
&lt;br /&gt;
This will generate 3 IRMP versions:&lt;br /&gt;
&lt;br /&gt;
* irmp-10kHz: Version for 10kHz scans&lt;br /&gt;
* irmp-15kHz: Version for 15kHz scans&lt;br /&gt;
* irmp-20kHz: Version for 20kHz scans&lt;br /&gt;
&lt;br /&gt;
=== Starting IRMP ===&lt;br /&gt;
&lt;br /&gt;
The calling syntax is:&lt;br /&gt;
&lt;br /&gt;
  ./irmp-nnkHz [-l|-p|-a|-v] &amp;lt; scan-file&lt;br /&gt;
&lt;br /&gt;
Options are mutually exclusive, so only one option per call is valid:&lt;br /&gt;
&lt;br /&gt;
Option:&lt;br /&gt;
&lt;br /&gt;
   -l  List             print a list with pulses and pauses&lt;br /&gt;
   -a analyze           analyse the pulses/pauses and write a &amp;quot;spectrum&amp;quot; in ASCII format&lt;br /&gt;
   -v verbose           verbose output&lt;br /&gt;
   -p  Print Timings    print a timing table for all protocols&lt;br /&gt;
&lt;br /&gt;
Samples:&lt;br /&gt;
&lt;br /&gt;
=== Normal Output ===&lt;br /&gt;
&lt;br /&gt;
   ./irmp-10kHz &amp;lt; IR-Data/orion_vcr_07660BM070.txt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Output Lists ===&lt;br /&gt;
&lt;br /&gt;
   ./irmp-10kHz -l &amp;lt; IR-Data/orion_vcr_07660BM070.txt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Analysis ===&lt;br /&gt;
&lt;br /&gt;
   ./irmp-10kHz -a &amp;lt; IR-Data/orion_vcr_07660BM070.txt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here you see the measured times of all pulses and pauses (spaces) as horizontal bar graphs, whose distributions are not ideal bell curves due to the ASCII formatting. The narrower the measured peaks, the better the timing of the remote.&lt;br /&gt;
&lt;br /&gt;
The above output can be read as:&lt;br /&gt;
&lt;br /&gt;
* the start bit has a pulse length between 9000 and 9200 µs, on average 9102 µs. The deviation from this average is about 1.1%&lt;br /&gt;
&lt;br /&gt;
* the start bit has a space length between 4300 and 4500 µs, the average is 4424 µs. The error is about 2.8%.&lt;br /&gt;
&lt;br /&gt;
* the pulse length of a data bit is between 500 and 700 µs, on average 650 µs, the error is (quite large!) 23.1%&lt;br /&gt;
&lt;br /&gt;
Further there are two more spaces of different lengths (for bits 0 and 1). Reading these is left as an exercise to the reader. ;-)&lt;br /&gt;
&lt;br /&gt;
=== Verbose Output ===&lt;br /&gt;
&lt;br /&gt;
    ./irmp-10kHz -v &amp;lt; IR-Data/orion_vcr_07660BM070.txt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
# 1 - IR-cmd: 0x0001&lt;br /&gt;
   0.200ms [starting pulse]&lt;br /&gt;
  13.700ms [start-bit: pulse = 91, pause = 44]&lt;br /&gt;
protocol = NEC, start bit timings: pulse:  62 - 118, pause:  30 -  60&lt;br /&gt;
pulse_1:   3 -   8&lt;br /&gt;
pause_1:  11 -  23&lt;br /&gt;
pulse_0:   3 -   8&lt;br /&gt;
pause_0:   3 -   8&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;
  14.800ms [bit  0: pulse =   6, pause =   5] 0&lt;br /&gt;
  16.000ms [bit  1: pulse =   6, pause =   6] 0&lt;br /&gt;
  17.100ms [bit  2: pulse =   6, pause =   5] 0&lt;br /&gt;
  18.200ms [bit  3: pulse =   6, pause =   5] 0&lt;br /&gt;
  19.300ms [bit  4: pulse =   6, pause =   5] 0&lt;br /&gt;
  20.500ms [bit  5: pulse =   6, pause =   6] 0&lt;br /&gt;
  21.600ms [bit  6: pulse =   6, pause =   5] 0&lt;br /&gt;
  23.800ms [bit  7: pulse =   6, pause =  16] 1&lt;br /&gt;
  26.100ms [bit  8: pulse =   6, pause =  17] 1&lt;br /&gt;
  28.300ms [bit  9: pulse =   6, pause =  16] 1&lt;br /&gt;
  29.500ms [bit 10: pulse =   6, pause =   6] 0&lt;br /&gt;
  31.700ms [bit 11: pulse =   6, pause =  16] 1&lt;br /&gt;
  34.000ms [bit 12: pulse =   6, pause =  17] 1&lt;br /&gt;
  36.200ms [bit 13: pulse =   6, pause =  16] 1&lt;br /&gt;
  38.500ms [bit 14: pulse =   6, pause =  17] 1&lt;br /&gt;
  39.600ms [bit 15: pulse =   6, pause =   5] 0&lt;br /&gt;
  41.900ms [bit 16: pulse =   6, pause =  17] 1&lt;br /&gt;
  43.000ms [bit 17: pulse =   6, pause =   5] 0&lt;br /&gt;
  44.100ms [bit 18: pulse =   6, pause =   5] 0&lt;br /&gt;
  45.200ms [bit 19: pulse =   6, pause =   5] 0&lt;br /&gt;
  46.400ms [bit 20: pulse =   7, pause =   5] 0&lt;br /&gt;
  47.500ms [bit 21: pulse =   6, pause =   5] 0&lt;br /&gt;
  48.600ms [bit 22: pulse =   6, pause =   5] 0&lt;br /&gt;
  49.800ms [bit 23: pulse =   6, pause =   6] 0&lt;br /&gt;
  50.900ms [bit 24: pulse =   5, pause =   6] 0&lt;br /&gt;
  53.100ms [bit 25: pulse =   6, pause =  16] 1&lt;br /&gt;
  55.400ms [bit 26: pulse =   6, pause =  17] 1&lt;br /&gt;
  57.600ms [bit 27: pulse =   6, pause =  16] 1&lt;br /&gt;
  59.900ms [bit 28: pulse =   6, pause =  17] 1&lt;br /&gt;
  62.100ms [bit 29: pulse =   6, pause =  16] 1&lt;br /&gt;
  64.400ms [bit 30: pulse =   6, pause =  17] 1&lt;br /&gt;
  66.700ms [bit 31: pulse =   6, pause =  17] 1&lt;br /&gt;
stop bit detected&lt;br /&gt;
  67.300ms code detected, length = 32&lt;br /&gt;
  67.300ms p =  2, a = 0x7b80, c = 0x0001, f = 0x00&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Starting under Windows ===&lt;br /&gt;
&lt;br /&gt;
[[IRMP_-_english#top|IRMP]] can be used under Windows as well:&lt;br /&gt;
&lt;br /&gt;
* start command line console&lt;br /&gt;
* change to directory &#039;irmp&#039;&lt;br /&gt;
* enter:&lt;br /&gt;
            irmp-10kHz.exe &amp;lt; IR-Data\rc5x.txt&lt;br /&gt;
&lt;br /&gt;
The same options apply as for the Linux version.&lt;br /&gt;
&lt;br /&gt;
=== Long Output ===&lt;br /&gt;
&lt;br /&gt;
As some output is very long, it is recommended to redirect the output to a file or filter for paging:&lt;br /&gt;
&lt;br /&gt;
Linux:&lt;br /&gt;
&lt;br /&gt;
            ./irmp-10kHz &amp;lt; IR-Data/rc5x.txt | less&lt;br /&gt;
&lt;br /&gt;
Windows:&lt;br /&gt;
&lt;br /&gt;
            irmp-10kHz.exe &amp;lt; IR-Data\rc5x.txt | more&lt;br /&gt;
&lt;br /&gt;
== Remote Controls ==&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! Protocol || Name || Device || Device Address&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#NEC_+_extended_NEC|NEC]] || Toshiba CT-9859 || TV || 0x5F40&lt;br /&gt;
|-&lt;br /&gt;
VCR|-&lt;br /&gt;
| || Elta 8848 MP 4 || DVD player || 0x7F00&lt;br /&gt;
|-&lt;br /&gt;
| || AS-218 || Askey TV-View CHP03X (TV tuner card) || 0x3B86&lt;br /&gt;
|-&lt;br /&gt;
| || Cyberhome ??? || Cyberhome DVD player || 0x6D72&lt;br /&gt;
|-&lt;br /&gt;
| || WD TV Live || Western Digital Multimediaplayer || 0x1F30&lt;br /&gt;
|-&lt;br /&gt;
| || Canon WL-DC100 || Kamera Canon PowerShot G5 || 0xB1CA&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#NEC16|NEC16]] || Daewoo || VCR || 0x0015&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#KASEIKYO|KASEIKYO]] || Technics EUR646497 || SA-AX 730 AV receiver || 0x2002&lt;br /&gt;
|-&lt;br /&gt;
| || Panasonic TV || TX-L32EW6 TV || 0x2002&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#RC5_+_RC5X|RC5]] || Loewe Assist/RC3/RC4 || TV (remote control in TV mode) || 0x0000&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#RC6_+_RC6A|RC6]] || Philips TV || TV (remote control in TV mode) || 0x0000&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#SIRCS|SIRCS]] || Sony RM-816 || TV (remote control in TV mode) || 0x0000&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#DENON|DENON]] || DENON RC970 || AVR3805 AV receiver || 0x0008&lt;br /&gt;
|-&lt;br /&gt;
| || DENON RC970 || DVD/CD player || 0x0002&lt;br /&gt;
|-&lt;br /&gt;
| || DENON RC970 || Tuner || 0x0006&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#SAMSUNG32|SAMSUNG32]] || Samsung AA59-00484A || LE40D550 TV || 0x0707&lt;br /&gt;
|-&lt;br /&gt;
| || LG AKB72033901 || BD370 Blu-Ray player  || 0x2D2D&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#APPLE|APPLE]] || Apple || Apple iPod Dock || 0x0020&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Cameras ==&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width: 80%;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 20%;&amp;quot; |&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
[[IRMP_-_english#top|IRMP]] supports more and more camera remotes like:&lt;br /&gt;
&lt;br /&gt;
* [[IRMP_-_english#PENTAX|PENTAX]]&lt;br /&gt;
* [[IRMP_-_english#Nikon|Nikon]]&lt;br /&gt;
&lt;br /&gt;
The array of commands is quite limited. Cameras understand only the shutter release command.&lt;br /&gt;
||&lt;br /&gt;
[[Datei:Irmp-pentax.png|miniatur|PENTAX protocol]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Here is a short table for [[IRMP_-_english#PENTAX|PENTAX]] cameras:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! Command || Function&lt;br /&gt;
|-&lt;br /&gt;
| 0x0000 || Shutter release&lt;br /&gt;
|-&lt;br /&gt;
| 0x0001 || change zoom level&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Because there is no address designated in the [[IRMP_-_english#PENTAX|PENTAX]] protocol, for transmitting, it should be set to 0x0000 in [[IRSND_-_english|IRSND]]. &lt;br /&gt;
&lt;br /&gt;
For Nikon cameras, a crystal should be used because these cameras are quite sensitive to timing accuracy.&lt;br /&gt;
&lt;br /&gt;
== IR Keyboards ==&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width: 80%;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 20%;&amp;quot; |&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
From version 1.7.0 on, [[IRMP_-_english#top|IRMP]] also supports IR keyboards, namely the FDC-3402 &amp;lt;s&amp;gt; from www.pollin.de (partno. 711 056) for less than 2 Euro.&amp;lt;/s&amp;gt; (not available as of 19.09.2017 )&lt;br /&gt;
&lt;br /&gt;
On detection of a key press the following data is returned:&lt;br /&gt;
&lt;br /&gt;
 Protocol number  (irmp_data.protocol): 18&lt;br /&gt;
 Address          (irmp_data.address) : 0x003F&lt;br /&gt;
||&lt;br /&gt;
[[Datei:irmp-fdc3402.jpg|miniatur|FDC-3402 keyboard]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The following values are returned as commands (irmp_data.command) :&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size:50%; text-align:center;&amp;quot;&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! Code || Key   || Code || Key   || Code || Key   || Code || Key   || Code || Key   || Code || Key   || Code || Key   || Code || Key   &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;
Special keys on the left:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! Code || Key   &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;
The above values are for pressing a key. On release, [[IRMP_-_english#top|IRMP]] sets also bit 8 (0x80) in the command.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
      Key &#039;a&#039; pressed:   0x001F&lt;br /&gt;
      Key &#039;a&#039; released:  0x009F&lt;br /&gt;
&lt;br /&gt;
The ON/OFF key is an exception: This key only sends a code for a key press, not for the release.&lt;br /&gt;
&lt;br /&gt;
If a key is held, this is indicated in irmp_data.flag.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
                           command   flag&lt;br /&gt;
      Key &#039;a&#039; pressed:   0x001F    0x00&lt;br /&gt;
      Key &#039;a&#039; pressed:   0x001F    0x01&lt;br /&gt;
      Key &#039;a&#039; pressed:   0x001F    0x01&lt;br /&gt;
      Key &#039;a&#039; pressed:   0x001F    0x01&lt;br /&gt;
      ....&lt;br /&gt;
      Key &#039;a&#039; released:  0x009F    0x00&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
When key combinations (like a capital &#039;A&#039;) are pressed, then the return values are a sequence like this:&lt;br /&gt;
&lt;br /&gt;
      Left SHIFT-key pressed:    0x0002&lt;br /&gt;
      Key &#039;a&#039; pressed:           0x001F&lt;br /&gt;
      Key &#039;a&#039; released:          0x009F&lt;br /&gt;
      Left SHIFT-key released:   0x0082&lt;br /&gt;
&lt;br /&gt;
In [http://www.mikrocontroller.net/svnbrowser/irmp/irmp.c?view=markup irmp.c] you will find a function get_fdc_key() for the Linux version, which can be used as a template to convert the FDC keycodes into the corresponding ASCII codes. This function can be used either locally on the MCU to decode the keycodes, or on the host system (e.g. PC) where the IRMP data structure is sent to. Therefore the function including preprocessor constants should be copied to your application code.&lt;br /&gt;
&lt;br /&gt;
Here is an excerpt:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&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;,  0xDF, &#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;,  0xFC, &#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;, 0xF6, 0xE4, &#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;,  0xDC, &#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;, 0xD6, 0xC4, &#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 = 0xB2;    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 = 0xB5;    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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As a final example, use of the get_fdc_key() function:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Non-printable characters are coded as follows:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! Key               || Constant                || Value&lt;br /&gt;
|-&lt;br /&gt;
| ESC               || KEY_ESCAPE              || 0x1B&lt;br /&gt;
|-&lt;br /&gt;
| Menu              || KEY_MENUE               || 0x80&lt;br /&gt;
|-&lt;br /&gt;
| Back              || KEY_BACK                || 0x81&lt;br /&gt;
|-&lt;br /&gt;
| Forward           || KEY_FORWARD             || 0x82&lt;br /&gt;
|-&lt;br /&gt;
| Adress            || KEY_ADDRESS             || 0x83&lt;br /&gt;
|-&lt;br /&gt;
| Window            || KEY_WINDOW              || 0x84&lt;br /&gt;
|-&lt;br /&gt;
| 1. Page           || 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;
| New Page          || KEY_NEW_PAGE            || 0x89&lt;br /&gt;
|-&lt;br /&gt;
| Setup             || KEY_SETUP               || 0x8A&lt;br /&gt;
|-&lt;br /&gt;
| Font              || KEY_FONT                || 0x8B&lt;br /&gt;
|-&lt;br /&gt;
| Print             || KEY_PRINT               || 0x8C&lt;br /&gt;
|-&lt;br /&gt;
| On/Off            || 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;
| Insert            || KEY_INSERT              || 0x90&lt;br /&gt;
|-&lt;br /&gt;
| Delete            || KEY_DELETE              || 0x91&lt;br /&gt;
|-&lt;br /&gt;
| Cursor left       || KEY_LEFT                || 0x92&lt;br /&gt;
|-&lt;br /&gt;
| Pos1              || KEY_HOME                || 0x93&lt;br /&gt;
|-&lt;br /&gt;
| End               || KEY_END                 || 0x94&lt;br /&gt;
|-&lt;br /&gt;
| Cursor right      || KEY_UP                  || 0x95&lt;br /&gt;
|-&lt;br /&gt;
| Cursor down       || KEY_DOWN                || 0x96&lt;br /&gt;
|-&lt;br /&gt;
| Page up           || KEY_PAGE_UP             || 0x97&lt;br /&gt;
|-&lt;br /&gt;
| Page down         || KEY_PAGE_DOWN           || 0x98&lt;br /&gt;
|-&lt;br /&gt;
| Cursor left       || KEY_RIGHT               || 0x99&lt;br /&gt;
|-&lt;br /&gt;
| Left Mousebutton  || KEY_MOUSE_1             || 0x9E&lt;br /&gt;
|-&lt;br /&gt;
| Right Mousebutton || KEY_MOUSE_2             || 0x9F&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The get_fdc_key() function considers the state of the Shift, Ctrl, and Alt keys. As a result, not only capital letters can be entered, but also special characters with Alt + key combinations, e.g. Alt + m -&amp;gt; µ or Alt + q -&amp;gt; @. You can also send Ctrl + A to Ctrl + Z by using the Ctrl key. The Caps Lock key is ignored, as I regard this key as the most unnecessary key at all ;-)&lt;br /&gt;
&lt;br /&gt;
= Appendix =&lt;br /&gt;
&lt;br /&gt;
== IR Protocols in Detail ==&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width: 80%;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 20%;&amp;quot; |&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
=== Pulse Distance Protocols ===&lt;br /&gt;
||&lt;br /&gt;
[[Datei:Pulse-Distance.png|miniatur|Pulse Distance Coding]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== NEC + extended NEC ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#NEC Protocol|NEC + extended NEC]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 36 kHz / 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 32 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data NEC || 8 address bits + 8 inverted address bits + 8 command bits + 8 inverted command bits&lt;br /&gt;
|-&lt;br /&gt;
| Data ext. NEC || 16 address bits + 8 command bits + 8 inverted command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 9000µs pulse, 4500µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 560µs pulse,  560µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 560µs pulse, 1690µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 560µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || 9000µs pulse, 2250µs pause, 560µs pulse, ~100ms pause&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== JVC ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#NEC16 Protocol (JVC)|JVC]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 16 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 4 address bits + 12 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 9000µs pulse, 4500µs pause, 6000µs pause if key repeat&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 560µs pulse,  560µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 560µs pulse, 1690µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 560µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after pause of 25ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== NEC16 ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;NEC16&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 8 address bits + 1 sync bit + 8 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 9000µs pulse, 4500µs pause&lt;br /&gt;
|-&lt;br /&gt;
| sync bit || 560µs pulse, 4500µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 560µs pulse,  560µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 560µs pulse, 1690µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 560µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after pause of 25ms?&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== NEC42 ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;NEC42&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 42 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 13 address bits + 13 inverted address bits + 8 command bits + 8 inverted command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 9000µs pulse, 4500µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 560µs pulse,  560µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 560µs pulse, 1690µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 560µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after 110ms (beginning from start bit), 9000µs pulse, 2250µs pause, 560µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== ACP24 ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#ACP24 Protocol|ACP24]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 70 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 0 address bits + 70 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 390µs pulse, 950µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 390µs pulse,  950µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 390µs pulse, 13000µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 390µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || unknown&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== LGAIR ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#LGAIR Protocol|LGAIR]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 28 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 8 address bits + 16 command bits + 4 checksum bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 9000µs pulse, 4500µs pause (identical to [[IRMP_-_english#NEC_.2B_extended_NEC|NEC]])&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 560µs pulse,  560µs pause (identical to [[IRMP_-_english#NEC_.2B_extended_NEC|NEC]])&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 560µs pulse, 1690µs pause (identical to [[IRMP_-_english#NEC_.2B_extended_NEC|NEC]])&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 560µs pulse (identical to [[IRMP_-_english#NEC_.2B_extended_NEC|NEC]])&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || unknown&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first (&#039;&#039;&#039;differs&#039;&#039;&#039; from [[IRMP_-_english#NEC_.2B_extended_NEC|NEC]])&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SAMSUNG ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#SAMSUNG Protocol|SAMSUNG]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || ?? kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 16 data(1) bits + 1 sync bit + 20 data(2)-bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data(1) || 16 address bits&lt;br /&gt;
|-&lt;br /&gt;
| Data(2) || 4 ID bits + 8 command bits + 8 inverted command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 4500µs pulse, 4500µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 550µs pulse, 550µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 550µs pulse, 1650µs pause&lt;br /&gt;
|-&lt;br /&gt;
| sync bit || 550µs pulse, 4500µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 550µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after approx. 100ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SAMSUNG32 ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;SAMSUNG32&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 32 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 16 address bits + 16 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 4500µs pulse, 4500µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 550µs pulse,  550µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 550µs pulse, 1650µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 550µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after approx. 47msec&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SAMSUNG48 ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;SAMSUNG48&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 48 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 16 address bits + 32 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Command || 8 bits + 8 inverted bits + 8 bits + 8 inverted bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 4500µs pulse, 4500µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 550µs pulse,  550µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 550µs pulse, 1650µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 550µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || one after approx. 5 msec&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after approx. 45 msec&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== MATSUSHITA ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#MATSUHITA Protocol|MATSUSHITA]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 36 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance, timing identical to [[IRMP_-_english#TECHNICS|TECHNICS]]&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 24 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 6 customer bits + 6 command bits + 12 address bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 3488µs pulse, 3488µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 872µs pulse,  872µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 872µs pulse, 2616µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 872µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after 40ms pause&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first?&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== TECHNICS ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;TECHNICS&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 36 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance, timing identical to [[IRMP_-_english#MATSUSHITA|MATSUSHITA]]&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 22 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 11 command bits + 11 inverted command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 3488µs pulse, 3488µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 872µs pulse,  872µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 872µs pulse, 2616µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 872µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after 40ms pause&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first?&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== KASEIKYO ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#KASEIKYO_Protocol_.28.22Japan Protocol.22.29|KASEIKYO]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 48 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 16 customer bits + 4 parity bits + 4 genre1 bits + 4 genre2 bits + 10 command bits + 2 ID bits + 8 parity bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 3380µs pulse, 1690µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 423µs pulse,  423µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 423µs pulse, 1269µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 423µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after approx. 80ms pause&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first?&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== RECS80 ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#RECS80 and RECS80 Extended Protocol|RECS80]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bits + 10 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 1 toggle bit + 3 address bits + 6 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 158µs pulse, 7432µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 158µs pulse, 4902µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 158µs pulse, 7432µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 158µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after approx. 100ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== RECS80EXT ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#RECS80 and RECS80 Extended Protocol|RECS80EXT]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 2 start bits + 11 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 1 toggle bit + 4 address bits + 6 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 158µs pulse, 3637µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 158µs pulse, 4902µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 158µs pulse, 7432µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 158µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after approx. 100ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== DENON ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#Denon Protocol|DENON]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz (in practice, theoretically: 32 kHz)&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 0 start bits + 15 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 5 address bits + 10 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Command || 6 data bits + 2 extension bits + 2 data construction bits (normal: 00, inverted: 11)&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || none&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 310µs pulse, 745µs pause (in practice, theoretically: 275µs pulse, 775µs pause)&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 310µs pulse, 1780µs pause (in practice, theoretically: 275µs pulse, 1900µs pause)&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 310µs pulse (310µs pulse, 745µs pause (in practice, theoretically: 275µs pulse)&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || after 65ms with inverted command bits (data construction bits = 11)&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || both frames after 65ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== APPLE ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;APPLE&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 32 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 16 address bits + 11100000 + 8 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || see [[IRMP_-_english#NEC_+_extended_NEC|NEC]]&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || see [[IRMP_-_english#NEC_+_extended_NEC|NEC]]&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || see [[IRMP_-_english#NEC_+_extended_NEC|NEC]]&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || see [[IRMP_-_english#NEC_+_extended_NEC|NEC]]&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after approx. 100ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== BOSE ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;BOSE&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 16 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 0 address bits + 8 command bits + 8 inverted command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 1060µs pulse, 1425µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 550µs pulse,  437µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 550µs pulse, 1425µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 550µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || unknown&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== B&amp;amp;O ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#Bang &amp;amp; Olufsen|B&amp;amp;O]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 455 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 4 start bits + 16 data bits + 1 trailer bit + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 0 address bits + 16 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit 1 || 200µs pulse, 2925µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Start bit 2 || 200µs pulse, 2925µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Start bit 3 || 200µs pulse, 15425µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Start bit 4 || 200µs pulse, 2925µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 200µs pulse, 2925µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 200µs pulse, 9175µs pause&lt;br /&gt;
|-&lt;br /&gt;
| R bit || 200µs pulse, 6050µs pause, repeats the last bit&lt;br /&gt;
|-&lt;br /&gt;
| Trailer bit || 200µs pulse, 12300µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 200µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after approx. 100ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== FDC ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;FDC&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 40 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 8 address bits + 12 x 0 bits + 4 press/release bits + 8 command bits + 8 inverted command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 2085µs pulse, 966µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 300µs pulse,  220µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 300µs pulse, 715µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 300µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Press Key || press/release bits = 0000&lt;br /&gt;
|-&lt;br /&gt;
| Release Key || press/release bits = 1111&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after pause of approx. 60ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Nikon ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;Nikon&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 2 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 2 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 2200µs pulse, 27100µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 500µs pulse,  1500µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 500µs pulse, 3500µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 500µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || unknown&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== PANASONIC ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;PANASONIC&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 56 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 24 bits (010000000000010000000001) + 16 address bits + 16 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 3600µs pulse, 1600µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 565µs pulse,  316µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 565µs pulse, 1140µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 565µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || unknown&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first?&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== PENTAX ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;PENTAX&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 6 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 6 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 2200µs pulse, 27100µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 1000µs pulse,  1000µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 1000µs pulse, 3000µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 1000µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || unknown&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== KATHREIN ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;KATHREIN&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 11 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 4 address bits + 7 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 210µs pulse, 6218µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 210µs pulse,  1400µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 210µs pulse, 3000µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 210µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after 35ms?&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== LEGO ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#LEGO Power Functions RC|LEGO]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 16 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 12 command bits + 4 crc bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 158µs pulse, 1026µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 158µs pulse,  263µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 158µs pulse, 553µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 158µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || unknown&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== VINCENT ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#VINCENT|VINCENT]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 32 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 16 address bits + 8 command bits + 8 repeated command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 2500µs pulse, 4600µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 550µs pulse,  550µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 550µs pulse, 1540µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 550µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || unknown&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first?&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== THOMSON ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;THOMSON&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 33 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 0 start bits + 12 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 4 address bits + 1 toggle bit + 7 command bits&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 550µs pulse,  2000µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 550µs pulse, 4500µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 550µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after 35ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first?&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== TELEFUNKEN ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;TELEFUNKEN&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 15 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 0 address bits + 15 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 600µs pulse, 1500µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 600µs pulse, 600µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 600µs pulse, 1500µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 600µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || unknown&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first?&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== RCCAR ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;RCCAR&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 13 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 13 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 2000µs pulse, 2000µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 600µs pulse,  900µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 600µs pulse, 450µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 600µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after 40ms?&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== RCMM ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#RCMM_Protocol|RCMM]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 36 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame RCMM32 || 1 start bit + 32 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Frame RCMM24 || 1 start bit + 24 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Frame RCMM12 || 1 start bit + 12 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data RCMM32 || 16 address bits (= 4 mode bits + 12 device bits) + 1 toggle bit + 15 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Data RCMM24 || 16 address bits (= 4 mode bits + 12 device bits) + 1 toggle bit + 7 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Data RCMM12 || 4 address bits (= 2 mode bits + 2 device bits) + 8 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 500µs pulse, 220µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 00 bits || 230µs pulse, 220µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 01 bits || 230µs pulse, 380µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 10 bits || 230µs pulse, 550µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 11 bits || 230µs pulse, 720µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 230µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after 80ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width: 80%;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 20%;&amp;quot; |&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
=== Pulse Width Protocols ===&lt;br /&gt;
||&lt;br /&gt;
[[Datei:Pulse-Width.png|miniatur|Pulse Width Coding]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SIRCS ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#SIRCS_Protocol|SIRCS]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|Frequency ||40 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse width&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 12-20 data bits, no stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 7 command bits + 5 address bits + up to 8 additional bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 2400µs pulse, 600µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 600µs pulse, 600µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 1200µs pulse, 600µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || twice after approx. 25ms, that means: 2nd and 3rd frame&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || starting with 4th identical frame, distance approx. 25ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width: 80%;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 20%;&amp;quot; |&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
=== Pulse distance Width Protocols ===&lt;br /&gt;
||&lt;br /&gt;
[[Datei:Pulse-Distance-Width.png|miniatur|Pulse Distance Width Coding]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== NUBERT ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;NUBERT&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 36 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance width&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 10 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 0 address bits + 10 command bits ?&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 1340µs pulse, 340µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 500µs pulse, 1300µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 1340µs pulse, 340µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 500µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || once after 35ms&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || 3rd, 5th, 7th etc. indentical frame&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first?&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== FAN ====&lt;br /&gt;
&lt;br /&gt;
This protocol is very similar to [[IRMP_-_english#NUBERT|NUBERT]], but here it will be sent only one frame. Additionally there are 11 instead of 10 data bits and no stop bit. The pause time between frame repetitions is substantial lower.&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;FAN &#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 36 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance width&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 11 data bits + 0 stop bits&lt;br /&gt;
|-&lt;br /&gt;
| Data || 0 address bits + 11 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 1280µs pulse, 380µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 380µs pulse, 1280µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 1280µs pulse, 380µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 500µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after 6.6ms pause&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SPEAKER ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;SPEAKER&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance width&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 10 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 0 address bits + 10 command bits ?&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 440µs pulse, 1250µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 440µs pulse, 1250µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 1250µs pulse, 440µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 440µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || once after approx. 38ms&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || 3rd, 5th, 7th ... identical frame&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first?&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== ROOMBA ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;ROOMBA&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance width&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 7 data bits + 0 stop bits&lt;br /&gt;
|-&lt;br /&gt;
| Data || 0 address bits + 7 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 2790µs pulse, 930µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 930µs pulse, 2790µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 2790µs pulse, 930µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || no stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || 3 times after 18ms?&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || unknown&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width: 80%;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 20%;&amp;quot; |&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
=== Biphase Protocols ===&lt;br /&gt;
||&lt;br /&gt;
[[Datei:Biphase-Coding.png|miniatur|Biphase Coding]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== RC5 + RC5X ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#RC5 and RC5x Protocol|RC5 + RC5X]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 36 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || Biphase (Manchester)&lt;br /&gt;
|-&lt;br /&gt;
| Frame RC5 || 2 start bits + 12 data bits + 0 stop bits&lt;br /&gt;
|-&lt;br /&gt;
| Data RC5 || 1 toggle bit + 5 address bits + 6 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Frame RC5X || 1 start bit + 13 data bits + 0 stop bits&lt;br /&gt;
|-&lt;br /&gt;
| Data RC5X || 1 inverteds command bit + 1 toggle bit + 5 address bits + 6 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 889µs pause, 889µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 889µs pulse, 889µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 889µs pause, 889µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || no stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after approx. 100ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== RCII ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;RCII&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 31.25 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || Biphase (Manchester)&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 pre bit + 1 start bit + 9 data bits + 0 stop bits&lt;br /&gt;
|-&lt;br /&gt;
| Data || 0 address bits + 9 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Pre Bit || 512µs pulse, 2560µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 1024µs pulse, &#039;&#039;&#039;no space&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 512µs pause, 512µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 512µs pulse, 512µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || no stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after approx. 118ms&lt;br /&gt;
|-&lt;br /&gt;
| Remarks || An end command (111111111 = 0x1FF) is sent immediately after the button is released.&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== S100 ====&lt;br /&gt;
&lt;br /&gt;
Similar to RC5x, but 14 instead of 13 data bits and 56kHz modulation&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;S100&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 56 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || Biphase (Manchester)&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 14 data bits + 0 stop bits&lt;br /&gt;
|-&lt;br /&gt;
| Data || 1 inverted command bit + 1 toggle bit + 5 address bits + 7 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 889µs pause, 889µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 889µs pulse, 889µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 889µs pause, 889µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || no stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after approx. 100ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== RC6 + RC6A ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#RC6 and RC6A Protocol|RC6 + RC6A]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 36 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || Biphase (Manchester)&lt;br /&gt;
|-&lt;br /&gt;
| Frame RC6 || 1 start bit + 1 bit &amp;quot;1&amp;quot; + 3 mode bits (&amp;quot;000&amp;quot;) + 1 toggle bit + 16 data 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 (&amp;quot;110&amp;quot;) + 1 toggle bit + 31 data bits + 2666µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Data RC6 || 8 address bits + 8 Command Bits&lt;br /&gt;
|-&lt;br /&gt;
| Data RC6A || &amp;quot;1&amp;quot; + 14 customer bits + 8 system bits + 8 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Data RC6A Pace (Sky) || &amp;quot;1&amp;quot; + 3 mode bits (&amp;quot;110&amp;quot;) + 1 toggle bit (UNUSED &amp;quot;0&amp;quot;) + 16 bits + 1 toggle(!) + 15 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 2666µs pulse, 889µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Toggle 0 bit || 889µs pause, 889µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Toggle 1 bit || 889µs pulse, 889µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 444µs pause, 444µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 444µs pulse, 444µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || no stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after approx. 100ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== GRUNDIG + NOKIA ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#Grundig Protocol|GRUNDIG + NOKIA]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz (?)&lt;br /&gt;
|-&lt;br /&gt;
| Coding || Biphase (Manchester)&lt;br /&gt;
|-&lt;br /&gt;
| Frame packet || 1 start frame + 19.968ms pause + N data frames + 117.76ms pause + 1 stop frame&lt;br /&gt;
|-&lt;br /&gt;
| Start frame || 1 pre bit + 1 start bit + 9 data bits (all 1) + 0 stop bits&lt;br /&gt;
|-&lt;br /&gt;
| Data frame || 1 pre bit + 1 start bit + 9 data bits + 0 stop bits&lt;br /&gt;
|-&lt;br /&gt;
| Stop frame || 1 pre bit + 1 start bit + 9 data bits (all 1) + 0 stop bits&lt;br /&gt;
|-&lt;br /&gt;
| Data Grundig || 9 command bits + 0 address bits&lt;br /&gt;
|-&lt;br /&gt;
| Data Nokia || 8 command bits + 8 address bits&lt;br /&gt;
|-&lt;br /&gt;
| Pre bit || 528µs pulse, 2639µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 528µs pulse, 528µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 528µs pause, 528µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 528µs pulse, 528µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || no stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after approx. 117.76ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== IR60 (SDA2008) ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#IR60_.28SDA2008_and_MC14497P.29|IR60]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 30 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || Biphase (Manchester)&lt;br /&gt;
|-&lt;br /&gt;
| Start frame || 1 start bit + 101111 + 0 stop bits + 22ms pause&lt;br /&gt;
|-&lt;br /&gt;
| Data frame || 1 start bit + 7 data bits + 0 stop bits&lt;br /&gt;
|-&lt;br /&gt;
| Data || 0 address bits + 7 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 528µs pulse, 2639µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 528µs pause, 528µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 528µs pulse, 528µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || no stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after approx. 117.76ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SIEMENS + RUWIDO ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;SIEMENS + RUWIDO&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 36 kHz? (Merlin keyboard with Ruwido protocol: 56 kHz)&lt;br /&gt;
|-&lt;br /&gt;
| Coding || Biphase (Manchester)&lt;br /&gt;
|-&lt;br /&gt;
| Frame Siemens || 1 start bit + 22 data bits + 0 stop bits&lt;br /&gt;
|-&lt;br /&gt;
| Frame Ruwido || 1 start bit + 17 data bits + 0 stop bits&lt;br /&gt;
|-&lt;br /&gt;
| Data Siemens || 11 address bits + 10 command bits + 1 inverted bit (preceding bit inverted)&lt;br /&gt;
|-&lt;br /&gt;
| Data Ruwido || 9 address bits + 7 command bits + 1 inverted bit (preceding bit inverted)&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 275µs pulse, 275µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 275µs pause, 275µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 275µs pulse, 275µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || no stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || once with repeat bit set (?)&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after approx. 100ms (?)&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== A1TVBOX ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;A1TVBOX&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || Biphase (Manchester) asymmetric&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 2 start bits + 16 data bits + 0 stop bits&lt;br /&gt;
|-&lt;br /&gt;
| Data || 8 address bits + 8 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bits || &amp;quot;10&amp;quot;, also 250µs pulse, 150µs + 150µs pause, 250µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 150µs pause, 250µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 250µs pulse, 150µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || no stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || unknown&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== MERLIN ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;MERLIN&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 56 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || Biphase (Manchester) asymmetric&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 2 start bits + 18 data bits + 0 stop bits&lt;br /&gt;
|-&lt;br /&gt;
| Data || 8 address bits + 10 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bits || &amp;quot;10&amp;quot;, also 210µs pulse, 210µs + 210µs pause, 210µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 210µs pause, 210µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 210µs pulse, 210µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || no stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || unknown&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== ORTEK ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;ORTEK&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || Biphase (Manchester) symmetric&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 2 start bits + 18 data bits + 0 stop bits&lt;br /&gt;
|-&lt;br /&gt;
| Data || 6 address bits + 2 special bits +  6 command bits + 4 special bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 2000µs pulse, 1000µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 500µs pause, 500µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 500µs pulse, 500µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || no stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || 2 additional frames with special bits set&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || only repeats the 2nd frame&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Pulse Position Protocols ===&lt;br /&gt;
&lt;br /&gt;
==== NETBOX ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;NETBOX&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse position&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 16 data bits, no stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 3 address bits + 13 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 2400µs pulse, 800µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Bit Length || 800µs&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after approx. 35ms?&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Software History ==&lt;br /&gt;
&lt;br /&gt;
=== Changes of IRMP in 3.2.x === &lt;br /&gt;
&lt;br /&gt;
Version 3.2.6:&lt;br /&gt;
&lt;br /&gt;
* 2021-01-27: &#039;&#039;&#039;New IR Protocol:&#039;&#039;&#039; [[IRMP#MELINERA|MELINERA]]&lt;br /&gt;
* 2021-01-27: Protocol [[IRMP#LEGO|LEGO]]: Improved timing&lt;br /&gt;
* 2021-01-27: Protocol [[IRMP#RUWIDO|RUWIDO]]: Improved timing&lt;br /&gt;
* 2021-01-27: Protocol [[IRMP#NEC|NEC]]: Implemented send of raw NEC repetition frames &lt;br /&gt;
&lt;br /&gt;
Version 3.2.3:&lt;br /&gt;
&lt;br /&gt;
* 2020-08-15: &#039;&#039;&#039;New RF Protocol:&#039;&#039;&#039; [[IRMP#RF_MEDION|RF_MEDION]]&lt;br /&gt;
&lt;br /&gt;
Version 3.2.2:&lt;br /&gt;
&lt;br /&gt;
* 2020-07-09: Additional recognition of the radio channels with the RF_X10 protocol&lt;br /&gt;
* 2020-07-09: Improved RF frame detection with new stop bit handling.&lt;br /&gt;
* 2020-07-09: Improved detection of RF_GEN24 protocols&lt;br /&gt;
* 2020-07-09: &amp;lt;span style=&amp;quot;color:#FF0000&amp;quot;&amp;gt;&#039;&#039;&#039;NEU:&#039;&#039;&#039;&amp;lt;/span&amp;gt; Detection if/when a remote control button is released, see chapter &#039;&#039;&#039;[[IRMP_-_english#Debouncing|Debouncing]]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Version 3.2.1:&lt;br /&gt;
&lt;br /&gt;
* 2020-06-22: Mini bugfix&lt;br /&gt;
&lt;br /&gt;
Version 3.2.0:&lt;br /&gt;
&lt;br /&gt;
* 2020-06-22: Support of 433MHz RF modules&lt;br /&gt;
* 2020-06-22: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP#RF_GEN24|RF_GEN24]]&lt;br /&gt;
* 2020-06-22: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP#X10|X10]]&lt;br /&gt;
&lt;br /&gt;
=== Older Versions ===&lt;br /&gt;
&lt;br /&gt;
* 2019-08-26: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: METZ&lt;br /&gt;
* 2019-08-26: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: ONKYO&lt;br /&gt;
* 2018-09-10: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP#RCII|RCII]]&lt;br /&gt;
* 2018-09-06: Added support of STM32 mit HAL-Library&lt;br /&gt;
* 2018-08-30: New option: IRMP_USE_IDLE_CALL&lt;br /&gt;
* 2018-08-29: Port to ChibiOS&lt;br /&gt;
* 2018-08-29: New protocol: GREE&lt;br /&gt;
* 2018-02-19: corrected handling of irmp_flags for invalid frames&lt;br /&gt;
* 2017-08-25: New protocol: IRMP16 for transparent 16 bit data communication&lt;br /&gt;
* 2016-11-18: Corrected buffer overflow in irmp-main-avr-uart.c&lt;br /&gt;
* 2016-09-19: New protocol [[IRMP#VINCENT|VINCENT]]&lt;br /&gt;
* 2016-09-09: New protocol [[IRMP#MITSU_HEAVY|Mitsubishi Heavy (air conditioner)]]&lt;br /&gt;
* 2016-09-09: Some modifications for Compiler PIC C18&lt;br /&gt;
* 2016-01-16: Some corrections of port to ESP8266&lt;br /&gt;
* 2016-01-16: Added port to MBED&lt;br /&gt;
* 2016-01-16: Added several hardware dependent example main source files&lt;br /&gt;
* 2015-11-17: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#PANASONIC|PANASONIC (Beamer)]]&lt;br /&gt;
* 2015-11-17: Port to ESP8266&lt;br /&gt;
* 2015-11-17: Port to Teensy (3.x)&lt;br /&gt;
* 2015-11-10: Added support for STM8 microcontroller&lt;br /&gt;
* 2015-09-20: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#TECHNICS|TECHNICS]]&lt;br /&gt;
* 2015-06-15: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#ACP24|ACP24]]&lt;br /&gt;
* 2015-05-29: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#S100|S100]]&lt;br /&gt;
* 2015-05-29: Some smaller corrections&lt;br /&gt;
* 2015-05-28: Added Logging for XMega&lt;br /&gt;
* 2015-05-28: Timing corrections  for FAN protocol&lt;br /&gt;
* 2015-05-27: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#MERLIN|MERLIN]]&lt;br /&gt;
* 2015-05-27: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#FAN|FAN]]&lt;br /&gt;
* 2015-05-18: Added F_CPU macro for STM32L1XX&lt;br /&gt;
* 2015-05-18: Some corrections for XMega port&lt;br /&gt;
* 2015-04-23: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#PENTAX|PENTAX]]&lt;br /&gt;
* 2015-04-23: Port to AVR XMega&lt;br /&gt;
* 2014-09-19: Bugfix: added missing newline before #else&lt;br /&gt;
* 2014-09-18: Added logging for ARM STM32F10X&lt;br /&gt;
* 2014-09-17: Corrected PROGMEM access to array irmp_protocol_names[].&lt;br /&gt;
* 2014-09-15: Changed timing tolerances for [[IRMP_-_english#KASEIKYO|KASEIKYO]] protocol&lt;br /&gt;
* 2014-09-15: Moved  irmp_protocol_names to flash, additional UART routines in irmp-main-avr-uart.c&lt;br /&gt;
* 2014-07-21: Port to PIC 12F1840&lt;br /&gt;
* 2014-07-09: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#SAMSUNG48|SAMSUNG48]]&lt;br /&gt;
* 2014-07-09: Some small corrections&lt;br /&gt;
* 2014-07-01: Added logging for ARM_STM32F4XX&lt;br /&gt;
* 2014-07-01: IRMP port for PIC XC8 compiler, removed variadic macros because of stupid XC8 compiler :-(&lt;br /&gt;
* 2014-06-05: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#LGAIR|LGAIR]]&lt;br /&gt;
* 2014-05-30: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#SPEAKER|SPEAKER]]&lt;br /&gt;
* 2014-05-30: Optimized timings for [[IRMP_-_english#SAMSUNG|SAMSUNG]] protocol&lt;br /&gt;
* 2014-02-20: Corrected decoding of [[IRMP_-_english#SIEMENS_+_RUWIDO|SIEMENS]] protocol&lt;br /&gt;
* 2014-02-19: &#039;&#039;&#039;New protocols&#039;&#039;&#039;: [[IRMP_-_english#RCMM|RCMM32, RCMM24 and RCMM12]]&lt;br /&gt;
* 2014-09-17: Optimized timing for [[IRMP_-_english#ROOMBA|ROOMBA]]&lt;br /&gt;
* 2013-04-09: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#ROOMBA|ROOMBA]]&lt;br /&gt;
* 2013-04-09: Optimized detection of [[IRMP_-_english#ORTEK|ORTEK (Hama)]] frames&lt;br /&gt;
* 2013-03-19: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#ORTEK|ORTEK (Hama)]]&lt;br /&gt;
* 2013-03-19: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#TELEFUNKEN|TELEFUNKEN]]&lt;br /&gt;
* 2013-03-12: Changed timing tolerancies for [[IRMP_-_english#RECS80|RECS80]]- and  [[IRMP_-_english#RECS80EXT|RECS80EXT]] protocol&lt;br /&gt;
* 2013-01-21: Corrected detection of repetition frame beim [[IRMP_-_english#DENON|DENON]] protocol&lt;br /&gt;
* 2013-01-17: Corrected frame detection beim [[IRMP_-_english#DENON|DENON]] protocol&lt;br /&gt;
* 2012-12-11: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#A1TVBOX|A1TVBOX]]&lt;br /&gt;
* 2012-12-07: Improved detection von [[IRMP_-_english#DENON|DENON]] repetition frame&lt;br /&gt;
* 2012-11-19: Port to Stellaris LM4F120 TI Launchpad (ARM Cortex M4)&lt;br /&gt;
* 2012-11-06: Corrected [[IRMP_-_english#DENON|DENON]] frame detection&lt;br /&gt;
* 2012-10-26: Some timer corrections and adaptations for Arduino&lt;br /&gt;
* 2012-07-11: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#BOSE|BOSE]]&lt;br /&gt;
* 2012-06-18: Added support for ATtiny87/167&lt;br /&gt;
* 2012-06-05: Some smaller corrections of port to ARM STM32&lt;br /&gt;
* 2012-06-05: Correction of include in [http://www.mikrocontroller.net/svnbrowser/irmp/irmpextlog.c?view=markup irmpextlog.c]&lt;br /&gt;
* 2012-06-05: Bugfix, if only [[IRMP_-_english#NEC_+_extended_NEC|NEC]] and [[IRMP_-_english#NEC42|NEC42]] activated&lt;br /&gt;
* 2012-05-23: Port to ARM STM32&lt;br /&gt;
* 2012-05-23: Bugfix frame detection for [[IRMP_-_english#DENON|DENON]] protocol&lt;br /&gt;
* 2012-02-27: Bugfix in IR60-Decoder&lt;br /&gt;
* 2012-02-27: Bugfix in CRC calculation of  [[IRMP_-_english#KASEIKYO|KASEIKYO]] frames&lt;br /&gt;
* 2012-02-27: Port to C18 Compiler for PIC microcontrollers&lt;br /&gt;
* 2012-02-13: Bugfix: most significant bit in Address wrong in [[IRMP_-_english#NEC_+_extended_NEC|NEC]] protocol, if [[IRMP_-_english#NEC42|NEC42]] protocol activated, too&lt;br /&gt;
* 2012-02-13: Corrected timing of [[IRMP_-_english#SAMSUNG|SAMSUNG]]- and [[IRMP_-_english#SAMSUNG32|SAMSUNG32]] protocol&lt;br /&gt;
* 2012-02-13: [[IRMP_-_english#KASEIKYO|KASEIKYO]]: Genre2 bits will be now stored in upper nibble of flags&lt;br /&gt;
* 2011-09-20: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#KATHREIN|KATHREIN]]&lt;br /&gt;
* 2011-09-20: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#SIEMENS_+_RUWIDO|RUWIDO]]&lt;br /&gt;
* 2011-09-20: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#THOMSON|THOMSON]]&lt;br /&gt;
* 2011-09-20: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#IR60 (SDA2008)|IR60 (SDA2008)]]&lt;br /&gt;
* 2011-09-20: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#LEGO|LEGO]]&lt;br /&gt;
* 2011-09-20: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#NEC16|NEC16]]&lt;br /&gt;
* 2011-09-20: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#NEC42|NEC42]]&lt;br /&gt;
* 2011-09-20: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#NETBOX|NETBOX]]&lt;br /&gt;
* 2011-09-20: Port to ATtiny84 and ATtiny85&lt;br /&gt;
* 2011-09-20: Improved key repetition detection in [[IRMP_-_english#RC5_+_RC5X|RC5]] protocol&lt;br /&gt;
* 2011-09-20: Improved decoding of [[IRMP_-_english#Biphase|Biphase]] protocols&lt;br /&gt;
* 2011-09-20: Fixed some smaller bugs in [[IRMP_-_english#RECS80|RECS80]] decoder&lt;br /&gt;
* 2011-09-20: Corrected detection of additional bits in SIRCS protocol&lt;br /&gt;
* 2011-01-18: Some corrections for [[IRMP_-_english#SIEMENS_+_RUWIDO|SIEMENS]] protocol&lt;br /&gt;
* 2011-01-18: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#Nikon|Nikon]]&lt;br /&gt;
* 2011-01-18: [[IRMP_-_english#SIRCS|SIRCS]]: additional bits (&amp;gt;12) will be stored in address&lt;br /&gt;
* 2011-01-18: Some timing corrections for [[IRMP_-_english#DENON|DENON]] protocol&lt;br /&gt;
* 2010-09-04: Bugfix for F_INTERRUPTS &amp;gt;= 16000&lt;br /&gt;
* 2010-09-02: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#RC6_+_RC6A|RC6A]]&lt;br /&gt;
* 2010-08-29: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#JVC|JVC]]&lt;br /&gt;
* 2010-08-29: [[IRMP_-_english#KASEIKYO|KASEIKYO]] protocol: genre bits will be now stored&lt;br /&gt;
* 2010-08-29: [[IRMP_-_english#KASEIKYO|KASEIKYO]] protocol: Improved handling of repetition frames&lt;br /&gt;
* 2010-08-29: Improved support of [[IRMP_-_english#APPLE|APPLE]] protocols.&lt;br /&gt;
* 2010-07-01: Bugfix: added a timeout for [[IRMP_-_english#NEC_+_extended_NEC|NEC]] repetition frames. This avoids &#039;ghost commands&#039;.&lt;br /&gt;
* 2010-06-26: Bugfix: deactivated [[IRMP_-_english#RECS80|RECS80]], [[IRMP_-_english#RECS80EXT|RECS80EXT]] &amp;amp; [[IRMP_-_english#SIEMENS_+_RUWIDO|SIEMENS]] if interrupts frequency is low&lt;br /&gt;
* 2010-06-25: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#RCCAR|RCCAR]]&lt;br /&gt;
* 2010-06-25: Extended keyboard detection for [[IRMP_-_english#FDC|FDC]] protocol (IR keyboard)&lt;br /&gt;
* 2010-06-25: Interrupt frequency now up to 20kHz possible&lt;br /&gt;
* 2010-06-09: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#FDC|FDC]] (IR-keyboard)&lt;br /&gt;
* 2010-06-09: Corrected timing for [[IRMP_-_english#DENON|DENON]] protocol&lt;br /&gt;
* 2010-06-02: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#SIEMENS_+_RUWIDO|SIEMENS]] (Gigaset)&lt;br /&gt;
* 2010-05-26: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#GRUNDIG_+_NOKIA|NOKIA]]&lt;br /&gt;
* 2010-05-26: Bugfix: detection of long keyboard press for [[IRMP_-_english#GRUNDIG_+_NOKIA|GRUNDIG]] protocol&lt;br /&gt;
* 2010-05-17: Bugfix [[IRMP_-_english#SAMSUNG32|SAMSUNG32]] protocol: corrected command bit mask&lt;br /&gt;
* 2010-05-16: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#GRUNDIG_+_NOKIA|GRUNDIG]]&lt;br /&gt;
* 2010-05-16: Improved handling of automatic frame repetitions for [[IRMP_-_english#SIRCS|SIRCS]]-, [[IRMP_-_english#SAMSUNG32|SAMSUNG32]]-, and [[IRMP_-_english#NUBERT|NUBERT]] protocol&lt;br /&gt;
* 2010-04-28: Only some cosmetic code optimizations&lt;br /&gt;
* 2010-04-16: Improved all timing tolerancies&lt;br /&gt;
* 2010-04-12: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#B&amp;amp;O|Bang &amp;amp; Olufsen]]&lt;br /&gt;
* 2010-03-29: Bugfix: detection of multiple [[IRMP_-_english#NEC_+_extended_NEC|NEC]] repetition frames&lt;br /&gt;
* 2010-03-29: Moved configuration data to  [http://www.mikrocontroller.net/svnbrowser/irmp/irmpconfig.h?view=markup irmpconfig.h]&lt;br /&gt;
* 2010-03-29: Introduced a program version in README.txt: Version 1.0&lt;br /&gt;
* 2010-03-17: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#NUBERT|NUBERT]]&lt;br /&gt;
* 2010-03-16: Correction of RECS80 start bit timings&lt;br /&gt;
* 2010-03-16: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#RECS80EXT|RECS80 Extended]]&lt;br /&gt;
* 2010-03-15: Some optimizations&lt;br /&gt;
* 2010-03-14: Port to PIC&lt;br /&gt;
* 2010-03-11: Some adjustements for some ATMegas&lt;br /&gt;
* 2010-03-07: Bugfix: Reset of state machine after a incomplete [[IRMP_-_english#RC5_+_RC5X|RC5]] frame&lt;br /&gt;
* 2010-03-05: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#APPLE|APPLE]]&lt;br /&gt;
* 2010-03-05: Data  irmp_data.addr + irmp_data.command will be now stored in the bit order of the appropriate protocol&lt;br /&gt;
* 2010-03-04: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#SAMSUNG32|SAMSUNG32]] (Mix aus [[IRMP_-_english#SAMSUNG|SAMSUNG]] &amp;amp; [[IRMP_-_english#NEC_+_extended_NEC|NEC]] protocol)&lt;br /&gt;
* 2010-03-04: Changed some timer tolerances changes of [[IRMP_-_english#SIRCS|SIRCS]]- and [[IRMP_-_english#KASEIKYO|KASEIKYO]]&lt;br /&gt;
* 2010-03-02: [[IRMP_-_english#SIRCS|SIRCS]]: corrected detection and suppression of automatic frame repetitions&lt;br /&gt;
* 2010-03-02: [[IRMP_-_english#SIRCS|SIRCS]]: device ID bits will be now stored in irmp_data.command (not irmp_data.address anymore)&lt;br /&gt;
* 2010-03-02: Enlargement of scan buffers (for logging)&lt;br /&gt;
* 2010-02-24: New variable flags in IRMP_DATA for detection of long key press&lt;br /&gt;
* 2010-02-20: Bugfix [[IRMP_-_english#DENON|DENON]] protocol: repetition frame is now basically inverted&lt;br /&gt;
* 2010-02-19: Detection of [[IRMP_-_english#NEC_+_extended_NEC|NEC]] protocol-Varianten, z.&amp;amp;nbsp;B. [[IRMP_-_english#APPLE|APPLE]]-Fernbedienung&lt;br /&gt;
* 2010-02-19: Detection of [[IRMP_-_english#RC6_+_RC6A|RC6]]- and [[IRMP_-_english#DENON|DENON]] protocol&lt;br /&gt;
* 2010-02-19: Some improvements for [[IRMP_-_english#RC5_+_RC5X|RC5]] decoders (Bugfixes)&lt;br /&gt;
* 2010-02-13: Bugfix: Puls/Pause counters were 1 too low, now better detection of protokols with very short pulses&lt;br /&gt;
* 2010-02-13: Improved detection of [[IRMP_-_english#NEC_+_extended_NEC|NEC]] repetition frames&lt;br /&gt;
* 2010-02-12: New: [[IRMP_-_english#RC5_+_RC5X|RC5]] protocol&lt;br /&gt;
* 2010-02-05: Eliminated a conflict between [[IRMP_-_english#SAMSUNG|SAMSUNG]]- and [[IRMP_-_english#MATSUSHITA|MATSUSHITA]] protocol&lt;br /&gt;
* 2010-01-07: First version&lt;br /&gt;
&lt;br /&gt;
== Literature ==&lt;br /&gt;
&lt;br /&gt;
=== IR Abstract ===&lt;br /&gt;
&lt;br /&gt;
* http://www.sbprojects.net/knowledge/ir/index.php&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&lt;br /&gt;
* http://mc.mikrocontroller.com/de/IR-Protokolle.php&lt;br /&gt;
&lt;br /&gt;
=== SIRCS Protocol ===&lt;br /&gt;
&lt;br /&gt;
* http://www.sbprojects.net/knowledge/ir/sirc.php&lt;br /&gt;
* http://mc.mikrocontroller.com/de/IR-Protokolle.php#SIRCS&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;
* http://www.celadon.com/infrared_protocol/infrared_protocols_samples.pdf&lt;br /&gt;
&lt;br /&gt;
=== NEC Protocol ===&lt;br /&gt;
&lt;br /&gt;
* http://www.sbprojects.net/knowledge/ir/nec.php&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;
=== ACP24 Protocol ===&lt;br /&gt;
&lt;br /&gt;
The ACP24-Protocol is used by Stiebel-Eltron-Aircons&lt;br /&gt;
&lt;br /&gt;
The structure of the 70 databits is :&lt;br /&gt;
&lt;br /&gt;
              1         2         3         4         5         6&lt;br /&gt;
    0123456789012345678901234567890123456789012345678901234567890123456789&lt;br /&gt;
    N VVMMM    ? ???    t vmA x                 y                     TTTT&lt;br /&gt;
    0011001000000111000010001010000000000000000010000000000000000000001111on, temp=30&lt;br /&gt;
&lt;br /&gt;
These are converted into the following 16 bits from irmp_data.command:&lt;br /&gt;
&lt;br /&gt;
        5432109876543210&lt;br /&gt;
        NAVVvMMMmtxyTTTT&lt;br /&gt;
&lt;br /&gt;
Meaning of the symbols:&lt;br /&gt;
&lt;br /&gt;
    TTTT = Temperature + 15 degree&lt;br /&gt;
            TTTT&lt;br /&gt;
            ----------&lt;br /&gt;
            0000        ???&lt;br /&gt;
            0001        ???&lt;br /&gt;
            0010        ???&lt;br /&gt;
            0011        18 degree&lt;br /&gt;
            0100        19 degree&lt;br /&gt;
            0101        20 degree&lt;br /&gt;
            0110        21 degree&lt;br /&gt;
            ...&lt;br /&gt;
            1111        30 degree&lt;br /&gt;
&lt;br /&gt;
    N    = Nightmode&lt;br /&gt;
            N&lt;br /&gt;
            ----------&lt;br /&gt;
            0           off&lt;br /&gt;
            1           on&lt;br /&gt;
&lt;br /&gt;
    VV   = fan, v must be 1!&lt;br /&gt;
            VV   v&lt;br /&gt;
            ----------&lt;br /&gt;
            00   1      level 1&lt;br /&gt;
            01   1      level 2&lt;br /&gt;
            10   1      level 3&lt;br /&gt;
            11   1      Automatic&lt;br /&gt;
&lt;br /&gt;
    MMM  = Mode&lt;br /&gt;
            MMM  m&lt;br /&gt;
            ----------&lt;br /&gt;
            000  0      turn off&lt;br /&gt;
            001  0      turn on&lt;br /&gt;
            001  1      cooling&lt;br /&gt;
            010  1      fan&lt;br /&gt;
            011  1      demist&lt;br /&gt;
            100  1      ???&lt;br /&gt;
            101  1      ---&lt;br /&gt;
            110  1      ---&lt;br /&gt;
            111  1      ---&lt;br /&gt;
&lt;br /&gt;
    A    = Automatic-Programm&lt;br /&gt;
            A&lt;br /&gt;
            ----------&lt;br /&gt;
            0           off&lt;br /&gt;
            1           on&lt;br /&gt;
&lt;br /&gt;
    t   = Timer&lt;br /&gt;
            t   x y&lt;br /&gt;
            ----------&lt;br /&gt;
            1   1 0     Timer 1&lt;br /&gt;
            1   0 1     Timer 2&lt;br /&gt;
&lt;br /&gt;
To control the air con via [[IRSND_-_english|IRSND]], the following functions can be used:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;irmp.h&amp;quot;&lt;br /&gt;
#include &amp;quot;irsnd.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#define IRMP_ACP24_TEMPERATURE_MASK         0x000F                                          // TTTT&lt;br /&gt;
&lt;br /&gt;
#define IRMP_ACP24_SET_TIMER_MASK           (1&amp;lt;&amp;lt;6)                                          // t&lt;br /&gt;
#define IRMP_ACP24_TIMER1_MASK              (1&amp;lt;&amp;lt;5)                                          // x&lt;br /&gt;
#define IRMP_ACP24_TIMER2_MASK              (1&amp;lt;&amp;lt;4)                                          // y&lt;br /&gt;
&lt;br /&gt;
#define IRMP_ACP24_SET_MODE_MASK            (1&amp;lt;&amp;lt;7)                                          // m&lt;br /&gt;
#define IRMP_ACP24_MODE_POWER_ON_MASK       (1&amp;lt;&amp;lt;8)                                          // MMMm = 0010 Einschalten&lt;br /&gt;
#define IRMP_ACP24_MODE_COOLING_MASK        (IRMP_ACP24_SET_MODE_MASK | (1&amp;lt;&amp;lt;8))             // MMMm = 0011 Kuehlen&lt;br /&gt;
#define IRMP_ACP24_MODE_VENTING_MASK        (IRMP_ACP24_SET_MODE_MASK | (1&amp;lt;&amp;lt;9))             // MMMm = 0101 Lueften&lt;br /&gt;
#define IRMP_ACP24_MODE_DEMISTING_MASK      (IRMP_ACP24_SET_MODE_MASK | (1&amp;lt;&amp;lt;10) | (1&amp;lt;&amp;lt;8))   // MMMm = 1001 Entfeuchten&lt;br /&gt;
&lt;br /&gt;
#define IRMP_ACP24_SET_FAN_STEP_MASK        (1&amp;lt;&amp;lt;11)                                         // v&lt;br /&gt;
#define IRMP_ACP24_FAN_STEP_MASK            0x3000                                          // VV&lt;br /&gt;
#define IRMP24_ACP_FAN_STEP_BIT             12                                              // VV&lt;br /&gt;
#define IRMP_ACP24_AUTOMATIC_MASK           (1&amp;lt;&amp;lt;14)                                         // A&lt;br /&gt;
#define IRMP_ACP24_NIGHT_MASK               (1&amp;lt;&amp;lt;15)                                         // N&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// possible values for acp24_set_mode();&lt;br /&gt;
#define ACP24_MODE_COOLING                  1&lt;br /&gt;
#define ACP24_MODE_VENTING                  2&lt;br /&gt;
#define ACP24_MODE_DEMISTING                3&lt;br /&gt;
&lt;br /&gt;
static uint8_t temperature = 18;                                                    // 18 degrees&lt;br /&gt;
&lt;br /&gt;
static void&lt;br /&gt;
acp24_send (uint16_t cmd)&lt;br /&gt;
{&lt;br /&gt;
    IRMP_DATA irmp_data;&lt;br /&gt;
&lt;br /&gt;
    cmd |=  (temperature - 15) &amp;amp; IRMP_ACP24_TEMPERATURE_MASK;&lt;br /&gt;
&lt;br /&gt;
    irmp_data.protocol = IRMP_ACP24_PROTOCOL;&lt;br /&gt;
    irmp_data.address  = 0x0000;&lt;br /&gt;
    irmp_data.command  = cmd;&lt;br /&gt;
    irmp_data.flags    = 0;&lt;br /&gt;
&lt;br /&gt;
    irsnd_send_data (&amp;amp;irmp_data, 1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void&lt;br /&gt;
acp24_set_temperature (uint8_t temp)&lt;br /&gt;
{&lt;br /&gt;
    uint16_t    cmd = IRMP_ACP24_MODE_POWER_ON_MASK;&lt;br /&gt;
&lt;br /&gt;
    temperature = temp;&lt;br /&gt;
    acp24_send (cmd);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void&lt;br /&gt;
acp24_off (void)&lt;br /&gt;
{&lt;br /&gt;
    uint16_t    cmd = 0;&lt;br /&gt;
    acp24_send (cmd);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#define ACP_FAN_STEP1       0&lt;br /&gt;
#define ACP_FAN_STEP2       1&lt;br /&gt;
#define ACP_FAN_STEP3       2&lt;br /&gt;
#define ACP_FAN_AUTOMATIC   3&lt;br /&gt;
&lt;br /&gt;
void&lt;br /&gt;
acp24_fan (uint8_t fan_step)&lt;br /&gt;
{&lt;br /&gt;
    uint16_t    cmd = IRMP_ACP24_MODE_POWER_ON_MASK;&lt;br /&gt;
&lt;br /&gt;
    cmd |= IRMP_ACP24_SET_FAN_STEP_MASK | ((fan_step &amp;lt;&amp;lt; IRMP24_ACP_FAN_STEP_BIT) &amp;amp; IRMP_ACP24_FAN_STEP_MASK);&lt;br /&gt;
&lt;br /&gt;
    acp24_send (cmd);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void&lt;br /&gt;
acp24_set_mode (uint8_t mode)&lt;br /&gt;
{&lt;br /&gt;
    uint16_t    cmd = 0;&lt;br /&gt;
&lt;br /&gt;
    switch (mode)&lt;br /&gt;
    {&lt;br /&gt;
        case ACP24_MODE_COOLING:    cmd = IRMP_ACP24_MODE_COOLING_MASK;     break;&lt;br /&gt;
        case ACP24_MODE_VENTING:    cmd = IRMP_ACP24_MODE_VENTING_MASK;     break;&lt;br /&gt;
        case ACP24_MODE_DEMISTING:  cmd = IRMP_ACP24_MODE_DEMISTING_MASK;   break;&lt;br /&gt;
        default: return;&lt;br /&gt;
    }&lt;br /&gt;
    acp24_send (cmd);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void&lt;br /&gt;
acp24_program_automatic (void)&lt;br /&gt;
{&lt;br /&gt;
    uint16_t    cmd = IRMP_ACP24_MODE_POWER_ON_MASK | IRMP_ACP24_AUTOMATIC_MASK;&lt;br /&gt;
    acp24_send (cmd);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void&lt;br /&gt;
acp24_program_night (void)&lt;br /&gt;
{&lt;br /&gt;
    uint16_t    cmd = IRMP_ACP24_MODE_POWER_ON_MASK | IRMP_ACP24_NIGHT_MASK;&lt;br /&gt;
    acp24_send (cmd);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== LGAIR Protocol ===&lt;br /&gt;
&lt;br /&gt;
The LG Air Con is controlled by an &#039;intelligent&#039; remote. These are the encoded data:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    Command                 AAAAAAAA  PW  Z  S  T  mmm  tttt  vvvv  PPPP&lt;br /&gt;
    --------------------------------------------------------------------&lt;br /&gt;
    ON 23C                  10001000  00  0  0  0  000  1000  0100  1100&lt;br /&gt;
    ON 26C                  10001000  00  0  0  0  000  1011  0100  1111&lt;br /&gt;
&lt;br /&gt;
    OFF                     10001000  11  0  0  0  000  0000  0101  0001&lt;br /&gt;
    TURN OFF                10001000  11  0  0  0  000  0000  0101  0001  (18C currently, identical to off)&lt;br /&gt;
&lt;br /&gt;
    TEMP DOWN 23C           10001000  00  0  0  1  000  1000  0100  0100&lt;br /&gt;
    MODE (to mode0, 23C)    10001000  00  0  0  1  000  1000  0100  0100&lt;br /&gt;
&lt;br /&gt;
    TEMP UP (24C)           10001000  00  0  0  1  000  1001  0100  0101&lt;br /&gt;
    TEMP DOWN 24C           10001000  00  0  0  1  000  1001  0100  0101&lt;br /&gt;
&lt;br /&gt;
    TEMP UP (25C)           10001000  00  0  0  1  000  1010  0100  0110&lt;br /&gt;
    TEMP DOWN 25C           10001000  00  0  0  1  000  1010  0100  0110&lt;br /&gt;
&lt;br /&gt;
    TEMP UP (26C)           10001000  00  0  0  1  000  1011  0100  0111&lt;br /&gt;
&lt;br /&gt;
    MODE                    10001000  00  0  0  1  011  0111  0100  0110  (to mode1, 22C - when switching to mode1 temp automaticall sets to 22C)&lt;br /&gt;
    ON (mode1, 22C)         10001000  00  0  0  0  011  0111  0100  1110&lt;br /&gt;
&lt;br /&gt;
    MODE                    10001000  00  0  0  1  001  1000  0100  0101  (to mode2, no temperature displayed)&lt;br /&gt;
    ON (mode2)              10001000  00  0  0  0  001  1000  0100  1101&lt;br /&gt;
    MODE (to mode3, 23C)    10001000  00  0  0  1  100  1000  0100  1000&lt;br /&gt;
    ON (mode3, 23C)         10001000  00  0  0  0  100  1000  0100  0000&lt;br /&gt;
&lt;br /&gt;
    VENTILATION SLOW        10001000  00  0  0  1  000  0011  0000  1011&lt;br /&gt;
    VENTILATION MEDIUM      10001000  00  0  0  1  000  0011  0010  1101&lt;br /&gt;
    VENTILATION HIGH        10001000  00  0  0  1  000  0011  0100  1111&lt;br /&gt;
    VENTILATION LIGHT       10001000  00  0  0  1  000  0011  0101  0000&lt;br /&gt;
&lt;br /&gt;
    SWING ON/OFF            10001000  00  0  1  0  000  0000  0000  0001&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    Format:     1 start bit + 8 address bits + 16 data bits + 4 checksum bits + 1 stop bit&lt;br /&gt;
&lt;br /&gt;
    Address:    AAAAAAAA = 0x88 (8 bits)&lt;br /&gt;
&lt;br /&gt;
    Data:       PW Z S T MMM tttt vvvv PPPP (16 bits)&lt;br /&gt;
&lt;br /&gt;
                PW:         Power:     00 = On, 11 = Off&lt;br /&gt;
&lt;br /&gt;
                Z:          N/A:       Always 0&lt;br /&gt;
&lt;br /&gt;
                S:          Swing:     1 = Toggle swing, all other data bits are zeros.&lt;br /&gt;
&lt;br /&gt;
                T:          Temp/Vent: 1 = Set temperature and ventilation&lt;br /&gt;
&lt;br /&gt;
                MMM:        Mode, can be combined with temperature&lt;br /&gt;
                            000=Mode 0&lt;br /&gt;
                            001=Mode 2&lt;br /&gt;
                            010=????&lt;br /&gt;
                            011=Mode 1&lt;br /&gt;
                            100=Mode 3&lt;br /&gt;
                            101=???&lt;br /&gt;
                            111=???&lt;br /&gt;
&lt;br /&gt;
                tttt:       Temperature:&lt;br /&gt;
                            0000=used by OFF command&lt;br /&gt;
                            0001=????&lt;br /&gt;
                            0010=????&lt;br /&gt;
                            0011=18°C&lt;br /&gt;
                            0100=19°C&lt;br /&gt;
                            0101=20°C&lt;br /&gt;
                            0110=21°C&lt;br /&gt;
                            0111=22°C&lt;br /&gt;
                            1000=23°C&lt;br /&gt;
                            1001=24°C&lt;br /&gt;
                            1010=25°C&lt;br /&gt;
                            1011=26°C&lt;br /&gt;
                            1011=27°C&lt;br /&gt;
                            1100=28°C&lt;br /&gt;
                            1101=29°C&lt;br /&gt;
                            1111=30°C&lt;br /&gt;
&lt;br /&gt;
                vvvv:       Ventilation:&lt;br /&gt;
                            0000=slow&lt;br /&gt;
                            0010=medium&lt;br /&gt;
                            0011=????&lt;br /&gt;
                            0100=high&lt;br /&gt;
                            0101=light&lt;br /&gt;
                            0110=????&lt;br /&gt;
                            0111=????&lt;br /&gt;
                            ...&lt;br /&gt;
                            1111=????&lt;br /&gt;
&lt;br /&gt;
    Checksum:   PPPP = (DataNibble1 + DataNibble2 + DataNibble3 + DataNibble4) &amp;amp; 0x0F&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== NEC16 Protocol (JVC) ===&lt;br /&gt;
&lt;br /&gt;
* http://www.sbprojects.net/knowledge/ir/jvc.php&lt;br /&gt;
* http://www.ustr.net/infrared/jvc.shtml&lt;br /&gt;
&lt;br /&gt;
=== Samsung Protocol ===&lt;br /&gt;
&lt;br /&gt;
(was reverse engineered by several protocols (Daewoo or similar), so no direct link to Samsung documents is available)&lt;br /&gt;
&lt;br /&gt;
Here is a link to the Daewoo-protocol, which uses the same principle of the sync-bits in the center of a frame, but words with different timings:&lt;br /&gt;
&lt;br /&gt;
* http://users.telenet.be/davshomepage/daewoo.htm&lt;br /&gt;
&lt;br /&gt;
=== MATSUHITA Protocol ===&lt;br /&gt;
&lt;br /&gt;
* http://www.celadon.com/infrared_protocol/infrared_protocols_samples.pdf&lt;br /&gt;
&lt;br /&gt;
=== KASEIKYO Protocol (&amp;quot;Japan Protocol&amp;quot;) ===&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;
=== RECS80 and RECS80 Extended Protocol ===&lt;br /&gt;
&lt;br /&gt;
* http://www.sbprojects.net/knowledge/ir/recs80.php&lt;br /&gt;
&lt;br /&gt;
=== RC5 and RC5x Protocol ===&lt;br /&gt;
&lt;br /&gt;
* http://www.sbprojects.net/knowledge/ir/rc5.php&lt;br /&gt;
* http://mc.mikrocontroller.com/de/IR-Protokolle.php#RC5&lt;br /&gt;
* http://users.telenet.be/davshomepage/rc5.htm&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;
&lt;br /&gt;
=== Denon Protocol ===&lt;br /&gt;
&lt;br /&gt;
* http://www.mikrocontroller.com/de/IR-Protokolle.php#DENON&lt;br /&gt;
* http://www.manualowl.com/m/Denon/AVR-3803/Manual/170243&lt;br /&gt;
&lt;br /&gt;
=== RC6 and RC6A Protocol ===&lt;br /&gt;
&lt;br /&gt;
* http://www.sbprojects.net/knowledge/ir/rc6.php&lt;br /&gt;
* http://www.picbasic.nl/info_rc6_uk.htm&lt;br /&gt;
&lt;br /&gt;
=== Bang &amp;amp; Olufsen ===&lt;br /&gt;
&lt;br /&gt;
* http://www.mikrocontroller.net/attachment/33137/datalink.pdf&lt;br /&gt;
&lt;br /&gt;
=== Grundig Protocol ===&lt;br /&gt;
&lt;br /&gt;
* http://www.see-solutions.de/sonstiges/Grundig_10bit.pdf&lt;br /&gt;
&lt;br /&gt;
=== Nokia Protocol ===&lt;br /&gt;
&lt;br /&gt;
* http://www.sbprojects.net/knowledge/ir/nrc17.php&lt;br /&gt;
&lt;br /&gt;
=== IR60 (SDA2008 and MC14497P) ===&lt;br /&gt;
&lt;br /&gt;
* http://www.datasheetcatalog.org/datasheet/motorola/MC14497P.pdf&lt;br /&gt;
&lt;br /&gt;
=== LEGO Power Functions RC ===&lt;br /&gt;
&lt;br /&gt;
* http://www.philohome.com/pf/LEGO_Power_Functions_RC_v110.pdf&lt;br /&gt;
&lt;br /&gt;
=== RCMM Protocol ===&lt;br /&gt;
&lt;br /&gt;
* http://www.sbprojects.net/knowledge/ir/rcmm.php&lt;br /&gt;
&lt;br /&gt;
=== Other Protocols ===&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.roboternetz.de/phpBB2/files/entwicklung_und_realisierung_einer_universalinfrarotfernbedienung_mit_timerfunktionen.pdf&lt;br /&gt;
&lt;br /&gt;
== IRMP on Youtube ==&lt;br /&gt;
&lt;br /&gt;
* http://www.youtube.com/watch?v=Q7DJvLIyTEI&lt;br /&gt;
&lt;br /&gt;
* http://www.youtube.com/watch?v=1tQ_aqayWZk&lt;br /&gt;
&lt;br /&gt;
* http://www.youtube.com/watch?v=W4tI2axR3-w&lt;br /&gt;
&lt;br /&gt;
* http://www.youtube.com/watch?v=SRs98dIe2WE&lt;br /&gt;
&lt;br /&gt;
== Other Artikels ==&lt;br /&gt;
&lt;br /&gt;
[http://www.infineon.com/dgdl/RF2ir+WhitePaper+V1.0.pdf?folderId=db3a3043191a246301192dd3ee2c2ae4&amp;amp;fileId=db3a30432b57a660012b5c16272c2e81 Whitepaper von Martin Gotschlich, Infineon Technologies AG]&lt;br /&gt;
&lt;br /&gt;
== Hardware / IRMP Projects ==&lt;br /&gt;
&lt;br /&gt;
=== Remote IRMP ===&lt;br /&gt;
&lt;br /&gt;
Infrared sender und receiver controlled via ip network with Android smartphone as remote control:&lt;br /&gt;
&lt;br /&gt;
 * http://www.mikrocontroller.net/articles/Remote_IRMP&lt;br /&gt;
&lt;br /&gt;
=== IR Tester ===&lt;br /&gt;
&lt;br /&gt;
IR tester with LCD by Klaus Leidinger:&lt;br /&gt;
&lt;br /&gt;
* http://www.mikrocontroller-projekte.de/Mikrocontroller/index.html&lt;br /&gt;
&lt;br /&gt;
=== IR Tester with AVR-NET-IO ===&lt;br /&gt;
&lt;br /&gt;
IR tester for Pollin AVR-NET-IO with Pollin ADD-ON Board:&lt;br /&gt;
&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 ===&lt;br /&gt;
&lt;br /&gt;
USB IR remote receiver by Hugo Portisch:&lt;br /&gt;
* http://www.mikrocontroller.net/articles/USB_IR_Remote_Receiver&lt;br /&gt;
&lt;br /&gt;
=== USB IR Receiver/Sender/Switch with Wakeup-Timer ===&lt;br /&gt;
&lt;br /&gt;
* http://www.vdr-portal.de/board18-vdr-hardware/board13-fernbedienungen/123572-fertig-irmp-auf-stm32-ein-usb-ir-empf%C3%A4nger-sender-einschalter-mit-wakeup-timer/&lt;br /&gt;
&lt;br /&gt;
* http://www.mikrocontroller.net/articles/IRMP_auf_STM32_-_ein_USB_IR_Empf%C3%A4nger/Sender/Einschalter_mit_Wakeup-Timer&lt;br /&gt;
&lt;br /&gt;
=== USBASP ===&lt;br /&gt;
&lt;br /&gt;
IR switch based on USBasp&lt;br /&gt;
* http://wiki.easy-vdr.de/index.php?title=USBASP_Einschalter&lt;br /&gt;
&lt;br /&gt;
=== Servo controlled IR Sender ===&lt;br /&gt;
&lt;br /&gt;
Servo controlled IR Sender (adaptive) by Stefan Pendsa:&lt;br /&gt;
* http://forum.mikrokopter.de/topic-21060.html&lt;br /&gt;
* [http://svn.mikrokopter.de/listing.php?repname=Projects&amp;amp;path=%2FServo-Controlled+IR-Transmitter%2F&amp;amp;#Ad2417800d6aa14bf08c571a896e9def7 SVN]&lt;br /&gt;
&lt;br /&gt;
=== Adaptive IR Remote Control ===&lt;br /&gt;
&lt;br /&gt;
Adaptive IR remote control by Robert and Frank M.&lt;br /&gt;
* http://www.mikrocontroller.net/articles/DIY_Lernfähige_Fernbedienung_mit_IRMP&lt;br /&gt;
&lt;br /&gt;
=== AVR Moodlight ===&lt;br /&gt;
&lt;br /&gt;
AVR Moodlight by Axel Schwenke&lt;br /&gt;
* http://www.mikrocontroller.net/topic/244768&lt;br /&gt;
&lt;br /&gt;
STM8 Moodlight by Axel Schwenke&lt;br /&gt;
* https://www.mikrocontroller.net/topic/380098&lt;br /&gt;
&lt;br /&gt;
=== Infinity Mirror LED Ceiling Lamp ===&lt;br /&gt;
&lt;br /&gt;
Infinity Mirror LED ceiling lamp with remote control by Philipp Meißner&lt;br /&gt;
* http://digital-nw.de/Infinity-Mirror.htm&lt;br /&gt;
&lt;br /&gt;
=== Cinema Control ===&lt;br /&gt;
&lt;br /&gt;
Cinema control by Owagner&lt;br /&gt;
* http://ccc.zerties.org/index.php/Benutzer:Owagner&lt;br /&gt;
&lt;br /&gt;
=== Leading-Edge Control ===&lt;br /&gt;
&lt;br /&gt;
leading-edge control:&lt;br /&gt;
&lt;br /&gt;
* http://flosserver.dyndns.org/phasenanschnittsdimmer.php&lt;br /&gt;
&lt;br /&gt;
=== IRDioder – Ikea Dioder Hack ===&lt;br /&gt;
&lt;br /&gt;
Ikea Dioder Hack:&lt;br /&gt;
&lt;br /&gt;
* http://marco-difeo.de/tag/infrared/&lt;br /&gt;
&lt;br /&gt;
=== Expedit Coffee Bar ===&lt;br /&gt;
&lt;br /&gt;
Ikea Expedit as coffee bar:&lt;br /&gt;
&lt;br /&gt;
* http://chaozlabs.blogspot.de/2013/09/expedit-coffee-bar.html&lt;br /&gt;
&lt;br /&gt;
=== Arduino as IR Receiver ===&lt;br /&gt;
&lt;br /&gt;
Arduino as IR Receiver:&lt;br /&gt;
&lt;br /&gt;
* http://www.vdr-portal.de/board18-vdr-hardware/board13-fernbedienungen/110918-arduino-als-ir-empf%C3%A4nger-einsetzen/&lt;br /&gt;
&lt;br /&gt;
More example from the Arduino library:&lt;br /&gt;
&lt;br /&gt;
* https://github.com/ukw100/IRMP/tree/master/examples&lt;br /&gt;
&lt;br /&gt;
=== IR Volume Control with Stellaris Launchpad ===&lt;br /&gt;
&lt;br /&gt;
volume control with Stellaris Launchpad (ARM Cortex-M4F):&lt;br /&gt;
&lt;br /&gt;
* http://www.anthonyvh.com/2013/03/31/ir-volume-control/&lt;br /&gt;
&lt;br /&gt;
=== RemotePi Board ===&lt;br /&gt;
&lt;br /&gt;
Shutdown RaspPI with IR remote control:&lt;br /&gt;
&lt;br /&gt;
* http://www.msldigital.com/pages/more-information&lt;br /&gt;
&lt;br /&gt;
=== Ethernut &amp;amp; IRMP ===&lt;br /&gt;
&lt;br /&gt;
IRMP under RTOS Ethernut:&lt;br /&gt;
&lt;br /&gt;
* http://www.klkl.de/ethernut.html&lt;br /&gt;
&lt;br /&gt;
=== LED strip Remote Control ===&lt;br /&gt;
&lt;br /&gt;
LED strip remote control:&lt;br /&gt;
&lt;br /&gt;
* http://www.solderlab.de/index.php/misc/led-strip-remote-control&lt;br /&gt;
&lt;br /&gt;
=== ADAT Audio Mixer ===&lt;br /&gt;
&lt;br /&gt;
Audio Mixer:&lt;br /&gt;
&lt;br /&gt;
* http://mailtonne.de/adat-audio-mixer/&lt;br /&gt;
&lt;br /&gt;
=== Ethersex &amp;amp; IRMP ===&lt;br /&gt;
&lt;br /&gt;
IRMP + IRSND Modul in Ethersex, a modular Firmware for AVR MCUs&lt;br /&gt;
&lt;br /&gt;
* http://ethersex.de/index.php/IRMP&lt;br /&gt;
&lt;br /&gt;
=== Mastermind Solver ===&lt;br /&gt;
&lt;br /&gt;
Mastermind solver with LED stripes and IR remote control:&lt;br /&gt;
&lt;br /&gt;
* http://www.mystrobl.de/Plone/basteleien/weitere-bulls-and-cows-mastermind-implementationen/mm-v1821/mastermind-solver-mit-led-streifen-und-ir-fernbedienung&lt;br /&gt;
&lt;br /&gt;
=== A MythTV Remote Control without LIRC ===&lt;br /&gt;
&lt;br /&gt;
PC Remote Control with ATtiny85&lt;br /&gt;
&lt;br /&gt;
* http://tomscircuits.blogspot.de/2014/12/a-mythtv-remote-control-without-lirc.html&lt;br /&gt;
&lt;br /&gt;
=== IRMP + IRSND Library for STM32F4 ===&lt;br /&gt;
&lt;br /&gt;
IRMP for STM32F4&lt;br /&gt;
&lt;br /&gt;
* http://mikrocontroller.bplaced.net/wordpress/?page_id=1516&lt;br /&gt;
&lt;br /&gt;
IRSND for STM32F4&lt;br /&gt;
&lt;br /&gt;
* http://mikrocontroller.bplaced.net/wordpress/?page_id=1940&lt;br /&gt;
&lt;br /&gt;
=== IRMP on STM32 - Construction Guidance ===&lt;br /&gt;
&lt;br /&gt;
* http://www.mikrocontroller.net/articles/IRMP_auf_STM32_-_Bauanleitung&lt;br /&gt;
&lt;br /&gt;
=== Seminar Paper - Extension of Arduino Platform ===&lt;br /&gt;
&lt;br /&gt;
* www.eislab.fim.uni-passau.de/files/publications/2010/StudentDiener_ErweiterungDerArduinoPlattform.pdf&lt;br /&gt;
&lt;br /&gt;
== Acknowledgment ==&lt;br /&gt;
&lt;br /&gt;
I thank Vlad Tepesch, Klaus Leidinger, Peter K., and Dániel Körmendi, who sent me many scan files of their IR remote controls.&lt;br /&gt;
&lt;br /&gt;
I thank Christian F. for his tipps relating to the port to PIC MCUs, gera for the port to PIC-C18 compiler, kichi (Michael K.) for the port to ARM STM32, Markus Schuster for the port to TI&#039;s Stellaris LM4F120 Launchpad (ARM Cortex M4), Matthias Frank for the port to XMega, Wolfgang S. for the port to ESP8266, Achill Hasler for the port to Teensy, Axel Schwenke for the port to STM8.&lt;br /&gt;
&lt;br /&gt;
Thanks to Dániel Körmendi, who added the LG-AIR protocol to [[IRSND_-_english|IRSND]]. Thanks to Ulrich v.d. Kammer for the Pentax protocol extension in [[IRSND_-_english|IRSND]].&lt;br /&gt;
&lt;br /&gt;
At least I will thank Jojo S. for his great job translating this documentation!&lt;br /&gt;
&lt;br /&gt;
== Discussion ==&lt;br /&gt;
&lt;br /&gt;
You can discuss IRMP &amp;amp; IRSND in the German thread [http://www.mikrocontroller.net/topic/162119 Infrared Multi Protocol Decoder].&lt;br /&gt;
&lt;br /&gt;
Have fun with IRMP!&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Infrarot]]&lt;br /&gt;
[[Kategorie:AVR-Projekte]]&lt;/div&gt;</summary>
		<author><name>Tooki</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=IRMP_-_english&amp;diff=106066</id>
		<title>IRMP - english</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=IRMP_-_english&amp;diff=106066"/>
		<updated>2023-04-23T15:38:53Z</updated>

		<summary type="html">&lt;p&gt;Tooki: Überarbeitung der englischen Übersetzung durch erfahrenen Englischmuttersprachler (ehem. tech. Redaktor und -Übersetzer)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;By &#039;&#039;&#039;Frank M. ([http://www.mikrocontroller.net/user/show/ukw ukw])&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;This is the English translation of the [[IRMP#top|German IRMP documentation]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[[Datei:irmp-title.png| |Waveform of an NEC-format remote control signal]]&lt;br /&gt;
&lt;br /&gt;
Project Intent:&lt;br /&gt;
&lt;br /&gt;
Because RC5 is not only outdated, but obsolete, and because more and more electronic devices from Asian consumer electronics manufacturers are found in the home, it is time to develop an IR decoder that can &#039;understand&#039; about 90% of IR remotes that are used in our daily life.&lt;br /&gt;
&lt;br /&gt;
This article introduces &#039;IRMP&#039; as &amp;quot;Infrared Multi Protocol Decoder&amp;quot; in detail. The counterpart, the [[IRSND_-_english|IRSND]] IR encoder, can be found in this [[IRSND_-_english|document]].&lt;br /&gt;
&lt;br /&gt;
= IRMP - Infrared Multi Protocol Decoder =&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width: 80%;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 20%;&amp;quot; |&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
=== Supported MCUs ===&lt;br /&gt;
&lt;br /&gt;
[[IRMP_-_english#top|IRMP]] runs on numerous MCU families:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AVR&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* ATtiny87,  ATtiny167&lt;br /&gt;
* ATtiny45,  ATtiny85&lt;br /&gt;
* ATtiny44,  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;
&#039;&#039;&#039;XMega&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* ATXmega128&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC&#039;&#039;&#039; (CCS- and XC8/C18 compiler)&lt;br /&gt;
&lt;br /&gt;
* PIC12F1840&lt;br /&gt;
* PIC18F4520&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;STM32&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* STM32F4xx (tested on STM32F401RE/F411RE Nucleo, STM32F4 Discovery)&lt;br /&gt;
* STM32F10x (tested on STM32F103C8T6 Mini Development Board)&lt;br /&gt;
* STM32 with HAL library &#039;&#039;&#039;(NEW!)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;STM8&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* STM8S103F3&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TI Stellaris&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* LM4F120 Launchpad (ARM Cortex M4)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ESP8266 (NEW!)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* ESP8266-EVB&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TEENSY 3.0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* MK20DX256VLH7 (ARM Cortex-M4 72MHz)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MBED (NEW!)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* LPC1347 Cortex-M3 72 MHz&lt;br /&gt;
* LPC4088 (Embedded Artists)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ChibiOS HAL (NEW!)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Various ARM Cortex MCUss, for example STM32, Kinetis, and NRF5&lt;br /&gt;
* [https://sourceforge.net/p/chibios/svn2/HEAD/tree/trunk/os/hal/ports/ Officially supported MCU series]&lt;br /&gt;
* [https://github.com/ChibiOS/ChibiOS-Contrib/tree/master/os/hal/ports More MCU series, community supported]&lt;br /&gt;
||&lt;br /&gt;
[[Datei:irmp-empfaenger.png|miniatur|Connection of a IR receiver module to MCU]]&lt;br /&gt;
|}&lt;br /&gt;
=== Supported IR Protocols ===&lt;br /&gt;
&lt;br /&gt;
[[IRMP_-_english#top|IRMP]] - the infrared remote decoder, which can decode several protocols at once - is capable of decoding the following protocols (in alphabetical order):&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|+ &#039;&#039;&#039;Supported Protocols&#039;&#039;&#039;&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! style=&amp;quot;width:15%&amp;quot; | Protocol || Vendor&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#A1TVBOX|A1TVBOX]] || ADB (Advanced Digital Broadcast), e.g. A1 TV Box&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#APPLE|APPLE]] || Apple&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#ACP24|ACP24]] || Stiebel Eltron&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#B&amp;amp;O|B&amp;amp;O]] || Bang &amp;amp; Olufsen&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#BOSE|BOSE]] || Bose&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#DENON|DENON]] || Denon, Sharp&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#FAN|FAN]] || FAN, remote for fans&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#FDC|FDC]] || FDC Keyboard&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#GRUNDIG_+_NOKIA|GRUNDIG]] || Grundig&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#GRUNDIG_+_NOKIA|NOKIA]] || Nokia, e.g. D-Box&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#IR60 (SDA2008)|IR60 (SDA2008)]] || various European vendors&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#JVC|JVC]] || JVC&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#KASEIKYO|KASEIKYO]] || Panasonic, Technics, Denon and other vendors which are members of the Japanese &amp;quot;Association for Electric Home Appliances&amp;quot; (AEHA).&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#KATHREIN|KATHREIN]]  || KATHREIN&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#LEGO|LEGO]]   || Lego&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#LGAIR|LGAIR]]   || LG air conditioners&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#MATSUSHITA|MATSUSHITA]] || Matsushita&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#MITSU_HEAVY|MITSU_HEAVY]] || Mitsubishi air conditioners&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#NEC16|NEC16]]  || JVC, Daewoo&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#NEC42|NEC42]]  || JVC&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#MERLIN|MERLIN]]  || MERLIN remote (Pollin article number: 620 185)&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#NEC_+_extended_NEC|NEC]] || NEC, Yamaha, Canon, Tevion, Harman/Kardon, Hitachi, JVC, Pioneer, Toshiba, Xoro, Orion, generic and many other Asian vendors.&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#NETBOX|NETBOX]]  || Netbox&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#Nikon|Nikon]] || Nikon&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#NUBERT|NUBERT]] || Nubert, e.g. Subwoofer Systems&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#ORTEK|ORTEK]] || Ortek, Hama&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#PANASONIC|PANASONIC]] || PANASONIC video projectors&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#PENTAX|PENTAX]] || PENTAX&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#RC5_+_RC5X|RC5]] || Philips and other European vendors&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#RC6_+_RC6A|RC6A]] || Philips, Kathrein and others, e.g. XBOX&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#RC6_+_RC6A|RC6]] || Philips and other European vendors&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#RCCAR|RCCAR]] || RC Car: IR remote for RC toys &lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#RCII|RCII]] || T+A &#039;&#039;&#039;(NEW!)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#RECS80|RECS80]] || Philips, Nokia, Thomson, Nordmende, Telefunken, Saba&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#RECS80EXT|RECS80EXT]] || Philips, Technisat, Thomson, Nordmende, Telefunken, Saba&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#RCMM|RCMM]] || Fujitsu-Siemens e.g. Activy keyboard&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#ROOMBA|ROOMBA]] || iRobot Roomba vacuum cleaner&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#S100|S100]] || similar to RC5, but 14 instead of 13 bits and 56kHz modulation. Vendor unknown.&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#SAMSUNG32|SAMSUNG32]] || Samsung&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#SAMSUNG48|SAMSUNG48]] || various air conditioners&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#SAMSUNG|SAMSUNG]] || Samsung&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#SIEMENS_+_RUWIDO|RUWIDO]] || RUWIDO (e.g. T-Home Media Receiver, MERLIN keyboard(Pollin))&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#SIEMENS_+_RUWIDO|SIEMENS]] || Siemens, e.g. Gigaset M740AV&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#SIRCS|SIRCS]] || Sony&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#SPEAKER|SPEAKER]] || Speaker systems like X-Tensions&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#TECHNICS|TECHNICS]] || Technics&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#TELEFUNKEN|TELEFUNKEN]] || Telefunken&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#THOMSON|THOMSON]] || Thomson&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#VINCENT|VINCENT]] || Vincent&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#FF0000&amp;quot;&amp;gt;&#039;&#039;&#039;New:&#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Starting with version 3.2, IRMP can also decode 433 MHz RF radio protocols.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|+ &#039;&#039;&#039;Supported RF Protocols&#039;&#039;&#039;&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! style=&amp;quot;width:15%&amp;quot; | Protocol&lt;br /&gt;
! style=&amp;quot;width:100em&amp;quot; | Vendor&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP#RF_GEN24|RF_GEN24]] || Generiv 24-bit format, e.g. Pollin 550666 radio-controlled receptacle&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP#RF_X10|RF_X10]] || X10 PC RF remote control (Medion), Pollin 721815&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Each of these protocols can be activated separately. If you want, you can activate all protocols. If you need only one protocol, you can disable all others. Only the code selected by the user will be compiled .&lt;br /&gt;
&lt;br /&gt;
=== History ===&lt;br /&gt;
&lt;br /&gt;
The [[IRMP_-_english#top|IRMP]] source for the AVR and PIC MCUs was created as part of the [[Word Clock]] project.&lt;br /&gt;
&lt;br /&gt;
=== Thread in Forum ===&lt;br /&gt;
&lt;br /&gt;
Intention for an own IRMP article is the following thread in Projects&amp;amp;Code [http://www.mikrocontroller.net/topic/162119 IRMP - Infrared Multi Protocol Decoder] (in German language).&lt;br /&gt;
&lt;br /&gt;
== IR Protocols ==&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width: 80%;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 20%;&amp;quot; |&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
Some vendors use their own proprietary protocols, such as Sony, Samsung, and Matsushita. Philips developed and used [[IRMP_-_english#RC5 + RC5X|RC5]].&lt;br /&gt;
[[IRMP_-_english#RC5 + RC5X|RC5]] was seen in Europe as &#039;&#039;the&#039;&#039; standard IR protocol which was adopted by many European vendors. Nowadays [[IRMP_-_english#RC5 + RC5X|RC5]] is practically not used and can be considered &amp;quot;dead&amp;quot;. Although the successor [[IRMP_-_english#RC6_+_RC6A|RC6]] is used in current European hardware, it is also used rarely.&lt;br /&gt;
&lt;br /&gt;
Japanese vendors also tried to establish their own standard, the so called [[IRMP_-_english#KASEIKYO|Kaseikyo]] (or &amp;quot;Japan&amp;quot;) protocol. With a word length of 48 bits, it is more versatile. But it has not found wide use, though it is found in some appliances.&lt;br /&gt;
&lt;br /&gt;
Nowadays the [[IRMP_-_english#NEC_+_extended_NEC|NEC]] protocol is used (also mainly in Japanese devices) in both premium and generic products. I estimate the market share at 80% for the [[IRMP_-_english#NEC_+_extended_NEC|NEC]] protocol. Nearly all remotes in my daily use utilize the [[IRMP_-_english#NEC_+_extended_NEC|NEC]] IR code. This starts with the TV set, continues with the DVD player and the notebook remote all the way to the generic multimedia hard drive, just to mention a few examples.&lt;br /&gt;
||&lt;br /&gt;
[[Datei:nec-protocol.png|miniatur|NEC protocol, RGB remote control, T-&amp;gt;A: 9.14ms, A-&amp;gt;B: 4.42ms, B-&amp;gt;C: 660us]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Coding methods ==&lt;br /&gt;
&lt;br /&gt;
[[IRMP_-_english#top|IRMP]] supports the following IR coding methods:&lt;br /&gt;
&lt;br /&gt;
* [[IRMP_-_english#Pulse Distance|Pulse Distance]], typ. Example: [[IRMP_-_english#NEC_+_extended_NEC|NEC]]&lt;br /&gt;
* [[IRMP_-_english#Pulse Width|Pulse Width]], typ. Example: [[IRMP_-_english#SIRCS|Sony SIRCS]]&lt;br /&gt;
* [[IRMP_-_english#Biphase|Biphase (Manchester)]], typ. Example: Philips [[IRMP_-_english#RC5_+_RC5X|RC5]], [[IRMP_-_english#RC6_+_RC6A|RC6]]&lt;br /&gt;
* [[IRMP_-_english#Pulse Position|Pulse Position (NRZ)]], typ. Example: [[IRMP_-_english#NETBOX|Netbox]]&lt;br /&gt;
* [[IRMP_-_english#Pulse Distance Width|Pulse Distance Width]], typ. Example: [[IRMP_-_english#NUBERT|Nubert]]&lt;br /&gt;
&lt;br /&gt;
The pulses are modulated - usually at 36 kHz or 38 kHz - to reduce environmental influences such as indoor lighting or sunlight.&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width: 80%;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 20%;&amp;quot; |&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
=== Pulse Distance ===&lt;br /&gt;
&lt;br /&gt;
Pulse distance coding can be identified by the following rule:&lt;br /&gt;
&lt;br /&gt;
* there is only &#039;&#039;&#039;one pulse length&#039;&#039;&#039; and there are &#039;&#039;&#039;two different space lengths&#039;&#039;&#039;&lt;br /&gt;
||&lt;br /&gt;
[[Datei:Pulse-Distance.png|miniatur|Pulse distance coding]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width: 80%;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 20%;&amp;quot; |&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
=== Pulse Width ===&lt;br /&gt;
&lt;br /&gt;
Pulse width coding can be identified by the following rule: &lt;br /&gt;
&lt;br /&gt;
* there are &#039;&#039;&#039;two different pulse lengths&#039;&#039;&#039; and &#039;&#039;&#039;only one space length&#039;&#039;&#039;&lt;br /&gt;
||&lt;br /&gt;
[[Datei:Pulse-Width.png|miniatur|Pulse width coding]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width: 80%;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 20%;&amp;quot; |&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
=== Pulse Distance Width ===&lt;br /&gt;
&lt;br /&gt;
This is a mix of pulse distance and pulse width coding. Often the sum of pulse and space length is constant. The rule is:&lt;br /&gt;
&lt;br /&gt;
* there are &#039;&#039;&#039;two different pulse lengths&#039;&#039;&#039; and &#039;&#039;&#039;two different space lengths.&#039;&#039;&#039;&lt;br /&gt;
||&lt;br /&gt;
[[Datei:Pulse-Distance-Width.png|miniatur|Pulse distance width coding]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width: 80%;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 20%;&amp;quot; |&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
=== Biphase ===&lt;br /&gt;
&lt;br /&gt;
In biphase coding the order of pulse and space gives the bit value.&lt;br /&gt;
Therefore a biphase boding can be identified by this criteria:&lt;br /&gt;
&lt;br /&gt;
* there is exactly &#039;&#039;&#039;one&#039;&#039;&#039; pulse and space length, as well as the &#039;&#039;&#039;double&#039;&#039;&#039; pulse/space length&lt;br /&gt;
&lt;br /&gt;
Usually the length for the pulse and space are equal, meaning that the signal shape is symmetric. But IRMP also recognizes protocols which use different pulse and space lengths, for example the [[IRMP_-_english#A1TVBOX|A1TVBOX]] protocol.&lt;br /&gt;
||&lt;br /&gt;
[[Datei:Biphase-Coding.png|miniatur|Biphase coding]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width: 80%;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 20%;&amp;quot; |&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
=== Pulse Position ===&lt;br /&gt;
&lt;br /&gt;
Pulse position coding is known from commmon UARTs. Here, every bit has a fixed length. Depending on the value (0 or 1), it is a pulse or a space.&lt;br /&gt;
&lt;br /&gt;
Typical criteria for a &#039;&#039;&#039;pulse position protocol&#039;&#039;&#039; are:&lt;br /&gt;
* there are &#039;&#039;&#039;multiples&#039;&#039;&#039; of a basic pulse/space length&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A tabular listing of different IR protocols can be found here: [[IRMP_-_english#IR_Protocols_in_Detail|IR Protocols in Detail]].&#039;&#039;&#039;&lt;br /&gt;
The specified timings are typical values. In some remotes they differ up to 40% in real life. Therefore [[IRMP_-_english#top|IRMP]] uses minimum/maximum limits to be tolerant with the timing.&lt;br /&gt;
||&lt;br /&gt;
[[Datei:Pulse-Position.png|miniatur|Pulse position coding]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Protocol Detection ==&lt;br /&gt;
&lt;br /&gt;
Most of the protocols [[IRMP_-_english#top|IRMP]] decodes have something in common: they exhibit a start bit whose timing is unique.&lt;br /&gt;
&lt;br /&gt;
According to this start bit timing, most protocols can be identified. [[IRMP_-_english#top|IRMP]] measures the timing of the start bit and adjusts its timing tables &amp;quot;on-the-fly&amp;quot; to the discovered protocol. Subsequent bits can then be read sequentially without the need to first store a complete frame.&lt;br /&gt;
Thus, [[IRMP_-_english#top|IRMP]] does not wait to read a complete frame but starts decoding directly after detecting the first pulse.&lt;br /&gt;
&lt;br /&gt;
If the start bit is not unique, [[IRMP_-_english#top|IRMP]] proceeds in parallel with multiple possible protocols. For example with two candidate protocols, once plausible reasons disqualify one protocol, the other protocol is used.&lt;br /&gt;
&lt;br /&gt;
Detection is implemented as an interrupt-driven [[Statemachine|state machine]] which is called at a frequency of typically 15000 times per second. Among others, the [[Statemachine|state machine]] has the following states:&lt;br /&gt;
&lt;br /&gt;
* detect the first pulse length of the start bit&lt;br /&gt;
* detect the space length of the start bit&lt;br /&gt;
* detect the space length of the first data bit&lt;br /&gt;
&lt;br /&gt;
After that, the pulse and space lengths of the start bit are known. Now all enabled protocols are searched for these lengths. If a protocol matches, the timing table for this protocol is loaded. Subsequent bits are checked against the timing table to ensure they conform to it.&lt;br /&gt;
&lt;br /&gt;
The [[Statemachine|state machine]] continues with the following states:&lt;br /&gt;
&lt;br /&gt;
* detect the spaces of the data bits&lt;br /&gt;
* detect the pulse length of the data bits&lt;br /&gt;
* check timing. If different, switch back to another valid IR protocol, otherwise return&lt;br /&gt;
* detect the stop bit, if present in the protocol&lt;br /&gt;
* check data for plausibility, like CRC or other redundancy bits&lt;br /&gt;
* convert data to device address and command&lt;br /&gt;
* detect code repetition by long key press, set corresponding flag&lt;br /&gt;
&lt;br /&gt;
Indeed the [[Statemachine|state machine]] is even more complex because some protocols have no start bit (e.g. [[IRMP_-_english#DENON|Denon]]) or have multiple start bits (4 in [[IRMP_-_english#B.26O|B&amp;amp;O]]) or have another sync bit within the frame (e.g. [[IRMP_-_english#SAMSUNG|Samsung]]). These extra conditions are caught in the code by protocol-specific &amp;quot;special cases&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Switching to an other protocol can happen multiple times while receiving a frame, e.g. from [[IRMP_-_english#NEC42|NEC42]] (42 bits) to [[IRMP_-_english#NEC16|NEC16]] (8 bits + sync bit + 8 bits), if a premature sync bit is detected. Or from [[IRMP_-_english#NEC + extended NEC|NEC]]/[[IRMP_-_english#NEC42|NEC42]] (32/42 bits) to [[IRMP_-_english#JVC|JVC]] (16 bits) if the stop bit occurs prematurely. It becomes difficult when, after detecting the start bit, two possible protocols use different coding methods, e.g. when the one protocol uses [[IRMP_-_english#Pulse Distance|pulse distance coding]] and the other uses [[IRMP_-_english#Biphase|biphase coding (Manchester)]]. In this case [[IRMP_-_english#top|IRMP]] stores the necessary bits for both coding methods and later discards one or the other.&lt;br /&gt;
&lt;br /&gt;
Furthermore, some remotes using particular protocols transmit repeat frames, either for redundancy (error detection) or for long key presses. Both kinds are detected by IRMP: error detection frames are detected by IRMP, but not passed to the application. Others are detected as long key presses and flagged by IRMP.&lt;br /&gt;
&lt;br /&gt;
== Download ==&lt;br /&gt;
&lt;br /&gt;
Version 3.2.6, Date: 2021-01-27&lt;br /&gt;
&lt;br /&gt;
Download stable version: [http://www.mikrocontroller.net/wikifiles/7/79/Irmp.zip Irmp.zip] &lt;br /&gt;
&lt;br /&gt;
Current development version of [[IRMP_-_english#top|IRMP]] &amp;amp; [[IRSND_-_english|IRSND]]:&lt;br /&gt;
&lt;br /&gt;
* SVN link: [svn://mikrocontroller.net/irmp/ SVN]&lt;br /&gt;
* SVN browser: [http://www.mikrocontroller.net/svnbrowser/irmp/ IRMP in SVN]&lt;br /&gt;
* Download tarball: [http://www.mikrocontroller.net/svnbrowser/irmp/?view=tar Tarball].&lt;br /&gt;
&lt;br /&gt;
Download Arduino library: [https://github.com/ukw100/IRMP GitHub] or use Arduino &amp;quot;&#039;&#039;Tools / Manage Libraries...&#039;&#039;&amp;quot; and search for IRMP.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;You can see the history of the software changes here: [[IRMP_-_english#Software_History|Software History]]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== License ==&lt;br /&gt;
&lt;br /&gt;
IRMP is Open Source Software and is released under the [https://www.gnu.org/licenses/old-licenses/gpl-2.0.html GPL v2], or&lt;br /&gt;
(at your option) any later version.&lt;br /&gt;
&lt;br /&gt;
== Source Code ==&lt;br /&gt;
&lt;br /&gt;
The source code can be easily compiled for AVR MCUs by loading the project file irmp.aps in AVR Studio 4.&lt;br /&gt;
&lt;br /&gt;
For other development environments it is simple to create a project or makefile. The source includes:&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmp.c?view=markup irmp.c] - IR decoder core&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmpprotocols.h?view=markup irmpprotocols.h] - all protocoll definitions&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmpsystem.h?view=markup irmpsystem.h] - target-independent definitions for AVR/PIC/STM32&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmp.h?view=markup irmp.h] - include file for the application&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmpconfig.h?view=markup irmpconfig.h] - user configuration&lt;br /&gt;
&lt;br /&gt;
Sample applications (main functions and timer configurations):&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-avr.c?view=markup irmp-main-avr.c] - AVR&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-avr-uart.c?view=markup irmp-main-avr-uart.c] - AVR with UART output&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-pic-xc8.c?view=markup irmp-main-pic-xc8.c] - PIC18F4520&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-pic-12F1840.c?view=markup irmp-main-pic-12F1840.c] - PIC12F1840&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-stm32.c?view=markup irmp-main-stm32.c] - STM32&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-stellaris-arm.c?view=markup irmp-main-stellaris-arm.c] - TI Stellaris LM4F120 Launchpad&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-esp8266.c?view=markup irmp-main-esp8266.c] - ESP8266&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-mbed.cpp?view=markup irmp-main-mbed.cpp] - MBED&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/examples/Arduino/Arduino.ino?view=markup examples/Arduino/Arduino.ino] - Teensy 3.x&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-chibios.c?view=markup irmp-main-chibios.c] - ChibiOS&lt;br /&gt;
&lt;br /&gt;
{{Warnung|&lt;br /&gt;
;Important: include only irmp.h in your application:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;irmp.h&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
All other include files are included within irmp.h. See also the sample application irmp-main-avr.c.&lt;br /&gt;
&lt;br /&gt;
Furthermore, the preprocessor constant &#039;&#039;&#039;F_CPU in project or makefile&#039;&#039;&#039; must be defined. This should have at least the value of 8000000UL, processor speed should be at least 8 MHz. This applies to AVR targets and not for MCUs with PLL. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[IRMP_-_english#top|IRMP]] also runs on PIC processors. For the PIC-CCS compiler the necessary preprocessor defines are already set, such that [http://www.mikrocontroller.net/svnbrowser/irmp/irmp.c?view=markup irmp.c] can be directly used in the CCS environment. Only a short interrupt service routine like &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
must be added. The interrupt period time must be set to 66 µs (15 kHz).&lt;br /&gt;
&lt;br /&gt;
For AVR processors you will find an example for the usage of [[IRMP_-_english#top|IRMP]] in [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-avr.c?view=markup irmp-main-avr.c]. The main things are the [[AVR-GCC-Tutorial/Die_Timer_und_Zähler_des_AVR|Timer]] initializing of the timer and the processing of received IR commands. The received protocoll, the device address and the command will be output on the HW-UART.&lt;br /&gt;
&lt;br /&gt;
For the Stellaris LM4F120 Launchpad from TI (ARM Cortex M4) is a propriate timer init function already integrated in [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-avr.c?view=markup irmp-main-avr.c].&lt;br /&gt;
&lt;br /&gt;
[[IRMP_-_english#top|IRMP]] can be used also with STM32 microcontrollers.&lt;br /&gt;
&lt;br /&gt;
Another new implementation is available on the mbed platform.&lt;br /&gt;
&lt;br /&gt;
=== avr-gcc Optimizations ===&lt;br /&gt;
&lt;br /&gt;
From version 4.7.x of avr-gcc, the [https://gcc.gnu.org/onlinedocs/gccint/LTO.html#LTO LTO option] can be used to make the call of the external function irmp_ISR() from the main ISR more efficient. This improves the performance of the ISR a little.&lt;br /&gt;
&lt;br /&gt;
Add the following compiler and linker options:&lt;br /&gt;
&lt;br /&gt;
* additional compiler option: -flto&lt;br /&gt;
* additional linker options: -flto -Os&lt;br /&gt;
&lt;br /&gt;
If you forget the additional linker option -Os, the binary will be significantly larger as it will not be optimized further. Also, the option -flto must be passed to the linker, otherwise link time optimization will not work.&lt;br /&gt;
&lt;br /&gt;
=== Configuration ===&lt;br /&gt;
&lt;br /&gt;
[[IRMP_-_english#top|IRMP]] is configured by parameters in  [http://www.mikrocontroller.net/svnbrowser/irmp/irmpconfig.h?view=markup irmpconfig.h]:&lt;br /&gt;
&lt;br /&gt;
* [[IRMP_-_english#F_INTERRUPTS|number of interrupts per second]]&lt;br /&gt;
* [[IRMP_-_english#IRMP_SUPPORT_xxx_PROTOCOL|supported IR protocols]]&lt;br /&gt;
* [[IRMP_-_english#IRMP_PORT_LETTER + IRMP_BIT_NUMBER|hardware pin for IR receiver]]&lt;br /&gt;
* [[IRMP_-_english#IRMP_LOGGING|IR logging]]&lt;br /&gt;
&lt;br /&gt;
=== Settings in irmpconfig.h ===&lt;br /&gt;
&lt;br /&gt;
[[IRMP_-_english#top|IRMP]] will decode all protocols listed above in one ISR. For this, some settings are needed. These are set in [http://www.mikrocontroller.net/svnbrowser/irmp/irmpconfig.h?view=markup irmpconfig.h].&lt;br /&gt;
&lt;br /&gt;
==== F_INTERRUPTS ====&lt;br /&gt;
&lt;br /&gt;
Number of interrupts per second. Should be set to a value from 10000 to 20000. The higher the value, the better the resolution and therefore the quality of detection. But a higher interrupt rate means also higher CPU load. A value of 15000 is usually a good compromise.&lt;br /&gt;
&lt;br /&gt;
Default value:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
#define F_INTERRUPTS                            15000      // interrupts per second&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On AVR controllers, the [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-avr.c?view=markup irmp-main-avr.c] example uses Timer1 with 16 bits of resolution. If for any reasons Timer1 is not available, you can also use Timer2 with 8 bits of resolution.&lt;br /&gt;
&lt;br /&gt;
In that case, configure Timer2 as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
OCR2   =  (uint8_t) ((F_CPU / F_INTERRUPTS) / 8) - 1 + 0.5);   // Compare Register OCR2&lt;br /&gt;
TCCR2  = (1 &amp;lt;&amp;lt; WGM21) | (1 &amp;lt;&amp;lt; CS21);                           // CTC Mode, prescaler = 8&lt;br /&gt;
TIMSK  = 1 &amp;lt;&amp;lt; OCIE2;                                           // enable Timer2 interrupt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The above example is valid for ATmega88/ATmega168/ATmega328. For other AVR MCUs check the datasheet.&lt;br /&gt;
&lt;br /&gt;
You must not forget to change the ISR to Timer2 as well:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
ISR(TIMER2_COMP_vect)&lt;br /&gt;
{&lt;br /&gt;
  (void) irmp_ISR(); &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== IRMP_SUPPORT_xxx_PROTOCOL ====&lt;br /&gt;
&lt;br /&gt;
Here you can select which protocols to enable in [[IRMP_-_english#top|IRMP]]. Common protocols are emabled by default.&lt;br /&gt;
&lt;br /&gt;
To enable additional protocols or disable others to save memory, set the corresponding values in [http://www.mikrocontroller.net/svnbrowser/irmp/irmpconfig.h?view=markup irmpconfig.h].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&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;
&lt;br /&gt;
// more protocols, enable here!                 Enable  Remarks                 F_INTERRUPTS            Program Space&lt;br /&gt;
#define IRMP_SUPPORT_DENON_PROTOCOL             0       // DENON, Sharp         &amp;gt;= 10000                 ~250 bytes&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 (SDA2008)       &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_BOSE_PROTOCOL              0       // BOSE                 &amp;gt;= 10000                 ~150 bytes&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_ORTEK_PROTOCOL             0       // ORTEK (Hama)         &amp;gt;= 10000                 ~150 bytes&lt;br /&gt;
#define IRMP_SUPPORT_TELEFUNKEN_PROTOCOL        0       // Telefunken 1560      &amp;gt;= 10000                 ~150 bytes&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_ROOMBA_PROTOCOL            0       // iRobot Roomba        &amp;gt;= 10000                 ~150 bytes&lt;br /&gt;
#define IRMP_SUPPORT_RUWIDO_PROTOCOL            0       // RUWIDO, T-Home       &amp;gt;= 15000                 ~550 bytes&lt;br /&gt;
#define IRMP_SUPPORT_A1TVBOX_PROTOCOL           0       // A1 TV BOX            &amp;gt;= 15000 (better 20000)  ~300 bytes&lt;br /&gt;
#define IRMP_SUPPORT_LEGO_PROTOCOL              0       // LEGO Power RC        &amp;gt;= 20000                 ~150 bytes&lt;br /&gt;
#define IRMP_SUPPORT_RCMM_PROTOCOL              0       // RCMM 12, 24, or 32    &amp;gt;= 20000                 ~150 bytes&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each [[IRMP_-_english#top|IRMP]] supported IR protocol consumes the noted amount of code. Here you can apply optimizations: for example, the modulation frequency of 455 kHz for the [[IRMP_-_english#B&amp;amp;O|B&amp;amp;O]] protocol is far away from the frequencies that are used by other protocols. This usually requires a different IR receiver, so without that, you can disable these protocols. For example, you cannot receive the [[IRMP_-_english#B&amp;amp;O|B&amp;amp;O]] protocol (455kHz) with a TSOP1738/TSOP31238.&lt;br /&gt;
&lt;br /&gt;
Additionally, the [[IRMP_-_english#SIEMENS_+_RUWIDO|SIEMENS]]/[[IRMP_-_english#FDC|FDC]]/[[IRMP_-_english#RCCAR|RCCAR]] can only be detected reliably at a frequency of 15 kHz or higher. For [[IRMP_-_english#LEGO|LEGO]], 20 kHz is needed. To use these protocols, you must modify [[IRMP_-_english#F_INTERRUPTS|F_INTERRUPTS]]. Otherwise, during compilation you will get a warning and the corresponding protocols will automatically be disabled.&lt;br /&gt;
&lt;br /&gt;
==== IRMP_PORT_LETTER + IRMP_BIT_NUMBER ====&lt;br /&gt;
&lt;br /&gt;
This constant defines the pin where the IR receiver is connected.&lt;br /&gt;
&lt;br /&gt;
Default value is PORT B6:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
/*---------------------------------------------------------------------------&lt;br /&gt;
 * Change hardware pin here for ATMEL AVR&lt;br /&gt;
 *---------------------------------------------------------------------------&lt;br /&gt;
 */&lt;br /&gt;
#if defined (ATMEL_AVR)                         // use PB6 as IR input on AVR&lt;br /&gt;
#  define IRMP_PORT_LETTER                      B&lt;br /&gt;
#  define IRMP_BIT_NUMBER                       6&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These two values must match your hardware configuration.&lt;br /&gt;
&lt;br /&gt;
This applies also to STM32 MCUs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
/*----------------------------------------------------------------------------&lt;br /&gt;
 * Change hardware pin here for ARM STM32&lt;br /&gt;
 *----------------------------------------------------------------------------&lt;br /&gt;
 */&lt;br /&gt;
#elif defined (ARM_STM32)                       // use C13 as IR input on STM32&lt;br /&gt;
#  define IRMP_PORT_LETTER                      C&lt;br /&gt;
#  define IRMP_BIT_NUMBER                       13&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When using STM32 HAL library, define the constants IRSND_Transmit_GPIO_Port and IRSND_Transmit_Pin in STM32Cube (Main.h). In this case, it is not necessary to change the constants in irmpconfig.h:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
/*---------------------------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
 * ARM STM32 with HAL section - don&#039;t change here, define IRSND_Transmit_GPIO_Port &amp;amp; IRSND_Transmit_Pin in STM32Cube (Main.h)&lt;br /&gt;
 *---------------------------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
 */&lt;br /&gt;
#elif defined (ARM_STM32_HAL)                                           // IRSND_Transmit_GPIO_Port &amp;amp; IRSND_Transmit_Pin must be defined in STM32Cube&lt;br /&gt;
#  define IRSND_PORT_LETTER                     IRSND_Transmit_GPIO_Port//Port of Transmit PWM Pin e.g.&lt;br /&gt;
#  define IRSND_BIT_NUMBER                      IRSND_Transmit_Pin      //Pim of Transmit PWM Pin e.g.&lt;br /&gt;
#  define IRSND_TIMER_HANDLER                   htim2                   //Handler of Timer e.g. htim (see tim.h)&lt;br /&gt;
#  define IRSND_TIMER_CHANNEL_NUMBER            TIM_CHANNEL_2           //Channel of the used Timer PWM Pin e.g. TIM_CHANNEL_2&lt;br /&gt;
#  define IRSND_TIMER_SPEED_APBX                64000000                //Speed of the corresponding APBx. (see STM32CubeMX: Clock Configuration)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And the corresponding section for STM8 MCUs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
/*----------------------------------------------------------------------------&lt;br /&gt;
 * Change hardware pin here for STM8&lt;br /&gt;
 *----------------------------------------------------------------------------&lt;br /&gt;
 */&lt;br /&gt;
#elif defined (SDCC_STM8)                       // use PA1 as IR input on STM8&lt;br /&gt;
#  define IRMP_PORT_LETTER                      A&lt;br /&gt;
#  define IRMP_BIT_NUMBER                       1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For PIC microcontrollers only the constant &#039;&#039;&#039;IRMP_PIN&#039;&#039;&#039; needs to be changed - depending on the compiler:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
/*----------------------------------------------------------------------------&lt;br /&gt;
 * Change hardware pin here for PIC C18 compiler&lt;br /&gt;
 *----------------------------------------------------------------------------&lt;br /&gt;
 */&lt;br /&gt;
#elif defined (PIC_C18)                         // use RB4 as IR input on PIC&lt;br /&gt;
#  define IRMP_PIN                              PORTBbits.RB4&lt;br /&gt;
&lt;br /&gt;
/*----------------------------------------------------------------------------&lt;br /&gt;
 * Change hardware pin here for PIC CCS compiler&lt;br /&gt;
 *----------------------------------------------------------------------------&lt;br /&gt;
 */&lt;br /&gt;
#elif defined (PIC_CCS)                         // use PB4 as IR input on PIC&lt;br /&gt;
#  define IRMP_PIN                              PIN_B4&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When using ChibiOS HAL, define a pin with the name &#039;&#039;&#039;IR_IN&#039;&#039;&#039; in your board config (board.chcfg) of ChibiOS and regenerate the board files. To use another name for the pin, edit the constant &#039;&#039;&#039;IRMP_PIN&#039;&#039;&#039; in irmpconfig.h. Use the name of the pin from the board config and prefix it with &amp;quot;LINE_&amp;quot;, as IRMP is using the &amp;quot;line&amp;quot; variant of the PAL interface:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
/*---------------------------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
 * Change hardware pin here for ChibiOS HAL&lt;br /&gt;
 *---------------------------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
 */&lt;br /&gt;
#elif defined(_CHIBIOS_HAL_)&lt;br /&gt;
#  define IRMP_PIN                              LINE_IR_IN              // use pin names as defined in the board config file, prefixed with &amp;quot;LINE_&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== IRMP_HIGH_ACTIVE ====&lt;br /&gt;
&lt;br /&gt;
Default value:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
#  define IRMP_HIGH_ACTIVE                      0                       // set to 1 if you use a RF receiver!&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Most RF receivers use active-high signals, so when using an RF receiver instead of an IR sensor, set this value to 1.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#FF0000&amp;quot;&amp;gt;&#039;&#039;&#039;NEU:&#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== IRMP_ENABLE_RELEASE_DETECTION ====&lt;br /&gt;
&lt;br /&gt;
Default value:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
#  define IRMP_ENABLE_RELEASE_DETECTION         0                       //  enable detection of key releases&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Set this value to 1 to enable detection of button release events. The function irmp_get_data() then sets the IRMP_FLAG_RELEASE bit in the struct member irmp_data.flags once code transmission ends. See the example in the section  &#039;&#039;&#039;[[IRMP_-_english#Debouncing|Debouncing]]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== IRMP_USE_CALLBACK ====&lt;br /&gt;
&lt;br /&gt;
Default value:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
#define IRMP_USE_CALLBACK                      0        // flag: 0 = don&#039;t use callbacks, 1 = use callbacks, default is 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When you turn on callbacks, any level change at the input causes the callback function to be called. This can be used to visualize incoming IR signals by driving another output pin.&lt;br /&gt;
&lt;br /&gt;
Here is an example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
#define LED_PORT PORTD                                  // LED at PD6&lt;br /&gt;
#define LED_DDR  DDRD&lt;br /&gt;
#define LED_PIN  6&lt;br /&gt;
&lt;br /&gt;
/*-----------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
 * Called (back) from IRMP module&lt;br /&gt;
 * This example switches a LED (which is connected to Vcc)&lt;br /&gt;
 *-----------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
 */&lt;br /&gt;
void&lt;br /&gt;
led_callback (uint_fast8_t on)&lt;br /&gt;
{&lt;br /&gt;
    if (on)&lt;br /&gt;
    {&lt;br /&gt;
       LED_PORT &amp;amp;= ~(1 &amp;lt;&amp;lt; LED_PIN);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
       LED_PORT |= (1 &amp;lt;&amp;lt; LED_PIN);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int&lt;br /&gt;
main ()&lt;br /&gt;
{&lt;br /&gt;
    ...&lt;br /&gt;
    irmp_init ();&lt;br /&gt;
&lt;br /&gt;
    LED_DDR |= (1 &amp;lt;&amp;lt; LED_PIN);         // LED pin to output&lt;br /&gt;
    LED_PORT |= (1 &amp;lt;&amp;lt; LED_PIN);        // switch LED off (active low)&lt;br /&gt;
    irmp_set_callback_ptr (led_callback);&lt;br /&gt;
&lt;br /&gt;
    sei ();&lt;br /&gt;
    ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== IRMP_USE_IDLE_CALL ====&lt;br /&gt;
&lt;br /&gt;
Normally the irmp_ISR() function is called continuously at the F_INTERRUPTS (10-20kHz) frequency. The microcontroller can rarely enter an energy-saving sleep mode, or must constantly wake up from it. If power consumption is important, e.g. on battery power, this approach is not optimal.&lt;br /&gt;
&lt;br /&gt;
If &#039;&#039;IRMP_USE_IDLE_CALL&#039;&#039;&#039; is enabled, IRMP detects if no IR transmission is ongoing and then calls the function &#039;&#039;&#039;irmp_idle()&#039;&#039;&#039;. This is microcontroller-specific and must be provided and linked by the user. The microcontroller can then be put to sleep while there is no ongoing transmission, thus reducing energy consumption.&lt;br /&gt;
&lt;br /&gt;
It is recommended to deactivate the timer interrupt in irmp_idle() and to activate a pin change interrupt instead. Then the microcontroller can be put to sleep. When a falling edge is detected on the IR input pin, the pin change interrupt is disabled, the timer is reenabled and irmp_ISR() is called immediately. You can find an example for the use of irmp_idle() in [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-chibios.c?view=markup irmp-main-chibios.c].&lt;br /&gt;
&lt;br /&gt;
Using IRMP purely with pin change interrupts and without timer interrupts is not supported.&lt;br /&gt;
&lt;br /&gt;
==== IRMP_USE_EVENT ====&lt;br /&gt;
&lt;br /&gt;
When using IRMP with ChibiOS/RT or ChibiOS/NIL, you can use their Event module to wake a thread as soon as new IR data is received and decoded.&lt;br /&gt;
&lt;br /&gt;
Set the &#039;&#039;&#039;IRMP_USE_EVENT&#039;&#039;&#039; constant in irmpconfig.h to 1 to enable this. &#039;&#039;&#039;IRMP_EVENT_BIT&#039;&#039;&#039; definies the value in the Event bitmask that should symbolize the IRMP event. Use &#039;&#039;&#039;IRMP_EVENT_THREAD_PTR&#039;&#039;&#039; to define the variable name of the thread pointer that the event is sent to.&lt;br /&gt;
&lt;br /&gt;
Change irmpconfig.h like this:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
/*------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
 * Use ChibiOS Events to signal that valid IR data was received&lt;br /&gt;
 *------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
 */&lt;br /&gt;
#if defined(_CHIBIOS_RT_) || defined(_CHIBIOS_NIL_)&lt;br /&gt;
&lt;br /&gt;
#  ifndef IRMP_USE_EVENT&lt;br /&gt;
#    define IRMP_USE_EVENT                      1                     // 1: use event. 0: do not. default is 0&lt;br /&gt;
#  endif&lt;br /&gt;
&lt;br /&gt;
#  if IRMP_USE_EVENT == 1 &amp;amp;&amp;amp; !defined(IRMP_EVENT_BIT)&lt;br /&gt;
#    define IRMP_EVENT_BIT                      1                     // event flag or bit to send&lt;br /&gt;
#  endif&lt;br /&gt;
#  if IRMP_USE_EVENT == 1 &amp;amp;&amp;amp; !defined(IRMP_EVENT_THREAD_PTR)&lt;br /&gt;
#    define IRMP_EVENT_THREAD_PTR               ir_receive_thread_p   // pointer to the thread to send the event to&lt;br /&gt;
extern thread_t *IRMP_EVENT_THREAD_PTR;                               // the pointer must be defined and initialized elsewhere&lt;br /&gt;
#  endif&lt;br /&gt;
&lt;br /&gt;
#endif // _CHIBIOS_RT_ || _CHIBIOS_NIL_&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now you can use the event in your ChibiOS project like this:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
thread_t *ir_receive_thread_p = NULL;&lt;br /&gt;
&lt;br /&gt;
static THD_FUNCTION(IRThread, arg)&lt;br /&gt;
{&lt;br /&gt;
    ir_receive_thread_p = chThdGetSelfX();&lt;br /&gt;
    [...]&lt;br /&gt;
    while (true)&lt;br /&gt;
    {&lt;br /&gt;
        // wait for event sent from irmp_ISR&lt;br /&gt;
        chEvtWaitAnyTimeout(ALL_EVENTS,TIME_INFINITE);&lt;br /&gt;
&lt;br /&gt;
        if (irmp_get_data (&amp;amp;irmp_data))&lt;br /&gt;
            // use data in irmp_data&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== IRMP_LOGGING ====&lt;br /&gt;
&lt;br /&gt;
With IRMP_LOGGING the logging of received IR frames can be turned on.&lt;br /&gt;
&lt;br /&gt;
Default value:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
#define IRMP_LOGGING                            0       // 1: log IR signal (scan), 0: do not. default is 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Further documentation can be found here: [[IRMP_-_english#Scanning_unknown_IR_Protocols|Scanning Unknown IR Protocols]].&lt;br /&gt;
&lt;br /&gt;
=== Using IRMP ===&lt;br /&gt;
&lt;br /&gt;
The protocols supported by [[IRMP_-_english#top|IRMP]] use partly variable, partly fixed bit lengths from 2 up to 48 bits. These are described by preprocessor defines.&lt;br /&gt;
&lt;br /&gt;
[[IRMP_-_english#top|IRMP]] separates these IR frames into 3 sections:&lt;br /&gt;
&lt;br /&gt;
 1. protocol ID&lt;br /&gt;
 2. address or vendor code&lt;br /&gt;
 3. command&lt;br /&gt;
&lt;br /&gt;
With the function&lt;br /&gt;
&lt;br /&gt;
   irmp_get_data (IRMP_DATA * irmp_data_p)&lt;br /&gt;
&lt;br /&gt;
you can recall a decoded message. The return value is 1 if a message has been received, otherwise it is 0. In the first case the struct members&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
    irmp_data_p-&amp;gt;protocol (8 Bit)&lt;br /&gt;
    irmp_data_p-&amp;gt;address (16 Bit)&lt;br /&gt;
    irmp_data_p-&amp;gt;command (16 Bit)&lt;br /&gt;
    irmp_data_p-&amp;gt;flags (8 Bit)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
contain valid information.&lt;br /&gt;
&lt;br /&gt;
That means that ultimately, you have three values (protocol, address and command) that can be evaluated with an if or switch statement. &lt;br /&gt;
Here is a sample decoder which listens for keys 1-9 on a remote:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&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 protocol&lt;br /&gt;
          irmp_data.address == 0x1234)                   // Address 0x1234&lt;br /&gt;
      {&lt;br /&gt;
         switch (irmp_data.command)&lt;br /&gt;
         {&lt;br /&gt;
            case 0x0001: key1_pressed(); break;          // Key 1&lt;br /&gt;
            case 0x0002: key2_pressed(); break;          // Key 2&lt;br /&gt;
            ...&lt;br /&gt;
            case 0x0009: key9_pressed(); break;          // Key 9&lt;br /&gt;
         }&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here are possible constants for irmp_data.protocol, see also [http://www.mikrocontroller.net/svnbrowser/irmp/irmpprotocols.h?view=markup irmpprotocols.h]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
#define IRMP_SIRCS_PROTOCOL                      1              // Sony&lt;br /&gt;
#define IRMP_NEC_PROTOCOL                        2              // NEC, Pioneer, JVC, Toshiba, generic, 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 Media Receiver&lt;br /&gt;
#define IRMP_IR60_PROTOCOL                      24              // IR60 (SDA2008)&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;
#define IRMP_BOSE_PROTOCOL                      31              // BOSE&lt;br /&gt;
#define IRMP_A1TVBOX_PROTOCOL                   32              // A1 TV Box&lt;br /&gt;
#define IRMP_ORTEK_PROTOCOL                     33              // ORTEK - Hama&lt;br /&gt;
#define IRMP_TELEFUNKEN_PROTOCOL                34              // Telefunken (1560)&lt;br /&gt;
#define IRMP_ROOMBA_PROTOCOL                    35              // iRobot Roomba vacuum cleaner&lt;br /&gt;
#define IRMP_RCMM32_PROTOCOL                    36              // Fujitsu-Siemens (Activy remote control)&lt;br /&gt;
#define IRMP_RCMM24_PROTOCOL                    37              // Fujitsu-Siemens (Activy keyboard)&lt;br /&gt;
#define IRMP_RCMM12_PROTOCOL                    38              // Fujitsu-Siemens (Activy keyboard)&lt;br /&gt;
#define IRMP_SPEAKER_PROTOCOL                   39              // Another loudspeaker protocol, similar to Nubert&lt;br /&gt;
#define IRMP_LGAIR_PROTOCOL                     40              // LG air conditioner&lt;br /&gt;
#define IRMP_SAMSUNG48_PROTOCOL                 41              // air conditioner with Samsung protocol (48 bits)&lt;br /&gt;
#define IRMP_MERLIN_PROTOCOL                    42              // Merlin (Pollin 620 185)&lt;br /&gt;
#define IRMP_PENTAX_PROTOCOL                    43              // Pentax camera&lt;br /&gt;
#define IRMP_FAN_PROTOCOL                       44              // FAN (ventilator), very similar to NUBERT, but last bit is data bit instead of stop bit&lt;br /&gt;
#define IRMP_S100_PROTOCOL                      45              // very similar to RC5, but 14 instead of 13 data bits&lt;br /&gt;
#define IRMP_ACP24_PROTOCOL                     46              // Stiebel Eltron ACP24 air conditioner&lt;br /&gt;
#define IRMP_TECHNICS_PROTOCOL                  47              // Technics, similar to Matsushita, but 22 instead of 24 bits&lt;br /&gt;
#define IRMP_PANASONIC_PROTOCOL                 48              // Panasonic (video projector), start bits similar to KASEIKYO&lt;br /&gt;
#define IRMP_MITSU_HEAVY_PROTOCOL               49              // Mitsubishi heavy air conditioner, similar timing to Panasonic video projector&lt;br /&gt;
#define IRMP_VINCENT_PROTOCOL                   50              // Vincent&lt;br /&gt;
#define IRMP_SAMSUNGAH_PROTOCOL                 51              // Samsung AH&lt;br /&gt;
#define IRMP_IRMP16_PROTOCOL                    52              // IRMP specific protocol for data transfer, e.g. between two microcontrollers via IR&lt;br /&gt;
#define IRMP_GREE_PROTOCOL                      53              // Gree climate&lt;br /&gt;
#define IRMP_RCII_PROTOCOL                      54              // RC II Infrared Remote Control Protocol for FM8&lt;br /&gt;
#define IRMP_METZ_PROTOCOL                      55              // METZ&lt;br /&gt;
#define IRMP_ONKYO_PROTOCOL                     56              // Onkyo&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The values of address and the command code of an unknown remote can be received and printed to UART or LCD. Then these values can be hard-coded in your decoder routine. Or you can write a learning routine, where you press keys to store the code into EEPROM. A sample for this can be found in [http://www.mikrocontroller.net/articles/DIY_Lernfähige_Fernbedienung_mit_IRMP Lernfähige IR-Fernbedienung mit IRMP].&lt;br /&gt;
&lt;br /&gt;
Another [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-avr.c?view=markup example main function] is included in the zip file, showing also the timer initialization.&lt;br /&gt;
&lt;br /&gt;
=== Debouncing ===&lt;br /&gt;
&lt;br /&gt;
To distinguish between a long key press or a single press, the IRMP_FLAG_REPETITION bit is provided. It is set in the struct member &#039;&#039;&#039;flags&#039;&#039;&#039; when a key on the remote is held, causing the same command to be repeated within a short period of time.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
    if (irmp_data.flags &amp;amp; IRMP_FLAG_REPETITION)&lt;br /&gt;
    {&lt;br /&gt;
      // long key press&lt;br /&gt;
      // either:&lt;br /&gt;
      //   ignore the (repeated) key&lt;br /&gt;
      // or:&lt;br /&gt;
      //   use this information for a repeat function&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
      // key was pressed again&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This can be used to debounce the keys 0-9 by ignoring commands with the IRMP_FLAG_REPETITION bit set. For keys like &#039;VOLUME+&#039; or &#039;VOLUME-&#039; using the repetition can be useful, for example to [[LED-Fading|fade a LED]].&lt;br /&gt;
&lt;br /&gt;
If you want to decode only single keys, you can reduce the block above to:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
    if (! (irmp_data.flags &amp;amp; IRMP_FLAG_REPETITION))&lt;br /&gt;
    {&lt;br /&gt;
      // New key&lt;br /&gt;
      // ACTION!&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#FF0000&amp;quot;&amp;gt;&#039;&#039;&#039;NEW:&#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From version 3.2.2, key releases can be detected. In this case, the IRMP_FLAG_RELEASE flag is set once the remote control has ceased sending IR or RF frames.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
    IRMP_DATA irmp_data;&lt;br /&gt;
&lt;br /&gt;
    while (1)&lt;br /&gt;
    {&lt;br /&gt;
        if (irmp_get_data (&amp;amp;irmp_data))&lt;br /&gt;
        {&lt;br /&gt;
            if (irmp_data.protocol == NEC_PROTOCOL &amp;amp;&amp;amp; irmp_data.address == 0x1234)&lt;br /&gt;
            {&lt;br /&gt;
                 if (irmp_data.command == 0x42 &amp;amp;&amp;amp; irmp_data.flags == 0x00) // First frame, flags not set&lt;br /&gt;
                 {&lt;br /&gt;
                     motor_on ();&lt;br /&gt;
                 }&lt;br /&gt;
                 else if (irmp_data.flags &amp;amp; IRMP_FLAG_RELEASE)             // Key is released&lt;br /&gt;
                 {&lt;br /&gt;
                     motor_off ();&lt;br /&gt;
                 }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the above example, a motor is turned on when a specific button on the remote control is pressed. The motor will not stop again until you release the button.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important when evaluating IRMP_FLAG_RELEASE:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
You must not rely on irmp_data.command to still contain the original command code (0x42 here). There are remote controls (e.g. RF remotes for remote controlled receptacles) which send a special key release code when the key is released. Simply check that the irmp_data.address matches before evaluating the flag.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;This feature must be enabled explicitly in irmpconfig.h by changing the configuration variable IRMP_ENABLE_RELEASE_DETECTION&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Principles of Operation ==&lt;br /&gt;
&lt;br /&gt;
The  &amp;quot;workhorse&amp;quot; of [[IRMP_-_english#top|IRMP]] is the interrupt service routine irmp_ISR() which should be called 15000 times per second. When using a different rate, the constant [[IRMP_-_english#F_INTERRUPTS|F_INTERRUPTS]] in [http://www.mikrocontroller.net/svnbrowser/irmp/irmpconfig.h?view=markup irmpconfig.h] needs to be modified accordingly.&lt;br /&gt;
&lt;br /&gt;
First, irmp_ISR() detects the length and the type of the start bit(s) and uses this to determine the protocol in use. As soon as the protocol is identified, subsequent bits are parametrized to read them efficiently until the IR transmission is complete.&lt;br /&gt;
&lt;br /&gt;
To cut off critics:&lt;br /&gt;
&lt;br /&gt;
I know that the ISR is quite large. But since it behaves like a state machine, the effective executed code per cycle is relatively small. As long as the input is &amp;quot;dark&amp;quot; (and that is the case most of the time ;-)) the spent time is vanishingly short. In the WordClock project for example, 8 ISRs are called with the same timer, of which irmp_ISR() just one of many. With a MCU clock of at least 8 MHz, no timing problems occured. Consequently, I see no problem with the length of the ISR.&lt;br /&gt;
&lt;br /&gt;
A crystal is not mandatory, it works well with the internal AVR oscillator. Remember to set the correct fuses for the CPU to run at 8 MHz, check [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-avr.c?view=markup irmp-main-avr.c] for correct values for an ATMEGA88.&lt;br /&gt;
&lt;br /&gt;
== Scanning Unknown IR Protocols ==&lt;br /&gt;
&lt;br /&gt;
To enable logging in [[IRMP_-_english#top|IRMP]], modify the value of [[IRMP_-_english#IRMP_LOGGING|IRMP_LOGGING]] to 1 of [http://www.mikrocontroller.net/svnbrowser/irmp/irmpconfig.h?view=markup irmpconfig.h] on the line&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
    #define IRMP_LOGGING    0   // 1: log IR signal (scan), 0: do not (default)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When logging is enabled, the bright and dark phases are sent via UART at 9600 bits/s: 1=dark, 0=bright. The constants in the functions uart_init() and uart_putc() may need to be modified,  depending on the AVR MCU used.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note: for PIC microcontrollers there is a dedicated logging module named [http://www.mikrocontroller.net/svnbrowser/irmp/irmpextlog.c?view=markup irmpextlog.c]. This makes it possible to log via USB. This does not apply to the AVR version&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
By capturing these protocol scans with a terminal program and saving them to a text file, you can use these files to analyze the frames in order to add new protocols to [[IRMP_-_english#top|IRMP]] - see next chapter.&lt;br /&gt;
&lt;br /&gt;
If you have a remote control that is not supported by [[IRMP_-_english#top|IRMP]], you can send me ([http://www.mikrocontroller.net/user/show/ukw ukw]) the scan files. Then I can check if the protocol is compatible with the IRMP model and modify the source code if applicable.&lt;br /&gt;
&lt;br /&gt;
== IRMP under Linux and Windows ==&lt;br /&gt;
&lt;br /&gt;
=== Compilation ===&lt;br /&gt;
&lt;br /&gt;
[http://www.mikrocontroller.net/svnbrowser/irmp/irmp.c?view=markup irmp.c] can be compiled under Linux for testing IR scans in textfiles. In the subdirectory &#039;IR-Data&#039; you will find such files that you can use as input files for [[IRMP_-_english#top|IRMP]].&lt;br /&gt;
&lt;br /&gt;
To compile [[IRMP_-_english#top|IRMP]], enter:&lt;br /&gt;
&lt;br /&gt;
    make -f makefile.lnx&lt;br /&gt;
&lt;br /&gt;
This will generate 3 IRMP versions:&lt;br /&gt;
&lt;br /&gt;
* irmp-10kHz: Version for 10kHz scans&lt;br /&gt;
* irmp-15kHz: Version for 15kHz scans&lt;br /&gt;
* irmp-20kHz: Version for 20kHz scans&lt;br /&gt;
&lt;br /&gt;
=== Starting IRMP ===&lt;br /&gt;
&lt;br /&gt;
The calling syntax is:&lt;br /&gt;
&lt;br /&gt;
  ./irmp-nnkHz [-l|-p|-a|-v] &amp;lt; scan-file&lt;br /&gt;
&lt;br /&gt;
Options are mutually exclusive, so only one option per call is valid:&lt;br /&gt;
&lt;br /&gt;
Option:&lt;br /&gt;
&lt;br /&gt;
   -l  List             print a list with pulses and pauses&lt;br /&gt;
   -a analyze           analyse the pulses/pauses and write a &amp;quot;spectrum&amp;quot; in ASCII format&lt;br /&gt;
   -v verbose           verbose output&lt;br /&gt;
   -p  Print Timings    print a timing table for all protocols&lt;br /&gt;
&lt;br /&gt;
Samples:&lt;br /&gt;
&lt;br /&gt;
=== Normal Output ===&lt;br /&gt;
&lt;br /&gt;
   ./irmp-10kHz &amp;lt; IR-Data/orion_vcr_07660BM070.txt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Output Lists ===&lt;br /&gt;
&lt;br /&gt;
   ./irmp-10kHz -l &amp;lt; IR-Data/orion_vcr_07660BM070.txt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Analysis ===&lt;br /&gt;
&lt;br /&gt;
   ./irmp-10kHz -a &amp;lt; IR-Data/orion_vcr_07660BM070.txt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here you see the measured times of all pulses and pauses (spaces) as horizontal bar graphs, whose distributions are not ideal bell curves due to the ASCII formatting. The narrower the measured peaks, the better the timing of the remote.&lt;br /&gt;
&lt;br /&gt;
The above output can be read as:&lt;br /&gt;
&lt;br /&gt;
* the start bit has a pulse length between 9000 and 9200 µs, on average 9102 µs. The deviation from this average is about 1.1%&lt;br /&gt;
&lt;br /&gt;
* the start bit has a space length between 4300 and 4500 µs, the average is 4424 µs. The error is about 2.8%.&lt;br /&gt;
&lt;br /&gt;
* the pulse length of a data bit is between 500 and 700 µs, on average 650 µs, the error is (quite large!) 23.1%&lt;br /&gt;
&lt;br /&gt;
Further there are two more spaces of different lengths (for bits 0 and 1). Reading these is left as an exercise to the reader. ;-)&lt;br /&gt;
&lt;br /&gt;
=== Verbose Output ===&lt;br /&gt;
&lt;br /&gt;
    ./irmp-10kHz -v &amp;lt; IR-Data/orion_vcr_07660BM070.txt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
# 1 - IR-cmd: 0x0001&lt;br /&gt;
   0.200ms [starting pulse]&lt;br /&gt;
  13.700ms [start-bit: pulse = 91, pause = 44]&lt;br /&gt;
protocol = NEC, start bit timings: pulse:  62 - 118, pause:  30 -  60&lt;br /&gt;
pulse_1:   3 -   8&lt;br /&gt;
pause_1:  11 -  23&lt;br /&gt;
pulse_0:   3 -   8&lt;br /&gt;
pause_0:   3 -   8&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;
  14.800ms [bit  0: pulse =   6, pause =   5] 0&lt;br /&gt;
  16.000ms [bit  1: pulse =   6, pause =   6] 0&lt;br /&gt;
  17.100ms [bit  2: pulse =   6, pause =   5] 0&lt;br /&gt;
  18.200ms [bit  3: pulse =   6, pause =   5] 0&lt;br /&gt;
  19.300ms [bit  4: pulse =   6, pause =   5] 0&lt;br /&gt;
  20.500ms [bit  5: pulse =   6, pause =   6] 0&lt;br /&gt;
  21.600ms [bit  6: pulse =   6, pause =   5] 0&lt;br /&gt;
  23.800ms [bit  7: pulse =   6, pause =  16] 1&lt;br /&gt;
  26.100ms [bit  8: pulse =   6, pause =  17] 1&lt;br /&gt;
  28.300ms [bit  9: pulse =   6, pause =  16] 1&lt;br /&gt;
  29.500ms [bit 10: pulse =   6, pause =   6] 0&lt;br /&gt;
  31.700ms [bit 11: pulse =   6, pause =  16] 1&lt;br /&gt;
  34.000ms [bit 12: pulse =   6, pause =  17] 1&lt;br /&gt;
  36.200ms [bit 13: pulse =   6, pause =  16] 1&lt;br /&gt;
  38.500ms [bit 14: pulse =   6, pause =  17] 1&lt;br /&gt;
  39.600ms [bit 15: pulse =   6, pause =   5] 0&lt;br /&gt;
  41.900ms [bit 16: pulse =   6, pause =  17] 1&lt;br /&gt;
  43.000ms [bit 17: pulse =   6, pause =   5] 0&lt;br /&gt;
  44.100ms [bit 18: pulse =   6, pause =   5] 0&lt;br /&gt;
  45.200ms [bit 19: pulse =   6, pause =   5] 0&lt;br /&gt;
  46.400ms [bit 20: pulse =   7, pause =   5] 0&lt;br /&gt;
  47.500ms [bit 21: pulse =   6, pause =   5] 0&lt;br /&gt;
  48.600ms [bit 22: pulse =   6, pause =   5] 0&lt;br /&gt;
  49.800ms [bit 23: pulse =   6, pause =   6] 0&lt;br /&gt;
  50.900ms [bit 24: pulse =   5, pause =   6] 0&lt;br /&gt;
  53.100ms [bit 25: pulse =   6, pause =  16] 1&lt;br /&gt;
  55.400ms [bit 26: pulse =   6, pause =  17] 1&lt;br /&gt;
  57.600ms [bit 27: pulse =   6, pause =  16] 1&lt;br /&gt;
  59.900ms [bit 28: pulse =   6, pause =  17] 1&lt;br /&gt;
  62.100ms [bit 29: pulse =   6, pause =  16] 1&lt;br /&gt;
  64.400ms [bit 30: pulse =   6, pause =  17] 1&lt;br /&gt;
  66.700ms [bit 31: pulse =   6, pause =  17] 1&lt;br /&gt;
stop bit detected&lt;br /&gt;
  67.300ms code detected, length = 32&lt;br /&gt;
  67.300ms p =  2, a = 0x7b80, c = 0x0001, f = 0x00&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Starting under Windows ===&lt;br /&gt;
&lt;br /&gt;
[[IRMP_-_english#top|IRMP]] can be used under Windows as well:&lt;br /&gt;
&lt;br /&gt;
* start command line console&lt;br /&gt;
* change to directory &#039;irmp&#039;&lt;br /&gt;
* enter:&lt;br /&gt;
            irmp-10kHz.exe &amp;lt; IR-Data\rc5x.txt&lt;br /&gt;
&lt;br /&gt;
The same options apply as for the Linux version.&lt;br /&gt;
&lt;br /&gt;
=== Long Output ===&lt;br /&gt;
&lt;br /&gt;
As some output is very long, it is recommended to redirect the output to a file or filter for paging:&lt;br /&gt;
&lt;br /&gt;
Linux:&lt;br /&gt;
&lt;br /&gt;
            ./irmp-10kHz &amp;lt; IR-Data/rc5x.txt | less&lt;br /&gt;
&lt;br /&gt;
Windows:&lt;br /&gt;
&lt;br /&gt;
            irmp-10kHz.exe &amp;lt; IR-Data\rc5x.txt | more&lt;br /&gt;
&lt;br /&gt;
== Remote Controls ==&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! Protocol || Name || Device || Device Address&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#NEC_+_extended_NEC|NEC]] || Toshiba CT-9859 || TV || 0x5F40&lt;br /&gt;
|-&lt;br /&gt;
VCR|-&lt;br /&gt;
| || Elta 8848 MP 4 || DVD player || 0x7F00&lt;br /&gt;
|-&lt;br /&gt;
| || AS-218 || Askey TV-View CHP03X (TV tuner card) || 0x3B86&lt;br /&gt;
|-&lt;br /&gt;
| || Cyberhome ??? || Cyberhome DVD player || 0x6D72&lt;br /&gt;
|-&lt;br /&gt;
| || WD TV Live || Western Digital Multimediaplayer || 0x1F30&lt;br /&gt;
|-&lt;br /&gt;
| || Canon WL-DC100 || Kamera Canon PowerShot G5 || 0xB1CA&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#NEC16|NEC16]] || Daewoo || VCR || 0x0015&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#KASEIKYO|KASEIKYO]] || Technics EUR646497 || SA-AX 730 AV receiver || 0x2002&lt;br /&gt;
|-&lt;br /&gt;
| || Panasonic TV || TX-L32EW6 TV || 0x2002&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#RC5_+_RC5X|RC5]] || Loewe Assist/RC3/RC4 || TV (remote control in TV mode) || 0x0000&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#RC6_+_RC6A|RC6]] || Philips TV || TV (remote control in TV mode) || 0x0000&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#SIRCS|SIRCS]] || Sony RM-816 || TV (remote control in TV mode) || 0x0000&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#DENON|DENON]] || DENON RC970 || AVR3805 AV receiver || 0x0008&lt;br /&gt;
|-&lt;br /&gt;
| || DENON RC970 || DVD/CD player || 0x0002&lt;br /&gt;
|-&lt;br /&gt;
| || DENON RC970 || Tuner || 0x0006&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#SAMSUNG32|SAMSUNG32]] || Samsung AA59-00484A || LE40D550 TV || 0x0707&lt;br /&gt;
|-&lt;br /&gt;
| || LG AKB72033901 || BD370 Blu-Ray player  || 0x2D2D&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP_-_english#APPLE|APPLE]] || Apple || Apple iPod Dock || 0x0020&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Cameras ==&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width: 80%;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 20%;&amp;quot; |&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
[[IRMP_-_english#top|IRMP]] supports more and more camera remotes like:&lt;br /&gt;
&lt;br /&gt;
* [[IRMP_-_english#PENTAX|PENTAX]]&lt;br /&gt;
* [[IRMP_-_english#Nikon|Nikon]]&lt;br /&gt;
&lt;br /&gt;
The array of commands is quite limited. Cameras understand only the shutter release command.&lt;br /&gt;
||&lt;br /&gt;
[[Datei:Irmp-pentax.png|miniatur|PENTAX protocol]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Here is a short table for [[IRMP_-_english#PENTAX|PENTAX]] cameras:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! Command || Function&lt;br /&gt;
|-&lt;br /&gt;
| 0x0000 || Shutter release&lt;br /&gt;
|-&lt;br /&gt;
| 0x0001 || change zoom level&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Because there is no address designated in the [[IRMP_-_english#PENTAX|PENTAX]] protocol, for transmitting, it should be set to 0x0000 in [[IRSND_-_english|IRSND]]. &lt;br /&gt;
&lt;br /&gt;
For Nikon cameras, a crystal should be used because these cameras are quite sensitive to timing accuracy.&lt;br /&gt;
&lt;br /&gt;
== IR Keyboards ==&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width: 80%;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 20%;&amp;quot; |&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
From version 1.7.0 on, [[IRMP_-_english#top|IRMP]] also supports IR keyboards, namely the FDC-3402 &amp;lt;s&amp;gt; from www.pollin.de (partno. 711 056) for less than 2 Euro.&amp;lt;/s&amp;gt; (not available as of 19.09.2017 )&lt;br /&gt;
&lt;br /&gt;
On detection of a key press the following data is returned:&lt;br /&gt;
&lt;br /&gt;
 Protocol number  (irmp_data.protocol): 18&lt;br /&gt;
 Address          (irmp_data.address) : 0x003F&lt;br /&gt;
||&lt;br /&gt;
[[Datei:irmp-fdc3402.jpg|miniatur|FDC-3402 keyboard]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The following values are returned as commands (irmp_data.command) :&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size:50%; text-align:center;&amp;quot;&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! Code || Key   || Code || Key   || Code || Key   || Code || Key   || Code || Key   || Code || Key   || Code || Key   || Code || Key   &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;
Special keys on the left:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! Code || Key   &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;
The above values are for pressing a key. On release, [[IRMP_-_english#top|IRMP]] sets also bit 8 (0x80) in the command.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
      Key &#039;a&#039; pressed:   0x001F&lt;br /&gt;
      Key &#039;a&#039; released:  0x009F&lt;br /&gt;
&lt;br /&gt;
The ON/OFF key is an exception: This key only sends a code for a key press, not for the release.&lt;br /&gt;
&lt;br /&gt;
If a key is held, this is indicated in irmp_data.flag.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
                           command   flag&lt;br /&gt;
      Key &#039;a&#039; pressed:   0x001F    0x00&lt;br /&gt;
      Key &#039;a&#039; pressed:   0x001F    0x01&lt;br /&gt;
      Key &#039;a&#039; pressed:   0x001F    0x01&lt;br /&gt;
      Key &#039;a&#039; pressed:   0x001F    0x01&lt;br /&gt;
      ....&lt;br /&gt;
      Key &#039;a&#039; released:  0x009F    0x00&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
When key combinations (like a capital &#039;A&#039;) are pressed, then the return values are a sequence like this:&lt;br /&gt;
&lt;br /&gt;
      Left SHIFT-key pressed:    0x0002&lt;br /&gt;
      Key &#039;a&#039; pressed:           0x001F&lt;br /&gt;
      Key &#039;a&#039; released:          0x009F&lt;br /&gt;
      Left SHIFT-key released:   0x0082&lt;br /&gt;
&lt;br /&gt;
In [http://www.mikrocontroller.net/svnbrowser/irmp/irmp.c?view=markup irmp.c] you will find a function get_fdc_key() for the Linux version, which can be used as a template to convert the FDC keycodes into the corresponding ASCII codes. This function can be used either locally on the MCU to decode the keycodes, or on the host system (e.g. PC) where the IRMP data structure is sent to. Therefore the function including preprocessor constants should be copied to your application code.&lt;br /&gt;
&lt;br /&gt;
Here is an excerpt:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&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;,  0xDF, &#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;,  0xFC, &#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;, 0xF6, 0xE4, &#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;,  0xDC, &#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;, 0xD6, 0xC4, &#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 = 0xB2;    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 = 0xB5;    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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As a final example, use of the get_fdc_key() function:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Non-printable characters are coded as follows:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! Key               || Constant                || Value&lt;br /&gt;
|-&lt;br /&gt;
| ESC               || KEY_ESCAPE              || 0x1B&lt;br /&gt;
|-&lt;br /&gt;
| Menu              || KEY_MENUE               || 0x80&lt;br /&gt;
|-&lt;br /&gt;
| Back              || KEY_BACK                || 0x81&lt;br /&gt;
|-&lt;br /&gt;
| Forward           || KEY_FORWARD             || 0x82&lt;br /&gt;
|-&lt;br /&gt;
| Adress            || KEY_ADDRESS             || 0x83&lt;br /&gt;
|-&lt;br /&gt;
| Window            || KEY_WINDOW              || 0x84&lt;br /&gt;
|-&lt;br /&gt;
| 1. Page           || 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;
| New Page          || KEY_NEW_PAGE            || 0x89&lt;br /&gt;
|-&lt;br /&gt;
| Setup             || KEY_SETUP               || 0x8A&lt;br /&gt;
|-&lt;br /&gt;
| Font              || KEY_FONT                || 0x8B&lt;br /&gt;
|-&lt;br /&gt;
| Print             || KEY_PRINT               || 0x8C&lt;br /&gt;
|-&lt;br /&gt;
| On/Off            || 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;
| Insert            || KEY_INSERT              || 0x90&lt;br /&gt;
|-&lt;br /&gt;
| Delete            || KEY_DELETE              || 0x91&lt;br /&gt;
|-&lt;br /&gt;
| Cursor left       || KEY_LEFT                || 0x92&lt;br /&gt;
|-&lt;br /&gt;
| Pos1              || KEY_HOME                || 0x93&lt;br /&gt;
|-&lt;br /&gt;
| End               || KEY_END                 || 0x94&lt;br /&gt;
|-&lt;br /&gt;
| Cursor right      || KEY_UP                  || 0x95&lt;br /&gt;
|-&lt;br /&gt;
| Cursor down       || KEY_DOWN                || 0x96&lt;br /&gt;
|-&lt;br /&gt;
| Page up           || KEY_PAGE_UP             || 0x97&lt;br /&gt;
|-&lt;br /&gt;
| Page down         || KEY_PAGE_DOWN           || 0x98&lt;br /&gt;
|-&lt;br /&gt;
| Cursor left       || KEY_RIGHT               || 0x99&lt;br /&gt;
|-&lt;br /&gt;
| Left Mousebutton  || KEY_MOUSE_1             || 0x9E&lt;br /&gt;
|-&lt;br /&gt;
| Right Mousebutton || KEY_MOUSE_2             || 0x9F&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The get_fdc_key() function considers the state of the Shift, Ctrl, and Alt keys. As a result, not only capital letters can be entered, but also special characters with Alt + key combinations, e.g. Alt + m -&amp;gt; µ or Alt + q -&amp;gt; @. You can also send Ctrl + A to Ctrl + Z by using the Ctrl key. The Caps Lock key is ignored, as I regard this key as the most unnecessary key at all ;-)&lt;br /&gt;
&lt;br /&gt;
= Appendix =&lt;br /&gt;
&lt;br /&gt;
== IR Protocols in Detail ==&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width: 80%;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 20%;&amp;quot; |&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
=== Pulse Distance Protocols ===&lt;br /&gt;
||&lt;br /&gt;
[[Datei:Pulse-Distance.png|miniatur|Pulse Distance Coding]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== NEC + extended NEC ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#NEC Protocol|NEC + extended NEC]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 36 kHz / 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 32 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data NEC || 8 address bits + 8 inverted address bits + 8 command bits + 8 inverted command bits&lt;br /&gt;
|-&lt;br /&gt;
| Data ext. NEC || 16 address bits + 8 command bits + 8 inverted command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 9000µs pulse, 4500µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 560µs pulse,  560µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 560µs pulse, 1690µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 560µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || 9000µs pulse, 2250µs pause, 560µs pulse, ~100ms pause&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== JVC ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#NEC16 Protocol (JVC)|JVC]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 16 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 4 address bits + 12 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 9000µs pulse, 4500µs pause, 6000µs pause if key repeat&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 560µs pulse,  560µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 560µs pulse, 1690µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 560µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after pause of 25ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== NEC16 ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;NEC16&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 8 address bits + 1 sync bit + 8 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 9000µs pulse, 4500µs pause&lt;br /&gt;
|-&lt;br /&gt;
| sync bit || 560µs pulse, 4500µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 560µs pulse,  560µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 560µs pulse, 1690µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 560µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after pause of 25ms?&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== NEC42 ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;NEC42&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 42 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 13 address bits + 13 inverted address bits + 8 command bits + 8 inverted command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 9000µs pulse, 4500µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 560µs pulse,  560µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 560µs pulse, 1690µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 560µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after 110ms (beginning from start bit), 9000µs pulse, 2250µs pause, 560µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== ACP24 ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#ACP24 Protocol|ACP24]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 70 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 0 address bits + 70 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 390µs pulse, 950µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 390µs pulse,  950µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 390µs pulse, 13000µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 390µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || unknown&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== LGAIR ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#LGAIR Protocol|LGAIR]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 28 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 8 address bits + 16 command bits + 4 checksum bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 9000µs pulse, 4500µs pause (identical to [[IRMP_-_english#NEC_.2B_extended_NEC|NEC]])&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 560µs pulse,  560µs pause (identical to [[IRMP_-_english#NEC_.2B_extended_NEC|NEC]])&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 560µs pulse, 1690µs pause (identical to [[IRMP_-_english#NEC_.2B_extended_NEC|NEC]])&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 560µs pulse (identical to [[IRMP_-_english#NEC_.2B_extended_NEC|NEC]])&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || unknown&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first (&#039;&#039;&#039;differs&#039;&#039;&#039; from [[IRMP_-_english#NEC_.2B_extended_NEC|NEC]])&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SAMSUNG ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#SAMSUNG Protocol|SAMSUNG]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || ?? kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 16 data(1) bits + 1 sync bit + 20 data(2)-bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data(1) || 16 address bits&lt;br /&gt;
|-&lt;br /&gt;
| Data(2) || 4 ID bits + 8 command bits + 8 inverted command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 4500µs pulse, 4500µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 550µs pulse, 550µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 550µs pulse, 1650µs pause&lt;br /&gt;
|-&lt;br /&gt;
| sync bit || 550µs pulse, 4500µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 550µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after approx. 100ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SAMSUNG32 ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;SAMSUNG32&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 32 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 16 address bits + 16 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 4500µs pulse, 4500µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 550µs pulse,  550µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 550µs pulse, 1650µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 550µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after approx. 47msec&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SAMSUNG48 ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;SAMSUNG48&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 48 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 16 address bits + 32 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Command || 8 bits + 8 inverted bits + 8 bits + 8 inverted bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 4500µs pulse, 4500µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 550µs pulse,  550µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 550µs pulse, 1650µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 550µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || one after approx. 5 msec&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after approx. 45 msec&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== MATSUSHITA ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#MATSUHITA Protocol|MATSUSHITA]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 36 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance, timing identical to [[IRMP_-_english#TECHNICS|TECHNICS]]&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 24 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 6 customer bits + 6 command bits + 12 address bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 3488µs pulse, 3488µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 872µs pulse,  872µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 872µs pulse, 2616µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 872µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after 40ms pause&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first?&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== TECHNICS ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;TECHNICS&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 36 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance, timing identical to [[IRMP_-_english#MATSUSHITA|MATSUSHITA]]&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 22 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 11 command bits + 11 inverted command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 3488µs pulse, 3488µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 872µs pulse,  872µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 872µs pulse, 2616µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 872µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after 40ms pause&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first?&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== KASEIKYO ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#KASEIKYO_Protocol_.28.22Japan Protocol.22.29|KASEIKYO]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 48 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 16 customer bits + 4 parity bits + 4 genre1 bits + 4 genre2 bits + 10 command bits + 2 ID bits + 8 parity bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 3380µs pulse, 1690µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 423µs pulse,  423µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 423µs pulse, 1269µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 423µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after approx. 80ms pause&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first?&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== RECS80 ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#RECS80 and RECS80 Extended Protocol|RECS80]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bits + 10 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 1 toggle bit + 3 address bits + 6 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 158µs pulse, 7432µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 158µs pulse, 4902µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 158µs pulse, 7432µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 158µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after approx. 100ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== RECS80EXT ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#RECS80 and RECS80 Extended Protocol|RECS80EXT]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 2 start bits + 11 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 1 toggle bit + 4 address bits + 6 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 158µs pulse, 3637µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 158µs pulse, 4902µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 158µs pulse, 7432µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 158µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after approx. 100ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== DENON ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#Denon Protocol|DENON]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz (in practice, theoretically: 32 kHz)&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 0 start bits + 15 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 5 address bits + 10 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Command || 6 data bits + 2 extension bits + 2 data construction bits (normal: 00, inverted: 11)&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || none&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 310µs pulse, 745µs pause (in practice, theoretically: 275µs pulse, 775µs pause)&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 310µs pulse, 1780µs pause (in practice, theoretically: 275µs pulse, 1900µs pause)&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 310µs pulse (310µs pulse, 745µs pause (in practice, theoretically: 275µs pulse)&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || after 65ms with inverted command bits (data construction bits = 11)&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || both frames after 65ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== APPLE ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;APPLE&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 32 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 16 address bits + 11100000 + 8 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || see [[IRMP_-_english#NEC_+_extended_NEC|NEC]]&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || see [[IRMP_-_english#NEC_+_extended_NEC|NEC]]&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || see [[IRMP_-_english#NEC_+_extended_NEC|NEC]]&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || see [[IRMP_-_english#NEC_+_extended_NEC|NEC]]&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after approx. 100ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== BOSE ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;BOSE&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 16 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 0 address bits + 8 command bits + 8 inverted command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 1060µs pulse, 1425µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 550µs pulse,  437µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 550µs pulse, 1425µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 550µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || unknown&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== B&amp;amp;O ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#Bang &amp;amp; Olufsen|B&amp;amp;O]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 455 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 4 start bits + 16 data bits + 1 trailer bit + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 0 address bits + 16 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit 1 || 200µs pulse, 2925µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Start bit 2 || 200µs pulse, 2925µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Start bit 3 || 200µs pulse, 15425µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Start bit 4 || 200µs pulse, 2925µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 200µs pulse, 2925µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 200µs pulse, 9175µs pause&lt;br /&gt;
|-&lt;br /&gt;
| R bit || 200µs pulse, 6050µs pause, repeats the last bit&lt;br /&gt;
|-&lt;br /&gt;
| Trailer bit || 200µs pulse, 12300µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 200µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after approx. 100ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== FDC ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;FDC&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 40 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 8 address bits + 12 x 0 bits + 4 press/release bits + 8 command bits + 8 inverted command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 2085µs pulse, 966µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 300µs pulse,  220µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 300µs pulse, 715µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 300µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Press Key || press/release bits = 0000&lt;br /&gt;
|-&lt;br /&gt;
| Release Key || press/release bits = 1111&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after pause of approx. 60ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Nikon ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;Nikon&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 2 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 2 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 2200µs pulse, 27100µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 500µs pulse,  1500µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 500µs pulse, 3500µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 500µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || unknown&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== PANASONIC ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;PANASONIC&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 56 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 24 bits (010000000000010000000001) + 16 address bits + 16 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 3600µs pulse, 1600µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 565µs pulse,  316µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 565µs pulse, 1140µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 565µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || unknown&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first?&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== PENTAX ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;PENTAX&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 6 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 6 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 2200µs pulse, 27100µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 1000µs pulse,  1000µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 1000µs pulse, 3000µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 1000µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || unknown&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== KATHREIN ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;KATHREIN&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 11 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 4 address bits + 7 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 210µs pulse, 6218µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 210µs pulse,  1400µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 210µs pulse, 3000µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 210µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after 35ms?&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== LEGO ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#LEGO Power Functions RC|LEGO]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 16 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 12 command bits + 4 crc bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 158µs pulse, 1026µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 158µs pulse,  263µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 158µs pulse, 553µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 158µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || unknown&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== VINCENT ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#VINCENT|VINCENT]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 32 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 16 address bits + 8 command bits + 8 repeated command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 2500µs pulse, 4600µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 550µs pulse,  550µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 550µs pulse, 1540µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 550µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || unknown&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first?&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== THOMSON ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;THOMSON&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 33 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 0 start bits + 12 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 4 address bits + 1 toggle bit + 7 command bits&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 550µs pulse,  2000µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 550µs pulse, 4500µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 550µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after 35ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first?&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== TELEFUNKEN ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;TELEFUNKEN&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 15 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 0 address bits + 15 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 600µs pulse, 1500µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 600µs pulse, 600µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 600µs pulse, 1500µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 600µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || unknown&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first?&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== RCCAR ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;RCCAR&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 13 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 13 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 2000µs pulse, 2000µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 600µs pulse,  900µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 600µs pulse, 450µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 600µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after 40ms?&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== RCMM ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#RCMM_Protocol|RCMM]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 36 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame RCMM32 || 1 start bit + 32 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Frame RCMM24 || 1 start bit + 24 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Frame RCMM12 || 1 start bit + 12 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data RCMM32 || 16 address bits (= 4 mode bits + 12 device bits) + 1 toggle bit + 15 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Data RCMM24 || 16 address bits (= 4 mode bits + 12 device bits) + 1 toggle bit + 7 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Data RCMM12 || 4 address bits (= 2 mode bits + 2 device bits) + 8 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 500µs pulse, 220µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 00 bits || 230µs pulse, 220µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 01 bits || 230µs pulse, 380µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 10 bits || 230µs pulse, 550µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 11 bits || 230µs pulse, 720µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 230µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after 80ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width: 80%;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 20%;&amp;quot; |&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
=== Pulse Width Protocols ===&lt;br /&gt;
||&lt;br /&gt;
[[Datei:Pulse-Width.png|miniatur|Pulse Width Coding]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SIRCS ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#SIRCS_Protocol|SIRCS]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|Frequency ||40 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse width&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 12-20 data bits, no stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 7 command bits + 5 address bits + up to 8 additional bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 2400µs pulse, 600µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 600µs pulse, 600µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 1200µs pulse, 600µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || twice after approx. 25ms, that means: 2nd and 3rd frame&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || starting with 4th identical frame, distance approx. 25ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width: 80%;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 20%;&amp;quot; |&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
=== Pulse distance Width Protocols ===&lt;br /&gt;
||&lt;br /&gt;
[[Datei:Pulse-Distance-Width.png|miniatur|Pulse Distance Width Coding]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== NUBERT ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;NUBERT&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 36 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance width&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 10 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 0 address bits + 10 command bits ?&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 1340µs pulse, 340µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 500µs pulse, 1300µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 1340µs pulse, 340µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 500µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || once after 35ms&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || 3rd, 5th, 7th etc. indentical frame&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first?&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== FAN ====&lt;br /&gt;
&lt;br /&gt;
This protocol is very similar to [[IRMP_-_english#NUBERT|NUBERT]], but here it will be sent only one frame. Additionally there are 11 instead of 10 data bits and no stop bit. The pause time between frame repetitions is substantial lower.&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;FAN &#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 36 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance width&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 11 data bits + 0 stop bits&lt;br /&gt;
|-&lt;br /&gt;
| Data || 0 address bits + 11 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 1280µs pulse, 380µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 380µs pulse, 1280µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 1280µs pulse, 380µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 500µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after 6.6ms pause&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SPEAKER ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;SPEAKER&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance width&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 10 data bits + 1 stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 0 address bits + 10 command bits ?&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 440µs pulse, 1250µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 440µs pulse, 1250µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 1250µs pulse, 440µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || 440µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || once after approx. 38ms&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || 3rd, 5th, 7th ... identical frame&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first?&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== ROOMBA ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;ROOMBA&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse distance width&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 7 data bits + 0 stop bits&lt;br /&gt;
|-&lt;br /&gt;
| Data || 0 address bits + 7 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 2790µs pulse, 930µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 930µs pulse, 2790µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 2790µs pulse, 930µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || no stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || 3 times after 18ms?&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || unknown&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width: 80%;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 20%;&amp;quot; |&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
=== Biphase Protocols ===&lt;br /&gt;
||&lt;br /&gt;
[[Datei:Biphase-Coding.png|miniatur|Biphase Coding]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== RC5 + RC5X ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#RC5 and RC5x Protocol|RC5 + RC5X]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 36 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || Biphase (Manchester)&lt;br /&gt;
|-&lt;br /&gt;
| Frame RC5 || 2 start bits + 12 data bits + 0 stop bits&lt;br /&gt;
|-&lt;br /&gt;
| Data RC5 || 1 toggle bit + 5 address bits + 6 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Frame RC5X || 1 start bit + 13 data bits + 0 stop bits&lt;br /&gt;
|-&lt;br /&gt;
| Data RC5X || 1 inverteds command bit + 1 toggle bit + 5 address bits + 6 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 889µs pause, 889µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 889µs pulse, 889µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 889µs pause, 889µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || no stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after approx. 100ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== RCII ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;RCII&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 31.25 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || Biphase (Manchester)&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 pre bit + 1 start bit + 9 data bits + 0 stop bits&lt;br /&gt;
|-&lt;br /&gt;
| Data || 0 address bits + 9 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Pre Bit || 512µs pulse, 2560µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 1024µs pulse, &#039;&#039;&#039;no space&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 512µs pause, 512µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 512µs pulse, 512µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || no stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after approx. 118ms&lt;br /&gt;
|-&lt;br /&gt;
| Remarks || An end command (111111111 = 0x1FF) is sent immediately after the button is released.&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== S100 ====&lt;br /&gt;
&lt;br /&gt;
Similar to RC5x, but 14 instead of 13 data bits and 56kHz modulation&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;S100&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 56 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || Biphase (Manchester)&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 14 data bits + 0 stop bits&lt;br /&gt;
|-&lt;br /&gt;
| Data || 1 inverted command bit + 1 toggle bit + 5 address bits + 7 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 889µs pause, 889µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 889µs pulse, 889µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 889µs pause, 889µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || no stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after approx. 100ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== RC6 + RC6A ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#RC6 and RC6A Protocol|RC6 + RC6A]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 36 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || Biphase (Manchester)&lt;br /&gt;
|-&lt;br /&gt;
| Frame RC6 || 1 start bit + 1 bit &amp;quot;1&amp;quot; + 3 mode bits (&amp;quot;000&amp;quot;) + 1 toggle bit + 16 data 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 (&amp;quot;110&amp;quot;) + 1 toggle bit + 31 data bits + 2666µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Data RC6 || 8 address bits + 8 Command Bits&lt;br /&gt;
|-&lt;br /&gt;
| Data RC6A || &amp;quot;1&amp;quot; + 14 customer bits + 8 system bits + 8 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Data RC6A Pace (Sky) || &amp;quot;1&amp;quot; + 3 mode bits (&amp;quot;110&amp;quot;) + 1 toggle bit (UNUSED &amp;quot;0&amp;quot;) + 16 bits + 1 toggle(!) + 15 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 2666µs pulse, 889µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Toggle 0 bit || 889µs pause, 889µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| Toggle 1 bit || 889µs pulse, 889µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 444µs pause, 444µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 444µs pulse, 444µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || no stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after approx. 100ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== GRUNDIG + NOKIA ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#Grundig Protocol|GRUNDIG + NOKIA]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz (?)&lt;br /&gt;
|-&lt;br /&gt;
| Coding || Biphase (Manchester)&lt;br /&gt;
|-&lt;br /&gt;
| Frame packet || 1 start frame + 19.968ms pause + N data frames + 117.76ms pause + 1 stop frame&lt;br /&gt;
|-&lt;br /&gt;
| Start frame || 1 pre bit + 1 start bit + 9 data bits (all 1) + 0 stop bits&lt;br /&gt;
|-&lt;br /&gt;
| Data frame || 1 pre bit + 1 start bit + 9 data bits + 0 stop bits&lt;br /&gt;
|-&lt;br /&gt;
| Stop frame || 1 pre bit + 1 start bit + 9 data bits (all 1) + 0 stop bits&lt;br /&gt;
|-&lt;br /&gt;
| Data Grundig || 9 command bits + 0 address bits&lt;br /&gt;
|-&lt;br /&gt;
| Data Nokia || 8 command bits + 8 address bits&lt;br /&gt;
|-&lt;br /&gt;
| Pre bit || 528µs pulse, 2639µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 528µs pulse, 528µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 528µs pause, 528µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 528µs pulse, 528µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || no stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after approx. 117.76ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== IR60 (SDA2008) ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP_-_english#IR60_.28SDA2008_and_MC14497P.29|IR60]]&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 30 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || Biphase (Manchester)&lt;br /&gt;
|-&lt;br /&gt;
| Start frame || 1 start bit + 101111 + 0 stop bits + 22ms pause&lt;br /&gt;
|-&lt;br /&gt;
| Data frame || 1 start bit + 7 data bits + 0 stop bits&lt;br /&gt;
|-&lt;br /&gt;
| Data || 0 address bits + 7 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 528µs pulse, 2639µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 528µs pause, 528µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 528µs pulse, 528µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || no stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after approx. 117.76ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SIEMENS + RUWIDO ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;SIEMENS + RUWIDO&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 36 kHz? (Merlin keyboard with Ruwido protocol: 56 kHz)&lt;br /&gt;
|-&lt;br /&gt;
| Coding || Biphase (Manchester)&lt;br /&gt;
|-&lt;br /&gt;
| Frame Siemens || 1 start bit + 22 data bits + 0 stop bits&lt;br /&gt;
|-&lt;br /&gt;
| Frame Ruwido || 1 start bit + 17 data bits + 0 stop bits&lt;br /&gt;
|-&lt;br /&gt;
| Data Siemens || 11 address bits + 10 command bits + 1 inverted bit (preceding bit inverted)&lt;br /&gt;
|-&lt;br /&gt;
| Data Ruwido || 9 address bits + 7 command bits + 1 inverted bit (preceding bit inverted)&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 275µs pulse, 275µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 275µs pause, 275µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 275µs pulse, 275µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || no stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || once with repeat bit set (?)&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after approx. 100ms (?)&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== A1TVBOX ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;A1TVBOX&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || Biphase (Manchester) asymmetric&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 2 start bits + 16 data bits + 0 stop bits&lt;br /&gt;
|-&lt;br /&gt;
| Data || 8 address bits + 8 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bits || &amp;quot;10&amp;quot;, also 250µs pulse, 150µs + 150µs pause, 250µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 150µs pause, 250µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 250µs pulse, 150µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || no stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || unknown&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== MERLIN ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;MERLIN&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 56 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Coding || Biphase (Manchester) asymmetric&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 2 start bits + 18 data bits + 0 stop bits&lt;br /&gt;
|-&lt;br /&gt;
| Data || 8 address bits + 10 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bits || &amp;quot;10&amp;quot;, also 210µs pulse, 210µs + 210µs pause, 210µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 210µs pause, 210µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 210µs pulse, 210µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || no stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || unknown&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== ORTEK ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;ORTEK&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || Biphase (Manchester) symmetric&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 2 start bits + 18 data bits + 0 stop bits&lt;br /&gt;
|-&lt;br /&gt;
| Data || 6 address bits + 2 special bits +  6 command bits + 4 special bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 2000µs pulse, 1000µs pause&lt;br /&gt;
|-&lt;br /&gt;
| 0 bit || 500µs pause, 500µs pulse&lt;br /&gt;
|-&lt;br /&gt;
| 1 bit || 500µs pulse, 500µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop bit || no stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || 2 additional frames with special bits set&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || only repeats the 2nd frame&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Pulse Position Protocols ===&lt;br /&gt;
&lt;br /&gt;
==== NETBOX ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;NETBOX&#039;&#039;&#039; || Value&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequency || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Coding || pulse position&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 start bit + 16 data bits, no stop bit&lt;br /&gt;
|-&lt;br /&gt;
| Data || 3 address bits + 13 command bits&lt;br /&gt;
|-&lt;br /&gt;
| Start bit || 2400µs pulse, 800µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Bit Length || 800µs&lt;br /&gt;
|-&lt;br /&gt;
| Repetition || none&lt;br /&gt;
|-&lt;br /&gt;
| Key repeat || after approx. 35ms?&lt;br /&gt;
|-&lt;br /&gt;
| Bit order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Software History ==&lt;br /&gt;
&lt;br /&gt;
=== Changes of IRMP in 3.2.x === &lt;br /&gt;
&lt;br /&gt;
Version 3.2.6:&lt;br /&gt;
&lt;br /&gt;
* 2021-01-27: &#039;&#039;&#039;New IR Protocol:&#039;&#039;&#039; [[IRMP#MELINERA|MELINERA]]&lt;br /&gt;
* 2021-01-27: Protocol [[IRMP#LEGO|LEGO]]: Improved timing&lt;br /&gt;
* 2021-01-27: Protocol [[IRMP#RUWIDO|RUWIDO]]: Improved timing&lt;br /&gt;
* 2021-01-27: Protocol [[IRMP#NEC|NEC]]: Implemented send of raw NEC repetition frames &lt;br /&gt;
&lt;br /&gt;
Version 3.2.3:&lt;br /&gt;
&lt;br /&gt;
* 2020-08-15: &#039;&#039;&#039;New RF Protocol:&#039;&#039;&#039; [[IRMP#RF_MEDION|RF_MEDION]]&lt;br /&gt;
&lt;br /&gt;
Version 3.2.2:&lt;br /&gt;
&lt;br /&gt;
* 2020-07-09: Additional recognition of the radio channels with the RF_X10 protocol&lt;br /&gt;
* 2020-07-09: Improved RF frame detection with new stop bit handling.&lt;br /&gt;
* 2020-07-09: Improved detection of RF_GEN24 protocols&lt;br /&gt;
* 2020-07-09: &amp;lt;span style=&amp;quot;color:#FF0000&amp;quot;&amp;gt;&#039;&#039;&#039;NEU:&#039;&#039;&#039;&amp;lt;/span&amp;gt; Detection if/when a remote control button is released, see chapter &#039;&#039;&#039;[[IRMP_-_english#Debouncing|Debouncing]]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Version 3.2.1:&lt;br /&gt;
&lt;br /&gt;
* 2020-06-22: Mini bugfix&lt;br /&gt;
&lt;br /&gt;
Version 3.2.0:&lt;br /&gt;
&lt;br /&gt;
* 2020-06-22: Support of 433MHz RF modules&lt;br /&gt;
* 2020-06-22: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP#RF_GEN24|RF_GEN24]]&lt;br /&gt;
* 2020-06-22: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP#X10|X10]]&lt;br /&gt;
&lt;br /&gt;
=== Older Versions ===&lt;br /&gt;
&lt;br /&gt;
* 2019-08-26: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: METZ&lt;br /&gt;
* 2019-08-26: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: ONKYO&lt;br /&gt;
* 2018-09-10: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP#RCII|RCII]]&lt;br /&gt;
* 2018-09-06: Added support of STM32 mit HAL-Library&lt;br /&gt;
* 2018-08-30: New option: IRMP_USE_IDLE_CALL&lt;br /&gt;
* 2018-08-29: Port to ChibiOS&lt;br /&gt;
* 2018-08-29: New protocol: GREE&lt;br /&gt;
* 2018-02-19: corrected handling of irmp_flags for invalid frames&lt;br /&gt;
* 2017-08-25: New protocol: IRMP16 for transparent 16 bit data communication&lt;br /&gt;
* 2016-11-18: Corrected buffer overflow in irmp-main-avr-uart.c&lt;br /&gt;
* 2016-09-19: New protocol [[IRMP#VINCENT|VINCENT]]&lt;br /&gt;
* 2016-09-09: New protocol [[IRMP#MITSU_HEAVY|Mitsubishi Heavy (air conditioner)]]&lt;br /&gt;
* 2016-09-09: Some modifications for Compiler PIC C18&lt;br /&gt;
* 2016-01-16: Some corrections of port to ESP8266&lt;br /&gt;
* 2016-01-16: Added port to MBED&lt;br /&gt;
* 2016-01-16: Added several hardware dependent example main source files&lt;br /&gt;
* 2015-11-17: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#PANASONIC|PANASONIC (Beamer)]]&lt;br /&gt;
* 2015-11-17: Port to ESP8266&lt;br /&gt;
* 2015-11-17: Port to Teensy (3.x)&lt;br /&gt;
* 2015-11-10: Added support for STM8 microcontroller&lt;br /&gt;
* 2015-09-20: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#TECHNICS|TECHNICS]]&lt;br /&gt;
* 2015-06-15: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#ACP24|ACP24]]&lt;br /&gt;
* 2015-05-29: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#S100|S100]]&lt;br /&gt;
* 2015-05-29: Some smaller corrections&lt;br /&gt;
* 2015-05-28: Added Logging for XMega&lt;br /&gt;
* 2015-05-28: Timing corrections  for FAN protocol&lt;br /&gt;
* 2015-05-27: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#MERLIN|MERLIN]]&lt;br /&gt;
* 2015-05-27: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#FAN|FAN]]&lt;br /&gt;
* 2015-05-18: Added F_CPU macro for STM32L1XX&lt;br /&gt;
* 2015-05-18: Some corrections for XMega port&lt;br /&gt;
* 2015-04-23: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#PENTAX|PENTAX]]&lt;br /&gt;
* 2015-04-23: Port to AVR XMega&lt;br /&gt;
* 2014-09-19: Bugfix: added missing newline before #else&lt;br /&gt;
* 2014-09-18: Added logging for ARM STM32F10X&lt;br /&gt;
* 2014-09-17: Corrected PROGMEM access to array irmp_protocol_names[].&lt;br /&gt;
* 2014-09-15: Changed timing tolerances for [[IRMP_-_english#KASEIKYO|KASEIKYO]] protocol&lt;br /&gt;
* 2014-09-15: Moved  irmp_protocol_names to flash, additional UART routines in irmp-main-avr-uart.c&lt;br /&gt;
* 2014-07-21: Port to PIC 12F1840&lt;br /&gt;
* 2014-07-09: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#SAMSUNG48|SAMSUNG48]]&lt;br /&gt;
* 2014-07-09: Some small corrections&lt;br /&gt;
* 2014-07-01: Added logging for ARM_STM32F4XX&lt;br /&gt;
* 2014-07-01: IRMP port for PIC XC8 compiler, removed variadic macros because of stupid XC8 compiler :-(&lt;br /&gt;
* 2014-06-05: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#LGAIR|LGAIR]]&lt;br /&gt;
* 2014-05-30: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#SPEAKER|SPEAKER]]&lt;br /&gt;
* 2014-05-30: Optimized timings for [[IRMP_-_english#SAMSUNG|SAMSUNG]] protocol&lt;br /&gt;
* 2014-02-20: Corrected decoding of [[IRMP_-_english#SIEMENS_+_RUWIDO|SIEMENS]] protocol&lt;br /&gt;
* 2014-02-19: &#039;&#039;&#039;New protocols&#039;&#039;&#039;: [[IRMP_-_english#RCMM|RCMM32, RCMM24 and RCMM12]]&lt;br /&gt;
* 2014-09-17: Optimized timing for [[IRMP_-_english#ROOMBA|ROOMBA]]&lt;br /&gt;
* 2013-04-09: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#ROOMBA|ROOMBA]]&lt;br /&gt;
* 2013-04-09: Optimized detection of [[IRMP_-_english#ORTEK|ORTEK (Hama)]] frames&lt;br /&gt;
* 2013-03-19: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#ORTEK|ORTEK (Hama)]]&lt;br /&gt;
* 2013-03-19: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#TELEFUNKEN|TELEFUNKEN]]&lt;br /&gt;
* 2013-03-12: Changed timing tolerancies for [[IRMP_-_english#RECS80|RECS80]]- and  [[IRMP_-_english#RECS80EXT|RECS80EXT]] protocol&lt;br /&gt;
* 2013-01-21: Corrected detection of repetition frame beim [[IRMP_-_english#DENON|DENON]] protocol&lt;br /&gt;
* 2013-01-17: Corrected frame detection beim [[IRMP_-_english#DENON|DENON]] protocol&lt;br /&gt;
* 2012-12-11: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#A1TVBOX|A1TVBOX]]&lt;br /&gt;
* 2012-12-07: Improved detection von [[IRMP_-_english#DENON|DENON]] repetition frame&lt;br /&gt;
* 2012-11-19: Port to Stellaris LM4F120 TI Launchpad (ARM Cortex M4)&lt;br /&gt;
* 2012-11-06: Corrected [[IRMP_-_english#DENON|DENON]] frame detection&lt;br /&gt;
* 2012-10-26: Some timer corrections and adaptations for Arduino&lt;br /&gt;
* 2012-07-11: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#BOSE|BOSE]]&lt;br /&gt;
* 2012-06-18: Added support for ATtiny87/167&lt;br /&gt;
* 2012-06-05: Some smaller corrections of port to ARM STM32&lt;br /&gt;
* 2012-06-05: Correction of include in [http://www.mikrocontroller.net/svnbrowser/irmp/irmpextlog.c?view=markup irmpextlog.c]&lt;br /&gt;
* 2012-06-05: Bugfix, if only [[IRMP_-_english#NEC_+_extended_NEC|NEC]] and [[IRMP_-_english#NEC42|NEC42]] activated&lt;br /&gt;
* 2012-05-23: Port to ARM STM32&lt;br /&gt;
* 2012-05-23: Bugfix frame detection for [[IRMP_-_english#DENON|DENON]] protocol&lt;br /&gt;
* 2012-02-27: Bugfix in IR60-Decoder&lt;br /&gt;
* 2012-02-27: Bugfix in CRC calculation of  [[IRMP_-_english#KASEIKYO|KASEIKYO]] frames&lt;br /&gt;
* 2012-02-27: Port to C18 Compiler for PIC microcontrollers&lt;br /&gt;
* 2012-02-13: Bugfix: most significant bit in Address wrong in [[IRMP_-_english#NEC_+_extended_NEC|NEC]] protocol, if [[IRMP_-_english#NEC42|NEC42]] protocol activated, too&lt;br /&gt;
* 2012-02-13: Corrected timing of [[IRMP_-_english#SAMSUNG|SAMSUNG]]- and [[IRMP_-_english#SAMSUNG32|SAMSUNG32]] protocol&lt;br /&gt;
* 2012-02-13: [[IRMP_-_english#KASEIKYO|KASEIKYO]]: Genre2 bits will be now stored in upper nibble of flags&lt;br /&gt;
* 2011-09-20: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#KATHREIN|KATHREIN]]&lt;br /&gt;
* 2011-09-20: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#SIEMENS_+_RUWIDO|RUWIDO]]&lt;br /&gt;
* 2011-09-20: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#THOMSON|THOMSON]]&lt;br /&gt;
* 2011-09-20: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#IR60 (SDA2008)|IR60 (SDA2008)]]&lt;br /&gt;
* 2011-09-20: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#LEGO|LEGO]]&lt;br /&gt;
* 2011-09-20: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#NEC16|NEC16]]&lt;br /&gt;
* 2011-09-20: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#NEC42|NEC42]]&lt;br /&gt;
* 2011-09-20: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#NETBOX|NETBOX]]&lt;br /&gt;
* 2011-09-20: Port to ATtiny84 and ATtiny85&lt;br /&gt;
* 2011-09-20: Improved key repetition detection in [[IRMP_-_english#RC5_+_RC5X|RC5]] protocol&lt;br /&gt;
* 2011-09-20: Improved decoding of [[IRMP_-_english#Biphase|Biphase]] protocols&lt;br /&gt;
* 2011-09-20: Fixed some smaller bugs in [[IRMP_-_english#RECS80|RECS80]] decoder&lt;br /&gt;
* 2011-09-20: Corrected detection of additional bits in SIRCS protocol&lt;br /&gt;
* 2011-01-18: Some corrections for [[IRMP_-_english#SIEMENS_+_RUWIDO|SIEMENS]] protocol&lt;br /&gt;
* 2011-01-18: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#Nikon|Nikon]]&lt;br /&gt;
* 2011-01-18: [[IRMP_-_english#SIRCS|SIRCS]]: additional bits (&amp;gt;12) will be stored in address&lt;br /&gt;
* 2011-01-18: Some timing corrections for [[IRMP_-_english#DENON|DENON]] protocol&lt;br /&gt;
* 2010-09-04: Bugfix for F_INTERRUPTS &amp;gt;= 16000&lt;br /&gt;
* 2010-09-02: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#RC6_+_RC6A|RC6A]]&lt;br /&gt;
* 2010-08-29: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#JVC|JVC]]&lt;br /&gt;
* 2010-08-29: [[IRMP_-_english#KASEIKYO|KASEIKYO]] protocol: genre bits will be now stored&lt;br /&gt;
* 2010-08-29: [[IRMP_-_english#KASEIKYO|KASEIKYO]] protocol: Improved handling of repetition frames&lt;br /&gt;
* 2010-08-29: Improved support of [[IRMP_-_english#APPLE|APPLE]] protocols.&lt;br /&gt;
* 2010-07-01: Bugfix: added a timeout for [[IRMP_-_english#NEC_+_extended_NEC|NEC]] repetition frames. This avoids &#039;ghost commands&#039;.&lt;br /&gt;
* 2010-06-26: Bugfix: deactivated [[IRMP_-_english#RECS80|RECS80]], [[IRMP_-_english#RECS80EXT|RECS80EXT]] &amp;amp; [[IRMP_-_english#SIEMENS_+_RUWIDO|SIEMENS]] if interrupts frequency is low&lt;br /&gt;
* 2010-06-25: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#RCCAR|RCCAR]]&lt;br /&gt;
* 2010-06-25: Extended keyboard detection for [[IRMP_-_english#FDC|FDC]] protocol (IR keyboard)&lt;br /&gt;
* 2010-06-25: Interrupt frequency now up to 20kHz possible&lt;br /&gt;
* 2010-06-09: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#FDC|FDC]] (IR-keyboard)&lt;br /&gt;
* 2010-06-09: Corrected timing for [[IRMP_-_english#DENON|DENON]] protocol&lt;br /&gt;
* 2010-06-02: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#SIEMENS_+_RUWIDO|SIEMENS]] (Gigaset)&lt;br /&gt;
* 2010-05-26: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#GRUNDIG_+_NOKIA|NOKIA]]&lt;br /&gt;
* 2010-05-26: Bugfix: detection of long keyboard press for [[IRMP_-_english#GRUNDIG_+_NOKIA|GRUNDIG]] protocol&lt;br /&gt;
* 2010-05-17: Bugfix [[IRMP_-_english#SAMSUNG32|SAMSUNG32]] protocol: corrected command bit mask&lt;br /&gt;
* 2010-05-16: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#GRUNDIG_+_NOKIA|GRUNDIG]]&lt;br /&gt;
* 2010-05-16: Improved handling of automatic frame repetitions for [[IRMP_-_english#SIRCS|SIRCS]]-, [[IRMP_-_english#SAMSUNG32|SAMSUNG32]]-, and [[IRMP_-_english#NUBERT|NUBERT]] protocol&lt;br /&gt;
* 2010-04-28: Only some cosmetic code optimizations&lt;br /&gt;
* 2010-04-16: Improved all timing tolerancies&lt;br /&gt;
* 2010-04-12: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#B&amp;amp;O|Bang &amp;amp; Olufsen]]&lt;br /&gt;
* 2010-03-29: Bugfix: detection of multiple [[IRMP_-_english#NEC_+_extended_NEC|NEC]] repetition frames&lt;br /&gt;
* 2010-03-29: Moved configuration data to  [http://www.mikrocontroller.net/svnbrowser/irmp/irmpconfig.h?view=markup irmpconfig.h]&lt;br /&gt;
* 2010-03-29: Introduced a program version in README.txt: Version 1.0&lt;br /&gt;
* 2010-03-17: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#NUBERT|NUBERT]]&lt;br /&gt;
* 2010-03-16: Correction of RECS80 start bit timings&lt;br /&gt;
* 2010-03-16: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#RECS80EXT|RECS80 Extended]]&lt;br /&gt;
* 2010-03-15: Some optimizations&lt;br /&gt;
* 2010-03-14: Port to PIC&lt;br /&gt;
* 2010-03-11: Some adjustements for some ATMegas&lt;br /&gt;
* 2010-03-07: Bugfix: Reset of state machine after a incomplete [[IRMP_-_english#RC5_+_RC5X|RC5]] frame&lt;br /&gt;
* 2010-03-05: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#APPLE|APPLE]]&lt;br /&gt;
* 2010-03-05: Data  irmp_data.addr + irmp_data.command will be now stored in the bit order of the appropriate protocol&lt;br /&gt;
* 2010-03-04: &#039;&#039;&#039;New protocol&#039;&#039;&#039;: [[IRMP_-_english#SAMSUNG32|SAMSUNG32]] (Mix aus [[IRMP_-_english#SAMSUNG|SAMSUNG]] &amp;amp; [[IRMP_-_english#NEC_+_extended_NEC|NEC]] protocol)&lt;br /&gt;
* 2010-03-04: Changed some timer tolerances changes of [[IRMP_-_english#SIRCS|SIRCS]]- and [[IRMP_-_english#KASEIKYO|KASEIKYO]]&lt;br /&gt;
* 2010-03-02: [[IRMP_-_english#SIRCS|SIRCS]]: corrected detection and suppression of automatic frame repetitions&lt;br /&gt;
* 2010-03-02: [[IRMP_-_english#SIRCS|SIRCS]]: device ID bits will be now stored in irmp_data.command (not irmp_data.address anymore)&lt;br /&gt;
* 2010-03-02: Enlargement of scan buffers (for logging)&lt;br /&gt;
* 2010-02-24: New variable flags in IRMP_DATA for detection of long key press&lt;br /&gt;
* 2010-02-20: Bugfix [[IRMP_-_english#DENON|DENON]] protocol: repetition frame is now basically inverted&lt;br /&gt;
* 2010-02-19: Detection of [[IRMP_-_english#NEC_+_extended_NEC|NEC]] protocol-Varianten, z.&amp;amp;nbsp;B. [[IRMP_-_english#APPLE|APPLE]]-Fernbedienung&lt;br /&gt;
* 2010-02-19: Detection of [[IRMP_-_english#RC6_+_RC6A|RC6]]- and [[IRMP_-_english#DENON|DENON]] protocol&lt;br /&gt;
* 2010-02-19: Some improvements for [[IRMP_-_english#RC5_+_RC5X|RC5]] decoders (Bugfixes)&lt;br /&gt;
* 2010-02-13: Bugfix: Puls/Pause counters were 1 too low, now better detection of protokols with very short pulses&lt;br /&gt;
* 2010-02-13: Improved detection of [[IRMP_-_english#NEC_+_extended_NEC|NEC]] repetition frames&lt;br /&gt;
* 2010-02-12: New: [[IRMP_-_english#RC5_+_RC5X|RC5]] protocol&lt;br /&gt;
* 2010-02-05: Eliminated a conflict between [[IRMP_-_english#SAMSUNG|SAMSUNG]]- and [[IRMP_-_english#MATSUSHITA|MATSUSHITA]] protocol&lt;br /&gt;
* 2010-01-07: First version&lt;br /&gt;
&lt;br /&gt;
== Literature ==&lt;br /&gt;
&lt;br /&gt;
=== IR Abstract ===&lt;br /&gt;
&lt;br /&gt;
* http://www.sbprojects.net/knowledge/ir/index.php&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&lt;br /&gt;
* http://mc.mikrocontroller.com/de/IR-Protokolle.php&lt;br /&gt;
&lt;br /&gt;
=== SIRCS Protocol ===&lt;br /&gt;
&lt;br /&gt;
* http://www.sbprojects.net/knowledge/ir/sirc.php&lt;br /&gt;
* http://mc.mikrocontroller.com/de/IR-Protokolle.php#SIRCS&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;
* http://www.celadon.com/infrared_protocol/infrared_protocols_samples.pdf&lt;br /&gt;
&lt;br /&gt;
=== NEC Protocol ===&lt;br /&gt;
&lt;br /&gt;
* http://www.sbprojects.net/knowledge/ir/nec.php&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;
=== ACP24 Protocol ===&lt;br /&gt;
&lt;br /&gt;
The ACP24-Protocol is used by Stiebel-Eltron-Aircons&lt;br /&gt;
&lt;br /&gt;
The structure of the 70 databits is :&lt;br /&gt;
&lt;br /&gt;
              1         2         3         4         5         6&lt;br /&gt;
    0123456789012345678901234567890123456789012345678901234567890123456789&lt;br /&gt;
    N VVMMM    ? ???    t vmA x                 y                     TTTT&lt;br /&gt;
    0011001000000111000010001010000000000000000010000000000000000000001111on, temp=30&lt;br /&gt;
&lt;br /&gt;
These are converted into the following 16 bits from irmp_data.command:&lt;br /&gt;
&lt;br /&gt;
        5432109876543210&lt;br /&gt;
        NAVVvMMMmtxyTTTT&lt;br /&gt;
&lt;br /&gt;
Meaning of the symbols:&lt;br /&gt;
&lt;br /&gt;
    TTTT = Temperature + 15 degree&lt;br /&gt;
            TTTT&lt;br /&gt;
            ----------&lt;br /&gt;
            0000        ???&lt;br /&gt;
            0001        ???&lt;br /&gt;
            0010        ???&lt;br /&gt;
            0011        18 degree&lt;br /&gt;
            0100        19 degree&lt;br /&gt;
            0101        20 degree&lt;br /&gt;
            0110        21 degree&lt;br /&gt;
            ...&lt;br /&gt;
            1111        30 degree&lt;br /&gt;
&lt;br /&gt;
    N    = Nightmode&lt;br /&gt;
            N&lt;br /&gt;
            ----------&lt;br /&gt;
            0           off&lt;br /&gt;
            1           on&lt;br /&gt;
&lt;br /&gt;
    VV   = fan, v must be 1!&lt;br /&gt;
            VV   v&lt;br /&gt;
            ----------&lt;br /&gt;
            00   1      level 1&lt;br /&gt;
            01   1      level 2&lt;br /&gt;
            10   1      level 3&lt;br /&gt;
            11   1      Automatic&lt;br /&gt;
&lt;br /&gt;
    MMM  = Mode&lt;br /&gt;
            MMM  m&lt;br /&gt;
            ----------&lt;br /&gt;
            000  0      turn off&lt;br /&gt;
            001  0      turn on&lt;br /&gt;
            001  1      cooling&lt;br /&gt;
            010  1      fan&lt;br /&gt;
            011  1      demist&lt;br /&gt;
            100  1      ???&lt;br /&gt;
            101  1      ---&lt;br /&gt;
            110  1      ---&lt;br /&gt;
            111  1      ---&lt;br /&gt;
&lt;br /&gt;
    A    = Automatic-Programm&lt;br /&gt;
            A&lt;br /&gt;
            ----------&lt;br /&gt;
            0           off&lt;br /&gt;
            1           on&lt;br /&gt;
&lt;br /&gt;
    t   = Timer&lt;br /&gt;
            t   x y&lt;br /&gt;
            ----------&lt;br /&gt;
            1   1 0     Timer 1&lt;br /&gt;
            1   0 1     Timer 2&lt;br /&gt;
&lt;br /&gt;
To control the air con via [[IRSND_-_english|IRSND]], the following functions can be used:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;irmp.h&amp;quot;&lt;br /&gt;
#include &amp;quot;irsnd.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#define IRMP_ACP24_TEMPERATURE_MASK         0x000F                                          // TTTT&lt;br /&gt;
&lt;br /&gt;
#define IRMP_ACP24_SET_TIMER_MASK           (1&amp;lt;&amp;lt;6)                                          // t&lt;br /&gt;
#define IRMP_ACP24_TIMER1_MASK              (1&amp;lt;&amp;lt;5)                                          // x&lt;br /&gt;
#define IRMP_ACP24_TIMER2_MASK              (1&amp;lt;&amp;lt;4)                                          // y&lt;br /&gt;
&lt;br /&gt;
#define IRMP_ACP24_SET_MODE_MASK            (1&amp;lt;&amp;lt;7)                                          // m&lt;br /&gt;
#define IRMP_ACP24_MODE_POWER_ON_MASK       (1&amp;lt;&amp;lt;8)                                          // MMMm = 0010 Einschalten&lt;br /&gt;
#define IRMP_ACP24_MODE_COOLING_MASK        (IRMP_ACP24_SET_MODE_MASK | (1&amp;lt;&amp;lt;8))             // MMMm = 0011 Kuehlen&lt;br /&gt;
#define IRMP_ACP24_MODE_VENTING_MASK        (IRMP_ACP24_SET_MODE_MASK | (1&amp;lt;&amp;lt;9))             // MMMm = 0101 Lueften&lt;br /&gt;
#define IRMP_ACP24_MODE_DEMISTING_MASK      (IRMP_ACP24_SET_MODE_MASK | (1&amp;lt;&amp;lt;10) | (1&amp;lt;&amp;lt;8))   // MMMm = 1001 Entfeuchten&lt;br /&gt;
&lt;br /&gt;
#define IRMP_ACP24_SET_FAN_STEP_MASK        (1&amp;lt;&amp;lt;11)                                         // v&lt;br /&gt;
#define IRMP_ACP24_FAN_STEP_MASK            0x3000                                          // VV&lt;br /&gt;
#define IRMP24_ACP_FAN_STEP_BIT             12                                              // VV&lt;br /&gt;
#define IRMP_ACP24_AUTOMATIC_MASK           (1&amp;lt;&amp;lt;14)                                         // A&lt;br /&gt;
#define IRMP_ACP24_NIGHT_MASK               (1&amp;lt;&amp;lt;15)                                         // N&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// possible values for acp24_set_mode();&lt;br /&gt;
#define ACP24_MODE_COOLING                  1&lt;br /&gt;
#define ACP24_MODE_VENTING                  2&lt;br /&gt;
#define ACP24_MODE_DEMISTING                3&lt;br /&gt;
&lt;br /&gt;
static uint8_t temperature = 18;                                                    // 18 degrees&lt;br /&gt;
&lt;br /&gt;
static void&lt;br /&gt;
acp24_send (uint16_t cmd)&lt;br /&gt;
{&lt;br /&gt;
    IRMP_DATA irmp_data;&lt;br /&gt;
&lt;br /&gt;
    cmd |=  (temperature - 15) &amp;amp; IRMP_ACP24_TEMPERATURE_MASK;&lt;br /&gt;
&lt;br /&gt;
    irmp_data.protocol = IRMP_ACP24_PROTOCOL;&lt;br /&gt;
    irmp_data.address  = 0x0000;&lt;br /&gt;
    irmp_data.command  = cmd;&lt;br /&gt;
    irmp_data.flags    = 0;&lt;br /&gt;
&lt;br /&gt;
    irsnd_send_data (&amp;amp;irmp_data, 1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void&lt;br /&gt;
acp24_set_temperature (uint8_t temp)&lt;br /&gt;
{&lt;br /&gt;
    uint16_t    cmd = IRMP_ACP24_MODE_POWER_ON_MASK;&lt;br /&gt;
&lt;br /&gt;
    temperature = temp;&lt;br /&gt;
    acp24_send (cmd);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void&lt;br /&gt;
acp24_off (void)&lt;br /&gt;
{&lt;br /&gt;
    uint16_t    cmd = 0;&lt;br /&gt;
    acp24_send (cmd);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#define ACP_FAN_STEP1       0&lt;br /&gt;
#define ACP_FAN_STEP2       1&lt;br /&gt;
#define ACP_FAN_STEP3       2&lt;br /&gt;
#define ACP_FAN_AUTOMATIC   3&lt;br /&gt;
&lt;br /&gt;
void&lt;br /&gt;
acp24_fan (uint8_t fan_step)&lt;br /&gt;
{&lt;br /&gt;
    uint16_t    cmd = IRMP_ACP24_MODE_POWER_ON_MASK;&lt;br /&gt;
&lt;br /&gt;
    cmd |= IRMP_ACP24_SET_FAN_STEP_MASK | ((fan_step &amp;lt;&amp;lt; IRMP24_ACP_FAN_STEP_BIT) &amp;amp; IRMP_ACP24_FAN_STEP_MASK);&lt;br /&gt;
&lt;br /&gt;
    acp24_send (cmd);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void&lt;br /&gt;
acp24_set_mode (uint8_t mode)&lt;br /&gt;
{&lt;br /&gt;
    uint16_t    cmd = 0;&lt;br /&gt;
&lt;br /&gt;
    switch (mode)&lt;br /&gt;
    {&lt;br /&gt;
        case ACP24_MODE_COOLING:    cmd = IRMP_ACP24_MODE_COOLING_MASK;     break;&lt;br /&gt;
        case ACP24_MODE_VENTING:    cmd = IRMP_ACP24_MODE_VENTING_MASK;     break;&lt;br /&gt;
        case ACP24_MODE_DEMISTING:  cmd = IRMP_ACP24_MODE_DEMISTING_MASK;   break;&lt;br /&gt;
        default: return;&lt;br /&gt;
    }&lt;br /&gt;
    acp24_send (cmd);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void&lt;br /&gt;
acp24_program_automatic (void)&lt;br /&gt;
{&lt;br /&gt;
    uint16_t    cmd = IRMP_ACP24_MODE_POWER_ON_MASK | IRMP_ACP24_AUTOMATIC_MASK;&lt;br /&gt;
    acp24_send (cmd);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void&lt;br /&gt;
acp24_program_night (void)&lt;br /&gt;
{&lt;br /&gt;
    uint16_t    cmd = IRMP_ACP24_MODE_POWER_ON_MASK | IRMP_ACP24_NIGHT_MASK;&lt;br /&gt;
    acp24_send (cmd);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== LGAIR Protocol ===&lt;br /&gt;
&lt;br /&gt;
The LG Air Con is controlled by an &#039;intelligent&#039; remote. These are the encoded data:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    Command                 AAAAAAAA  PW  Z  S  T  mmm  tttt  vvvv  PPPP&lt;br /&gt;
    --------------------------------------------------------------------&lt;br /&gt;
    ON 23C                  10001000  00  0  0  0  000  1000  0100  1100&lt;br /&gt;
    ON 26C                  10001000  00  0  0  0  000  1011  0100  1111&lt;br /&gt;
&lt;br /&gt;
    OFF                     10001000  11  0  0  0  000  0000  0101  0001&lt;br /&gt;
    TURN OFF                10001000  11  0  0  0  000  0000  0101  0001  (18C currently, identical to off)&lt;br /&gt;
&lt;br /&gt;
    TEMP DOWN 23C           10001000  00  0  0  1  000  1000  0100  0100&lt;br /&gt;
    MODE (to mode0, 23C)    10001000  00  0  0  1  000  1000  0100  0100&lt;br /&gt;
&lt;br /&gt;
    TEMP UP (24C)           10001000  00  0  0  1  000  1001  0100  0101&lt;br /&gt;
    TEMP DOWN 24C           10001000  00  0  0  1  000  1001  0100  0101&lt;br /&gt;
&lt;br /&gt;
    TEMP UP (25C)           10001000  00  0  0  1  000  1010  0100  0110&lt;br /&gt;
    TEMP DOWN 25C           10001000  00  0  0  1  000  1010  0100  0110&lt;br /&gt;
&lt;br /&gt;
    TEMP UP (26C)           10001000  00  0  0  1  000  1011  0100  0111&lt;br /&gt;
&lt;br /&gt;
    MODE                    10001000  00  0  0  1  011  0111  0100  0110  (to mode1, 22C - when switching to mode1 temp automaticall sets to 22C)&lt;br /&gt;
    ON (mode1, 22C)         10001000  00  0  0  0  011  0111  0100  1110&lt;br /&gt;
&lt;br /&gt;
    MODE                    10001000  00  0  0  1  001  1000  0100  0101  (to mode2, no temperature displayed)&lt;br /&gt;
    ON (mode2)              10001000  00  0  0  0  001  1000  0100  1101&lt;br /&gt;
    MODE (to mode3, 23C)    10001000  00  0  0  1  100  1000  0100  1000&lt;br /&gt;
    ON (mode3, 23C)         10001000  00  0  0  0  100  1000  0100  0000&lt;br /&gt;
&lt;br /&gt;
    VENTILATION SLOW        10001000  00  0  0  1  000  0011  0000  1011&lt;br /&gt;
    VENTILATION MEDIUM      10001000  00  0  0  1  000  0011  0010  1101&lt;br /&gt;
    VENTILATION HIGH        10001000  00  0  0  1  000  0011  0100  1111&lt;br /&gt;
    VENTILATION LIGHT       10001000  00  0  0  1  000  0011  0101  0000&lt;br /&gt;
&lt;br /&gt;
    SWING ON/OFF            10001000  00  0  1  0  000  0000  0000  0001&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    Format:     1 start bit + 8 address bits + 16 data bits + 4 checksum bits + 1 stop bit&lt;br /&gt;
&lt;br /&gt;
    Address:    AAAAAAAA = 0x88 (8 bits)&lt;br /&gt;
&lt;br /&gt;
    Data:       PW Z S T MMM tttt vvvv PPPP (16 bits)&lt;br /&gt;
&lt;br /&gt;
                PW:         Power:     00 = On, 11 = Off&lt;br /&gt;
&lt;br /&gt;
                Z:          N/A:       Always 0&lt;br /&gt;
&lt;br /&gt;
                S:          Swing:     1 = Toggle swing, all other data bits are zeros.&lt;br /&gt;
&lt;br /&gt;
                T:          Temp/Vent: 1 = Set temperature and ventilation&lt;br /&gt;
&lt;br /&gt;
                MMM:        Mode, can be combined with temperature&lt;br /&gt;
                            000=Mode 0&lt;br /&gt;
                            001=Mode 2&lt;br /&gt;
                            010=????&lt;br /&gt;
                            011=Mode 1&lt;br /&gt;
                            100=Mode 3&lt;br /&gt;
                            101=???&lt;br /&gt;
                            111=???&lt;br /&gt;
&lt;br /&gt;
                tttt:       Temperature:&lt;br /&gt;
                            0000=used by OFF command&lt;br /&gt;
                            0001=????&lt;br /&gt;
                            0010=????&lt;br /&gt;
                            0011=18°C&lt;br /&gt;
                            0100=19°C&lt;br /&gt;
                            0101=20°C&lt;br /&gt;
                            0110=21°C&lt;br /&gt;
                            0111=22°C&lt;br /&gt;
                            1000=23°C&lt;br /&gt;
                            1001=24°C&lt;br /&gt;
                            1010=25°C&lt;br /&gt;
                            1011=26°C&lt;br /&gt;
                            1011=27°C&lt;br /&gt;
                            1100=28°C&lt;br /&gt;
                            1101=29°C&lt;br /&gt;
                            1111=30°C&lt;br /&gt;
&lt;br /&gt;
                vvvv:       Ventilation:&lt;br /&gt;
                            0000=slow&lt;br /&gt;
                            0010=medium&lt;br /&gt;
                            0011=????&lt;br /&gt;
                            0100=high&lt;br /&gt;
                            0101=light&lt;br /&gt;
                            0110=????&lt;br /&gt;
                            0111=????&lt;br /&gt;
                            ...&lt;br /&gt;
                            1111=????&lt;br /&gt;
&lt;br /&gt;
    Checksum:   PPPP = (DataNibble1 + DataNibble2 + DataNibble3 + DataNibble4) &amp;amp; 0x0F&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== NEC16 Protocol (JVC) ===&lt;br /&gt;
&lt;br /&gt;
* http://www.sbprojects.net/knowledge/ir/jvc.php&lt;br /&gt;
* http://www.ustr.net/infrared/jvc.shtml&lt;br /&gt;
&lt;br /&gt;
=== Samsung Protocol ===&lt;br /&gt;
&lt;br /&gt;
(was reverse engineered by several protocols (Daewoo or similar), so no direct link to Samsung documents is available)&lt;br /&gt;
&lt;br /&gt;
Here is a link to the Daewoo-protocol, which uses the same principle of the sync-bits in the center of a frame, but words with different timings:&lt;br /&gt;
&lt;br /&gt;
* http://users.telenet.be/davshomepage/daewoo.htm&lt;br /&gt;
&lt;br /&gt;
=== MATSUHITA Protocol ===&lt;br /&gt;
&lt;br /&gt;
* http://www.celadon.com/infrared_protocol/infrared_protocols_samples.pdf&lt;br /&gt;
&lt;br /&gt;
=== KASEIKYO Protocol (&amp;quot;Japan Protocol&amp;quot;) ===&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;
=== RECS80 and RECS80 Extended Protocol ===&lt;br /&gt;
&lt;br /&gt;
* http://www.sbprojects.net/knowledge/ir/recs80.php&lt;br /&gt;
&lt;br /&gt;
=== RC5 and RC5x Protocol ===&lt;br /&gt;
&lt;br /&gt;
* http://www.sbprojects.net/knowledge/ir/rc5.php&lt;br /&gt;
* http://mc.mikrocontroller.com/de/IR-Protokolle.php#RC5&lt;br /&gt;
* http://users.telenet.be/davshomepage/rc5.htm&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;
&lt;br /&gt;
=== Denon Protocol ===&lt;br /&gt;
&lt;br /&gt;
* http://www.mikrocontroller.com/de/IR-Protokolle.php#DENON&lt;br /&gt;
* http://www.manualowl.com/m/Denon/AVR-3803/Manual/170243&lt;br /&gt;
&lt;br /&gt;
=== RC6 and RC6A Protocol ===&lt;br /&gt;
&lt;br /&gt;
* http://www.sbprojects.net/knowledge/ir/rc6.php&lt;br /&gt;
* http://www.picbasic.nl/info_rc6_uk.htm&lt;br /&gt;
&lt;br /&gt;
=== Bang &amp;amp; Olufsen ===&lt;br /&gt;
&lt;br /&gt;
* http://www.mikrocontroller.net/attachment/33137/datalink.pdf&lt;br /&gt;
&lt;br /&gt;
=== Grundig Protocol ===&lt;br /&gt;
&lt;br /&gt;
* http://www.see-solutions.de/sonstiges/Grundig_10bit.pdf&lt;br /&gt;
&lt;br /&gt;
=== Nokia Protocol ===&lt;br /&gt;
&lt;br /&gt;
* http://www.sbprojects.net/knowledge/ir/nrc17.php&lt;br /&gt;
&lt;br /&gt;
=== IR60 (SDA2008 and MC14497P) ===&lt;br /&gt;
&lt;br /&gt;
* http://www.datasheetcatalog.org/datasheet/motorola/MC14497P.pdf&lt;br /&gt;
&lt;br /&gt;
=== LEGO Power Functions RC ===&lt;br /&gt;
&lt;br /&gt;
* http://www.philohome.com/pf/LEGO_Power_Functions_RC_v110.pdf&lt;br /&gt;
&lt;br /&gt;
=== RCMM Protocol ===&lt;br /&gt;
&lt;br /&gt;
* http://www.sbprojects.net/knowledge/ir/rcmm.php&lt;br /&gt;
&lt;br /&gt;
=== Other Protocols ===&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.roboternetz.de/phpBB2/files/entwicklung_und_realisierung_einer_universalinfrarotfernbedienung_mit_timerfunktionen.pdf&lt;br /&gt;
&lt;br /&gt;
== IRMP on Youtube ==&lt;br /&gt;
&lt;br /&gt;
* http://www.youtube.com/watch?v=Q7DJvLIyTEI&lt;br /&gt;
&lt;br /&gt;
* http://www.youtube.com/watch?v=1tQ_aqayWZk&lt;br /&gt;
&lt;br /&gt;
* http://www.youtube.com/watch?v=W4tI2axR3-w&lt;br /&gt;
&lt;br /&gt;
* http://www.youtube.com/watch?v=SRs98dIe2WE&lt;br /&gt;
&lt;br /&gt;
== Other Artikels ==&lt;br /&gt;
&lt;br /&gt;
[http://www.infineon.com/dgdl/RF2ir+WhitePaper+V1.0.pdf?folderId=db3a3043191a246301192dd3ee2c2ae4&amp;amp;fileId=db3a30432b57a660012b5c16272c2e81 Whitepaper von Martin Gotschlich, Infineon Technologies AG]&lt;br /&gt;
&lt;br /&gt;
== Hardware / IRMP Projects ==&lt;br /&gt;
&lt;br /&gt;
=== Remote IRMP ===&lt;br /&gt;
&lt;br /&gt;
Infrared sender und receiver controlled via ip network with Android smartphone as remote control:&lt;br /&gt;
&lt;br /&gt;
 * http://www.mikrocontroller.net/articles/Remote_IRMP&lt;br /&gt;
&lt;br /&gt;
=== IR Tester ===&lt;br /&gt;
&lt;br /&gt;
IR tester with LCD by Klaus Leidinger:&lt;br /&gt;
&lt;br /&gt;
* http://www.mikrocontroller-projekte.de/Mikrocontroller/index.html&lt;br /&gt;
&lt;br /&gt;
=== IR Tester with AVR-NET-IO ===&lt;br /&gt;
&lt;br /&gt;
IR tester for Pollin AVR-NET-IO with Pollin ADD-ON Board:&lt;br /&gt;
&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 ===&lt;br /&gt;
&lt;br /&gt;
USB IR remote receiver by Hugo Portisch:&lt;br /&gt;
* http://www.mikrocontroller.net/articles/USB_IR_Remote_Receiver&lt;br /&gt;
&lt;br /&gt;
=== USB IR Receiver/Sender/Switch with Wakeup-Timer ===&lt;br /&gt;
&lt;br /&gt;
* http://www.vdr-portal.de/board18-vdr-hardware/board13-fernbedienungen/123572-fertig-irmp-auf-stm32-ein-usb-ir-empf%C3%A4nger-sender-einschalter-mit-wakeup-timer/&lt;br /&gt;
&lt;br /&gt;
* http://www.mikrocontroller.net/articles/IRMP_auf_STM32_-_ein_USB_IR_Empf%C3%A4nger/Sender/Einschalter_mit_Wakeup-Timer&lt;br /&gt;
&lt;br /&gt;
=== USBASP ===&lt;br /&gt;
&lt;br /&gt;
IR switch based on USBasp&lt;br /&gt;
* http://wiki.easy-vdr.de/index.php?title=USBASP_Einschalter&lt;br /&gt;
&lt;br /&gt;
=== Servo controlled IR Sender ===&lt;br /&gt;
&lt;br /&gt;
Servo controlled IR Sender (adaptive) by Stefan Pendsa:&lt;br /&gt;
* http://forum.mikrokopter.de/topic-21060.html&lt;br /&gt;
* [http://svn.mikrokopter.de/listing.php?repname=Projects&amp;amp;path=%2FServo-Controlled+IR-Transmitter%2F&amp;amp;#Ad2417800d6aa14bf08c571a896e9def7 SVN]&lt;br /&gt;
&lt;br /&gt;
=== Adaptive IR Remote Control ===&lt;br /&gt;
&lt;br /&gt;
Adaptive IR remote control by Robert and Frank M.&lt;br /&gt;
* http://www.mikrocontroller.net/articles/DIY_Lernfähige_Fernbedienung_mit_IRMP&lt;br /&gt;
&lt;br /&gt;
=== AVR Moodlight ===&lt;br /&gt;
&lt;br /&gt;
AVR Moodlight by Axel Schwenke&lt;br /&gt;
* http://www.mikrocontroller.net/topic/244768&lt;br /&gt;
&lt;br /&gt;
STM8 Moodlight by Axel Schwenke&lt;br /&gt;
* https://www.mikrocontroller.net/topic/380098&lt;br /&gt;
&lt;br /&gt;
=== Infinity Mirror LED Ceiling Lamp ===&lt;br /&gt;
&lt;br /&gt;
Infinity Mirror LED ceiling lamp with remote control by Philipp Meißner&lt;br /&gt;
* http://digital-nw.de/Infinity-Mirror.htm&lt;br /&gt;
&lt;br /&gt;
=== Cinema Control ===&lt;br /&gt;
&lt;br /&gt;
Cinema control by Owagner&lt;br /&gt;
* http://ccc.zerties.org/index.php/Benutzer:Owagner&lt;br /&gt;
&lt;br /&gt;
=== Leading-Edge Control ===&lt;br /&gt;
&lt;br /&gt;
leading-edge control:&lt;br /&gt;
&lt;br /&gt;
* http://flosserver.dyndns.org/phasenanschnittsdimmer.php&lt;br /&gt;
&lt;br /&gt;
=== IRDioder – Ikea Dioder Hack ===&lt;br /&gt;
&lt;br /&gt;
Ikea Dioder Hack:&lt;br /&gt;
&lt;br /&gt;
* http://marco-difeo.de/tag/infrared/&lt;br /&gt;
&lt;br /&gt;
=== Expedit Coffee Bar ===&lt;br /&gt;
&lt;br /&gt;
Ikea Expedit as coffee bar:&lt;br /&gt;
&lt;br /&gt;
* http://chaozlabs.blogspot.de/2013/09/expedit-coffee-bar.html&lt;br /&gt;
&lt;br /&gt;
=== Arduino as IR Receiver ===&lt;br /&gt;
&lt;br /&gt;
Arduino as IR Receiver:&lt;br /&gt;
&lt;br /&gt;
* http://www.vdr-portal.de/board18-vdr-hardware/board13-fernbedienungen/110918-arduino-als-ir-empf%C3%A4nger-einsetzen/&lt;br /&gt;
&lt;br /&gt;
More example from the Arduino library:&lt;br /&gt;
&lt;br /&gt;
* https://github.com/ukw100/IRMP/tree/master/examples&lt;br /&gt;
&lt;br /&gt;
=== IR Volume Control with Stellaris Launchpad ===&lt;br /&gt;
&lt;br /&gt;
volume control with Stellaris Launchpad (ARM Cortex-M4F):&lt;br /&gt;
&lt;br /&gt;
* http://www.anthonyvh.com/2013/03/31/ir-volume-control/&lt;br /&gt;
&lt;br /&gt;
=== RemotePi Board ===&lt;br /&gt;
&lt;br /&gt;
Shutdown RaspPI with IR remote control:&lt;br /&gt;
&lt;br /&gt;
* http://www.msldigital.com/pages/more-information&lt;br /&gt;
&lt;br /&gt;
=== Ethernut &amp;amp; IRMP ===&lt;br /&gt;
&lt;br /&gt;
IRMP under RTOS Ethernut:&lt;br /&gt;
&lt;br /&gt;
* http://www.klkl.de/ethernut.html&lt;br /&gt;
&lt;br /&gt;
=== LED strip Remote Control ===&lt;br /&gt;
&lt;br /&gt;
LED strip remote control:&lt;br /&gt;
&lt;br /&gt;
* http://www.solderlab.de/index.php/misc/led-strip-remote-control&lt;br /&gt;
&lt;br /&gt;
=== ADAT Audio Mixer ===&lt;br /&gt;
&lt;br /&gt;
Audio Mixer:&lt;br /&gt;
&lt;br /&gt;
* http://mailtonne.de/adat-audio-mixer/&lt;br /&gt;
&lt;br /&gt;
=== Ethersex &amp;amp; IRMP ===&lt;br /&gt;
&lt;br /&gt;
IRMP + IRSND Modul in Ethersex, a modular Firmware for AVR MCUs&lt;br /&gt;
&lt;br /&gt;
* http://ethersex.de/index.php/IRMP&lt;br /&gt;
&lt;br /&gt;
=== Mastermind Solver ===&lt;br /&gt;
&lt;br /&gt;
Mastermind solver with LED stripes and IR remote control:&lt;br /&gt;
&lt;br /&gt;
* http://www.mystrobl.de/Plone/basteleien/weitere-bulls-and-cows-mastermind-implementationen/mm-v1821/mastermind-solver-mit-led-streifen-und-ir-fernbedienung&lt;br /&gt;
&lt;br /&gt;
=== A MythTV Remote Control without LIRC ===&lt;br /&gt;
&lt;br /&gt;
PC Remote Control with ATtiny85&lt;br /&gt;
&lt;br /&gt;
* http://tomscircuits.blogspot.de/2014/12/a-mythtv-remote-control-without-lirc.html&lt;br /&gt;
&lt;br /&gt;
=== IRMP + IRSND Library for STM32F4 ===&lt;br /&gt;
&lt;br /&gt;
IRMP for STM32F4&lt;br /&gt;
&lt;br /&gt;
* http://mikrocontroller.bplaced.net/wordpress/?page_id=1516&lt;br /&gt;
&lt;br /&gt;
IRSND for STM32F4&lt;br /&gt;
&lt;br /&gt;
* http://mikrocontroller.bplaced.net/wordpress/?page_id=1940&lt;br /&gt;
&lt;br /&gt;
=== IRMP on STM32 - Construction Guidance ===&lt;br /&gt;
&lt;br /&gt;
* http://www.mikrocontroller.net/articles/IRMP_auf_STM32_-_Bauanleitung&lt;br /&gt;
&lt;br /&gt;
=== Seminar Paper - Extension of Arduino Platform ===&lt;br /&gt;
&lt;br /&gt;
* www.eislab.fim.uni-passau.de/files/publications/2010/StudentDiener_ErweiterungDerArduinoPlattform.pdf&lt;br /&gt;
&lt;br /&gt;
== Acknowledgment ==&lt;br /&gt;
&lt;br /&gt;
I thank Vlad Tepesch, Klaus Leidinger, Peter K., and Dániel Körmendi, who sent me many scan files of their IR remote controls.&lt;br /&gt;
&lt;br /&gt;
I thank Christian F. for his tipps relating to the port to PIC MCUs, gera for the port to PIC-C18 compiler, kichi (Michael K.) for the port to ARM STM32, Markus Schuster for the port to TI&#039;s Stellaris LM4F120 Launchpad (ARM Cortex M4), Matthias Frank for the port to XMega, Wolfgang S. for the port to ESP8266, Achill Hasler for the port to Teensy, Axel Schwenke for the port to STM8.&lt;br /&gt;
&lt;br /&gt;
Thanks to Dániel Körmendi, who added the LG-AIR protocol to [[IRSND_-_english|IRSND]]. Thanks to Ulrich v.d. Kammer for the Pentax protocol extension in [[IRSND_-_english|IRSND]].&lt;br /&gt;
&lt;br /&gt;
At least I will thank Jojo S. for his great job translating this documentation!&lt;br /&gt;
&lt;br /&gt;
== Discussion ==&lt;br /&gt;
&lt;br /&gt;
You can discuss IRMP &amp;amp; IRSND in the German thread [http://www.mikrocontroller.net/topic/162119 Infrared Multi Protocol Decoder].&lt;br /&gt;
&lt;br /&gt;
Have fun with IRMP!&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Infrarot]]&lt;br /&gt;
[[Kategorie:AVR-Projekte]]&lt;/div&gt;</summary>
		<author><name>Tooki</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=IRMP&amp;diff=106065</id>
		<title>IRMP</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=IRMP&amp;diff=106065"/>
		<updated>2023-04-23T11:46:34Z</updated>

		<summary type="html">&lt;p&gt;Tooki: Korrektur des Namens der AEHA.&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;
[[Datei:irmp-title.png| |Scan eines NEC-kompatiblen Fernbedienungssignals]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[[IRMP_-_english#top|You will find the English documentation here.]]&#039;&#039;&#039;&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;
Im folgenden wird IRMP als &amp;quot;Infrarot-Multiprotokoll-Decoder&amp;quot; in allen Einzelheiten vorgestellt. Das Gegenstück, nämlich &#039;&#039;&#039;[[IRSND]]&#039;&#039;&#039; als IR-Encoder, wird in einem gesonderten [[IRSND|Artikel]] behandelt.&lt;br /&gt;
&lt;br /&gt;
= IRMP - Infrarot-Multiprotokoll-Decoder =&lt;br /&gt;
&lt;br /&gt;
=== Unterstützte µCs ===&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width: 80%;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 20%;&amp;quot; |&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
[[IRMP#top|IRMP]] ist auf verschiedenen Mikrocontroller-Familien lauffähig.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AVR&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* ATtiny87,  ATtiny167&lt;br /&gt;
* ATtiny45,  ATtiny85&lt;br /&gt;
* ATtiny44,  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;
&#039;&#039;&#039;XMega&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* ATXmega128&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC&#039;&#039;&#039; (CCS- und XC8/C18-Compiler)&lt;br /&gt;
&lt;br /&gt;
* PIC12F1840&lt;br /&gt;
* PIC18F4520&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;STM32&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* STM32F4xx (getestet auf STM32F401RE/F411RE Nucleo, STM32F4 Discovery)&lt;br /&gt;
* STM32F10x (getestet auf STM32F103C8T6 Mini Development Board)&lt;br /&gt;
* STM32 mit HAL-Library &#039;&#039;&#039;(NEU!)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;STM8&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* STM8S103F3&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TI Stellaris&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* LM4F120 Launchpad (ARM Cortex M4)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ESP8266 (NEU!)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* ESP8266-EVB&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TEENSY 3.0 (NEU!)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* MK20DX256VLH7 (ARM Cortex-M4 72MHz)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MBED (NEU!)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* LPC1347 Cortex-M3 mit 72 MHz&lt;br /&gt;
* LPC4088 (Embedded Artists)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ChibiOS HAL (NEU!)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Verschiedene ARM-Cortex-µCs, wie z.B. STM32, Kinetis, NRF5 etc.&lt;br /&gt;
* [https://sourceforge.net/p/chibios/svn2/HEAD/tree/trunk/os/hal/ports/ Offiziell unterstützte µC-Serien]&lt;br /&gt;
* [https://github.com/ChibiOS/ChibiOS-Contrib/tree/master/os/hal/ports weitere µC-Serien, von der Community unterstützt]&lt;br /&gt;
||&lt;br /&gt;
[[Datei:irmp-empfaenger.png|miniatur|Anschluß eines IR-Empfängers an µC]]&lt;br /&gt;
|}&lt;br /&gt;
=== Unterstützte IR-Protokolle ===&lt;br /&gt;
&lt;br /&gt;
[[IRMP#top|IRMP]] - der Infrarot-Fernbedienungsdecoder, der mehrere Protokolle auf einmal decodieren kann, beherrscht folgende Protokolle (in alphabetischer Reihenfolge):&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|+ &#039;&#039;&#039;Unterstützte IR-Protokolle&#039;&#039;&#039;&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! style=&amp;quot;width:15%&amp;quot; | Protokoll&lt;br /&gt;
! style=&amp;quot;width:100em&amp;quot; | Hersteller&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP#A1TVBOX|A1TVBOX]] || ADB (Advanced Digital Broadcast), z.B. A1 TV Box&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP#APPLE|APPLE]] || Apple&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP#ACP24|ACP24]] || Stiebel Eltron&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP#B&amp;amp;O|B&amp;amp;O]] || Bang &amp;amp; Olufsen&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP#BOSE|BOSE]] || Bose&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP#DENON|DENON]] || Denon, Sharp&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP#FAN|FAN]] || FAN, Fernsteuerung für Ventilatoren&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP#FDC|FDC]] || FDC Keyboard&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP#GRUNDIG_+_NOKIA|GRUNDIG]] || Grundig&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP#GRUNDIG_+_NOKIA|NOKIA]] || Nokia, z.B. D-Box&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP#IR60 (SDA2008)|IR60 (SDA2008)]] || Diverse europäische Hersteller&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP#JVC|JVC]] || JVC&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP#KASEIKYO|KASEIKYO]] || Panasonic, Technics, Denon und andere japanische Hersteller, welche Mitglied der japanischen &amp;quot;Association for Electric Home Appliances&amp;quot; (AEHA) sind.&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP#KATHREIN|KATHREIN]]  || KATHREIN&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP#LEGO|LEGO]]   || Lego&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP#LGAIR|LGAIR]]   || LG Air Conditioner&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP#MITSU_HEAVY|MITSU_HEAVY]] || Mitsubishi Air Conditioner&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP#MATSUSHITA|MATSUSHITA]] || Matsushita&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP#NEC16|NEC16]]  || JVC, Daewoo&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP#NEC42|NEC42]]  || JVC&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP#MERLIN|MERLIN]]  || MERLIN Fernbedienung (Pollin Bestellnummer: 620 185)&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP#NEC_+_extended_NEC|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;
| [[IRMP#NETBOX|NETBOX]]  || Netbox&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP#NIKON|NIKON]] || NIKON&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP#NUBERT|NUBERT]] || Nubert, z.B. Subwoofer System&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP#ORTEK|ORTEK]] || Ortek, Hama&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP#PANASONIC|PANASONIC]] || PANASONIC Beamer&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP#PENTAX|PENTAX]] || PENTAX&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP#RC5_+_RC5X|RC5]] || Philips und andere europäische Hersteller&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP#RC6_+_RC6A|RC6A]] || Philips, Kathrein und andere Hersteller, z.B. XBOX&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP#RC6_+_RC6A|RC6]] || Philips und andere europäische Hersteller&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP#RCCAR|RCCAR]] || RC Car: IR Fernbedienung für Modellfahrzeuge &lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP#RCII|RCII]] || T+A (&#039;&#039;&#039;NEU!&#039;&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP#RECS80|RECS80]] || Philips, Nokia, Thomson, Nordmende, Telefunken, Saba&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP#RECS80EXT|RECS80EXT]] || Philips, Technisat, Thomson, Nordmende, Telefunken, Saba&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP#RCMM|RCMM]] || Fujitsu-Siemens z.B. Activy keyboard&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP#ROOMBA|ROOMBA]] || iRobot Roomba Staubsauger&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP#S100|S100]] || Ähnlich zu RC5, aber 14 statt 13 Bits und 56kHz Modulation. Hersteller unbekannt.&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP#SAMSUNG32|SAMSUNG32]] || Samsung&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP#SAMSUNG48|SAMSUNG48]] || Div. Klimaanlagen Hersteller&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP#SAMSUNG|SAMSUNG]] || Samsung&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP#SIEMENS_+_RUWIDO|RUWIDO]] || RUWIDO (z.B. T-Home-Mediareceiver, MERLIN-Tastatur (Pollin))&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP#SIEMENS_+_RUWIDO|SIEMENS]] || Siemens, z.B. Gigaset M740AV&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP#SIRCS|SIRCS]] || Sony&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP#SPEAKER|SPEAKER]] || Lautsprecher Systeme wie z.B. X-Tensions&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP#TECHNICS|TECHNICS]] || Technics&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP#TELEFUNKEN|TELEFUNKEN]] || Telefunken&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP#THOMSON|THOMSON]] || Thomson&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP#VINCENT|VINCENT]] || Vincent&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#FF0000&amp;quot;&amp;gt;&#039;&#039;&#039;NEU:&#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ab Version 3.2 kann IRMP auch RF-Funkprotokolle (433 MHz) dekodieren.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|+ &#039;&#039;&#039;Unterstützte RF-Protokolle&#039;&#039;&#039;&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! style=&amp;quot;width:15%&amp;quot; | Protokoll&lt;br /&gt;
! style=&amp;quot;width:100em&amp;quot; | Hersteller&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP#RF_GEN24|RF_GEN24]] || Generisches 24 Bit Format, z.B. Pollin 550666 Funksteckdose&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP#RF_X10|RF_X10]] || X10 PC Funkfernbedienung (Medion), Pollin 721815&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;
Zu beachten:&lt;br /&gt;
&lt;br /&gt;
* Sollen Funk-Protokolle decodiert werden, sind sämtliche IR-Protokolle zu deaktivieren.&lt;br /&gt;
* Sollen IR-Protokolle decodiert werden, sind sämtliche RF-Protokolle (Funk) zu deaktivieren.&lt;br /&gt;
&lt;br /&gt;
=== Entstehung ===&lt;br /&gt;
&lt;br /&gt;
Der auf AVR- und PIC-µCs einsetzbare Source zu [[IRMP#top|IRMP]] entstand im Rahmen des [[Word Clock]] Projektes.&lt;br /&gt;
&lt;br /&gt;
=== Thread im Forum ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anlass für einen eigenen [[IRMP#top|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;
== IR-Protokolle ==&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width: 80%;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 20%;&amp;quot; |&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
Einige Hersteller verwenden ihr eigenes hausinterne Protokoll, dazu gehören u.a. Sony, Samsung und Matsushita. Philips hat [[IRMP#RC5 + RC5X|RC5]] entwickelt und natürlich auch selbst benutzt. [[IRMP#RC5 + RC5X|RC5]] galt damals in Europa als &#039;&#039;das&#039;&#039; Standard-IR-Protokoll, welches von vielen europäischen Herstellern übernommen wurde. Mittlerweile ist [[IRMP#RC5 + RC5X|RC5]] fast gar nicht mehr anzutreffen - man kann es eigentlich als &amp;quot;ausgestorben&amp;quot; abhaken. Der Nachfolger [[IRMP#RC6_+_RC6A|RC6]] wird zwar noch in einigen aktuellen europäischen Geräten eingesetzt, ist aber auch nur vereinzelt vorzufinden.&lt;br /&gt;
&lt;br /&gt;
Auch die japanischen Hersteller haben versucht, einen eigenen Standard zu etablieren, nämlich das sog. [[IRMP#KASEIKYO|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 - auch wenn man es hier und da im heimischen Haushalt vorfindet.&lt;br /&gt;
&lt;br /&gt;
Heutzutage wird (auch vornehmlich bei japanischen Geräten) das [[IRMP#NEC_+_extended_NEC|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 [[IRMP#NEC_+_extended_NEC|NEC]]-Protokoll. Fast alle Fernbedienungen im alltäglichen Einsatz verwenden bei mir den [[IRMP#NEC_+_extended_NEC|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;
[[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;
&lt;br /&gt;
== Kodierungen ==&lt;br /&gt;
&lt;br /&gt;
[[IRMP#top|IRMP]] unterstützt folgende IR-Codings:&lt;br /&gt;
&lt;br /&gt;
* [[IRMP#Pulse Distance|Pulse Distance]], typ. Beispiel: [[IRMP#NEC_+_extended_NEC|NEC]]&lt;br /&gt;
* [[IRMP#Pulse Width|Pulse Width]], typ. Beispiel: [[IRMP#SIRCS|Sony SIRCS]]&lt;br /&gt;
* [[IRMP#Biphase|Biphase (Manchester)]], typ. Beispiel: Philips [[IRMP#RC5_+_RC5X|RC5]], [[IRMP#RC6_+_RC6A|RC6]]&lt;br /&gt;
* [[IRMP#Pulse Position|Pulse Position (NRZ)]], typ. Beispiel: [[IRMP#NETBOX|Netbox]]&lt;br /&gt;
* [[IRMP#Pulse Distance Width|Pulse Distance Width]], typ. Beispiel: [[IRMP#NUBERT|Nubert]]&lt;br /&gt;
&lt;br /&gt;
Die Pulse werden dabei moduliert - üblicherweise mit 36kHz oder 38kHz - um Umwelteinflüsse wie Raum- oder Sonnenlicht ausfiltern zu können.&lt;br /&gt;
&lt;br /&gt;
=== Pulse Distance ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width: 80%;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 20%;&amp;quot; |&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
Eine Pulse Distance Kodierung erkennt man an der folgenden Regel:&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;&lt;br /&gt;
||&lt;br /&gt;
[[Datei:Pulse-Distance.png|miniatur|Pulse Distance Coding]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Pulse Width ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width: 80%;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 20%;&amp;quot; |&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
Bei der Pulse Width Kodierung gilt die Regel:&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;
|| [[Datei:Pulse-Width.png|miniatur|Pulse Width Coding]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Pulse Distance Width ===&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width: 80%;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 20%;&amp;quot; |&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
Dies ist ein Mischmasch aus Pulse Distance und Pulse Width Coding.&lt;br /&gt;
Oft ist die Summe aus Puls- und Pausenlänge konstant.&lt;br /&gt;
&lt;br /&gt;
Also:&lt;br /&gt;
&lt;br /&gt;
* es gibt &#039;&#039;&#039;zwei verschiedene Pulslängen&#039;&#039;&#039; und &#039;&#039;&#039;zwei verschiedene Pausenlängen.&#039;&#039;&#039;&lt;br /&gt;
||&lt;br /&gt;
[[Datei:Pulse-Distance-Width.png|miniatur|Pulse Distance Width Coding]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Biphase ===&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width: 80%;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 20%;&amp;quot; |&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
Bei der Biphase Kodierung entscheidet die Reihenfolge von Puls und Pause über den Wert des Bits.&lt;br /&gt;
&lt;br /&gt;
Damit erkennt man ein Biphase-Coding an folgendem Kriterium:&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;
Normalerweise sind die Längen für die Pulse und Pausen gleich, d.h. die Signalform ist symmetrisch. IRMP erkennt aber auch Protokolle, die mit unterschiedlichen Puls-/Pause-Längen arbeiten. Dies ist zum Beispiel bei dem [[IRMP#A1TVBOX|A1TVBOX]]-Protokoll der Fall.&lt;br /&gt;
||&lt;br /&gt;
[[Datei:Biphase-Coding.png|miniatur|Biphase Coding]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Pulse Position ===&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width: 80%;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 20%;&amp;quot; |&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
Die Pulse Position Kodierung kennt man von den üblichen UARTs. Hier hat jedes Bit eine feste Länge. Je nach Wert (0 oder 1) ist es ein Puls oder eine Pause.&lt;br /&gt;
&lt;br /&gt;
Typisches Kriterium für ein &#039;&#039;&#039;Pulse Position 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;
[[Datei:Pulse-Position.png|miniatur|Pulse Position Coding]]&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;Eine tabellarische Aufstellung der verschiedenen IR-Protokolle findet man hier: [[IRMP#Die_IR-Protokolle_im_Detail|Die IR-Protokolle im Detail]].&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die dort angegebenen Timingwerte sind Idealwerte. Bei einigen Fernbedienungen in der Praxis weichen sie um bis zu 40% voneinander ab. Deshalb arbeitet [[IRMP#top|IRMP]] mit Minimum-/Maximumsgrenzen, um bzgl. des Zeitverhaltens tolerabel zu sein.&lt;br /&gt;
&lt;br /&gt;
== Protokoll-Erkennung ==&lt;br /&gt;
&lt;br /&gt;
Die meisten der von [[IRMP#top|IRMP]] decodierten Protokolle haben etwas gemeinsames: Sie weisen 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 meistens die verschiedenen Protokolle unterschieden. [[IRMP#top|IRMP]] misst also das Timing des Start-Bits und stellt dann &amp;quot;on-the-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. [[IRMP#top|IRMP]] wartet also nicht darauf, dass ein kompletter Frame eingelesen wurde, sondern legt direkt nach der ersten Pulserkennung los.&lt;br /&gt;
&lt;br /&gt;
Ist das gelesene Start-Bit nicht eindeutig, fährt [[IRMP#top|IRMP]] &amp;quot;mehrspurig&amp;quot;, d.h. es werden zum Beispiel zwei mögliche Protokolle gleichzeitig verfolgt. Sobald aus Plausibilitätsgründen eines der beiden Protokolle nicht mehr möglich sein kann, wird komplett auf das andere Protokoll gewechselt.&lt;br /&gt;
&lt;br /&gt;
Realisiert wird die Erkennung über eine [[Statemachine]], die [[AVR-GCC-Tutorial/Die_Timer_und_Zähler_des_AVR|timergesteuert]] über eine [[Interrupt|Interruptroutine]] in regelmäßigen Abständen (üblicherweise 15.000 mal in der Sekunde) aufgerufen wird. Die [[Statemachine]] kennt (unter anderem) folgende Zustände:&lt;br /&gt;
&lt;br /&gt;
* Erkenne den ersten Puls des Start-Bits&lt;br /&gt;
* Erkenne die Pause des Start-Bits&lt;br /&gt;
* Erkenne den Puls des ersten Datenbits&lt;br /&gt;
&lt;br /&gt;
Danach sind die Puls/Pause-Längen des Startbits bekannt. Nun werden alle vom Anwender aktivierten Protokolle nach diesen Längen durchsucht. Wurde ein Protokoll gefunden, werden die Timing-Tabellen dieses Protokolls geladen und im weiteren geprüft, ob die nachfolgenden Puls-/Pause-Zeiten innerhalb der geladenen Werte übereinstimmen.&lt;br /&gt;
&lt;br /&gt;
Es geht also weiter in der [[Statemachine]] mit folgenden Zuständen&lt;br /&gt;
&lt;br /&gt;
* Erkenne die Pausen der Datenbits&lt;br /&gt;
* Erkenne die Pulse der Datenbits&lt;br /&gt;
* Prüfe Timing. Wenn abweichend, schalte um auf ein anderes noch in Frage kommendes IR-Protokoll, ansonsten schalte [[Statemachine]] komplett zurück&lt;br /&gt;
* Erkenne das Stop-Bit, falls das Protokoll eines vorsieht&lt;br /&gt;
* Prüfe Daten auf Plausibilität, wie CRC oder andere redundante Datenbits&lt;br /&gt;
* Wandle die Daten in Geräte-Adresse und Kommando&lt;br /&gt;
* Erkenne Wiederholungen durch längere Tastendrücke, setze entsprechendes Flag&lt;br /&gt;
&lt;br /&gt;
Tatsächlich ist die [[Statemachine]] noch etwas komplizierter, da manche Protokolle gar kein Start-Bit (z.B. [[IRMP#DENON|Denon]]) bzw. mehrere Start-Bits (z.B. 4 bei [[IRMP#B.26O|B&amp;amp;O]]) haben bzw. mitten im Frame ein weiteres Synchronisierungs-Bit (z.B. [[IRMP#SAMSUNG|Samsung]]) vorsehen. Diese besonderen Bedingungen werden durch protokollspezifische &amp;quot;Spezialbehandlungen&amp;quot; im Code abgefangen.&lt;br /&gt;
&lt;br /&gt;
Das Umschalten auf ein anderes Protokoll kann mehrfach während des Empfangs des Frames geschehen, z.B. von [[IRMP#NEC42|NEC42]] (42 Bit) auf [[IRMP#NEC16|NEC16]] (8 Bit + Sync-Bit + 8 Bit), wenn vorzeitig ein zusätzliches Synchronisierungsbit erkannt wurde, oder von [[IRMP#NEC + extended NEC|NEC]]/[[IRMP#NEC42|NEC42]] (32/42 Bit) auf [[IRMP#JVC|JVC]] (16 Bit), wenn das Stop-Bit vorzeitig auftrat. Schwierig wird es dann, wenn zwei mögliche Protokolle nach Erkennung des Start-Bits unterschiedliche Kodierungen verwenden, z.B. wenn das eine Protokoll ein [[IRMP#Pulse Distance|Pulse Distance Coding]] und das andere ein [[IRMP#Biphase|Biphase Coding (Manchester)]] benutzt. Hier speichert [[IRMP#top|IRMP]] die jeweils völlig verschieden ermittelten Bits für beide Codierungen, um dann später die einen oder anderen&lt;br /&gt;
Werte wieder zu verwerfen.&lt;br /&gt;
&lt;br /&gt;
Desweiteren senden einige Fernbedienungen bei bestimmten Protokollen aus Gründen der Redundanz (Fehlererkennung) oder wegen längeren Tastendrucks Wiederholungsframes. Diese werden von IRMP unterschieden: Die für die Fehlererkennung zuständigen Frames werden von IRMP geprüft, aber nicht an die Anwendung zurückgegeben, die anderen werden als langer Tastendruck erkannt und entsprechend von IRMP gekennzeichnet.&lt;br /&gt;
&lt;br /&gt;
== Download ==&lt;br /&gt;
&lt;br /&gt;
Version 3.2.6, Stand vom 27.01.2021&lt;br /&gt;
&lt;br /&gt;
Download Stable Version: [http://www.mikrocontroller.net/wikifiles/7/79/Irmp.zip Irmp.zip] &lt;br /&gt;
&lt;br /&gt;
Aktuelle Entwicklungsversion von [[IRMP#top|IRMP]] &amp;amp; [[IRSND#top|IRSND]]:&lt;br /&gt;
&lt;br /&gt;
* SVN-Link: [svn://mikrocontroller.net/irmp/ SVN]&lt;br /&gt;
* SVN-Browser: [http://www.mikrocontroller.net/svnbrowser/irmp/ IRMP im SVN]&lt;br /&gt;
* Download Tarball: [http://www.mikrocontroller.net/svnbrowser/irmp/?view=tar Tarball]&lt;br /&gt;
&lt;br /&gt;
Download als Arduino Library: [https://github.com/ukw100/IRMP GitHub] oder in der Arduino IDE &amp;quot;&#039;&#039;Tools / Manage Libraries...&#039;&#039;&amp;quot; benutzen und nach &amp;quot;&#039;&#039;IRMP&#039;&#039;&amp;quot; suchen. Dies ist eine speziell an Arduino angepasste Version. Diese Variante hinkt manchmal der aktuellen Version etwas hinterher.&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;
== Lizenz ==&lt;br /&gt;
&lt;br /&gt;
IRMP ist Open Source Software und wird unter der [https://www.gnu.org/licenses/old-licenses/gpl-2.0.html GPL v2] (oder jeder höheren Version) freigegeben.&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 unter Windows die Projekt-Datei irmp.aps in das AVR Studio 4 lädt.&lt;br /&gt;
&lt;br /&gt;
Für andere Entwicklungsumgebungen ist leicht ein Projekt bzw. Makefile angelegt. Zum Source gehören:&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmp.c?view=markup irmp.c] - Der eigentliche IR-Decoder&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmpprotocols.h?view=markup irmpprotocols.h] - Sämtliche Definitionen zu den IR-Protokollen&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmpsystem.h?view=markup irmpsystem.h] - Vom Zielsystem abhängige Definitionen für AVR/PIC/STM32&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmp.h?view=markup irmp.h] - Include-Datei für die Applikation&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmpconfig.h?view=markup irmpconfig.h] - Anzupassende Konfigurationsdatei &lt;br /&gt;
&lt;br /&gt;
Beispiel Anwendungen (main-Funktionen und nötige Timer-Initialisierungen):&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-avr.c?view=markup irmp-main-avr.c] - AVR&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-avr-uart.c?view=markup irmp-main-avr-uart.c] - AVR mit UART-Ausgabe&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-pic-xc8.c?view=markup irmp-main-pic-xc8.c] - PIC18F4520&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-pic-12F1840.c?view=markup irmp-main-pic-12F1840.c] - PIC12F1840&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-stm32.c?view=markup irmp-main-stm32.c] - STM32&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-stellaris-arm.c?view=markup irmp-main-stellaris-arm.c] - TI Stellaris LM4F120 Launchpad&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-esp8266.c?view=markup irmp-main-esp8266.c] - ESP8266&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-mbed.cpp?view=markup irmp-main-mbed.cpp] - MBED&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/examples/Arduino/Arduino.ino?view=markup examples/Arduino/Arduino.ino] - Teensy 3.x&lt;br /&gt;
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-chibios.c?view=markup irmp-main-chibios.c] - ChibiOS&lt;br /&gt;
&lt;br /&gt;
{{Warnung|&lt;br /&gt;
;WICHTIG: Im Applikations-Source sollte nur irmp.h per include eingefügt werden, also lediglich:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;irmp.h&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alle anderen Include-Dateien werden automatisch über irmp.h &amp;quot;eingefügt&amp;quot;. Siehe dazu auch die Beispieldatei irmp-main-avr.c.&lt;br /&gt;
&lt;br /&gt;
Desweiteren muss die Preprocessor-Konstante &#039;&#039;&#039;F_CPU im Projekt bzw. Makefile&#039;&#039;&#039; gesetzt werden. Diese sollte mindestens den Wert 8000000UL haben, der Prozessor sollte also zumindest mit 8 MHz laufen.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Auch auf PIC-Prozessoren ist [[IRMP#top|IRMP]] lauffähig. Für den PIC-CCS-Compiler sind entsprechende Preprocessor-Konstanten bereits gesetzt, so dass man [http://www.mikrocontroller.net/svnbrowser/irmp/irmp.c?view=markup irmp.c] direkt in der CCS-Entwicklungsumgebung verwenden kann. Lediglich eine kleine Interrupt-Routine wie&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&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;/syntaxhighlight&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#top|IRMP]] in [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-avr.c?view=markup irmp-main-avr.c] zu finden - im wesentlichen geht es da um die [[AVR-GCC-Tutorial/Die_Timer_und_Zähler_des_AVR|Timer]]-Initialisierung und den Abruf der empfangenen IR-Telegramme. Das empfangene Protokoll, die Geräte-Adresse und der Kommando-Code wird dann in der AVR-Version auf dem HW-UART ausgegeben.&lt;br /&gt;
&lt;br /&gt;
Für das Stellaris LM4F120 Launchpad von TI (ARM Cortex M4) ist eine entsprechende Timer-Initialisierungsfunktion in [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-stellaris-arm.c?view=markup irmp-main-stellaris-arm.c] bereits integriert.&lt;br /&gt;
&lt;br /&gt;
Ebenso kann [[IRMP#top|IRMP]] auf STM32-Mikroprozessoren eingesetzt werden.&lt;br /&gt;
&lt;br /&gt;
=== avr-gcc-Optimierungen ===&lt;br /&gt;
&lt;br /&gt;
Ab Version avr-gcc 4.7.x kann die [https://gcc.gnu.org/onlinedocs/gccint/LTO.html#LTO LTO-Option] genutzt werden, um den Aufruf der externen Funktion irmp_ISR() aus der eigentlichen ISR effizienter zu machen. Das verbessert das Zeitverhalten der ISR etwas.&lt;br /&gt;
&lt;br /&gt;
Zu den sonst schon üblichen Compiler- und Linker-Optionen kommen noch folgende dazu:&lt;br /&gt;
&lt;br /&gt;
* Zusätzliche Compiler-Option: -flto&lt;br /&gt;
* Zusätzliche Linker-Optionen: -flto -Os&lt;br /&gt;
&lt;br /&gt;
Vergisst man (unter Windows?) die zusätzliche Linker-Option -Os, wird das Binary allerdings wesentlich größer, da dann nicht mehr optimiert wird. Auch muss -flto an den Linker übergeben werden, weil sonst die LTO-Optimierung nicht mehr greift.&lt;br /&gt;
&lt;br /&gt;
=== Konfiguration ===&lt;br /&gt;
&lt;br /&gt;
Die Konfiguration von [[IRMP#top|IRMP]] wird über Parameter in [http://www.mikrocontroller.net/svnbrowser/irmp/irmpconfig.h?view=markup irmpconfig.h] vorgenommen, nämlich:&lt;br /&gt;
&lt;br /&gt;
* [[IRMP#F_INTERRUPTS|Anzahl Interrupts pro Sekunde]]&lt;br /&gt;
* [[IRMP#IRMP_SUPPORT_xxx_PROTOCOL|Unterstützte IR-Protokolle]]&lt;br /&gt;
* [[IRMP#IRMP_PORT_LETTER + IRMP_BIT_NUMBER|Hardware-Pin zum IR-Empfänger]]&lt;br /&gt;
* [[IRMP#IRMP_LOGGING|IR-Logging]]&lt;br /&gt;
&lt;br /&gt;
=== Einstellungen in irmpconfig.h ===&lt;br /&gt;
&lt;br /&gt;
[[IRMP#top|IRMP]] decodiert sämtliche oben aufgelisteten Protokolle in einer ISR. Dafür sind einige Angaben nötig. Diese werden in [http://www.mikrocontroller.net/svnbrowser/irmp/irmpconfig.h?view=markup irmpconfig.h] eingestellt.&lt;br /&gt;
&lt;br /&gt;
==== F_INTERRUPTS ====&lt;br /&gt;
&lt;br /&gt;
Anzahl der Interrupts pro Sekunde. Der Wert kann zwischen 10000 und 20000 eingestellt werden. Je höher der Wert, desto besser die Auflösung und damit die Erkennung. Allerdings erkauft man sich diesen Vorteil mit erhöhter CPU-Last. Der Wert 15000 ist meist ein guter Kompromiss.&lt;br /&gt;
&lt;br /&gt;
Standardwert:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
#define F_INTERRUPTS                            15000      // interrupts per second&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auf AVR-Prozessoren wird in der Beispielroutine in [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-avr.c?view=markup irmp-main-avr.c] der Timer1 mit 16-Bit-Genauigkeit verwendet. Sollte der Timer1 aus irgendwelchen Gründen nicht verfügbar sein, kann man alternativ auch den Timer2 mit 8-Bit-Genauigkeit verwenden.&lt;br /&gt;
&lt;br /&gt;
In diesem Fall wird dieser dann konfiguriert über:&lt;br /&gt;
&lt;br /&gt;
Für ATmega8/ATmega16/ATmega32:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
OCR2   =  (uint8_t) ((F_CPU / F_INTERRUPTS) / 8) - 1 + 0.5);   // Compare Register OCR2&lt;br /&gt;
TCCR2  = (1 &amp;lt;&amp;lt; WGM21) | (1 &amp;lt;&amp;lt; CS21);                           // CTC Mode, prescaler = 8&lt;br /&gt;
TIMSK  = 1 &amp;lt;&amp;lt; OCIE2;                                           // enable timer2 interrupt&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER2_COMP_vect)&lt;br /&gt;
{&lt;br /&gt;
  (void) irmp_ISR(); &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für ATmega88/ATmega168/ATmega328:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
OCR2A   =  (uint8_t) ((F_CPU / F_INTERRUPTS) / 8) - 1 + 0.5);   // Compare Register OCR2&lt;br /&gt;
TCCR2A  = (1 &amp;lt;&amp;lt; WGM21);                                         // CTC Mode, prescaler = 8 &lt;br /&gt;
TCCR2B  =  (1 &amp;lt;&amp;lt; CS21);                                         // CTC Mode, prescaler = 8&lt;br /&gt;
TIMSK2  = 1 &amp;lt;&amp;lt; OCIE2A;                                          // enable timer2 interrupt&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER2_COMPA_vect)&lt;br /&gt;
{&lt;br /&gt;
   (void) irmp_ISR(); &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei anderen AVR-µCs empfiehlt sich ein Blick ins Datenblatt.&lt;br /&gt;
&lt;br /&gt;
Man sollte in diesem Fall nicht vergessen, auch die Interrupt-Routine an den Timer2 anzupassen:&lt;br /&gt;
&lt;br /&gt;
==== IRMP_SUPPORT_xxx_PROTOCOL ====&lt;br /&gt;
&lt;br /&gt;
Hier lässt sich einstellen, welche Protokolle von [[IRMP#top|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 [http://www.mikrocontroller.net/svnbrowser/irmp/irmpconfig.h?view=markup irmpconfig.h] anzupassen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&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;
&lt;br /&gt;
// more protocols, enable here!                 Enable  Remarks                 F_INTERRUPTS            Program Space&lt;br /&gt;
#define IRMP_SUPPORT_DENON_PROTOCOL             0       // DENON, Sharp         &amp;gt;= 10000                 ~250 bytes&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 (SDA2008)       &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_BOSE_PROTOCOL              0       // BOSE                 &amp;gt;= 10000                 ~150 bytes&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_ORTEK_PROTOCOL             0       // ORTEK (Hama)         &amp;gt;= 10000                 ~150 bytes&lt;br /&gt;
#define IRMP_SUPPORT_TELEFUNKEN_PROTOCOL        0       // Telefunken 1560      &amp;gt;= 10000                 ~150 bytes&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_ROOMBA_PROTOCOL            0       // iRobot Roomba        &amp;gt;= 10000                 ~150 bytes&lt;br /&gt;
#define IRMP_SUPPORT_RUWIDO_PROTOCOL            0       // RUWIDO, T-Home       &amp;gt;= 15000                 ~550 bytes&lt;br /&gt;
#define IRMP_SUPPORT_A1TVBOX_PROTOCOL           0       // A1 TV BOX            &amp;gt;= 15000 (better 20000)  ~300 bytes&lt;br /&gt;
#define IRMP_SUPPORT_LEGO_PROTOCOL              0       // LEGO Power RC        &amp;gt;= 20000                 ~150 bytes&lt;br /&gt;
#define IRMP_SUPPORT_RCMM_PROTOCOL              0       // RCMM 12,24, or 32    &amp;gt;= 20000                 ~150 bytes&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jedes von [[IRMP#top|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 [[IRMP#B&amp;amp;O|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 [[IRMP#B&amp;amp;O|B&amp;amp;O]]-Protokoll (455kHz) mehr empfangen. &lt;br /&gt;
&lt;br /&gt;
Ausserdem werden die Protokolle [[IRMP#SIEMENS_+_RUWIDO|SIEMENS]]/[[IRMP#FDC|FDC]]/[[IRMP#RCCAR|RCCAR]] erst ab einer Scan-Frequenz von ca. 15kHz zuverlässig erkannt. Bei [[IRMP#LEGO|LEGO]] sind es sogar 20kHz. Wenn man also diese Protokolle nutzen will, muss man [[IRMP#F_INTERRUPTS|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;
==== IRMP_PORT_LETTER + IRMP_BIT_NUMBER ====&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;
Standardwert ist PORT B6:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
/*----------------------------------------------------------------------------------------------------------------&lt;br /&gt;
 * Change hardware pin here for ATMEL AVR&lt;br /&gt;
 *----------------------------------------------------------------------------------------------------------------&lt;br /&gt;
 */&lt;br /&gt;
#if defined (ATMEL_AVR)                         // use PB6 as IR input on AVR&lt;br /&gt;
#  define IRMP_PORT_LETTER                      B&lt;br /&gt;
#  define IRMP_BIT_NUMBER                       6&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese beiden Werte sind an den tatsächlichen Hardware-Pin des µCs anzupassen. &lt;br /&gt;
&lt;br /&gt;
Dies gilt ebenso für die STM32-µCs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
/*----------------------------------------------------------------------------------------------------------------&lt;br /&gt;
 * Change hardware pin here for ARM STM32&lt;br /&gt;
 *----------------------------------------------------------------------------------------------------------------&lt;br /&gt;
 */&lt;br /&gt;
#elif defined (ARM_STM32)                       // use C13 as IR input on STM32&lt;br /&gt;
#  define IRMP_PORT_LETTER                      C&lt;br /&gt;
#  define IRMP_BIT_NUMBER                       13&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wird die STM32-HAL Library verwendet, definiert man die beiden Konstanten IRSND_Transmit_GPIO_Port und IRSND_Transmit_Pin in STM32Cube (Main.h). In diesem Fall ist hier nichts weiter anzupassen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
/*----------------------------------------------------------------------------------------------------------------&lt;br /&gt;
 * ARM STM32 with HAL section - don&#039;t change here, define IRSND_Transmit_GPIO_Port &amp;amp; IRSND_Transmit_Pin in STM32Cube (Main.h)&lt;br /&gt;
 *----------------------------------------------------------------------------------------------------------------&lt;br /&gt;
 */&lt;br /&gt;
#elif defined (ARM_STM32_HAL)                                           // IRSND_Transmit_GPIO_Port &amp;amp; IRSND_Transmit_Pin must be defined in STM32Cube&lt;br /&gt;
#  define IRSND_PORT_LETTER                     IRSND_Transmit_GPIO_Port//Port of Transmit PWM Pin e.g.&lt;br /&gt;
#  define IRSND_BIT_NUMBER                      IRSND_Transmit_Pin      //Pim of Transmit PWM Pin e.g.&lt;br /&gt;
#  define IRSND_TIMER_HANDLER                   htim2                   //Handler of Timer e.g. htim (see tim.h)&lt;br /&gt;
#  define IRSND_TIMER_CHANNEL_NUMBER            TIM_CHANNEL_2           //Channel of the used Timer PWM Pin e.g. TIM_CHANNEL_2&lt;br /&gt;
#  define IRSND_TIMER_SPEED_APBX                64000000                //Speed of the corresponding APBx. (see STM32CubeMX: Clock Configuration)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier der entsprechende Abschnitt für STM8-µCs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
/*----------------------------------------------------------------------------------------------------------------&lt;br /&gt;
 * Change hardware pin here for STM8&lt;br /&gt;
 *----------------------------------------------------------------------------------------------------------------&lt;br /&gt;
 */&lt;br /&gt;
#elif defined (SDCC_STM8)                       // use PA1 as IR input on STM8&lt;br /&gt;
#  define IRMP_PORT_LETTER                      A&lt;br /&gt;
#  define IRMP_BIT_NUMBER                       1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei den PIC-Prozessoren gibt es lediglich die anzupassende Konstante &#039;&#039;&#039;IRMP_PIN&#039;&#039;&#039; - je nach Compiler:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
/*----------------------------------------------------------------------------------------------------------------&lt;br /&gt;
 * Change hardware pin here for PIC C18 compiler&lt;br /&gt;
 *----------------------------------------------------------------------------------------------------------------&lt;br /&gt;
 */&lt;br /&gt;
#elif defined (PIC_C18)                         // use RB4 as IR input on PIC&lt;br /&gt;
#  define IRMP_PIN                              PORTBbits.RB4&lt;br /&gt;
&lt;br /&gt;
/*----------------------------------------------------------------------------------------------------------------&lt;br /&gt;
 * Change hardware pin here for PIC CCS compiler&lt;br /&gt;
 *----------------------------------------------------------------------------------------------------------------&lt;br /&gt;
 */&lt;br /&gt;
#elif defined (PIC_CCS)                         // use PB4 as IR input on PIC&lt;br /&gt;
#  define IRMP_PIN                              PIN_B4&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei ChibiOS HAL definiert man in der Board-Config (board.chcfg) von ChibiOS einen Pin mit dem Namen &#039;&#039;&#039;IR_IN&#039;&#039;&#039; und generiert die Boarddatei neu. Wenn man einen anderen Namen für den Pin verwenden möchte, kann man auch die Konstante &#039;&#039;&#039;IRMP_PIN&#039;&#039;&#039; &lt;br /&gt;
in der irmpconfig.h anpassen. Vor den Namen des Pins aus der Board-Config dann &amp;quot;LINE_&amp;quot; voranstellen, da in IRMP die &lt;br /&gt;
&amp;quot;Line&amp;quot;-Variante der PAL-Schnittstelle verwendet wird:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
/*----------------------------------------------------------------------------------------------------------------&lt;br /&gt;
 * Change hardware pin here for ChibiOS HAL&lt;br /&gt;
 *----------------------------------------------------------------------------------------------------------------&lt;br /&gt;
 */&lt;br /&gt;
#elif defined(_CHIBIOS_HAL_)&lt;br /&gt;
#  define IRMP_PIN                              LINE_IR_IN              // use pin names as defined in the board config file, prefixed with &amp;quot;LINE_&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== IRMP_HIGH_ACTIVE ====&lt;br /&gt;
&lt;br /&gt;
Standardwert:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
#  define IRMP_HIGH_ACTIVE                      0                       // set to 1 if you use a RF receiver!&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Setzt man einen Funkempfänger statt einem IR-Sensor ein, um Funkprotokolle zu decodieren, so arbeiten diese in der Regel mit aktivem High-Pegel. Deshalb sollte man diesen Wert dann auf 1 setzen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#FF0000&amp;quot;&amp;gt;&#039;&#039;&#039;NEU:&#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== IRMP_ENABLE_RELEASE_DETECTION ====&lt;br /&gt;
&lt;br /&gt;
Standardwert:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
#  define IRMP_ENABLE_RELEASE_DETECTION         0                       //  enable detection of key releases&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wird dieser Wert auf 1 gesetzt, kann das Loslassen einer Fernbedienungstaste detektiert werden. Die Funktion irmp_get_data() setzt dann im Struct-Member irmp_data.flags das Bit IRMP_FLAG_RELEASE, sobald das Senden eines Codes aufgehört hat. Ein praktisches Beispiel dafür findet man im Kapitel &#039;&#039;&#039;[[IRMP#.22Entprellen.22_von_Tasten|Entprellen von Tasten]]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== IRMP_USE_CALLBACK ====&lt;br /&gt;
&lt;br /&gt;
Standardwert:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
#define IRMP_USE_CALLBACK                      0        // flag: 0 = don&#039;t use callbacks, 1 = use callbacks, default is 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn man Callbacks einschaltet, wird bei jeder Pegeländerung des Eingangs eine Callback-Funktion aufgerufen. Dies kann zum Beispiel dafür verwendet werden, das eingehende IR-Signal sichtbar zu machen, also als Signal an einem weiteren Pin auszugeben.&lt;br /&gt;
&lt;br /&gt;
Hier ein Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
#define LED_PORT PORTD                                  // LED at PD6&lt;br /&gt;
#define LED_DDR  DDRD&lt;br /&gt;
#define LED_PIN  6&lt;br /&gt;
&lt;br /&gt;
/*------------------------------------------------------------------------------------------------------------&lt;br /&gt;
 * Called (back) from IRMP module&lt;br /&gt;
 * This example switches a LED (which is connected to Vcc)&lt;br /&gt;
 *-------------------------------------------------------------------------------------------------------------&lt;br /&gt;
 */&lt;br /&gt;
void&lt;br /&gt;
led_callback (uint_fast8_t on)&lt;br /&gt;
{&lt;br /&gt;
    if (on)&lt;br /&gt;
    {&lt;br /&gt;
       LED_PORT &amp;amp;= ~(1 &amp;lt;&amp;lt; LED_PIN);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
       LED_PORT |= (1 &amp;lt;&amp;lt; LED_PIN);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int&lt;br /&gt;
main ()&lt;br /&gt;
{&lt;br /&gt;
    ...&lt;br /&gt;
    irmp_init ();&lt;br /&gt;
&lt;br /&gt;
    LED_DDR |= (1 &amp;lt;&amp;lt; LED_PIN);         // LED pin to output&lt;br /&gt;
    LED_PORT |= (1 &amp;lt;&amp;lt; LED_PIN);        // switch LED off (active low)&lt;br /&gt;
    irmp_set_callback_ptr (led_callback);&lt;br /&gt;
&lt;br /&gt;
    sei ();&lt;br /&gt;
    ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== IRMP_USE_IDLE_CALL ====&lt;br /&gt;
&lt;br /&gt;
Normalerweise wird die Funktion irmp_ISR() ständig mit der Frequenz F_INTERRUPTS (10-20kHz) aufgerufen. Der Controller&lt;br /&gt;
kann daher kaum in einen energiesparenden Sleep-Modus wechseln, bzw. muss ständig aus diesem wieder aufwachen. Kommt&lt;br /&gt;
es auf den Stromverbrauch an, wie z.B. bei Batteriebetrieb, ist diese Vorgehensweise nicht optimal.&lt;br /&gt;
&lt;br /&gt;
Wenn man &#039;&#039;&#039;IRMP_USE_IDLE_CALL&#039;&#039;&#039; aktiviert, erkennt IRMP wenn kein IR-Empfang im Gange ist und ruft dann die Funktion &lt;br /&gt;
&#039;&#039;&#039;irmp_idle()&#039;&#039;&#039; auf. Diese ist controllerspezifisch und muss vom Nutzer bereitgestellt und hinzugelinkt werden. Dort kann dann in den Empfangspausen der Controller schlafen gelegt und so der Energieverbrauch reduziert werden.&lt;br /&gt;
&lt;br /&gt;
Empfohlen wird in der irmp_idle() den Timer-Interrupt zu deaktivieren und statt dessen einen Pinchange-Interrupt zu aktivieren.  Danach kann der Controller schlafen geschickt werden. Wird eine fallende Flanke auf dem IR-Eingang erkannt, wird der Pinchange-Interrupt deaktiviert, der Timer wieder aktiviert und sofort irmp_ISR() aufgerufen. Ein Beispiel für die Verwendung von irmp_idle() findet sich in [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-chibios.c?view=markup irmp-main-chibios.c].&lt;br /&gt;
&lt;br /&gt;
IRMP rein anhand von Pinchange-Interrupts und ohne Timer-Interrupts zu betreiben ist nicht vorgesehen.&lt;br /&gt;
&lt;br /&gt;
==== IRMP_USE_EVENT ====&lt;br /&gt;
&lt;br /&gt;
Wenn man IRMP zusammen mit ChibiOS/RT oder ChibiOS/NIL verwendet, kann man deren Event-System verwenden um einen&lt;br /&gt;
Thread aufzuwecken sobald neue IR-Daten empfangen und decodiert wurden.&lt;br /&gt;
&lt;br /&gt;
Dazu setzt man in der irmpconfig.h die Konstante &#039;&#039;&#039;IRMP_USE_EVENT&#039;&#039;&#039; auf 1. &#039;&#039;&#039;IRMP_EVENT_BIT&#039;&#039;&#039; definiert den&lt;br /&gt;
Bitwert in der Event-Bitmaske, der den IRMP-Event symbolisieren soll. Mit &#039;&#039;&#039;IRMP_EVENT_THREAD_PTR&#039;&#039;&#039; wird der&lt;br /&gt;
Variablenname des Threadpointers festgelegt, an den der Event gesendet wird.&lt;br /&gt;
&lt;br /&gt;
In der irmpconfig.h sieht das in der Praxis so aus:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
/*------------------------------------------------------------------------------------------------------------&lt;br /&gt;
 * Use ChibiOS Events to signal that valid IR data was received&lt;br /&gt;
 *------------------------------------------------------------------------------------------------------------&lt;br /&gt;
 */&lt;br /&gt;
#if defined(_CHIBIOS_RT_) || defined(_CHIBIOS_NIL_)&lt;br /&gt;
&lt;br /&gt;
#  ifndef IRMP_USE_EVENT&lt;br /&gt;
#    define IRMP_USE_EVENT                      1       // 1: use event. 0: do not. default is 0&lt;br /&gt;
#  endif&lt;br /&gt;
&lt;br /&gt;
#  if IRMP_USE_EVENT == 1 &amp;amp;&amp;amp; !defined(IRMP_EVENT_BIT)&lt;br /&gt;
#    define IRMP_EVENT_BIT                      1                     // event flag or bit to send&lt;br /&gt;
#  endif&lt;br /&gt;
#  if IRMP_USE_EVENT == 1 &amp;amp;&amp;amp; !defined(IRMP_EVENT_THREAD_PTR)&lt;br /&gt;
#    define IRMP_EVENT_THREAD_PTR               ir_receive_thread_p   // pointer to the thread to send the event to&lt;br /&gt;
extern thread_t *IRMP_EVENT_THREAD_PTR;                               // the pointer must be defined and initialized elsewhere&lt;br /&gt;
#  endif&lt;br /&gt;
&lt;br /&gt;
#endif // _CHIBIOS_RT_ || _CHIBIOS_NIL_&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In seinem ChibiOS-Projekt verwendet man das dann so:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
thread_t *ir_receive_thread_p = NULL;&lt;br /&gt;
&lt;br /&gt;
static THD_FUNCTION(IRThread, arg)&lt;br /&gt;
{&lt;br /&gt;
    ir_receive_thread_p = chThdGetSelfX();&lt;br /&gt;
    [...]&lt;br /&gt;
    while (true)&lt;br /&gt;
    {&lt;br /&gt;
        // wait for event sent from irmp_ISR&lt;br /&gt;
        chEvtWaitAnyTimeout(ALL_EVENTS,TIME_INFINITE);&lt;br /&gt;
&lt;br /&gt;
        if (irmp_get_data (&amp;amp;irmp_data))&lt;br /&gt;
            // Daten aus irmp_data verwenden&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== IRMP_LOGGING ====&lt;br /&gt;
&lt;br /&gt;
Mit IRMP_LOGGING kann das Protokollieren von eingehenden IR-Frames eingeschaltet werden.&lt;br /&gt;
&lt;br /&gt;
Standardwert:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
#define IRMP_LOGGING                            0       // 1: log IR signal (scan), 0: do not. default is 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weitere Erläuterungen siehe [[IRMP#Scannen_von_unbekannten_IR-Protokollen|Scannen von unbekannten IR-Protokollen]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beachte: In der Regel braucht man IRMP_LOGGING nur dafür, um Samples aus den empfangenen IR-Frames zu erstellen, die weiter analysiert werden sollen. Daher sollte man sonst den Wert von IRMP_LOGGING immer auf 0 lassen.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Anwendung von IRMP ===&lt;br /&gt;
&lt;br /&gt;
Die von [[IRMP#top|IRMP]] unterstützten Protokolle weisen Bitlängen - teilweise variabel, teilweise fest - von 2 bis 48 Bit auf. Diese werden über Preprocessor-Defines beschrieben.&lt;br /&gt;
&lt;br /&gt;
[[IRMP#top|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;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
    irmp_data_p-&amp;gt;protocol (8 Bit)&lt;br /&gt;
    irmp_data_p-&amp;gt;address (16 Bit)&lt;br /&gt;
    irmp_data_p-&amp;gt;command (16 Bit)&lt;br /&gt;
    irmp_data_p-&amp;gt;flags (8 Bit)&lt;br /&gt;
&amp;lt;/syntaxhighlight&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;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier die möglichen Werte für irmp_data.protocol, siehe auch [http://www.mikrocontroller.net/svnbrowser/irmp/irmpprotocols.h?view=markup irmpprotocols.h]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&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 (SDA2008)&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;
#define IRMP_BOSE_PROTOCOL              31      // BOSE&lt;br /&gt;
#define IRMP_A1TVBOX_PROTOCOL           32      // A1 TV Box&lt;br /&gt;
#define IRMP_ORTEK_PROTOCOL             33      // ORTEK - Hama&lt;br /&gt;
#define IRMP_TELEFUNKEN_PROTOCOL        34      // Telefunken (1560)&lt;br /&gt;
#define IRMP_ROOMBA_PROTOCOL            35      // iRobot Roomba vacuum cleaner&lt;br /&gt;
#define IRMP_RCMM32_PROTOCOL            36      // Fujitsu-Siemens (Activy remote control)&lt;br /&gt;
#define IRMP_RCMM24_PROTOCOL            37      // Fujitsu-Siemens (Activy keyboard)&lt;br /&gt;
#define IRMP_RCMM12_PROTOCOL            38      // Fujitsu-Siemens (Activy keyboard)&lt;br /&gt;
#define IRMP_SPEAKER_PROTOCOL           39      // Another loudspeaker protocol, similar to Nubert&lt;br /&gt;
#define IRMP_LGAIR_PROTOCOL             40      // LG air conditioner&lt;br /&gt;
#define IRMP_SAMSUNG48_PROTOCOL         41      // air conditioner with SAMSUNG protocol (48 bits)&lt;br /&gt;
#define IRMP_MERLIN_PROTOCOL            42      // Merlin (Pollin 620 185)&lt;br /&gt;
#define IRMP_PENTAX_PROTOCOL            43      // Pentax camera&lt;br /&gt;
#define IRMP_FAN_PROTOCOL               44      // FAN (ventilator), very similar to NUBERT, but last bit is data bit instead of stop bit&lt;br /&gt;
#define IRMP_S100_PROTOCOL              45      // very similar to RC5, but 14 instead of 13 data bits&lt;br /&gt;
#define IRMP_ACP24_PROTOCOL             46      // Stiebel Eltron ACP24 air conditioner&lt;br /&gt;
#define IRMP_TECHNICS_PROTOCOL          47      // Technics, similar to Matsushita, but 22 instead of 24 bits&lt;br /&gt;
#define IRMP_PANASONIC_PROTOCOL         48      // Panasonic (Beamer), start bits similar to KASEIKYO&lt;br /&gt;
#define IRMP_MITSU_HEAVY_PROTOCOL       49      // Mitsubishi-Heavy Aircondition, similar timing as Panasonic beamer&lt;br /&gt;
#define IRMP_VINCENT_PROTOCOL           50      // Vincent&lt;br /&gt;
#define IRMP_SAMSUNGAH_PROTOCOL         51      // SAMSUNG AH&lt;br /&gt;
#define IRMP_IRMP16_PROTOCOL            52      // IRMP specific protocol for data transfer, e.g. between two microcontrollers via IR&lt;br /&gt;
#define IRMP_GREE_PROTOCOL              53      // Gree climate&lt;br /&gt;
#define IRMP_RCII_PROTOCOL              54      // RC II Infra Red Remote Control Protocol for FM8&lt;br /&gt;
#define IRMP_METZ_PROTOCOL              55      // METZ&lt;br /&gt;
#define IRMP_ONKYO_PROTOCOL             56      // Onkyo&lt;br /&gt;
&lt;br /&gt;
#define RF_GEN24_PROTOCOL               57      // RF Generic, 24 Bits (Pollin 550666)&lt;br /&gt;
#define RF_X10_PROTOCOL                 58      // RF PC X10 Remote Control (Medion, Pollin 721815)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&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 [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-avr.c?view=markup 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;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&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;/syntaxhighlight&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 [[LED-Fading|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;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#FF0000&amp;quot;&amp;gt;&#039;&#039;&#039;NEU:&#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Seit der Version 3.2.2 gibt es die Möglichkeit, das Loslassen einer Taste zu detektieren. In diesem Fall wird das Flag IRMP_FLAG_RELEASE gesetzt, wenn die verwendete Fernbedienung das (wiederholte) Senden der IR- oder RF-Frames eingestellt hat.&lt;br /&gt;
&lt;br /&gt;
Ein Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
    IRMP_DATA irmp_data;&lt;br /&gt;
&lt;br /&gt;
    while (1)&lt;br /&gt;
    {&lt;br /&gt;
        if (irmp_get_data (&amp;amp;irmp_data))&lt;br /&gt;
        {&lt;br /&gt;
            if (irmp_data.protocol == NEC_PROTOCOL &amp;amp;&amp;amp; irmp_data.address == 0x1234)&lt;br /&gt;
            {&lt;br /&gt;
                 if (irmp_data.command == 0x42 &amp;amp;&amp;amp; irmp_data.flags == 0x00) // Erster Frame, flags nicht gesetzt&lt;br /&gt;
                 {&lt;br /&gt;
                     motor_on ();&lt;br /&gt;
                 }&lt;br /&gt;
                 else if (irmp_data.flags &amp;amp; IRMP_FLAG_RELEASE)             // Taste wurde losgelassen&lt;br /&gt;
                 {&lt;br /&gt;
                     motor_off ();&lt;br /&gt;
                 }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim obigen Beispiel wird ein Motor eingeschaltet, sobald man eine bestimmte Taste auf der Fernbedienung drückt. Der Motor wird dann erst wieder gestoppt, wenn man die Taste wieder loslässt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig beim Prüfen von IRMP_FLAG_RELEASE:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Man darf sich nicht darauf verlassen, dass irmp_data.command dabei noch den ursprünglichen Kommando-Code enthält - hier also 0x42. Es gibt nämlich Fernbedienungen (zum Beispiel Funksteckdosen-Sender), welche selbst einen speziellen Key-Release-Code senden, wenn die Taste losgelassen wurde. Also prüft man lediglich die Übereinstimmung von irmp_data.address, bevor man das Flag testet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dieses Feature muss explizit in irmpconfig.h durch Ändern der Konfigurationsvariablen IRMP_ENABLE_RELEASE_DETECTION freigeschaltet werden!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Arbeitsweise ==&lt;br /&gt;
&lt;br /&gt;
Das &amp;quot;Working Horse&amp;quot; von [[IRMP#top|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 [[IRMP#F_INTERRUPTS|F_INTERRUPTS]] in [http://www.mikrocontroller.net/svnbrowser/irmp/irmpconfig.h?view=markup 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 [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-avr.c?view=markup irmp-main-avr.c].&lt;br /&gt;
&lt;br /&gt;
== Scannen von unbekannten IR-Protokollen ==&lt;br /&gt;
&lt;br /&gt;
Stellt man in [http://www.mikrocontroller.net/svnbrowser/irmp/irmpconfig.h?view=markup irmpconfig.h] in der Zeile&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
    #define IRMP_LOGGING    0   // 1: log IR signal (scan), 0: do not (default)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
den Wert für [[IRMP#IRMP_LOGGING|IRMP_LOGGING]] auf 1, wird in [[IRMP#top|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: Für PIC-Prozessoren gibt es ein eigenes Logging-Modul namens [http://www.mikrocontroller.net/svnbrowser/irmp/irmpextlog.c?view=markup irmpextlog.c]. Dieses ermöglicht das Logging über USB. Für AVR-Prozessoren ist [http://www.mikrocontroller.net/svnbrowser/irmp/irmpextlog.c?view=markup irmpextlog.c] irrelevant&#039;&#039;&#039;&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#top|IRMP]] an das unbekannte Protokoll anzupassen - siehe nächstes Kapitel.&lt;br /&gt;
&lt;br /&gt;
Wer eine Fernbedienung hat, die nicht von [[IRMP#top|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;
=== Übersetzen ===&lt;br /&gt;
&lt;br /&gt;
[http://www.mikrocontroller.net/svnbrowser/irmp/irmp.c?view=markup 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#top|IRMP]] direkt zum &amp;quot;Fraß&amp;quot; vorwerfen kann. &lt;br /&gt;
&lt;br /&gt;
Das Übersetzen von [[IRMP#top|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-10kHz: 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;
=== Aufruf von IRMP ===&lt;br /&gt;
&lt;br /&gt;
Der Aufruf geschieht dann über:&lt;br /&gt;
&lt;br /&gt;
  ./irmp-nnkHz [-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;
=== Normale Ausgabe ===&lt;br /&gt;
&lt;br /&gt;
   ./irmp-10kHz &amp;lt; IR-Data/orion_vcr_07660BM070.txt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Listen-Ausgabe ===&lt;br /&gt;
&lt;br /&gt;
   ./irmp-10kHz -l &amp;lt; IR-Data/orion_vcr_07660BM070.txt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Analyse ===&lt;br /&gt;
&lt;br /&gt;
   ./irmp-10kHz -a &amp;lt; IR-Data/orion_vcr_07660BM070.txt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&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;/pre&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;
=== Ausführliche Ausgabe ===&lt;br /&gt;
&lt;br /&gt;
    ./irmp-10kHz -v &amp;lt; IR-Data/orion_vcr_07660BM070.txt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
# 1 - IR-cmd: 0x0001&lt;br /&gt;
   0.200ms [starting pulse]&lt;br /&gt;
  13.700ms [start-bit: pulse = 91, pause = 44]&lt;br /&gt;
protocol = NEC, start bit timings: pulse:  62 - 118, pause:  30 -  60&lt;br /&gt;
pulse_1:   3 -   8&lt;br /&gt;
pause_1:  11 -  23&lt;br /&gt;
pulse_0:   3 -   8&lt;br /&gt;
pause_0:   3 -   8&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;
  14.800ms [bit  0: pulse =   6, pause =   5] 0&lt;br /&gt;
  16.000ms [bit  1: pulse =   6, pause =   6] 0&lt;br /&gt;
  17.100ms [bit  2: pulse =   6, pause =   5] 0&lt;br /&gt;
  18.200ms [bit  3: pulse =   6, pause =   5] 0&lt;br /&gt;
  19.300ms [bit  4: pulse =   6, pause =   5] 0&lt;br /&gt;
  20.500ms [bit  5: pulse =   6, pause =   6] 0&lt;br /&gt;
  21.600ms [bit  6: pulse =   6, pause =   5] 0&lt;br /&gt;
  23.800ms [bit  7: pulse =   6, pause =  16] 1&lt;br /&gt;
  26.100ms [bit  8: pulse =   6, pause =  17] 1&lt;br /&gt;
  28.300ms [bit  9: pulse =   6, pause =  16] 1&lt;br /&gt;
  29.500ms [bit 10: pulse =   6, pause =   6] 0&lt;br /&gt;
  31.700ms [bit 11: pulse =   6, pause =  16] 1&lt;br /&gt;
  34.000ms [bit 12: pulse =   6, pause =  17] 1&lt;br /&gt;
  36.200ms [bit 13: pulse =   6, pause =  16] 1&lt;br /&gt;
  38.500ms [bit 14: pulse =   6, pause =  17] 1&lt;br /&gt;
  39.600ms [bit 15: pulse =   6, pause =   5] 0&lt;br /&gt;
  41.900ms [bit 16: pulse =   6, pause =  17] 1&lt;br /&gt;
  43.000ms [bit 17: pulse =   6, pause =   5] 0&lt;br /&gt;
  44.100ms [bit 18: pulse =   6, pause =   5] 0&lt;br /&gt;
  45.200ms [bit 19: pulse =   6, pause =   5] 0&lt;br /&gt;
  46.400ms [bit 20: pulse =   7, pause =   5] 0&lt;br /&gt;
  47.500ms [bit 21: pulse =   6, pause =   5] 0&lt;br /&gt;
  48.600ms [bit 22: pulse =   6, pause =   5] 0&lt;br /&gt;
  49.800ms [bit 23: pulse =   6, pause =   6] 0&lt;br /&gt;
  50.900ms [bit 24: pulse =   5, pause =   6] 0&lt;br /&gt;
  53.100ms [bit 25: pulse =   6, pause =  16] 1&lt;br /&gt;
  55.400ms [bit 26: pulse =   6, pause =  17] 1&lt;br /&gt;
  57.600ms [bit 27: pulse =   6, pause =  16] 1&lt;br /&gt;
  59.900ms [bit 28: pulse =   6, pause =  17] 1&lt;br /&gt;
  62.100ms [bit 29: pulse =   6, pause =  16] 1&lt;br /&gt;
  64.400ms [bit 30: pulse =   6, pause =  17] 1&lt;br /&gt;
  66.700ms [bit 31: pulse =   6, pause =  17] 1&lt;br /&gt;
stop bit detected&lt;br /&gt;
  67.300ms code detected, length = 32&lt;br /&gt;
  67.300ms p =  2, a = 0x7b80, c = 0x0001, f = 0x00&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Aufruf unter Windows ===&lt;br /&gt;
&lt;br /&gt;
[[IRMP#top|IRMP]] kann man 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-10kHz.exe &amp;lt; IR-Data\rc5x.txt&lt;br /&gt;
&lt;br /&gt;
Es gelten dieselben Optionen wie für die Linux-Version.&lt;br /&gt;
&lt;br /&gt;
=== Längere Ausgaben ===&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 einen Pager weiterzuleiten, damit man seitenweise blättern kann:&lt;br /&gt;
&lt;br /&gt;
Linux:&lt;br /&gt;
&lt;br /&gt;
            ./irmp-10kHz &amp;lt; IR-Data/rc5x.txt | less&lt;br /&gt;
&lt;br /&gt;
Windows:&lt;br /&gt;
&lt;br /&gt;
            irmp-10kHz.exe &amp;lt; IR-Data\rc5x.txt | more&lt;br /&gt;
&lt;br /&gt;
== Fernbedienungen ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! Protokoll || Bezeichnung || Gerät || Device Address&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP#NEC_+_extended_NEC|NEC]] || Toshiba CT-9859 || Fernseher || 0x5F40&lt;br /&gt;
|-&lt;br /&gt;
| || Toshiba VT-728G || V-728G Videorekorder || 0x5B44&lt;br /&gt;
|-&lt;br /&gt;
| || Elta 8848 MP 4 || DVD-Player || 0x7F00&lt;br /&gt;
|-&lt;br /&gt;
| || AS-218 || Askey TV-View CHP03X (TV-Karte) || 0x3B86&lt;br /&gt;
|-&lt;br /&gt;
| || Cyberhome ??? || Cyberhome DVD Player || 0x6D72&lt;br /&gt;
|-&lt;br /&gt;
| || WD TV Live || Western Digital Multimediaplayer || 0x1F30&lt;br /&gt;
|-&lt;br /&gt;
| || Canon WL-DC100 || Kamera Canon PowerShot G5 || 0xB1CA&lt;br /&gt;
|-&lt;br /&gt;
| || Bleil LED Flex-Band RGB || RGB-LED Band mit IR-Controller || 0xFE00&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP#NEC16|NEC16]] || Daewoo || Videorekorder || 0x0015&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP#KASEIKYO|KASEIKYO]] || Technics EUR646497 || AV Receiver SA-AX 730 || 0x2002&lt;br /&gt;
|-&lt;br /&gt;
| || Panasonic TV || Fernseher TX-L32EW6 || 0x2002&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP#RC5_+_RC5X|RC5]] || Loewe Assist/RC3/RC4 || Fernseher (FB auf TV-Mode) || 0x0000&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP#RC6_+_RC6A|RC6]] || Philips Television || Fernseher (FB auf TV-Mode) || 0x0000&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP#SIRCS|SIRCS]] || Sony RM-816 || Fernseher (FB auf TV-Mode) || 0x0000&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP#DENON|DENON]] || DENON RC970 || AVR3805 (Verstärker) || 0x0008&lt;br /&gt;
|-&lt;br /&gt;
| || DENON RC970 || DVD/CD-Player || 0x0002&lt;br /&gt;
|-&lt;br /&gt;
| || DENON RC970 || Tuner || 0x0006&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP#SAMSUNG32|SAMSUNG32]] || Samsung AA59-00484A || LE40D550 Fernseher || 0x0707&lt;br /&gt;
|-&lt;br /&gt;
| || LG AKB72033901 || Blu-Ray Player BD370 || 0x2D2D&lt;br /&gt;
|-&lt;br /&gt;
| [[IRMP#APPLE|APPLE]] || Apple || Apple Dock (iPod 2) || 0x0020&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Kameras ==&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width: 80%;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 20%;&amp;quot; |&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
[[IRMP#top|IRMP]] unterstützt zunehmend auch die Fernsteuerung von Kameras, nämlich:&lt;br /&gt;
&lt;br /&gt;
* [[IRMP#PENTAX|PENTAX]]&lt;br /&gt;
* [[IRMP#NIKON|NIKON]]&lt;br /&gt;
&lt;br /&gt;
Die Kommando-Vielfalt ist nicht gerade groß. Normalerweise verstehen die Kameras gerade mal das Kommando &amp;quot;Auslösen&amp;quot;.&lt;br /&gt;
||&lt;br /&gt;
[[Datei:Irmp-pentax.png|miniatur|Pentax-Protokoll]]&lt;br /&gt;
|}&lt;br /&gt;
Hier eine kleine Tabelle für [[IRMP#PENTAX|PENTAX]]-Kameras:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! Kommando || Funktion&lt;br /&gt;
|-&lt;br /&gt;
| 0x0000 || Auslösen&lt;br /&gt;
|-&lt;br /&gt;
| 0x0001 || Zoomlevel umschalten&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Da keine Adresse im [[IRMP#PENTAX|PENTAX]]-Protokoll vorgesehen ist, sollte man am diese beim Senden mittels [[IRSND]] am besten auf 0x0000 setzen. Ebenso sollte man in diesem Fall einen Quarz verwenden, da gerade die Nikons bezüglich des Timings sehr penibel sind.&lt;br /&gt;
&lt;br /&gt;
== IR-Tastaturen ==&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width: 80%;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 20%;&amp;quot; |&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
[[IRMP#top|IRMP]] unterstützt ab Version 1.7.0 auch IR-Tastaturen, nämlich die Infrarot-Tastatur FDC-3402 - &amp;lt;s&amp;gt;erhältlich bei Pollin (Art. 711 056) für weniger als 2 EUR.&amp;lt;/s&amp;gt;  (Vergriffen, Stand 19.09.2017)&lt;br /&gt;
&lt;br /&gt;
Beim Erkennen einer Taste gibt [[IRMP#top|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;
[[Datei:irmp-fdc3402.jpg|miniatur|FDC-3402-Tastatur]]&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; style=&amp;quot;font-size:50%; text-align:center;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background-color:#eeeeee;&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;
|-  style=&amp;quot;background-color:#eeeeee&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#top|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#top|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 [http://www.mikrocontroller.net/svnbrowser/irmp/irmp.c?view=markup 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;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&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;,  0xDF, &#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;,  0xFC, &#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;, 0xF6, 0xE4, &#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;,  0xDC, &#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;, 0xD6, 0xC4, &#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 = 0xB2;    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 = 0xB5;    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;/syntaxhighlight&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;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&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;/syntaxhighlight&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;
|-  style=&amp;quot;background-color:#eeeeee&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;
= Anhang =&lt;br /&gt;
&lt;br /&gt;
== Die IR-Protokolle im Detail ==&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width: 80%;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 20%;&amp;quot; |&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
=== Pulse Distance Protokolle ===&lt;br /&gt;
||&lt;br /&gt;
[[Datei:Pulse-Distance.png|miniatur|Pulse Distance Coding]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== NEC + extended NEC ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP#NEC-Protokoll|NEC + extended NEC]]&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&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;
|}&lt;br /&gt;
&lt;br /&gt;
==== ONKYO ====&lt;br /&gt;
&lt;br /&gt;
Wie [[IRMP#NEC|ext. NEC]], jedoch 16 unabhängige Datenbits, also:&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP#ONKYO-Protokoll|ONKYO]]&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Daten ONKYO || 16 Adress-Bits + 16 Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== JVC ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP#NEC16-Protokoll (JVC)|JVC]]&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&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;
==== NEC16 ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;NEC16&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&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;
|}&lt;br /&gt;
&lt;br /&gt;
==== NEC42 ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;NEC42&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&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 || nach 110ms (ab Start-Bit), 9000µs Puls, 2250µs Pause, 560µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== ACP24 ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP#ACP24-Protokoll|ACP24]]&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&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 + 70 Daten-Bits + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 0 Adress-Bits + 70 Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 390µs Puls, 950µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 390µs Puls,  950µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 390µs Puls, 1300µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || 390µ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 || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== LGAIR ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP#LGAIR-Protokoll|LGAIR]]&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&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 + 28 Daten-Bits + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 8 Adress-Bits + 16 Kommando-Bits + 4 Checksum-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 9000µs Puls, 4500µs Pause (identisch mit [[IRMP#NEC_.2B_extended_NEC|NEC]])&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 560µs Puls,  560µs Pause (identisch mit [[IRMP#NEC_.2B_extended_NEC|NEC]])&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 560µs Puls, 1690µs Pause (identisch mit [[IRMP#NEC_.2B_extended_NEC|NEC]])&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || 560µs Puls (identisch mit [[IRMP#NEC_.2B_extended_NEC|NEC]])&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 || MSB first (&#039;&#039;&#039;abweichend&#039;&#039;&#039; zu [[IRMP#NEC_.2B_extended_NEC|NEC]])&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SAMSUNG ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP#SAMSUNG-Protokoll|SAMSUNG]]&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&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,  550µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 550µs Puls, 1650µ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;
|}&lt;br /&gt;
&lt;br /&gt;
==== SAMSUNG32 ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;SAMSUNG32&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&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,  550µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 550µs Puls, 1650µ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 || Wiederholung nach ca. 47msec&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SAMSUNG48 ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;SAMSUNG48&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&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 Adress-Bits + 32 Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Kommando || 8 Bits + 8 invertierte Bits + 8 Bits + 8 invertierte 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,  550µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 550µs Puls, 1650µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || 550µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || eine nach ca. 5 msec&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;
|}&lt;br /&gt;
&lt;br /&gt;
==== MATSUSHITA ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP#MATSUHITA-Protokoll|MATSUSHITA]]&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 36 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Pulse Distance, Timing identisch mit [[IRMP#TECHNICS|TECHNICS]]&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 nach 40ms Pause&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || LSB first?&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== TECHNICS ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;TECHNICS&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 36 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Pulse Distance, Timing identisch mit [[IRMP#MATSUSHITA|MATSUSHITA]]&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 Start-Bit + 22 Daten-Bits + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 11 Kommando-Bits + 11 invertierte Kommando-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 nach 40ms Pause&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || LSB first?&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== KASEIKYO ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP#KASEIKYO-Protokoll (auch &amp;quot;Japan-Protokoll&amp;quot;)|KASEIKYO]]&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&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 || keine&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || N-fache Wiederholung des Original-Frames nach ca. 80ms Pause&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || LSB first?&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== RECS80 ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP#RECS80- und RECS80-Extended-Protokoll|RECS80]]&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&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;
|}&lt;br /&gt;
&lt;br /&gt;
==== RECS80EXT ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP#RECS80- und RECS80-Extended-Protokoll|RECS80EXT]]&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&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;
|}&lt;br /&gt;
&lt;br /&gt;
==== DENON ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP#Denon-Protokoll|DENON]]&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&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 Daten-Bits + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 5 Address-Bits + 10 Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Kommando || 6 Datenbits + 2 Extension Bits + 2 Data Construction 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 || Nach 65ms Wiederholung des Frames mit invertieren Kommando-Bits (Data Construction Bits = 11)&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || N-fache Wiederholung der beiden Original-Frames nach 65ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
(*) Data Construction Bits:&lt;br /&gt;
* 00 = Erster Frame Denon&lt;br /&gt;
* 10 = Erster Frame Sharp&lt;br /&gt;
* 01 = Wiederholungsframe Sharp&lt;br /&gt;
* 11 = Wiederholungsframe Denon&lt;br /&gt;
&lt;br /&gt;
==== APPLE ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;APPLE&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&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 [[IRMP#NEC_+_extended_NEC|NEC]]&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || siehe [[IRMP#NEC_+_extended_NEC|NEC]]&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || siehe [[IRMP#NEC_+_extended_NEC|NEC]]&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || siehe [[IRMP#NEC_+_extended_NEC|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;
|}&lt;br /&gt;
&lt;br /&gt;
==== BOSE ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;BOSE&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&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 || 0 Adress-Bits + 8 Kommando-Bits + 8 invertierte Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 1060µs Puls, 1425µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 550µs Puls,  437µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 550µs Puls, 1425µ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 || noch ungeklärt&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== B&amp;amp;O ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP#Bang &amp;amp; Olufsen|B&amp;amp;O]]&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&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;
|}&lt;br /&gt;
&lt;br /&gt;
==== FDC ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;FDC&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&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;
|}&lt;br /&gt;
&lt;br /&gt;
==== NIKON ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;NIKON&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&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 + 2 Daten-Bits + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 2 Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 2200µs Puls, 27100µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 500µs Puls,  1500µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 500µs Puls, 3500µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || 500µ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 || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== PANASONIC ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;PANASONIC&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&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 + 56 Daten-Bits + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 24 Bits (010000000000010000000001) + 16 Adress-Bits + 16 Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 3600µs Puls, 1600µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 565µs Puls,  316µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 565µs Puls, 1140µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || 565µ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;
|}&lt;br /&gt;
&lt;br /&gt;
==== PENTAX ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;PENTAX&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&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 + 6 Daten-Bits + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 6 Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 2200µs Puls, 27100µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 1000µs Puls,  1000µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 1000µs Puls, 3000µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || 1000µ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 || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== KATHREIN ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;KATHREIN&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&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 + 11 Daten-Bits + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 4 Adress-Bits + 7 Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 210µs Puls, 6218µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 210µs Puls,  1400µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 210µs Puls, 3000µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || 210µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || keine&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || nach 35ms?&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== LEGO ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP#LEGO Power Functions RC|LEGO]]&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&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 || 16 Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 158µs Puls, 1026µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 158µs Puls,  263µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 158µs Puls, 553µ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 || unbekannt&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== VINCENT ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP#VINCENT|VINCENT]]&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&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- und 8 Kommando-Bits + 8 wiederholte Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 2500µs Puls, 4600µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 550µs Puls,  550µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 550µs Puls, 1540µ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 || unbekannt&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || MSB first?&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== THOMSON ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;THOMSON&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 33 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Pulse Distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 0 Start-Bits + 12 Daten-Bits + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 4 Adress-Bits + 1 Toggle-Bit + 7 Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 550µs Puls,  2000µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-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 || Framewiederholung nach 35ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || vermutlich MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== TELEFUNKEN ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;TELEFUNKEN&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&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 + 15 Daten-Bits + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 0 Adress-Bits + 15 Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 600µs Puls, 1500µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 600µs Puls, 600µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 600µs Puls, 1500µ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 || unbekannt&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || vermutlich MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== RCCAR ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;RCCAR&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&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 || 13 Kommando-Bits&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 || nach 40ms?&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== RCMM ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP#RCMM-Protokoll|RCMM]]&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&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 RCMM32 || 1 Start-Bit + 32 Daten-Bits + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Frame RCMM24 || 1 Start-Bit + 24 Daten-Bits + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Frame RCMM12 || 1 Start-Bit + 12 Daten-Bits + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten RCMM32 || 16 Adress-Bits (= 4 Mode-Bits + 12 Device-Bits) + 1 Toggle-Bit + 15 Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Daten RCMM24 || 16 Adress-Bits (= 4 Mode-Bits + 12 Device-Bits) + 1 Toggle-Bit + 7 Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Daten RCMM12 || 4 Adress-Bits (= 2 Mode-Bits + 2 Device-Bits) + 8 Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 500µs Puls, 220µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 00-Bits || 230µs Puls, 220µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 01-Bits || 230µs Puls, 380µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 10-Bits || 230µs Puls, 550µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 11-Bits || 230µs Puls, 720µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || 230µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || keine&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || nach 80ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width: 80%;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 20%;&amp;quot; |&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
=== Pulse Width Protokolle ===&lt;br /&gt;
||&lt;br /&gt;
[[Datei:Pulse-Width.png|miniatur|Pulse Width Coding]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SIRCS ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP#SIRCS-Protokoll|SIRCS]]&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|Frequenz ||40 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Pulse Width&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;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width: 80%;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 20%;&amp;quot; |&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
=== Pulse Distance Width Protokolle ===&lt;br /&gt;
||&lt;br /&gt;
[[Datei:Pulse-Distance-Width.png|miniatur|Pulse Distance Width Coding]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== NUBERT ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;NUBERT&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 36 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Pulse Distance Width&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;
|}&lt;br /&gt;
&lt;br /&gt;
==== FAN ====&lt;br /&gt;
&lt;br /&gt;
Das Protokoll ist sehr ähnlich zu [[IRMP#NUBERT|NUBERT]], jedoch wird nur ein Frame gesandt. Außerdem werden 11 statt 10 Datenbits verwendet und kein Stop-Bit versandt. Die Pause zwischen Frame-Wiederholungen ist wesentlich geringer.&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;FAN &#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 36 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Pulse Distance Width&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 Start-Bit + 11 Daten-Bits + 0 Stop-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 0 Adress-Bits + 11 Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 1280µs Puls, 380µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 380µs Puls, 1280µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 1280µs Puls, 380µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || 500µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || keine&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || nach 6,6ms Pause&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SPEAKER ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;SPEAKER&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Pulse Distance Width&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 || 440µs Puls, 1250µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 440µs Puls, 1250µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 1250µs Puls, 440µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || 440µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || einmalig nach ca. 38ms&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;
|}&lt;br /&gt;
&lt;br /&gt;
==== ROOMBA ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;ROOMBA&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Pulse Distance Width&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 Start-Bit + 7 Daten-Bits + 0 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 0 Adress-Bits + 7 Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 2790µs Puls, 930µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 930µs Puls, 2790µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 2790µs Puls, 930µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || kein Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || dreimalig nach jeweils 18ms?&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || noch unbekannt&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width: 80%;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 20%;&amp;quot; |&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
=== Biphase Protokolle ===&lt;br /&gt;
||&lt;br /&gt;
[[Datei:Biphase-Coding.png|miniatur|Biphase Coding]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== RC5 + RC5X ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP#RC5- und RC5x-Protokoll|RC5 + RC5X]]&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 36 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Biphase (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;
|}&lt;br /&gt;
&lt;br /&gt;
==== RCII ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;RCII&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 31.25 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Biphase (Manchester)&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 Pre-Bit + 1 Start-Bit + 9 Daten-Bits + 0 Stop-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 0 Adress-Bits + 9 Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Pre-Bit || 512µs Puls, 2560µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 1024µs Puls, &#039;&#039;&#039;keine Pause&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 512µs Pause, 512µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 512µs Puls, 512µ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 nach 118ms&lt;br /&gt;
|-&lt;br /&gt;
| Bemerkung || Beim Tasten-Loslassen wird ein Frame mit Kommando 111111111 = 0x1FF gesandt&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== S100 ====&lt;br /&gt;
&lt;br /&gt;
Ähnlich zu RC5x, aber 14 statt 13 Daten-Bits und 56kHz Modulation&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;S100&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 56 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Biphase (Manchester)&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 Start-Bit + 14 Daten-Bits + 0 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 1 invertiertes Kommando-Bit + 1 Toggle-Bit + 5 Adress-Bits + 7 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;
|}&lt;br /&gt;
&lt;br /&gt;
==== RC6 + RC6A ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP#RC6 und RC6A-Protokoll|RC6 + RC6A]]&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 36 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Biphase (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;
| Daten RC6A Pace (Sky) || &amp;quot;1&amp;quot; + 3 Mode-Bits (&amp;quot;110&amp;quot;) + 1 Toggle-Bit(UNUSED &amp;quot;0&amp;quot;) + 16 Bit + 1 Toggle(!) + 15 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;
|}&lt;br /&gt;
&lt;br /&gt;
==== GRUNDIG + NOKIA ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP#Grundig-Protokoll|GRUNDIG + NOKIA]]&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 38 kHz (?)&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Biphase (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 + 0 Adress-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Daten Nokia || 8 Kommando-Bits + 8 Adress-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;
|}&lt;br /&gt;
&lt;br /&gt;
==== IR60 (SDA2008) ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;[[IRMP#IR60 (SDA2008 bzw. MC14497P)|IR60 (SDA2008)]]&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 30 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Biphase (Manchester)&lt;br /&gt;
|-&lt;br /&gt;
| Start Frame || 1 Start-Bit + 101111 + 0 Stop-Bits + 22ms Pause&lt;br /&gt;
|-&lt;br /&gt;
| Daten Frame || 1 Start-Bit + 7 Daten-Bits + 0 Stop-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 0 Adress-Bits + 7 Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 528µs Puls, 2639µ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;
|}&lt;br /&gt;
&lt;br /&gt;
==== SIEMENS + RUWIDO ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;SIEMENS + RUWIDO&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 36 kHz? (Merlin-Tastatur mit Ruwido-Protokoll: 56 kHz)&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Biphase (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 Kommando-Bits + 1 invertiertes Bit (letztes Bit davor nochmal invertiert)&lt;br /&gt;
|-&lt;br /&gt;
| Daten Ruwido || 9 Adress-Bits + 7 Kommando-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;
==== A1TVBOX ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;A1TVBOX&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Biphase (Manchester) asymmetrisch&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 2 Start-Bits + 16 Daten-Bits + 0 Stop-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 8 Adress-Bits + 8 Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bits || &amp;quot;10&amp;quot;, also 250µs Puls, 150µs + 150µs Pause, 250µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 150µs Pause, 250µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 250µs Puls, 150µ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 || unbekannt&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== MERLIN ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;MERLIN&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 56 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Biphase (Manchester) asymmetrisch&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 2 Start-Bits + 18 Daten-Bits + 0 Stop-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 8 Adress-Bits + 10 Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bits || &amp;quot;10&amp;quot;, also 210µs Puls, 210µs + 210µs Pause, 210µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 210µs Pause, 210µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 210µs Puls, 210µ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 || unbekannt&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== ORTEK ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;ORTEK&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Biphase (Manchester) symmetrisch&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 2 Start-Bits + 18 Daten-Bits + 0 Stop-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 6 Adress-Bits + 2 Spezial-Bits +  6 Kommando-Bits + 4 Spezial-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 2000µs Puls, 1000µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 500µs Pause, 500µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 500µs Puls, 500µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || kein Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || 2 zusätzliche Frames mit gesetzten Spezial-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || N-fache Wiederholung des 2. Frames&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width: 80%;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 20%;&amp;quot; |&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
=== Pulse Position Protokolle ===&lt;br /&gt;
||&lt;br /&gt;
[[Datei:Pulse-Position.png|miniatur|Pulse Position Coding]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== NETBOX ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;NETBOX&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 15em&amp;quot;|&lt;br /&gt;
|style=&amp;quot;width: 50em&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Pulse Position&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 in 3.2.x ===&lt;br /&gt;
&lt;br /&gt;
Version 3.2.6:&lt;br /&gt;
&lt;br /&gt;
* 27.01.2021: &#039;&#039;&#039;Neues IR-Protokoll:&#039;&#039;&#039; [[IRMP#MELINERA|MELINERA]]&lt;br /&gt;
* 27.01.2021: Protokoll [[IRMP#LEGO|LEGO]]: Timing verbessert&lt;br /&gt;
* 27.01.2021: Protokoll [[IRMP#RUWIDO|RUWIDO]]: Timing verbessert&lt;br /&gt;
* 27.01.2021: Protokoll [[IRMP#NEC|NEC]]: Senden von Repetition-Frames ermöglicht&lt;br /&gt;
&lt;br /&gt;
Version 3.2.3:&lt;br /&gt;
&lt;br /&gt;
* 15.08.2020: &#039;&#039;&#039;Neues RF-Protokoll:&#039;&#039;&#039; [[IRMP#RF_MEDION|RF_MEDION]]&lt;br /&gt;
&lt;br /&gt;
Version 3.2.2:&lt;br /&gt;
&lt;br /&gt;
* 09.07.2020: Zusätzliche Erkennung der Funkkanäle beim RF_X10 Protokoll&lt;br /&gt;
* 09.07.2020: Verbesserung der Erkennung von RF-Frames durch neue Stop-Bit-Behandlung.&lt;br /&gt;
* 09.07.2020: Verbesserte Detektion von RF_GEN24-Protokollen&lt;br /&gt;
* 09.07.2020: &amp;lt;span style=&amp;quot;color:#FF0000&amp;quot;&amp;gt;&#039;&#039;&#039;NEU:&#039;&#039;&#039;&amp;lt;/span&amp;gt; Detektion, ob/wann eine Fernbedienungstaste losgelassen wird, siehe Kapitel &#039;&#039;&#039;[[IRMP#.22Entprellen.22_von_Tasten|Entprellen von Tasten]]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Version 3.2.1:&lt;br /&gt;
&lt;br /&gt;
* 22.06.2020: Mini-Bugfix&lt;br /&gt;
&lt;br /&gt;
Version 3.2.0:&lt;br /&gt;
&lt;br /&gt;
* 22.06.2020: Unterstützung von 433MHz Funkprotokollen (RF)&lt;br /&gt;
* 22.06.2020: &#039;&#039;&#039;Neues RF-Protokoll:&#039;&#039;&#039; [[IRMP#RF_GEN24|RF_GEN24]]&lt;br /&gt;
* 22.06.2020: &#039;&#039;&#039;Neues RF-Protokoll:&#039;&#039;&#039; [[IRMP#RF_X10|RF_X10]]&lt;br /&gt;
&lt;br /&gt;
Ältere Versionen:&lt;br /&gt;
&lt;br /&gt;
* 26.08.2019: &#039;&#039;&#039;Neues Protokoll:&#039;&#039;&#039; [[IRMP#METZ|METZ]]&lt;br /&gt;
* 26.08.2019: &#039;&#039;&#039;Neues Protokoll:&#039;&#039;&#039; [[IRMP#ONKYO|ONKYO]]&lt;br /&gt;
* 10.09.2018: &#039;&#039;&#039;Neues Protokoll:&#039;&#039;&#039; [[IRMP#RCII|RCII]]&lt;br /&gt;
* 06.09.2018: Support für STM32 mit HAL-Library&lt;br /&gt;
* 30.08.2018: Neue Option: IRMP_USE_IDLE_CALL&lt;br /&gt;
* 29.08.2018: Portierung auf ChibiOS&lt;br /&gt;
* 29.08.2018: Neues Protokoll: GREE&lt;br /&gt;
* 19.02.2018: Korrektur bei der Behandlung von irmp_flags nach ungültigen IR-Frames&lt;br /&gt;
* 25.08.2017: Neues Protokoll: IRMP16 zwecks transparenter Datenübertragung von 16-Bit-Daten&lt;br /&gt;
* Neues Protokoll: SAMSUNGAH&lt;br /&gt;
* Verbesserte ESP8266-Unterstützung&lt;br /&gt;
* 16.12.2016: Unterstützung von Nicht-Standard Nec-Repetition-Frames (4500us Pause statt 2250us)&lt;br /&gt;
* 18.11.2016: Buffer Overflow in irmp-main-avr-uart.c korrigiert&lt;br /&gt;
* 19.09.2016: Neues Protokoll [[IRMP#VINCENT|VINCENT]]&lt;br /&gt;
* 09.09.2016: Neues Protokoll [[IRMP#MITSU_HEAVY|Mitsubishi Heavy (Klimaanlage)]]&lt;br /&gt;
* 09.09.2016: Anpassungen an Compiler PIC C18&lt;br /&gt;
* 12.01.2016: Korrektur Portierung auf ESP8266&lt;br /&gt;
* 12.01.2016: Portierung auf MBED&lt;br /&gt;
* 12.01.2016: Mehrere plattformabhängige Beispiel-Main-Dateien hinzugefügt&lt;br /&gt;
* 17.11.2015: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: [[IRMP#PANASONIC|PANASONIC (Beamer)]]&lt;br /&gt;
* 17.11.2015: Portierung auf ESP8266&lt;br /&gt;
* 17.11.2015: Portierung auf Teensy (3.x)&lt;br /&gt;
* 10.11.2015: Unterstützung für STM8 Mikrcontroller&lt;br /&gt;
* 20.09.2015: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: [[IRMP#TECHNICS|TECHNICS]]&lt;br /&gt;
* 15.06.2015: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: [[IRMP#ACP24|ACP24]]&lt;br /&gt;
* 29.05.2015: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: [[IRMP#S100|S100]]&lt;br /&gt;
* 29.05.2015: Kleinere Korrekturen&lt;br /&gt;
* 28.05.2015: Logging für XMega hinzugefügt&lt;br /&gt;
* 28.05.2015: Timing-Korrekturen für FAN-Protokoll&lt;br /&gt;
* 27.05.2015: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: [[IRMP#MERLIN|MERLIN]]&lt;br /&gt;
* 27.05.2015: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: [[IRMP#FAN|FAN]]&lt;br /&gt;
* 18.05.2015: F_CPU Macro für STM32L1XX hinzugefügt&lt;br /&gt;
* 18.05.2015: Korrekturen zur XMega-Portierung&lt;br /&gt;
* 23.04.2015: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: [[IRMP#PENTAX|PENTAX]]&lt;br /&gt;
* 23.04.2015: Portierung auf AVR XMega&lt;br /&gt;
* 19.09.2014: Kleineren Bug behoben: Fehlendes Newline vor #else eingefügt&lt;br /&gt;
* 18.09.2014: Logging für ARM STM32F10X hinzugefügt&lt;br /&gt;
* 17.09.2014: PROGMEM-Zugriff für Array irmp_protocol_names[] korrigiert.&lt;br /&gt;
* 15.09.2014: Timing-Toleranzen für [[IRMP#KASEIKYO|KASEIKYO]]-Protokoll vergrößert&lt;br /&gt;
* 15.09.2014: Wechsel von irmp_protocol_names auf PROGMEM, zusätzliche UART Routinen in irmp-main-avr-uart.c&lt;br /&gt;
* 21.07.2014: Portierung auf PIC 12F1840&lt;br /&gt;
* 09.07.2014: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: [[IRMP#SAMSUNG48|SAMSUNG48]]&lt;br /&gt;
* 09.07.2014: Kleine Syntaxfehlerkorrektur&lt;br /&gt;
* 01.07.2014: Logging für ARM_STM32F4XX eingebaut&lt;br /&gt;
* 01.07.2014: IRMP port für PIC XC8 compiler, Variadic Macros herausgenommen wg. dummen XC8-Compiler :-(&lt;br /&gt;
* 05.06.2014: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: [[IRMP#LGAIR|LGAIR]]&lt;br /&gt;
* 30.05.2014: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: [[IRMP#SPEAKER|SPEAKER]]&lt;br /&gt;
* 30.05.2014: Timings für [[IRMP#SAMSUNG|SAMSUNG]]-Protokolle optimiert&lt;br /&gt;
* 20.02.2014: Fehlerhaftes Decodieren des [[IRMP#SIEMENS_+_RUWIDO|SIEMENS]]-Protokolls korrigiert&lt;br /&gt;
* 19.02.2014: &#039;&#039;&#039;Neue Protokolle&#039;&#039;&#039;: [[IRMP#RCMM|RCMM32, RCMM24 und RCMM12]]&lt;br /&gt;
* 17.09.2014: Timing für [[IRMP#ROOMBA|ROOMBA]] verbessert&lt;br /&gt;
* 09.04.2013: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: [[IRMP#ROOMBA|ROOMBA]]&lt;br /&gt;
* 09.04.2013: Verbesserte Frame-Erkennung für [[IRMP#ORTEK|ORTEK (Hama)]]&lt;br /&gt;
* 19.03.2013: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: [[IRMP#ORTEK|ORTEK (Hama)]]&lt;br /&gt;
* 19.03.2013: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: [[IRMP#TELEFUNKEN|TELEFUNKEN]]&lt;br /&gt;
* 12.03.2013: Geänderte Timing-Toleranzen für [[IRMP#RECS80|RECS80]]- und  [[IRMP#RECS80EXT|RECS80EXT]]-Protokoll&lt;br /&gt;
* 21.01.2013: Korrekturen Erkennung des Wiederholungsframes beim [[IRMP#DENON|DENON]]-Protokoll&lt;br /&gt;
* 17.01.2013: Korrekturen Frame-Erkennung beim [[IRMP#DENON|DENON]]-Protokoll&lt;br /&gt;
* 11.12.2012: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: [[IRMP#A1TVBOX|A1TVBOX]]&lt;br /&gt;
* 07.12.2012: Verbesserte Erkennung von [[IRMP#DENON|DENON]]-Wiederholungsframes&lt;br /&gt;
* 19.11.2012: Portierung auf Stellaris LM4F120 Launchpad von TI (ARM Cortex M4)&lt;br /&gt;
* 06.11.2012: Korrektur [[IRMP#DENON|DENON]]-Frame-Erkennung&lt;br /&gt;
* 26.10.2012: Einige Timer-Korrekturen, Anpassungen an Arduino&lt;br /&gt;
* 11.07.2012: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: [[IRMP#BOSE|BOSE]]&lt;br /&gt;
* 18.06.2012: Unterstützung für ATtiny87/167 hinzugefügt&lt;br /&gt;
* 05.06.2012: Kleinere Korrekturen Portierung auf ARM STM32&lt;br /&gt;
* 05.06.2012: Include-Korrektur in [http://www.mikrocontroller.net/svnbrowser/irmp/irmpextlog.c?view=markup irmpextlog.c]&lt;br /&gt;
* 05.06.2012: Bugfix, wenn nur [[IRMP#NEC_+_extended_NEC|NEC]] und [[IRMP#NEC42|NEC42]] aktiviert&lt;br /&gt;
* 23.05.2012: Portierung auf ARM STM32&lt;br /&gt;
* 23.05.2012: Bugfix Frame-Erkennung beim [[IRMP#DENON|DENON]]-Protokoll&lt;br /&gt;
* 27.02.2012: Bug in IR60-Decoder behoben&lt;br /&gt;
* 27.02.2012: Bug in CRC-Berechnung von [[IRMP#KASEIKYO|KASEIKYO]]-Frames behoben&lt;br /&gt;
* 27.02.2012: Portierung auf C18 Compiler für PIC-Mikroprozessoren&lt;br /&gt;
* 13.02.2012: Bugfix: oberstes Bit in Adresse falsch bei [[IRMP#NEC_+_extended_NEC|NEC]]-Protokoll, wenn auch [[IRMP#NEC42|NEC42]]-Protokoll eingeschaltet ist.&lt;br /&gt;
* 13.02.2012: Timing von [[IRMP#SAMSUNG|SAMSUNG]]- und [[IRMP#SAMSUNG32|SAMSUNG32]]-Protokoll korrigiert&lt;br /&gt;
* 13.02.2012: [[IRMP#KASEIKYO|KASEIKYO]]: Genre2-Bits werden nun im oberen Nibble von flags gespeichert.&lt;br /&gt;
* 20.09.2011: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: [[IRMP#KATHREIN|KATHREIN]]&lt;br /&gt;
* 20.09.2011: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: [[IRMP#SIEMENS_+_RUWIDO|RUWIDO]]&lt;br /&gt;
* 20.09.2011: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: [[IRMP#THOMSON|THOMSON]]&lt;br /&gt;
* 20.09.2011: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: [[IRMP#IR60 (SDA2008)|IR60 (SDA2008)]]&lt;br /&gt;
* 20.09.2011: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: [[IRMP#LEGO|LEGO]]&lt;br /&gt;
* 20.09.2011: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: [[IRMP#NEC16|NEC16]]&lt;br /&gt;
* 20.09.2011: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: [[IRMP#NEC42|NEC42]]&lt;br /&gt;
* 20.09.2011: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: [[IRMP#NETBOX|NETBOX]]&lt;br /&gt;
* 20.09.2011: Portierung auf ATtiny84 und ATtiny85&lt;br /&gt;
* 20.09.2011: Verbesserung von Tastenwiederholungen bei [[IRMP#RC5_+_RC5X|RC5]]&lt;br /&gt;
* 20.09.2011: Verbessertes Decodieren von [[IRMP#Biphase|Biphase]]-Protokollen&lt;br /&gt;
* 20.09.2011: Korrekturen am [[IRMP#RECS80|RECS80]]-Decoder&lt;br /&gt;
* 20.09.2011: Korrekturen beim Erkennen von zusätzlichen Bits im SIRCS-Protocol&lt;br /&gt;
* 18.01.2011: Korrekturen für [[IRMP#SIEMENS_+_RUWIDO|SIEMENS]]-Protokoll&lt;br /&gt;
* 18.01.2011: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: [[IRMP#NIKON|NIKON]]&lt;br /&gt;
* 18.01.2011: Speichern der zusätzlichen Bits (&amp;gt;12) im [[IRMP#SIRCS|SIRCS]]-Protokoll in der Adresse&lt;br /&gt;
* 18.01.2011: Timing-Korrekturen für [[IRMP#DENON|DENON]]-Protokoll&lt;br /&gt;
* 04.09.2010: Bugfix für F_INTERRUPTS &amp;gt;= 16000&lt;br /&gt;
* 02.09.2010: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: [[IRMP#RC6_+_RC6A|RC6A]]&lt;br /&gt;
* 29.08.2010: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: [[IRMP#JVC|JVC]]&lt;br /&gt;
* 29.08.2010: [[IRMP#KASEIKYO|KASEIKYO]]-Protokoll: Berücksichtigung der Genre-Bits. &#039;&#039;&#039;ACHTUNG: dadurch neue Command-Codes!&#039;&#039;&#039;&lt;br /&gt;
* 29.08.2010: [[IRMP#KASEIKYO|KASEIKYO]]-Protokoll: Verbesserte Behandlung von Wiederholungs-Frames&lt;br /&gt;
* 29.08.2010: Verbesserte Unterstützung des [[IRMP#APPLE|APPLE]]-Protokolls. &#039;&#039;&#039;ACHTUNG: dadurch neue Adress-Codes!&#039;&#039;&#039;&lt;br /&gt;
* 01.07.2010: Bugfix: Einführen eines Timeouts für [[IRMP#NEC_+_extended_NEC|NEC]]-Repetition-Frames, um &amp;quot;Geisterkommandos&amp;quot; zu verhindern.&lt;br /&gt;
* 26.06.2010: Bugfix: Deaktivieren von [[IRMP#RECS80|RECS80]], [[IRMP#RECS80EXT|RECS80EXT]] &amp;amp; [[IRMP#SIEMENS_+_RUWIDO|SIEMENS]] bei geringer Interrupt-Rate&lt;br /&gt;
* 25.06.2010: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: [[IRMP#RCCAR|RCCAR]]&lt;br /&gt;
* 25.06.2010: Tastenerkennung für [[IRMP#FDC|FDC]]-Protokoll (IR-keyboard) erweitert&lt;br /&gt;
* 25.06.2010: Interrupt-Frequenz nun bis zu 20kHz möglich&lt;br /&gt;
* 09.06.2010: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: [[IRMP#FDC|FDC]] (IR-keyboard)&lt;br /&gt;
* 09.06.2010: Timing für [[IRMP#DENON|DENON]]-Protokoll korrigiert&lt;br /&gt;
* 02.06.2010: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: [[IRMP#SIEMENS_+_RUWIDO|SIEMENS]] (Gigaset)&lt;br /&gt;
* 26.05.2010: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: [[IRMP#GRUNDIG_+_NOKIA|NOKIA]]&lt;br /&gt;
* 26.05.2010: Bugfix Auswertung von langen Tastendrücken bei [[IRMP#GRUNDIG_+_NOKIA|GRUNDIG]]-Protokoll&lt;br /&gt;
* 17.05.2010: Bugfix [[IRMP#SAMSUNG32|SAMSUNG32]]-Protokoll: Kommando-Bit-Maske korrigiert&lt;br /&gt;
* 16.05.2010: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: [[IRMP#GRUNDIG_+_NOKIA|GRUNDIG]]&lt;br /&gt;
* 16.05.2010: Behandlung von automatischen Frame-Wiederholungen beim [[IRMP#SIRCS|SIRCS]]-, [[IRMP#SAMSUNG32|SAMSUNG32]]- und [[IRMP#NUBERT|NUBERT]]-Protokoll verbessert.&lt;br /&gt;
* 28.04.2010: Nur einige kosmetische Code-Optimierungen&lt;br /&gt;
* 16.04.2010: Sämtliche Timing-Toleranzen angepasst/optimiert&lt;br /&gt;
* 12.04.2010: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: [[IRMP#B&amp;amp;O|Bang &amp;amp; Olufsen]]&lt;br /&gt;
* 29.03.2010: Bugfix beim Erkennen von mehrfachen [[IRMP#NEC_+_extended_NEC|NEC]]-Repetition-Frames&lt;br /&gt;
* 29.03.2010: Konfiguration in [http://www.mikrocontroller.net/svnbrowser/irmp/irmpconfig.h?view=markup irmpconfig.h] ausgelagert&lt;br /&gt;
* 29.03.2010: Einführung einer Programmversion in README.txt: Version 1.0&lt;br /&gt;
* 17.03.2010: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: [[IRMP#NUBERT|NUBERT]]&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;: [[IRMP#RECS80EXT|RECS80 Extended]]&lt;br /&gt;
* 15.03.2010: Codeoptimierung&lt;br /&gt;
* 14.03.2010: Portierung auf PIC&lt;br /&gt;
* 11.03.2010: Anpassungen an verschiedene ATMega-Typen durchgeführt&lt;br /&gt;
* 07.03.2010: Bugfix: Zurücksetzen der Statemachine nach einem unvollständigen [[IRMP#RC5_+_RC5X|RC5]]-Frame&lt;br /&gt;
* 05.03.2010: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: [[IRMP#APPLE|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;
* 04.03.2010: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: [[IRMP#SAMSUNG32|SAMSUNG32]] (Mix aus [[IRMP#SAMSUNG|SAMSUNG]] &amp;amp; [[IRMP#NEC_+_extended_NEC|NEC]]-Protokoll)&lt;br /&gt;
* 04.03.2010: Änderung der [[IRMP#SIRCS|SIRCS]]- und [[IRMP#KASEIKYO|KASEIKYO]]-Toleranzen&lt;br /&gt;
* 02.03.2010: [[IRMP#SIRCS|SIRCS]]: Korrekte Erkennung und Unterdrückung von automatischen Frame-Wiederholungen&lt;br /&gt;
* 02.03.2010: [[IRMP#SIRCS|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;
* 24.02.2010: Neue Variable flags in IRMP_DATA zur Erkennung von langen Tastendrücken&lt;br /&gt;
* 20.02.2010: Bugfix [[IRMP#DENON|DENON]]-Protokoll: Wiederholungsframe grundsätzlich invertiert&lt;br /&gt;
* 19.02.2010: Erkennung von [[IRMP#NEC_+_extended_NEC|NEC]]-Protokoll-Varianten, z.&amp;amp;nbsp;B. [[IRMP#APPLE|APPLE]]-Fernbedienung&lt;br /&gt;
* 19.02.2010: Erkennung von [[IRMP#RC6_+_RC6A|RC6]]- und [[IRMP#DENON|DENON]]-Protokoll&lt;br /&gt;
* 19.02.2010: Verbesserung des [[IRMP#RC5_+_RC5X|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 [[IRMP#NEC_+_extended_NEC|NEC]]-Wiederholungssequenz&lt;br /&gt;
* 12.02.2010: [[IRMP#RC5_+_RC5X|RC5]]-Protokoll-Decoder hinzugefügt&lt;br /&gt;
* 05.02.2010: Konflikt zwischen [[IRMP#SAMSUNG|SAMSUNG]]- und [[IRMP#MATSUSHITA|MATSUSHITA]]-Protokoll beseitigt&lt;br /&gt;
* 07.01.2010: Erste Version&lt;br /&gt;
&lt;br /&gt;
== Literatur ==&lt;br /&gt;
&lt;br /&gt;
=== IR-Übersicht ===&lt;br /&gt;
&lt;br /&gt;
* http://www.sbprojects.net/knowledge/ir/index.php&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;
* http://mc.mikrocontroller.com/de/IR-Protokolle.php&lt;br /&gt;
&lt;br /&gt;
=== SIRCS-Protokoll ===&lt;br /&gt;
&lt;br /&gt;
* http://www.sbprojects.net/knowledge/ir/sirc.php&lt;br /&gt;
* http://mc.mikrocontroller.com/de/IR-Protokolle.php#SIRCS&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;
* http://www.celadon.com/infrared_protocol/infrared_protocols_samples.pdf&lt;br /&gt;
&lt;br /&gt;
=== NEC-Protokoll ===&lt;br /&gt;
&lt;br /&gt;
* http://www.sbprojects.net/knowledge/ir/nec.php&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;
=== ACP24-Protokoll ===&lt;br /&gt;
&lt;br /&gt;
Das ACP24-Protokoll wird von Stiebel-Eltron-Klimaanlagen verwendet.&lt;br /&gt;
&lt;br /&gt;
Die 70 Datenbits sind folgendermaßen aufgebaut:&lt;br /&gt;
&lt;br /&gt;
              1         2         3         4         5         6&lt;br /&gt;
    0123456789012345678901234567890123456789012345678901234567890123456789&lt;br /&gt;
    N VVMMM    ? ???    t vmA x                 y                     TTTT&lt;br /&gt;
    0011001000000111000010001010000000000000000010000000000000000000001111on, temp=30&lt;br /&gt;
&lt;br /&gt;
Diese werden in die folgenden 16 Bits von irmp_data.command gewandelt:&lt;br /&gt;
&lt;br /&gt;
        5432109876543210&lt;br /&gt;
        NAVVvMMMmtxyTTTT&lt;br /&gt;
&lt;br /&gt;
Bedeutung der Symbole:&lt;br /&gt;
&lt;br /&gt;
    TTTT = Temperatur + 15 Grad&lt;br /&gt;
            TTTT&lt;br /&gt;
            ----------&lt;br /&gt;
            0000        ???&lt;br /&gt;
            0001        ???&lt;br /&gt;
            0010        ???&lt;br /&gt;
            0011        18 Grad&lt;br /&gt;
            0100        19 Grad&lt;br /&gt;
            0101        20 Grad&lt;br /&gt;
            0110        21 Grad&lt;br /&gt;
            ...&lt;br /&gt;
            1111        30 Grad&lt;br /&gt;
&lt;br /&gt;
    N    = Nacht-Modus&lt;br /&gt;
            N&lt;br /&gt;
            ----------&lt;br /&gt;
            0           aus&lt;br /&gt;
            1           ein&lt;br /&gt;
&lt;br /&gt;
    VV   = Luefter-Stufe, v muss 1 sein!&lt;br /&gt;
            VV   v&lt;br /&gt;
            ----------&lt;br /&gt;
            00   1      Stufe 1&lt;br /&gt;
            01   1      Stufe 2&lt;br /&gt;
            10   1      Stufe 3&lt;br /&gt;
            11   1      Automatik&lt;br /&gt;
&lt;br /&gt;
    MMM  = Modus&lt;br /&gt;
            MMM  m&lt;br /&gt;
            ----------&lt;br /&gt;
            000  0      Ausschalten&lt;br /&gt;
            001  0      Einschalten&lt;br /&gt;
            001  1      Kuehlen&lt;br /&gt;
            010  1      Lueften&lt;br /&gt;
            011  1      Entfeuchten&lt;br /&gt;
            100  1      ???&lt;br /&gt;
            101  1      ---&lt;br /&gt;
            110  1      ---&lt;br /&gt;
            111  1      ---&lt;br /&gt;
&lt;br /&gt;
    A    = Automatik-Programm&lt;br /&gt;
            A&lt;br /&gt;
            ----------&lt;br /&gt;
            0           aus&lt;br /&gt;
            1           ein&lt;br /&gt;
&lt;br /&gt;
    t   = Timer&lt;br /&gt;
            t   x y&lt;br /&gt;
            ----------&lt;br /&gt;
            1   1 0     Timer 1&lt;br /&gt;
            1   0 1     Timer 2&lt;br /&gt;
&lt;br /&gt;
Um die Klimaanlage mittels [[IRSND]] anzusteuern, kann man folgende Funktionen verwenden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;irmp.h&amp;quot;&lt;br /&gt;
#include &amp;quot;irsnd.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#define IRMP_ACP24_TEMPERATURE_MASK         0x000F                                          // TTTT&lt;br /&gt;
&lt;br /&gt;
#define IRMP_ACP24_SET_TIMER_MASK           (1&amp;lt;&amp;lt;6)                                          // t&lt;br /&gt;
#define IRMP_ACP24_TIMER1_MASK              (1&amp;lt;&amp;lt;5)                                          // x&lt;br /&gt;
#define IRMP_ACP24_TIMER2_MASK              (1&amp;lt;&amp;lt;4)                                          // y&lt;br /&gt;
&lt;br /&gt;
#define IRMP_ACP24_SET_MODE_MASK            (1&amp;lt;&amp;lt;7)                                          // m&lt;br /&gt;
#define IRMP_ACP24_MODE_POWER_ON_MASK       (1&amp;lt;&amp;lt;8)                                          // MMMm = 0010 Einschalten&lt;br /&gt;
#define IRMP_ACP24_MODE_COOLING_MASK        (IRMP_ACP24_SET_MODE_MASK | (1&amp;lt;&amp;lt;8))             // MMMm = 0011 Kuehlen&lt;br /&gt;
#define IRMP_ACP24_MODE_VENTING_MASK        (IRMP_ACP24_SET_MODE_MASK | (1&amp;lt;&amp;lt;9))             // MMMm = 0101 Lueften&lt;br /&gt;
#define IRMP_ACP24_MODE_DEMISTING_MASK      (IRMP_ACP24_SET_MODE_MASK | (1&amp;lt;&amp;lt;10) | (1&amp;lt;&amp;lt;8))   // MMMm = 1001 Entfeuchten&lt;br /&gt;
&lt;br /&gt;
#define IRMP_ACP24_SET_FAN_STEP_MASK        (1&amp;lt;&amp;lt;11)                                         // v&lt;br /&gt;
#define IRMP_ACP24_FAN_STEP_MASK            0x3000                                          // VV&lt;br /&gt;
#define IRMP24_ACP_FAN_STEP_BIT             12                                              // VV&lt;br /&gt;
#define IRMP_ACP24_AUTOMATIC_MASK           (1&amp;lt;&amp;lt;14)                                         // A&lt;br /&gt;
#define IRMP_ACP24_NIGHT_MASK               (1&amp;lt;&amp;lt;15)                                         // N&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// possible values for acp24_set_mode();&lt;br /&gt;
#define ACP24_MODE_COOLING                  1&lt;br /&gt;
#define ACP24_MODE_VENTING                  2&lt;br /&gt;
#define ACP24_MODE_DEMISTING                3&lt;br /&gt;
&lt;br /&gt;
static uint8_t temperature = 18;                                                    // 18 degrees&lt;br /&gt;
&lt;br /&gt;
static void&lt;br /&gt;
acp24_send (uint16_t cmd)&lt;br /&gt;
{&lt;br /&gt;
    IRMP_DATA irmp_data;&lt;br /&gt;
&lt;br /&gt;
    cmd |=  (temperature - 15) &amp;amp; IRMP_ACP24_TEMPERATURE_MASK;&lt;br /&gt;
&lt;br /&gt;
    irmp_data.protocol = IRMP_ACP24_PROTOCOL;&lt;br /&gt;
    irmp_data.address  = 0x0000;&lt;br /&gt;
    irmp_data.command  = cmd;&lt;br /&gt;
    irmp_data.flags    = 0;&lt;br /&gt;
&lt;br /&gt;
    irsnd_send_data (&amp;amp;irmp_data, 1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void&lt;br /&gt;
acp24_set_temperature (uint8_t temp)&lt;br /&gt;
{&lt;br /&gt;
    uint16_t    cmd = IRMP_ACP24_MODE_POWER_ON_MASK;&lt;br /&gt;
&lt;br /&gt;
    temperature = temp;&lt;br /&gt;
    acp24_send (cmd);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void&lt;br /&gt;
acp24_off (void)&lt;br /&gt;
{&lt;br /&gt;
    uint16_t    cmd = 0;&lt;br /&gt;
    acp24_send (cmd);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#define ACP_FAN_STEP1       0&lt;br /&gt;
#define ACP_FAN_STEP2       1&lt;br /&gt;
#define ACP_FAN_STEP3       2&lt;br /&gt;
#define ACP_FAN_AUTOMATIC   3&lt;br /&gt;
&lt;br /&gt;
void&lt;br /&gt;
acp24_fan (uint8_t fan_step)&lt;br /&gt;
{&lt;br /&gt;
    uint16_t    cmd = IRMP_ACP24_MODE_POWER_ON_MASK;&lt;br /&gt;
&lt;br /&gt;
    cmd |= IRMP_ACP24_SET_FAN_STEP_MASK | ((fan_step &amp;lt;&amp;lt; IRMP24_ACP_FAN_STEP_BIT) &amp;amp; IRMP_ACP24_FAN_STEP_MASK);&lt;br /&gt;
&lt;br /&gt;
    acp24_send (cmd);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void&lt;br /&gt;
acp24_set_mode (uint8_t mode)&lt;br /&gt;
{&lt;br /&gt;
    uint16_t    cmd = 0;&lt;br /&gt;
&lt;br /&gt;
    switch (mode)&lt;br /&gt;
    {&lt;br /&gt;
        case ACP24_MODE_COOLING:    cmd = IRMP_ACP24_MODE_COOLING_MASK;     break;&lt;br /&gt;
        case ACP24_MODE_VENTING:    cmd = IRMP_ACP24_MODE_VENTING_MASK;     break;&lt;br /&gt;
        case ACP24_MODE_DEMISTING:  cmd = IRMP_ACP24_MODE_DEMISTING_MASK;   break;&lt;br /&gt;
        default: return;&lt;br /&gt;
    }&lt;br /&gt;
    acp24_send (cmd);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void&lt;br /&gt;
acp24_program_automatic (void)&lt;br /&gt;
{&lt;br /&gt;
    uint16_t    cmd = IRMP_ACP24_MODE_POWER_ON_MASK | IRMP_ACP24_AUTOMATIC_MASK;&lt;br /&gt;
    acp24_send (cmd);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void&lt;br /&gt;
acp24_program_night (void)&lt;br /&gt;
{&lt;br /&gt;
    uint16_t    cmd = IRMP_ACP24_MODE_POWER_ON_MASK | IRMP_ACP24_NIGHT_MASK;&lt;br /&gt;
    acp24_send (cmd);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== LGAIR-Protokoll ===&lt;br /&gt;
&lt;br /&gt;
Der LG Air Conditioner ist eine Klimaanlage, die durch eine &amp;quot;intelligente&amp;quot; Fernbedienung gesteuert wird.&lt;br /&gt;
Dies sind die &amp;quot;entschlüsselten&amp;quot; Daten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    Befehl                  AAAAAAAA  PW  Z  S  T  mmm  tttt  vvvv  PPPP&lt;br /&gt;
    --------------------------------------------------------------------&lt;br /&gt;
    ON 23C                  10001000  00  0  0  0  000  1000  0100  1100&lt;br /&gt;
    ON 26C                  10001000  00  0  0  0  000  1011  0100  1111&lt;br /&gt;
&lt;br /&gt;
    OFF                     10001000  11  0  0  0  000  0000  0101  0001&lt;br /&gt;
    TURN OFF                10001000  11  0  0  0  000  0000  0101  0001  (18C currently, identical with off)&lt;br /&gt;
&lt;br /&gt;
    TEMP DOWN 23C           10001000  00  0  0  1  000  1000  0100  0100&lt;br /&gt;
    MODE (to mode0, 23C)    10001000  00  0  0  1  000  1000  0100  0100&lt;br /&gt;
&lt;br /&gt;
    TEMP UP (24C)           10001000  00  0  0  1  000  1001  0100  0101&lt;br /&gt;
    TEMP DOWN 24C           10001000  00  0  0  1  000  1001  0100  0101&lt;br /&gt;
&lt;br /&gt;
    TEMP UP (25C)           10001000  00  0  0  1  000  1010  0100  0110&lt;br /&gt;
    TEMP DOWN 25C           10001000  00  0  0  1  000  1010  0100  0110&lt;br /&gt;
&lt;br /&gt;
    TEMP UP (26C)           10001000  00  0  0  1  000  1011  0100  0111&lt;br /&gt;
&lt;br /&gt;
    MODE                    10001000  00  0  0  1  011  0111  0100  0110  (to mode1, 22C - when switching to mode1 temp automaticall sets to 22C)&lt;br /&gt;
    ON (mode1, 22C)         10001000  00  0  0  0  011  0111  0100  1110&lt;br /&gt;
&lt;br /&gt;
    MODE                    10001000  00  0  0  1  001  1000  0100  0101  (to mode2, no temperature displayed)&lt;br /&gt;
    ON (mode2)              10001000  00  0  0  0  001  1000  0100  1101&lt;br /&gt;
    MODE (to mode3, 23C)    10001000  00  0  0  1  100  1000  0100  1000&lt;br /&gt;
    ON (mode3, 23C)         10001000  00  0  0  0  100  1000  0100  0000&lt;br /&gt;
&lt;br /&gt;
    VENTILATION SLOW        10001000  00  0  0  1  000  0011  0000  1011&lt;br /&gt;
    VENTILATION MEDIUM      10001000  00  0  0  1  000  0011  0010  1101&lt;br /&gt;
    VENTILATION HIGH        10001000  00  0  0  1  000  0011  0100  1111&lt;br /&gt;
    VENTILATION LIGHT       10001000  00  0  0  1  000  0011  0101  0000&lt;br /&gt;
&lt;br /&gt;
    SWING ON/OFF            10001000  00  0  1  0  000  0000  0000  0001&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    Format:     1 start bit + 8 address bits + 16 data bits + 4 checksum bits + 1 stop bit&lt;br /&gt;
&lt;br /&gt;
    Address:    AAAAAAAA = 0x88 (8 bits)&lt;br /&gt;
&lt;br /&gt;
    Data:       PW Z S T MMM tttt vvvv PPPP (16 bits)&lt;br /&gt;
&lt;br /&gt;
                PW:         Power:     00 = On, 11 = Off&lt;br /&gt;
&lt;br /&gt;
                Z:          N/A:       Always 0&lt;br /&gt;
&lt;br /&gt;
                S:          Swing:     1 = Toggle swing, all other data bits are zeros.&lt;br /&gt;
&lt;br /&gt;
                T:          Temp/Vent: 1 = Set temperature and ventilation&lt;br /&gt;
&lt;br /&gt;
                MMM:        Mode, can be combined with temperature&lt;br /&gt;
                            000=Mode 0&lt;br /&gt;
                            001=Mode 2&lt;br /&gt;
                            010=????&lt;br /&gt;
                            011=Mode 1&lt;br /&gt;
                            100=Mode 3&lt;br /&gt;
                            101=???&lt;br /&gt;
                            111=???&lt;br /&gt;
&lt;br /&gt;
                tttt:       Temperature:&lt;br /&gt;
                            0000=used by OFF command&lt;br /&gt;
                            0001=????&lt;br /&gt;
                            0010=????&lt;br /&gt;
                            0011=18°C&lt;br /&gt;
                            0100=19°C&lt;br /&gt;
                            0101=20°C&lt;br /&gt;
                            0110=21°C&lt;br /&gt;
                            0111=22°C&lt;br /&gt;
                            1000=23°C&lt;br /&gt;
                            1001=24°C&lt;br /&gt;
                            1010=25°C&lt;br /&gt;
                            1011=26°C&lt;br /&gt;
                            1011=27°C&lt;br /&gt;
                            1100=28°C&lt;br /&gt;
                            1101=29°C&lt;br /&gt;
                            1111=30°C&lt;br /&gt;
&lt;br /&gt;
                vvvv:       Ventilation:&lt;br /&gt;
                            0000=slow&lt;br /&gt;
                            0010=medium&lt;br /&gt;
                            0011=????&lt;br /&gt;
                            0100=high&lt;br /&gt;
                            0101=light&lt;br /&gt;
                            0110=????&lt;br /&gt;
                            0111=????&lt;br /&gt;
                            ...&lt;br /&gt;
                            1111=????&lt;br /&gt;
&lt;br /&gt;
    Checksum:   PPPP = (DataNibble1 + DataNibble2 + DataNibble3 + DataNibble4) &amp;amp; 0x0F&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== NEC16-Protokoll (JVC) ===&lt;br /&gt;
&lt;br /&gt;
* http://www.sbprojects.net/knowledge/ir/jvc.php&lt;br /&gt;
* http://www.ustr.net/infrared/jvc.shtml&lt;br /&gt;
&lt;br /&gt;
=== SAMSUNG-Protokoll ===&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;
=== MATSUHITA-Protokoll ===&lt;br /&gt;
&lt;br /&gt;
* http://www.celadon.com/infrared_protocol/infrared_protocols_samples.pdf&lt;br /&gt;
&lt;br /&gt;
=== KASEIKYO-Protokoll (auch &amp;quot;Japan-Protokoll&amp;quot;) ===&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;
=== RECS80- und RECS80-Extended-Protokoll ===&lt;br /&gt;
&lt;br /&gt;
* http://www.sbprojects.net/knowledge/ir/recs80.php&lt;br /&gt;
&lt;br /&gt;
=== RC5- und RC5x-Protokoll ===&lt;br /&gt;
&lt;br /&gt;
* http://www.sbprojects.net/knowledge/ir/rc5.php&lt;br /&gt;
* http://mc.mikrocontroller.com/de/IR-Protokolle.php#RC5&lt;br /&gt;
* http://users.telenet.be/davshomepage/rc5.htm&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;
&lt;br /&gt;
=== Denon-Protokoll ===&lt;br /&gt;
&lt;br /&gt;
* http://mc.mikrocontroller.com/de/IR-Protokolle.php#DENON&lt;br /&gt;
* http://www.manualowl.com/m/Denon/AVR-3803/Manual/170243&lt;br /&gt;
* http://www.remotecentral.com/cgi-bin/mboard/rc-prontong/thread.cgi?1402&lt;br /&gt;
&lt;br /&gt;
=== RC6 und RC6A-Protokoll ===&lt;br /&gt;
&lt;br /&gt;
* https://www.sbprojects.net/knowledge/ir/rc6.php&lt;br /&gt;
* http://www.picbasic.nl/info_rc6_uk.htm&lt;br /&gt;
&lt;br /&gt;
=== Bang &amp;amp; Olufsen ===&lt;br /&gt;
&lt;br /&gt;
* http://www.mikrocontroller.net/attachment/33137/datalink.pdf&lt;br /&gt;
&lt;br /&gt;
=== Grundig-Protokoll ===&lt;br /&gt;
&lt;br /&gt;
* http://www.see-solutions.de/sonstiges/Grundig_10bit.pdf&lt;br /&gt;
&lt;br /&gt;
=== Nokia-Protokoll ===&lt;br /&gt;
&lt;br /&gt;
* http://www.sbprojects.net/knowledge/ir/nrc17.php&lt;br /&gt;
&lt;br /&gt;
=== IR60 (SDA2008 bzw. MC14497P) ===&lt;br /&gt;
&lt;br /&gt;
* http://www.datasheetcatalog.org/datasheet/motorola/MC14497P.pdf&lt;br /&gt;
&lt;br /&gt;
=== LEGO Power Functions RC ===&lt;br /&gt;
&lt;br /&gt;
* http://www.philohome.com/pf/LEGO_Power_Functions_RC_v110.pdf&lt;br /&gt;
* http://www.philohome.com/pf/LEGO_Power_Functions_RC_v120.pdf&lt;br /&gt;
&lt;br /&gt;
=== RCMM-Protokoll ===&lt;br /&gt;
&lt;br /&gt;
* http://www.sbprojects.net/knowledge/ir/rcmm.php&lt;br /&gt;
&lt;br /&gt;
=== Diverse Protokolle ===&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.roboternetz.de/phpBB2/files/entwicklung_und_realisierung_einer_universalinfrarotfernbedienung_mit_timerfunktionen.pdf&lt;br /&gt;
&lt;br /&gt;
== IRMP auf Youtube ==&lt;br /&gt;
&lt;br /&gt;
Einige Videos zu [[IRMP#top|IRMP]] habe ich auf Youtube gefunden:&lt;br /&gt;
&lt;br /&gt;
* IRMP. AVR (atmega8, avr-gcc) IR decoder. http://www.youtube.com/watch?v=Q7DJvLIyTEI&lt;br /&gt;
&lt;br /&gt;
* Room-fillig powerful 100W RGB LED mood light - Raumfüllendes Stimmungslicht http://www.youtube.com/watch?v=W4tI2axR3-w&lt;br /&gt;
&lt;br /&gt;
* ir steckdose mit teachin http://www.youtube.com/watch?v=SRs98dIe2WE&lt;br /&gt;
&lt;br /&gt;
* RGB-LED mit iR Fernbedienung und Atmega8 / irmp steuern https://www.youtube.com/watch?v=Lf1Z318NKic&lt;br /&gt;
&lt;br /&gt;
== Weitere Artikel zu IRMP ==&lt;br /&gt;
&lt;br /&gt;
[http://www.infineon.com/dgdl/RF2ir+WhitePaper+V1.0.pdf?folderId=db3a3043191a246301192dd3ee2c2ae4&amp;amp;fileId=db3a30432b57a660012b5c16272c2e81 Whitepaper von Martin Gotschlich, Infineon Technologies AG]&lt;br /&gt;
&lt;br /&gt;
== Hardware / IRMP-Projekte ==&lt;br /&gt;
&lt;br /&gt;
=== Remote IRMP ===&lt;br /&gt;
&lt;br /&gt;
Netzwerkfähiger Infrarot-Sender und Empfänger mit Android Handy als Fernbedienung:&lt;br /&gt;
&lt;br /&gt;
 * http://www.mikrocontroller.net/articles/Remote_IRMP&lt;br /&gt;
&lt;br /&gt;
=== USB IR Remote Receiver ===&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;
=== USB IR Empfänger/Sender/Einschalter mit Wakeup-Timer ===&lt;br /&gt;
&lt;br /&gt;
* http://www.vdr-portal.de/board18-vdr-hardware/board13-fernbedienungen/123572-fertig-irmp-auf-stm32-ein-usb-ir-empf%C3%A4nger-sender-einschalter-mit-wakeup-timer/&lt;br /&gt;
&lt;br /&gt;
* http://www.mikrocontroller.net/articles/IRMP_auf_STM32_-_ein_USB_IR_Empf%C3%A4nger/Sender/Einschalter_mit_Wakeup-Timer&lt;br /&gt;
&lt;br /&gt;
=== USBASP ===&lt;br /&gt;
&lt;br /&gt;
IR-Einschalter auf Grundlage des USBasp&lt;br /&gt;
* http://wiki.easy-vdr.de/index.php?title=USBASP_Einschalter&lt;br /&gt;
&lt;br /&gt;
=== Servo-gesteuerter IR-Sender  ===&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;
* [http://svn.mikrokopter.de/listing.php?repname=Projects&amp;amp;path=%2FServo-Controlled+IR-Transmitter%2F&amp;amp;#Ad2417800d6aa14bf08c571a896e9def7 SVN]&lt;br /&gt;
&lt;br /&gt;
=== Lernfähige IR-Fernbedienung ===&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;
=== AVR Moodlight ===&lt;br /&gt;
&lt;br /&gt;
AVR Moodlight von Axel Schwenke&lt;br /&gt;
* http://www.mikrocontroller.net/topic/244768&lt;br /&gt;
&lt;br /&gt;
RGB Moodlight mit STM8 von Axel Schwenke&lt;br /&gt;
* https://www.mikrocontroller.net/topic/380098&lt;br /&gt;
&lt;br /&gt;
=== Infinity-Mirror-LED-Deckenlampe ===&lt;br /&gt;
&lt;br /&gt;
Infinity-Mirror-LED-Deckenlampe mit Fernbedienung von Philipp Meißner&lt;br /&gt;
* http://digital-nw.de/Infinity-Mirror.htm&lt;br /&gt;
&lt;br /&gt;
=== Kinosteuerung ===&lt;br /&gt;
&lt;br /&gt;
Kinosteuerung von Owagner&lt;br /&gt;
* http://ccc.zerties.org/index.php/Benutzer:Owagner&lt;br /&gt;
&lt;br /&gt;
=== Phasenanschnittsdimmer ===&lt;br /&gt;
&lt;br /&gt;
Phasenanschnittsdimmer - steuerbar über IR-Fernbedienung:&lt;br /&gt;
&lt;br /&gt;
* http://flosserver.dyndns.org/phasenanschnittsdimmer.php&lt;br /&gt;
&lt;br /&gt;
=== IRDioder – Ikea Dioder Hack ===&lt;br /&gt;
&lt;br /&gt;
Ikea Dioder Hack mit Atmel und Infrarotempfaenger:&lt;br /&gt;
&lt;br /&gt;
* http://marco-difeo.de/tag/infrared/&lt;br /&gt;
&lt;br /&gt;
=== Expedit Coffee Bar ===&lt;br /&gt;
&lt;br /&gt;
Ikea Expedit Regal - umgebaut zur Kaffee-Bar:&lt;br /&gt;
&lt;br /&gt;
* http://chaozlabs.blogspot.de/2013/09/expedit-coffee-bar.html&lt;br /&gt;
&lt;br /&gt;
=== Arduino als IR-Empfänger ===&lt;br /&gt;
&lt;br /&gt;
Arduino als IR-Empfänger:&lt;br /&gt;
&lt;br /&gt;
* http://www.vdr-portal.de/board18-vdr-hardware/board13-fernbedienungen/110918-arduino-als-ir-empf%C3%A4nger-einsetzen/&lt;br /&gt;
&lt;br /&gt;
Weitere Beispiele aus der Arduino Library:&lt;br /&gt;
&lt;br /&gt;
* https://github.com/ukw100/IRMP/tree/master/examples&lt;br /&gt;
&lt;br /&gt;
=== IR-Lautstärkesteuerung mit Stellaris Launchpad ===&lt;br /&gt;
&lt;br /&gt;
IR-Lautstärkesteuerung mit Stellaris Launchpad (ARM Cortex-M4F):&lt;br /&gt;
&lt;br /&gt;
* http://www.anthonyvh.com/2013/03/31/ir-volume-control/&lt;br /&gt;
&lt;br /&gt;
=== RemotePi Board ===&lt;br /&gt;
&lt;br /&gt;
Herunterfahren eines RaspPI mittels Fernbedienung:&lt;br /&gt;
&lt;br /&gt;
* http://www.msldigital.com/pages/more-information&lt;br /&gt;
&lt;br /&gt;
=== Ethernut &amp;amp; IRMP ===&lt;br /&gt;
&lt;br /&gt;
IRMP unter dem RTOS Ethernut:&lt;br /&gt;
&lt;br /&gt;
* http://www.klkl.de/ethernut.html&lt;br /&gt;
&lt;br /&gt;
=== LED strip Remote Control ===&lt;br /&gt;
&lt;br /&gt;
LED-Beleuchtung per Fernbedienung steuern:&lt;br /&gt;
&lt;br /&gt;
* http://www.solderlab.de/index.php/misc/led-strip-remote-control&lt;br /&gt;
&lt;br /&gt;
=== ADAT Audio Mixer ===&lt;br /&gt;
&lt;br /&gt;
Audio Mixer:&lt;br /&gt;
&lt;br /&gt;
* http://mailtonne.de/adat-audio-mixer/&lt;br /&gt;
&lt;br /&gt;
=== Ethersex &amp;amp; IRMP ===&lt;br /&gt;
&lt;br /&gt;
IRMP + IRSND Modul in Ethersex, einer modularen Firmware für AVR MCUs&lt;br /&gt;
&lt;br /&gt;
* http://ethersex.de/index.php/IRMP&lt;br /&gt;
&lt;br /&gt;
=== Mastermind Solver ===&lt;br /&gt;
&lt;br /&gt;
Mastermind-Solver mit LED-Streifen und IR-Fernbedienung &lt;br /&gt;
&lt;br /&gt;
* http://www.mystrobl.de/Plone/basteleien/weitere-bulls-and-cows-mastermind-implementationen/mm-v1821/mastermind-solver-mit-led-streifen-und-ir-fernbedienung&lt;br /&gt;
&lt;br /&gt;
=== A MythTV Remote Control without LIRC ===&lt;br /&gt;
&lt;br /&gt;
PC Remote Control mit ATtiny85&lt;br /&gt;
&lt;br /&gt;
* http://tomscircuits.blogspot.de/2014/12/a-mythtv-remote-control-without-lirc.html&lt;br /&gt;
&lt;br /&gt;
=== IRMP2Keyboard infrared remote to PS2/USB keyboard converter ===&lt;br /&gt;
&lt;br /&gt;
IRMP2Keyboard infrared remote to PS2/USB keyboard converter&lt;br /&gt;
&lt;br /&gt;
https://github.com/M-Reimer/irmp2keyboard&lt;br /&gt;
&lt;br /&gt;
=== IRMP + IRSND Library für STM32F4 ===&lt;br /&gt;
&lt;br /&gt;
IRMP für STM32F4&lt;br /&gt;
&lt;br /&gt;
* http://mikrocontroller.bplaced.net/wordpress/?page_id=1516&lt;br /&gt;
&lt;br /&gt;
IRSND für STM32F4&lt;br /&gt;
&lt;br /&gt;
* http://mikrocontroller.bplaced.net/wordpress/?page_id=1940&lt;br /&gt;
&lt;br /&gt;
=== IRMP auf STM32 - Bauanleitung ===&lt;br /&gt;
&lt;br /&gt;
* http://www.mikrocontroller.net/articles/IRMP_auf_STM32_-_Bauanleitung&lt;br /&gt;
&lt;br /&gt;
=== Studienarbeit - Erweiterung der Arduino Plattform ===&lt;br /&gt;
&lt;br /&gt;
* http://www.eislab.fim.uni-passau.de/files/publications/2010/StudentDiener_ErweiterungDerArduinoPlattform.pdf&lt;br /&gt;
&lt;br /&gt;
=== Forumsbeiträge ===&lt;br /&gt;
&lt;br /&gt;
* [https://www.mikrocontroller.net/topic/444061 Forumsbeitrag]: IRMP und IRSND als Protokoll für 433 MHz Sender/Empfänger funktioniert nicht so ganz &lt;br /&gt;
* [https://www.mikrocontroller.net/topic/441010#5248149 Forumsbeitrag]: Frage zu IR-Remote+LED-Strips an AVR&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#top|IRMP]] &amp;amp; [[IRSND#top|IRSND]].&lt;br /&gt;
&lt;br /&gt;
Ebenso bedanken möchte ich mich bei Christian F. für seine Tipps zur PIC-Portierung. Vielen Dank auch an gera für die Portierung auf den PIC-C18 Compiler. Für die Portierung auf ARM STM32 bedanke ich mich herzlich bei kichi (Michael K.). Vielen Dank auch an Markus Schuster für die Portierung auf Stellaris LM4F120 Launchpad von TI (ARM Cortex M4). Danke an Matthias Frank für die Portierung auf XMega. Vielen Dank auch an Wolfgang S. für die Portierung auf ESP8266, Achill Hasler für die Portierung auf Teensy. Und zuletzt noch Dank an Axel Schwenke für den Port auf STM8.&lt;br /&gt;
&lt;br /&gt;
Mein Dank geht auch an Dániel Körmendi, welcher mich nicht nur immer wieder fleißig mit Scans versorgt, sondern auch das LG-AIR-Protokoll in den [[IRSND]] eingebaut hat. Danke auch hier an Ulrich v.d. Kammer für die [[IRSND]]-Variante des Pentax-Protokolls.&lt;br /&gt;
&lt;br /&gt;
Als letztes möchte ich mich bedanken bei Jojo S., der den größten Teil dieser Dokumentation ins Englische übersetzt hat. Great Job, Jojo!&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:Infrarot]]&lt;br /&gt;
[[Kategorie:AVR-Projekte]]&lt;/div&gt;</summary>
		<author><name>Tooki</name></author>
	</entry>
</feed>