From bb9018c094d95481d8ea41c99f8ab5ec702cf05f Mon Sep 17 00:00:00 2001 From: Mike Morrison Date: Fri, 9 Sep 2016 06:58:08 -0700 Subject: [PATCH] made pins configurable and added support for nano --- Multiprotocol/Multiprotocol.h | 162 ++++++++++++++++++++------------ Multiprotocol/Multiprotocol.ino | 65 +++++++++++-- Multiprotocol/Telemetry.ino | 18 ++-- Multiprotocol/_Config.h | 4 +- 4 files changed, 173 insertions(+), 76 deletions(-) diff --git a/Multiprotocol/Multiprotocol.h b/Multiprotocol/Multiprotocol.h index 195797d..68564d7 100644 --- a/Multiprotocol/Multiprotocol.h +++ b/Multiprotocol/Multiprotocol.h @@ -15,7 +15,7 @@ // Check selected board type #ifndef XMEGA -#if not defined(ARDUINO_AVR_PRO) && not defined(ARDUINO_AVR_MINI) +#if not defined(ARDUINO_AVR_PRO) && not defined(ARDUINO_AVR_MINI) && not defined(ARDUINO_AVR_NANO) #error You must select the board type "Arduino Pro or Pro Mini" or "Arduino Mini" #endif #if F_CPU != 16000000L || not defined(__AVR_ATmega328P__) @@ -185,22 +185,68 @@ struct PPM_Parameters //******************* //*** Pinouts *** //******************* + +#define TELEMETRY_SERIAL_TX_pin 2 +#define TELEMETRY_SERIAL_TX_port PORTD +#define TELEMETRY_SERIAL_TX_ddr DDRD +#define DEBUG_TX_pin 1 +#define DEBUG_TX_port PORTD +#define DEBUG_TX_ddr DDRD +#define MODE_DIAL1_PIN 2 +#define MODE_DIAL1_PORT PORTB +#define MODE_DIAL2_PIN 3 +#define MODE_DIAL2_PORT PORTB +#define MODE_DIAL3_PIN 4 +#define MODE_DIAL3_PORT PORTB +#define MODE_DIAL4_PIN 0 +#define MODE_DIAL4_PORT PORTC #define LED_pin 5 //D13 = PB5 +#define LED_port PORTB +#define LED_ddr DDRB #define BIND_pin 5 //D13 = PB5 +#define BIND_port PORTB +#define BIND_ipr PINB +#define BIND_ddr DDRB #define PPM_pin 3 //D3 = PD3 +#define PPM_port PORTD #ifdef XMEGA #define SDI_pin 6 //SDIO-D6 + #define SDI_port PORTD + #define SDI_ipr PIND + #define SDI_ddr DDRD #else #define SDI_pin 5 //D5 = PD5 + #define SDI_port PORTD + #define SDI_ipr PIND + #define SDI_ddr DDRD #endif -#define SCLK_pin 4 //D4 = PD4 +#define SCLK_pin 4 //D4 = PD4 +#define SCLK_port PORTD +#define SCLK_ddr DDRD #define A7105_CS_pin 2 //D2 = PD2 +#define A7105_CS_port PORTD +#define A7105_CS_ddr DDRD #define SDO_pin 6 //D6 = PD6 +#define SDO_port PORTD +#define SDO_ipr PIND #define CC25_CSN_pin 7 //D7 = PD7 +#define CC25_CSN_port PORTD +#define CC25_CSN_ddr DDRD #define NRF_CSN_pin 0 //D8 = PB0 +#define NRF_CSN_port PORTB +#define NRF_CSN_ddr DDRB #define CYRF_CSN_pin 1 //D9 = PB1 +#define CYRF_CSN_port PORTB +#define CYRF_CSN_ddr DDRB +#define CYRF_RST_pin 5 //D9 = PB1 +#define CYRF_RST_port PORTC +#define CYRF_RST_ddr DDRC #define CTRL1_pin 1 //A1 = PC1 +#define CTRL1_port PORTC +#define CTRL1_ddr DDRC #define CTRL2_pin 2 //A2 = PC2 +#define CTRL2_port PORTC +#define CTRL2_ddr DDRC // #ifdef XMEGA #define CTRL1_on @@ -208,53 +254,53 @@ struct PPM_Parameters #define CTRL2_on #define CTRL2_off #else - #define CTRL1_on PORTC |= _BV(1) - #define CTRL1_off PORTC &= ~_BV(1) - #define CTRL2_on PORTC |= _BV(2) - #define CTRL2_off PORTC &= ~_BV(2) + #define CTRL1_on CTRL1_port |= _BV(CTRL1_pin) + #define CTRL1_off CTRL1_port &= ~_BV(CTRL1_pin) + #define CTRL2_on CTRL2_port |= _BV(CTRL2_pin) + #define CTRL2_off CTRL2_port &= ~_BV(CTRL2_pin) #endif // #ifdef XMEGA - #define A7105_CS_on PORTD.OUTSET = _BV(4) //D4 - #define A7105_CS_off PORTD.OUTCLR = _BV(4) //D4 + #define A7105_CS_on A7105_CS_port.OUTSET = _BV(A7105_CS_pin) //D4 + #define A7105_CS_off A7105_CS_port.OUTCLR = _BV(A7105_CS_pin) //D4 #else - #define A7105_CS_on PORTD |= _BV(2) //D2 - #define A7105_CS_off PORTD &= ~_BV(2) //D2 + #define A7105_CS_on A7105_CS_port |= _BV(A7105_CS_pin) //D2 + #define A7105_CS_off A7105_CS_port &= ~_BV(A7105_CS_pin) //D2 #endif // #ifdef XMEGA - #define SCK_on PORTD.OUTSET = _BV(7) //D7 - #define SCK_off PORTD.OUTCLR = _BV(7) //D7 + #define SCK_on SCLK_port.OUTSET = _BV(SCLK_pin) //D7 + #define SCK_off SCLK_port.OUTCLR = _BV(SCLK_pin) //D7 #else - #define SCK_on PORTD |= _BV(4) //D4 - #define SCK_off PORTD &= ~_BV(4) //D4 + #define SCK_on SCLK_port |= _BV(SCLK_pin) //D4 + #define SCK_off SCLK_port &= ~_BV(SCLK_pin) //D4 #endif // #ifdef XMEGA - #define SDI_on PORTD.OUTSET = _BV(5) //D5 - #define SDI_off PORTD.OUTCLR = _BV(5) //D5 + #define SDI_on SDI_port.OUTSET = _BV(SDI_pin) //D5 + #define SDI_off SDI_port.OUTCLR = _BV(SDI_pin) //D5 #else - #define SDI_on PORTD |= _BV(5) //D5 - #define SDI_off PORTD &= ~_BV(5) //D5 + #define SDI_on SDI_port |= _BV(SDI_pin) //D5 + #define SDI_off SDI_port &= ~_BV(SDI_pin) //D5 #endif // #ifdef XMEGA - #define SDI_1 (PORTD.IN & _BV(SDI_pin)) == _BV(SDI_pin) //D5 - #define SDI_0 (PORTD.IN & _BV(SDI_pin)) == 0x00 //D5 + #define SDI_1 (SDI_port.IN & _BV(SDI_pin)) == _BV(SDI_pin) //D5 + #define SDI_0 (SDI_port.IN & _BV(SDI_pin)) == 0x00 //D5 #else - #define SDI_1 (PIND & _BV(SDI_pin)) == _BV(SDI_pin) //D5 - #define SDI_0 (PIND & _BV(SDI_pin)) == 0x00 //D5 + #define SDI_1 (SDI_ipr & _BV(SDI_pin)) == _BV(SDI_pin) //D5 + #define SDI_0 (SDI_ipr & _BV(SDI_pin)) == 0x00 //D5 #endif // -#define SDI_SET_INPUT DDRD &= ~_BV(5) //D5 -#define SDI_SET_OUTPUT DDRD |= _BV(5) //D5 +#define SDI_SET_INPUT SDI_ddr &= ~_BV(SDI_pin) //D5 +#define SDI_SET_OUTPUT SDI_ddr |= _BV(SDI_pin) //D5 // #ifdef XMEGA - #define CC25_CSN_on PORTD.OUTSET = _BV(7) //D7 - #define CC25_CSN_off PORTD.OUTCLR = _BV(7) //D7 + #define CC25_CSN_on CC25_CSN_port.OUTSET = _BV(CC25_CSN_pin) //D7 + #define CC25_CSN_off CC25_CSN_port.OUTCLR = _BV(CC25_CSN_pin) //D7 #else - #define CC25_CSN_on PORTD |= _BV(7) //D7 - #define CC25_CSN_off PORTD &= ~_BV(7) //D7 + #define CC25_CSN_on CC25_CSN_port |= _BV(CC25_CSN_pin) //D7 + #define CC25_CSN_off CC25_CSN_port &= ~_BV(CC25_CSN_pin) //D7 #endif // #ifdef XMEGA @@ -263,64 +309,64 @@ struct PPM_Parameters #define NRF_CE_on #define NRF_CE_off #else - #define NRF_CSN_on PORTB |= _BV(0) //D8 - #define NRF_CSN_off PORTB &= ~_BV(0) //D8 + #define NRF_CSN_on NRF_CSN_port |= _BV(NRF_CSN_pin) //D8 + #define NRF_CSN_off NRF_CSN_port &= ~_BV(NRF_CSN_pin) //D8 #define NRF_CE_on #define NRF_CE_off #endif // #ifdef XMEGA - #define CYRF_CSN_on PORTD.OUTSET = _BV(4) - #define CYRF_CSN_off PORTD.OUTCLR = _BV(4) + #define CYRF_CSN_on CYRF_CSN_port.OUTSET = _BV(CYRF_CSN_pin) + #define CYRF_CSN_off CYRF_CSN_port.OUTCLR = _BV(CYRF_CSN_pin) #else - #define CYRF_CSN_on PORTB |= _BV(1) //D9 - #define CYRF_CSN_off PORTB &= ~_BV(1) //D9 - #define CYRF_RST_HI PORTC |= _BV(5) //A5 - #define CYRF_RST_LO PORTC &= ~_BV(5) //A5 + #define CYRF_CSN_on CYRF_CSN_port |= _BV(CYRF_CSN_pin) //D9 + #define CYRF_CSN_off CYRF_CSN_port &= ~_BV(CYRF_CSN_pin) //D9 + #define CYRF_RST_HI CYRF_RST_port |= _BV(CYRF_RST_pin) //A5 + #define CYRF_RST_LO CYRF_RST_port &= ~_BV(CYRF_RST_pin) //A5 #define CYRF_RST_pin 5 #endif // #ifdef XMEGA - #define SDO_1 (PORTD.IN & _BV(SDO_pin)) == _BV(SDO_pin) //D6 - #define SDO_0 (PORTD.IN & _BV(SDO_pin)) == 0x00 //D6 + #define SDO_1 (SDO_port.IN & _BV(SDO_pin)) == _BV(SDO_pin) //D6 + #define SDO_0 (SDO_port.IN & _BV(SDO_pin)) == 0x00 //D6 #else - #define SDO_1 (PIND & _BV(SDO_pin)) == _BV(SDO_pin) //D6 - #define SDO_0 (PIND & _BV(SDO_pin)) == 0x00 //D6 + #define SDO_1 (SDO_ipr & _BV(SDO_pin)) == _BV(SDO_pin) //D6 + #define SDO_0 (SDO_ipr & _BV(SDO_pin)) == 0x00 //D6 #endif // // // LED #ifdef XMEGA - #define LED_ON PORTD.OUTCLR = _BV(1) - #define LED_OFF PORTD.OUTSET = _BV(1) - #define LED_TOGGLE PORTD.OUTTGL = _BV(1) - #define LED_SET_OUTPUT PORTD.DIRSET = _BV(1) - #define IS_LED_on ( (PORTD.OUT & _BV(1)) != 0x00 ) + #define LED_ON LED_port.OUTCLR = _BV(LED_pin) + #define LED_OFF LED_port.OUTSET = _BV(LED_pin) + #define LED_TOGGLE LED_port.OUTTGL = _BV(LED_pin) + #define LED_SET_OUTPUT LED_port.DIRSET = _BV(LED_pin) + #define IS_LED_on ( (LED_port.OUT & _BV(LED_pin)) != 0x00 ) #else - #define LED_ON PORTB |= _BV(5) - #define LED_OFF PORTB &= ~_BV(5) - #define LED_TOGGLE PORTB ^= _BV(5) - #define LED_SET_OUTPUT DDRB |= _BV(5) - #define IS_LED_on ( (PORTB & _BV(5)) != 0x00 ) + #define LED_ON LED_port |= _BV(LED_pin) + #define LED_OFF LED_port &= ~_BV(LED_pin) + #define LED_TOGGLE LED_port ^= _BV(LED_pin) + #define LED_SET_OUTPUT LED_ddr |= _BV(LED_pin) + #define IS_LED_on ( (LED_port & _BV(LED_pin)) != 0x00 ) #endif //BIND #ifdef XMEGA #define IS_BIND_BUTTON_on ( (PORTD.IN & _BV(2)) == 0x00 ) #else - #define BIND_SET_INPUT DDRB &= ~_BV(5) - #define BIND_SET_PULLUP PORTB |= _BV(5) - #define IS_BIND_BUTTON_on ( (PINB & _BV(5)) == 0x00 ) - #define BIND_SET_OUTPUT DDRB |= _BV(5) + #define BIND_SET_INPUT BIND_ddr &= ~_BV(BIND_pin) + #define BIND_SET_PULLUP BIND_port |= _BV(BIND_pin) + #define IS_BIND_BUTTON_on ( (BIND_ipr & _BV(BIND_pin)) == 0x00 ) + #define BIND_SET_OUTPUT BIND_ddr |= _BV(BIND_pin) #endif // TX #ifdef DEBUG_TX - #define TX_ON PORTD |= _BV(1) - #define TX_OFF PORTD &= ~_BV(1) - #define TX_TOGGLE PORTD ^= _BV(1) - #define TX_SET_OUTPUT DDRD |= _BV(1) + #define TX_ON DEBUG_TX_port |= _BV(DEBUG_TX_pin) + #define TX_OFF DEBUG_TX_port &= ~_BV(DEBUG_TX_pin) + #define TX_TOGGLE DEBUG_TX_port ^= _BV(DEBUG_TX_pin) + #define TX_SET_OUTPUT DEBUG_TX_ddr |= _BV(DEBUG_TX_pin) #else #define TX_ON #define TX_OFF diff --git a/Multiprotocol/Multiprotocol.ino b/Multiprotocol/Multiprotocol.ino index 8c51981..112c7af 100644 --- a/Multiprotocol/Multiprotocol.ino +++ b/Multiprotocol/Multiprotocol.ino @@ -172,11 +172,34 @@ void setup() TCC1.CTRLA = 0x0B ; // Event3 (prescale of 16) #else // General pinout - DDRD = _BV(A7105_CS_pin)|_BV(SDI_pin)|_BV(SCLK_pin)|_BV( CC25_CSN_pin);//pin output - DDRC = _BV(CTRL1_pin)|_BV(CTRL2_pin)|_BV(CYRF_RST_pin); //pin output - DDRB = _BV(NRF_CSN_pin)|_BV(CYRF_CSN_pin); //pin output - PORTB = _BV(2)|_BV(3)|_BV(4)|_BV(BIND_pin); //pullup on dial (D10=PB2,D11=PB3,D12=PB4) and bind button - PORTC = _BV(0); //pullup on dial (A0=PC0) + + // outputs +#ifdef A7105_INSTALLED + A7105_CS_ddr |= _BV(A7105_CS_pin); +#endif + SDI_SET_OUTPUT; + SCLK_ddr |= _BV(SCLK_pin); +#ifdef CC2500_INSTALLED + CC25_CSN_ddr |= _BV(CC25_CSN_pin); +#endif + CTRL1_ddr |= _BV(CTRL1_pin); + CTRL2_ddr |= _BV(CTRL2_pin); +#ifdef CYRF6936_INSTALLED + CYRF_RST_ddr |= _BV(CYRF_RST_pin); + CYRF_CSN_ddr |= _BV(CYRF_CSN_pin); +#endif +#ifdef NRF24L01_INSTALLED + NRF_CSN_ddr |= _BV(NRF_CSN_pin); +#endif + + //pullup on dial (D10=PB2,D11=PB3,D12=PB4) and bind button + MODE_DIAL1_PORT |= _BV(MODE_DIAL1_PIN); + MODE_DIAL2_PORT |= _BV(MODE_DIAL2_PIN); + MODE_DIAL3_PORT |= _BV(MODE_DIAL3_PIN); + MODE_DIAL4_PORT |= _BV(MODE_DIAL4_PIN); + BIND_port |= _BV(BIND_pin); + + #ifdef DEBUG_TX TX_SET_OUTPUT; #endif @@ -188,10 +211,18 @@ void setup() #endif // Set Chip selects +#ifdef A7105_INSTALLED A7105_CS_on; +#endif +#ifdef CC2500_INSTALLED CC25_CSN_on; +#endif +#ifdef NRF24L01_INSTALLED NRF_CSN_on; +#endif +#ifdef CYRF6936_INSTALLED CYRF_CSN_on; +#endif // Set SPI lines SDI_on; SCK_off; @@ -216,7 +247,11 @@ void setup() #ifndef ENABLE_PPM mode_select = MODE_SERIAL ; // force serial mode #else - mode_select=0x0F - ( ( (PINB>>2)&0x07 ) | ( (PINC<<3)&0x08) );//encoder dip switches 1,2,4,8=>B2,B3,B4,C0 + mode_select = + ((MODE_DIAL1_PORT & MODE_DIAL1_PIN) ? 1 : 0) + + ((MODE_DIAL2_PORT & MODE_DIAL2_PIN) ? 2 : 0) + + ((MODE_DIAL3_PORT & MODE_DIAL3_PIN) ? 4 : 0) + + ((MODE_DIAL4_PORT & MODE_DIAL4_PIN) ? 8 : 0); #endif // Update LED @@ -254,8 +289,16 @@ void setup() protocol_init(); //Configure PPM interrupt - EICRA |=_BV(ISC11); // The rising edge of INT1 pin D3 generates an interrupt request + #if PPM_pin == 2 + EICRA |= _BV(ISC01); // The rising edge of INT1 pin D3 generates an interrupt request + EIMSK |= _BV(INT0); // INT1 interrupt enable + #elif PPM_pin == 3 + EICRA |= _BV(ISC11); // The rising edge of INT1 pin D3 generates an interrupt request EIMSK |= _BV(INT1); // INT1 interrupt enable + #else + #error PPM pin can only be 2 or 3 + #endif + #if defined(TELEMETRY) PPM_Telemetry_serial_init(); // Configure serial for telemetry @@ -1097,10 +1140,18 @@ void init() //PPM #ifdef ENABLE_PPM #ifdef XMEGA +#if PPM_pin == 2 ISR(PORTD_INT0_vect) #else +ISR(PORTD_INT1_vect) +#endif +#else +#if PPM_pin == 2 +ISR(INT0_vect, ISR_NOBLOCK) +#else ISR(INT1_vect, ISR_NOBLOCK) #endif +#endif { // Interrupt on PPM pin static int8_t chan=-1; static uint16_t Prev_TCNT1=0; diff --git a/Multiprotocol/Telemetry.ino b/Multiprotocol/Telemetry.ino index 44ea947..24ffc83 100644 --- a/Multiprotocol/Telemetry.ino +++ b/Multiprotocol/Telemetry.ino @@ -588,11 +588,11 @@ void initTXSerial( uint8_t speed) { TIMSK0 = 0 ; // Stop all timer 0 interrupts #ifdef INVERT_SERIAL - PORTD &= ~2 ; + TELEMETRY_SERIAL_TX_port &= ~_BV(TELEMETRY_SERIAL_TX_pin); #else - PORTD |= 2 ; + TELEMETRY_SERIAL_TX_port |= _BV(TELEMETRY_SERIAL_TX_pin); #endif - DDRD |= 2 ; // TxD pin is an output + TELEMETRY_SERIAL_TX_ddr |= _BV(TELEMETRY_SERIAL_TX_pin) ; // TxD pin is an output UCSR0B &= ~(1<>= 1 GPIOR0 = byte ; @@ -732,11 +732,11 @@ ISR(TIMER0_COMPB_vect) byte = GPIOR2 ; if ( byte & 0x01 ) { - PORTD |= 0x02 ; + TELEMETRY_SERIAL_TX_port |= _BV(TELEMETRY_SERIAL_TX_pin); } else { - PORTD &= ~0x02 ; + TELEMETRY_SERIAL_TX_port &= ~_BV(TELEMETRY_SERIAL_TX_pin); } byte /= 2 ; // Generates shorter code than byte >>= 1 GPIOR2 = byte ; @@ -787,11 +787,11 @@ ISR(TIMER0_OVF_vect) } if ( byte & 0x01 ) { - PORTD |= 0x02 ; + TELEMETRY_SERIAL_TX_port |= _BV(TELEMETRY_SERIAL_TX_pin); } else { - PORTD &= ~0x02 ; + TELEMETRY_SERIAL_TX_port &= ~_BV(TELEMETRY_SERIAL_TX_pin); } byte /= 2 ; // Generates shorter code than byte >>= 1 if ( GPIOR1 > 2 ) diff --git a/Multiprotocol/_Config.h b/Multiprotocol/_Config.h index 7316233..9468a65 100644 --- a/Multiprotocol/_Config.h +++ b/Multiprotocol/_Config.h @@ -36,7 +36,7 @@ #define A7105_INSTALLED #define CYRF6936_INSTALLED #define CC2500_INSTALLED -#define NFR24L01_INSTALLED +#define NRF24L01_INSTALLED //Bellow is the list of all available protocols. Comment the protocols you are not using with "//" to save Flash space. #ifdef A7105_INSTALLED @@ -54,7 +54,7 @@ #define FRSKYX_CC2500_INO #define SFHSS_CC2500_INO #endif -#ifdef NFR24L01_INSTALLED +#ifdef NRF24L01_INSTALLED #define BAYANG_NRF24L01_INO #define CG023_NRF24L01_INO #define CX10_NRF24L01_INO