summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorukw2011-09-06 14:39:56 +0000
committerukw2011-09-06 14:39:56 +0000
commit1f54e86cd05ee6e47b5da32107d191f0983ccf04 (patch)
tree2f83df74aad4457c72b09af6ec8d6281e109428c
parenteae64c5616142a359508a863c3f8f30f97d21daf (diff)
downloadirmp-1f54e86cd05ee6e47b5da32107d191f0983ccf04.zip
version 2.0.0-pre6: added support for ATtiny85, removed support for codevision, added protocol names for logging etc.
git-svn-id: svn://mikrocontroller.net/irmp@76 aeb2e35e-bfc4-4214-b83c-9e8de998ed28
-rw-r--r--README.txt4
-rw-r--r--irmp.aps2
-rw-r--r--irmp.c70
-rw-r--r--irmp.h36
-rw-r--r--irmpconfig.h6
-rw-r--r--irsnd.aps2
-rw-r--r--irsnd.c152
-rw-r--r--irsndconfig.h20
-rw-r--r--irsndmain.c128
-rw-r--r--main.c163
10 files changed, 276 insertions, 307 deletions
diff --git a/README.txt b/README.txt
index bfcefcf..bfd1d78 100644
--- a/README.txt
+++ b/README.txt
@@ -1,8 +1,8 @@
IRMP - Infrared Multi Protocol Decoder
--------------------------------------
-Version IRMP: 2.0.0-pre5 25.07.2011
-Version IRSND: 1.9.4 22.05.2011
+Version IRMP: 2.0.0-pre6 06.09.2011
+Version IRSND: 2.0.0-pre6 06.09.2011
Dokumentation:
diff --git a/irmp.aps b/irmp.aps
index fd607a2..ec97492 100644
--- 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>
+<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>
diff --git a/irmp.c b/irmp.c
index 3309a4c..bf75b69 100644
--- a/irmp.c
+++ b/irmp.c
@@ -316,8 +316,6 @@ typedef unsigned short uint16_t;
#else
-#ifndef CODEVISION
-
#ifdef PIC_CCS_COMPILER
#include <string.h>
@@ -336,7 +334,6 @@ typedef unsigned int16 uint16_t;
#include <avr/pgmspace.h>
#endif // PIC_CCS_COMPILER
-#endif // CODEVISION
#endif // windows
#endif // unix
@@ -713,6 +710,53 @@ static int verbose;
#define ANALYZE_NEWLINE()
#endif
+/*---------------------------------------------------------------------------------------------------------------------------------------------------
+ * Protocol names
+ *---------------------------------------------------------------------------------------------------------------------------------------------------
+ */
+#if IRMP_PROTOCOL_NAMES == 1
+char *
+irmp_protocol_names[IRMP_N_PROTOCOLS + 1] =
+{
+ "UNKNOWN",
+ "SIRCS",
+ "NEC",
+ "SAMSUNG",
+ "MATSUSH",
+ "KASEIKYO",
+ "RECS80",
+ "RC5",
+ "DENON",
+ "RC6",
+ "SAMSG32",
+ "APPLE",
+ "RECS80EX",
+ "NUBERT",
+ "BANG OLU",
+ "GRUNDIG",
+ "NOKIA",
+ "SIEMENS",
+ "FDC",
+ "RCCAR",
+ "JVC",
+ "RC6A",
+ "NIKON",
+ "RUWIDO",
+ "IR60",
+ "KATHREIN",
+ "NETBOX",
+ "NEC16",
+ "NEC42",
+ "LEGO",
+ "THOMSON",
+ "MERLIN"
+};
+#endif
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------------
+ * Logging
+ *---------------------------------------------------------------------------------------------------------------------------------------------------
+ */
#if IRMP_LOGGING == 1
#define BAUD 9600L
#include <util/setbaud.h>
@@ -1536,6 +1580,7 @@ static volatile uint16_t irmp_address;
static volatile uint16_t irmp_command;
static volatile uint16_t irmp_id; // only used for SAMSUNG protocol
static volatile uint8_t irmp_flags;
+// static volatile uint8_t irmp_busy_flag;
#ifdef ANALYZE
static uint8_t IRMP_PIN;
@@ -1714,6 +1759,12 @@ irmp_get_data (IRMP_DATA * irmp_data_p)
return rtc;
}
+// uint8_t
+// irmp_is_busy (void)
+// {
+// return irmp_busy_flag;
+// }
+
// these statics must not be volatile, because they are only used by irmp_store_bit(), which is called by irmp_ISR()
static uint16_t irmp_tmp_address; // ir address
static uint16_t irmp_tmp_command; // ir command
@@ -1889,6 +1940,7 @@ irmp_ISR (void)
{ // no...
if (! irmp_input) // receiving burst?
{ // yes...
+// irmp_busy_flag = TRUE;
#ifdef ANALYZE
if (! irmp_pulse_time)
{
@@ -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);
ANALYZE_ONLY_NORMAL_PUTCHAR ('\n');
}
+// irmp_busy_flag = FALSE;
irmp_start_bit_detected = 0; // reset flags, let's wait for another start bit
irmp_pulse_time = 0;
irmp_pause_time = 0;
@@ -2351,6 +2404,7 @@ irmp_ISR (void)
{
ANALYZE_PRINTF ("protocol = UNKNOWN\n");
+// irmp_busy_flag = FALSE;
irmp_start_bit_detected = 0; // wait for another start bit...
}
@@ -2524,6 +2578,7 @@ irmp_ISR (void)
{
ANALYZE_PRINTF ("error: stop bit timing wrong\n");
+// irmp_busy_flag = FALSE;
irmp_start_bit_detected = 0; // wait for another start bit...
irmp_pulse_time = 0;
irmp_pause_time = 0;
@@ -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);
ANALYZE_ONLY_NORMAL_PUTCHAR ('\n');
+// irmp_busy_flag = FALSE;
irmp_start_bit_detected = 0; // wait for another start bit...
irmp_pulse_time = 0;
irmp_pause_time = 0;
@@ -2849,6 +2905,7 @@ irmp_ISR (void)
ANALYZE_NEWLINE ();
ANALYZE_PRINTF ("error 3 manchester: timing not correct: data bit %d, pulse: %d, pause: %d\n", irmp_bit, irmp_pulse_time, irmp_pause_time);
ANALYZE_ONLY_NORMAL_PUTCHAR ('\n');
+// irmp_busy_flag = FALSE;
irmp_start_bit_detected = 0; // reset flags and wait for next start bit
irmp_pause_time = 0;
}
@@ -2986,6 +3043,7 @@ irmp_ISR (void)
{ // timing incorrect!
ANALYZE_PRINTF ("error 3 Samsung: timing not correct: data bit %d, pulse: %d, pause: %d\n", irmp_bit, irmp_pulse_time, irmp_pause_time);
ANALYZE_ONLY_NORMAL_PUTCHAR ('\n');
+// irmp_busy_flag = FALSE;
irmp_start_bit_detected = 0; // reset flags and wait for next start bit
irmp_pause_time = 0;
}
@@ -3031,6 +3089,7 @@ printf ("! %d %d !\n", irmp_pause_time, NEC_START_BIT_PAUSE_LEN_MAX);
{ // timing incorrect!
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);
ANALYZE_ONLY_NORMAL_PUTCHAR ('\n');
+// irmp_busy_flag = FALSE;
irmp_start_bit_detected = 0; // reset flags and wait for next start bit
irmp_pause_time = 0;
}
@@ -3047,6 +3106,7 @@ printf ("! %d %d !\n", irmp_pause_time, NEC_START_BIT_PAUSE_LEN_MAX);
{ // timing incorrect!
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);
ANALYZE_ONLY_NORMAL_PUTCHAR ('\n');
+// irmp_busy_flag = FALSE;
irmp_start_bit_detected = 0; // reset flags and wait for next start bit
irmp_pause_time = 0;
}
@@ -3080,6 +3140,7 @@ printf ("! %d %d !\n", irmp_pause_time, NEC_START_BIT_PAUSE_LEN_MAX);
{ // timing incorrect!
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);
ANALYZE_ONLY_NORMAL_PUTCHAR ('\n');
+// irmp_busy_flag = FALSE;
irmp_start_bit_detected = 0; // reset flags and wait for next start bit
irmp_pause_time = 0;
}
@@ -3089,6 +3150,7 @@ printf ("! %d %d !\n", irmp_pause_time, NEC_START_BIT_PAUSE_LEN_MAX);
{ // timing incorrect!
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);
ANALYZE_ONLY_NORMAL_PUTCHAR ('\n');
+// irmp_busy_flag = FALSE;
irmp_start_bit_detected = 0; // reset flags and wait for next start bit
irmp_pause_time = 0;
}
@@ -3143,6 +3205,7 @@ printf ("! %d %d !\n", irmp_pause_time, NEC_START_BIT_PAUSE_LEN_MAX);
{ // timing incorrect!
ANALYZE_PRINTF ("error 3: timing not correct: data bit %d, pulse: %d, pause: %d\n", irmp_bit, irmp_pulse_time, irmp_pause_time);
ANALYZE_ONLY_NORMAL_PUTCHAR ('\n');
+// irmp_busy_flag = FALSE;
irmp_start_bit_detected = 0; // reset flags and wait for next start bit
irmp_pause_time = 0;
}
@@ -3373,6 +3436,7 @@ printf ("! %d %d !\n", irmp_pause_time, NEC_START_BIT_PAUSE_LEN_MAX);
ANALYZE_ONLY_NORMAL_PUTCHAR ('\n');
}
+// irmp_busy_flag = FALSE;
irmp_start_bit_detected = 0; // and wait for next start bit
irmp_tmp_command = 0;
irmp_pulse_time = 0;
diff --git a/irmp.h b/irmp.h
index 6198263..fdb2c95 100644
--- a/irmp.h
+++ b/irmp.h
@@ -17,11 +17,6 @@
#ifndef _WC_IRMP_H_
#define _WC_IRMP_H_
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
/*---------------------------------------------------------------------------------------------------------------------------------------------------
* timing constants:
*---------------------------------------------------------------------------------------------------------------------------------------------------
@@ -79,6 +74,9 @@ typedef uint8_t PAUSE_LEN;
#define IRMP_LEGO_PROTOCOL 29 // LEGO Power Functions RC
#define IRMP_THOMSON_PROTOCOL 30 // Thomson
#define IRMP_MERLIN_PROTOCOL 31 // Pollin Merlin keyboard (bitserial)
+
+#define IRMP_N_PROTOCOLS 31 // number of supported protocols
+
#define IRMP_IMON_PROTOCOL 99 // Imon (bitserial) PROTOTYPE!
// some flags of struct IRMP_PARAMETER:
@@ -527,29 +525,13 @@ typedef struct
uint8_t flags; // flags, e.g. repetition
} IRMP_DATA;
+extern void irmp_init (void);
+extern uint8_t irmp_get_data (IRMP_DATA *);
+extern uint8_t irmp_is_busy (void);
+extern uint8_t irmp_ISR (void);
-/**
- * Initialize IRMP decoder
- * @details Configures IRMP input pin
- */
-extern void irmp_init (void);
-
-/**
- * Get IRMP data
- * @details gets decoded IRMP data
- * @param pointer in order to store IRMP data
- * @return TRUE: successful, FALSE: failed
- */
-extern uint8_t irmp_get_data (IRMP_DATA *);
-
-/**
- * ISR routine
- * @details ISR routine, called 10000 times per second
- */
-extern uint8_t irmp_ISR (void);
-
-#ifdef __cplusplus
-}
+#if IRMP_PROTOCOL_NAMES == 1
+extern char * irmp_protocol_names[IRMP_N_PROTOCOLS + 1];
#endif
#endif /* _WC_IRMP_H_ */
diff --git a/irmpconfig.h b/irmpconfig.h
index 457b369..297ec2f 100644
--- a/irmpconfig.h
+++ b/irmpconfig.h
@@ -104,6 +104,12 @@
#endif
/*---------------------------------------------------------------------------------------------------------------------------------------------------
+ * Set IRMP_PROTOCOL_NAMES to 1 if want to access protocol names (for logging etc), costs ~300 bytes RAM!
+ *---------------------------------------------------------------------------------------------------------------------------------------------------
+ */
+#define IRMP_PROTOCOL_NAMES 0 // 1: access protocol names, 0: do not (default),
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------------
* DO NOT CHANGE THE FOLLOWING LINES !
*---------------------------------------------------------------------------------------------------------------------------------------------------
*/
diff --git a/irsnd.aps b/irsnd.aps
index 65d785d..1b423dc 100644
--- 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>
+<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>
diff --git a/irsnd.c b/irsnd.c
index 517986c..fbd6ded 100644
--- a/irsnd.c
+++ b/irsnd.c
@@ -55,69 +55,115 @@ typedef unsigned short uint16_t;
#include "irsnd.h"
/*---------------------------------------------------------------------------------------------------------------------------------------------------
- * ATmega pin definition of OC2 / OC2A / OC2B
+ * ATtiny pin definition of OC0A / OC0B
+ * ATmega pin definition of OC2 / OC2A / OC2B / OC0 / OC0A / OC0B
*---------------------------------------------------------------------------------------------------------------------------------------------------
*/
-#if defined (__AVR_ATmega8__) // ATmega8 uses OC2 = PB3
-#undef IRSND_OC2 // has no OC2A / OC2B
-#define IRSND_OC2 0 // magic: use OC2
+/*---------------------------------------------------------------------------------------------------------------------------------------------------
+ * ATtiny pin definition of OC0A / OC0B
+ * ATmega pin definition of OC2 / OC2A / OC2B / OC0 / OC0A / OC0B
+ *---------------------------------------------------------------------------------------------------------------------------------------------------
+ */
+#if defined (__AVR_ATtiny85__) // ATtiny85 uses OC0A = PB0 or OC0B = PB1
+#if IRSND_OCx == IRSND_OC0A // OC0A
#define IRSND_PORT PORTB // port B
#define IRSND_DDR DDRB // ddr B
-#define IRSND_BIT 3 // OC2A
+#define IRSND_BIT 0 // OC0A
+#elif IRSND_OCx == IRSND_OC0B // OC0B
+#define IRSND_PORT PORTB // port B
+#define IRSND_DDR DDRB // ddr B
+#define IRSND_BIT 1 // OC0B
+#else
+#error Wrong value for IRSND_OCx, choose IRSND_OC0A or IRSND_OC0B in irsndconfig.h
+#endif // IRSND_OCx
+
+#elif defined (__AVR_ATmega8__) // ATmega8 uses only OC2 = PB3
+#if IRSND_OCx == IRSND_OC2 // OC0A
+#define IRSND_PORT PORTB // port B
+#define IRSND_DDR DDRB // ddr B
+#define IRSND_BIT 3 // OC0A
+#else
+#error Wrong value for IRSND_OCx, choose IRSND_OC2 in irsndconfig.h
+#endif // IRSND_OCx
+
#elif defined (__AVR_ATmega16__) \
|| defined (__AVR_ATmega32__) // ATmega16|32 uses OC2 = PD7
-#undef IRSND_OC2 // has no OC2A / OC2B
-#define IRSND_OC2 0 // magic: use OC2
+#if IRSND_OCx == IRSND_OC2 // OC2
#define IRSND_PORT PORTD // port D
#define IRSND_DDR DDRD // ddr D
#define IRSND_BIT 7 // OC2
+#else
+#error Wrong value for IRSND_OCx, choose IRSND_OC2 in irsndconfig.h
+#endif // IRSND_OCx
-#elif defined (__AVR_ATmega162__) // ATmega162 uses OC2 = PB1
-#undef IRSND_OC2 // has no OC2A / OC2B
-#define IRSND_OC2 0 // magic: use OC2
+#elif defined (__AVR_ATmega162__) // ATmega162 uses OC2 = PB1 or OC0 = PB0
+#if IRSND_OCx == IRSND_OC2 // OC2
#define IRSND_PORT PORTB // port B
#define IRSND_DDR DDRB // ddr B
#define IRSND_BIT 1 // OC2
+#elif IRSND_OCx == IRSND_OC0 // OC0
+#define IRSND_PORT PORTB // port B
+#define IRSND_DDR DDRB // ddr B
+#define IRSND_BIT 0 // OC0
+#else
+#error Wrong value for IRSND_OCx, choose IRSND_OC2 or IRSND_OC0 in irsndconfig.h
+#endif // IRSND_OCx
#elif defined (__AVR_ATmega164__) \
|| defined (__AVR_ATmega324__) \
|| defined (__AVR_ATmega644__) \
|| defined (__AVR_ATmega644P__) \
- || defined (__AVR_ATmega1284__) // ATmega164|324|644|644P|1284 uses OC2A = PD7 or OC2B = PD6
-#if IRSND_OC2 == 1 // OC2A
+ || defined (__AVR_ATmega1284__) // ATmega164|324|644|644P|1284 uses OC2A = PD7 or OC2B = PD6 or OC0A = PB3 or OC0B = PB4
+#if IRSND_OCx == IRSND_OC2A // OC2A
#define IRSND_PORT PORTD // port D
#define IRSND_DDR DDRD // ddr D
#define IRSND_BIT 7 // OC2A
-#elif IRSND_OC2 == 2 // OC2B
+#elif IRSND_OCx == IRSND_OC2B // OC2B
#define IRSND_PORT PORTD // port D
#define IRSND_DDR DDRD // ddr D
#define IRSND_BIT 6 // OC2B
+#elif IRSND_OCx == IRSND_OC0A // OC0A
+#define IRSND_PORT PORTB // port B
+#define IRSND_DDR DDRB // ddr B
+#define IRSND_BIT 3 // OC0A
+#elif IRSND_OCx == IRSND_OC0B // OC0B
+#define IRSND_PORT PORTB // port B
+#define IRSND_DDR DDRB // ddr B
+#define IRSND_BIT 4 // OC0B
#else
-#error Wrong value for IRSND_OC2, choose 1 or 2 in irsndconfig.h
-#endif // IRSND_OC2
+#error Wrong value for IRSND_OCx, choose IRSND_OC2A, IRSND_OC2B, IRSND_OC0A, or IRSND_OC0B in irsndconfig.h
+#endif // IRSND_OCx
#elif defined (__AVR_ATmega48__) \
|| defined (__AVR_ATmega88__) \
|| defined (__AVR_ATmega168__) \
- || defined (__AVR_ATmega168__) \
+ || defined (__AVR_ATmega168P__) \
|| defined (__AVR_ATmega328__) \
- || defined (__AVR_ATmega328P__) // ATmega48|88|168|328P uses OC2A = PB3 or OC2B = PD3
-#if IRSND_OC2 == 1 // OC2A
+ || defined (__AVR_ATmega328P__) // ATmega48|88|168|168P|328P uses OC2A = PB3 or OC2B = PD3 or OC0A = PD6 or OC0B = PD5
+#if IRSND_OCx == IRSND_OC2A // OC2A
#define IRSND_PORT PORTB // port B
#define IRSND_DDR DDRB // ddr B
#define IRSND_BIT 3 // OC2A
-#elif IRSND_OC2 == 2 // OC2B
+#elif IRSND_OCx == IRSND_OC2B // OC2B
#define IRSND_PORT PORTD // port D
#define IRSND_DDR DDRD // ddr D
#define IRSND_BIT 3 // OC2B
+#elif IRSND_OCx == IRSND_OC0A // OC0A
+#define IRSND_PORT PORTB // port B
+#define IRSND_DDR DDRB // ddr B
+#define IRSND_BIT 6 // OC0A
+#elif IRSND_OCx == IRSND_OC0B // OC0B
+#define IRSND_PORT PORTD // port D
+#define IRSND_DDR DDRD // ddr D
+#define IRSND_BIT 5 // OC0B
#else
-#error Wrong value for IRSND_OC2, choose 1 or 2 in irsndconfig.h
-#endif // IRSND_OC2
+#error Wrong value for IRSND_OCx, choose IRSND_OC2A, IRSND_OC2B, IRSND_OC0A, or IRSND_OC0B in irsndconfig.h
+#endif // IRSND_OCx
#else
#if !defined (unix) && !defined (WIN32)
-#error OC2A/OC2B not defined, please fill in definitions here.
+#error mikrocontroller not defined, please fill in definitions here.
#endif // unix, WIN32
#endif // __AVR...
@@ -306,13 +352,21 @@ irsnd_on (void)
if (! irsnd_is_on)
{
#ifndef DEBUG
-#if IRSND_OC2 == 0 // use OC2
- TCCR2 |= (1<<COM20)|(1<<WGM21); // toggle OC2 on compare match, clear Timer 2 at compare match OCR2
-#elif IRSND_OC2 == 1 // use OC2A
+#if IRSND_OCx == IRSND_OC2 // use OC2
+ TCCR2 |= (1<<COM20)|(1<<WGM21); // toggle OC2 on compare match, clear Timer 2 at compare match OCR2
+#elif IRSND_OCx == IRSND_OC2A // use OC2A
TCCR2A |= (1<<COM2A0)|(1<<WGM21); // toggle OC2A on compare match, clear Timer 2 at compare match OCR2A
-#else // use OC2B
+#elif IRSND_OCx == IRSND_OC2B // use OC2B
TCCR2A |= (1<<COM2B0)|(1<<WGM21); // toggle OC2B on compare match, clear Timer 2 at compare match OCR2A (yes: A, not B!)
-#endif // IRSND_OC2
+#elif IRSND_OCx == IRSND_OC0 // use OC0
+ TCCR0 |= (1<<COM00)|(1<<WGM01); // toggle OC0 on compare match, clear Timer 0 at compare match OCR0
+#elif IRSND_OCx == IRSND_OC0A // use OC0A
+ TCCR0A |= (1<<COM0A0)|(1<<WGM01); // toggle OC0A on compare match, clear Timer 0 at compare match OCR0A
+#elif IRSND_OCx == IRSND_OC0B // use OC0B
+ TCCR0A |= (1<<COM0B0)|(1<<WGM01); // toggle OC0B on compare match, clear Timer 0 at compare match OCR0A (yes: A, not B!)
+#else
+#error wrong value of IRSND_OCx
+#endif // IRSND_OCx
#endif // DEBUG
#if IRSND_USE_CALLBACK == 1
@@ -337,13 +391,21 @@ irsnd_off (void)
if (irsnd_is_on)
{
#ifndef DEBUG
-#if IRSND_OC2 == 0 // use OC2
+#if IRSND_OCx == IRSND_OC2 // use OC2
TCCR2 &= ~(1<<COM20); // normal port operation, OC2 disconnected.
-#elif IRSND_OC2 == 1 // use OC2A
+#elif IRSND_OCx == IRSND_OC2A // use OC2A
TCCR2A &= ~(1<<COM2A0); // normal port operation, OC2A disconnected.
-#else // use OC2B
+#elif IRSND_OCx == IRSND_OC2B // use OC2B
TCCR2A &= ~(1<<COM2B0); // normal port operation, OC2B disconnected.
-#endif // IRSND_OC2
+#elif IRSND_OCx == IRSND_OC0 // use OC0
+ TCCR0 &= ~(1<<COM00); // normal port operation, OC0 disconnected.
+#elif IRSND_OCx == IRSND_OC0A // use OC0A
+ TCCR0A &= ~(1<<COM0A0); // normal port operation, OC0A disconnected.
+#elif IRSND_OCx == IRSND_OC0B // use OC0B
+ TCCR0A &= ~(1<<COM0B0); // normal port operation, OC0B disconnected.
+#else
+#error wrong value of IRSND_OCx
+#endif // IRSND_OCx
IRSND_PORT &= ~(1<<IRSND_BIT); // set IRSND_BIT to low
#endif // DEBUG
@@ -367,10 +429,20 @@ static void
irsnd_set_freq (uint8_t freq)
{
#ifndef DEBUG
-#if IRSND_OC2 == 0
+#if IRSND_OCx == IRSND_OC2
OCR2 = freq; // use register OCR2 for OC2
-#else
+#elif IRSND_OCx == IRSND_OC2A // use OC2A
+ OCR2A = freq; // use register OCR2A for OC2A and OC2B!
+#elif IRSND_OCx == IRSND_OC2B // use OC2B
OCR2A = freq; // use register OCR2A for OC2A and OC2B!
+#elif IRSND_OCx == IRSND_OC0 // use OC0
+ OCR0 = freq; // use register OCR2 for OC2
+#elif IRSND_OCx == IRSND_OC0A // use OC0A
+ OCR0A = freq; // use register OCR0A for OC0A and OC0B!
+#elif IRSND_OCx == IRSND_OC0B // use OC0B
+ OCR0A = freq; // use register OCR0A for OC0A and OC0B!
+#else
+#error wrong value of IRSND_OCx
#endif
#endif // DEBUG
}
@@ -387,13 +459,21 @@ irsnd_init (void)
IRSND_PORT &= ~(1<<IRSND_BIT); // set IRSND_BIT to low
IRSND_DDR |= (1<<IRSND_BIT); // set IRSND_BIT to output
-#if defined (__AVR_ATmega32__)
+#if IRSND_OCx == IRSND_OC2 // use OC2
TCCR2 = (1<<WGM21); // CTC mode
TCCR2 |= (1<<CS20); // 0x01, start Timer 2, no prescaling
-#else
+#elif IRSND_OCx == IRSND_OC2A || IRSND_OCx == IRSND_OC2B // use OC2A or OC2B
TCCR2A = (1<<WGM21); // CTC mode
TCCR2B |= (1<<CS20); // 0x01, start Timer 2, no prescaling
-#endif // __AVR...
+#elif IRSND_OCx == IRSND_OC0 // use OC0
+ TCCR0 = (1<<WGM01); // CTC mode
+ TCCR0 |= (1<<CS00); // 0x01, start Timer 0, no prescaling
+#elif IRSND_OCx == IRSND_OC0A || IRSND_OCx == IRSND_OC0B // use OC0A or OC0B
+ TCCR0A = (1<<WGM01); // CTC mode
+ TCCR0B |= (1<<CS00); // 0x01, start Timer 0, no prescaling
+#else
+#error wrong value of IRSND_OCx
+#endif
irsnd_set_freq (IRSND_FREQ_36_KHZ); // default frequency
#endif // DEBUG
diff --git a/irsndconfig.h b/irsndconfig.h
index d3575ec..eb9f1ad 100644
--- a/irsndconfig.h
+++ b/irsndconfig.h
@@ -67,10 +67,26 @@
/*---------------------------------------------------------------------------------------------------------------------------------------------------
- * Change hardware pin here:
+ * DO NOT CHANGE:
*---------------------------------------------------------------------------------------------------------------------------------------------------
*/
-#define IRSND_OC2 1 // 0 = OC2, 1 = OC2A, 2 = OC2B, default is 1
+#define IRSND_OC2 0 // OC2
+#define IRSND_OC2A 1 // OC2A
+#define IRSND_OC2B 2 // OC2B
+#define IRSND_OC0 3 // OC0
+#define IRSND_OC0A 4 // OC0A
+#define IRSND_OC0B 5 // OC0B
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------------
+ * Change hardware pin here: IRSND_OC2 = OC2 on ATmegas supporting OC2, e.g. ATmega8
+ * IRSND_OC2A = OC2A on ATmegas supporting OC2A, e.g. ATmega88
+ * IRSND_OC2B = OC2B on ATmegas supporting OC2B, e.g. ATmega88
+ * IRSND_OC0 = OC0 on ATmegas supporting OC0, e.g. ATmega162
+ * IRSND_OC0A = OC0A on ATmegas/ATtinys supporting OC0A, e.g. ATtiny85
+ * IRSND_OC0B = OC0B on ATmegas/ATtinys supporting OC0B, e.g. ATtiny85
+ *---------------------------------------------------------------------------------------------------------------------------------------------------
+ */
+#define IRSND_OCx IRSND_OC2B // use OC2B
/*---------------------------------------------------------------------------------------------------------------------------------------------------
* Use Callbacks to indicate output signal or something else
diff --git a/irsndmain.c b/irsndmain.c
index def3b31..213a4f8 100644
--- a/irsndmain.c
+++ b/irsndmain.c
@@ -14,33 +14,6 @@
*---------------------------------------------------------------------------------------------------------------------------------------------------
*/
-/*---------------------------------------------------------------------------------------------------------------------------------------------------
- * uncomment this for codevision compiler:
- *---------------------------------------------------------------------------------------------------------------------------------------------------
- */
-// #define CODEVISION // to use Codevision Compiler instead of gcc
-
-#ifdef CODEVISION
-#include <mega88.h>
-#include <stdio.h>
-#define uint8_t unsigned char
-#define uint16_t unsigned int
-#define F_CPU 8000000 // change for Codevision here, if you use WinAVR, use Project -> Configuration Options instead
-
-// register values from datasheet for ATMega88
-#define OCIE1A 1
-#define WGM12 3
-#define CS10 0
-#define UDRE0 5
-#define TXEN0 3
-
-#include "irmp.h"
-#include "isnd.h"
-#include "irmp.c"
-#include "isnd.c"
-
-#else // gcc compiler
-
#include <inttypes.h>
#include <avr/io.h>
#include <util/delay.h>
@@ -50,102 +23,59 @@
#include "irsndconfig.h"
#include "irsnd.h"
-#endif // CODEVISION
-
#ifndef F_CPU
#error F_CPU unkown
#endif
void
-timer_init (void)
+timer1_init (void)
{
-#ifdef CODEVISION
- OCR1AH = ((F_CPU / F_INTERRUPTS) >> 8) & 0xFF; // compare value: 1/10000 of CPU frequency (upper byte)
- OCR1AL = ((F_CPU / F_INTERRUPTS) - 1) & 0xFF; // compare value: 1/10000 of CPU frequency (lower byte)
-#else // gcc
- OCR1A = (F_CPU / F_INTERRUPTS) - 1; // compare value: 1/10000 of CPU frequency
-#endif // CODEVISION
- TCCR1B = (1 << WGM12) | (1 << CS10); // switch CTC Mode on, set prescaler to 1
+#if defined (__AVR_ATtiny85__) // ATtiny85:
+ OCR1A = (F_CPU / (2 * F_INTERRUPTS) / 2) - 1; // compare value: 1/28800 of CPU frequency, presc = 2
+ TCCR1 = (1 << CTC1) | (1 << CS11); // switch CTC Mode on, set prescaler to 2
+#else // ATmegaXX:
+ OCR1A = (F_CPU / (2 * F_INTERRUPTS)) - 1; // compare value: 1/28800 of CPU frequency
+ TCCR1B = (1 << WGM12) | (1 << CS10); // switch CTC Mode on, set prescaler to 1
+#endif
-#if defined (__AVR_ATmega8__) || defined (__AVR_ATmega16__) || defined (__AVR_ATmega32__) || defined (__AVR_ATmega64__) || defined (__AVR_ATmega162__)
- TIMSK = 1 << OCIE1A; // OCIE1A: Interrupt by timer compare (use TIMSK for ATMEGA162)
+#ifdef TIMSK1
+ TIMSK1 = 1 << OCIE1A; // OCIE1A: Interrupt by timer compare
#else
- TIMSK1 = 1 << OCIE1A; // OCIE1A: Interrupt by timer compare (use TIMSK for ATMEGA162)
-#endif // __AVR...
+ TIMSK = 1 << OCIE1A; // OCIE1A: Interrupt by timer compare
+#endif
}
/*---------------------------------------------------------------------------------------------------------------------------------------------------
* timer 1 compare handler, called every 1/10000 sec
*---------------------------------------------------------------------------------------------------------------------------------------------------
*/
-// Timer 1 output compare A interrupt service routine
-#ifdef CODEVISION
-interrupt [TIM1_COMPA] void timer1_compa_isr(void)
-#else // CODEVISION
ISR(TIMER1_COMPA_vect)
-#endif // CODEVISION
{
(void) irsnd_ISR(); // call irsnd ISR
- // call other timer interrupt routines...
+ // call other timer interrupt routines here...
}
/*---------------------------------------------------------------------------------------------------------------------------------------------------
* MAIN: main routine
*---------------------------------------------------------------------------------------------------------------------------------------------------
*/
-#ifdef CODEVISION
-// This is the main routine if you use Codevision C Compiler
-void
-main (void)
-{
- IRMP_DATA irmp_data;
-
- #pragma optsize-
- // crystal oscillator division factor: 1
- CLKPR=0x80;
- CLKPR=0x00;
- #ifdef _OPTIMIZE_SIZE_
- #pragma optsize+
- #endif
-
- irsnd_init(); // initialize irsnd
- timer_init(); // initialize timer
- #asm("sei"); // enable interrupts
-
- for (;;)
- {
- irmp_data.protocol = IRMP_NEC_PROTOCOL;
- irmp_data.address = 0x00FF;
- irmp_data.command = 0x0001;
- irmp_data.flags = 0;
-
- irsnd_send_data (&irmp_data);
- _delay_ms (1000);
- }
-}
-
-#else // gcc
-
-// This is the main routine if you use GCC Compiler
int
main (void)
{
- IRMP_DATA irmp_data;
-
- irsnd_init(); // initialize irsnd
- timer_init(); // initialize timer
- sei (); // enable interrupts
-
- for (;;)
- {
- irmp_data.protocol = IRMP_NEC_PROTOCOL;
- irmp_data.address = 0x00FF;
- irmp_data.command = 0x0001;
- irmp_data.flags = 0;
-
- irsnd_send_data (&irmp_data, TRUE);
- _delay_ms (1000);
- }
+ IRMP_DATA irmp_data;
+
+ irsnd_init(); // initialize irsnd
+ timer1_init(); // initialize timer
+ sei (); // enable interrupts
+
+ for (;;)
+ {
+ irmp_data.protocol = IRMP_NEC_PROTOCOL;
+ irmp_data.address = 0x00FF;
+ irmp_data.command = 0x0001;
+ irmp_data.flags = 0;
+
+ irsnd_send_data (&irmp_data, TRUE);
+ _delay_ms (1000);
+ }
}
-
-#endif // CODEVISION / gcc
diff --git a/main.c b/main.c
index 0248d8e..9877762 100644
--- a/main.c
+++ b/main.c
@@ -16,164 +16,55 @@
*---------------------------------------------------------------------------------------------------------------------------------------------------
*/
-/*---------------------------------------------------------------------------------------------------------------------------------------------------
- * uncomment this for codevision compiler:
- *---------------------------------------------------------------------------------------------------------------------------------------------------
- */
-// #define CODEVISION // to use Codevision Compiler instead of gcc
-
-#ifdef CODEVISION
-#include <mega88.h>
-#include <stdio.h>
-#define uint8_t unsigned char
-#define uint16_t unsigned int
-#define F_CPU 8000000 // change for Codevision here, if you use WinAVR, use Project -> Configuration Options instead
-
-// register values from datasheet for ATMega88
-#define OCIE1A 1
-#define WGM12 3
-#define CS10 0
-#define UDRE0 5
-#define TXEN0 3
-
-#include "irmp.h"
-#include "irmp.c"
-
-#else // gcc compiler
-
#include <inttypes.h>
#include <avr/io.h>
#include <util/delay.h>
#include <avr/pgmspace.h>
#include <avr/interrupt.h>
-#include "irmp.h"
-#include "irmpconfig.h"
-
-
-#endif // CODEVISION
+#include "irmpconfig.h"
+#include "irmp.h"
#ifndef F_CPU
#error F_CPU unkown
#endif
void
-timer_init (void)
+timer1_init (void)
{
-#ifdef CODEVISION
- OCR1AH = ((F_CPU / F_INTERRUPTS) >> 8) & 0xFF; // compare value: 1/10000 of CPU frequency (upper byte)
- OCR1AL = ((F_CPU / F_INTERRUPTS) - 1) & 0xFF; // compare value: 1/10000 of CPU frequency (lower byte)
-#else // gcc
- OCR1A = (F_CPU / F_INTERRUPTS) - 1; // compare value: 1/10000 of CPU frequency
-#endif // CODEVISION
- TCCR1B = (1 << WGM12) | (1 << CS10); // switch CTC Mode on, set prescaler to 1
+#if defined (__AVR_ATtiny85__) // ATtiny85:
+ OCR1A = (F_CPU / (2 * F_INTERRUPTS) / 2) - 1; // compare value: 1/28800 of CPU frequency, presc = 2
+ TCCR1 = (1 << CTC1) | (1 << CS11); // switch CTC Mode on, set prescaler to 2
+#else // ATmegaXX:
+ OCR1A = (F_CPU / (2 * F_INTERRUPTS)) - 1; // compare value: 1/28800 of CPU frequency
+ TCCR1B = (1 << WGM12) | (1 << CS10); // switch CTC Mode on, set prescaler to 1
+#endif
-#if defined (__AVR_ATmega8__) || defined (__AVR_ATmega16__) || defined (__AVR_ATmega32__) || defined (__AVR_ATmega64__) || defined (__AVR_ATmega162__)
- TIMSK = 1 << OCIE1A; // OCIE1A: Interrupt by timer compare
+#ifdef TIMSK1
+ TIMSK1 = 1 << OCIE1A; // OCIE1A: Interrupt by timer compare
#else
- TIMSK1 = 1 << OCIE1A; // OCIE1A: Interrupt by timer compare
-#endif // __AVR...
-}
-
-/*---------------------------------------------------------------------------------------------------------------------------------------------------
- * timer 1 compare handler, called every 1/10000 sec
- *---------------------------------------------------------------------------------------------------------------------------------------------------
- */
-// Timer 1 output compare A interrupt service routine
-#ifdef CODEVISION
-interrupt [TIM1_COMPA] void timer1_compa_isr(void)
-#else // CODEVISION
-ISR(TIMER1_COMPA_vect)
-#endif // CODEVISION
-{
- (void) irmp_ISR(); // call irmp ISR
- // call other timer interrupt routines...
-}
-
-/*---------------------------------------------------------------------------------------------------------------------------------------------------
- * MAIN: main routine
- *---------------------------------------------------------------------------------------------------------------------------------------------------
- */
-#ifdef CODEVISION
-// This is the main routine if you use Codevision C Compiler
-void
-main (void)
-{
- IRMP_DATA irmp_data;
-
- #pragma optsize-
- // crystal oscillator division factor: 1
- CLKPR=0x80;
- CLKPR=0x00;
- #ifdef _OPTIMIZE_SIZE_
- #pragma optsize+
- #endif
- 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"};
-
- #if IRMP_LOGGING == 0
- // USART initialization has to be done here if Logging is off
- // Communication Parameters: 8 Data, 1 Stop, No Parity
- // USART Receiver: Off
- // USART Transmitter: On
- // USART0 Mode: Asynchronous
- // USART Baud Rate: 9600
- #define BAUDRATE 9600L
- UCSR0A=0x00;
- UCSR0B=0x08;
- UCSR0C=0x06;
- UBRR0H = ((F_CPU+BAUDRATE*8)/(BAUDRATE*16)-1) >> 8; // store baudrate (upper byte)
- UBRR0L = ((F_CPU+BAUDRATE*8)/(BAUDRATE*16)-1) & 0xFF;
- #endif
-
- irmp_init(); // initialize rc5
-
- printf("IRMP V1.0\n");
- #if IRMP_LOGGING == 1
- printf("Logging Mode\n");
- #endif
-
- timer_init(); // initialize timer
- #asm("sei"); // enable interrupts
-
- for (;;)
- {
- if (irmp_get_data (&irmp_data))
- {
- // ir signal decoded, do something here...
- // irmp_data.protocol is the protocol, see irmp.h
- // irmp_data.address is the address/manufacturer code of ir sender
- // irmp_data.command is the command code
- #if IRMP_LOGGING != 1
- printf("Code: %s\n",Proto[irmp_data.protocol-1]);
- printf("Address: 0x%.2X\n",irmp_data.address);
- printf("Command: 0x%.2X\n\n",irmp_data.command);
- #endif
- }
- }
+ TIMSK = 1 << OCIE1A; // OCIE1A: Interrupt by timer compare
+#endif
}
-#else // gcc
-
-// This is the main routine if you use GCC Compiler
int
main (void)
{
- IRMP_DATA irmp_data;
+ IRMP_DATA irmp_data;
- irmp_init(); // initialize rc5
- timer_init(); // initialize timer
- sei (); // enable interrupts
+ irmp_init(); // initialize irmp
+ timer1_init(); // initialize timer 1
+ sei (); // enable interrupts
- for (;;)
- {
- if (irmp_get_data (&irmp_data))
+ for (;;)
{
- // ir signal decoded, do something here...
- // irmp_data.protocol is the protocol, see irmp.h
- // irmp_data.address is the address/manufacturer code of ir sender
- // irmp_data.command is the command code
+ if (irmp_get_data (&irmp_data))
+ {
+ // ir signal decoded, do something here...
+ // irmp_data.protocol is the protocol, see irmp.h
+ // irmp_data.address is the address/manufacturer code of ir sender
+ // irmp_data.command is the command code
+ // irmp_protocol_names[irmp_data.protocol] is the protocol name (if enabled, see irmpconfig.h)
+ }
}
- }
}
-
-#endif // CODEVISION / gcc