New _Config.h file, MJXQ fix, 16 bit regs

This commit is contained in:
pascallanger 2016-08-24 14:52:47 +02:00
parent 988d28f2fd
commit 061c97caca
13 changed files with 563 additions and 370 deletions

View File

@ -62,10 +62,9 @@ uint8_t A7105_ReadReg(uint8_t address) {
uint8_t A7105_Read(void) uint8_t A7105_Read(void)
{ {
uint8_t result; uint8_t result=0;
uint8_t i;
SDI_SET_INPUT; SDI_SET_INPUT;
for(i=0;i<8;i++) for(uint8_t i=0;i<8;i++)
{ {
result=result<<1; result=result<<1;
if(SDI_1) ///if SDIO =1 if(SDI_1) ///if SDIO =1

View File

@ -74,17 +74,17 @@ uint16_t ASSAN_callback()
NRF24L01_SetTxRxMode(RX_EN); NRF24L01_SetTxRxMode(RX_EN);
phase++; phase++;
case ASSAN_BIND1: case ASSAN_BIND1:
//Wait for RX to send the frames //Wait for receiver to send the frames
if( NRF24L01_ReadReg(NRF24L01_07_STATUS) & BV(NRF24L01_07_RX_DR)) if( NRF24L01_ReadReg(NRF24L01_07_STATUS) & BV(NRF24L01_07_RX_DR))
{ //Something has been received { //Something has been received
NRF24L01_ReadPayload(packet, ASSAN_PACKET_SIZE); NRF24L01_ReadPayload(packet, ASSAN_PACKET_SIZE);
if(packet[19]==0x13) if(packet[19]==0x13)
{ //Last packet received { //Last frame received
phase++; phase++;
//Switch to TX //Switch to TX
NRF24L01_SetTxRxMode(TXRX_OFF); NRF24L01_SetTxRxMode(TXRX_OFF);
NRF24L01_SetTxRxMode(TX_EN); NRF24L01_SetTxRxMode(TX_EN);
//Prepare packet //Prepare bind packet
memset(packet,0x05,ASSAN_PACKET_SIZE-5); memset(packet,0x05,ASSAN_PACKET_SIZE-5);
packet[15]=0x99; packet[15]=0x99;
for(uint8_t i=0;i<4;i++) for(uint8_t i=0;i<4;i++)

View File

@ -108,7 +108,6 @@ static void __attribute__((unused)) read_code(uint8_t *buf, uint8_t row, uint8_t
// //
uint8_t sop_col; uint8_t sop_col;
uint8_t data_col; uint8_t data_col;
uint16_t cyrf_state;
uint8_t binding; uint8_t binding;
static void __attribute__((unused)) build_bind_packet() static void __attribute__((unused)) build_bind_packet()
@ -146,7 +145,7 @@ static void __attribute__((unused)) build_bind_packet()
static uint8_t __attribute__((unused)) PROTOCOL_SticksMoved(uint8_t init) static uint8_t __attribute__((unused)) PROTOCOL_SticksMoved(uint8_t init)
{ {
#define STICK_MOVEMENT 15*(PPM_MAX-PPM_MIN)/100 // defines when the bind dialog should be interrupted (stick movement STICK_MOVEMENT %) #define STICK_MOVEMENT 15*(servo_max_125-servo_min_125)/100 // defines when the bind dialog should be interrupted (stick movement STICK_MOVEMENT %)
static uint16_t ele_start, ail_start; static uint16_t ele_start, ail_start;
uint16_t ele = Servo_data[ELEVATOR];//CHAN_ReadInput(MIXER_MapChannel(INP_ELEVATOR)); uint16_t ele = Servo_data[ELEVATOR];//CHAN_ReadInput(MIXER_MapChannel(INP_ELEVATOR));
uint16_t ail = Servo_data[AILERON];//CHAN_ReadInput(MIXER_MapChannel(INP_AILERON)); uint16_t ail = Servo_data[AILERON];//CHAN_ReadInput(MIXER_MapChannel(INP_AILERON));
@ -263,7 +262,7 @@ static void __attribute__((unused)) build_data_packet(uint8_t upper)//
value=Servo_data[AUX8]; value=Servo_data[AUX8];
break; break;
} }
value=map(value,PPM_MIN,PPM_MAX,0,max-1); value=map(value,servo_min_125,servo_max_125,0,max-1);
} }
value |= (upper && i == 0 ? 0x8000 : 0) | (idx << bits); value |= (upper && i == 0 ? 0x8000 : 0) | (idx << bits);
} }
@ -416,12 +415,12 @@ uint16_t ReadDsm2()
#define DSM_READ_DELAY 600 // Time before write to check read state, and switch channels. Was 400 but 500 seems what the 328p needs to read a packet #define DSM_READ_DELAY 600 // Time before write to check read state, and switch channels. Was 400 but 500 seems what the 328p needs to read a packet
uint16_t start; uint16_t start;
switch(cyrf_state) switch(state)
{ {
default: default:
//Binding //Binding
cyrf_state++; state++;
if(cyrf_state & 1) if(state & 1)
{ {
//Send packet on even states //Send packet on even states
//Note state has already incremented, so this is actually 'even' state //Note state has already incremented, so this is actually 'even' state
@ -441,17 +440,17 @@ uint16_t ReadDsm2()
cyrf_configdata(); cyrf_configdata();
CYRF_SetTxRxMode(TX_EN); CYRF_SetTxRxMode(TX_EN);
hopping_frequency_no = 0; hopping_frequency_no = 0;
cyrf_state = DSM2_CH1_WRITE_A; // in fact cyrf_state++ state = DSM2_CH1_WRITE_A; // in fact state++
set_sop_data_crc(); set_sop_data_crc();
return 10000; return 10000;
case DSM2_CH1_WRITE_A: case DSM2_CH1_WRITE_A:
case DSM2_CH1_WRITE_B: case DSM2_CH1_WRITE_B:
case DSM2_CH2_WRITE_A: case DSM2_CH2_WRITE_A:
case DSM2_CH2_WRITE_B: case DSM2_CH2_WRITE_B:
build_data_packet(cyrf_state == DSM2_CH1_WRITE_B);// build lower or upper channels build_data_packet(state == DSM2_CH1_WRITE_B);// build lower or upper channels
CYRF_ReadRegister(CYRF_04_TX_IRQ_STATUS); // clear IRQ flags CYRF_ReadRegister(CYRF_04_TX_IRQ_STATUS); // clear IRQ flags
CYRF_WriteDataPacket(packet); CYRF_WriteDataPacket(packet);
cyrf_state++; // change from WRITE to CHECK mode state++; // change from WRITE to CHECK mode
return DSM_WRITE_DELAY; return DSM_WRITE_DELAY;
case DSM2_CH1_CHECK_A: case DSM2_CH1_CHECK_A:
case DSM2_CH1_CHECK_B: case DSM2_CH1_CHECK_B:
@ -460,7 +459,7 @@ uint16_t ReadDsm2()
if(CYRF_ReadRegister(CYRF_04_TX_IRQ_STATUS) & 0x02) if(CYRF_ReadRegister(CYRF_04_TX_IRQ_STATUS) & 0x02)
break; break;
set_sop_data_crc(); set_sop_data_crc();
cyrf_state++; // change from CH1_CHECK to CH2_WRITE state++; // change from CH1_CHECK to CH2_WRITE
return DSM_CH1_CH2_DELAY - DSM_WRITE_DELAY; return DSM_CH1_CH2_DELAY - DSM_WRITE_DELAY;
case DSM2_CH2_CHECK_A: case DSM2_CH2_CHECK_A:
case DSM2_CH2_CHECK_B: case DSM2_CH2_CHECK_B:
@ -468,10 +467,10 @@ uint16_t ReadDsm2()
while ((uint16_t)micros()-start < 500) // Wait max 500µs while ((uint16_t)micros()-start < 500) // Wait max 500µs
if(CYRF_ReadRegister(CYRF_04_TX_IRQ_STATUS) & 0x02) if(CYRF_ReadRegister(CYRF_04_TX_IRQ_STATUS) & 0x02)
break; break;
if (cyrf_state == DSM2_CH2_CHECK_A) if (state == DSM2_CH2_CHECK_A)
CYRF_SetPower(0x28); //Keep transmit power in sync CYRF_SetPower(0x28); //Keep transmit power in sync
#if defined DSM_TELEMETRY #if defined DSM_TELEMETRY
cyrf_state++; // change from CH2_CHECK to CH2_READ state++; // change from CH2_CHECK to CH2_READ
if(option<=3 || option>7) if(option<=3 || option>7)
{ // disable telemetry for option between 4 and 7 ie 4,5,6,7 channels @11ms since it does not work... { // disable telemetry for option between 4 and 7 ie 4,5,6,7 channels @11ms since it does not work...
CYRF_SetTxRxMode(RX_EN); //Receive mode CYRF_SetTxRxMode(RX_EN); //Receive mode
@ -494,7 +493,7 @@ uint16_t ReadDsm2()
pkt[0]=CYRF_ReadRegister(CYRF_13_RSSI)&0x1F; // store RSSI of the received telemetry signal pkt[0]=CYRF_ReadRegister(CYRF_13_RSSI)&0x1F; // store RSSI of the received telemetry signal
telemetry_link=1; telemetry_link=1;
} }
if (cyrf_state == DSM2_CH2_READ_A && option <= 3) // normal 22ms mode if option<=3 ie 4,5,6,7 channels @22ms if (state == DSM2_CH2_READ_A && option <= 3) // normal 22ms mode if option<=3 ie 4,5,6,7 channels @22ms
{ {
//Force end read state //Force end read state
CYRF_WriteRegister(CYRF_0F_XACT_CFG, (CYRF_ReadRegister(CYRF_0F_XACT_CFG) | 0x20)); // Force end state CYRF_WriteRegister(CYRF_0F_XACT_CFG, (CYRF_ReadRegister(CYRF_0F_XACT_CFG) | 0x20)); // Force end state
@ -502,35 +501,35 @@ uint16_t ReadDsm2()
while ((uint16_t)micros()-start < 100) // Wait max 100 µs while ((uint16_t)micros()-start < 100) // Wait max 100 µs
if((CYRF_ReadRegister(CYRF_0F_XACT_CFG) & 0x20) == 0) if((CYRF_ReadRegister(CYRF_0F_XACT_CFG) & 0x20) == 0)
break; break;
cyrf_state = DSM2_CH2_READ_B; state = DSM2_CH2_READ_B;
CYRF_WriteRegister(CYRF_05_RX_CTRL, 0x87); //0x80??? //Prepare to receive CYRF_WriteRegister(CYRF_05_RX_CTRL, 0x87); //0x80??? //Prepare to receive
return 11000; return 11000;
} }
if (cyrf_state == DSM2_CH2_READ_A && option>7) if (state == DSM2_CH2_READ_A && option>7)
cyrf_state = DSM2_CH1_WRITE_B; //Transmit upper state = DSM2_CH1_WRITE_B; //Transmit upper
else else
cyrf_state = DSM2_CH1_WRITE_A; //Force 11ms if option>3 ie 4,5,6,7 channels @11ms state = DSM2_CH1_WRITE_A; //Force 11ms if option>3 ie 4,5,6,7 channels @11ms
CYRF_SetTxRxMode(TX_EN); //Write mode CYRF_SetTxRxMode(TX_EN); //Write mode
set_sop_data_crc(); set_sop_data_crc();
return DSM_READ_DELAY; return DSM_READ_DELAY;
#else #else
// No telemetry // No telemetry
set_sop_data_crc(); set_sop_data_crc();
if (cyrf_state == DSM2_CH2_CHECK_A) if (state == DSM2_CH2_CHECK_A)
{ {
if(option < 8) if(option < 8)
{ {
cyrf_state = DSM2_CH1_WRITE_A; // change from CH2_CHECK_A to CH1_WRITE_A (ie no upper) state = DSM2_CH1_WRITE_A; // change from CH2_CHECK_A to CH1_WRITE_A (ie no upper)
if(option>3) if(option>3)
return 11000 - DSM_CH1_CH2_DELAY - DSM_WRITE_DELAY ; // force 11ms if option>3 ie 4,5,6,7 channels @11ms return 11000 - DSM_CH1_CH2_DELAY - DSM_WRITE_DELAY ; // force 11ms if option>3 ie 4,5,6,7 channels @11ms
else else
return 22000 - DSM_CH1_CH2_DELAY - DSM_WRITE_DELAY ; // normal 22ms mode if option<=3 ie 4,5,6,7 channels @22ms return 22000 - DSM_CH1_CH2_DELAY - DSM_WRITE_DELAY ; // normal 22ms mode if option<=3 ie 4,5,6,7 channels @22ms
} }
else else
cyrf_state = DSM2_CH1_WRITE_B; // change from CH2_CHECK_A to CH1_WRITE_A (to transmit upper) state = DSM2_CH1_WRITE_B; // change from CH2_CHECK_A to CH1_WRITE_A (to transmit upper)
} }
else else
cyrf_state = DSM2_CH1_WRITE_A; // change from CH2_CHECK_B to CH1_WRITE_A (upper already transmitted so transmit lower) state = DSM2_CH1_WRITE_A; // change from CH2_CHECK_B to CH1_WRITE_A (upper already transmitted so transmit lower)
return 11000 - DSM_CH1_CH2_DELAY - DSM_WRITE_DELAY; return 11000 - DSM_CH1_CH2_DELAY - DSM_WRITE_DELAY;
#endif #endif
} }
@ -581,14 +580,14 @@ uint16_t initDsm2()
// //
if(IS_AUTOBIND_FLAG_on) if(IS_AUTOBIND_FLAG_on)
{ {
cyrf_state = DSM2_BIND; state = DSM2_BIND;
PROTOCOL_SticksMoved(1); //Initialize Stick position PROTOCOL_SticksMoved(1); //Initialize Stick position
initialize_bind_state(); initialize_bind_state();
binding = 1; binding = 1;
} }
else else
{ {
cyrf_state = DSM2_CHANSEL;// state = DSM2_CHANSEL;//
binding = 0; binding = 0;
} }
return 10000; return 10000;

View File

@ -148,7 +148,7 @@ static void __attribute__((unused)) build_data_pkt()
for (i = 0; i < 4; i++) for (i = 0; i < 4; i++)
{ {
// //
int16_t value= map(Servo_data[ch_idx * 4 + i],PPM_MIN,PPM_MAX,-1600,1600);//range -1600...+1600 int16_t value= map(Servo_data[ch_idx * 4 + i],servo_min_125,servo_max_125,-1600,1600);//range -1600...+1600
//s32 value = (s32)Channels[ch_idx * 4 + i] * 0x640 / CHAN_MAX_VALUE;//10000 //s32 value = (s32)Channels[ch_idx * 4 + i] * 0x640 / CHAN_MAX_VALUE;//10000
if(value < 0) if(value < 0)
{ {

View File

@ -145,7 +145,7 @@ static uint16_t __attribute__((unused)) crc_x(uint8_t *data, uint8_t len)
static uint16_t __attribute__((unused)) scaleForPXX( uint8_t i ) static uint16_t __attribute__((unused)) scaleForPXX( uint8_t i )
{ //mapped 860,2140(125%) range to 64,1984(PXX values); { //mapped 860,2140(125%) range to 64,1984(PXX values);
return (uint16_t)(((Servo_data[i]-PPM_MIN)*3)>>1)+64; return (uint16_t)(((Servo_data[i]-servo_min_125)*3)>>1)+64;
} }
static void __attribute__((unused)) frskyX_build_bind_packet() static void __attribute__((unused)) frskyX_build_bind_packet()

View File

@ -122,7 +122,7 @@ static void __attribute__((unused)) build_ch_data()
uint8_t i,j; uint8_t i,j;
for (i = 0; i< 8; i++) { for (i = 0; i< 8; i++) {
j=CH_AETR[i]; j=CH_AETR[i];
temp=map(limit_channel_100(j),PPM_MIN_100,PPM_MAX_100,0,1000); temp=map(limit_channel_100(j),servo_min_100,servo_max_100,0,1000);
if (j == THROTTLE) // It is clear that hisky's throttle stick is made reversely, so I adjust it here on purpose if (j == THROTTLE) // It is clear that hisky's throttle stick is made reversely, so I adjust it here on purpose
temp = 1000 -temp; temp = 1000 -temp;
if (j == AUX3) if (j == AUX3)

View File

@ -26,6 +26,17 @@
#define MJXQ_RF_NUM_CHANNELS 4 #define MJXQ_RF_NUM_CHANNELS 4
#define MJXQ_ADDRESS_LENGTH 5 #define MJXQ_ADDRESS_LENGTH 5
// haven't figured out txid<-->rf channel mapping for MJX models
const uint8_t PROGMEM MJXQ_map_rfchan[][4] = {
{0x0A, 0x46, 0x3A, 0x42},
{0x0A, 0x3C, 0x36, 0x3F},
{0x0A, 0x43, 0x36, 0x3F} };
const uint8_t PROGMEM MJXQ_map_txid[][3] = {
{0xF8, 0x4F, 0x1C},
{0xC8, 0x6E, 0x02},
{0x48, 0x6A, 0x40} };
#define MJXQ_PAN_TILT_COUNT 16 // for H26D - match stock tx timing #define MJXQ_PAN_TILT_COUNT 16 // for H26D - match stock tx timing
#define MJXQ_PAN_DOWN 0x08 #define MJXQ_PAN_DOWN 0x08
#define MJXQ_PAN_UP 0x04 #define MJXQ_PAN_UP 0x04
@ -39,14 +50,14 @@ static uint8_t __attribute__((unused)) MJXQ_pan_tilt_value()
packet_count++; packet_count++;
if(packet_count & MJXQ_PAN_TILT_COUNT) if(packet_count & MJXQ_PAN_TILT_COUNT)
{ {
if(Servo_AUX8) if(Servo_data[AUX8]>PPM_MAX_COMMAND)
pan=MJXQ_PAN_UP; pan=MJXQ_PAN_UP;
if(Servo_data[AUX8]<PPM_MIN_COMMAND) if(Servo_data[AUX8]<PPM_MIN_COMMAND)
pan=MJXQ_PAN_DOWN; pan=MJXQ_PAN_DOWN;
if(Servo_data[AUX9]>PPM_MIN_COMMAND) if(Servo_data[AUX9]>PPM_MAX_COMMAND)
pan=MJXQ_TILT_UP; pan+=MJXQ_TILT_UP;
if(Servo_data[AUX9]<PPM_MIN_COMMAND) if(Servo_data[AUX9]<PPM_MIN_COMMAND)
pan=MJXQ_TILT_DOWN; pan+=MJXQ_TILT_DOWN;
} }
return pan; return pan;
} }
@ -188,29 +199,21 @@ static void __attribute__((unused)) MJXQ_init()
static void __attribute__((unused)) MJXQ_init2() static void __attribute__((unused)) MJXQ_init2()
{ {
// haven't figured out txid<-->rf channel mapping for MJX models
static const uint8_t rf_map[][4] = {
{0x0A, 0x46, 0x3A, 0x42},
{0x0A, 0x3C, 0x36, 0x3F},
{0x0A, 0x43, 0x36, 0x3F} };
if (sub_protocol == H26D) if (sub_protocol == H26D)
memcpy(hopping_frequency, "\x32\x3e\x42\x4e", MJXQ_RF_NUM_CHANNELS); memcpy(hopping_frequency, "\x32\x3e\x42\x4e", MJXQ_RF_NUM_CHANNELS);
else else
if (sub_protocol == WLH08) if (sub_protocol == WLH08)
memcpy(hopping_frequency, rf_map[rx_tx_addr[0]%3], MJXQ_RF_NUM_CHANNELS); for(uint8_t i=0;i<MJXQ_RF_NUM_CHANNELS;i++)
hopping_frequency[i]=pgm_read_byte_near( &MJXQ_map_rfchan[rx_tx_addr[4]%3][i] );
} }
static void __attribute__((unused)) MJXQ_initialize_txid() static void __attribute__((unused)) MJXQ_initialize_txid()
{ {
// haven't figured out txid<-->rf channel mapping for MJX models
static const uint8_t tx_map[][3]={
{0xF8, 0x4F, 0x1C},
{0xC8, 0x6E, 0x02},
{0x48, 0x6A, 0x40} };
if (sub_protocol == WLH08) if (sub_protocol == WLH08)
rx_tx_addr[0]&=0xF8; // txid must be multiple of 8 rx_tx_addr[0]&=0xF8; // txid must be multiple of 8
else else
memcpy(rx_tx_addr,tx_map[rx_tx_addr[0]%3],3); for(uint8_t i=0;i<3;i++)
rx_tx_addr[i]=pgm_read_byte_near( &MJXQ_map_txid[rx_tx_addr[4]%3][i] );
} }
uint16_t MJXQ_callback() uint16_t MJXQ_callback()

View File

@ -28,83 +28,84 @@
//****************** //******************
enum PROTOCOLS enum PROTOCOLS
{ {
MODE_SERIAL = 0, // Serial commands MODE_SERIAL = 0, // Serial commands
MODE_FLYSKY = 1, // =>A7105 MODE_FLYSKY = 1, // =>A7105
MODE_HUBSAN = 2, // =>A7105 MODE_HUBSAN = 2, // =>A7105
MODE_FRSKY = 3, // =>CC2500 MODE_FRSKY = 3, // =>CC2500
MODE_HISKY = 4, // =>NRF24L01 MODE_HISKY = 4, // =>NRF24L01
MODE_V2X2 = 5, // =>NRF24L01 MODE_V2X2 = 5, // =>NRF24L01
MODE_DSM2 = 6, // =>CYRF6936 MODE_DSM2 = 6, // =>CYRF6936
MODE_DEVO =7, // =>CYRF6936 MODE_DEVO = 7, // =>CYRF6936
MODE_YD717 = 8, // =>NRF24L01 MODE_YD717 = 8, // =>NRF24L01
MODE_KN = 9, // =>NRF24L01 MODE_KN = 9, // =>NRF24L01
MODE_SYMAX = 10, // =>NRF24L01 MODE_SYMAX = 10, // =>NRF24L01
MODE_SLT = 11, // =>NRF24L01 MODE_SLT = 11, // =>NRF24L01
MODE_CX10 = 12, // =>NRF24L01 MODE_CX10 = 12, // =>NRF24L01
MODE_CG023 = 13, // =>NRF24L01 MODE_CG023 = 13, // =>NRF24L01
MODE_BAYANG = 14, // =>NRF24L01 MODE_BAYANG = 14, // =>NRF24L01
MODE_FRSKYX = 15, // =>CC2500 MODE_FRSKYX = 15, // =>CC2500
MODE_ESKY = 16, // =>NRF24L01 MODE_ESKY = 16, // =>NRF24L01
MODE_MT99XX=17, // =>NRF24L01 MODE_MT99XX = 17, // =>NRF24L01
MODE_MJXQ=18, // =>NRF24L01 MODE_MJXQ = 18, // =>NRF24L01
MODE_SHENQI=19, // =>NRF24L01 MODE_SHENQI = 19, // =>NRF24L01
MODE_FY326=20, // =>NRF24L01 MODE_FY326 = 20, // =>NRF24L01
MODE_SFHSS=21, // =>CC2500 MODE_SFHSS = 21, // =>CC2500
MODE_J6PRO=22, // =>CYRF6936 MODE_J6PRO = 22, // =>CYRF6936
MODE_FQ777=23, // =>NRF24L01 MODE_FQ777 = 23, // =>NRF24L01
MODE_ASSAN=24 // =>NRF24L01 MODE_ASSAN = 24 // =>NRF24L01
}; };
enum Flysky enum Flysky
{ {
Flysky=0, Flysky = 0,
V9X9=1, V9X9 = 1,
V6X6=2, V6X6 = 2,
V912=3 V912 = 3
}; };
enum Hisky enum Hisky
{ {
Hisky=0, Hisky = 0,
HK310=1 HK310 = 1
}; };
enum DSM2{ enum DSM2
DSM2=0, {
DSMX=1 DSM2 = 0,
DSMX = 1
}; };
enum YD717 enum YD717
{ {
YD717=0, YD717 = 0,
SKYWLKR=1, SKYWLKR = 1,
SYMAX4=2, SYMAX4 = 2,
XINXUN=3, XINXUN = 3,
NIHUI=4 NIHUI = 4
}; };
enum KN enum KN
{ {
WLTOYS=0, WLTOYS = 0,
FEILUN=1 FEILUN = 1
}; };
enum SYMAX enum SYMAX
{ {
SYMAX=0, SYMAX = 0,
SYMAX5C=1 SYMAX5C = 1
}; };
enum CX10 enum CX10
{ {
CX10_GREEN = 0, CX10_GREEN = 0,
CX10_BLUE=1, // also compatible with CX10-A, CX12 CX10_BLUE = 1, // also compatible with CX10-A, CX12
DM007=2, DM007 = 2,
Q282=3, Q282 = 3,
JC3015_1=4, JC3015_1 = 4,
JC3015_2=5, JC3015_2 = 5,
MK33041=6, MK33041 = 6,
Q242=7 Q242 = 7
}; };
enum CG023 enum CG023
{ {
CG023 = 0, CG023 = 0,
YD829 = 1, YD829 = 1,
H8_3D = 2 H8_3D = 2
}; };
enum MT99XX enum MT99XX
{ {
@ -146,126 +147,118 @@ struct PPM_Parameters
//******************* //*******************
//*** Pinouts *** //*** Pinouts ***
//******************* //*******************
//#define BIND_pin 13 #define LED_pin 13 //Promini original led on B5
#define LED_pin 13 //Promini original led on B5 #define PPM_pin 3 //PPM-D3
//
#define PPM_pin 3 //PPM -D3
#ifdef XMEGA #ifdef XMEGA
#define SDI_pin 6 //SDIO-D6 #define SDI_pin 6 //SDIO-D6
#else #else
#define SDI_pin 5 //SDIO-D5 #define SDI_pin 5 //SDIO-D5
#endif #endif
#define SCLK_pin 4 //SCK-D4 #define SCLK_pin 4 //SCK-D4
#define CS_pin 2 //CS-D2 #define CS_pin 2 //CS-D2
#define SDO_pin 6 //D6 #define SDO_pin 6 //D6
//
#define CTRL1 1 //C1 (A1)
#define CTRL2 2 //C2 (A2)
//
#ifdef XMEGA
#define CTRL1_on
#define CTRL1_off
//
#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)
#endif
//
#ifdef XMEGA
#define CS_on PORTD.OUTSET = _BV(4) //D4
#define CS_off PORTD.OUTCLR = _BV(4) //D4
#else
#define CS_on PORTD |= _BV(2) //D2
#define CS_off PORTD &= ~_BV(2) //D2
#endif
//
#ifdef XMEGA
#define SCK_on PORTD.OUTSET = _BV(7) //D7
#define SCK_off PORTD.OUTCLR = _BV(7) //D7
#else
#define SCK_on PORTD |= _BV(4) //D4
#define SCK_off PORTD &= ~_BV(4) //D4
#endif
//
#ifdef XMEGA
#define SDI_on PORTD.OUTSET = _BV(5) //D5
#define SDI_off PORTD.OUTCLR = _BV(5) //D5
#else
#define SDI_on PORTD |= _BV(5) //D5
#define SDI_off PORTD &= ~_BV(5) //D5
#endif
#ifdef XMEGA
#define SDI_1 (PORTD.IN & (1<<SDI_pin)) == (1<<SDI_pin) //D5
#define SDI_0 (PORTD.IN & (1<<SDI_pin)) == 0x00 //D5
#else
#define SDI_1 (PIND & (1<<SDI_pin)) == (1<<SDI_pin) //D5
#define SDI_0 (PIND & (1<<SDI_pin)) == 0x00 //D5
#endif
//
#define SDI_SET_INPUT DDRD &= ~_BV(5) //D5
#define SDI_SET_OUTPUT DDRD |= _BV(5) //D5
//Hisky /CC2500/CYRF aditional pinout
#define CC25_CSN_pin 7 #define CC25_CSN_pin 7
#define NRF_CSN_pin 8 #define NRF_CSN_pin 8
#define CYRF_CSN_pin 9 #define CYRF_CSN_pin 9
// #define CTRL1 1 //C1 (A1)
#define CYRF_RST_pin A5 //reset pin #define CTRL2 2 //C2 (A2)
// //
#ifdef XMEGA #ifdef XMEGA
#define CC25_CSN_on PORTD.OUTSET = _BV(7) //D7 #define CTRL1_on
#define CC25_CSN_off PORTD.OUTCLR = _BV(7) //D7 #define CTRL1_off
#define CTRL2_on
#define CTRL2_off
#else #else
#define CC25_CSN_on PORTD |= _BV(7) //D7 #define CTRL1_on PORTC |= _BV(1)
#define CC25_CSN_off PORTD &= ~_BV(7) //D7 #define CTRL1_off PORTC &= ~_BV(1)
#define CTRL2_on PORTC |= _BV(2)
#define CTRL2_off PORTC &= ~_BV(2)
#endif #endif
// //
#ifdef XMEGA #ifdef XMEGA
#define NRF_CSN_on #define CS_on PORTD.OUTSET = _BV(4) //D4
#define NRF_CSN_off #define CS_off PORTD.OUTCLR = _BV(4) //D4
#else #else
#define NRF_CSN_on PORTB |= _BV(0) //D8 #define CS_on PORTD |= _BV(2) //D2
#define NRF_CSN_off PORTB &= ~_BV(0) //D8 #define CS_off PORTD &= ~_BV(2) //D2
#endif #endif
// //
#ifdef XMEGA #ifdef XMEGA
#define CYRF_CSN_on PORTD.OUTSET = _BV(4) //D9 #define SCK_on PORTD.OUTSET = _BV(7) //D7
#define CYRF_CSN_off PORTD.OUTCLR = _BV(4) //D9 #define SCK_off PORTD.OUTCLR = _BV(7) //D7
#else #else
#define CYRF_CSN_on PORTB |= _BV(1) //D9 #define SCK_on PORTD |= _BV(4) //D4
#define CYRF_CSN_off PORTB &= ~_BV(1) //D9 #define SCK_off PORTD &= ~_BV(4) //D4
#define CYRF_RST_HI PORTC|= _BV(5) //reset cyrf #endif
#define CYRF_RST_LO PORTC&=~_BV(5) // //
#ifdef XMEGA
#define SDI_on PORTD.OUTSET = _BV(5) //D5
#define SDI_off PORTD.OUTCLR = _BV(5) //D5
#else
#define SDI_on PORTD |= _BV(5) //D5
#define SDI_off PORTD &= ~_BV(5) //D5
#endif
//
#ifdef XMEGA
#define SDI_1 (PORTD.IN & (1<<SDI_pin)) == (1<<SDI_pin) //D5
#define SDI_0 (PORTD.IN & (1<<SDI_pin)) == 0x00 //D5
#else
#define SDI_1 (PIND & (1<<SDI_pin)) == (1<<SDI_pin) //D5
#define SDI_0 (PIND & (1<<SDI_pin)) == 0x00 //D5
#endif
//
#define SDI_SET_INPUT DDRD &= ~_BV(5) //D5
#define SDI_SET_OUTPUT DDRD |= _BV(5) //D5
//
#ifdef XMEGA
#define CC25_CSN_on PORTD.OUTSET = _BV(7) //D7
#define CC25_CSN_off PORTD.OUTCLR = _BV(7) //D7
#else
#define CC25_CSN_on PORTD |= _BV(7) //D7
#define CC25_CSN_off PORTD &= ~_BV(7) //D7
#endif
//
#ifdef XMEGA
#define NRF_CSN_on
#define NRF_CSN_off
#else
#define NRF_CSN_on PORTB |= _BV(0) //D8
#define NRF_CSN_off PORTB &= ~_BV(0) //D8
#endif
//
#ifdef XMEGA
#define CYRF_CSN_on PORTD.OUTSET = _BV(4)
#define CYRF_CSN_off PORTD.OUTCLR = _BV(4)
#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
#endif #endif
// //
#ifdef XMEGA #ifdef XMEGA
#define SDO_1 (PORTD.IN & (1<<SDO_pin)) == (1<<SDO_pin) //D6 #define SDO_1 (PORTD.IN & (1<<SDO_pin)) == (1<<SDO_pin) //D6
#define SDO_0 (PORTD.IN & (1<<SDO_pin)) == 0x00 //D6 #define SDO_0 (PORTD.IN & (1<<SDO_pin)) == 0x00 //D6
#else #else
#define SDO_1 (PIND & (1<<SDO_pin)) == (1<<SDO_pin) //D6 #define SDO_1 (PIND & (1<<SDO_pin)) == (1<<SDO_pin) //D6
#define SDO_0 (PIND & (1<<SDO_pin)) == 0x00 //D6 #define SDO_0 (PIND & (1<<SDO_pin)) == 0x00 //D6
#endif #endif
// //
// //
// LED // LED
#ifdef XMEGA #ifdef XMEGA
#define LED_ON PORTD.OUTCLR = _BV(1) #define LED_ON PORTD.OUTCLR = _BV(1)
#define LED_OFF PORTD.OUTSET = _BV(1) #define LED_OFF PORTD.OUTSET = _BV(1)
#define LED_TOGGLE PORTD.OUTTGL = _BV(1) #define LED_TOGGLE PORTD.OUTTGL = _BV(1)
#define LED_SET_OUTPUT PORTD.DIRSET = _BV(1) #define LED_SET_OUTPUT PORTD.DIRSET = _BV(1)
#define IS_LED_on ( (PORTD.OUT & _BV(1)) != 0x00 ) #define IS_LED_on ( (PORTD.OUT & _BV(1)) != 0x00 )
#else #else
#define LED_ON PORTB |= _BV(5) #define LED_ON PORTB |= _BV(5)
#define LED_OFF PORTB &= ~_BV(5) #define LED_OFF PORTB &= ~_BV(5)
#define LED_TOGGLE PORTB ^= _BV(5) #define LED_TOGGLE PORTB ^= _BV(5)
#define LED_SET_OUTPUT DDRB |= _BV(5) #define LED_SET_OUTPUT DDRB |= _BV(5)
#define IS_LED_on ( (PORTB & _BV(5)) != 0x00 ) #define IS_LED_on ( (PORTB & _BV(5)) != 0x00 )
#endif #endif
// TX // TX

View File

@ -28,6 +28,7 @@
//Multiprotocol module configuration file //Multiprotocol module configuration file
#include "_Config.h" #include "_Config.h"
#include "TX_Def.h"
//Global constants/variables //Global constants/variables
uint32_t MProtocol_id;//tx id, uint32_t MProtocol_id;//tx id,
@ -47,6 +48,7 @@ uint8_t packet[40];
// Servo data // Servo data
uint16_t Servo_data[NUM_CHN]; uint16_t Servo_data[NUM_CHN];
uint8_t Servo_AUX; uint8_t Servo_AUX;
uint16_t servo_max_100,servo_min_100,servo_max_125,servo_min_125;
// Protocol variables // Protocol variables
uint8_t rx_tx_addr[5]; uint8_t rx_tx_addr[5];
@ -195,8 +197,10 @@ void setup()
// Set servos positions // Set servos positions
for(uint8_t i=0;i<NUM_CHN;i++) for(uint8_t i=0;i<NUM_CHN;i++)
Servo_data[i]=1500; Servo_data[i]=1500;
Servo_data[THROTTLE]=PPM_MIN_100; Servo_data[THROTTLE]=servo_min_100;
#ifdef ENABLE_PPM
memcpy((void *)PPM_data,Servo_data, sizeof(Servo_data)); memcpy((void *)PPM_data,Servo_data, sizeof(Servo_data));
#endif
//Wait for every component to start //Wait for every component to start
delayMilliseconds(100); delayMilliseconds(100);
@ -217,9 +221,6 @@ void setup()
#else #else
mode_select=0x0F - ( ( (PINB>>2)&0x07 ) | ( (PINC<<3)&0x08) );//encoder dip switches 1,2,4,8=>B2,B3,B4,C0 mode_select=0x0F - ( ( (PINB>>2)&0x07 ) | ( (PINC<<3)&0x08) );//encoder dip switches 1,2,4,8=>B2,B3,B4,C0
#endif #endif
//**********************************
//mode_select=1; // here to test PPM
//**********************************
// Update LED // Update LED
LED_OFF; LED_OFF;
@ -242,6 +243,7 @@ void setup()
NRF24L01_Reset(); NRF24L01_Reset();
#endif #endif
#ifdef ENABLE_PPM
//Protocol and interrupts initialization //Protocol and interrupts initialization
if(mode_select != MODE_SERIAL) if(mode_select != MODE_SERIAL)
{ // PPM { // PPM
@ -254,6 +256,8 @@ void setup()
if(PPM_prot[mode_select].power) POWER_FLAG_on; if(PPM_prot[mode_select].power) POWER_FLAG_on;
if(PPM_prot[mode_select].autobind) AUTOBIND_FLAG_on; if(PPM_prot[mode_select].autobind) AUTOBIND_FLAG_on;
mode_select++; mode_select++;
servo_max_100=PPM_MAX_100; servo_min_100=PPM_MIN_100;
servo_max_125=PPM_MAX_125; servo_min_125=PPM_MIN_125;
protocol_init(); protocol_init();
@ -268,17 +272,23 @@ void setup()
#endif #endif
} }
else else
#endif //ENABLE_PPM
{ // Serial { // Serial
#ifdef ENABLE_SERIAL
cur_protocol[0]=0; cur_protocol[0]=0;
cur_protocol[1]=0; cur_protocol[1]=0;
prev_protocol=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 Mprotocol_serial_init(); // Configure serial and enable RX interrupt
#endif //ENABLE_SERIAL
} }
} }
// Main // Main
void loop() void loop()
{ {
#ifdef ENABLE_SERIAL
if(mode_select==MODE_SERIAL && IS_RX_FLAG_on) // Serial mode and something has been received if(mode_select==MODE_SERIAL && IS_RX_FLAG_on) // Serial mode and something has been received
{ {
update_serial_data(); // Update protocol and data update_serial_data(); // Update protocol and data
@ -291,6 +301,8 @@ void loop()
CHANGE_PROTOCOL_FLAG_off; //done CHANGE_PROTOCOL_FLAG_off; //done
} }
} }
#endif //ENABLE_SERIAL
#ifdef ENABLE_PPM
if(mode_select!=MODE_SERIAL && IS_PPM_FLAG_on) // PPM mode and a full frame has been received if(mode_select!=MODE_SERIAL && IS_PPM_FLAG_on) // PPM mode and a full frame has been received
{ {
for(uint8_t i=0;i<NUM_CHN;i++) for(uint8_t i=0;i<NUM_CHN;i++)
@ -299,11 +311,14 @@ void loop()
cli(); // disable global int cli(); // disable global int
temp_ppm = PPM_data[i] ; temp_ppm = PPM_data[i] ;
sei(); // enable global int sei(); // enable global int
if(temp_ppm<PPM_MIN_125) temp_ppm=PPM_MIN_125;
else if(temp_ppm>PPM_MAX_125) temp_ppm=PPM_MAX_125;
Servo_data[i]= temp_ppm ; Servo_data[i]= temp_ppm ;
} }
update_aux_flags(); update_aux_flags();
PPM_FLAG_off; // wait for next frame before update PPM_FLAG_off; // wait for next frame before update
} }
#endif //ENABLE_PPM
update_led_status(); update_led_status();
#if defined(TELEMETRY) #if defined(TELEMETRY)
if( ((cur_protocol[0]&0x1F)==MODE_FRSKY) || ((cur_protocol[0]&0x1F)==MODE_HUBSAN) || ((cur_protocol[0]&0x1F)==MODE_FRSKYX) || ((cur_protocol[0]&0x1F)==MODE_DSM2) ) if( ((cur_protocol[0]&0x1F)==MODE_FRSKY) || ((cur_protocol[0]&0x1F)==MODE_HUBSAN) || ((cur_protocol[0]&0x1F)==MODE_FRSKYX) || ((cur_protocol[0]&0x1F)==MODE_DSM2) )
@ -362,10 +377,8 @@ static void CheckTimer(uint16_t (*cb)(void))
#else #else
if( (TIFR1 & (1<<OCF1A)) != 0) if( (TIFR1 & (1<<OCF1A)) != 0)
{ {
uint16_t temp ;
temp = TCNT1 ;
cli(); // disable global int cli(); // disable global int
OCR1A=temp; // Callback should already have been called... Use "now" as new sync point. OCR1A=TCNT1; // Callback should already have been called... Use "now" as new sync point.
sei(); // enable global int sei(); // enable global int
} }
else else
@ -384,10 +397,8 @@ static void CheckTimer(uint16_t (*cb)(void))
sei(); // enable global int sei(); // enable global int
while((TCC1.INTFLAGS & TC1_CCAIF_bm) == 0); // wait 2ms... while((TCC1.INTFLAGS & TC1_CCAIF_bm) == 0); // wait 2ms...
#else #else
uint16_t temp ;
temp = OCR1A + 2000*2 ;
cli(); // disable global int cli(); // disable global int
OCR1A = temp ; // set compare A for callback OCR1A = OCR1A + 2000*2 ; // set compare A for callback
TIFR1=(1<<OCF1A); // clear compare A=callback flag TIFR1=(1<<OCF1A); // clear compare A=callback flag
sei(); // enable global int sei(); // enable global int
while((TIFR1 & (1<<OCF1A)) == 0); // wait 2ms... while((TIFR1 & (1<<OCF1A)) == 0); // wait 2ms...
@ -595,7 +606,7 @@ static void protocol_init()
if(next_callback>32000) if(next_callback>32000)
{ // next_callback should not be more than 32767 so we will wait here... { // next_callback should not be more than 32767 so we will wait here...
uint16_t temp=next_callback>>10-2; uint16_t temp=(next_callback>>10)-2;
delayMilliseconds(temp); delayMilliseconds(temp);
next_callback-=temp<<10; // between 2-3ms left at this stage next_callback-=temp<<10; // between 2-3ms left at this stage
} }
@ -612,7 +623,7 @@ static void protocol_init()
BIND_BUTTON_FLAG_off; // do not bind/reset id anymore even if protocol change BIND_BUTTON_FLAG_off; // do not bind/reset id anymore even if protocol change
} }
static void update_serial_data() void update_serial_data()
{ {
if(rx_ok_buff[0]&0x20) //check range if(rx_ok_buff[0]&0x20) //check range
RANGE_FLAG_on; RANGE_FLAG_on;
@ -660,7 +671,7 @@ static void update_serial_data()
RX_FLAG_off; //data has been processed RX_FLAG_off; //data has been processed
} }
static void module_reset() void module_reset()
{ {
if(remote_callback) if(remote_callback)
{ // previous protocol loaded { // previous protocol loaded
@ -703,13 +714,13 @@ int16_t map( int16_t x, int16_t in_min, int16_t in_max, int16_t out_min, int16_t
// Channel value is converted to 8bit values full scale // Channel value is converted to 8bit values full scale
uint8_t convert_channel_8b(uint8_t num) uint8_t convert_channel_8b(uint8_t num)
{ {
return (uint8_t) (map(limit_channel_100(num),PPM_MIN_100,PPM_MAX_100,0,255)); return (uint8_t) (map(limit_channel_100(num),servo_min_100,servo_max_100,0,255));
} }
// Channel value is converted to 8bit values to provided values scale // Channel value is converted to 8bit values to provided values scale
uint8_t convert_channel_8b_scale(uint8_t num,uint8_t min,uint8_t max) uint8_t convert_channel_8b_scale(uint8_t num,uint8_t min,uint8_t max)
{ {
return (uint8_t) (map(limit_channel_100(num),PPM_MIN_100,PPM_MAX_100,min,max)); return (uint8_t) (map(limit_channel_100(num),servo_min_100,servo_max_100,min,max));
} }
// Channel value is converted sign + magnitude 8bit values // Channel value is converted sign + magnitude 8bit values
@ -723,7 +734,7 @@ uint8_t convert_channel_s8b(uint8_t num)
// Channel value is converted to 10bit values // Channel value is converted to 10bit values
uint16_t convert_channel_10b(uint8_t num) uint16_t convert_channel_10b(uint8_t num)
{ {
return (uint16_t) (map(limit_channel_100(num),PPM_MIN_100,PPM_MAX_100,1,1023)); return (uint16_t) (map(limit_channel_100(num),servo_min_100,servo_max_100,1,1023));
} }
// Channel value is multiplied by 1.5 // Channel value is multiplied by 1.5
@ -743,15 +754,15 @@ void convert_channel_HK310(uint8_t num, uint8_t *low, uint8_t *high)
// Channel value is limited to PPM_100 // Channel value is limited to PPM_100
uint16_t limit_channel_100(uint8_t ch) uint16_t limit_channel_100(uint8_t ch)
{ {
if(Servo_data[ch]>PPM_MAX_100) if(Servo_data[ch]>servo_max_100)
return PPM_MAX_100; return servo_max_100;
else else
if (Servo_data[ch]<PPM_MIN_100) if (Servo_data[ch]<servo_min_100)
return PPM_MIN_100; return servo_min_100;
return Servo_data[ch]; return Servo_data[ch];
} }
static void Mprotocol_serial_init() void Mprotocol_serial_init()
{ {
#ifdef XMEGA #ifdef XMEGA
@ -787,7 +798,7 @@ static void Mprotocol_serial_init()
} }
#if defined(TELEMETRY) #if defined(TELEMETRY)
static void PPM_Telemetry_serial_init() void PPM_Telemetry_serial_init()
{ {
initTXSerial( SPEED_9600 ) ; initTXSerial( SPEED_9600 ) ;
} }
@ -843,6 +854,7 @@ void SPI_Write(uint8_t command)
SDI_on; SDI_on;
else else
SDI_off; SDI_off;
NOP();
SCK_on; SCK_on;
NOP(); NOP();
command = command << 1; command = command << 1;
@ -982,6 +994,7 @@ void init()
/**************************/ /**************************/
//PPM //PPM
#ifdef ENABLE_PPM
#ifdef XMEGA #ifdef XMEGA
ISR(PORTD_INT0_vect) ISR(PORTD_INT0_vect)
#else #else
@ -1008,17 +1021,16 @@ ISR(INT1_vect, ISR_NOBLOCK)
else else
if(chan!=-1) // need to wait for start of frame if(chan!=-1) // need to wait for start of frame
{ //servo values between 500us and 2420us will end up here { //servo values between 500us and 2420us will end up here
uint16_t temp = Cur_TCNT1>>1; PPM_data[chan]= Cur_TCNT1>>1;;
if(temp<PPM_MIN) temp=PPM_MIN;
else if(temp>PPM_MAX) temp=PPM_MAX;
PPM_data[chan]=temp;
if(chan++>=NUM_CHN) if(chan++>=NUM_CHN)
chan=-1; // don't accept any new channels chan=-1; // don't accept any new channels
} }
Prev_TCNT1+=Cur_TCNT1; Prev_TCNT1+=Cur_TCNT1;
} }
#endif //ENABLE_PPM
//Serial RX //Serial RX
#ifdef ENABLE_SERIAL
#ifdef XMEGA #ifdef XMEGA
ISR(USARTC0_RXC_vect) ISR(USARTC0_RXC_vect)
#else #else
@ -1071,8 +1083,7 @@ ISR(USART_RX_vect)
#endif #endif
if(!IS_RX_FLAG_on) if(!IS_RX_FLAG_on)
{ //Good frame received and main has finished with previous buffer { //Good frame received and main has finished with previous buffer
uint8_t i ; for(uint8_t i=0;i<RXBUFFER_SIZE;i++)
for(i=0;i<RXBUFFER_SIZE;i++)
rx_ok_buff[i]=rx_buff[i]; // Duplicate the buffer rx_ok_buff[i]=rx_buff[i]; // Duplicate the buffer
RX_FLAG_on; // flag for main to process servo data RX_FLAG_on; // flag for main to process servo data
} }
@ -1106,4 +1117,4 @@ ISR(TIMER1_COMPB_vect, ISR_NOBLOCK )
{ // Timer1 compare B interrupt { // Timer1 compare B interrupt
idx=0; idx=0;
} }
#endif //ENABLE_SERIAL

View File

@ -127,7 +127,7 @@ static void __attribute__((unused)) SFHSS_calc_next_chan()
// Values grow down and to the right, so we just revert every channel. // Values grow down and to the right, so we just revert every channel.
static uint16_t __attribute__((unused)) SFHSS_convert_channel(uint8_t num) static uint16_t __attribute__((unused)) SFHSS_convert_channel(uint8_t num)
{ {
return (uint16_t) (map(limit_channel_100(num),PPM_MIN_100,PPM_MAX_100,906,86)); return (uint16_t) (map(limit_channel_100(num),servo_min_100,servo_max_100,906,86));
} }
static void __attribute__((unused)) SFHSS_build_data_packet() static void __attribute__((unused)) SFHSS_build_data_packet()

255
Multiprotocol/TX_Def.h Normal file
View File

@ -0,0 +1,255 @@
// Turnigy PPM and channels
#if defined(TX_ER9X)
#define PPM_MAX_100 2012 // 100%
#define PPM_MIN_100 988 // 100%
#define PPM_MAX_125 2140 // 125%
#define PPM_MIN_125 860 // 125%
#endif
// Devo PPM and channels
#if defined(TX_DEVO7)
#define PPM_MAX_100 1920 // 100%
#define PPM_MIN_100 1120 // 100%
#define PPM_MAX_125 2100 // 125%
#define PPM_MIN_125 900 // 125%
#endif
// SPEKTRUM PPM and channels
#if defined(TX_SPEKTRUM)
#define PPM_MAX_100 1900 // 100%
#define PPM_MIN_100 1100 // 100%
#define PPM_MAX_125 2000 // 125%
#define PPM_MIN_125 1000 // 125%
#endif
// HISKY
#if defined(TX_HISKY)
#define PPM_MAX_125 2000 // 125%
#define PPM_MIN_125 1000 // 125%
#define PPM_MAX_100 1900 // 100%
#define PPM_MIN_100 1100 // 100%
#define PPM_MAX_125 2000 // 125%
#define PPM_MIN_125 1000 // 125%
#endif
//Serial MIN MAX values
#define SERIAL_MAX_100 2012 // 100%
#define SERIAL_MIN_100 988 // 100%
#define SERIAL_MAX_125 2140 // 125%
#define SERIAL_MIN_125 860 // 125%
//PPM values used to compare
#define PPM_MIN_COMMAND 1250
#define PPM_SWITCH 1550
#define PPM_MAX_COMMAND 1750
//Channel definitions
#ifdef AETR
enum {
AILERON =0,
ELEVATOR,
THROTTLE,
RUDDER,
};
#endif
#ifdef AERT
enum {
AILERON =0,
ELEVATOR,
RUDDER,
THROTTLE,
};
#endif
#ifdef ARET
enum {
AILERON =0,
RUDDER,
ELEVATOR,
THROTTLE,
};
#endif
#ifdef ARTE
enum {
AILERON =0,
RUDDER,
THROTTLE,
ELEVATOR,
};
#endif
#ifdef ATRE
enum {
AILERON =0,
THROTTLE,
RUDDER,
ELEVATOR,
};
#endif
#ifdef ATER
enum {
AILERON =0,
THROTTLE,
ELEVATOR,
RUDDER,
};
#endif
#ifdef EATR
enum {
ELEVATOR =0,
AILERON,
THROTTLE,
RUDDER,
};
#endif
#ifdef EART
enum {
ELEVATOR =0,
AILERON,
RUDDER,
THROTTLE,
};
#endif
#ifdef ERAT
enum {
ELEVATOR =0,
RUDDER,
AILERON,
THROTTLE,
};
#endif
#ifdef ERTA
enum {
ELEVATOR =0,
RUDDER,
THROTTLE,
AILERON,
};
#endif
#ifdef ETRA
enum {
ELEVATOR =0,
THROTTLE,
RUDDER,
AILERON,
};
#endif
#ifdef ETAR
enum {
ELEVATOR =0,
THROTTLE,
AILERON,
RUDDER,
};
#endif
#ifdef TEAR
enum {
THROTTLE =0,
ELEVATOR,
AILERON,
RUDDER,
};
#endif
#ifdef TERA
enum {
THROTTLE =0,
ELEVATOR,
RUDDER,
AILERON,
};
#endif
#ifdef TREA
enum {
THROTTLE =0,
RUDDER,
ELEVATOR,
AILERON,
};
#endif
#ifdef TRAE
enum {
THROTTLE =0,
RUDDER,
AILERON,
ELEVATOR,
};
#endif
#ifdef TARE
enum {
THROTTLE =0,
AILERON,
RUDDER,
ELEVATOR,
};
#endif
#ifdef TAER
enum {
THROTTLE =0,
AILERON,
ELEVATOR,
RUDDER,
};
#endif
#ifdef RETA
enum {
RUDDER =0,
ELEVATOR,
THROTTLE,
AILERON,
};
#endif
#ifdef REAT
enum {
RUDDER =0,
ELEVATOR,
AILERON,
THROTTLE,
};
#endif
#ifdef RAET
enum {
RUDDER =0,
AILERON,
ELEVATOR,
THROTTLE,
};
#endif
#ifdef RATE
enum {
RUDDER =0,
AILERON,
THROTTLE,
ELEVATOR,
};
#endif
#ifdef RTAE
enum {
RUDDER =0,
THROTTLE,
AILERON,
ELEVATOR,
};
#endif
#ifdef RTEA
enum {
RUDDER =0,
THROTTLE,
ELEVATOR,
AILERON,
};
#endif
#define AUX1 4
#define AUX2 5
#define AUX3 6
#define AUX4 7
#define AUX5 8
#define AUX6 9
#define AUX7 10
#define AUX8 11
#define AUX9 12
#define AUX10 13
#define AUX11 14
#define AUX12 15
#define AUX13 16

View File

@ -133,7 +133,8 @@ void frsky_link_frame()
#if defined HUB_TELEMETRY #if defined HUB_TELEMETRY
void frsky_user_frame() void frsky_user_frame()
{ {
uint8_t indexx = 0, c=0, j=8, n=0, i; uint8_t indexx = 0, j=8, i;
//uint8_t c=0, n=0;
if(pktt[6]>0 && pktt[6]<=10) if(pktt[6]>0 && pktt[6]<=10)
{//only valid hub frames {//only valid hub frames

View File

@ -13,28 +13,32 @@
along with Multiprotocol. If not, see <http://www.gnu.org/licenses/>. along with Multiprotocol. If not, see <http://www.gnu.org/licenses/>.
*/ */
/**********************************************/
/** Multiprotocol module configuration file ***/ /** Multiprotocol module configuration file ***/
/**********************************************/
/*******************/ /*******************/
/*** TX SETTINGS ***/ /*** TX SETTINGS ***/
/*******************/ /*******************/
//Uncomment your TX type //Modify the channel order based on your TX: AETR, TAER, RETA...
#define TX_ER9X_AETR //ER9X AETR (988<->2012µs) //For example a JR/Spektrum radio is TAER. Default is AETR.
//#define TX_ER9X_TAER //ER9X TAER (988<->2012µs) #define AETR
//#define TX_DEVO7 //DEVO7 EATR (1120<->1920µs)
//#define TX_SPEKTRUM //Spektrum TAER (1100<->1900µs)
//#define TX_HISKY //HISKY AETR (1100<->1900µs)
/****************************/ /****************************/
/*** PROTOCOLS TO INCLUDE ***/ /*** PROTOCOLS TO INCLUDE ***/
/****************************/ /****************************/
//Comment if a module is not installed //In this section select the protocols you want to be accessible when using the module.
//All the protocols will not fit in the module so you need to pick and choose.
//There are 4 RF components supported. If one of them is not installed you must comment it using "//".
//This is also a quick way to reduce the number of protocols and save Flash space.
#define A7105_INSTALLED #define A7105_INSTALLED
#define CYRF6936_INSTALLED #define CYRF6936_INSTALLED
#define CC2500_INSTALLED #define CC2500_INSTALLED
#define NFR24L01_INSTALLED #define NFR24L01_INSTALLED
//Comment a protocol to exclude it from compilation //Bellow is the list of all available protocols. Comment the protocols you are not using with "//" to save Flash space.
#ifdef A7105_INSTALLED #ifdef A7105_INSTALLED
#define FLYSKY_A7105_INO #define FLYSKY_A7105_INO
#define HUBSAN_A7105_INO #define HUBSAN_A7105_INO
@ -68,16 +72,20 @@
#define ASSAN_NRF24L01_INO #define ASSAN_NRF24L01_INO
#endif #endif
/**************************/ /**************************/
/*** TELEMETRY SETTINGS ***/ /*** TELEMETRY SETTINGS ***/
/**************************/ /**************************/
//Uncomment to enable telemetry //In this section you can configure the telemetry.
//If you do not plan using the telemetry comment this global setting using "//" and skip to the next section.
#define TELEMETRY #define TELEMETRY
//Uncomment to invert the telemetry serial signal, this is usefull for OpenTX on Taranis as an example //Uncomment to invert the polarity of the telemetry serial signal.
//For ER9X and ERSKY9X it must be commented. For OpenTX it must be uncommented.
//#define INVERT_TELEMETRY 1 //#define INVERT_TELEMETRY 1
//Comment to disable a specific telemetry //Comment a line to disable a protocol telemetry
#if defined(TELEMETRY) #if defined(TELEMETRY)
#if defined DSM2_CYRF6936_INO #if defined DSM2_CYRF6936_INO
#define DSM_TELEMETRY #define DSM_TELEMETRY
@ -90,18 +98,59 @@
#endif #endif
#endif #endif
/********************/
/*** PPM SETTINGS ***/ /****************************/
/********************/ /*** SERIAL MODE SETTINGS ***/
//Update this table to set which protocol and all associated settings are called for the corresponding dial number /****************************/
//In this section you can configure the serial mode.
//The serial mode enables full editing of all the parameters in the GUI of the radio.
//This is available natively for ER9X and ERSKY9X. It is available for OpenTX on Taranis with a special version.
//If you do not plan to use the Serial mode comment this line using "//" to save Flash space
#define ENABLE_SERIAL
/*************************/
/*** PPM MODE SETTINGS ***/
/*************************/
//In this section you can configure all details about PPM.
//If you do not plan to use the PPM mode comment this line using "//" to save Flash space, you don't need to configure anything below in this case
#define ENABLE_PPM
/*** TX END POINTS ***/
//It is important for the module to know the endpoints of your radio.
//Below are some standard transmitters already preconfigured.
//Uncomment only the one which matches your transmitter.
#define TX_ER9X //ER9X/ERSKY9X/OpenTX ( 988<->2012µs)
//#define TX_DEVO7 //DEVO (1120<->1920µs)
//#define TX_SPEKTRUM //Spektrum (1100<->1900µs)
//#define TX_HISKY //HISKY (1100<->1900µs)
//#define TX_CUSTOM //Custom
// The lines below are used to set the end points in microseconds (µs) if you have selected TX_CUSTOM.
// A few things to considered:
// - If you put too big values compared to your TX you won't be able to reach the extremes which is bad for throttle as an example
// - If you put too low values you won't be able to use your full stick range, it will be maxed out before reaching the end
// - Centered stick value is usually 1500. It should match the middle between MIN and MAX, ie Center=(MAX-MIN)/2+MIN. If your TX is not centered you can adjust the value MIN or MAX.
// - 100% is the value when the model is by default, 125% is the value when you extend the servo travel which is only used by some protocols
#if defined(TX_CUSTOM)
#define PPM_MAX_100 1900 // 100%
#define PPM_MIN_100 1100 // 100%
#define PPM_MAX_125 2000 // 125%
#define PPM_MIN_125 1000 // 125%
#endif
//The table below indicates which protocol to run when a specific position on the dial has been selected.
//All fields and values are explained below. Everything is configurable from here like in the Serial mode.
//Example: You can associate multiple times the same protocol to different dial positions to take advantage of the model match (RX_Num)
const PPM_Parameters PPM_prot[15]= { const PPM_Parameters PPM_prot[15]= {
// Dial Protocol Sub protocol RX_Num Power Auto Bind Option // Dial Protocol Sub protocol RX_Num Power Auto Bind Option
/* 1 */ {MODE_FLYSKY, Flysky , 0 , P_HIGH , NO_AUTOBIND , 0 }, /* 1 */ {MODE_FLYSKY, Flysky , 0 , P_HIGH , NO_AUTOBIND , 0 },
/* 2 */ {MODE_HUBSAN, 0 , 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 }, // D7 fine tuning /* 3 */ {MODE_FRSKY , 0 , 0 , P_HIGH , NO_AUTOBIND , 0 }, // option=fine freq tuning
/* 4 */ {MODE_HISKY , Hisky , 0 , P_HIGH , NO_AUTOBIND , 0 }, /* 4 */ {MODE_HISKY , Hisky , 0 , P_HIGH , NO_AUTOBIND , 0 },
/* 5 */ {MODE_V2X2 , 0 , 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 , 6 }, // 6 channels @ 11ms /* 6 */ {MODE_DSM2 , DSM2 , 0 , P_HIGH , NO_AUTOBIND , 2 }, // option=2=6 channels @ 22ms
/* 7 */ {MODE_DEVO , 0 , 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 }, /* 8 */ {MODE_YD717 , YD717 , 0 , P_HIGH , NO_AUTOBIND , 0 },
/* 9 */ {MODE_KN , WLTOYS , 0 , P_HIGH , NO_AUTOBIND , 0 }, /* 9 */ {MODE_KN , WLTOYS , 0 , P_HIGH , NO_AUTOBIND , 0 },
@ -112,7 +161,7 @@ const PPM_Parameters PPM_prot[15]= {
/* 14 */ {MODE_BAYANG, 0 , 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 } /* 15 */ {MODE_SYMAX , SYMAX5C , 0 , P_HIGH , NO_AUTOBIND , 0 }
}; };
/* Available protocols and associated sub protocols: /* Available protocols and associated sub protocols to pick and choose from
MODE_FLYSKY MODE_FLYSKY
Flysky Flysky
V9X9 V9X9
@ -188,134 +237,17 @@ const PPM_Parameters PPM_prot[15]= {
NONE NONE
MODE_ASSAN MODE_ASSAN
NONE NONE
RX_Num value between 0 and 15
Power P_HIGH or P_LOW
Auto Bind AUTOBIND or NO_AUTOBIND
Option value between 0 and 255. 0xD7 or 0x00 for Frsky fine tuning.
*/ */
/*******************/ // RX_Num is used for model match. Using RX_Num values different for each receiver will prevent starting a model with the false config loaded...
/*** TX SETTINGS ***/ // RX_Num value is between 0 and 15.
/*******************/
// Turnigy PPM and channels
#if defined(TX_ER9X_AETR)
#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,
THROTTLE,
RUDDER,
AUX1,
AUX2,
AUX3,
AUX4,
AUX5,
AUX6,
AUX7,
AUX8,
AUX9
};
#endif
// Turnigy PPM and channels // Power P_HIGH or P_LOW: High or low power setting for the transmission.
#if defined(TX_ER9X_TAER) // For indoor P_LOW is more than enough.
#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{
THROTTLE =0,
AILERON,
ELEVATOR,
RUDDER,
AUX1,
AUX2,
AUX3,
AUX4,
AUX5,
AUX6,
AUX7,
AUX8,
AUX9
};
#endif
// Devo PPM and channels // Auto Bind AUTOBIND or NO_AUTOBIND
#if defined(TX_DEVO7) // For protocols which does not require binding at each power up (like Flysky, FrSky...), you might still want a bind to be initiated each time you power up the TX.
#define PPM_MAX 2100 // 125% // As an exxample, it's usefull for the WLTOYS F929/F939/F949/F959 (all using the Flysky protocol) which requires a bind at each power up.
#define PPM_MIN 900 // 125%
#define PPM_MAX_100 1920 // 100%
#define PPM_MIN_100 1120 // 100%
enum chan_order{
ELEVATOR=0,
AILERON,
THROTTLE,
RUDDER,
AUX1,
AUX2,
AUX3,
AUX4,
AUX5,
AUX6,
AUX7,
AUX8,
AUX9
};
#endif
// SPEKTRUM PPM and channels // Option: the value is between -127 and +127.
#if defined(TX_SPEKTRUM) // The option value is only valid for some protocols, read this page for more information: https://github.com/pascallanger/DIY-Multiprotocol-TX-Module/blob/master/Protocols_Details.md
#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,
ELEVATOR,
RUDDER,
AUX1,
AUX2,
AUX3,
AUX4,
AUX5,
AUX6,
AUX7,
AUX8,
AUX9
};
#endif
// HISKY
#if defined(TX_HISKY)
#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,
THROTTLE,
RUDDER,
AUX1,
AUX2,
AUX3,
AUX4,
AUX5,
AUX6,
AUX7,
AUX8,
AUX9
};
#endif
#define PPM_MIN_COMMAND 1250
#define PPM_SWITCH 1550
#define PPM_MAX_COMMAND 1750