mirror of
https://github.com/pascallanger/DIY-Multiprotocol-TX-Module.git
synced 2025-07-03 12:07:52 +00:00
Update to last Pascal mod.
This commit is contained in:
parent
7d805c4283
commit
a6ee88aa4c
@ -21,20 +21,20 @@
|
|||||||
along with Multiprotocol. If not, see <http://www.gnu.org/licenses/>.
|
along with Multiprotocol. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
#define STM32_board
|
#define STM32_board
|
||||||
|
#undef __cplusplus
|
||||||
#if defined STM32_board
|
#if defined STM32_board
|
||||||
#include "Multiprotocol_STM32.h"
|
#include "Multiprotocol_STM32.h"
|
||||||
#include <EEPROM.h>
|
#include <EEPROM.h>
|
||||||
#include <libmaple/usart.h>
|
#include <libmaple/usart.h>
|
||||||
#include <libmaple/timer.h>
|
#include <libmaple/timer.h>
|
||||||
#include <SPI.h>
|
#include <SPI.h>
|
||||||
uint16_t OCR1A = 0;
|
uint16_t OCR1A = 0;
|
||||||
uint16_t TCNT1=0;
|
uint16_t TCNT1=0;
|
||||||
HardwareTimer timer(2);
|
HardwareTimer timer(2);
|
||||||
#else
|
#else
|
||||||
#include <avr/eeprom.h>
|
#include <avr/eeprom.h>
|
||||||
#include <util/delay.h>
|
#include <util/delay.h>
|
||||||
#include "Multiprotocol.h"
|
#include "Multiprotocol.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <avr/pgmspace.h>
|
#include <avr/pgmspace.h>
|
||||||
@ -90,7 +90,7 @@ uint8_t len;
|
|||||||
uint8_t RX_num;
|
uint8_t RX_num;
|
||||||
|
|
||||||
#if defined(FRSKYX_CC2500_INO) || defined(SFHSS_CC2500_INO)
|
#if defined(FRSKYX_CC2500_INO) || defined(SFHSS_CC2500_INO)
|
||||||
uint8_t calData[48];
|
uint8_t calData[48];
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//Channel mapping for protocols
|
//Channel mapping for protocols
|
||||||
@ -109,8 +109,8 @@ volatile uint16_t PPM_data[NUM_CHN];
|
|||||||
// Serial variables
|
// Serial variables
|
||||||
#ifdef INVERT_TELEMETRY
|
#ifdef INVERT_TELEMETRY
|
||||||
// enable bit bash for serial
|
// enable bit bash for serial
|
||||||
#define BASH_SERIAL 1
|
#define BASH_SERIAL 1
|
||||||
#define INVERT_SERIAL 1
|
#define INVERT_SERIAL 1
|
||||||
#endif
|
#endif
|
||||||
#define BAUD 100000
|
#define BAUD 100000
|
||||||
#define RXBUFFER_SIZE 25
|
#define RXBUFFER_SIZE 25
|
||||||
@ -136,16 +136,16 @@ void ISR_COMPB();
|
|||||||
#define MAX_PKT 27
|
#define MAX_PKT 27
|
||||||
uint8_t pkt[MAX_PKT];//telemetry receiving packets
|
uint8_t pkt[MAX_PKT];//telemetry receiving packets
|
||||||
#if defined(TELEMETRY)
|
#if defined(TELEMETRY)
|
||||||
uint8_t pass = 0;
|
uint8_t pass = 0;
|
||||||
uint8_t pktt[MAX_PKT];//telemetry receiving packets
|
uint8_t pktt[MAX_PKT];//telemetry receiving packets
|
||||||
#ifndef BASH_SERIAL
|
#ifndef BASH_SERIAL
|
||||||
volatile uint8_t tx_head=0;
|
volatile uint8_t tx_head=0;
|
||||||
volatile uint8_t tx_tail=0;
|
volatile uint8_t tx_tail=0;
|
||||||
#endif // BASH_SERIAL
|
#endif // BASH_SERIAL
|
||||||
uint8_t v_lipo;
|
uint8_t v_lipo;
|
||||||
int16_t RSSI_dBm;
|
int16_t RSSI_dBm;
|
||||||
uint8_t telemetry_link=0;
|
uint8_t telemetry_link=0;
|
||||||
uint8_t telemetry_counter=0;
|
uint8_t telemetry_counter=0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Callback
|
// Callback
|
||||||
@ -258,16 +258,6 @@ void setup()
|
|||||||
if( IS_BIND_BUTTON_on )
|
if( IS_BIND_BUTTON_on )
|
||||||
BIND_BUTTON_FLAG_on; // If bind button pressed save the status for protocol id reset under hubsan
|
BIND_BUTTON_FLAG_on; // If bind button pressed save the status for protocol id reset under hubsan
|
||||||
|
|
||||||
/* #ifdef XMEGA
|
|
||||||
if( (PORTD.IN & _BV(2)) == 0x00 )
|
|
||||||
#else
|
|
||||||
# if defined STM32_board
|
|
||||||
if(digitalRead(BIND_pin)==0x00)
|
|
||||||
#else
|
|
||||||
if( (PINB & _BV(5)) == 0x00 )
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
*/
|
|
||||||
// Read status of mode select binary switch
|
// Read status of mode select binary switch
|
||||||
// after this mode_select will be one of {0000, 0001, ..., 1111}
|
// after this mode_select will be one of {0000, 0001, ..., 1111}
|
||||||
#ifdef XMEGA
|
#ifdef XMEGA
|
||||||
@ -312,8 +302,6 @@ void setup()
|
|||||||
servo_max_100=PPM_MAX_100; servo_min_100=PPM_MIN_100;
|
servo_max_100=PPM_MAX_100; servo_min_100=PPM_MIN_100;
|
||||||
servo_max_125=PPM_MAX_125; servo_min_125=PPM_MIN_125;
|
servo_max_125=PPM_MAX_125; servo_min_125=PPM_MIN_125;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
protocol_init();
|
protocol_init();
|
||||||
|
|
||||||
#ifndef XMEGA
|
#ifndef XMEGA
|
||||||
@ -349,11 +337,139 @@ void setup()
|
|||||||
// Main
|
// Main
|
||||||
void loop()
|
void loop()
|
||||||
{
|
{
|
||||||
|
uint16_t next_callback,diff=0xFFFF;
|
||||||
|
|
||||||
|
while(1)
|
||||||
|
{
|
||||||
|
if(remote_callback==0 || diff>2*200)
|
||||||
|
{
|
||||||
|
do
|
||||||
|
{
|
||||||
|
Update_All();
|
||||||
|
}
|
||||||
|
while(remote_callback==0);
|
||||||
|
}
|
||||||
|
#ifdef XMEGA
|
||||||
|
if( (TCC1.INTFLAGS & TC1_CCAIF_bm) != 0)
|
||||||
|
{
|
||||||
|
cli(); // disable global int
|
||||||
|
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 defined STM32_board
|
||||||
|
if((TIMER2_BASE->SR & TIMER_SR_CC1IF)!=0){
|
||||||
|
cli();
|
||||||
|
OCR1A = TIMER2_BASE->CNT;
|
||||||
|
TIMER2_BASE->CCR1=OCR1A;
|
||||||
|
sei();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
while((TIMER2_BASE->SR & TIMER_SR_CC1IF )==0);//walit till compare match
|
||||||
|
#else
|
||||||
|
if( (TIFR1 & (1<<OCF1A)) != 0)
|
||||||
|
{
|
||||||
|
cli(); // disable global int
|
||||||
|
OCR1A=TCNT1; // Callback should already have been called... Use "now" as new sync point.
|
||||||
|
sei(); // enable global int
|
||||||
|
}
|
||||||
|
else
|
||||||
|
while((TIFR1 & (1<<OCF1A)) == 0); // wait before callback
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
do
|
||||||
|
{
|
||||||
|
#ifndef STM32_board
|
||||||
|
TX_ON;
|
||||||
|
TX_MAIN_PAUSE_on;
|
||||||
|
tx_pause();
|
||||||
|
#endif
|
||||||
|
next_callback=remote_callback();
|
||||||
|
#ifndef STM32_board
|
||||||
|
TX_MAIN_PAUSE_off;
|
||||||
|
tx_resume();
|
||||||
|
TX_OFF;
|
||||||
|
#endif
|
||||||
|
while(next_callback>4000)
|
||||||
|
{ // start to wait here as much as we can...
|
||||||
|
next_callback-=2000;
|
||||||
|
|
||||||
|
#ifdef XMEGA
|
||||||
|
cli(); // disable global int
|
||||||
|
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
|
||||||
|
|
||||||
|
#if defined STM32_board
|
||||||
|
cli();
|
||||||
|
OCR1A+=2000*2;// clear compare A=callback flag
|
||||||
|
TIMER2_BASE->CCR1=OCR1A;
|
||||||
|
TCNT1 = TIMER2_BASE->CNT;
|
||||||
|
TIMER2_BASE->SR &= ~TIMER_SR_CC1IF; //clear compare Flag
|
||||||
|
sei();
|
||||||
|
Update_All();
|
||||||
|
if(IS_CHANGE_PROTOCOL_FLAG_on)
|
||||||
|
break; // Protocol has been changed
|
||||||
|
while((TIMER2_BASE->SR &TIMER_SR_CC1IF)==0);//2ms wait
|
||||||
|
#else
|
||||||
|
cli();
|
||||||
|
OCR1A+=2000*2; // clear compare A=callback flag
|
||||||
|
TIFR1=(1<<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 & (1<<OCF1A)) == 0); // wait 2ms...
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
// at this point we have between 2ms and 4ms in next_callback
|
||||||
|
next_callback *= 2 ; // disable global int
|
||||||
|
#ifdef XMEGA
|
||||||
|
cli();
|
||||||
|
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
|
||||||
|
#if defined STM32_board
|
||||||
|
OCR1A+=next_callback;
|
||||||
|
cli();
|
||||||
|
TIMER2_BASE->CCR1 = OCR1A;
|
||||||
|
TCNT1 = TIMER2_BASE->CNT;
|
||||||
|
TIMER2_BASE->SR &= ~TIMER_SR_CC1IF;//clear compare Flag write zero
|
||||||
|
diff=OCR1A-TCNT1; // compare timer and comparator
|
||||||
|
sei();
|
||||||
|
#else
|
||||||
|
cli();
|
||||||
|
OCR1A+=next_callback; // set compare A for callback
|
||||||
|
TIFR1=(1<<OCF1A); // clear compare A=callback flag
|
||||||
|
diff=OCR1A-TCNT1; // compare timer and comparator
|
||||||
|
sei(); // enable global int
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
while(diff&0x8000); // Callback did not took more than requested time for next callback
|
||||||
|
// so we can launch Update_All before next callback
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Update_All()
|
||||||
|
{
|
||||||
#ifndef STM32_board
|
#ifndef STM32_board
|
||||||
TX_ON;
|
TX_ON;
|
||||||
NOP();
|
NOP();
|
||||||
TX_OFF;
|
TX_OFF;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef ENABLE_SERIAL
|
#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
|
||||||
{
|
{
|
||||||
@ -362,12 +478,9 @@ TX_OFF;
|
|||||||
if(IS_CHANGE_PROTOCOL_FLAG_on)
|
if(IS_CHANGE_PROTOCOL_FLAG_on)
|
||||||
{ // Protocol needs to be changed
|
{ // Protocol needs to be changed
|
||||||
LED_OFF; //led off during protocol init
|
LED_OFF; //led off during protocol init
|
||||||
modules_reset(); //reset previous module
|
modules_reset(); //reset all modules
|
||||||
protocol_init();
|
protocol_init(); //init new protocol
|
||||||
//init new protocol
|
|
||||||
CHANGE_PROTOCOL_FLAG_off; //done
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
#endif //ENABLE_SERIAL
|
#endif //ENABLE_SERIAL
|
||||||
#ifdef ENABLE_PPM
|
#ifdef ENABLE_PPM
|
||||||
@ -381,37 +494,38 @@ TX_OFF;
|
|||||||
sei(); // enable global int
|
sei(); // enable global int
|
||||||
if(temp_ppm<PPM_MIN_125) temp_ppm=PPM_MIN_125;
|
if(temp_ppm<PPM_MIN_125) temp_ppm=PPM_MIN_125;
|
||||||
else if(temp_ppm>PPM_MAX_125) temp_ppm=PPM_MAX_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) )
|
uint8_t protocol=cur_protocol[0]&0x1F;
|
||||||
|
if( (protocol==MODE_FRSKY) || (protocol==MODE_HUBSAN) || (protocol==MODE_FRSKYX) || (protocol==MODE_DSM2) )
|
||||||
TelemetryUpdate();
|
TelemetryUpdate();
|
||||||
#endif
|
#endif
|
||||||
#ifndef STM32_board
|
#ifndef STM32_board
|
||||||
TX_ON;
|
TX_ON;
|
||||||
NOP();
|
NOP();
|
||||||
TX_OFF;
|
TX_OFF;
|
||||||
#endif
|
#endif
|
||||||
if (remote_callback != 0)
|
}
|
||||||
CheckTimer(remote_callback);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Update Servo_AUX flags based on servo AUX positions
|
|
||||||
static void update_aux_flags(void)
|
// Update Servo_AUX flags based on servo AUX positions
|
||||||
{
|
static void update_aux_flags(void)
|
||||||
|
{
|
||||||
Servo_AUX=0;
|
Servo_AUX=0;
|
||||||
for(uint8_t i=0;i<8;i++)
|
for(uint8_t i=0;i<8;i++)
|
||||||
if(Servo_data[AUX1+i]>PPM_SWITCH)
|
if(Servo_data[AUX1+i]>PPM_SWITCH)
|
||||||
Servo_AUX|=1<<i;
|
Servo_AUX|=1<<i;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update led status based on binding and serial
|
// Update led status based on binding and serial
|
||||||
static void update_led_status(void)
|
static void update_led_status(void)
|
||||||
{
|
{
|
||||||
if(blink<millis())
|
if(blink<millis())
|
||||||
{
|
{
|
||||||
if(cur_protocol[0]==0) // No valid serial received at least once
|
if(cur_protocol[0]==0) // No valid serial received at least once
|
||||||
@ -431,10 +545,10 @@ static void update_led_status(void)
|
|||||||
blink+=BLINK_BIND_TIME; //blink fastly during binding
|
blink+=BLINK_BIND_TIME; //blink fastly during binding
|
||||||
LED_TOGGLE;
|
LED_TOGGLE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void tx_pause()
|
inline void tx_pause()
|
||||||
{
|
{
|
||||||
#ifdef TELEMETRY
|
#ifdef TELEMETRY
|
||||||
#ifdef XMEGA
|
#ifdef XMEGA
|
||||||
USARTC0.CTRLA &= ~0x03 ; // Pause telemetry by disabling transmitter interrupt
|
USARTC0.CTRLA &= ~0x03 ; // Pause telemetry by disabling transmitter interrupt
|
||||||
@ -448,11 +562,11 @@ inline void tx_pause()
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
inline void tx_resume()
|
inline void tx_resume()
|
||||||
{
|
{
|
||||||
#ifdef TELEMETRY
|
#ifdef TELEMETRY
|
||||||
if(!IS_TX_PAUSE_on)
|
if(!IS_TX_PAUSE_on)
|
||||||
#ifdef XMEGA
|
#ifdef XMEGA
|
||||||
@ -465,11 +579,11 @@ inline void tx_resume()
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#ifdef STM32_board
|
#ifdef STM32_board
|
||||||
void start_timer2(){
|
void start_timer2(){
|
||||||
// Pause the timer while we're configuring it
|
// Pause the timer while we're configuring it
|
||||||
timer.pause();
|
timer.pause();
|
||||||
TIMER2_BASE->PSC = 35;//36-1;for 72 MHZ /0.5sec/(35+1)
|
TIMER2_BASE->PSC = 35;//36-1;for 72 MHZ /0.5sec/(35+1)
|
||||||
@ -479,12 +593,12 @@ void start_timer2(){
|
|||||||
// Refresh the timer's count, prescale, and overflow
|
// Refresh the timer's count, prescale, and overflow
|
||||||
timer.refresh();
|
timer.refresh();
|
||||||
timer.resume();
|
timer.resume();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Protocol scheduler
|
// Protocol scheduler
|
||||||
static void CheckTimer(uint16_t (*cb)(void))
|
static void CheckTimer(uint16_t (*cb)(void))
|
||||||
{
|
{
|
||||||
uint16_t next_callback,diff;
|
uint16_t next_callback,diff;
|
||||||
#ifdef XMEGA
|
#ifdef XMEGA
|
||||||
if( (TCC1.INTFLAGS & TC1_CCAIF_bm) != 0)
|
if( (TCC1.INTFLAGS & TC1_CCAIF_bm) != 0)
|
||||||
@ -576,11 +690,11 @@ static void CheckTimer(uint16_t (*cb)(void))
|
|||||||
}
|
}
|
||||||
while(diff&0x8000); // Callback did not took more than requested time for next callback
|
while(diff&0x8000); // Callback did not took more than requested time for next callback
|
||||||
// so we can let main do its stuff before next callback
|
// so we can let main do its stuff before next callback
|
||||||
}
|
}
|
||||||
|
|
||||||
// Protocol start
|
// Protocol start
|
||||||
static void protocol_init()
|
static void protocol_init()
|
||||||
{
|
{
|
||||||
uint16_t next_callback=0; // Default is immediate call back
|
uint16_t next_callback=0; // Default is immediate call back
|
||||||
remote_callback = 0;
|
remote_callback = 0;
|
||||||
|
|
||||||
@ -820,10 +934,10 @@ static void protocol_init()
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
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()
|
static void update_serial_data()
|
||||||
{
|
{
|
||||||
RX_DONOTUPDTAE_on;
|
RX_DONOTUPDTAE_on;
|
||||||
RX_FLAG_off; //data has been processed
|
RX_FLAG_off; //data has been processed
|
||||||
if(rx_ok_buff[0]&0x20) //check range
|
if(rx_ok_buff[0]&0x20) //check range
|
||||||
@ -897,10 +1011,10 @@ static void update_serial_data()
|
|||||||
UCSR0B |= (1<<RXCIE0) ; // RX interrupt enable
|
UCSR0B |= (1<<RXCIE0) ; // RX interrupt enable
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void modules_reset()
|
void modules_reset()
|
||||||
{
|
{
|
||||||
#ifdef CC2500_INSTALLED
|
#ifdef CC2500_INSTALLED
|
||||||
CC2500_Reset();
|
CC2500_Reset();
|
||||||
#endif
|
#endif
|
||||||
@ -917,77 +1031,77 @@ void modules_reset()
|
|||||||
//Wait for every component to reset
|
//Wait for every component to reset
|
||||||
delayMilliseconds(100);
|
delayMilliseconds(100);
|
||||||
prev_power=0xFD; // unused power value
|
prev_power=0xFD; // unused power value
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef STM32_board
|
#ifndef STM32_board
|
||||||
int16_t map( int16_t x, int16_t in_min, int16_t in_max, int16_t out_min, int16_t out_max)
|
int16_t map( int16_t x, int16_t in_min, int16_t in_max, int16_t out_min, int16_t out_max)
|
||||||
{
|
{
|
||||||
// return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
|
// return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
|
||||||
long y ;
|
long y ;
|
||||||
x -= in_min ;
|
x -= in_min ;
|
||||||
y = out_max - out_min ;
|
y = out_max - out_min ;
|
||||||
y *= x ;
|
y *= x ;
|
||||||
x = y / (in_max - in_min) ;
|
x = y / (in_max - in_min) ;
|
||||||
return x + out_min ;
|
return x + out_min ;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
// 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),servo_min_100,servo_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),servo_min_100,servo_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
|
||||||
uint8_t convert_channel_s8b(uint8_t num)
|
uint8_t convert_channel_s8b(uint8_t num)
|
||||||
{
|
{
|
||||||
uint8_t ch;
|
uint8_t ch;
|
||||||
ch = convert_channel_8b(num);
|
ch = convert_channel_8b(num);
|
||||||
return (ch < 128 ? 127-ch : ch);
|
return (ch < 128 ? 127-ch : ch);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 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),servo_min_100,servo_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
|
||||||
uint16_t convert_channel_frsky(uint8_t num)
|
uint16_t convert_channel_frsky(uint8_t num)
|
||||||
{
|
{
|
||||||
return Servo_data[num] + Servo_data[num]/2;
|
return Servo_data[num] + Servo_data[num]/2;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Channel value is converted for HK310
|
// Channel value is converted for HK310
|
||||||
void convert_channel_HK310(uint8_t num, uint8_t *low, uint8_t *high)
|
void convert_channel_HK310(uint8_t num, uint8_t *low, uint8_t *high)
|
||||||
{
|
{
|
||||||
uint16_t temp=0xFFFF-(4*Servo_data[num])/3;
|
uint16_t temp=0xFFFF-(4*Servo_data[num])/3;
|
||||||
*low=(uint8_t)(temp&0xFF);
|
*low=(uint8_t)(temp&0xFF);
|
||||||
*high=(uint8_t)(temp>>8);
|
*high=(uint8_t)(temp>>8);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 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]>servo_max_100)
|
if(Servo_data[ch]>servo_max_100)
|
||||||
return servo_max_100;
|
return servo_max_100;
|
||||||
else
|
else
|
||||||
if (Servo_data[ch]<servo_min_100)
|
if (Servo_data[ch]<servo_min_100)
|
||||||
return servo_min_100;
|
return servo_min_100;
|
||||||
return Servo_data[ch];
|
return Servo_data[ch];
|
||||||
}
|
}
|
||||||
|
|
||||||
// void Serial_write(uint8_t data){
|
// void Serial_write(uint8_t data){
|
||||||
// return;
|
// return;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
static void Mprotocol_serial_init()
|
static void Mprotocol_serial_init()
|
||||||
{
|
{
|
||||||
|
|
||||||
#ifdef XMEGA
|
#ifdef XMEGA
|
||||||
|
|
||||||
@ -1029,25 +1143,25 @@ static void Mprotocol_serial_init()
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(TELEMETRY)
|
#if defined(TELEMETRY)
|
||||||
void PPM_Telemetry_serial_init()
|
void PPM_Telemetry_serial_init()
|
||||||
{
|
{
|
||||||
initTXSerial( SPEED_9600 ) ;
|
initTXSerial( SPEED_9600 ) ;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
// Convert 32b id to rx_tx_addr
|
// Convert 32b id to rx_tx_addr
|
||||||
static void set_rx_tx_addr(uint32_t id)
|
static void set_rx_tx_addr(uint32_t id)
|
||||||
{ // Used by almost all protocols
|
{ // Used by almost all protocols
|
||||||
rx_tx_addr[0] = (id >> 24) & 0xFF;
|
rx_tx_addr[0] = (id >> 24) & 0xFF;
|
||||||
rx_tx_addr[1] = (id >> 16) & 0xFF;
|
rx_tx_addr[1] = (id >> 16) & 0xFF;
|
||||||
rx_tx_addr[2] = (id >> 8) & 0xFF;
|
rx_tx_addr[2] = (id >> 8) & 0xFF;
|
||||||
rx_tx_addr[3] = (id >> 0) & 0xFF;
|
rx_tx_addr[3] = (id >> 0) & 0xFF;
|
||||||
rx_tx_addr[4] = 0xC1; // for YD717: always uses first data port
|
rx_tx_addr[4] = 0xC1; // for YD717: always uses first data port
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined STM32_board
|
#if defined STM32_board
|
||||||
static uint32_t random_id(uint16_t adress, uint8_t create_new)
|
static uint32_t random_id(uint16_t adress, uint8_t create_new)
|
||||||
@ -1079,7 +1193,7 @@ static void set_rx_tx_addr(uint32_t id)
|
|||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
static uint32_t random_id(uint16_t adress, uint8_t create_new)
|
static uint32_t random_id(uint16_t adress, uint8_t create_new)
|
||||||
{
|
{
|
||||||
uint32_t id;
|
uint32_t id;
|
||||||
@ -1109,20 +1223,20 @@ static void set_rx_tx_addr(uint32_t id)
|
|||||||
|
|
||||||
#ifndef XMEGA
|
#ifndef XMEGA
|
||||||
#ifndef STM32_board
|
#ifndef STM32_board
|
||||||
/************************************/
|
/************************************/
|
||||||
/** Arduino replacement routines **/
|
/** Arduino replacement routines **/
|
||||||
/************************************/
|
/************************************/
|
||||||
// replacement millis() and micros()
|
// replacement millis() and micros()
|
||||||
// These work polled, no interrupts
|
// These work polled, no interrupts
|
||||||
// micros() MUST be called at least once every 32 milliseconds
|
// micros() MUST be called at least once every 32 milliseconds
|
||||||
uint16_t MillisPrecount ;
|
uint16_t MillisPrecount ;
|
||||||
uint16_t lastTimerValue ;
|
uint16_t lastTimerValue ;
|
||||||
uint32_t TotalMicros ;
|
uint32_t TotalMicros ;
|
||||||
uint32_t TotalMillis ;
|
uint32_t TotalMillis ;
|
||||||
uint8_t Correction ;
|
uint8_t Correction ;
|
||||||
|
|
||||||
uint32_t micros()
|
uint32_t micros()
|
||||||
{
|
{
|
||||||
uint16_t elapsed ;
|
uint16_t elapsed ;
|
||||||
uint8_t millisToAdd ;
|
uint8_t millisToAdd ;
|
||||||
uint8_t oldSREG = SREG ;
|
uint8_t oldSREG = SREG ;
|
||||||
@ -1173,16 +1287,16 @@ uint32_t micros()
|
|||||||
TotalMillis += millisToAdd ;
|
TotalMillis += millisToAdd ;
|
||||||
MillisPrecount = elapsed ;
|
MillisPrecount = elapsed ;
|
||||||
return TotalMicros ;
|
return TotalMicros ;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t millis()
|
uint32_t millis()
|
||||||
{
|
{
|
||||||
micros() ;
|
micros() ;
|
||||||
return TotalMillis ;
|
return TotalMillis ;
|
||||||
}
|
}
|
||||||
|
|
||||||
void delayMilliseconds(unsigned long ms)
|
void delayMilliseconds(unsigned long ms)
|
||||||
{
|
{
|
||||||
uint16_t start = (uint16_t)micros();
|
uint16_t start = (uint16_t)micros();
|
||||||
uint16_t lms = ms ;
|
uint16_t lms = ms ;
|
||||||
|
|
||||||
@ -1192,13 +1306,13 @@ void delayMilliseconds(unsigned long ms)
|
|||||||
start += 1000;
|
start += 1000;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Important notes:
|
/* Important notes:
|
||||||
- Max value is 16000µs
|
- Max value is 16000µs
|
||||||
- delay is not accurate due to interrupts happening */
|
- delay is not accurate due to interrupts happening */
|
||||||
void delayMicroseconds(unsigned int us)
|
void delayMicroseconds(unsigned int us)
|
||||||
{
|
{
|
||||||
if (--us == 0)
|
if (--us == 0)
|
||||||
return;
|
return;
|
||||||
us <<= 2; // * 4
|
us <<= 2; // * 4
|
||||||
@ -1207,36 +1321,36 @@ void delayMicroseconds(unsigned int us)
|
|||||||
"1: sbiw %0,1" "\n\t" // 2 cycles
|
"1: sbiw %0,1" "\n\t" // 2 cycles
|
||||||
"brne 1b" : "=w" (us) : "0" (us) // 2 cycles
|
"brne 1b" : "=w" (us) : "0" (us) // 2 cycles
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
void init()
|
void init()
|
||||||
{
|
{
|
||||||
// this needs to be called before setup() or some functions won't work there
|
// this needs to be called before setup() or some functions won't work there
|
||||||
sei();
|
sei();
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/**************************/
|
/**************************/
|
||||||
/**************************/
|
/**************************/
|
||||||
/** Interrupt routines **/
|
/** Interrupt routines **/
|
||||||
/**************************/
|
/**************************/
|
||||||
/**************************/
|
/**************************/
|
||||||
|
|
||||||
//PPM
|
//PPM
|
||||||
#ifdef ENABLE_PPM
|
#ifdef ENABLE_PPM
|
||||||
#ifdef XMEGA
|
#ifdef XMEGA
|
||||||
ISR(PORTD_INT0_vect)
|
ISR(PORTD_INT0_vect)
|
||||||
#else
|
#else
|
||||||
#ifdef STM32_board
|
#ifdef STM32_board
|
||||||
void PPM_decode()
|
void PPM_decode()
|
||||||
#else
|
#else
|
||||||
ISR(INT1_vect)
|
ISR(INT1_vect)
|
||||||
#endif
|
|
||||||
#endif
|
#endif
|
||||||
{ // Interrupt on PPM pin
|
#endif
|
||||||
|
{ // Interrupt on PPM pin
|
||||||
static int8_t chan=-1;
|
static int8_t chan=-1;
|
||||||
static uint16_t Prev_TCNT1=0;
|
static uint16_t Prev_TCNT1=0;
|
||||||
uint16_t Cur_TCNT1;
|
uint16_t Cur_TCNT1;
|
||||||
@ -1267,15 +1381,19 @@ void init()
|
|||||||
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
|
#endif //ENABLE_PPM
|
||||||
//Serial RX
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef ENABLE_SERIAL
|
||||||
|
//Serial RX
|
||||||
#ifdef XMEGA
|
#ifdef XMEGA
|
||||||
ISR(USARTC0_RXC_vect)
|
ISR(USARTC0_RXC_vect)
|
||||||
#else
|
#else
|
||||||
#if defined STM32_board
|
#if defined STM32_board
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
void __irq_usart2()
|
void __irq_usart2()
|
||||||
@ -1396,22 +1514,22 @@ void init()
|
|||||||
#if defined STM32_board
|
#if defined STM32_board
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//Serial timer
|
//Serial timer
|
||||||
#ifdef XMEGA
|
#ifdef XMEGA
|
||||||
ISR(TCC1_CCB_vect)
|
ISR(TCC1_CCB_vect)
|
||||||
#else
|
#else
|
||||||
#if defined STM32_board
|
#if defined STM32_board
|
||||||
void ISR_COMPB()
|
void ISR_COMPB()
|
||||||
#else
|
#else
|
||||||
ISR(TIMER1_COMPB_vect,ISR_NOBLOCK)
|
ISR(TIMER1_COMPB_vect,ISR_NOBLOCK)
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
{ // Timer1 compare B interrupt
|
{ // Timer1 compare B interrupt
|
||||||
discard_frame=1; // Error encountered discard full frame...
|
discard_frame=1; // Error encountered discard full frame...
|
||||||
#ifdef XMEGA
|
#ifdef XMEGA
|
||||||
TCC1.INTCTRLB &=0xF3; // Disable interrupt on compare B match
|
TCC1.INTCTRLB &=0xF3; // Disable interrupt on compare B match
|
||||||
#else
|
#else
|
||||||
@ -1421,7 +1539,7 @@ discard_frame=1; // Error encountered discard full frame...
|
|||||||
TIMSK1 &=~(1<<OCIE1B); // Disable interrupt on compare B match
|
TIMSK1 &=~(1<<OCIE1B); // Disable interrupt on compare B match
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif //ENABLE_SERIAL
|
#endif //ENABLE_SERIAL
|
||||||
|
Loading…
x
Reference in New Issue
Block a user