]> cloudbase.mooo.com Git - irmp.git/commitdiff
version 2.0.0-pre6: added support for ATtiny85, removed support for codevision, added...
authorukw <ukw@aeb2e35e-bfc4-4214-b83c-9e8de998ed28>
Tue, 6 Sep 2011 14:39:56 +0000 (14:39 +0000)
committerukw <ukw@aeb2e35e-bfc4-4214-b83c-9e8de998ed28>
Tue, 6 Sep 2011 14:39:56 +0000 (14:39 +0000)
git-svn-id: svn://mikrocontroller.net/irmp@76 aeb2e35e-bfc4-4214-b83c-9e8de998ed28

README.txt
irmp.aps
irmp.c
irmp.h
irmpconfig.h
irsnd.aps
irsnd.c
irsndconfig.h
irsndmain.c
main.c

index bfcefcf3151474c09a2c992d85645c52b49de175..bfd1d78346e7f4d826bf37544ac6dbefe437200f 100644 (file)
@@ -1,8 +1,8 @@
 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
index fd607a25a4d39180b50a7f866ebf649fc00a1e23..ec974923a46741c460951fc1d931db5f9af0bf6a 100644 (file)
--- a/irmp.aps
+++ b/irmp.aps
@@ -1 +1 @@
-<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
diff --git a/irmp.c b/irmp.c
index 3309a4cef122ca3f140ee876ee4c9a58211d9481..bf75b69f1bf83419ed86399098c37371045ab9f8 100644 (file)
--- a/irmp.c
+++ b/irmp.c
@@ -316,8 +316,6 @@ typedef unsigned short  uint16_t;
 \r
 #else\r
 \r
-#ifndef CODEVISION\r
-\r
 #ifdef PIC_CCS_COMPILER\r
 \r
 #include <string.h>\r
@@ -336,7 +334,6 @@ typedef unsigned int16  uint16_t;
 #include <avr/pgmspace.h>\r
 \r
 #endif  // PIC_CCS_COMPILER\r
-#endif  // CODEVISION\r
 \r
 #endif // windows\r
 #endif // unix\r
@@ -713,6 +710,53 @@ static int      verbose;
 #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
@@ -1536,6 +1580,7 @@ static volatile uint16_t                    irmp_address;
 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
@@ -1714,6 +1759,12 @@ irmp_get_data (IRMP_DATA * irmp_data_p)
     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
@@ -1889,6 +1940,7 @@ irmp_ISR (void)
         {                                                                       // no...\r
             if (! irmp_input)                                                   // receiving burst?\r
             {                                                                   // yes...\r
+//              irmp_busy_flag = TRUE;\r
 #ifdef ANALYZE\r
                 if (! irmp_pulse_time)\r
                 {\r
@@ -1953,6 +2005,7 @@ irmp_ISR (void)
                             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
@@ -2351,6 +2404,7 @@ irmp_ISR (void)
 \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
@@ -2524,6 +2578,7 @@ irmp_ISR (void)
                         {\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
@@ -2702,6 +2757,7 @@ irmp_ISR (void)
                                 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
@@ -2849,6 +2905,7 @@ irmp_ISR (void)
                                 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
@@ -2986,6 +3043,7 @@ irmp_ISR (void)
                         {                                                           // 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
@@ -3031,6 +3089,7 @@ printf ("! %d %d !\n", irmp_pause_time, NEC_START_BIT_PAUSE_LEN_MAX);
                                 {                                                   // 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
@@ -3047,6 +3106,7 @@ printf ("! %d %d !\n", irmp_pause_time, NEC_START_BIT_PAUSE_LEN_MAX);
                                 {                                                   // 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
@@ -3080,6 +3140,7 @@ printf ("! %d %d !\n", irmp_pause_time, NEC_START_BIT_PAUSE_LEN_MAX);
                                 {                                                   // 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
@@ -3089,6 +3150,7 @@ printf ("! %d %d !\n", irmp_pause_time, NEC_START_BIT_PAUSE_LEN_MAX);
                         {                                                           // 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
@@ -3143,6 +3205,7 @@ printf ("! %d %d !\n", irmp_pause_time, NEC_START_BIT_PAUSE_LEN_MAX);
                     {                                                               // 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
@@ -3373,6 +3436,7 @@ printf ("! %d %d !\n", irmp_pause_time, NEC_START_BIT_PAUSE_LEN_MAX);
                     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
diff --git a/irmp.h b/irmp.h
index 619826380e0735ee9bac3c27e9036a9d058c1933..fdb2c9500dc1792a01c17acb7ccdbefa64a3a00a 100644 (file)
--- a/irmp.h
+++ b/irmp.h
 #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
@@ -79,6 +74,9 @@ typedef uint8_t     PAUSE_LEN;
 #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
@@ -527,29 +525,13 @@ typedef struct
   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
index 457b369db938b1070d0b7087467d13bbd6e1fff3..297ec2fb3ca1f729ad6ee378fa46cf6e1b2cfdd9 100644 (file)
 #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
index 65d785d90d2173357de575b4a2e8fa2771e53925..1b423dc655f7fa169e66958445a766ee55b722cd 100644 (file)
--- a/irsnd.aps
+++ b/irsnd.aps
@@ -1 +1 @@
-<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
diff --git a/irsnd.c b/irsnd.c
index 517986ce9ff05127ec5438470d3cb5cda3ea0bad..fbd6ded1b18ca39f901dcd456add50b9f0eb36dc 100644 (file)
--- a/irsnd.c
+++ b/irsnd.c
@@ -55,69 +55,115 @@ typedef unsigned short  uint16_t;
 #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
@@ -306,13 +352,21 @@ irsnd_on (void)
     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
@@ -337,13 +391,21 @@ irsnd_off (void)
     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
@@ -367,10 +429,20 @@ static void
 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
@@ -387,13 +459,21 @@ irsnd_init (void)
     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
index d3575ecf91d7f4856af36582a8005a0761f0d0fe..eb9f1ad8f83ea26b504f32238fc032bf68ef4cc5 100644 (file)
 \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
index def3b311ca7f3cf29d803ca8e0f30f0f37278965..213a4f84462a4323b83a9967e00d67143f0720f8 100644 (file)
  *---------------------------------------------------------------------------------------------------------------------------------------------------\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
diff --git a/main.c b/main.c
index 0248d8e6d04ed6ca09c44b76214cc1e86f80df21..9877762af07159b06340978ac138ba79c8666b47 100644 (file)
--- a/main.c
+++ b/main.c
  *---------------------------------------------------------------------------------------------------------------------------------------------------\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