From 1f54e86cd05ee6e47b5da32107d191f0983ccf04 Mon Sep 17 00:00:00 2001 From: ukw Date: Tue, 6 Sep 2011 14:39:56 +0000 Subject: [PATCH] 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 --- README.txt | 4 +- irmp.aps | 2 +- irmp.c | 70 +++++++++++++++++++++- irmp.h | 36 +++-------- irmpconfig.h | 6 ++ irsnd.aps | 2 +- irsnd.c | 152 +++++++++++++++++++++++++++++++++++----------- irsndconfig.h | 20 ++++++- irsndmain.c | 128 +++++++++------------------------------ main.c | 163 +++++++++----------------------------------------- 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 @@ -irmp07-Jan-2010 20:23:4929-Jun-2010 11:22:31241007-Jan-2010 20:23:4944, 18, 0, 670AVR GCCdefault\irmp.elfC:\avr\irmp\AVR SimulatorATmega88.xmlfalseR00R01R02R03R04R05R06R07R08R09R10R11R12R13R14R15R16R17R18R19R20R21R22R23R24R25R26R27R28R29R30R31Auto000main.cirmp.cirmp.hirmpconfig.hdefault\irmp.lssdefault\irmp.mapdefaultNOatmega88111irmp.elfdefault\0-Wall -gdwarf-2 -std=gnu99 -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enumsdefault1C:\Program Files\WinAVR-20100110\bin\avr-gcc.exeC:\Program Files\WinAVR-20100110\utils\bin\make.exe00000main.c100001irmp.c100002irmp.h100003irmpconfig.h1 +irmp07-Jan-2010 20:23:4906-Sep-2011 16:15:23241007-Jan-2010 20:23:4944, 18, 0, 670AVR GCCdefault\irmp.elfC:\avr\irmp\AVR SimulatorATmega88.xmlfalseR00R01R02R03R04R05R06R07R08R09R10R11R12R13R14R15R16R17R18R19R20R21R22R23R24R25R26R27R28R29R30R31Auto000main.cirmp.cirmp.hirmpconfig.hdefault\irmp.lssdefault\irmp.mapdefaultNOatmega88111irmp.elfdefault\0-Wall -gdwarf-2 -std=gnu99 -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enumsdefault1C:\Program Files\WinAVR-20100110\bin\avr-gcc.exeC:\Program Files\WinAVR-20100110\utils\bin\make.exe00000main.c100001irmp.c100002irmp.h100003irmpconfig.h1 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 @@ -336,7 +334,6 @@ typedef unsigned int16 uint16_t; #include #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 @@ -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 @@ -103,6 +103,12 @@ #define IRMP_LOGGING 0 // 1: log IR signal (scan), 0: do not (default) #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 @@ -irsnd07-Jan-2010 20:23:4901-Jul-2010 12:58:34241007-Jan-2010 20:23:4944, 18, 0, 670AVR GCCdefault\irsnd.elfC:\avr\irmp\AVR SimulatorATmega88.xmlfalseR00R01R02R03R04R05R06R07R08R09R10R11R12R13R14R15R16R17R18R19R20R21R22R23R24R25R26R27R28R29R30R31Auto000irsndmain.cirsnd.cirmp.hirsnd.hirsndconfig.hdefault\irsnd.lssdefault\irsnd.mapdefaultNOatmega88111irsnd.elfdefault\0-Wall -gdwarf-2 -std=gnu99 -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enumsdefault1C:\Program Files\WinAVR-20100110\bin\avr-gcc.exeC:\Program Files\WinAVR-20100110\utils\bin\make.exe00000irsndmain.c100001irmp.h100002irsnd.c100003irsnd.h100004irsndconfig.h1 +irsnd07-Jan-2010 20:23:4906-Sep-2011 16:10:48241007-Jan-2010 20:23:4944, 18, 0, 670AVR GCCdefault\irsnd.elfC:\avr\irmp\AVR SimulatorATmega88.xmlfalseR00R01R02R03R04R05R06R07R08R09R10R11R12R13R14R15R16R17R18R19R20R21R22R23R24R25R26R27R28R29R30R31Auto000irsndmain.cirsnd.cirmp.hirsnd.hirsndconfig.hdefault\irsnd.lssdefault\irsnd.mapdefaultNOatmega88111irsnd.elfdefault\0-Wall -gdwarf-2 -std=gnu99 -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enumsdefault1C:\Program Files\WinAVR-20100110\bin\avr-gcc.exeC:\Program Files\WinAVR-20100110\utils\bin\make.exe00000irsndmain.c100001irmp.h100002irsnd.c100003irsnd.h100004irsndconfig.h1 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< -#include -#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 #include #include @@ -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 -#include -#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 #include #include #include #include -#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 -- 2.39.2