diff --git a/Multiprotocol/A7105_SPI.ino b/Multiprotocol/A7105_SPI.ino index f5c83d2..8327c77 100644 --- a/Multiprotocol/A7105_SPI.ino +++ b/Multiprotocol/A7105_SPI.ino @@ -23,12 +23,12 @@ void A7105_WriteData(uint8_t len, uint8_t channel) { uint8_t i; - A7105_CS_off; + A7105_CSN_off; SPI_Write(A7105_RST_WRPTR); SPI_Write(0x05); for (i = 0; i < len; i++) SPI_Write(packet[i]); - A7105_CS_on; + A7105_CSN_on; A7105_WriteReg(0x0F, channel); A7105_Strobe(A7105_TX); } @@ -36,44 +36,44 @@ void A7105_WriteData(uint8_t len, uint8_t channel) void A7105_ReadData() { uint8_t i; A7105_Strobe(0xF0); //A7105_RST_RDPTR - A7105_CS_off; + A7105_CSN_off; SPI_Write(0x45); for (i=0;i<16;i++) packet[i]=A7105_Read(); - A7105_CS_on; + A7105_CSN_on; } void A7105_WriteReg(uint8_t address, uint8_t data) { - A7105_CS_off; + A7105_CSN_off; SPI_Write(address); NOP(); SPI_Write(data); - A7105_CS_on; + A7105_CSN_on; } uint8_t A7105_ReadReg(uint8_t address) { uint8_t result; - A7105_CS_off; + A7105_CSN_off; SPI_Write(address |=0x40); //bit 6 =1 for reading result = A7105_Read(); - A7105_CS_on; + A7105_CSN_on; return(result); } uint8_t A7105_Read(void) { uint8_t result=0; - SDI_SET_INPUT; + SDI_input; for(uint8_t i=0;i<8;i++) { result=result<<1; if(SDI_1) ///if SDIO =1 result |= 0x01; - SCK_on; + SCLK_on; NOP(); - SCK_off; + SCLK_off; } - SDI_SET_OUTPUT; + SDI_output; return result; } @@ -110,13 +110,13 @@ uint8_t A7105_Reset() } void A7105_WriteID(uint32_t ida) { - A7105_CS_off; + A7105_CSN_off; SPI_Write(0x06);//ex id=0x5475c52a ;txid3txid2txid1txid0 SPI_Write((ida>>24)&0xff);//53 SPI_Write((ida>>16)&0xff);//75 SPI_Write((ida>>8)&0xff);//c5 SPI_Write((ida>>0)&0xff);//2a - A7105_CS_on; + A7105_CSN_on; } /* @@ -162,9 +162,9 @@ void A7105_SetPower() } void A7105_Strobe(uint8_t address) { - A7105_CS_off; + A7105_CSN_off; SPI_Write(address); - A7105_CS_on; + A7105_CSN_on; } const uint8_t PROGMEM HUBSAN_A7105_regs[] = { diff --git a/Multiprotocol/DSM_cyrf6936.ino b/Multiprotocol/DSM_cyrf6936.ino index ea27d71..609f6f6 100644 --- a/Multiprotocol/DSM_cyrf6936.ino +++ b/Multiprotocol/DSM_cyrf6936.ino @@ -428,6 +428,7 @@ uint16_t ReadDsm() CYRF_ConfigDataCode((const uint8_t *)"\x98\x88\x1B\xE4\x30\x79\x03\x84\xC9\x2C\x06\x93\x86\xB9\x9E", 16); CYRF_SetTxRxMode(RX_EN); //Receive mode CYRF_WriteRegister(CYRF_05_RX_CTRL, 0x83); //Prepare to receive + bind_counter=300; phase++; // change from BIND_CHECK to BIND_READ return 2000; case DSM_BIND_READ: @@ -447,7 +448,7 @@ uint16_t ReadDsm() pkt[0]=0x80; telemetry_link=1; // send received data on serial CYRF_WriteRegister(CYRF_29_RX_ABORT, 0x20); - CYRF_SetTxRxMode(TX_EN); //Write mode + CYRF_SetTxRxMode(TX_EN); // Write mode phase++; return 2000; } @@ -458,8 +459,13 @@ uint16_t ReadDsm() while ((uint16_t)micros()-start < 100) // Wait max 100 µs if((CYRF_ReadRegister(CYRF_0F_XACT_CFG) & 0x20) == 0) break; - CYRF_WriteRegister(CYRF_0F_XACT_CFG, 0x0C); // Read - CYRF_WriteRegister(CYRF_05_RX_CTRL, 0x83); //Prepare to receive + if( --bind_counter == 0 ) + { + phase++; // Exit if no answer has been received for some time + return 7000 ; + } + CYRF_WriteRegister(CYRF_0F_XACT_CFG, 0x0C); // Read mode + CYRF_WriteRegister(CYRF_05_RX_CTRL, 0x83); // Prepare to receive return 7000; case DSM_CHANSEL: BIND_DONE; diff --git a/Multiprotocol/Multiprotocol.h b/Multiprotocol/Multiprotocol.h index 396bea0..1e19dac 100644 --- a/Multiprotocol/Multiprotocol.h +++ b/Multiprotocol/Multiprotocol.h @@ -181,194 +181,188 @@ 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 +// TX +#define SERIAL_TX_pin 1 // PD1 +#define SERIAL_TX_port PORTD +#define SERIAL_TX_ddr DDRD +#define SERIAL_TX_output SERIAL_TX_ddr |= _BV(SERIAL_TX_pin) +#define SERIAL_TX_on SERIAL_TX_port |= _BV(SERIAL_TX_pin) +#define SERIAL_TX_off SERIAL_TX_port &= ~_BV(SERIAL_TX_pin) +#ifdef DEBUG_TX + #define DEBUG_TX_on SERIAL_TX_ON + #define DEBUG_TX_off SERIAL_TX_OFF + #define DEBUG_TX_toggle SERIAL_TX_port ^= _BV(SERIAL_TX_pin) #else - #define SDI_pin 5 //D5 = PD5 - #define SDI_port PORTD - #define SDI_ipr PIND - #define SDI_ddr DDRD + #define DEBUG_TX_on + #define DEBUG_TX_off + #define DEBUG_TX_toggle #endif -#define SCLK_pin 4 //D4 = PD4 + +// Dial +#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 + +// PPM +#define PPM_pin 3 //D3 = PD3 +#define PPM_port PORTD + +// SDIO +#define SDI_pin 5 //D5 = PD5 +#define SDI_port PORTD +#define SDI_ipr PIND +#define SDI_ddr DDRD +#ifdef XMEGA + #define SDI_on SDI_port.OUTSET = _BV(SDI_pin) + #define SDI_off SDI_port.OUTCLR = _BV(SDI_pin) +#else + #define SDI_on SDI_port |= _BV(SDI_pin) + #define SDI_off SDI_port &= ~_BV(SDI_pin) + #define SDI_1 (SDI_ipr & _BV(SDI_pin)) != 0x00 + #define SDI_0 (SDI_ipr & _BV(SDI_pin)) == 0x00 +#endif +#define SDI_input SDI_ddr &= ~_BV(SDI_pin) +#define SDI_output SDI_ddr |= _BV(SDI_pin) + +//SDO +#define SDO_pin 6 //D6 = PD6 +#define SDO_port PORTD +#define SDO_ipr PIND +#ifdef XMEGA + #define SDO_1 (SDO_port.IN & _BV(SDO_pin)) != 0x00 + #define SDO_0 (SDO_port.IN & _BV(SDO_pin)) == 0x00 +#else + #define SDO_1 (SDO_ipr & _BV(SDO_pin)) != 0x00 + #define SDO_0 (SDO_ipr & _BV(SDO_pin)) == 0x00 +#endif + +// SCLK #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 - #define CTRL1_off - #define CTRL2_on - #define CTRL2_off + #define SCLK_pin 7 //D7 + #define SCLK_on SCLK_port.OUTSET = _BV(SCLK_pin) + #define SCLK_off SCLK_port.OUTCLR = _BV(SCLK_pin) #else - #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) + #define SCLK_pin 4 //D4 = PD4 + #define SCLK_output SCLK_ddr |= _BV(SCLK_pin) + #define SCLK_on SCLK_port |= _BV(SCLK_pin) + #define SCLK_off SCLK_port &= ~_BV(SCLK_pin) #endif -// + +// A7105 +#define A7105_CSN_pin 2 //D2 = PD2 +#define A7105_CSN_port PORTD +#define A7105_CSN_ddr DDRD +#define A7105_CSN_output A7105_CSN_ddr |= _BV(A7105_CSN_pin) +#define A7105_CSN_on A7105_CSN_port |= _BV(A7105_CSN_pin) +#define A7105_CSN_off A7105_CSN_port &= ~_BV(A7105_CSN_pin) + +// CC2500 +#define CC25_CSN_pin 7 //D7 = PD7 +#define CC25_CSN_port PORTD +#define CC25_CSN_ddr DDRD +#define CC25_CSN_output CC25_CSN_ddr |= _BV(CC25_CSN_pin) +#define CC25_CSN_on CC25_CSN_port |= _BV(CC25_CSN_pin) +#define CC25_CSN_off CC25_CSN_port &= ~_BV(CC25_CSN_pin) + +// NRF24L01 +#define NRF_CSN_pin 0 //D8 = PB0 +#define NRF_CSN_port PORTB +#define NRF_CSN_ddr DDRB +#define NRF_CSN_output NRF_CSN_ddr |= _BV(NRF_CSN_pin) +#define NRF_CSN_on NRF_CSN_port |= _BV(NRF_CSN_pin) +#define NRF_CSN_off NRF_CSN_port &= ~_BV(NRF_CSN_pin) +#define NRF_CE_on +#define NRF_CE_off + +// CYRF6936 #ifdef XMEGA - #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 + #define CYRF_CSN_pin 4 //D4 + #define CYRF_CSN_port PORTD + #define CYRF_CSN_ddr DDRD + #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 A7105_CS_on A7105_CS_port |= _BV(A7105_CS_pin) //D2 - #define A7105_CS_off A7105_CS_port &= ~_BV(A7105_CS_pin) //D2 + #define CYRF_CSN_pin 1 //D9 = PB1 + #define CYRF_CSN_port PORTB + #define CYRF_CSN_ddr DDRB + #define CYRF_CSN_output CYRF_CSN_ddr |= _BV(CYRF_CSN_pin) + #define CYRF_CSN_on CYRF_CSN_port |= _BV(CYRF_CSN_pin) + #define CYRF_CSN_off CYRF_CSN_port &= ~_BV(CYRF_CSN_pin) + + #define CYRF_RST_pin 5 //A5 = PC5 + #define CYRF_RST_port PORTC + #define CYRF_RST_ddr DDRC + #define CYRF_RST_output CYRF_RST_ddr |= _BV(CYRF_RST_pin) + #define CYRF_RST_HI CYRF_RST_port |= _BV(CYRF_RST_pin) + #define CYRF_RST_LO CYRF_RST_port &= ~_BV(CYRF_RST_pin) #endif -// + +//RF Switch #ifdef XMEGA - #define SCK_on SCLK_port.OUTSET = _BV(SCLK_pin) //D7 - #define SCK_off SCLK_port.OUTCLR = _BV(SCLK_pin) //D7 + #define PE1_on + #define PE1_off + #define PE2_on + #define PE2_off #else - #define SCK_on SCLK_port |= _BV(SCLK_pin) //D4 - #define SCK_off SCLK_port &= ~_BV(SCLK_pin) //D4 + #define PE1_pin 1 //A1 = PC1 + #define PE1_port PORTC + #define PE1_ddr DDRC + #define PE1_output PE1_ddr |= _BV(PE1_pin) + #define PE1_on PE1_port |= _BV(PE1_pin) + #define PE1_off PE1_port &= ~_BV(PE1_pin) + + #define PE2_pin 2 //A2 = PC2 + #define PE2_port PORTC + #define PE2_ddr DDRC + #define PE2_output PE2_ddr |= _BV(PE2_pin) + #define PE2_on PE2_port |= _BV(PE2_pin) + #define PE2_off PE2_port &= ~_BV(PE2_pin) #endif -// -#ifdef XMEGA - #define SDI_on SDI_port.OUTSET = _BV(SDI_pin) //D5 - #define SDI_off SDI_port.OUTCLR = _BV(SDI_pin) //D5 -#else - #define SDI_on SDI_port |= _BV(SDI_pin) //D5 - #define SDI_off SDI_port &= ~_BV(SDI_pin) //D5 -#endif -// -#ifdef XMEGA - #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 (SDI_ipr & _BV(SDI_pin)) == _BV(SDI_pin) //D5 - #define SDI_0 (SDI_ipr & _BV(SDI_pin)) == 0x00 //D5 -#endif -// -#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 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 CC25_CSN_port |= _BV(CC25_CSN_pin) //D7 - #define CC25_CSN_off CC25_CSN_port &= ~_BV(CC25_CSN_pin) //D7 -#endif -// -#ifdef XMEGA - #define NRF_CSN_on - #define NRF_CSN_off - #define NRF_CE_on - #define NRF_CE_off -#else - #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 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 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 (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 (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 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 ) + #define LED_pin 1 //PD1 + #define LED_port PORTD + #define LED_ddr DDRD + #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_output LED_port.DIRSET = _BV(LED_pin) + #define IS_LED_on ( (LED_port.OUT & _BV(LED_pin)) != 0x00 ) #else - #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 ) + #define LED_pin 5 //D13 = PB5 + #define LED_port PORTB + #define LED_ddr DDRB + #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_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 ) + #define BIND_pin 2 //PD2 + #define BIND_port PORTD + #define IS_BIND_BUTTON_on ( (BIND_port.IN & _BV(BIND_pin)) == 0x00 ) #else + #define BIND_pin 5 //D13 = PB5 + #define BIND_port PORTB + #define BIND_ipr PINB + #define BIND_ddr DDRB #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 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 - #define TX_TOGGLE - #define TX_SET_OUTPUT -#endif - // Macros #define NOP() __asm__ __volatile__("nop") #define BV(bit) (1 << bit) @@ -674,4 +668,3 @@ Serial: 100000 Baud 8e2 _ xxxx xxxx p -- 2047 +125% Channels bits are concatenated to fit in 22 bytes like in SBUS protocol */ - diff --git a/Multiprotocol/Multiprotocol.ino b/Multiprotocol/Multiprotocol.ino index 112c7af..2694055 100644 --- a/Multiprotocol/Multiprotocol.ino +++ b/Multiprotocol/Multiprotocol.ino @@ -33,7 +33,7 @@ #undef ENABLE_PPM // Disable PPM for orange module #undef A7105_INSTALLED // Disable A7105 for orange module #undef CC2500_INSTALLED // Disable CC2500 for orange module - #undef NFR24L01_INSTALLED // Disable NRF for orange module + #undef NRF24L01_INSTALLED // Disable NRF for orange module #endif //Global constants/variables @@ -172,60 +172,59 @@ void setup() TCC1.CTRLA = 0x0B ; // Event3 (prescale of 16) #else // General pinout - - // 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; + // all inputs + DDRB=DDRC=DDRD=0x00; + // outputs + SDI_output; + SCLK_output; + #ifdef A7105_INSTALLED + A7105_CSN_output; #endif + #ifdef CC2500_INSTALLED + CC25_CSN_output; + #endif + #ifdef CYRF6936_INSTALLED + CYRF_RST_output; + CYRF_CSN_output; + #endif + #ifdef NRF24L01_INSTALLED + NRF_CSN_output; + #endif + PE1_output; + PE2_output; + SERIAL_TX_output; + + // pullups + 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); // Timer1 config TCCR1A = 0; TCCR1B = (1 << CS11); //prescaler8, set timer1 to increment every 0.5us(16Mhz) and start timer + + // Random random_init(); #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 + #ifdef A7105_INSTALLED + A7105_CSN_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; + SCLK_off; // Set servos positions for(uint8_t i=0;i led on + LED_off; //bind completed -> led on else blink+=BLINK_BIND_TIME; //blink fastly during binding - LED_TOGGLE; + LED_toggle; } } @@ -504,21 +502,21 @@ static void protocol_init() else BIND_DONE; - CTRL1_on; //NRF24L01 antenna RF3 by default - CTRL2_off; //NRF24L01 antenna RF3 by default + PE1_on; //NRF24L01 antenna RF3 by default + PE2_off; //NRF24L01 antenna RF3 by default switch(protocol) // Init the requested protocol { #if defined(FLYSKY_A7105_INO) case MODE_FLYSKY: - CTRL1_off; //antenna RF1 + PE1_off; //antenna RF1 next_callback = initFlySky(); remote_callback = ReadFlySky; break; #endif #if defined(HUBSAN_A7105_INO) case MODE_HUBSAN: - CTRL1_off; //antenna RF1 + PE1_off; //antenna RF1 if(IS_BIND_BUTTON_FLAG_on) random_id(10,true); // Generate new ID if bind button is pressed. next_callback = initHubsan(); remote_callback = ReadHubsan; @@ -526,39 +524,39 @@ static void protocol_init() #endif #if defined(FRSKYD_CC2500_INO) case MODE_FRSKYD: - CTRL1_off; //antenna RF2 - CTRL2_on; + PE1_off; //antenna RF2 + PE2_on; next_callback = initFrSky_2way(); remote_callback = ReadFrSky_2way; break; #endif #if defined(FRSKYV_CC2500_INO) case MODE_FRSKYV: - CTRL1_off; //antenna RF2 - CTRL2_on; + PE1_off; //antenna RF2 + PE2_on; next_callback = initFRSKYV(); remote_callback = ReadFRSKYV; break; #endif #if defined(FRSKYX_CC2500_INO) case MODE_FRSKYX: - CTRL1_off; //antenna RF2 - CTRL2_on; + PE1_off; //antenna RF2 + PE2_on; next_callback = initFrSkyX(); remote_callback = ReadFrSkyX; break; #endif #if defined(SFHSS_CC2500_INO) case MODE_SFHSS: - CTRL1_off; //antenna RF2 - CTRL2_on; + PE1_off; //antenna RF2 + PE2_on; next_callback = initSFHSS(); remote_callback = ReadSFHSS; break; #endif #if defined(DSM_CYRF6936_INO) case MODE_DSM: - CTRL2_on; //antenna RF4 + PE2_on; //antenna RF4 next_callback = initDsm(); //Servo_data[2]=1500;//before binding remote_callback = ReadDsm; @@ -581,14 +579,14 @@ static void protocol_init() } } #endif //ENABLE_PPM - CTRL2_on; //antenna RF4 + PE2_on; //antenna RF4 next_callback = DevoInit(); remote_callback = devo_callback; break; #endif #if defined(J6PRO_CYRF6936_INO) case MODE_J6PRO: - CTRL2_on; //antenna RF4 + PE2_on; //antenna RF4 next_callback = initJ6Pro(); remote_callback = ReadJ6Pro; break; @@ -790,7 +788,7 @@ void modules_reset() #ifdef CYRF6936_INSTALLED CYRF_Reset(); #endif - #ifdef NFR24L01_INSTALLED + #ifdef NRF24L01_INSTALLED NRF24L01_Reset(); #endif @@ -971,7 +969,7 @@ void SPI_Write(uint8_t command) { uint8_t n=8; - SCK_off;//SCK start low + SCLK_off;//SCK start low XNOP(); SDI_off; XNOP(); @@ -982,11 +980,11 @@ void SPI_Write(uint8_t command) else SDI_off; XNOP(); - SCK_on; + SCLK_on; XNOP(); XNOP(); command = command << 1; - SCK_off; + SCLK_off; XNOP(); } while(--n) ; @@ -1001,11 +999,11 @@ uint8_t SPI_Read(void) result=result<<1; if(SDO_1) result |= 0x01; - SCK_on; + SCLK_on; XNOP(); XNOP(); NOP(); - SCK_off; + SCLK_off; XNOP(); XNOP(); } @@ -1124,11 +1122,11 @@ void delayMicroseconds(unsigned int us) } #ifndef XMEGA -void init() -{ - // this needs to be called before setup() or some functions won't work there - sei(); -} + void init() + { + // this needs to be called before setup() or some functions won't work there + sei(); + } #endif //XMEGA /**************************/ @@ -1139,145 +1137,145 @@ 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; - uint16_t Cur_TCNT1; + #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; + uint16_t Cur_TCNT1; - Cur_TCNT1 = TCNT1 - Prev_TCNT1 ; // Capture current Timer1 value - if(Cur_TCNT1<1000) - chan=-1; // bad frame - else - if(Cur_TCNT1>4840) - { - chan=0; // start of frame - PPM_FLAG_on; // full frame present (even at startup since PPM_data has been initialized) - } + Cur_TCNT1 = TCNT1 - Prev_TCNT1 ; // Capture current Timer1 value + if(Cur_TCNT1<1000) + chan=-1; // bad frame else - if(chan!=-1) // need to wait for start of frame - { //servo values between 500us and 2420us will end up here - PPM_data[chan]= Cur_TCNT1>>1;; - if(chan++>=NUM_CHN) - chan=-1; // don't accept any new channels + if(Cur_TCNT1>4840) + { + chan=0; // start of frame + PPM_FLAG_on; // full frame present (even at startup since PPM_data has been initialized) } - Prev_TCNT1+=Cur_TCNT1; -} + else + if(chan!=-1) // need to wait for start of frame + { //servo values between 500us and 2420us will end up here + PPM_data[chan]= Cur_TCNT1>>1;; + if(chan++>=NUM_CHN) + chan=-1; // don't accept any new channels + } + Prev_TCNT1+=Cur_TCNT1; + } #endif //ENABLE_PPM //Serial RX #ifdef ENABLE_SERIAL -#ifdef XMEGA -ISR(USARTC0_RXC_vect) -#else -ISR(USART_RX_vect) -#endif -{ // RX interrupt - static uint8_t idx=0; #ifdef XMEGA - if((USARTC0.STATUS & 0x1C)==0) // Check frame error, data overrun and parity error + ISR(USARTC0_RXC_vect) #else - UCSR0B &= ~_BV(RXCIE0) ; // RX interrupt disable - sei() ; - if((UCSR0A&0x1C)==0) // Check frame error, data overrun and parity error + ISR(USART_RX_vect) #endif - { // received byte is ok to process - if(idx==0||discard_frame==1) - { // Let's try to sync at this point - idx=0;discard_frame=0; - RX_MISSED_BUFF_off; // If rx_buff was good it's not anymore... - rx_buff[0]=UDR0; - if((rx_buff[0]&0xFE)==0x54) // If 1st byte is 0x54 or 0x55 it looks ok + { // RX interrupt + static uint8_t idx=0; + #ifdef XMEGA + if((USARTC0.STATUS & 0x1C)==0) // Check frame error, data overrun and parity error + #else + UCSR0B &= ~_BV(RXCIE0) ; // RX interrupt disable + sei() ; + if((UCSR0A&0x1C)==0) // Check frame error, data overrun and parity error + #endif + { // received byte is ok to process + if(idx==0||discard_frame==1) + { // Let's try to sync at this point + idx=0;discard_frame=0; + RX_MISSED_BUFF_off; // If rx_buff was good it's not anymore... + rx_buff[0]=UDR0; + if((rx_buff[0]&0xFE)==0x54) // If 1st byte is 0x54 or 0x55 it looks ok + { + TX_RX_PAUSE_on; + tx_pause(); + OCR1B = TCNT1+(6500L) ; // Full message should be received within timer of 3250us + TIFR1 = OCF1B_bm ; // clear OCR1B match flag + SET_TIMSK1_OCIE1B ; // enable interrupt on compare B match + idx++; + } + } + else { - TX_RX_PAUSE_on; - tx_pause(); - OCR1B = TCNT1+(6500L) ; // Full message should be received within timer of 3250us - TIFR1 = OCF1B_bm ; // clear OCR1B match flag - SET_TIMSK1_OCIE1B ; // enable interrupt on compare B match - idx++; + rx_buff[idx++]=UDR0; // Store received byte + if(idx>=RXBUFFER_SIZE) + { // A full frame has been received + if(!IS_RX_DONOTUPDTAE_on) + { //Good frame received and main is not working on the buffer + memcpy((void*)rx_ok_buff,(const void*)rx_buff,RXBUFFER_SIZE);// Duplicate the buffer + RX_FLAG_on; // flag for main to process servo data + } + else + RX_MISSED_BUFF_on; // notify that rx_buff is good + discard_frame=1; // start again + } } } else { - rx_buff[idx++]=UDR0; // Store received byte - if(idx>=RXBUFFER_SIZE) - { // A full frame has been received - if(!IS_RX_DONOTUPDTAE_on) - { //Good frame received and main is not working on the buffer - memcpy((void*)rx_ok_buff,(const void*)rx_buff,RXBUFFER_SIZE);// Duplicate the buffer - RX_FLAG_on; // flag for main to process servo data - } - else - RX_MISSED_BUFF_on; // notify that rx_buff is good - discard_frame=1; // start again - } + idx=UDR0; // Dummy read + discard_frame=1; // Error encountered discard full frame... } + if(discard_frame==1) + { + CLR_TIMSK1_OCIE1B; // Disable interrupt on compare B match + TX_RX_PAUSE_off; + tx_resume(); + } + #ifndef XMEGA + cli() ; + UCSR0B |= _BV(RXCIE0) ; // RX interrupt enable + #endif } - else - { - idx=UDR0; // Dummy read - discard_frame=1; // Error encountered discard full frame... - } - if(discard_frame==1) - { - CLR_TIMSK1_OCIE1B; // Disable interrupt on compare B match - TX_RX_PAUSE_off; + + //Serial timer + #ifdef XMEGA + ISR(TCC1_CCB_vect) + #else + ISR(TIMER1_COMPB_vect, ISR_NOBLOCK ) + #endif + { // Timer1 compare B interrupt + discard_frame=1; + CLR_TIMSK1_OCIE1B; // Disable interrupt on compare B match tx_resume(); } - #ifndef XMEGA - cli() ; - UCSR0B |= _BV(RXCIE0) ; // RX interrupt enable - #endif -} - -//Serial timer -#ifdef XMEGA -ISR(TCC1_CCB_vect) -#else -ISR(TIMER1_COMPB_vect, ISR_NOBLOCK ) -#endif -{ // Timer1 compare B interrupt - discard_frame=1; - CLR_TIMSK1_OCIE1B; // Disable interrupt on compare B match - tx_resume(); -} #endif //ENABLE_SERIAL #ifndef XMEGA -// Random interrupt service routine called every time the WDT interrupt is triggered. -// It is only enabled at startup to generate a seed. -ISR(WDT_vect) -{ - static uint8_t gWDT_buffer_position=0; - #define gWDT_buffer_SIZE 32 - static uint8_t gWDT_buffer[gWDT_buffer_SIZE]; - gWDT_buffer[gWDT_buffer_position] = TCNT1L; // Record the Timer 1 low byte (only one needed) - gWDT_buffer_position++; // every time the WDT interrupt is triggered - if (gWDT_buffer_position >= gWDT_buffer_SIZE) + // Random interrupt service routine called every time the WDT interrupt is triggered. + // It is only enabled at startup to generate a seed. + ISR(WDT_vect) { - // The following code is an implementation of Jenkin's one at a time hash - for(uint8_t gWDT_loop_counter = 0; gWDT_loop_counter < gWDT_buffer_SIZE; ++gWDT_loop_counter) + static uint8_t gWDT_buffer_position=0; + #define gWDT_buffer_SIZE 32 + static uint8_t gWDT_buffer[gWDT_buffer_SIZE]; + gWDT_buffer[gWDT_buffer_position] = TCNT1L; // Record the Timer 1 low byte (only one needed) + gWDT_buffer_position++; // every time the WDT interrupt is triggered + if (gWDT_buffer_position >= gWDT_buffer_SIZE) { - gWDT_entropy += gWDT_buffer[gWDT_loop_counter]; - gWDT_entropy += (gWDT_entropy << 10); - gWDT_entropy ^= (gWDT_entropy >> 6); + // The following code is an implementation of Jenkin's one at a time hash + for(uint8_t gWDT_loop_counter = 0; gWDT_loop_counter < gWDT_buffer_SIZE; ++gWDT_loop_counter) + { + gWDT_entropy += gWDT_buffer[gWDT_loop_counter]; + gWDT_entropy += (gWDT_entropy << 10); + gWDT_entropy ^= (gWDT_entropy >> 6); + } + gWDT_entropy += (gWDT_entropy << 3); + gWDT_entropy ^= (gWDT_entropy >> 11); + gWDT_entropy += (gWDT_entropy << 15); + WDTCSR = 0; // Disable Watchdog interrupt } - gWDT_entropy += (gWDT_entropy << 3); - gWDT_entropy ^= (gWDT_entropy >> 11); - gWDT_entropy += (gWDT_entropy << 15); - WDTCSR = 0; // Disable Watchdog interrupt } -} #endif diff --git a/Multiprotocol/Telemetry.ino b/Multiprotocol/Telemetry.ino index 24ffc83..88fda00 100644 --- a/Multiprotocol/Telemetry.ino +++ b/Multiprotocol/Telemetry.ino @@ -588,11 +588,10 @@ void initTXSerial( uint8_t speed) { TIMSK0 = 0 ; // Stop all timer 0 interrupts #ifdef INVERT_SERIAL - TELEMETRY_SERIAL_TX_port &= ~_BV(TELEMETRY_SERIAL_TX_pin); + SERIAL_TX_off; #else - TELEMETRY_SERIAL_TX_port |= _BV(TELEMETRY_SERIAL_TX_pin); + SERIAL_TX_on; #endif - TELEMETRY_SERIAL_TX_ddr |= _BV(TELEMETRY_SERIAL_TX_pin) ; // TxD pin is an output UCSR0B &= ~(1<>= 7 ; // Top bit if ( SerialControl.speed == SPEED_100K ) { -#ifdef INVERT_SERIAL - byteLo |= 0x02 ; // Parity bit -#else - byteLo |= 0xFC ; // Stop bits -#endif - // calc parity + #ifdef INVERT_SERIAL + byteLo |= 0x02 ; // Parity bit + #else + byteLo |= 0xFC ; // Stop bits + #endif + // calc parity temp = byte ; temp >>= 4 ; temp = byte ^ temp ; @@ -639,21 +638,21 @@ void Serial_write( uint8_t byte ) temp1 <<= 1 ; temp ^= temp1 ; temp &= 0x02 ; -#ifdef INVERT_SERIAL - byteLo ^= temp ; -#else - byteLo |= temp ; -#endif + #ifdef INVERT_SERIAL + byteLo ^= temp ; + #else + byteLo |= temp ; + #endif } else { byteLo |= 0xFE ; // Stop bit } byte <<= 1 ; -#ifdef INVERT_SERIAL - byte |= 1 ; // Start bit -#endif - uint8_t next = (SerialControl.head + 2) & 0x3f ; + #ifdef INVERT_SERIAL + byte |= 1 ; // Start bit + #endif + uint8_t next = (SerialControl.head + 2) & 0x3f ; if ( next != SerialControl.tail ) { SerialControl.data[SerialControl.head] = byte ; @@ -671,11 +670,11 @@ void resumeBashSerial() { sei() ; // Start the transmission here -#ifdef INVERT_SERIAL - GPIOR2 = 0 ; -#else - GPIOR2 = 0x01 ; -#endif + #ifdef INVERT_SERIAL + GPIOR2 = 0 ; + #else + GPIOR2 = 0x01 ; + #endif if ( SerialControl.speed == SPEED_100K ) { GPIOR1 = 1 ; @@ -706,13 +705,9 @@ ISR(TIMER0_COMPA_vect) uint8_t byte ; byte = GPIOR0 ; if ( byte & 0x01 ) - { - TELEMETRY_SERIAL_TX_port |= _BV(TELEMETRY_SERIAL_TX_pin); - } + SERIAL_TX_on; else - { - TELEMETRY_SERIAL_TX_port &= ~_BV(TELEMETRY_SERIAL_TX_pin); - } + SERIAL_TX_off; byte /= 2 ; // Generates shorter code than byte >>= 1 GPIOR0 = byte ; if ( --GPIOR1 == 0 ) @@ -731,13 +726,9 @@ ISR(TIMER0_COMPB_vect) uint8_t byte ; byte = GPIOR2 ; if ( byte & 0x01 ) - { - TELEMETRY_SERIAL_TX_port |= _BV(TELEMETRY_SERIAL_TX_pin); - } + SERIAL_TX_on; else - { - TELEMETRY_SERIAL_TX_port &= ~_BV(TELEMETRY_SERIAL_TX_pin); - } + SERIAL_TX_off; byte /= 2 ; // Generates shorter code than byte >>= 1 GPIOR2 = byte ; if ( --GPIOR1 == 0 ) @@ -786,13 +777,9 @@ ISR(TIMER0_OVF_vect) byte = GPIOR2 ; } if ( byte & 0x01 ) - { - TELEMETRY_SERIAL_TX_port |= _BV(TELEMETRY_SERIAL_TX_pin); - } + SERIAL_TX_on; else - { - TELEMETRY_SERIAL_TX_port &= ~_BV(TELEMETRY_SERIAL_TX_pin); - } + SERIAL_TX_off; byte /= 2 ; // Generates shorter code than byte >>= 1 if ( GPIOR1 > 2 ) { diff --git a/Multiprotocol/_Config.h b/Multiprotocol/_Config.h index d56a781..5dd32a7 100644 --- a/Multiprotocol/_Config.h +++ b/Multiprotocol/_Config.h @@ -152,7 +152,7 @@ const PPM_Parameters PPM_prot[15]= { /* 3 */ {MODE_FRSKYD, 0 , 0 , P_HIGH , NO_AUTOBIND , 40 }, // option=fine freq tuning /* 4 */ {MODE_HISKY , Hisky , 0 , P_HIGH , NO_AUTOBIND , 0 }, /* 5 */ {MODE_V2X2 , 0 , 0 , P_HIGH , NO_AUTOBIND , 0 }, -/* 6 */ {MODE_DSM , DSM2_22 , 0 , P_HIGH , NO_AUTOBIND , 2 }, // option=2=6 channels @ 22ms +/* 6 */ {MODE_DSM , DSM2_22 , 0 , P_HIGH , NO_AUTOBIND , 6 }, // option=6 channels @ 22ms /* 7 */ {MODE_DEVO , 0 , 0 , P_HIGH , NO_AUTOBIND , 0 }, /* 8 */ {MODE_YD717 , YD717 , 0 , P_HIGH , NO_AUTOBIND , 0 }, /* 9 */ {MODE_KN , WLTOYS , 0 , P_HIGH , NO_AUTOBIND , 0 },