* ATmega164, ATmega324, ATmega644, ATmega644P, ATmega1284\r
* ATmega88, ATmega88P, ATmega168, ATmega168P, ATmega328P\r
*\r
- * $Id: irsnd.c,v 1.60 2012/10/05 07:58:39 fm Exp $\r
+ * $Id: irsnd.c,v 1.62 2012/10/26 08:20:30 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
*/\r
#if defined (__AVR_ATtiny84__) // ATtiny84 uses OC0A = PB2 or OC0B = PA7\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 2 // OC0A\r
+# define IRSND_PORT_LETTER B\r
+# define IRSND_BIT_NUMBER 2\r
# elif IRSND_OCx == IRSND_OC0B // OC0B\r
-# define IRSND_PORT PORTA // port A\r
-# define IRSND_DDR DDRA // ddr A\r
-# define IRSND_BIT 7 // OC0B\r
+# define IRSND_PORT_LETTER A\r
+# define IRSND_BIT_NUMBER 7\r
# else\r
# error Wrong value for IRSND_OCx, choose IRSND_OC0A or IRSND_OC0B in irsndconfig.h\r
# endif // IRSND_OCx\r
#elif defined (__AVR_ATtiny45__) || defined (__AVR_ATtiny85__) // ATtiny45/85 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 0 // OC0A\r
+# define IRSND_PORT_LETTER B\r
+# define IRSND_BIT_NUMBER 0\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
+# define IRSND_PORT_LETTER B\r
+# define IRSND_BIT_NUMBER 1\r
# else\r
# error Wrong value for IRSND_OCx, choose IRSND_OC0A or IRSND_OC0B in irsndconfig.h\r
# endif // IRSND_OCx\r
#elif defined (__AVR_ATtiny87__) || defined (__AVR_ATtiny167__) // ATtiny87/167 uses OC0A = PA2\r
# if IRSND_OCx == IRSND_OC0A // OC0A\r
-# define IRSND_PORT PORTA // port A\r
-# define IRSND_DDR DDRA // ddr A\r
-# define IRSND_BIT 2 // OC0A\r
+# define IRSND_PORT_LETTER A\r
+# define IRSND_BIT_NUMBER 2\r
# else\r
# error Wrong value for IRSND_OCx, choose IRSND_OC0A in irsndconfig.h\r
# endif // IRSND_OCx\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
+# define IRSND_PORT_LETTER B\r
+# define IRSND_BIT_NUMBER 3\r
# else\r
# error Wrong value for IRSND_OCx, choose IRSND_OC2 in irsndconfig.h\r
# endif // IRSND_OCx\r
#elif defined (__AVR_ATmega16__) || defined (__AVR_ATmega32__) // ATmega16|32 uses OC2 = PD7\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
+# define IRSND_PORT_LETTER D\r
+# define IRSND_BIT_NUMBER 7\r
# else\r
# error Wrong value for IRSND_OCx, choose IRSND_OC2 in irsndconfig.h\r
# endif // IRSND_OCx\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
+# define IRSND_PORT_LETTER B\r
+# define IRSND_BIT_NUMBER 1\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
+# define IRSND_PORT_LETTER B\r
+# define IRSND_BIT_NUMBER 0\r
# else\r
# error Wrong value for IRSND_OCx, choose IRSND_OC2 or IRSND_OC0 in irsndconfig.h\r
# endif // IRSND_OCx\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
-# define IRSND_BIT 7 // OC2A\r
+# define IRSND_PORT_LETTER D\r
+# define IRSND_BIT_NUMBER 7\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
+# define IRSND_PORT_LETTER D\r
+# define IRSND_BIT_NUMBER 6\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
+# define IRSND_PORT_LETTER B\r
+# define IRSND_BIT_NUMBER 3\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
+# define IRSND_PORT_LETTER B\r
+# define IRSND_BIT_NUMBER 4\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
|| defined (__AVR_ATmega168P__) \\r
|| defined (__AVR_ATmega328P__) // ATmega48|88|168|168|328 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
+# define IRSND_PORT_LETTER B\r
+# define IRSND_BIT_NUMBER 3\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
+# define IRSND_PORT_LETTER D\r
+# define IRSND_BIT_NUMBER 3\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
+# define IRSND_PORT_LETTER D\r
+# define IRSND_BIT_NUMBER 6\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
+# define IRSND_PORT_LETTER D\r
+# define IRSND_BIT_NUMBER 5\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
+#elif defined (__AVR_ATmega8515__) // ATmega8515 uses OC0 = PB0 or OC1A = PD5 or OC1B = PE2\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
+# define IRSND_PORT_LETTER B\r
+# define IRSND_BIT_NUMBER 0\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
+# define IRSND_PORT_LETTER D\r
+# define IRSND_BIT_NUMBER 5\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
+# define IRSND_PORT_LETTER E\r
+# define IRSND_BIT_NUMBER 2\r
# else\r
# error Wrong value for IRSND_OCx, choose IRSND_OC0, IRSND_OC1A, or IRSND_OC1B in irsndconfig.h\r
# endif // IRSND_OCx\r
# endif // unix, WIN32\r
#endif // __AVR...\r
\r
+#if defined(ATMEL_AVR)\r
+# define _CONCAT(a,b) a##b\r
+# define CONCAT(a,b) _CONCAT(a,b)\r
+# define IRSND_PORT CONCAT(PORT, IRSND_PORT_LETTER)\r
+# define IRSND_DDR CONCAT(DDR, IRSND_PORT_LETTER)\r
+# define IRSND_BIT IRSND_BIT_NUMBER\r
+#endif\r
+\r
#if IRSND_SUPPORT_NIKON_PROTOCOL == 1\r
typedef uint16_t IRSND_PAUSE_LEN;\r
#else\r
\r
putchar ('\n');\r
\r
+#if 1 // enable here to send twice\r
(void) irsnd_send_data (&irmp_data, TRUE);\r
\r
while (irsnd_busy)\r
}\r
\r
putchar ('\n');\r
+#endif\r
}\r
else\r
{\r