diff --git a/serial.c b/serial.c index 69fa717..01a1f3a 100644 --- a/serial.c +++ b/serial.c @@ -91,11 +91,7 @@ void serial_write(uint8_t data) { } // Data Register Empty Interrupt handler -#ifdef __AVR_ATmega644P__ -ISR(USART0_UDRE_vect) -#else -ISR(USART_UDRE_vect) -#endif +ISR(Serial_UDRE_vect) { // Temporary tx_buffer_tail (to optimize for volatile) uint8_t tail = tx_buffer_tail; @@ -144,11 +140,7 @@ uint8_t serial_read() } } -#ifdef __AVR_ATmega644P__ -ISR(USART0_RX_vect) -#else -ISR(USART_RX_vect) -#endif +ISR(Serial_RX_vect) { uint8_t data = UDR0; uint8_t next_head; diff --git a/serial.h b/serial.h index 723d48f..79ffb7e 100644 --- a/serial.h +++ b/serial.h @@ -27,6 +27,20 @@ #include "nuts_bolts.h" +#if defined(USART_RX_vect) // For atmega328p (Arduino Uno) etc. +#define Serial_RX_vect USART_RX_vect +#define Serial_UDRE_vect USART_UDRE_vect +#elif defined(USART0_RX_vect) // For atmega644p, atmega1280 and atmega2560 (ArduinoMEGA) etc. +#define Serial_RX_vect USART0_RX_vect +#define Serial_UDRE_vect USART0_UDRE_vect +#elif defined(USART_RXC_vect) // For some odd chips +#define Serial_RX_vect USART_RXC_vect +#define Serial_UDRE_vect USART_UDRE_vect +#elif defined(USART1_RX_vect)// Some AVRs have 1 USB and a single USART (USART1), though the USB is often preffered for serial comms (like Arduino Leonardo etc.) +#define Serial1_RX_vect USART1_RX_vect +#define Serial1_UDRE_vect USART1_UDRE_vect +#endif + #ifndef RX_BUFFER_SIZE #define RX_BUFFER_SIZE 128 #endif