From 795df2937e8c60aafb0f21c494fb22361edad5fe Mon Sep 17 00:00:00 2001 From: pascallanger Date: Mon, 15 Feb 2016 21:15:09 +0100 Subject: [PATCH] Space and ram optimization on FrSky & FrSkyX --- Multiprotocol/CC2500_SPI.ino | 2 +- Multiprotocol/DSM2_cyrf6936.ino | 8 - Multiprotocol/FlySky_a7105.ino | 4 +- Multiprotocol/FrSkyX_cc2500.ino | 272 ++++++++++++++++---------------- Multiprotocol/FrSky_cc2500.ino | 52 ++---- Multiprotocol/Multiprotocol.ino | 10 +- Multiprotocol/NRF24l01_SPI.ino | 2 +- Multiprotocol/_Config.h | 71 +++++---- Multiprotocol/iface_cc2500.h | 39 +++++ 9 files changed, 232 insertions(+), 228 deletions(-) diff --git a/Multiprotocol/CC2500_SPI.ino b/Multiprotocol/CC2500_SPI.ino index bc6928e..afcd8bb 100644 --- a/Multiprotocol/CC2500_SPI.ino +++ b/Multiprotocol/CC2500_SPI.ino @@ -185,4 +185,4 @@ void CC2500_SetTxRxMode(uint8_t mode) cc2500_writeReg(CC2500_02_IOCFG0, 0x2F); cc2500_writeReg(CC2500_00_IOCFG2, 0x2F); } -} \ No newline at end of file +} diff --git a/Multiprotocol/DSM2_cyrf6936.ino b/Multiprotocol/DSM2_cyrf6936.ino index 928d24e..0882d77 100644 --- a/Multiprotocol/DSM2_cyrf6936.ino +++ b/Multiprotocol/DSM2_cyrf6936.ino @@ -114,14 +114,6 @@ uint8_t data_col; uint16_t cyrf_state; uint8_t crcidx; uint8_t binding; -/* -#ifdef USE_FIXED_MFGID -const uint8_t cyrfmfg_id[6] = {0x5e, 0x28, 0xa3, 0x1b, 0x00, 0x00}; //dx8 -const uint8_t cyrfmfg_id[6] = {0xd4, 0x62, 0xd6, 0xad, 0xd3, 0xff}; //dx6i -#else -//uint8_t cyrfmfg_id[6]; -#endif -*/ static void __attribute__((unused)) build_bind_packet() { diff --git a/Multiprotocol/FlySky_a7105.ino b/Multiprotocol/FlySky_a7105.ino index 8c5f956..84fa3df 100644 --- a/Multiprotocol/FlySky_a7105.ino +++ b/Multiprotocol/FlySky_a7105.ino @@ -45,7 +45,7 @@ enum { FLAG_V9X9_VIDEO = 0x40, FLAG_V9X9_CAMERA= 0x80, // flags going to byte 12 - FLAG_V9X9_UNK = 0x10, // undocumented ? + FLAG_V9X9_FLIP = 0x10, FLAG_V9X9_LED = 0x20, }; @@ -82,7 +82,7 @@ static void __attribute__((unused)) flysky_apply_extension_flags() { case V9X9: if(Servo_AUX1) - packet[12] |= FLAG_V9X9_UNK; + packet[12] |= FLAG_V9X9_FLIP; if(Servo_AUX2) packet[12] |= FLAG_V9X9_LED; if(Servo_AUX3) diff --git a/Multiprotocol/FrSkyX_cc2500.ino b/Multiprotocol/FrSkyX_cc2500.ino index 19044ef..dc6e2f2 100644 --- a/Multiprotocol/FrSkyX_cc2500.ino +++ b/Multiprotocol/FrSkyX_cc2500.ino @@ -43,101 +43,12 @@ 0x34, 0x1B, 0x00, 0x1D, 0x03 }; - uint8_t hop(uint8_t byte) + static uint8_t __attribute__((unused)) hop(uint8_t byte) { return pgm_read_byte_near(&hop_data[byte]); } - uint16_t initFrSkyX() - { - while(!chanskip) - { - randomSeed((uint32_t)analogRead(A6) << 10 | analogRead(A7)); - chanskip=random(0xfefefefe)%47; - } - while((chanskip-ctr)%4) - ctr=(ctr+1)%4; - - counter_rst=(chanskip-ctr)>>2; - //for test*************** - //rx_tx_addr[3]=0xB3; - //rx_tx_addr[2]=0xFD; - //************************ - frskyX_init(); - // - if(IS_AUTOBIND_FLAG_on) - { - state = FRSKY_BIND; - initialize_data(1); - } - else - { - state = FRSKY_DATA1; - initialize_data(0); - } - return 10000; - } - - uint16_t ReadFrSkyX() - { - switch(state) - { - default: - set_start(47); - CC2500_SetPower(); - cc2500_strobe(CC2500_SFRX); - // - frskyX_build_bind_packet(); - cc2500_strobe(CC2500_SIDLE); - cc2500_writeFifo(packet, packet[0]+1); - state++; - return 9000; - case FRSKY_BIND_DONE: - initialize_data(0); - channr=0; - BIND_DONE; - state++; - break; - case FRSKY_DATA1: - LED_ON; - CC2500_SetTxRxMode(TX_EN); - set_start(channr); - CC2500_SetPower(); - cc2500_strobe(CC2500_SFRX); - channr = (channr+chanskip)%47; - cc2500_strobe(CC2500_SIDLE); - cc2500_writeFifo(packet, packet[0]+1); - // - frskyX_data_frame(); - state++; - return 5500; - case FRSKY_DATA2: - CC2500_SetTxRxMode(RX_EN); - cc2500_strobe(CC2500_SIDLE); - state++; - return 200; - case FRSKY_DATA3: - cc2500_strobe(CC2500_SRX); - state++; - return 3000; - case FRSKY_DATA4: - len = cc2500_readReg(CC2500_3B_RXBYTES | CC2500_READ_BURST) & 0x7F; - if (len &&(len>8) ^ byte) & 0xFF]); + return byte; + } + + static uint16_t __attribute__((unused)) scaleForPXX( uint8_t i ) + { //mapped 860,2140(125%) range to 64,1984(PXX values); + return (uint16_t)(((Servo_data[i]-PPM_MIN)*3)>>1)+64; + } + + static void __attribute__((unused)) frskyX_build_bind_packet() { crc=0; packet[0] = 0x1D; @@ -243,7 +159,7 @@ // } - void frskyX_data_frame() + static void __attribute__((unused)) frskyX_data_frame() { //0x1D 0xB3 0xFD 0x02 0x56 0x07 0x15 0x00 0x00 0x00 0x04 0x40 0x00 0x04 0x40 0x00 0x04 0x40 0x00 0x04 0x40 0x08 0x00 0x00 0x00 0x00 0x00 0x00 0x96 0x12 // @@ -302,14 +218,92 @@ packet[29]=lowByte(crc); } - uint16_t scaleForPXX( uint8_t i ) - { //mapped 860,2140(125%) range to 64,1984(PXX values); - return (uint16_t)(((Servo_data[i]-PPM_MIN)*3)>>1)+64; - } - - uint8_t crc_Byte( uint8_t byte ) + uint16_t ReadFrSkyX() { - crc = (crc<<8) ^ pgm_read_word(&CRCTable[((uint8_t)(crc>>8) ^ byte) & 0xFF]); - return byte; + switch(state) + { + default: + set_start(47); + CC2500_SetPower(); + cc2500_strobe(CC2500_SFRX); + // + frskyX_build_bind_packet(); + cc2500_strobe(CC2500_SIDLE); + cc2500_writeFifo(packet, packet[0]+1); + state++; + return 9000; + case FRSKY_BIND_DONE: + initialize_data(0); + channr=0; + BIND_DONE; + state++; + break; + case FRSKY_DATA1: + LED_ON; + CC2500_SetTxRxMode(TX_EN); + set_start(channr); + CC2500_SetPower(); + cc2500_strobe(CC2500_SFRX); + channr = (channr+chanskip)%47; + cc2500_strobe(CC2500_SIDLE); + cc2500_writeFifo(packet, packet[0]+1); + // + frskyX_data_frame(); + state++; + return 5500; + case FRSKY_DATA2: + CC2500_SetTxRxMode(RX_EN); + cc2500_strobe(CC2500_SIDLE); + state++; + return 200; + case FRSKY_DATA3: + cc2500_strobe(CC2500_SRX); + state++; + return 3000; + case FRSKY_DATA4: + len = cc2500_readReg(CC2500_3B_RXBYTES | CC2500_READ_BURST) & 0x7F; + if (len &&(len>2; + //for test*************** + //rx_tx_addr[3]=0xB3; + //rx_tx_addr[2]=0xFD; + //************************ + frskyX_init(); + // + if(IS_AUTOBIND_FLAG_on) + { + state = FRSKY_BIND; + initialize_data(1); + } + else + { + state = FRSKY_DATA1; + initialize_data(0); + } + return 10000; + } #endif \ No newline at end of file diff --git a/Multiprotocol/FrSky_cc2500.ino b/Multiprotocol/FrSky_cc2500.ino index f3c6d3c..ec17450 100644 --- a/Multiprotocol/FrSky_cc2500.ino +++ b/Multiprotocol/FrSky_cc2500.ino @@ -38,45 +38,19 @@ static void __attribute__((unused)) frsky2way_init(uint8_t bind) // Configure cc2500 for tx mode CC2500_Reset(); // - cc2500_writeReg(CC2500_02_IOCFG0, 0x06); - cc2500_writeReg(CC2500_00_IOCFG2, 0x06); - cc2500_writeReg(CC2500_17_MCSM1, 0x0c); - cc2500_writeReg(CC2500_18_MCSM0, 0x18); - cc2500_writeReg(CC2500_06_PKTLEN, 0x19); - cc2500_writeReg(CC2500_07_PKTCTRL1, 0x04); - cc2500_writeReg(CC2500_08_PKTCTRL0, 0x05); - cc2500_writeReg(CC2500_3E_PATABLE, 0xff); - cc2500_writeReg(CC2500_0B_FSCTRL1, 0x08); - cc2500_writeReg(CC2500_0C_FSCTRL0, option); - //base freq FREQ = 0x5C7627 (F = 2404MHz) - cc2500_writeReg(CC2500_0D_FREQ2, 0x5c); - cc2500_writeReg(CC2500_0E_FREQ1, 0x76); - cc2500_writeReg(CC2500_0F_FREQ0, 0x27); - // - cc2500_writeReg(CC2500_10_MDMCFG4, 0xAA); - cc2500_writeReg(CC2500_11_MDMCFG3, 0x39); - cc2500_writeReg(CC2500_12_MDMCFG2, 0x11); - cc2500_writeReg(CC2500_13_MDMCFG1, 0x23); - cc2500_writeReg(CC2500_14_MDMCFG0, 0x7a); - cc2500_writeReg(CC2500_15_DEVIATN, 0x42); - cc2500_writeReg(CC2500_19_FOCCFG, 0x16); - cc2500_writeReg(CC2500_1A_BSCFG, 0x6c); - cc2500_writeReg(CC2500_1B_AGCCTRL2, bind ? 0x43 : 0x03); - cc2500_writeReg(CC2500_1C_AGCCTRL1,0x40); - cc2500_writeReg(CC2500_1D_AGCCTRL0,0x91); - cc2500_writeReg(CC2500_21_FREND1, 0x56); - cc2500_writeReg(CC2500_22_FREND0, 0x10); - cc2500_writeReg(CC2500_23_FSCAL3, 0xa9); - cc2500_writeReg(CC2500_24_FSCAL2, 0x0A); - cc2500_writeReg(CC2500_25_FSCAL1, 0x00); - cc2500_writeReg(CC2500_26_FSCAL0, 0x11); - cc2500_writeReg(CC2500_29_FSTEST, 0x59); - cc2500_writeReg(CC2500_2C_TEST2, 0x88); - cc2500_writeReg(CC2500_2D_TEST1, 0x31); - cc2500_writeReg(CC2500_2E_TEST0, 0x0B); - cc2500_writeReg(CC2500_03_FIFOTHR, 0x07); - cc2500_writeReg(CC2500_09_ADDR, 0x00); - // + for(uint8_t i=0;i<36;i++) + { + uint8_t reg=pgm_read_byte_near(&cc2500_conf[i][0]); + uint8_t val=pgm_read_byte_near(&cc2500_conf[i][1]); + + if(reg==CC2500_0C_FSCTRL0) + val=option; + else + if(reg==CC2500_1B_AGCCTRL2) + val=bind ? 0x43 : 0x03; + cc2500_writeReg(reg,val); + } + CC2500_SetTxRxMode(TX_EN); CC2500_SetPower(); diff --git a/Multiprotocol/Multiprotocol.ino b/Multiprotocol/Multiprotocol.ino index 38c23aa..802c8c6 100644 --- a/Multiprotocol/Multiprotocol.ino +++ b/Multiprotocol/Multiprotocol.ino @@ -44,8 +44,6 @@ uint8_t packet[40]; // Servo data uint16_t Servo_data[NUM_CHN]; uint8_t Servo_AUX; -// PPM variable -volatile uint16_t PPM_data[NUM_CHN]; // Protocol variables uint8_t rx_tx_addr[5]; @@ -74,6 +72,9 @@ uint8_t RX_num; uint8_t mode_select; uint8_t protocol_flags=0,protocol_flags2=0; +// PPM variable +volatile uint16_t PPM_data[NUM_CHN]; + // Serial variables #define RXBUFFER_SIZE 25 #define TXBUFFER_SIZE 12 @@ -156,7 +157,9 @@ void setup() MProtocol_id_master=random_id(10,false); //Init RF modules - CC2500_Reset(); + #ifdef CC2500_INSTALLED + CC2500_Reset(); + #endif //Protocol and interrupts initialization if(mode_select != MODE_SERIAL) @@ -582,7 +585,6 @@ void Serial_write(uint8_t data) static void Mprotocol_serial_init() { - #define BAUD 100000 #include UBRR0H = UBRRH_VALUE; UBRR0L = UBRRL_VALUE; diff --git a/Multiprotocol/NRF24l01_SPI.ino b/Multiprotocol/NRF24l01_SPI.ino index cec1439..df596e1 100644 --- a/Multiprotocol/NRF24l01_SPI.ino +++ b/Multiprotocol/NRF24l01_SPI.ino @@ -154,7 +154,7 @@ void NRF24L01_SetBitrate(uint8_t bitrate) // Note that bitrate 250kbps (and bit RF_DR_LOW) is valid only // for nRF24L01+. There is no way to programmatically tell it from // older version, nRF24L01, but the older is practically phased out - // by Nordic, so we assume that we deal with with modern version. + // by Nordic, so we assume that we deal with modern version. // Bit 0 goes to RF_DR_HIGH, bit 1 - to RF_DR_LOW rf_setup = (rf_setup & 0xD7) | ((bitrate & 0x02) << 4) | ((bitrate & 0x01) << 3); diff --git a/Multiprotocol/_Config.h b/Multiprotocol/_Config.h index 83bf3ec..090fe4e 100644 --- a/Multiprotocol/_Config.h +++ b/Multiprotocol/_Config.h @@ -59,24 +59,23 @@ #endif //Update this table to set which protocol and all associated settings are called for the corresponding dial number -static const PPM_Parameters PPM_prot[15]= -{ -// Protocol Sub protocol RX_Num Power Auto Bind Option - {MODE_FLYSKY, Flysky , 0 , P_HIGH , NO_AUTOBIND , 0 }, //Dial=1 - {MODE_HUBSAN, 0 , 0 , P_HIGH , NO_AUTOBIND , 0 }, //Dial=2 - {MODE_FRSKY , 0 , 0 , P_HIGH , NO_AUTOBIND , 0xD7 }, //Dial=3 - {MODE_HISKY , Hisky , 0 , P_HIGH , NO_AUTOBIND , 0 }, //Dial=4 - {MODE_V2X2 , 0 , 0 , P_HIGH , NO_AUTOBIND , 0 }, //Dial=5 - {MODE_DSM2 , DSM2 , 0 , P_HIGH , NO_AUTOBIND , 0 }, //Dial=6 - {MODE_DEVO , 0 , 0 , P_HIGH , NO_AUTOBIND , 0 }, //Dial=7 - {MODE_YD717 , YD717 , 0 , P_HIGH , NO_AUTOBIND , 0 }, //Dial=8 - {MODE_KN , WLTOYS , 0 , P_HIGH , NO_AUTOBIND , 0 }, //Dial=9 - {MODE_SYMAX , SYMAX , 0 , P_HIGH , NO_AUTOBIND , 0 }, //Dial=10 - {MODE_SLT , 0 , 0 , P_HIGH , NO_AUTOBIND , 0 }, //Dial=11 - {MODE_CX10 , CX10_BLUE , 0 , P_HIGH , NO_AUTOBIND , 0 }, //Dial=12 - {MODE_CG023 , CG023 , 0 , P_HIGH , NO_AUTOBIND , 0 }, //Dial=13 - {MODE_BAYANG, 0 , 0 , P_HIGH , NO_AUTOBIND , 0 }, //Dial=14 - {MODE_SYMAX , SYMAX5C , 0 , P_HIGH , NO_AUTOBIND , 0 } //Dial=15 +const PPM_Parameters PPM_prot[15]= { +// Dial Protocol Sub protocol RX_Num Power Auto Bind Option +/* 1 */ {MODE_FLYSKY, Flysky , 0 , P_HIGH , NO_AUTOBIND , 0 }, +/* 2 */ {MODE_HUBSAN, 0 , 0 , P_HIGH , NO_AUTOBIND , 0 }, +/* 3 */ {MODE_FRSKY , 0 , 0 , P_HIGH , NO_AUTOBIND , 0xD7 }, +/* 4 */ {MODE_HISKY , Hisky , 0 , P_HIGH , NO_AUTOBIND , 0 }, +/* 5 */ {MODE_V2X2 , 0 , 0 , P_HIGH , NO_AUTOBIND , 0 }, +/* 6 */ {MODE_DSM2 , DSM2 , 0 , P_HIGH , NO_AUTOBIND , 0 }, +/* 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 }, +/* 10 */ {MODE_SYMAX , SYMAX , 0 , P_HIGH , NO_AUTOBIND , 0 }, +/* 11 */ {MODE_SLT , 0 , 0 , P_HIGH , NO_AUTOBIND , 0 }, +/* 12 */ {MODE_CX10 , CX10_BLUE , 0 , P_HIGH , NO_AUTOBIND , 0 }, +/* 13 */ {MODE_CG023 , CG023 , 0 , P_HIGH , NO_AUTOBIND , 0 }, +/* 14 */ {MODE_BAYANG, 0 , 0 , P_HIGH , NO_AUTOBIND , 0 }, +/* 15 */ {MODE_SYMAX , SYMAX5C , 0 , P_HIGH , NO_AUTOBIND , 0 } }; /* Available protocols and associated sub protocols: MODE_FLYSKY @@ -155,10 +154,10 @@ Option value between 0 and 255. 0xD7 or 0x00 for Frsky fine tuning. // Turnigy PPM and channels #if defined(TX_ER9X) -#define PPM_MAX 2140 -#define PPM_MIN 860 -#define PPM_MAX_100 2012 -#define PPM_MIN_100 988 +#define PPM_MAX 2140 // 125% +#define PPM_MIN 860 // 125% +#define PPM_MAX_100 2012 // 100% +#define PPM_MIN_100 988 // 100% enum chan_order{ AILERON =0, ELEVATOR, @@ -178,10 +177,10 @@ enum chan_order{ // Devo PPM and channels #if defined(TX_DEVO7) -#define PPM_MAX 2100 -#define PPM_MIN 900 -#define PPM_MAX_100 1920 -#define PPM_MIN_100 1120 +#define PPM_MAX 2100 // 125% +#define PPM_MIN 900 // 125% +#define PPM_MAX_100 1920 // 100% +#define PPM_MIN_100 1120 // 100% enum chan_order{ ELEVATOR=0, AILERON, @@ -201,10 +200,10 @@ enum chan_order{ // SPEKTRUM PPM and channels #if defined(TX_SPEKTRUM) -#define PPM_MAX 2000 -#define PPM_MIN 1000 -#define PPM_MAX_100 1900 -#define PPM_MIN_100 1100 +#define PPM_MAX 2000 // 125% +#define PPM_MIN 1000 // 125% +#define PPM_MAX_100 1900 // 100% +#define PPM_MIN_100 1100 // 100% enum chan_order{ THROTTLE=0, AILERON, @@ -224,10 +223,10 @@ enum chan_order{ // HISKY #if defined(TX_HISKY) -#define PPM_MAX 2000 -#define PPM_MIN 1000 -#define PPM_MAX_100 1900 -#define PPM_MIN_100 1100 +#define PPM_MAX 2000 // 125% +#define PPM_MIN 1000 // 125% +#define PPM_MAX_100 1900 // 100% +#define PPM_MIN_100 1100 // 100% enum chan_order{ AILERON =0, ELEVATOR, @@ -248,3 +247,7 @@ enum chan_order{ #define PPM_MIN_COMMAND 1250 #define PPM_SWITCH 1550 #define PPM_MAX_COMMAND 1750 + +//Uncoment the desired serial speed +#define BAUD 100000 +//#define BAUD 125000 diff --git a/Multiprotocol/iface_cc2500.h b/Multiprotocol/iface_cc2500.h index cb7b623..ee5242f 100644 --- a/Multiprotocol/iface_cc2500.h +++ b/Multiprotocol/iface_cc2500.h @@ -156,4 +156,43 @@ enum { //void CC2500_WriteData(u8 *packet, u8 length); //void CC2500_ReadData(u8 *dpbuffer, int len); //void CC2500_SetTxRxMode(enum TXRX_State); + +const PROGMEM uint8_t cc2500_conf[][2]={ + { CC2500_02_IOCFG0, 0x06 }, + { CC2500_00_IOCFG2, 0x06 }, + { CC2500_17_MCSM1, 0x0c }, + { CC2500_18_MCSM0, 0x18 }, + { CC2500_06_PKTLEN, 0x19 }, + { CC2500_07_PKTCTRL1, 0x04 }, + { CC2500_08_PKTCTRL0, 0x05 }, + { CC2500_3E_PATABLE, 0xff }, + { CC2500_0B_FSCTRL1, 0x08 }, + { CC2500_0C_FSCTRL0, 0x00 }, // option + { CC2500_0D_FREQ2, 0x5c }, + { CC2500_0E_FREQ1, 0x76 }, + { CC2500_0F_FREQ0, 0x27 }, + { CC2500_10_MDMCFG4, 0xAA }, + { CC2500_11_MDMCFG3, 0x39 }, + { CC2500_12_MDMCFG2, 0x11 }, + { CC2500_13_MDMCFG1, 0x23 }, + { CC2500_14_MDMCFG0, 0x7a }, + { CC2500_15_DEVIATN, 0x42 }, + { CC2500_19_FOCCFG, 0x16 }, + { CC2500_1A_BSCFG, 0x6c }, + { CC2500_1B_AGCCTRL2, 0x43 }, // bind ? 0x43 : 0x03 + { CC2500_1C_AGCCTRL1,0x40 }, + { CC2500_1D_AGCCTRL0,0x91 }, + { CC2500_21_FREND1, 0x56 }, + { CC2500_22_FREND0, 0x10 }, + { CC2500_23_FSCAL3, 0xa9 }, + { CC2500_24_FSCAL2, 0x0A }, + { CC2500_25_FSCAL1, 0x00 }, + { CC2500_26_FSCAL0, 0x11 }, + { CC2500_29_FSTEST, 0x59 }, + { CC2500_2C_TEST2, 0x88 }, + { CC2500_2D_TEST1, 0x31 }, + { CC2500_2E_TEST0, 0x0B }, + { CC2500_03_FIFOTHR, 0x07 }, + { CC2500_09_ADDR, 0x00 } +}; #endif