IRMP - Infrared Multi Protocol Decoder\r
--------------------------------------\r
\r
-Version IRMP: 2.0.0-pre6 06.09.2011\r
-Version IRSND: 2.0.0-pre6 06.09.2011\r
+Version IRMP: 2.0.0-pre7 12.09.2011\r
+Version IRSND: 2.0.0-pre7 12.09.2011\r
\r
Dokumentation:\r
\r
-<AVRStudio><MANAGEMENT><ProjectName>irmp</ProjectName><Created>07-Jan-2010 20:23:49</Created><LastEdit>06-Sep-2011 16:15:23</LastEdit><ICON>241</ICON><ProjectType>0</ProjectType><Created>07-Jan-2010 20:23:49</Created><Version>4</Version><Build>4, 18, 0, 670</Build><ProjectTypeName>AVR GCC</ProjectTypeName></MANAGEMENT><CODE_CREATION><ObjectFile>default\irmp.elf</ObjectFile><EntryFile></EntryFile><SaveFolder>C:\avr\irmp\</SaveFolder></CODE_CREATION><DEBUG_TARGET><CURRENT_TARGET>AVR Simulator</CURRENT_TARGET><CURRENT_PART>ATmega88.xml</CURRENT_PART><BREAKPOINTS></BREAKPOINTS><IO_EXPAND><HIDE>false</HIDE></IO_EXPAND><REGISTERNAMES><Register>R00</Register><Register>R01</Register><Register>R02</Register><Register>R03</Register><Register>R04</Register><Register>R05</Register><Register>R06</Register><Register>R07</Register><Register>R08</Register><Register>R09</Register><Register>R10</Register><Register>R11</Register><Register>R12</Register><Register>R13</Register><Register>R14</Register><Register>R15</Register><Register>R16</Register><Register>R17</Register><Register>R18</Register><Register>R19</Register><Register>R20</Register><Register>R21</Register><Register>R22</Register><Register>R23</Register><Register>R24</Register><Register>R25</Register><Register>R26</Register><Register>R27</Register><Register>R28</Register><Register>R29</Register><Register>R30</Register><Register>R31</Register></REGISTERNAMES><COM>Auto</COM><COMType>0</COMType><WATCHNUM>0</WATCHNUM><WATCHNAMES><Pane0></Pane0><Pane1></Pane1><Pane2></Pane2><Pane3></Pane3></WATCHNAMES><BreakOnTrcaeFull>0</BreakOnTrcaeFull></DEBUG_TARGET><Debugger><Triggers></Triggers></Debugger><AVRGCCPLUGIN><FILES><SOURCEFILE>main.c</SOURCEFILE><SOURCEFILE>irmp.c</SOURCEFILE><HEADERFILE>irmp.h</HEADERFILE><HEADERFILE>irmpconfig.h</HEADERFILE><OTHERFILE>default\irmp.lss</OTHERFILE><OTHERFILE>default\irmp.map</OTHERFILE></FILES><CONFIGS><CONFIG><NAME>default</NAME><USESEXTERNALMAKEFILE>NO</USESEXTERNALMAKEFILE><EXTERNALMAKEFILE></EXTERNALMAKEFILE><PART>atmega88</PART><HEX>1</HEX><LIST>1</LIST><MAP>1</MAP><OUTPUTFILENAME>irmp.elf</OUTPUTFILENAME><OUTPUTDIR>default\</OUTPUTDIR><ISDIRTY>0</ISDIRTY><OPTIONS/><INCDIRS/><LIBDIRS/><LIBS/><LINKOBJECTS/><OPTIONSFORALL>-Wall -gdwarf-2 -std=gnu99 -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums</OPTIONSFORALL><LINKEROPTIONS></LINKEROPTIONS><SEGMENTS/></CONFIG></CONFIGS><LASTCONFIG>default</LASTCONFIG><USES_WINAVR>1</USES_WINAVR><GCC_LOC>C:\Program Files\WinAVR-20100110\bin\avr-gcc.exe</GCC_LOC><MAKE_LOC>C:\Program Files\WinAVR-20100110\utils\bin\make.exe</MAKE_LOC></AVRGCCPLUGIN><IOView><usergroups/><sort sorted="0" column="0" ordername="1" orderaddress="1" ordergroup="1"/></IOView><Files><File00000><FileId>00000</FileId><FileName>main.c</FileName><Status>1</Status></File00000><File00001><FileId>00001</FileId><FileName>irmp.c</FileName><Status>1</Status></File00001><File00002><FileId>00002</FileId><FileName>irmp.h</FileName><Status>1</Status></File00002><File00003><FileId>00003</FileId><FileName>irmpconfig.h</FileName><Status>1</Status></File00003></Files><Events><Bookmarks></Bookmarks></Events><Trace><Filters></Filters></Trace></AVRStudio>\r
+<AVRStudio><MANAGEMENT><ProjectName>irmp</ProjectName><Created>07-Jan-2010 20:23:49</Created><LastEdit>12-Sep-2011 09:33:45</LastEdit><ICON>241</ICON><ProjectType>0</ProjectType><Created>07-Jan-2010 20:23:49</Created><Version>4</Version><Build>4, 18, 0, 670</Build><ProjectTypeName>AVR GCC</ProjectTypeName></MANAGEMENT><CODE_CREATION><ObjectFile>default\irmp.elf</ObjectFile><EntryFile></EntryFile><SaveFolder>C:\avr\irmp\</SaveFolder></CODE_CREATION><DEBUG_TARGET><CURRENT_TARGET>AVR Simulator</CURRENT_TARGET><CURRENT_PART>ATmega88.xml</CURRENT_PART><BREAKPOINTS></BREAKPOINTS><IO_EXPAND><HIDE>false</HIDE></IO_EXPAND><REGISTERNAMES><Register>R00</Register><Register>R01</Register><Register>R02</Register><Register>R03</Register><Register>R04</Register><Register>R05</Register><Register>R06</Register><Register>R07</Register><Register>R08</Register><Register>R09</Register><Register>R10</Register><Register>R11</Register><Register>R12</Register><Register>R13</Register><Register>R14</Register><Register>R15</Register><Register>R16</Register><Register>R17</Register><Register>R18</Register><Register>R19</Register><Register>R20</Register><Register>R21</Register><Register>R22</Register><Register>R23</Register><Register>R24</Register><Register>R25</Register><Register>R26</Register><Register>R27</Register><Register>R28</Register><Register>R29</Register><Register>R30</Register><Register>R31</Register></REGISTERNAMES><COM>Auto</COM><COMType>0</COMType><WATCHNUM>0</WATCHNUM><WATCHNAMES><Pane0></Pane0><Pane1></Pane1><Pane2></Pane2><Pane3></Pane3></WATCHNAMES><BreakOnTrcaeFull>0</BreakOnTrcaeFull></DEBUG_TARGET><Debugger><Triggers></Triggers></Debugger><AVRGCCPLUGIN><FILES><SOURCEFILE>main.c</SOURCEFILE><SOURCEFILE>irmp.c</SOURCEFILE><HEADERFILE>irmp.h</HEADERFILE><HEADERFILE>irmpconfig.h</HEADERFILE><OTHERFILE>default\irmp.lss</OTHERFILE><OTHERFILE>default\irmp.map</OTHERFILE></FILES><CONFIGS><CONFIG><NAME>default</NAME><USESEXTERNALMAKEFILE>NO</USESEXTERNALMAKEFILE><EXTERNALMAKEFILE></EXTERNALMAKEFILE><PART>atmega88</PART><HEX>1</HEX><LIST>1</LIST><MAP>1</MAP><OUTPUTFILENAME>irmp.elf</OUTPUTFILENAME><OUTPUTDIR>default\</OUTPUTDIR><ISDIRTY>0</ISDIRTY><OPTIONS/><INCDIRS/><LIBDIRS/><LIBS/><LINKOBJECTS/><OPTIONSFORALL>-Wall -gdwarf-2 -std=gnu99 -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums</OPTIONSFORALL><LINKEROPTIONS></LINKEROPTIONS><SEGMENTS/></CONFIG></CONFIGS><LASTCONFIG>default</LASTCONFIG><USES_WINAVR>1</USES_WINAVR><GCC_LOC>C:\Program Files\WinAVR-20100110\bin\avr-gcc.exe</GCC_LOC><MAKE_LOC>C:\Program Files\WinAVR-20100110\utils\bin\make.exe</MAKE_LOC></AVRGCCPLUGIN><IOView><usergroups/><sort sorted="0" column="0" ordername="0" orderaddress="0" ordergroup="0"/></IOView><Files><File00000><FileId>00000</FileId><FileName>main.c</FileName><Status>1</Status></File00000><File00001><FileId>00001</FileId><FileName>irmp.c</FileName><Status>1</Status></File00001><File00002><FileId>00002</FileId><FileName>irmp.h</FileName><Status>1</Status></File00002><File00003><FileId>00003</FileId><FileName>irmpconfig.h</FileName><Status>1</Status></File00003></Files><Events><Bookmarks></Bookmarks></Events><Trace><Filters></Filters></Trace></AVRStudio>\r
*\r
* Copyright (c) 2009-2011 Frank Meyer - frank(at)fli4l.de\r
*\r
- * $Id: irmp.c,v 1.106 2011/08/16 07:51:19 fm Exp $\r
+ * $Id: irmp.c,v 1.108 2011/09/09 11:59:39 fm Exp $\r
*\r
* ATMEGA88 @ 8 MHz\r
*\r
- * Typical manufacturers:\r
+ * Supported mikrocontrollers:\r
+ *\r
+ * ATtiny84, ATtiny85\r
+ * ATmega8, ATmega16, ATmega32\r
+ * ATmega162\r
+ * ATmega164, ATmega324, ATmega644, ATmega644P, ATmega1284\r
+ * ATmega88, ATmega88P, ATmega168, ATmega168P, ATmega328P\r
+ *\r
+ * Typical manufacturers of remote controls:\r
*\r
* SIRCS - Sony\r
* NEC - NEC, Yamaha, Canon, Tevion, Harman/Kardon, Hitachi, JVC, Pioneer, Toshiba, Xoro, Orion, and many other Japanese manufacturers\r
#define AUTO_FRAME_REPETITION_LEN (uint16_t)(F_INTERRUPTS * AUTO_FRAME_REPETITION_TIME + 0.5) // use uint16_t!\r
\r
#ifdef ANALYZE\r
-#define ANALYZE_PUTCHAR(a) { if (! silent) { putchar (a); } }\r
-#define ANALYZE_ONLY_NORMAL_PUTCHAR(a) { if (! silent && !verbose) { putchar (a); } }\r
-#define ANALYZE_PRINTF(...) { if (verbose) { printf (__VA_ARGS__); } }\r
-#define ANALYZE_NEWLINE() { if (verbose) { putchar ('\n'); } }\r
-static int silent;\r
-static int time_counter;\r
-static int verbose;\r
+#define ANALYZE_PUTCHAR(a) { if (! silent) { putchar (a); } }\r
+#define ANALYZE_ONLY_NORMAL_PUTCHAR(a) { if (! silent && !verbose) { putchar (a); } }\r
+#define ANALYZE_PRINTF(...) { if (verbose) { printf (__VA_ARGS__); } }\r
+#define ANALYZE_NEWLINE() { if (verbose) { putchar ('\n'); } }\r
+static int silent;\r
+static int time_counter;\r
+static int verbose;\r
#else\r
#define ANALYZE_PUTCHAR(a)\r
#define ANALYZE_ONLY_NORMAL_PUTCHAR(a)\r
#define ANALYZE_NEWLINE()\r
#endif\r
\r
+#if IRMP_USE_CALLBACK == 1\r
+static void (*irmp_callback_ptr) (uint8_t);\r
+#endif // IRMP_USE_CALLBACK == 1\r
+\r
/*---------------------------------------------------------------------------------------------------------------------------------------------------\r
* Protocol names\r
*---------------------------------------------------------------------------------------------------------------------------------------------------\r
NEC_0_PAUSE_LEN_MIN, // pause_0_len_min: minimum length of pause with bit value 0\r
NEC_0_PAUSE_LEN_MAX, // pause_0_len_max: maximum length of pause with bit value 0\r
NEC42_ADDRESS_OFFSET, // address_offset: address offset\r
- NEC42_ADDRESS_OFFSET + NEC_ADDRESS_LEN, // address_end: end of address\r
+ NEC42_ADDRESS_OFFSET + NEC42_ADDRESS_LEN, // address_end: end of address\r
NEC42_COMMAND_OFFSET, // command_offset: command offset\r
- NEC42_COMMAND_OFFSET + NEC_COMMAND_LEN, // command_end: end of command\r
+ NEC42_COMMAND_OFFSET + NEC42_COMMAND_LEN, // command_end: end of command\r
NEC42_COMPLETE_DATA_LEN, // complete_len: complete length of frame\r
NEC_STOP_BIT, // stop_bit: flag: frame has stop bit\r
NEC_LSB, // lsb_first: flag: LSB first\r
// return irmp_busy_flag;\r
// }\r
\r
+#if IRMP_USE_CALLBACK == 1\r
+void\r
+irmp_set_callback_ptr (void (*cb)(uint8_t))\r
+{\r
+ irmp_callback_ptr = cb;\r
+}\r
+#endif // IRMP_USE_CALLBACK == 1\r
+\r
// these statics must not be volatile, because they are only used by irmp_store_bit(), which is called by irmp_ISR()\r
static uint16_t irmp_tmp_address; // ir address\r
static uint16_t irmp_tmp_command; // ir command\r
\r
irmp_input = input(IRMP_PIN);\r
\r
+#if IRMP_USE_CALLBACK == 1\r
+ if (irmp_callback_ptr)\r
+ {\r
+ static uint8_t last_inverted_input;\r
+\r
+ if (last_inverted_input != !irmp_input)\r
+ {\r
+ (*irmp_callback_ptr) (! irmp_input);\r
+ last_inverted_input = !irmp_input;\r
+ }\r
+ }\r
+#endif // IRMP_USE_CALLBACK == 1\r
+\r
irmp_log(irmp_input); // log ir signal, if IRMP_LOGGING defined\r
\r
if (! irmp_ir_detected) // ir code already detected?\r
#endif // IRMP_SUPPORT_NEC42_PROTOCOL == 1\r
irmp_bit == 8 && irmp_pause_time >= NEC_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= NEC_START_BIT_PAUSE_LEN_MAX)\r
{\r
-printf ("! %d %d !\n", irmp_pause_time, NEC_START_BIT_PAUSE_LEN_MAX);\r
ANALYZE_PRINTF ("Switching to NEC16 protocol\n");\r
- irmp_param.protocol = IRMP_NEC16_PROTOCOL;\r
+ irmp_param.protocol = IRMP_NEC16_PROTOCOL;\r
irmp_param.address_offset = NEC16_ADDRESS_OFFSET;\r
irmp_param.address_end = NEC16_ADDRESS_OFFSET + NEC16_ADDRESS_LEN;\r
irmp_param.command_offset = NEC16_COMMAND_OFFSET;\r
*\r
* Copyright (c) 2009-2011 Frank Meyer - frank(at)fli4l.de\r
*\r
- * $Id: irmp.h,v 1.64 2011/08/16 07:51:19 fm Exp $\r
+ * $Id: irmp.h,v 1.65 2011/09/08 13:22:16 fm Exp $\r
*\r
* ATMEGA88 @ 8 MHz\r
*\r
extern char * irmp_protocol_names[IRMP_N_PROTOCOLS + 1];\r
#endif\r
\r
+#if IRMP_USE_CALLBACK == 1\r
+extern void irmp_set_callback_ptr (void (*cb)(uint8_t));\r
+#endif // IRSND_USE_CALLBACK == 1\r
+\r
#endif /* _WC_IRMP_H_ */\r
*\r
* Copyright (c) 2009-2011 Frank Meyer - frank(at)fli4l.de\r
*\r
- * $Id: irmpconfig.h,v 1.71 2011/08/16 07:32:39 fm Exp $\r
+ * $Id: irmpconfig.h,v 1.74 2011/09/11 13:17:38 fm Exp $\r
*\r
* ATMEGA88 @ 8 MHz\r
*\r
#define IRMP_SUPPORT_RC5_PROTOCOL 0 // RC5 >= 10000 ~250 bytes\r
#define IRMP_SUPPORT_RC6_PROTOCOL 0 // RC6 & RC6A >= 10000 ~250 bytes\r
#define IRMP_SUPPORT_JVC_PROTOCOL 0 // JVC >= 10000 ~150 bytes\r
-#define IRMP_SUPPORT_NEC16_PROTOCOL 0 // NEC16 >= 10000 ~50 bytes\r
-#define IRMP_SUPPORT_NEC42_PROTOCOL 0 // NEC42 >= 10000 ~150 bytes\r
+#define IRMP_SUPPORT_NEC16_PROTOCOL 0 // NEC16 >= 10000 ~100 bytes\r
+#define IRMP_SUPPORT_NEC42_PROTOCOL 0 // NEC42 >= 10000 ~300 bytes\r
#define IRMP_SUPPORT_IR60_PROTOCOL 0 // IR60 (SAB2008) >= 10000 ~300 bytes\r
#define IRMP_SUPPORT_GRUNDIG_PROTOCOL 0 // Grundig >= 10000 ~300 bytes\r
#define IRMP_SUPPORT_SIEMENS_PROTOCOL 0 // Siemens Gigaset >= 15000 ~550 bytes\r
*/\r
#define IRMP_PROTOCOL_NAMES 0 // 1: access protocol names, 0: do not (default),\r
\r
+/*---------------------------------------------------------------------------------------------------------------------------------------------------\r
+ * Use Callbacks to indicate input signal\r
+ *---------------------------------------------------------------------------------------------------------------------------------------------------\r
+ */\r
+#define IRMP_USE_CALLBACK 0 // flag: 0 = don't use callbacks, 1 = use callbacks, default is 0\r
+\r
/*---------------------------------------------------------------------------------------------------------------------------------------------------\r
* DO NOT CHANGE THE FOLLOWING LINES !\r
*---------------------------------------------------------------------------------------------------------------------------------------------------\r
-<AVRStudio><MANAGEMENT><ProjectName>irsnd</ProjectName><Created>07-Jan-2010 20:23:49</Created><LastEdit>06-Sep-2011 16:10:48</LastEdit><ICON>241</ICON><ProjectType>0</ProjectType><Created>07-Jan-2010 20:23:49</Created><Version>4</Version><Build>4, 18, 0, 670</Build><ProjectTypeName>AVR GCC</ProjectTypeName></MANAGEMENT><CODE_CREATION><ObjectFile>default\irsnd.elf</ObjectFile><EntryFile></EntryFile><SaveFolder>C:\avr\irmp\</SaveFolder></CODE_CREATION><DEBUG_TARGET><CURRENT_TARGET>AVR Simulator</CURRENT_TARGET><CURRENT_PART>ATmega88.xml</CURRENT_PART><BREAKPOINTS></BREAKPOINTS><IO_EXPAND><HIDE>false</HIDE></IO_EXPAND><REGISTERNAMES><Register>R00</Register><Register>R01</Register><Register>R02</Register><Register>R03</Register><Register>R04</Register><Register>R05</Register><Register>R06</Register><Register>R07</Register><Register>R08</Register><Register>R09</Register><Register>R10</Register><Register>R11</Register><Register>R12</Register><Register>R13</Register><Register>R14</Register><Register>R15</Register><Register>R16</Register><Register>R17</Register><Register>R18</Register><Register>R19</Register><Register>R20</Register><Register>R21</Register><Register>R22</Register><Register>R23</Register><Register>R24</Register><Register>R25</Register><Register>R26</Register><Register>R27</Register><Register>R28</Register><Register>R29</Register><Register>R30</Register><Register>R31</Register></REGISTERNAMES><COM>Auto</COM><COMType>0</COMType><WATCHNUM>0</WATCHNUM><WATCHNAMES><Pane0></Pane0><Pane1></Pane1><Pane2></Pane2><Pane3></Pane3></WATCHNAMES><BreakOnTrcaeFull>0</BreakOnTrcaeFull></DEBUG_TARGET><Debugger><Triggers></Triggers></Debugger><AVRGCCPLUGIN><FILES><SOURCEFILE>irsndmain.c</SOURCEFILE><SOURCEFILE>irsnd.c</SOURCEFILE><HEADERFILE>irmp.h</HEADERFILE><HEADERFILE>irsnd.h</HEADERFILE><HEADERFILE>irsndconfig.h</HEADERFILE><OTHERFILE>default\irsnd.lss</OTHERFILE><OTHERFILE>default\irsnd.map</OTHERFILE></FILES><CONFIGS><CONFIG><NAME>default</NAME><USESEXTERNALMAKEFILE>NO</USESEXTERNALMAKEFILE><EXTERNALMAKEFILE></EXTERNALMAKEFILE><PART>atmega88</PART><HEX>1</HEX><LIST>1</LIST><MAP>1</MAP><OUTPUTFILENAME>irsnd.elf</OUTPUTFILENAME><OUTPUTDIR>default\</OUTPUTDIR><ISDIRTY>0</ISDIRTY><OPTIONS/><INCDIRS/><LIBDIRS/><LIBS/><LINKOBJECTS/><OPTIONSFORALL>-Wall -gdwarf-2 -std=gnu99 -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums</OPTIONSFORALL><LINKEROPTIONS></LINKEROPTIONS><SEGMENTS/></CONFIG></CONFIGS><LASTCONFIG>default</LASTCONFIG><USES_WINAVR>1</USES_WINAVR><GCC_LOC>C:\Program Files\WinAVR-20100110\bin\avr-gcc.exe</GCC_LOC><MAKE_LOC>C:\Program Files\WinAVR-20100110\utils\bin\make.exe</MAKE_LOC></AVRGCCPLUGIN><IOView><usergroups/><sort sorted="0" column="0" ordername="1" orderaddress="1" ordergroup="1"/></IOView><Files><File00000><FileId>00000</FileId><FileName>irsndmain.c</FileName><Status>1</Status></File00000><File00001><FileId>00001</FileId><FileName>irmp.h</FileName><Status>1</Status></File00001><File00002><FileId>00002</FileId><FileName>irsnd.c</FileName><Status>1</Status></File00002><File00003><FileId>00003</FileId><FileName>irsnd.h</FileName><Status>1</Status></File00003><File00004><FileId>00004</FileId><FileName>irsndconfig.h</FileName><Status>1</Status></File00004></Files><Events><Bookmarks></Bookmarks></Events><Trace><Filters></Filters></Trace></AVRStudio>\r
+<AVRStudio><MANAGEMENT><ProjectName>irsnd</ProjectName><Created>07-Jan-2010 20:23:49</Created><LastEdit>07-Sep-2011 16:01:18</LastEdit><ICON>241</ICON><ProjectType>0</ProjectType><Created>07-Jan-2010 20:23:49</Created><Version>4</Version><Build>4, 18, 0, 670</Build><ProjectTypeName>AVR GCC</ProjectTypeName></MANAGEMENT><CODE_CREATION><ObjectFile>default\irsnd.elf</ObjectFile><EntryFile></EntryFile><SaveFolder>C:\avr\irmp\</SaveFolder></CODE_CREATION><DEBUG_TARGET><CURRENT_TARGET>AVR Simulator</CURRENT_TARGET><CURRENT_PART>ATmega88.xml</CURRENT_PART><BREAKPOINTS></BREAKPOINTS><IO_EXPAND><HIDE>false</HIDE></IO_EXPAND><REGISTERNAMES><Register>R00</Register><Register>R01</Register><Register>R02</Register><Register>R03</Register><Register>R04</Register><Register>R05</Register><Register>R06</Register><Register>R07</Register><Register>R08</Register><Register>R09</Register><Register>R10</Register><Register>R11</Register><Register>R12</Register><Register>R13</Register><Register>R14</Register><Register>R15</Register><Register>R16</Register><Register>R17</Register><Register>R18</Register><Register>R19</Register><Register>R20</Register><Register>R21</Register><Register>R22</Register><Register>R23</Register><Register>R24</Register><Register>R25</Register><Register>R26</Register><Register>R27</Register><Register>R28</Register><Register>R29</Register><Register>R30</Register><Register>R31</Register></REGISTERNAMES><COM>Auto</COM><COMType>0</COMType><WATCHNUM>0</WATCHNUM><WATCHNAMES><Pane0></Pane0><Pane1></Pane1><Pane2></Pane2><Pane3></Pane3></WATCHNAMES><BreakOnTrcaeFull>0</BreakOnTrcaeFull></DEBUG_TARGET><Debugger><Triggers></Triggers></Debugger><AVRGCCPLUGIN><FILES><SOURCEFILE>irsndmain.c</SOURCEFILE><SOURCEFILE>irsnd.c</SOURCEFILE><HEADERFILE>irmp.h</HEADERFILE><HEADERFILE>irsnd.h</HEADERFILE><HEADERFILE>irsndconfig.h</HEADERFILE><OTHERFILE>default\irsnd.lss</OTHERFILE><OTHERFILE>default\irsnd.map</OTHERFILE></FILES><CONFIGS><CONFIG><NAME>default</NAME><USESEXTERNALMAKEFILE>NO</USESEXTERNALMAKEFILE><EXTERNALMAKEFILE></EXTERNALMAKEFILE><PART>atmega88</PART><HEX>1</HEX><LIST>1</LIST><MAP>1</MAP><OUTPUTFILENAME>irsnd.elf</OUTPUTFILENAME><OUTPUTDIR>default\</OUTPUTDIR><ISDIRTY>0</ISDIRTY><OPTIONS/><INCDIRS/><LIBDIRS/><LIBS/><LINKOBJECTS/><OPTIONSFORALL>-Wall -gdwarf-2 -std=gnu99 -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums</OPTIONSFORALL><LINKEROPTIONS></LINKEROPTIONS><SEGMENTS/></CONFIG></CONFIGS><LASTCONFIG>default</LASTCONFIG><USES_WINAVR>1</USES_WINAVR><GCC_LOC>C:\Program Files\WinAVR-20100110\bin\avr-gcc.exe</GCC_LOC><MAKE_LOC>C:\Program Files\WinAVR-20100110\utils\bin\make.exe</MAKE_LOC></AVRGCCPLUGIN><IOView><usergroups/><sort sorted="0" column="0" ordername="0" orderaddress="0" ordergroup="0"/></IOView><Files><File00000><FileId>00000</FileId><FileName>irsndmain.c</FileName><Status>1</Status></File00000><File00001><FileId>00001</FileId><FileName>irmp.h</FileName><Status>1</Status></File00001><File00002><FileId>00002</FileId><FileName>irsnd.c</FileName><Status>1</Status></File00002><File00003><FileId>00003</FileId><FileName>irsnd.h</FileName><Status>1</Status></File00003><File00004><FileId>00004</FileId><FileName>irsndconfig.h</FileName><Status>1</Status></File00004></Files><Events><Bookmarks></Bookmarks></Events><Trace><Filters></Filters></Trace></AVRStudio>\r
*\r
* Copyright (c) 2010-2011 Frank Meyer - frank(at)fli4l.de\r
*\r
- * $Id: irsnd.c,v 1.38 2011/05/22 21:40:53 fm Exp $\r
+ * Supported mikrocontrollers:\r
+ *\r
+ * ATtiny84, ATtiny85\r
+ * ATmega8, ATmega16, ATmega32\r
+ * ATmega162\r
+ * ATmega164, ATmega324, ATmega644, ATmega644P, ATmega1284\r
+ * ATmega88, ATmega88P, ATmega168, ATmega168P, ATmega328P\r
+ *\r
+ * $Id: irsnd.c,v 1.40 2011/09/09 11:59:40 fm Exp $\r
*\r
* This program is free software; you can redistribute it and/or modify\r
* it under the terms of the GNU General Public License as published by\r
* ATmega pin definition of OC2 / OC2A / OC2B / OC0 / OC0A / OC0B\r
*---------------------------------------------------------------------------------------------------------------------------------------------------\r
*/\r
-#if defined (__AVR_ATtiny85__) // ATtiny85 uses OC0A = PB0 or OC0B = PB1\r
+#if defined (__AVR_ATtiny84__) // ATtiny85 uses OC0A = PB2 or OC0B = PA7\r
+#if IRSND_OCx == IRSND_OC0A // OC0A\r
+#define IRSND_PORT PORTB // port B\r
+#define IRSND_DDR DDRB // ddr B\r
+#define IRSND_BIT 2 // OC0A\r
+#elif IRSND_OCx == IRSND_OC0B // OC0B\r
+#define IRSND_PORT PORTA // port A\r
+#define IRSND_DDR DDRA // ddr A\r
+#define IRSND_BIT 7 // OC0B\r
+#else\r
+#error Wrong value for IRSND_OCx, choose IRSND_OC0A or IRSND_OC0B in irsndconfig.h\r
+#endif // IRSND_OCx\r
+\r
+#elif defined (__AVR_ATtiny85__) // ATtiny85 uses OC0A = PB0 or OC0B = PB1\r
#if IRSND_OCx == IRSND_OC0A // OC0A\r
#define IRSND_PORT PORTB // port B\r
#define IRSND_DDR DDRB // ddr B\r
\r
#elif defined (__AVR_ATmega48__) \\r
|| defined (__AVR_ATmega88__) \\r
+ || defined (__AVR_ATmega88P__) \\r
|| defined (__AVR_ATmega168__) \\r
|| defined (__AVR_ATmega168P__) \\r
- || defined (__AVR_ATmega328__) \\r
- || defined (__AVR_ATmega328P__) // ATmega48|88|168|168P|328P uses OC2A = PB3 or OC2B = PD3 or OC0A = PD6 or OC0B = PD5\r
+ || defined (__AVR_ATmega328P__) // ATmega48|88|168|168|328 uses OC2A = PB3 or OC2B = PD3 or OC0A = PD6 or OC0B = PD5\r
#if IRSND_OCx == IRSND_OC2A // OC2A\r
#define IRSND_PORT PORTB // port B\r
#define IRSND_DDR DDRB // ddr B\r
\r
irsnd_protocol = IRMP_NEC_PROTOCOL; // APPLE protocol is NEC with id instead of inverted command\r
\r
- irsnd_buffer[0] = (address & 0xFF00) >> 8; // AAAAAAAA\r
- irsnd_buffer[1] = (address & 0x00FF); // AAAAAAAA\r
- irsnd_buffer[2] = (command & 0xFF00) >> 8; // CCCCCCCC\r
- irsnd_buffer[3] = (command & 0x00FF); // CCCCCCCC\r
-\r
+ irsnd_buffer[0] = (address & 0xFF00) >> 8; // AAAAAAAA\r
+ irsnd_buffer[1] = (address & 0x00FF); // AAAAAAAA\r
+ irsnd_buffer[2] = (command & 0xFF00) >> 8; // CCCCCCCC\r
+ irsnd_buffer[3] = 0x8B; // 10001011 (id)\r
irsnd_busy = TRUE;\r
break;\r
}\r
irsnd_buffer[0] = (address & 0xFF00) >> 8; // AAAAAAAA\r
irsnd_buffer[1] = (address & 0x00FF); // AAAAAAAA\r
irsnd_buffer[2] = (command & 0xFF00) >> 8; // CCCCCCCC\r
+ irsnd_buffer[3] = ~((command & 0xFF00) >> 8); // cccccccc\r
+ irsnd_busy = TRUE;\r
+ break;\r
+ }\r
+#endif\r
+#if IRSND_SUPPORT_NEC16_PROTOCOL == 1\r
+ case IRMP_NEC16_PROTOCOL:\r
+ {\r
+ address = bitsrevervse (irmp_data_p->address, NEC16_ADDRESS_LEN);\r
+ command = bitsrevervse (irmp_data_p->command, NEC16_COMMAND_LEN);\r
\r
- irsnd_protocol = IRMP_NEC_PROTOCOL; // APPLE protocol is NEC with fix bitmask instead of inverted command\r
- irsnd_buffer[3] = 0x8B; // 10001011\r
- {\r
- irsnd_buffer[3] = ~((command & 0xFF00) >> 8); // cccccccc\r
- }\r
-\r
+ irsnd_buffer[0] = (address & 0x00FF); // AAAAAAAA\r
+ irsnd_buffer[1] = (command & 0x00FF); // CCCCCCCC\r
+ irsnd_busy = TRUE;\r
+ break;\r
+ }\r
+#endif\r
+#if IRSND_SUPPORT_NEC42_PROTOCOL == 1\r
+ case IRMP_NEC42_PROTOCOL:\r
+ {\r
+ address = bitsrevervse (irmp_data_p->address, NEC42_ADDRESS_LEN);\r
+ command = bitsrevervse (irmp_data_p->command, NEC42_COMMAND_LEN);\r
+\r
+ irsnd_buffer[0] = ( (address & 0x1FE0) >> 5); // AAAAAAAA\r
+ irsnd_buffer[1] = ( (address & 0x001F) << 3) | ((~address & 0x1C00) >> 10); // AAAAAaaa\r
+ irsnd_buffer[2] = ((~address & 0x03FC) >> 2); // aaaaaaaa\r
+ irsnd_buffer[3] = ((~address & 0x0003) << 6) | ( (command & 0x00FC) >> 2); // aaCCCCCC\r
+ irsnd_buffer[4] = ( (command & 0x0003) << 6) | ((~command & 0x00FC) >> 2); // CCcccccc\r
+ irsnd_buffer[5] = ((~command & 0x0003) << 6); // cc\r
irsnd_busy = TRUE;\r
break;\r
}\r
break;\r
}\r
#endif\r
+#if IRSND_SUPPORT_NEC16_PROTOCOL == 1\r
+ case IRMP_NEC16_PROTOCOL:\r
+ {\r
+ startbit_pulse_len = NEC_START_BIT_PULSE_LEN;\r
+ startbit_pause_len = NEC_START_BIT_PAUSE_LEN - 1;\r
+ pulse_1_len = NEC_PULSE_LEN;\r
+ pause_1_len = NEC_1_PAUSE_LEN - 1;\r
+ pulse_0_len = NEC_PULSE_LEN;\r
+ pause_0_len = NEC_0_PAUSE_LEN - 1;\r
+ has_stop_bit = NEC_STOP_BIT;\r
+ complete_data_len = NEC16_COMPLETE_DATA_LEN + 1; // 1 more: sync bit\r
+ n_auto_repetitions = 1; // 1 frame\r
+ auto_repetition_pause_len = 0;\r
+ repeat_frame_pause_len = NEC_FRAME_REPEAT_PAUSE_LEN;\r
+ irsnd_set_freq (IRSND_FREQ_38_KHZ);\r
+ break;\r
+ }\r
+#endif\r
+#if IRSND_SUPPORT_NEC42_PROTOCOL == 1\r
+ case IRMP_NEC42_PROTOCOL:\r
+ {\r
+ startbit_pulse_len = NEC_START_BIT_PULSE_LEN;\r
+ startbit_pause_len = NEC_START_BIT_PAUSE_LEN - 1;\r
+ pulse_1_len = NEC_PULSE_LEN;\r
+ pause_1_len = NEC_1_PAUSE_LEN - 1;\r
+ pulse_0_len = NEC_PULSE_LEN;\r
+ pause_0_len = NEC_0_PAUSE_LEN - 1;\r
+ has_stop_bit = NEC_STOP_BIT;\r
+ complete_data_len = NEC42_COMPLETE_DATA_LEN;\r
+ n_auto_repetitions = 1; // 1 frame\r
+ auto_repetition_pause_len = 0;\r
+ repeat_frame_pause_len = NEC_FRAME_REPEAT_PAUSE_LEN;\r
+ irsnd_set_freq (IRSND_FREQ_38_KHZ);\r
+ break;\r
+ }\r
+#endif\r
#if IRSND_SUPPORT_SAMSUNG_PROTOCOL == 1\r
case IRMP_SAMSUNG_PROTOCOL:\r
{\r
#if IRSND_SUPPORT_NEC_PROTOCOL == 1\r
case IRMP_NEC_PROTOCOL:\r
#endif\r
+#if IRSND_SUPPORT_NEC16_PROTOCOL == 1\r
+ case IRMP_NEC16_PROTOCOL:\r
+#endif\r
+#if IRSND_SUPPORT_NEC42_PROTOCOL == 1\r
+ case IRMP_NEC42_PROTOCOL:\r
+#endif\r
#if IRSND_SUPPORT_SAMSUNG_PROTOCOL == 1\r
case IRMP_SAMSUNG_PROTOCOL:\r
case IRMP_SAMSUNG32_PROTOCOL:\r
#endif\r
\r
\r
-#if IRSND_SUPPORT_SIRCS_PROTOCOL == 1 || IRSND_SUPPORT_NEC_PROTOCOL == 1 || IRSND_SUPPORT_SAMSUNG_PROTOCOL == 1 || IRSND_SUPPORT_MATSUSHITA_PROTOCOL == 1 || \\r
+#if IRSND_SUPPORT_SIRCS_PROTOCOL == 1 || IRSND_SUPPORT_NEC_PROTOCOL == 1 || IRSND_SUPPORT_NEC16_PROTOCOL == 1 || IRSND_SUPPORT_NEC42_PROTOCOL == 1 || \\r
+ IRSND_SUPPORT_SAMSUNG_PROTOCOL == 1 || IRSND_SUPPORT_MATSUSHITA_PROTOCOL == 1 || \\r
IRSND_SUPPORT_KASEIKYO_PROTOCOL == 1 || IRSND_SUPPORT_RECS80_PROTOCOL == 1 || IRSND_SUPPORT_RECS80EXT_PROTOCOL == 1 || IRSND_SUPPORT_DENON_PROTOCOL == 1 || \\r
IRSND_SUPPORT_NUBERT_PROTOCOL == 1 || IRSND_SUPPORT_BANG_OLUFSEN_PROTOCOL == 1 || IRSND_SUPPORT_FDC_PROTOCOL == 1 || IRSND_SUPPORT_RCCAR_PROTOCOL == 1 || \\r
IRSND_SUPPORT_JVC_PROTOCOL == 1 || IRSND_SUPPORT_NIKON_PROTOCOL == 1 || IRSND_SUPPORT_LEGO_PROTOCOL == 1 || IRSND_SUPPORT_THOMSON_PROTOCOL == 1 \r
else\r
#endif\r
\r
+#if IRSND_SUPPORT_NEC16_PROTOCOL == 1\r
+ if (irsnd_protocol == IRMP_NEC16_PROTOCOL)\r
+ {\r
+ if (current_bit < NEC16_ADDRESS_LEN) // send address bits\r
+ {\r
+ pulse_len = NEC_PULSE_LEN;\r
+ pause_len = (irsnd_buffer[current_bit / 8] & (1<<(7-(current_bit % 8)))) ?\r
+ (NEC_1_PAUSE_LEN - 1) : (NEC_0_PAUSE_LEN - 1);\r
+ }\r
+ else if (current_bit == NEC16_ADDRESS_LEN) // send SYNC bit (8th bit)\r
+ {\r
+ pulse_len = NEC_PULSE_LEN;\r
+ pause_len = NEC_START_BIT_PAUSE_LEN - 1;\r
+ }\r
+ else if (current_bit < NEC16_COMPLETE_DATA_LEN + 1) // send n'th bit\r
+ {\r
+ uint8_t cur_bit = current_bit - 1; // sync skipped, offset = -1 !\r
+\r
+ pulse_len = NEC_PULSE_LEN;\r
+ pause_len = (irsnd_buffer[cur_bit / 8] & (1<<(7-(cur_bit % 8)))) ?\r
+ (NEC_1_PAUSE_LEN - 1) : (NEC_0_PAUSE_LEN - 1);\r
+ }\r
+ }\r
+ else\r
+#endif\r
+\r
#if IRSND_SUPPORT_BANG_OLUFSEN_PROTOCOL == 1\r
if (irsnd_protocol == IRMP_BANG_OLUFSEN_PROTOCOL)\r
{\r
*\r
* Copyright (c) 2010-2011 Frank Meyer - frank(at)fli4l.de\r
*\r
- * $Id: irsndconfig.h,v 1.22 2011/05/20 09:31:25 fm Exp $\r
+ * $Id: irsndconfig.h,v 1.26 2011/09/11 13:17:38 fm Exp $\r
*\r
* ATMEGA88 @ 8 MHz\r
*\r
#define IRSND_SUPPORT_DENON_PROTOCOL 1 // DENON, Sharp >= 10000 ~200 bytes\r
\r
// more protocols, enable here! Enable Remarks F_INTERRUPTS Program Space\r
-#define IRSND_SUPPORT_RC5_PROTOCOL 1 // RC5 >= 10000 ~150 bytes\r
+#define IRSND_SUPPORT_RC5_PROTOCOL 0 // RC5 >= 10000 ~150 bytes\r
#define IRSND_SUPPORT_RC6_PROTOCOL 0 // RC6 >= 10000 ~250 bytes\r
#define IRSND_SUPPORT_RC6A_PROTOCOL 0 // RC6A >= 10000 ~250 bytes\r
#define IRSND_SUPPORT_JVC_PROTOCOL 0 // JVC >= 10000 ~150 bytes\r
-#define IRSND_SUPPORT_NEC16_PROTOCOL 0 // NEC16 >= 10000 DON'T CHANGE, NOT SUPPORTED YET!\r
-#define IRSND_SUPPORT_NEC42_PROTOCOL 0 // NEC42 >= 10000 DON'T CHANGE, NOT SUPPORTED YET!\r
+#define IRSND_SUPPORT_NEC16_PROTOCOL 0 // NEC16 >= 10000 ~150 bytes\r
+#define IRSND_SUPPORT_NEC42_PROTOCOL 0 // NEC42 >= 10000 ~150 bytes\r
#define IRSND_SUPPORT_IR60_PROTOCOL 0 // IR60 (SAB2008) >= 10000 DON'T CHANGE, NOT SUPPORTED YET!\r
#define IRSND_SUPPORT_GRUNDIG_PROTOCOL 0 // Grundig >= 10000 ~300 bytes\r
#define IRSND_SUPPORT_SIEMENS_PROTOCOL 0 // Siemens, Gigaset >= 15000 ~150 bytes\r
#define IRSND_SUPPORT_BANG_OLUFSEN_PROTOCOL 0 // Bang&Olufsen >= 10000 ~250 bytes\r
#define IRSND_SUPPORT_RECS80_PROTOCOL 0 // RECS80 >= 20000 ~100 bytes\r
#define IRSND_SUPPORT_RECS80EXT_PROTOCOL 0 // RECS80EXT >= 20000 ~100 bytes\r
-#define IRSND_SUPPORT_THOMSON_PROTOCOL 1 // Thomson >= 10000 ~250 bytes\r
+#define IRSND_SUPPORT_THOMSON_PROTOCOL 0 // Thomson >= 10000 ~250 bytes\r
#define IRSND_SUPPORT_NIKON_PROTOCOL 0 // NIKON >= 10000 ~150 bytes\r
#define IRSND_SUPPORT_NETBOX_PROTOCOL 0 // Netbox keyboard >= 10000 DON'T CHANGE, NOT SUPPORTED YET!\r
#define IRSND_SUPPORT_IMON_PROTOCOL 0 // IMON keyboard >= 10000 DON'T CHANGE, NOT SUPPORTED YET!\r
* IRSND_OC2A = OC2A on ATmegas supporting OC2A, e.g. ATmega88\r
* IRSND_OC2B = OC2B on ATmegas supporting OC2B, e.g. ATmega88\r
* IRSND_OC0 = OC0 on ATmegas supporting OC0, e.g. ATmega162\r
- * IRSND_OC0A = OC0A on ATmegas/ATtinys supporting OC0A, e.g. ATtiny85\r
- * IRSND_OC0B = OC0B on ATmegas/ATtinys supporting OC0B, e.g. ATtiny85\r
+ * IRSND_OC0A = OC0A on ATmegas/ATtinys supporting OC0A, e.g. ATtiny84, ATtiny85\r
+ * IRSND_OC0B = OC0B on ATmegas/ATtinys supporting OC0B, e.g. ATtiny84, ATtiny85\r
*---------------------------------------------------------------------------------------------------------------------------------------------------\r
*/\r
#define IRSND_OCx IRSND_OC2B // use OC2B\r
*\r
* Copyright (c) 2009-2011 Frank Meyer - frank(at)fli4l.de\r
*\r
- * $Id: main.c,v 1.9 2011/04/11 12:54:25 fm Exp $\r
+ * $Id: main.c,v 1.10 2011/09/08 13:22:16 fm Exp $\r
*\r
* ATMEGA88 @ 8 MHz\r
*\r
void\r
timer1_init (void)\r
{\r
-#if defined (__AVR_ATtiny85__) // ATtiny85:\r
- OCR1A = (F_CPU / (2 * F_INTERRUPTS) / 2) - 1; // compare value: 1/28800 of CPU frequency, presc = 2\r
- TCCR1 = (1 << CTC1) | (1 << CS11); // switch CTC Mode on, set prescaler to 2\r
-#else // ATmegaXX:\r
- OCR1A = (F_CPU / (2 * F_INTERRUPTS)) - 1; // compare value: 1/28800 of CPU frequency\r
- TCCR1B = (1 << WGM12) | (1 << CS10); // switch CTC Mode on, set prescaler to 1\r
+#if defined (__AVR_ATtiny85__) // ATtiny85:\r
+ OCR1A = (F_CPU / F_INTERRUPTS / 4) - 1; // compare value: 1/15000 of CPU frequency, presc = 4\r
+ TCCR1 = (1 << CTC1) | (1 << CS11) | (1 << CS10); // switch CTC Mode on, set prescaler to 4\r
+#else // ATmegaXX:\r
+ OCR1A = (F_CPU / F_INTERRUPTS) - 1; // compare value: 1/15000 of CPU frequency\r
+ TCCR1B = (1 << WGM12) | (1 << CS10); // switch CTC Mode on, set prescaler to 1\r
#endif\r
\r
#ifdef TIMSK1\r
- TIMSK1 = 1 << OCIE1A; // OCIE1A: Interrupt by timer compare\r
+ TIMSK1 = 1 << OCIE1A; // OCIE1A: Interrupt by timer compare\r
#else\r
- TIMSK = 1 << OCIE1A; // OCIE1A: Interrupt by timer compare\r
+ TIMSK = 1 << OCIE1A; // OCIE1A: Interrupt by timer compare\r
#endif\r
}\r
\r
+/*---------------------------------------------------------------------------------------------------------------------------------------------------\r
+ * Timer 1 output compare A interrupt service routine, called every 1/15000 sec\r
+ *---------------------------------------------------------------------------------------------------------------------------------------------------\r
+ */\r
+#ifdef TIM1_COMPA_vect // ATtiny84\r
+ISR(TIM1_COMPA_vect)\r
+#else\r
+ISR(TIMER1_COMPA_vect)\r
+#endif\r
+{\r
+ (void) irmp_ISR(); // call irmp ISR\r
+ // call other timer interrupt routines...\r
+}\r
+\r
+\r
int\r
main (void)\r
{\r