* ATmega164, ATmega324, ATmega644, ATmega644P, ATmega1284\r
* ATmega88, ATmega88P, ATmega168, ATmega168P, ATmega328P\r
*\r
- * $Id: irsnd.c,v 1.41 2011/09/20 10:45:28 fm Exp $\r
+ * $Id: irsnd.c,v 1.45 2012/02/13 11:02:29 fm Exp $\r
*\r
* This program is free software; you can redistribute it and/or modify\r
* it under the terms of the GNU General Public License as published by\r
|| 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 or OC0A = PB3 or OC0B = PB4\r
+ || defined (__AVR_ATmega1284__) \\r
+ || defined (__AVR_ATmega1284P__) // 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
#else\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
+#elif defined (__AVR_ATmega8515__) \r
+#if IRSND_OCx == IRSND_OC0 \r
+#define IRSND_PORT PORTB // port B\r
+#define IRSND_DDR DDRB // ddr B\r
+#define IRSND_BIT 0 // OC0\r
+#elif IRSND_OCx == IRSND_OC1A \r
+#define IRSND_PORT PORTD // port D\r
+#define IRSND_DDR DDRD // ddr D\r
+#define IRSND_BIT 5 // OC1A\r
+#elif IRSND_OCx == IRSND_OC1B \r
+#define IRSND_PORT PORTE // port E\r
+#define IRSND_DDR DDRE // ddr E\r
+#define IRSND_BIT 2 // OC1E\r
+#error Wrong value for IRSND_OCx, choose IRSND_OC0, IRSND_OC1A, or IRSND_OC1B in irsndconfig.h\r
+#endif // IRSND_OCx\r
\r
#else\r
#if !defined (unix) && !defined (WIN32)\r
case IRMP_KASEIKYO_PROTOCOL:\r
{\r
uint8_t xor;\r
+ uint16_t genre2;\r
\r
address = bitsrevervse (irmp_data_p->address, KASEIKYO_ADDRESS_LEN);\r
command = bitsrevervse (irmp_data_p->command, KASEIKYO_COMMAND_LEN + 4);\r
+ genre2 = bitsrevervse ((irmp_data_p->flags & ~IRSND_REPETITION_MASK) >> 4, 4);\r
\r
xor = ((address & 0x000F) ^ ((address & 0x00F0) >> 4) ^ ((address & 0x0F00) >> 8) ^ ((address & 0xF000) >> 12)) & 0x0F;\r
\r
irsnd_buffer[0] = (address & 0xFF00) >> 8; // AAAAAAAA\r
irsnd_buffer[1] = (address & 0x00FF); // AAAAAAAA\r
irsnd_buffer[2] = xor << 4 | (command & 0x000F); // XXXXCCCC\r
- irsnd_buffer[3] = 0 | (command & 0xF000) >> 12; // 0000CCCC\r
+ irsnd_buffer[3] = (genre2 << 4) | (command & 0xF000) >> 12; // ggggCCCC\r
irsnd_buffer[4] = (command & 0x0FF0) >> 4; // CCCCCCCC\r
\r
xor = irsnd_buffer[2] ^ irsnd_buffer[3] ^ irsnd_buffer[4];\r
uint8_t\r
irsnd_ISR (void)\r
{\r
+ static uint8_t send_trailer;\r
static uint8_t current_bit = 0xFF;\r
static uint8_t pulse_counter;\r
static IRSND_PAUSE_LEN pause_counter;\r
}\r
else\r
{\r
+ if (send_trailer)\r
+ {\r
+ irsnd_busy = FALSE;\r
+ return irsnd_busy;\r
+ }\r
+\r
n_repeat_frames = irsnd_repeat;\r
\r
if (n_repeat_frames == IRSND_ENDLESS_REPETITION)\r
}\r
else\r
{\r
+ irsnd_busy = TRUE;\r
+ send_trailer = TRUE;\r
n_repeat_frames = 0;\r
repeat_counter = 0;\r
}\r
int\r
main (int argc, char ** argv)\r
{\r
- int idx;\r
int protocol;\r
int address;\r
int command;\r
irsnd_ISR ();\r
}\r
\r
- for (idx = 0; idx < 20; idx++)\r
- {\r
- irsnd_ISR ();\r
- }\r
-\r
putchar ('\n');\r
}\r
else\r