IRMP - Infrared Multi Protocol Decoder\r
--------------------------------------\r
\r
-Version IRMP: 2.0.0-pre5 25.07.2011\r
-Version IRSND: 1.9.4 22.05.2011\r
+Version IRMP: 2.0.0-pre6 06.09.2011\r
+Version IRSND: 2.0.0-pre6 06.09.2011\r
\r
Dokumentation:\r
\r
-<AVRStudio><MANAGEMENT><ProjectName>irmp</ProjectName><Created>07-Jan-2010 20:23:49</Created><LastEdit>29-Jun-2010 11:22:31</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
+<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
\r
#else\r
\r
-#ifndef CODEVISION\r
-\r
#ifdef PIC_CCS_COMPILER\r
\r
#include <string.h>\r
#include <avr/pgmspace.h>\r
\r
#endif // PIC_CCS_COMPILER\r
-#endif // CODEVISION\r
\r
#endif // windows\r
#endif // unix\r
#define ANALYZE_NEWLINE()\r
#endif\r
\r
+/*---------------------------------------------------------------------------------------------------------------------------------------------------\r
+ * Protocol names\r
+ *---------------------------------------------------------------------------------------------------------------------------------------------------\r
+ */\r
+#if IRMP_PROTOCOL_NAMES == 1\r
+char *\r
+irmp_protocol_names[IRMP_N_PROTOCOLS + 1] =\r
+{\r
+ "UNKNOWN",\r
+ "SIRCS",\r
+ "NEC",\r
+ "SAMSUNG",\r
+ "MATSUSH",\r
+ "KASEIKYO",\r
+ "RECS80",\r
+ "RC5",\r
+ "DENON",\r
+ "RC6",\r
+ "SAMSG32",\r
+ "APPLE",\r
+ "RECS80EX",\r
+ "NUBERT",\r
+ "BANG OLU",\r
+ "GRUNDIG",\r
+ "NOKIA",\r
+ "SIEMENS",\r
+ "FDC",\r
+ "RCCAR",\r
+ "JVC",\r
+ "RC6A",\r
+ "NIKON",\r
+ "RUWIDO",\r
+ "IR60",\r
+ "KATHREIN",\r
+ "NETBOX",\r
+ "NEC16",\r
+ "NEC42",\r
+ "LEGO",\r
+ "THOMSON",\r
+ "MERLIN"\r
+};\r
+#endif\r
+\r
+/*---------------------------------------------------------------------------------------------------------------------------------------------------\r
+ * Logging\r
+ *---------------------------------------------------------------------------------------------------------------------------------------------------\r
+ */\r
#if IRMP_LOGGING == 1\r
#define BAUD 9600L\r
#include <util/setbaud.h>\r
static volatile uint16_t irmp_command;\r
static volatile uint16_t irmp_id; // only used for SAMSUNG protocol\r
static volatile uint8_t irmp_flags;\r
+// static volatile uint8_t irmp_busy_flag;\r
\r
#ifdef ANALYZE\r
static uint8_t IRMP_PIN;\r
return rtc;\r
}\r
\r
+// uint8_t\r
+// irmp_is_busy (void)\r
+// {\r
+// return irmp_busy_flag;\r
+// }\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
{ // no...\r
if (! irmp_input) // receiving burst?\r
{ // yes...\r
+// irmp_busy_flag = TRUE;\r
#ifdef ANALYZE\r
if (! irmp_pulse_time)\r
{\r
ANALYZE_PRINTF ("%8d error 1: pause after start bit pulse %d too long: %d\n", time_counter, irmp_pulse_time, irmp_pause_time);\r
ANALYZE_ONLY_NORMAL_PUTCHAR ('\n');\r
}\r
+// irmp_busy_flag = FALSE;\r
irmp_start_bit_detected = 0; // reset flags, let's wait for another start bit\r
irmp_pulse_time = 0;\r
irmp_pause_time = 0;\r
\r
{\r
ANALYZE_PRINTF ("protocol = UNKNOWN\n");\r
+// irmp_busy_flag = FALSE;\r
irmp_start_bit_detected = 0; // wait for another start bit...\r
}\r
\r
{\r
ANALYZE_PRINTF ("error: stop bit timing wrong\n");\r
\r
+// irmp_busy_flag = FALSE;\r
irmp_start_bit_detected = 0; // wait for another start bit...\r
irmp_pulse_time = 0;\r
irmp_pause_time = 0;\r
ANALYZE_PRINTF ("error 2: pause %d after data bit %d too long\n", irmp_pause_time, irmp_bit);\r
ANALYZE_ONLY_NORMAL_PUTCHAR ('\n');\r
\r
+// irmp_busy_flag = FALSE;\r
irmp_start_bit_detected = 0; // wait for another start bit...\r
irmp_pulse_time = 0;\r
irmp_pause_time = 0;\r
ANALYZE_NEWLINE ();\r
ANALYZE_PRINTF ("error 3 manchester: timing not correct: data bit %d, pulse: %d, pause: %d\n", irmp_bit, irmp_pulse_time, irmp_pause_time);\r
ANALYZE_ONLY_NORMAL_PUTCHAR ('\n');\r
+// irmp_busy_flag = FALSE;\r
irmp_start_bit_detected = 0; // reset flags and wait for next start bit\r
irmp_pause_time = 0;\r
}\r
{ // timing incorrect!\r
ANALYZE_PRINTF ("error 3 Samsung: timing not correct: data bit %d, pulse: %d, pause: %d\n", irmp_bit, irmp_pulse_time, irmp_pause_time);\r
ANALYZE_ONLY_NORMAL_PUTCHAR ('\n');\r
+// irmp_busy_flag = FALSE;\r
irmp_start_bit_detected = 0; // reset flags and wait for next start bit\r
irmp_pause_time = 0;\r
}\r
{ // timing incorrect!\r
ANALYZE_PRINTF ("error 3a B&O: timing not correct: data bit %d, pulse: %d, pause: %d\n", irmp_bit, irmp_pulse_time, irmp_pause_time);\r
ANALYZE_ONLY_NORMAL_PUTCHAR ('\n');\r
+// irmp_busy_flag = FALSE;\r
irmp_start_bit_detected = 0; // reset flags and wait for next start bit\r
irmp_pause_time = 0;\r
}\r
{ // timing incorrect!\r
ANALYZE_PRINTF ("error 3b B&O: timing not correct: data bit %d, pulse: %d, pause: %d\n", irmp_bit, irmp_pulse_time, irmp_pause_time);\r
ANALYZE_ONLY_NORMAL_PUTCHAR ('\n');\r
+// irmp_busy_flag = FALSE;\r
irmp_start_bit_detected = 0; // reset flags and wait for next start bit\r
irmp_pause_time = 0;\r
}\r
{ // timing incorrect!\r
ANALYZE_PRINTF ("error 3c B&O: timing not correct: data bit %d, pulse: %d, pause: %d\n", irmp_bit, irmp_pulse_time, irmp_pause_time);\r
ANALYZE_ONLY_NORMAL_PUTCHAR ('\n');\r
+// irmp_busy_flag = FALSE;\r
irmp_start_bit_detected = 0; // reset flags and wait for next start bit\r
irmp_pause_time = 0;\r
}\r
{ // timing incorrect!\r
ANALYZE_PRINTF ("error 3d B&O: timing not correct: data bit %d, pulse: %d, pause: %d\n", irmp_bit, irmp_pulse_time, irmp_pause_time);\r
ANALYZE_ONLY_NORMAL_PUTCHAR ('\n');\r
+// irmp_busy_flag = FALSE;\r
irmp_start_bit_detected = 0; // reset flags and wait for next start bit\r
irmp_pause_time = 0;\r
}\r
{ // timing incorrect!\r
ANALYZE_PRINTF ("error 3: timing not correct: data bit %d, pulse: %d, pause: %d\n", irmp_bit, irmp_pulse_time, irmp_pause_time);\r
ANALYZE_ONLY_NORMAL_PUTCHAR ('\n');\r
+// irmp_busy_flag = FALSE;\r
irmp_start_bit_detected = 0; // reset flags and wait for next start bit\r
irmp_pause_time = 0;\r
}\r
ANALYZE_ONLY_NORMAL_PUTCHAR ('\n');\r
}\r
\r
+// irmp_busy_flag = FALSE;\r
irmp_start_bit_detected = 0; // and wait for next start bit\r
irmp_tmp_command = 0;\r
irmp_pulse_time = 0;\r
#ifndef _WC_IRMP_H_\r
#define _WC_IRMP_H_\r
\r
-#ifdef __cplusplus\r
-extern "C"\r
-{\r
-#endif\r
-\r
/*---------------------------------------------------------------------------------------------------------------------------------------------------\r
* timing constants:\r
*---------------------------------------------------------------------------------------------------------------------------------------------------\r
#define IRMP_LEGO_PROTOCOL 29 // LEGO Power Functions RC\r
#define IRMP_THOMSON_PROTOCOL 30 // Thomson\r
#define IRMP_MERLIN_PROTOCOL 31 // Pollin Merlin keyboard (bitserial)\r
+\r
+#define IRMP_N_PROTOCOLS 31 // number of supported protocols\r
+\r
#define IRMP_IMON_PROTOCOL 99 // Imon (bitserial) PROTOTYPE!\r
\r
// some flags of struct IRMP_PARAMETER:\r
uint8_t flags; // flags, e.g. repetition\r
} IRMP_DATA;\r
\r
+extern void irmp_init (void);\r
+extern uint8_t irmp_get_data (IRMP_DATA *);\r
+extern uint8_t irmp_is_busy (void);\r
+extern uint8_t irmp_ISR (void);\r
\r
-/**\r
- * Initialize IRMP decoder\r
- * @details Configures IRMP input pin\r
- */\r
-extern void irmp_init (void);\r
-\r
-/**\r
- * Get IRMP data\r
- * @details gets decoded IRMP data\r
- * @param pointer in order to store IRMP data\r
- * @return TRUE: successful, FALSE: failed\r
- */\r
-extern uint8_t irmp_get_data (IRMP_DATA *);\r
-\r
-/**\r
- * ISR routine\r
- * @details ISR routine, called 10000 times per second\r
- */\r
-extern uint8_t irmp_ISR (void);\r
-\r
-#ifdef __cplusplus\r
-}\r
+#if IRMP_PROTOCOL_NAMES == 1\r
+extern char * irmp_protocol_names[IRMP_N_PROTOCOLS + 1];\r
#endif\r
\r
#endif /* _WC_IRMP_H_ */\r
#define IRMP_LOGGING 0 // 1: log IR signal (scan), 0: do not (default)\r
#endif\r
\r
+/*---------------------------------------------------------------------------------------------------------------------------------------------------\r
+ * Set IRMP_PROTOCOL_NAMES to 1 if want to access protocol names (for logging etc), costs ~300 bytes RAM!\r
+ *---------------------------------------------------------------------------------------------------------------------------------------------------\r
+ */\r
+#define IRMP_PROTOCOL_NAMES 0 // 1: access protocol names, 0: do not (default),\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>01-Jul-2010 12:58:34</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
+<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
#include "irsnd.h"\r
\r
/*---------------------------------------------------------------------------------------------------------------------------------------------------\r
- * ATmega pin definition of OC2 / OC2A / OC2B\r
+ * ATtiny pin definition of OC0A / OC0B\r
+ * ATmega pin definition of OC2 / OC2A / OC2B / OC0 / OC0A / OC0B\r
*---------------------------------------------------------------------------------------------------------------------------------------------------\r
*/\r
-#if defined (__AVR_ATmega8__) // ATmega8 uses OC2 = PB3\r
-#undef IRSND_OC2 // has no OC2A / OC2B\r
-#define IRSND_OC2 0 // magic: use OC2\r
+/*---------------------------------------------------------------------------------------------------------------------------------------------------\r
+ * ATtiny pin definition of OC0A / OC0B\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 IRSND_OCx == IRSND_OC0A // OC0A\r
#define IRSND_PORT PORTB // port B\r
#define IRSND_DDR DDRB // ddr B\r
-#define IRSND_BIT 3 // OC2A\r
+#define IRSND_BIT 0 // OC0A\r
+#elif IRSND_OCx == IRSND_OC0B // OC0B\r
+#define IRSND_PORT PORTB // port B\r
+#define IRSND_DDR DDRB // ddr B\r
+#define IRSND_BIT 1 // 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_ATmega8__) // ATmega8 uses only OC2 = PB3\r
+#if IRSND_OCx == IRSND_OC2 // OC0A\r
+#define IRSND_PORT PORTB // port B\r
+#define IRSND_DDR DDRB // ddr B\r
+#define IRSND_BIT 3 // OC0A\r
+#else\r
+#error Wrong value for IRSND_OCx, choose IRSND_OC2 in irsndconfig.h\r
+#endif // IRSND_OCx\r
+\r
\r
#elif defined (__AVR_ATmega16__) \\r
|| defined (__AVR_ATmega32__) // ATmega16|32 uses OC2 = PD7\r
-#undef IRSND_OC2 // has no OC2A / OC2B\r
-#define IRSND_OC2 0 // magic: use OC2\r
+#if IRSND_OCx == IRSND_OC2 // OC2\r
#define IRSND_PORT PORTD // port D\r
#define IRSND_DDR DDRD // ddr D\r
#define IRSND_BIT 7 // OC2\r
+#else\r
+#error Wrong value for IRSND_OCx, choose IRSND_OC2 in irsndconfig.h\r
+#endif // IRSND_OCx\r
\r
-#elif defined (__AVR_ATmega162__) // ATmega162 uses OC2 = PB1\r
-#undef IRSND_OC2 // has no OC2A / OC2B\r
-#define IRSND_OC2 0 // magic: use OC2\r
+#elif defined (__AVR_ATmega162__) // ATmega162 uses OC2 = PB1 or OC0 = PB0\r
+#if IRSND_OCx == IRSND_OC2 // OC2\r
#define IRSND_PORT PORTB // port B\r
#define IRSND_DDR DDRB // ddr B\r
#define IRSND_BIT 1 // OC2\r
+#elif IRSND_OCx == IRSND_OC0 // OC0\r
+#define IRSND_PORT PORTB // port B\r
+#define IRSND_DDR DDRB // ddr B\r
+#define IRSND_BIT 0 // OC0\r
+#else\r
+#error Wrong value for IRSND_OCx, choose IRSND_OC2 or IRSND_OC0 in irsndconfig.h\r
+#endif // IRSND_OCx\r
\r
#elif defined (__AVR_ATmega164__) \\r
|| defined (__AVR_ATmega324__) \\r
|| defined (__AVR_ATmega644__) \\r
|| defined (__AVR_ATmega644P__) \\r
- || defined (__AVR_ATmega1284__) // ATmega164|324|644|644P|1284 uses OC2A = PD7 or OC2B = PD6\r
-#if IRSND_OC2 == 1 // OC2A\r
+ || defined (__AVR_ATmega1284__) // ATmega164|324|644|644P|1284 uses OC2A = PD7 or OC2B = PD6 or OC0A = PB3 or OC0B = PB4\r
+#if IRSND_OCx == IRSND_OC2A // OC2A\r
#define IRSND_PORT PORTD // port D\r
#define IRSND_DDR DDRD // ddr D\r
#define IRSND_BIT 7 // OC2A\r
-#elif IRSND_OC2 == 2 // OC2B\r
+#elif IRSND_OCx == IRSND_OC2B // OC2B\r
#define IRSND_PORT PORTD // port D\r
#define IRSND_DDR DDRD // ddr D\r
#define IRSND_BIT 6 // OC2B\r
+#elif IRSND_OCx == IRSND_OC0A // OC0A\r
+#define IRSND_PORT PORTB // port B\r
+#define IRSND_DDR DDRB // ddr B\r
+#define IRSND_BIT 3 // OC0A\r
+#elif IRSND_OCx == IRSND_OC0B // OC0B\r
+#define IRSND_PORT PORTB // port B\r
+#define IRSND_DDR DDRB // ddr B\r
+#define IRSND_BIT 4 // OC0B\r
#else\r
-#error Wrong value for IRSND_OC2, choose 1 or 2 in irsndconfig.h\r
-#endif // IRSND_OC2\r
+#error Wrong value for IRSND_OCx, choose IRSND_OC2A, IRSND_OC2B, IRSND_OC0A, or IRSND_OC0B in irsndconfig.h\r
+#endif // IRSND_OCx\r
\r
#elif defined (__AVR_ATmega48__) \\r
|| defined (__AVR_ATmega88__) \\r
|| defined (__AVR_ATmega168__) \\r
- || defined (__AVR_ATmega168__) \\r
+ || defined (__AVR_ATmega168P__) \\r
|| defined (__AVR_ATmega328__) \\r
- || defined (__AVR_ATmega328P__) // ATmega48|88|168|328P uses OC2A = PB3 or OC2B = PD3\r
-#if IRSND_OC2 == 1 // OC2A\r
+ || defined (__AVR_ATmega328P__) // ATmega48|88|168|168P|328P 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
#define IRSND_BIT 3 // OC2A\r
-#elif IRSND_OC2 == 2 // OC2B\r
+#elif IRSND_OCx == IRSND_OC2B // OC2B\r
#define IRSND_PORT PORTD // port D\r
#define IRSND_DDR DDRD // ddr D\r
#define IRSND_BIT 3 // OC2B\r
+#elif IRSND_OCx == IRSND_OC0A // OC0A\r
+#define IRSND_PORT PORTB // port B\r
+#define IRSND_DDR DDRB // ddr B\r
+#define IRSND_BIT 6 // OC0A\r
+#elif IRSND_OCx == IRSND_OC0B // OC0B\r
+#define IRSND_PORT PORTD // port D\r
+#define IRSND_DDR DDRD // ddr D\r
+#define IRSND_BIT 5 // OC0B\r
#else\r
-#error Wrong value for IRSND_OC2, choose 1 or 2 in irsndconfig.h\r
-#endif // IRSND_OC2\r
+#error Wrong value for IRSND_OCx, choose IRSND_OC2A, IRSND_OC2B, IRSND_OC0A, or IRSND_OC0B in irsndconfig.h\r
+#endif // IRSND_OCx\r
\r
#else\r
#if !defined (unix) && !defined (WIN32)\r
-#error OC2A/OC2B not defined, please fill in definitions here.\r
+#error mikrocontroller not defined, please fill in definitions here.\r
#endif // unix, WIN32\r
#endif // __AVR...\r
\r
if (! irsnd_is_on)\r
{\r
#ifndef DEBUG\r
-#if IRSND_OC2 == 0 // use OC2\r
- TCCR2 |= (1<<COM20)|(1<<WGM21); // toggle OC2 on compare match, clear Timer 2 at compare match OCR2\r
-#elif IRSND_OC2 == 1 // use OC2A\r
+#if IRSND_OCx == IRSND_OC2 // use OC2\r
+ TCCR2 |= (1<<COM20)|(1<<WGM21); // toggle OC2 on compare match, clear Timer 2 at compare match OCR2\r
+#elif IRSND_OCx == IRSND_OC2A // use OC2A\r
TCCR2A |= (1<<COM2A0)|(1<<WGM21); // toggle OC2A on compare match, clear Timer 2 at compare match OCR2A\r
-#else // use OC2B\r
+#elif IRSND_OCx == IRSND_OC2B // use OC2B\r
TCCR2A |= (1<<COM2B0)|(1<<WGM21); // toggle OC2B on compare match, clear Timer 2 at compare match OCR2A (yes: A, not B!)\r
-#endif // IRSND_OC2\r
+#elif IRSND_OCx == IRSND_OC0 // use OC0\r
+ TCCR0 |= (1<<COM00)|(1<<WGM01); // toggle OC0 on compare match, clear Timer 0 at compare match OCR0\r
+#elif IRSND_OCx == IRSND_OC0A // use OC0A\r
+ TCCR0A |= (1<<COM0A0)|(1<<WGM01); // toggle OC0A on compare match, clear Timer 0 at compare match OCR0A\r
+#elif IRSND_OCx == IRSND_OC0B // use OC0B\r
+ TCCR0A |= (1<<COM0B0)|(1<<WGM01); // toggle OC0B on compare match, clear Timer 0 at compare match OCR0A (yes: A, not B!)\r
+#else\r
+#error wrong value of IRSND_OCx\r
+#endif // IRSND_OCx\r
#endif // DEBUG\r
\r
#if IRSND_USE_CALLBACK == 1\r
if (irsnd_is_on)\r
{\r
#ifndef DEBUG\r
-#if IRSND_OC2 == 0 // use OC2\r
+#if IRSND_OCx == IRSND_OC2 // use OC2\r
TCCR2 &= ~(1<<COM20); // normal port operation, OC2 disconnected.\r
-#elif IRSND_OC2 == 1 // use OC2A\r
+#elif IRSND_OCx == IRSND_OC2A // use OC2A\r
TCCR2A &= ~(1<<COM2A0); // normal port operation, OC2A disconnected.\r
-#else // use OC2B\r
+#elif IRSND_OCx == IRSND_OC2B // use OC2B\r
TCCR2A &= ~(1<<COM2B0); // normal port operation, OC2B disconnected.\r
-#endif // IRSND_OC2\r
+#elif IRSND_OCx == IRSND_OC0 // use OC0\r
+ TCCR0 &= ~(1<<COM00); // normal port operation, OC0 disconnected.\r
+#elif IRSND_OCx == IRSND_OC0A // use OC0A\r
+ TCCR0A &= ~(1<<COM0A0); // normal port operation, OC0A disconnected.\r
+#elif IRSND_OCx == IRSND_OC0B // use OC0B\r
+ TCCR0A &= ~(1<<COM0B0); // normal port operation, OC0B disconnected.\r
+#else\r
+#error wrong value of IRSND_OCx\r
+#endif // IRSND_OCx\r
IRSND_PORT &= ~(1<<IRSND_BIT); // set IRSND_BIT to low\r
#endif // DEBUG\r
\r
irsnd_set_freq (uint8_t freq)\r
{\r
#ifndef DEBUG\r
-#if IRSND_OC2 == 0\r
+#if IRSND_OCx == IRSND_OC2\r
OCR2 = freq; // use register OCR2 for OC2\r
-#else\r
+#elif IRSND_OCx == IRSND_OC2A // use OC2A\r
+ OCR2A = freq; // use register OCR2A for OC2A and OC2B!\r
+#elif IRSND_OCx == IRSND_OC2B // use OC2B\r
OCR2A = freq; // use register OCR2A for OC2A and OC2B!\r
+#elif IRSND_OCx == IRSND_OC0 // use OC0\r
+ OCR0 = freq; // use register OCR2 for OC2\r
+#elif IRSND_OCx == IRSND_OC0A // use OC0A\r
+ OCR0A = freq; // use register OCR0A for OC0A and OC0B!\r
+#elif IRSND_OCx == IRSND_OC0B // use OC0B\r
+ OCR0A = freq; // use register OCR0A for OC0A and OC0B!\r
+#else\r
+#error wrong value of IRSND_OCx\r
#endif\r
#endif // DEBUG\r
}\r
IRSND_PORT &= ~(1<<IRSND_BIT); // set IRSND_BIT to low\r
IRSND_DDR |= (1<<IRSND_BIT); // set IRSND_BIT to output\r
\r
-#if defined (__AVR_ATmega32__)\r
+#if IRSND_OCx == IRSND_OC2 // use OC2\r
TCCR2 = (1<<WGM21); // CTC mode\r
TCCR2 |= (1<<CS20); // 0x01, start Timer 2, no prescaling\r
-#else\r
+#elif IRSND_OCx == IRSND_OC2A || IRSND_OCx == IRSND_OC2B // use OC2A or OC2B\r
TCCR2A = (1<<WGM21); // CTC mode\r
TCCR2B |= (1<<CS20); // 0x01, start Timer 2, no prescaling\r
-#endif // __AVR... \r
+#elif IRSND_OCx == IRSND_OC0 // use OC0\r
+ TCCR0 = (1<<WGM01); // CTC mode\r
+ TCCR0 |= (1<<CS00); // 0x01, start Timer 0, no prescaling\r
+#elif IRSND_OCx == IRSND_OC0A || IRSND_OCx == IRSND_OC0B // use OC0A or OC0B\r
+ TCCR0A = (1<<WGM01); // CTC mode\r
+ TCCR0B |= (1<<CS00); // 0x01, start Timer 0, no prescaling\r
+#else\r
+#error wrong value of IRSND_OCx\r
+#endif\r
\r
irsnd_set_freq (IRSND_FREQ_36_KHZ); // default frequency\r
#endif // DEBUG\r
\r
\r
/*---------------------------------------------------------------------------------------------------------------------------------------------------\r
- * Change hardware pin here:\r
+ * DO NOT CHANGE:\r
*---------------------------------------------------------------------------------------------------------------------------------------------------\r
*/\r
-#define IRSND_OC2 1 // 0 = OC2, 1 = OC2A, 2 = OC2B, default is 1\r
+#define IRSND_OC2 0 // OC2\r
+#define IRSND_OC2A 1 // OC2A\r
+#define IRSND_OC2B 2 // OC2B\r
+#define IRSND_OC0 3 // OC0\r
+#define IRSND_OC0A 4 // OC0A\r
+#define IRSND_OC0B 5 // OC0B\r
+\r
+/*---------------------------------------------------------------------------------------------------------------------------------------------------\r
+ * Change hardware pin here: IRSND_OC2 = OC2 on ATmegas supporting OC2, e.g. ATmega8\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
+ *---------------------------------------------------------------------------------------------------------------------------------------------------\r
+ */\r
+#define IRSND_OCx IRSND_OC2B // use OC2B\r
\r
/*---------------------------------------------------------------------------------------------------------------------------------------------------\r
* Use Callbacks to indicate output signal or something else\r
*---------------------------------------------------------------------------------------------------------------------------------------------------\r
*/\r
\r
-/*---------------------------------------------------------------------------------------------------------------------------------------------------\r
- * uncomment this for codevision compiler:\r
- *---------------------------------------------------------------------------------------------------------------------------------------------------\r
- */\r
-// #define CODEVISION // to use Codevision Compiler instead of gcc\r
-\r
-#ifdef CODEVISION\r
-#include <mega88.h>\r
-#include <stdio.h>\r
-#define uint8_t unsigned char\r
-#define uint16_t unsigned int\r
-#define F_CPU 8000000 // change for Codevision here, if you use WinAVR, use Project -> Configuration Options instead\r
-\r
-// register values from datasheet for ATMega88\r
-#define OCIE1A 1\r
-#define WGM12 3\r
-#define CS10 0\r
-#define UDRE0 5\r
-#define TXEN0 3\r
-\r
-#include "irmp.h"\r
-#include "isnd.h"\r
-#include "irmp.c"\r
-#include "isnd.c"\r
-\r
-#else // gcc compiler\r
-\r
#include <inttypes.h>\r
#include <avr/io.h>\r
#include <util/delay.h>\r
#include "irsndconfig.h"\r
#include "irsnd.h"\r
\r
-#endif // CODEVISION\r
-\r
#ifndef F_CPU\r
#error F_CPU unkown\r
#endif\r
\r
void\r
-timer_init (void)\r
+timer1_init (void)\r
{\r
-#ifdef CODEVISION\r
- OCR1AH = ((F_CPU / F_INTERRUPTS) >> 8) & 0xFF; // compare value: 1/10000 of CPU frequency (upper byte)\r
- OCR1AL = ((F_CPU / F_INTERRUPTS) - 1) & 0xFF; // compare value: 1/10000 of CPU frequency (lower byte)\r
-#else // gcc\r
- OCR1A = (F_CPU / F_INTERRUPTS) - 1; // compare value: 1/10000 of CPU frequency\r
-#endif // CODEVISION\r
- TCCR1B = (1 << WGM12) | (1 << CS10); // switch CTC Mode on, set prescaler to 1\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
+#endif\r
\r
-#if defined (__AVR_ATmega8__) || defined (__AVR_ATmega16__) || defined (__AVR_ATmega32__) || defined (__AVR_ATmega64__) || defined (__AVR_ATmega162__)\r
- TIMSK = 1 << OCIE1A; // OCIE1A: Interrupt by timer compare (use TIMSK for ATMEGA162)\r
+#ifdef TIMSK1\r
+ TIMSK1 = 1 << OCIE1A; // OCIE1A: Interrupt by timer compare\r
#else\r
- TIMSK1 = 1 << OCIE1A; // OCIE1A: Interrupt by timer compare (use TIMSK for ATMEGA162)\r
-#endif // __AVR...\r
+ TIMSK = 1 << OCIE1A; // OCIE1A: Interrupt by timer compare\r
+#endif\r
}\r
\r
/*---------------------------------------------------------------------------------------------------------------------------------------------------\r
* timer 1 compare handler, called every 1/10000 sec\r
*---------------------------------------------------------------------------------------------------------------------------------------------------\r
*/\r
-// Timer 1 output compare A interrupt service routine\r
-#ifdef CODEVISION\r
-interrupt [TIM1_COMPA] void timer1_compa_isr(void)\r
-#else // CODEVISION\r
ISR(TIMER1_COMPA_vect)\r
-#endif // CODEVISION\r
{\r
(void) irsnd_ISR(); // call irsnd ISR\r
- // call other timer interrupt routines...\r
+ // call other timer interrupt routines here...\r
}\r
\r
/*---------------------------------------------------------------------------------------------------------------------------------------------------\r
* MAIN: main routine\r
*---------------------------------------------------------------------------------------------------------------------------------------------------\r
*/\r
-#ifdef CODEVISION\r
-// This is the main routine if you use Codevision C Compiler\r
-void\r
-main (void)\r
-{\r
- IRMP_DATA irmp_data;\r
-\r
- #pragma optsize-\r
- // crystal oscillator division factor: 1\r
- CLKPR=0x80;\r
- CLKPR=0x00;\r
- #ifdef _OPTIMIZE_SIZE_\r
- #pragma optsize+\r
- #endif\r
-\r
- irsnd_init(); // initialize irsnd\r
- timer_init(); // initialize timer\r
- #asm("sei"); // enable interrupts\r
-\r
- for (;;)\r
- {\r
- irmp_data.protocol = IRMP_NEC_PROTOCOL;\r
- irmp_data.address = 0x00FF;\r
- irmp_data.command = 0x0001;\r
- irmp_data.flags = 0;\r
-\r
- irsnd_send_data (&irmp_data);\r
- _delay_ms (1000);\r
- }\r
-}\r
-\r
-#else // gcc\r
-\r
-// This is the main routine if you use GCC Compiler\r
int\r
main (void)\r
{\r
- IRMP_DATA irmp_data;\r
-\r
- irsnd_init(); // initialize irsnd\r
- timer_init(); // initialize timer\r
- sei (); // enable interrupts\r
-\r
- for (;;)\r
- {\r
- irmp_data.protocol = IRMP_NEC_PROTOCOL;\r
- irmp_data.address = 0x00FF;\r
- irmp_data.command = 0x0001;\r
- irmp_data.flags = 0;\r
-\r
- irsnd_send_data (&irmp_data, TRUE);\r
- _delay_ms (1000);\r
- }\r
+ IRMP_DATA irmp_data;\r
+\r
+ irsnd_init(); // initialize irsnd\r
+ timer1_init(); // initialize timer\r
+ sei (); // enable interrupts\r
+\r
+ for (;;)\r
+ {\r
+ irmp_data.protocol = IRMP_NEC_PROTOCOL;\r
+ irmp_data.address = 0x00FF;\r
+ irmp_data.command = 0x0001;\r
+ irmp_data.flags = 0;\r
+\r
+ irsnd_send_data (&irmp_data, TRUE);\r
+ _delay_ms (1000);\r
+ }\r
}\r
-\r
-#endif // CODEVISION / gcc\r
*---------------------------------------------------------------------------------------------------------------------------------------------------\r
*/\r
\r
-/*---------------------------------------------------------------------------------------------------------------------------------------------------\r
- * uncomment this for codevision compiler:\r
- *---------------------------------------------------------------------------------------------------------------------------------------------------\r
- */\r
-// #define CODEVISION // to use Codevision Compiler instead of gcc\r
- \r
-#ifdef CODEVISION \r
-#include <mega88.h>\r
-#include <stdio.h>\r
-#define uint8_t unsigned char\r
-#define uint16_t unsigned int\r
-#define F_CPU 8000000 // change for Codevision here, if you use WinAVR, use Project -> Configuration Options instead\r
-\r
-// register values from datasheet for ATMega88\r
-#define OCIE1A 1\r
-#define WGM12 3\r
-#define CS10 0\r
-#define UDRE0 5\r
-#define TXEN0 3\r
-\r
-#include "irmp.h"\r
-#include "irmp.c"\r
-\r
-#else // gcc compiler\r
-\r
#include <inttypes.h>\r
#include <avr/io.h>\r
#include <util/delay.h>\r
#include <avr/pgmspace.h>\r
#include <avr/interrupt.h>\r
-#include "irmp.h"\r
-#include "irmpconfig.h"\r
-\r
-\r
-#endif // CODEVISION\r
\r
+#include "irmpconfig.h"\r
+#include "irmp.h"\r
\r
#ifndef F_CPU\r
#error F_CPU unkown\r
#endif\r
\r
void\r
-timer_init (void)\r
+timer1_init (void)\r
{\r
-#ifdef CODEVISION\r
- OCR1AH = ((F_CPU / F_INTERRUPTS) >> 8) & 0xFF; // compare value: 1/10000 of CPU frequency (upper byte)\r
- OCR1AL = ((F_CPU / F_INTERRUPTS) - 1) & 0xFF; // compare value: 1/10000 of CPU frequency (lower byte)\r
-#else // gcc\r
- OCR1A = (F_CPU / F_INTERRUPTS) - 1; // compare value: 1/10000 of CPU frequency\r
-#endif // CODEVISION\r
- TCCR1B = (1 << WGM12) | (1 << CS10); // switch CTC Mode on, set prescaler to 1\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
+#endif\r
\r
-#if defined (__AVR_ATmega8__) || defined (__AVR_ATmega16__) || defined (__AVR_ATmega32__) || defined (__AVR_ATmega64__) || defined (__AVR_ATmega162__) \r
- TIMSK = 1 << OCIE1A; // OCIE1A: Interrupt by timer compare\r
+#ifdef TIMSK1\r
+ TIMSK1 = 1 << OCIE1A; // OCIE1A: Interrupt by timer compare\r
#else\r
- TIMSK1 = 1 << OCIE1A; // OCIE1A: Interrupt by timer compare\r
-#endif // __AVR...\r
-}\r
-\r
-/*---------------------------------------------------------------------------------------------------------------------------------------------------\r
- * timer 1 compare handler, called every 1/10000 sec\r
- *---------------------------------------------------------------------------------------------------------------------------------------------------\r
- */\r
-// Timer 1 output compare A interrupt service routine\r
-#ifdef CODEVISION\r
-interrupt [TIM1_COMPA] void timer1_compa_isr(void)\r
-#else // CODEVISION\r
-ISR(TIMER1_COMPA_vect)\r
-#endif // CODEVISION\r
-{\r
- (void) irmp_ISR(); // call irmp ISR\r
- // call other timer interrupt routines...\r
-}\r
-\r
-/*---------------------------------------------------------------------------------------------------------------------------------------------------\r
- * MAIN: main routine\r
- *---------------------------------------------------------------------------------------------------------------------------------------------------\r
- */\r
-#ifdef CODEVISION\r
-// This is the main routine if you use Codevision C Compiler\r
-void\r
-main (void)\r
-{\r
- IRMP_DATA irmp_data;\r
-\r
- #pragma optsize-\r
- // crystal oscillator division factor: 1\r
- CLKPR=0x80;\r
- CLKPR=0x00;\r
- #ifdef _OPTIMIZE_SIZE_\r
- #pragma optsize+\r
- #endif\r
- static uint8_t *Proto[]={"SIRCS","NEC","SAMSUNG","MATSUSH","KASEIKYO","RECS80","RC5(x)","DENON","RC6","SAMSG32","APPLE","RECS80X","NUBERT","B&O","GRUNDIG","NOKIA","SIEMENS","FDC","RCCAR","JVC","RC6A"};\r
-\r
- #if IRMP_LOGGING == 0\r
- // USART initialization has to be done here if Logging is off\r
- // Communication Parameters: 8 Data, 1 Stop, No Parity\r
- // USART Receiver: Off\r
- // USART Transmitter: On\r
- // USART0 Mode: Asynchronous\r
- // USART Baud Rate: 9600\r
- #define BAUDRATE 9600L\r
- UCSR0A=0x00;\r
- UCSR0B=0x08;\r
- UCSR0C=0x06;\r
- UBRR0H = ((F_CPU+BAUDRATE*8)/(BAUDRATE*16)-1) >> 8; // store baudrate (upper byte)\r
- UBRR0L = ((F_CPU+BAUDRATE*8)/(BAUDRATE*16)-1) & 0xFF; \r
- #endif\r
-\r
- irmp_init(); // initialize rc5\r
-\r
- printf("IRMP V1.0\n");\r
- #if IRMP_LOGGING == 1\r
- printf("Logging Mode\n");\r
- #endif\r
-\r
- timer_init(); // initialize timer\r
- #asm("sei"); // enable interrupts\r
-\r
- for (;;)\r
- {\r
- if (irmp_get_data (&irmp_data))\r
- {\r
- // ir signal decoded, do something here...\r
- // irmp_data.protocol is the protocol, see irmp.h\r
- // irmp_data.address is the address/manufacturer code of ir sender\r
- // irmp_data.command is the command code\r
- #if IRMP_LOGGING != 1\r
- printf("Code: %s\n",Proto[irmp_data.protocol-1]);\r
- printf("Address: 0x%.2X\n",irmp_data.address);\r
- printf("Command: 0x%.2X\n\n",irmp_data.command);\r
- #endif\r
- }\r
- }\r
+ TIMSK = 1 << OCIE1A; // OCIE1A: Interrupt by timer compare\r
+#endif\r
}\r
\r
-#else // gcc\r
-\r
-// This is the main routine if you use GCC Compiler\r
int\r
main (void)\r
{\r
- IRMP_DATA irmp_data;\r
+ IRMP_DATA irmp_data;\r
\r
- irmp_init(); // initialize rc5\r
- timer_init(); // initialize timer\r
- sei (); // enable interrupts\r
+ irmp_init(); // initialize irmp\r
+ timer1_init(); // initialize timer 1\r
+ sei (); // enable interrupts\r
\r
- for (;;)\r
- {\r
- if (irmp_get_data (&irmp_data))\r
+ for (;;)\r
{\r
- // ir signal decoded, do something here...\r
- // irmp_data.protocol is the protocol, see irmp.h\r
- // irmp_data.address is the address/manufacturer code of ir sender\r
- // irmp_data.command is the command code\r
+ if (irmp_get_data (&irmp_data))\r
+ {\r
+ // ir signal decoded, do something here...\r
+ // irmp_data.protocol is the protocol, see irmp.h\r
+ // irmp_data.address is the address/manufacturer code of ir sender\r
+ // irmp_data.command is the command code\r
+ // irmp_protocol_names[irmp_data.protocol] is the protocol name (if enabled, see irmpconfig.h)\r
+ }\r
}\r
- }\r
}\r
-\r
-#endif // CODEVISION / gcc\r