diff --git a/Multiprotocol/Multiprotocol.h b/Multiprotocol/Multiprotocol.h index a4e0941..9fb49cc 100644 --- a/Multiprotocol/Multiprotocol.h +++ b/Multiprotocol/Multiprotocol.h @@ -146,6 +146,27 @@ struct PPM_Parameters uint8_t option; }; +//******************* +//*** Timer *** +//******************* +#ifdef XMEGA + #define TIFR1 TCC1.INTFLAGS + #define OCF1A_bm TC1_CCAIF_bm + #define OCR1A TCC1.CCA + #define TCNT1 TCC1.CNT + #define USARTC0.DATA UDR0 + #define OCF1B_bm TC1_CCBIF_bm + #define OCR1B TCC1.CCB + #define TCC1.INTCTRLB TIMSK1 + #define SET_TIMSK1_OCIE1B TIMSK1 = (TIMSK1 & 0xF3) | 0x04 + #define CLR_TIMSK1_OCIE1B TIMSK1 &= 0xF3 +#else + #define OCF1A_bm _BV(OCF1A) + #define OCF1B_bm _BV(OCF1B) + #define SET_TIMSK1_OCIE1B TIMSK1 |= _BV(OCIE1B) + #define CLR_TIMSK1_OCIE1B TIMSK1 &=~_BV(OCIE1B) +#endif + //******************* //*** Pinouts *** //******************* diff --git a/Multiprotocol/Multiprotocol.ino b/Multiprotocol/Multiprotocol.ino index 5f15ad0..392e51e 100644 --- a/Multiprotocol/Multiprotocol.ino +++ b/Multiprotocol/Multiprotocol.ino @@ -29,6 +29,10 @@ #include "_Config.h" #include "TX_Def.h" +#ifdef XMEGA + #undef ENABLE_PPM // Disable PPM for orange module +#endif + //Global constants/variables uint32_t MProtocol_id;//tx id, uint32_t MProtocol_id_master; @@ -72,7 +76,7 @@ uint8_t len; uint8_t RX_num; #if defined(FRSKYX_CC2500_INO) || defined(SFHSS_CC2500_INO) -uint8_t calData[48]; + uint8_t calData[48]; #endif //Channel mapping for protocols @@ -100,7 +104,7 @@ volatile uint16_t PPM_data[NUM_CHN]; volatile uint8_t rx_buff[RXBUFFER_SIZE]; volatile uint8_t rx_ok_buff[RXBUFFER_SIZE]; #ifndef BASH_SERIAL -volatile uint8_t tx_buff[TXBUFFER_SIZE]; + volatile uint8_t tx_buff[TXBUFFER_SIZE]; #endif volatile uint8_t discard_frame = 0; @@ -134,27 +138,44 @@ void_function_t remote_callback = 0; // Init void setup() { -#ifdef XMEGA - PORTD.OUTSET = 0x17 ; - PORTD.DIRSET = 0xB2 ; - PORTD.DIRCLR = 0x4D ; - PORTD.PIN0CTRL = 0x18 ; - PORTD.PIN2CTRL = 0x18 ; - PORTE.DIRSET = 0x01 ; - PORTE.DIRCLR = 0x02 ; - PORTE.OUTSET = 0x01 ; + #ifdef XMEGA + // General pinout + PORTD.OUTSET = 0x17 ; + PORTD.DIRSET = 0xB2 ; + PORTD.DIRCLR = 0x4D ; + PORTD.PIN0CTRL = 0x18 ; + PORTD.PIN2CTRL = 0x18 ; + PORTE.DIRSET = 0x01 ; + PORTE.DIRCLR = 0x02 ; + PORTE.OUTSET = 0x01 ; - for ( uint8_t count = 0 ; count < 20 ; count += 1 ) - asm("nop") ; - PORTE.OUTCLR = 0x01 ; -#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) -#endif + for ( uint8_t count = 0 ; count < 20 ; count += 1 ) + asm("nop") ; + PORTE.OUTCLR = 0x01 ; + + // Timer1 config + // TCC1 16-bit timer, clocked at 0.5uS + EVSYS.CH3MUX = 0x80 + 0x04 ; // Prescaler of 16 + TCC1.CTRLB = 0; TCC1.CTRLC = 0; TCC1.CTRLD = 0; TCC1.CTRLE = 0; + TCC1.INTCTRLA = 0; TIMSK1 = 0; + TCC1.PER = 0xFFFF ; + TCNT1 = 0 ; + 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) + #ifdef DEBUG_TX + TX_SET_OUTPUT; + #endif + + // Timer1 config + TCCR1A = 0; + TCCR1B = (1 << CS11); //prescaler8, set timer1 to increment every 0.5us(16Mhz) and start timer + #endif // Set Chip selects A7105_CS_on; @@ -165,32 +186,13 @@ void setup() SDI_on; SCK_off; -//#ifdef XMEGA -// // SPI enable, master, prescale of 16 -// SPID.CTRL = SPI_ENABLE_bm | SPI_MASTER_bm | SPI_PRESCALER0_bm ; -//#endif - - // Timer1 config -#ifdef XMEGA -// TCC1 16-bit timer, clocked at 0.5uS - EVSYS.CH3MUX = 0x80 + 0x04 ; // Prescaler of 16 - TCC1.CTRLB = 0; TCC1.CTRLC = 0; TCC1.CTRLD = 0; TCC1.CTRLE = 0; - TCC1.INTCTRLA = 0; TCC1.INTCTRLB = 0; - TCC1.PER = 0xFFFF ; - TCC1.CNT = 0 ; - TCC1.CTRLA = 0x0B ; // Event3 (prescale of 16) -#else - TCCR1A = 0; - TCCR1B = (1 << CS11); //prescaler8, set timer1 to increment every 0.5us(16Mhz) and start timer -#endif - // Set servos positions for(uint8_t i=0;i>2)&0x07 ) | ( (PINC<<3)&0x08) );//encoder dip switches 1,2,4,8=>B2,B3,B4,C0 -#endif + #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 + #endif // Update LED LED_OFF; @@ -235,27 +237,25 @@ void setup() protocol_init(); -#ifndef XMEGA //Configure PPM interrupt EICRA |=_BV(ISC11); // The rising edge of INT1 pin D3 generates an interrupt request EIMSK |= _BV(INT1); // INT1 interrupt enable -#endif -#if defined(TELEMETRY) - PPM_Telemetry_serial_init(); // Configure serial for telemetry -#endif + #if defined(TELEMETRY) + PPM_Telemetry_serial_init(); // Configure serial for telemetry + #endif } else #endif //ENABLE_PPM { // Serial -#ifdef ENABLE_SERIAL - cur_protocol[0]=0; - cur_protocol[1]=0; - prev_protocol=0; - servo_max_100=SERIAL_MAX_100; servo_min_100=SERIAL_MIN_100; - servo_max_125=SERIAL_MAX_125; servo_min_125=SERIAL_MIN_125; - Mprotocol_serial_init(); // Configure serial and enable RX interrupt -#endif //ENABLE_SERIAL + #ifdef ENABLE_SERIAL + cur_protocol[0]=0; + cur_protocol[1]=0; + prev_protocol=0; + servo_max_100=SERIAL_MAX_100; servo_min_100=SERIAL_MIN_100; + servo_max_125=SERIAL_MAX_125; servo_min_125=SERIAL_MIN_125; + Mprotocol_serial_init(); // Configure serial and enable RX interrupt + #endif //ENABLE_SERIAL } } @@ -275,25 +275,14 @@ void loop() } while(remote_callback==0); } - #ifdef XMEGA - if( (TCC1.INTFLAGS & TC1_CCAIF_bm) != 0) - { - cli(); // Disable global int due to RW of 16 bits registers - TCC1.CCA = TCC1.CNT ; // Callback should already have been called... Use "now" as new sync point. - sei(); // Enable global int - } - else - while((TCC1.INTFLAGS & TC1_CCAIF_bm) == 0); // wait before callback - #else - if( (TIFR1 & _BV(OCF1A)) != 0) - { - cli(); // Disable global int due to RW of 16 bits registers - OCR1A=TCNT1; // Callback should already have been called... Use "now" as new sync point. - sei(); // Enable global int - } - else - while((TIFR1 & _BV(OCF1A)) == 0); // Wait before callback - #endif + if( (TIFR1 & OCF1A_bm) != 0) + { + cli(); // Disable global int due to RW of 16 bits registers + OCR1A=TCNT1; // Callback should already have been called... Use "now" as new sync point. + sei(); // Enable global int + } + else + while((TIFR1 & OCF1A_bm) == 0); // Wait before callback do { TX_ON; @@ -306,41 +295,22 @@ void loop() while(next_callback>4000) { // start to wait here as much as we can... next_callback-=2000; // We will wait below for 2ms - #ifdef XMEGA - cli(); // Disable global int due to RW of 16 bits registers - TCC1.CCA +=2000*2; // set compare A for callback - TCC1.INTFLAGS = TC1_CCAIF_bm ; // clear compare A=callback flag - sei(); // enable global int - Update_All(); - if(IS_CHANGE_PROTOCOL_FLAG_on) - break; // Protocol has been changed - while((TCC1.INTFLAGS & TC1_CCAIF_bm) == 0); // wait 2ms... - #else - cli(); // Disable global int due to RW of 16 bits registers - OCR1A += 2000*2 ; // set compare A for callback - TIFR1=_BV(OCF1A); // clear compare A=callback flag - sei(); // enable global int - Update_All(); - if(IS_CHANGE_PROTOCOL_FLAG_on) - break; // Protocol has been changed - while((TIFR1 & _BV(OCF1A)) == 0); // wait 2ms... - #endif + cli(); // Disable global int due to RW of 16 bits registers + OCR1A += 2000*2 ; // set compare A for callback + TIFR1=OCF1A_bm; // clear compare A=callback flag + sei(); // enable global int + Update_All(); + if(IS_CHANGE_PROTOCOL_FLAG_on) + break; // Protocol has been changed + while((TIFR1 & OCF1A_bm) == 0); // wait 2ms... } // at this point we have a maximum of 4ms in next_callback next_callback *= 2 ; - #ifdef XMEGA - cli(); // Disable global int due to RW of 16 bits registers - TCC1.CCA +=next_callback; // set compare A for callback - TCC1.INTFLAGS = TC1_CCAIF_bm ; // clear compare A=callback flag - diff=TCC1.CCA-TCC1.CNT; // compare timer and comparator - sei(); // enable global int - #else - cli(); // Disable global int due to RW of 16 bits registers - OCR1A+= next_callback ; // set compare A for callback - TIFR1=_BV(OCF1A); // clear compare A=callback flag - diff=OCR1A-TCNT1; // compare timer and comparator - sei(); // enable global int - #endif + cli(); // Disable global int due to RW of 16 bits registers + OCR1A+= next_callback ; // set compare A for callback + TIFR1=OCF1A_bm; // clear compare A=callback flag + diff=OCR1A-TCNT1; // compare timer and comparator + sei(); // enable global int } while(diff&0x8000); // Callback did not took more than requested time for next callback // so we can launch Update_All before next callback @@ -349,49 +319,42 @@ void loop() void Update_All() { -TX_ON; -NOP(); -TX_OFF; - -#ifdef ENABLE_SERIAL - if(mode_select==MODE_SERIAL && IS_RX_FLAG_on) // Serial mode and something has been received - { - update_serial_data(); // Update protocol and data - update_aux_flags(); - if(IS_CHANGE_PROTOCOL_FLAG_on) - { // Protocol needs to be changed - LED_OFF; //led off during protocol init - modules_reset(); //reset all modules - protocol_init(); //init new protocol + #ifdef ENABLE_SERIAL + if(mode_select==MODE_SERIAL && IS_RX_FLAG_on) // Serial mode and something has been received + { + update_serial_data(); // Update protocol and data + update_aux_flags(); + if(IS_CHANGE_PROTOCOL_FLAG_on) + { // Protocol needs to be changed + LED_OFF; //led off during protocol init + modules_reset(); //reset all modules + protocol_init(); //init new protocol + } } - } -#endif //ENABLE_SERIAL -#ifdef ENABLE_PPM - if(mode_select!=MODE_SERIAL && IS_PPM_FLAG_on) // PPM mode and a full frame has been received - { - for(uint8_t i=0;iPPM_MAX_125) temp_ppm=PPM_MAX_125; - Servo_data[i]= temp_ppm ; + #endif //ENABLE_SERIAL + #ifdef ENABLE_PPM + if(mode_select!=MODE_SERIAL && IS_PPM_FLAG_on) // PPM mode and a full frame has been received + { + for(uint8_t i=0;iPPM_MAX_125) temp_ppm=PPM_MAX_125; + Servo_data[i]= temp_ppm ; + } + update_aux_flags(); + PPM_FLAG_off; // wait for next frame before update } - update_aux_flags(); - PPM_FLAG_off; // wait for next frame before update - } -#endif //ENABLE_PPM + #endif //ENABLE_PPM update_led_status(); #if defined(TELEMETRY) - uint8_t protocol=cur_protocol[0]&0x1F; - if( (protocol==MODE_FRSKY) || (protocol==MODE_HUBSAN) || (protocol==MODE_FRSKYX) || (protocol==MODE_DSM) ) - TelemetryUpdate(); + uint8_t protocol=cur_protocol[0]&0x1F; + if( (protocol==MODE_FRSKY) || (protocol==MODE_HUBSAN) || (protocol==MODE_FRSKYX) || (protocol==MODE_DSM) ) + TelemetryUpdate(); #endif -TX_ON; -NOP(); -TX_OFF; } // Update Servo_AUX flags based on servo AUX positions @@ -429,27 +392,29 @@ static void update_led_status(void) inline void tx_pause() { -#ifdef TELEMETRY - #ifdef XMEGA - USARTC0.CTRLA &= ~0x03 ; // Pause telemetry by disabling transmitter interrupt - #else - #ifndef BASH_SERIAL - UCSR0B &= ~_BV(UDRIE0); // Pause telemetry by disabling transmitter interrupt + #ifdef TELEMETRY + #ifdef XMEGA + USARTC0.CTRLA &= ~0x03 ; // Pause telemetry by disabling transmitter interrupt + #else + #ifndef BASH_SERIAL + UCSR0B &= ~_BV(UDRIE0); // Pause telemetry by disabling transmitter interrupt + #endif #endif #endif -#endif } inline void tx_resume() { -#ifdef TELEMETRY - if(!IS_TX_PAUSE_on) - #ifdef XMEGA - USARTC0.CTRLA = (USARTC0.CTRLA & 0xFC) | 0x01 ; // Resume telemetry by enabling transmitter interrupt - #else - UCSR0B |= _BV(UDRIE0); // Resume telemetry by enabling transmitter interrupt - #endif -#endif + #ifdef TELEMETRY + if(!IS_TX_PAUSE_on) + #ifdef XMEGA + USARTC0.CTRLA = (USARTC0.CTRLA & 0xFC) | 0x01 ; // Resume telemetry by enabling transmitter interrupt + #else + #ifndef BASH_SERIAL + UCSR0B |= _BV(UDRIE0); // Resume telemetry by enabling transmitter interrupt + #endif + #endif + #endif } // Protocol start @@ -482,186 +447,186 @@ static void protocol_init() switch(cur_protocol[0]&0x1F) // Init the requested protocol { -#if defined(FLYSKY_A7105_INO) - case MODE_FLYSKY: - CTRL1_off; //antenna RF1 - next_callback = initFlySky(); - remote_callback = ReadFlySky; - break; -#endif -#if defined(HUBSAN_A7105_INO) - case MODE_HUBSAN: - CTRL1_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; - break; -#endif -#if defined(FRSKY_CC2500_INO) - case MODE_FRSKY: - CTRL1_off; //antenna RF2 - CTRL2_on; - next_callback = initFrSky_2way(); - remote_callback = ReadFrSky_2way; - break; -#endif -#if defined(FRSKY1_CC2500_INO) - case MODE_FRSKY1: - CTRL1_off; //antenna RF2 - CTRL2_on; - next_callback = initFRSKY1(); - remote_callback = ReadFRSKY1; - break; -#endif -#if defined(FRSKYX_CC2500_INO) - case MODE_FRSKYX: - CTRL1_off; //antenna RF2 - CTRL2_on; - next_callback = initFrSkyX(); - remote_callback = ReadFrSkyX; - break; -#endif -#if defined(SFHSS_CC2500_INO) - case MODE_SFHSS: - CTRL1_off; //antenna RF2 - CTRL2_on; - next_callback = initSFHSS(); - remote_callback = ReadSFHSS; - break; -#endif -#if defined(DSM_CYRF6936_INO) - case MODE_DSM: - CTRL2_on; //antenna RF4 - next_callback = initDsm(); - //Servo_data[2]=1500;//before binding - remote_callback = ReadDsm; - break; -#endif -#if defined(DEVO_CYRF6936_INO) - case MODE_DEVO: - #ifdef ENABLE_PPM - if(mode_select) //PPM mode - { - if(IS_BIND_BUTTON_FLAG_on) - { - eeprom_write_byte((uint8_t*)(30+mode_select),0x00); // reset to autobind mode for the current model - option=0; - } - else - { - option=eeprom_read_byte((uint8_t*)(30+mode_select)); // load previous mode: autobind or fixed id - if(option!=1) option=0; // if not fixed id mode then it should be autobind - } - } - #endif //ENABLE_PPM - CTRL2_on; //antenna RF4 - next_callback = DevoInit(); - remote_callback = devo_callback; - break; -#endif -#if defined(J6PRO_CYRF6936_INO) - case MODE_J6PRO: - CTRL2_on; //antenna RF4 - next_callback = initJ6Pro(); - remote_callback = ReadJ6Pro; - break; -#endif -#if defined(HISKY_NRF24L01_INO) - case MODE_HISKY: - next_callback=initHiSky(); - remote_callback = hisky_cb; - break; -#endif -#if defined(V2X2_NRF24L01_INO) - case MODE_V2X2: - next_callback = initV2x2(); - remote_callback = ReadV2x2; - break; -#endif -#if defined(YD717_NRF24L01_INO) - case MODE_YD717: - next_callback=initYD717(); - remote_callback = yd717_callback; - break; -#endif -#if defined(KN_NRF24L01_INO) - case MODE_KN: - next_callback = initKN(); - remote_callback = kn_callback; - break; -#endif -#if defined(SYMAX_NRF24L01_INO) - case MODE_SYMAX: - next_callback = initSymax(); - remote_callback = symax_callback; - break; -#endif -#if defined(SLT_NRF24L01_INO) - case MODE_SLT: - next_callback=initSLT(); - remote_callback = SLT_callback; - break; -#endif -#if defined(CX10_NRF24L01_INO) - case MODE_CX10: - next_callback=initCX10(); - remote_callback = CX10_callback; - break; -#endif -#if defined(CG023_NRF24L01_INO) - case MODE_CG023: - next_callback=initCG023(); - remote_callback = CG023_callback; - break; -#endif -#if defined(BAYANG_NRF24L01_INO) - case MODE_BAYANG: - next_callback=initBAYANG(); - remote_callback = BAYANG_callback; - break; -#endif -#if defined(ESKY_NRF24L01_INO) - case MODE_ESKY: - next_callback=initESKY(); - remote_callback = ESKY_callback; - break; -#endif -#if defined(MT99XX_NRF24L01_INO) - case MODE_MT99XX: - next_callback=initMT99XX(); - remote_callback = MT99XX_callback; - break; -#endif -#if defined(MJXQ_NRF24L01_INO) - case MODE_MJXQ: - next_callback=initMJXQ(); - remote_callback = MJXQ_callback; - break; -#endif -#if defined(SHENQI_NRF24L01_INO) - case MODE_SHENQI: - next_callback=initSHENQI(); - remote_callback = SHENQI_callback; - break; -#endif -#if defined(FY326_NRF24L01_INO) - case MODE_FY326: - next_callback=initFY326(); - remote_callback = FY326_callback; - break; -#endif -#if defined(FQ777_NRF24L01_INO) - case MODE_FQ777: - next_callback=initFQ777(); - remote_callback = FQ777_callback; - break; -#endif -#if defined(ASSAN_NRF24L01_INO) - case MODE_ASSAN: - next_callback=initASSAN(); - remote_callback = ASSAN_callback; - break; -#endif + #if defined(FLYSKY_A7105_INO) + case MODE_FLYSKY: + CTRL1_off; //antenna RF1 + next_callback = initFlySky(); + remote_callback = ReadFlySky; + break; + #endif + #if defined(HUBSAN_A7105_INO) + case MODE_HUBSAN: + CTRL1_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; + break; + #endif + #if defined(FRSKY_CC2500_INO) + case MODE_FRSKY: + CTRL1_off; //antenna RF2 + CTRL2_on; + next_callback = initFrSky_2way(); + remote_callback = ReadFrSky_2way; + break; + #endif + #if defined(FRSKY1_CC2500_INO) + case MODE_FRSKY1: + CTRL1_off; //antenna RF2 + CTRL2_on; + next_callback = initFRSKY1(); + remote_callback = ReadFRSKY1; + break; + #endif + #if defined(FRSKYX_CC2500_INO) + case MODE_FRSKYX: + CTRL1_off; //antenna RF2 + CTRL2_on; + next_callback = initFrSkyX(); + remote_callback = ReadFrSkyX; + break; + #endif + #if defined(SFHSS_CC2500_INO) + case MODE_SFHSS: + CTRL1_off; //antenna RF2 + CTRL2_on; + next_callback = initSFHSS(); + remote_callback = ReadSFHSS; + break; + #endif + #if defined(DSM_CYRF6936_INO) + case MODE_DSM: + CTRL2_on; //antenna RF4 + next_callback = initDsm(); + //Servo_data[2]=1500;//before binding + remote_callback = ReadDsm; + break; + #endif + #if defined(DEVO_CYRF6936_INO) + case MODE_DEVO: + #ifdef ENABLE_PPM + if(mode_select) //PPM mode + { + if(IS_BIND_BUTTON_FLAG_on) + { + eeprom_write_byte((uint8_t*)(30+mode_select),0x00); // reset to autobind mode for the current model + option=0; + } + else + { + option=eeprom_read_byte((uint8_t*)(30+mode_select)); // load previous mode: autobind or fixed id + if(option!=1) option=0; // if not fixed id mode then it should be autobind + } + } + #endif //ENABLE_PPM + CTRL2_on; //antenna RF4 + next_callback = DevoInit(); + remote_callback = devo_callback; + break; + #endif + #if defined(J6PRO_CYRF6936_INO) + case MODE_J6PRO: + CTRL2_on; //antenna RF4 + next_callback = initJ6Pro(); + remote_callback = ReadJ6Pro; + break; + #endif + #if defined(HISKY_NRF24L01_INO) + case MODE_HISKY: + next_callback=initHiSky(); + remote_callback = hisky_cb; + break; + #endif + #if defined(V2X2_NRF24L01_INO) + case MODE_V2X2: + next_callback = initV2x2(); + remote_callback = ReadV2x2; + break; + #endif + #if defined(YD717_NRF24L01_INO) + case MODE_YD717: + next_callback=initYD717(); + remote_callback = yd717_callback; + break; + #endif + #if defined(KN_NRF24L01_INO) + case MODE_KN: + next_callback = initKN(); + remote_callback = kn_callback; + break; + #endif + #if defined(SYMAX_NRF24L01_INO) + case MODE_SYMAX: + next_callback = initSymax(); + remote_callback = symax_callback; + break; + #endif + #if defined(SLT_NRF24L01_INO) + case MODE_SLT: + next_callback=initSLT(); + remote_callback = SLT_callback; + break; + #endif + #if defined(CX10_NRF24L01_INO) + case MODE_CX10: + next_callback=initCX10(); + remote_callback = CX10_callback; + break; + #endif + #if defined(CG023_NRF24L01_INO) + case MODE_CG023: + next_callback=initCG023(); + remote_callback = CG023_callback; + break; + #endif + #if defined(BAYANG_NRF24L01_INO) + case MODE_BAYANG: + next_callback=initBAYANG(); + remote_callback = BAYANG_callback; + break; + #endif + #if defined(ESKY_NRF24L01_INO) + case MODE_ESKY: + next_callback=initESKY(); + remote_callback = ESKY_callback; + break; + #endif + #if defined(MT99XX_NRF24L01_INO) + case MODE_MT99XX: + next_callback=initMT99XX(); + remote_callback = MT99XX_callback; + break; + #endif + #if defined(MJXQ_NRF24L01_INO) + case MODE_MJXQ: + next_callback=initMJXQ(); + remote_callback = MJXQ_callback; + break; + #endif + #if defined(SHENQI_NRF24L01_INO) + case MODE_SHENQI: + next_callback=initSHENQI(); + remote_callback = SHENQI_callback; + break; + #endif + #if defined(FY326_NRF24L01_INO) + case MODE_FY326: + next_callback=initFY326(); + remote_callback = FY326_callback; + break; + #endif + #if defined(FQ777_NRF24L01_INO) + case MODE_FQ777: + next_callback=initFQ777(); + remote_callback = FQ777_callback; + break; + #endif + #if defined(ASSAN_NRF24L01_INO) + case MODE_ASSAN: + next_callback=initASSAN(); + remote_callback = ASSAN_callback; + break; + #endif } if(next_callback>32000) @@ -671,15 +636,9 @@ static void protocol_init() next_callback-=temp<<10; // between 2-3ms left at this stage } cli(); // disable global int -#ifdef XMEGA - TCC1.CCA = TCC1.CNT + next_callback*2; // set compare A for callback + OCR1A = TCNT1 + next_callback*2;// set compare A for callback sei(); // enable global int - TCC1.INTFLAGS = TC1_CCAIF_bm ; // clear compare A flag -#else - OCR1A=TCNT1+next_callback*2; // set compare A for callback - sei(); // enable global int - TIFR1=_BV(OCF1A); // clear compare A flag -#endif + TIFR1 = OCF1A_bm ; // clear compare A flag BIND_BUTTON_FLAG_off; // do not bind/reset id anymore even if protocol change } @@ -834,40 +793,37 @@ uint16_t limit_channel_100(uint8_t ch) void Mprotocol_serial_init() { -#ifdef XMEGA - - PORTC.OUTSET = 0x08 ; - PORTC.DIRSET = 0x08 ; + #ifdef XMEGA + PORTC.OUTSET = 0x08 ; + PORTC.DIRSET = 0x08 ; - USARTC0.BAUDCTRLA = 19 ; - USARTC0.BAUDCTRLB = 0 ; - - USARTC0.CTRLB = 0x18 ; - USARTC0.CTRLA = (USARTC0.CTRLA & 0xCF) | 0x10 ; - USARTC0.CTRLC = 0x2B ; - USARTC0.DATA ; - #ifdef INVERT_TELEMETRY - PORTC.PIN3CTRL |= 0x40 ; - #endif -#else - #include - UBRR0H = UBRRH_VALUE; - UBRR0L = UBRRL_VALUE; - UCSR0A = 0 ; // Clear X2 bit - //Set frame format to 8 data bits, even parity, 2 stop bits - UCSR0C = _BV(UPM01)|_BV(USBS0)|_BV(UCSZ01)|_BV(UCSZ00); - while ( UCSR0A & (1 << RXC0) )//flush receive buffer - UDR0; - //enable reception and RC complete interrupt - UCSR0B = _BV(RXEN0)|_BV(RXCIE0);//rx enable and interrupt -#ifdef DEBUG_TX - TX_SET_OUTPUT; -#else - #if defined(TELEMETRY) - initTXSerial( SPEED_100K ) ; - #endif //TELEMETRY -#endif //DEBUG_TX -#endif //XMEGA + USARTC0.BAUDCTRLA = 19 ; + USARTC0.BAUDCTRLB = 0 ; + + USARTC0.CTRLB = 0x18 ; + USARTC0.CTRLA = (USARTC0.CTRLA & 0xCF) | 0x10 ; + USARTC0.CTRLC = 0x2B ; + UDR0 ; + #ifdef INVERT_TELEMETRY + PORTC.PIN3CTRL |= 0x40 ; + #endif + #else + #include + UBRR0H = UBRRH_VALUE; + UBRR0L = UBRRL_VALUE; + UCSR0A = 0 ; // Clear X2 bit + //Set frame format to 8 data bits, even parity, 2 stop bits + UCSR0C = _BV(UPM01)|_BV(USBS0)|_BV(UCSZ01)|_BV(UCSZ00); + while ( UCSR0A & (1 << RXC0) )//flush receive buffer + UDR0; + //enable reception and RC complete interrupt + UCSR0B = _BV(RXEN0)|_BV(RXCIE0);//rx enable and interrupt + #ifndef DEBUG_TX + #if defined(TELEMETRY) + initTXSerial( SPEED_100K ) ; + #endif //TELEMETRY + #endif //DEBUG_TX + #endif //XMEGA } #if defined(TELEMETRY) @@ -1076,11 +1032,7 @@ ISR(INT1_vect, ISR_NOBLOCK) static uint16_t Prev_TCNT1=0; uint16_t Cur_TCNT1; -#ifdef XMEGA - Cur_TCNT1 = TCC1.CNT - Prev_TCNT1 ; // Capture current Timer1 value -#else - Cur_TCNT1=TCNT1-Prev_TCNT1; // Capture current Timer1 value -#endif + Cur_TCNT1 = TCNT1 - Prev_TCNT1 ; // Capture current Timer1 value if(Cur_TCNT1<1000) chan=-1; // bad frame else @@ -1110,44 +1062,30 @@ ISR(USART_RX_vect) { // RX interrupt static uint8_t idx=0; #ifdef XMEGA - if((USARTC0.STATUS & 0x1C)==0) // Check frame error, data overrun and parity error + if((USARTC0.STATUS & 0x1C)==0) // Check frame error, data overrun and parity error #else - UCSR0B &= ~_BV(RXCIE0) ; // RX interrupt disable + UCSR0B &= ~_BV(RXCIE0) ; // RX interrupt disable sei() ; - if((UCSR0A&0x1C)==0) // Check frame error, data overrun and parity error + 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; - #ifdef XMEGA - if(USARTC0.DATA==0x55) // If 1st byte is 0x55 it looks ok - #else - if(UDR0==0x55) // If 1st byte is 0x55 it looks ok - #endif + if(UDR0==0x55) // If 1st byte is 0x55 it looks ok { TX_RX_PAUSE_on; tx_pause(); - #ifdef XMEGA - TCC1.CCB = TCC1.CNT+(6500L) ; // Full message should be received within timer of 3250us - TCC1.INTFLAGS = TC1_CCBIF_bm ; // clear OCR1B match flag - TCC1.INTCTRLB = (TCC1.INTCTRLB & 0xF3) | 0x04 ; // enable interrupt on compare B match - #else - OCR1B=TCNT1+6500L; // Full message should be received within timer of 3250us - TIFR1=_BV(OCF1B); // clear OCR1B match flag - TIMSK1 |=_BV(OCIE1B); // enable interrupt on compare B match - #endif + 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 { - RX_MISSED_BUFF_off; // if rx_buff was good it's not anymore... - #ifdef XMEGA - rx_buff[(idx++)-1]=USARTC0.DATA; // Store received byte - #else - rx_buff[(idx++)-1]=UDR0; // Store received byte - #endif + RX_MISSED_BUFF_off; // if rx_buff was good it's not anymore... + rx_buff[(idx++)-1]=UDR0; // Store received byte if(idx>RXBUFFER_SIZE) { // A full frame has been received if(!IS_RX_DONOTUPDTAE_on) @@ -1156,27 +1094,19 @@ ISR(USART_RX_vect) 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 + RX_MISSED_BUFF_on; // notify that rx_buff is good + discard_frame=1; // start again } } } else { - #ifdef XMEGA - idx = USARTC0.DATA; // Dummy read - #else - idx=UDR0; // Dummy read - #endif - discard_frame=1; // Error encountered discard full frame... + idx=UDR0; // Dummy read + discard_frame=1; // Error encountered discard full frame... } if(discard_frame==1) { - #ifdef XMEGA - TCC1.INTCTRLB &=0xF3; // Disable interrupt on compare B match - #else - TIMSK1 &=~_BV(OCIE1B); // Disable interrupt on compare B match - #endif + CLR_TIMSK1_OCIE1B; // Disable interrupt on compare B match TX_RX_PAUSE_off; tx_resume(); } @@ -1190,16 +1120,11 @@ ISR(USART_RX_vect) #ifdef XMEGA ISR(TCC1_CCB_vect) #else -//ISR(TIMER1_COMPB_vect) ISR(TIMER1_COMPB_vect, ISR_NOBLOCK ) #endif { // Timer1 compare B interrupt discard_frame=1; - #ifdef XMEGA - TCC1.INTCTRLB &=0xF3; // Disable interrupt on compare B match - #else - TIMSK1 &=~_BV(OCIE1B); // Disable interrupt on compare B match - #endif + CLR_TIMSK1_OCIE1B; // Disable interrupt on compare B match tx_resume(); } #endif //ENABLE_SERIAL \ No newline at end of file diff --git a/Multiprotocol/Telemetry.ino b/Multiprotocol/Telemetry.ino index f6ba047..22d04d1 100644 --- a/Multiprotocol/Telemetry.ino +++ b/Multiprotocol/Telemetry.ino @@ -1,7 +1,7 @@ -//************************************* -// FrSky Telemetry serial code * -// By Midelic on RCGroups * -//************************************* +//************************** +// Telemetry serial code * +// By Midelic on RCGroups * +//************************** #if defined TELEMETRY @@ -30,15 +30,14 @@ uint8_t frame[18]; #ifdef BASH_SERIAL // For bit-bashed serial output - -struct t_serial_bash -{ - uint8_t head ; - uint8_t tail ; - uint8_t data[64] ; - uint8_t busy ; - uint8_t speed ; -} SerialControl ; + struct t_serial_bash + { + uint8_t head ; + uint8_t tail ; + uint8_t data[64] ; + uint8_t busy ; + uint8_t speed ; + } SerialControl ; #endif #if defined DSM_TELEMETRY @@ -540,18 +539,10 @@ ISR(USART_UDRE_vect) { if(++tx_tail>=TXBUFFER_SIZE)//head tx_tail=0; -#ifdef XMEGA - USARTC0.DATA = tx_buff[tx_tail] ; -#else UDR0=tx_buff[tx_tail]; -#endif } if (tx_tail == tx_head) -#ifdef XMEGA - USARTC0.CTRLA &= ~0x03 ; -#else - UCSR0B &= ~(1<