ArduPPM V2.2.66

- Added APM2 (ATmega32U2) support for using TX and RX status leds to indicate PWM and PPM traffic

<RX><OFF> no pwm input detected
<RX><TOGGLE> speed of toggle indicate how many channels are active
<RX><ON> input lost (failsafe)
<TX><OFF> ppm output not started
<TX><FAST TOGGLE> normal PWM->PPM output or PPM passtrough failsafe
<TX><SLOW TOGGLE> PPM passtrough
This commit is contained in:
John Arne Birkeland 2012-03-16 20:48:55 +01:00
parent 0c6a87db3f
commit 55055fca2b

View File

@ -1,11 +1,10 @@
// Warning : Untested - Please use version 2.2.63 for field use.
// ------------------------------------------------------------- // -------------------------------------------------------------
// PPM ENCODER V2.2.65 (25-09-2011) // PPM ENCODER V2.2.66 (15-03-2012)
// ------------------------------------------------------------- // -------------------------------------------------------------
// Improved servo to ppm for ArduPilot MEGA v1.x (ATmega328p) // Improved servo to ppm for ArduPilot MEGA v1.x (ATmega328p),
// and PhoneDrone (ATmega32u2) // PhoneDrone and APM2 (ATmega32u2)
// By: John Arne Birkeland - 2011 // By: John Arne Birkeland - 2012
// APM v1.x adaptation and "difficult" receiver testing by Olivier ADLER // APM v1.x adaptation and "difficult" receiver testing by Olivier ADLER
// ------------------------------------------------------------- // -------------------------------------------------------------
// Changelog: // Changelog:
@ -50,6 +49,11 @@
// - Changed brownout detection and FailSafe handling to work with XXU2 chips // - Changed brownout detection and FailSafe handling to work with XXU2 chips
// - Minor variable and define naming changes to enhance readability // - Minor variable and define naming changes to enhance readability
// 15-03-2012
// V2.2.66 - Added APM2 (ATmega32U2) support for using TX and RX status leds to indicate PWM and PPM traffic
// - <RX>: <OFF> = no pwm input detected, <TOGGLE> = speed of toggle indicate how many channel are active, <ON> = input lost (failsafe)
// - <TX>: <OFF> = ppm output not started, <FAST TOGGLE> = normal PWM->PPM output or PPM passtrough failsafe, <SLOW TOGGLE> = PPM passtrough
// ------------------------------------------------------------- // -------------------------------------------------------------
#ifndef _PPM_ENCODER_H_ #ifndef _PPM_ENCODER_H_
@ -219,7 +223,7 @@ const uint16_t failsafe_ppm[ PPM_ARRAY_MAX ] =
}; };
// ------------------------------------------------------------- // -------------------------------------------------------------
// AVR parameters for PhoneDrone PPM Encoder and future boards also using ATmega16-32u2 // AVR parameters for PhoneDrone and APM2 boards using ATmega32u2
#if defined (__AVR_ATmega16U2__) || defined (__AVR_ATmega32U2__) #if defined (__AVR_ATmega16U2__) || defined (__AVR_ATmega32U2__)
#define SERVO_DDR DDRB #define SERVO_DDR DDRB
@ -347,6 +351,11 @@ void ppm_start( void )
// Restore interrupt status and register flags // Restore interrupt status and register flags
SREG = SREG_tmp; SREG = SREG_tmp;
#if defined (__AVR_ATmega16U2__) || defined (__AVR_ATmega32U2__)
// Turn on TX led if PPM generator is active
PORTD &= ~( 1<< PD5 );
#endif
} }
// ------------------------------------------------------------------------------ // ------------------------------------------------------------------------------
@ -372,6 +381,11 @@ void ppm_stop( void )
// Restore interrupt status and register flags // Restore interrupt status and register flags
SREG = SREG_tmp; SREG = SREG_tmp;
#if defined (__AVR_ATmega16U2__) || defined (__AVR_ATmega32U2__)
// Turn off TX led if PPM generator is off
PORTD |= ( 1<< PD5 );
#endif
} }
// ------------------------------------------------------------------------------ // ------------------------------------------------------------------------------
@ -387,7 +401,8 @@ ISR( WDT_vect ) // If watchdog is triggered then enable missing signal flag and
{ {
ppm[ i ] = failsafe_ppm[ i ]; ppm[ i ] = failsafe_ppm[ i ];
} }
}
}
// If we are in PPM passtrough mode and a input signal has been detected, or if chip has been reset from a brown_out then start the PPM generator. // If we are in PPM passtrough mode and a input signal has been detected, or if chip has been reset from a brown_out then start the PPM generator.
if( ( servo_input_mode == PPM_PASSTROUGH_MODE && servo_input_missing == false ) || brownout_reset ) if( ( servo_input_mode == PPM_PASSTROUGH_MODE && servo_input_missing == false ) || brownout_reset )
@ -395,13 +410,18 @@ ISR( WDT_vect ) // If watchdog is triggered then enable missing signal flag and
// Start PPM generator // Start PPM generator
ppm_start(); ppm_start();
brownout_reset = false; brownout_reset = false;
} }
// Set missing receiver signal flag // Set missing receiver signal flag
servo_input_missing = true; servo_input_missing = true;
// Reset servo input error flag // Reset servo input error flag
servo_input_errors = 0; servo_input_errors = 0;
#if defined (__AVR_ATmega16U2__) || defined (__AVR_ATmega32U2__)
// Turn on RX led if failsafe has triggered after ppm generator i active
if( ppm_generator_active ) PORTD &= ~( 1<< PD4 );
#endif
} }
// ------------------------------------------------------------------------------ // ------------------------------------------------------------------------------
@ -414,7 +434,12 @@ ISR( SERVO_INT_VECTOR )
// Servo pulse start timing // Servo pulse start timing
static uint16_t servo_start[ SERVO_CHANNELS ] = { 0, 0, 0, 0, 0, 0, 0, 0 }; static uint16_t servo_start[ SERVO_CHANNELS ] = { 0, 0, 0, 0, 0, 0, 0, 0 };
// Servo input pin storage #if defined (__AVR_ATmega16U2__) || defined (__AVR_ATmega32U2__)
// Toggle LED delay
static uint8_t led_delay = 0;
#endif
// Servo input pin storage
static uint8_t servo_pins_old = 0; static uint8_t servo_pins_old = 0;
// Used to store current servo input pins // Used to store current servo input pins
@ -454,6 +479,16 @@ ISR( SERVO_INT_VECTOR )
// Set servo input missing flag false to indicate that we have received servo input signals // Set servo input missing flag false to indicate that we have received servo input signals
servo_input_missing = false; servo_input_missing = false;
#if defined (__AVR_ATmega16U2__) || defined (__AVR_ATmega32U2__)
// Toggle TX LED at PPM passtrough
if( ++led_delay > 128 ) // Toggle every 128th pulse
{
// Toggle TX led
PIND |= ( 1<< PD5 );
led_delay = 0;
}
#endif
// Leave interrupt // Leave interrupt
return; return;
} }
@ -511,6 +546,8 @@ CHECK_PINS_LOOP: // Input servo pin check loop
// Update ppm[..] // Update ppm[..]
ppm[ _ppm_channel ] = servo_width; ppm[ _ppm_channel ] = servo_width;
} }
} }
@ -532,6 +569,11 @@ CHECK_PINS_ERROR:
// Used to indicate invalid servo input signals // Used to indicate invalid servo input signals
servo_input_errors++; servo_input_errors++;
#if defined (__AVR_ATmega16U2__) || defined (__AVR_ATmega32U2__)
// Delay LED toggle
led_delay = 0;
#endif
goto CHECK_PINS_NEXT; goto CHECK_PINS_NEXT;
// All servo input pins has now been processed // All servo input pins has now been processed
@ -555,6 +597,15 @@ CHECK_PINS_DONE:
// Clear interrupt event from already processed pin changes // Clear interrupt event from already processed pin changes
PCIFR |= (1 << SERVO_INT_CLEAR_FLAG); PCIFR |= (1 << SERVO_INT_CLEAR_FLAG);
#if defined (__AVR_ATmega16U2__) || defined (__AVR_ATmega32U2__)
// Toggle RX LED when finished receiving servo pulses
if( ++led_delay > 64 ) // Toggle led every 64th time
{
PIND |= ( 1<< PD4 );
led_delay = 0;
}
#endif
} }
// ------------------------------------------------------------------------------ // ------------------------------------------------------------------------------
@ -571,8 +622,15 @@ ISR( PPM_INT_VECTOR )
PPM_COMPARE += ppm[ ppm_channel ]; PPM_COMPARE += ppm[ ppm_channel ];
// Select the next ppm channel // Select the next ppm channel
if( ++ppm_channel >= PPM_ARRAY_MAX ) ppm_channel = 0; if( ++ppm_channel >= PPM_ARRAY_MAX )
{
ppm_channel = 0;
#if defined (__AVR_ATmega16U2__) || defined (__AVR_ATmega32U2__)
// Blink TX LED when PPM generator has finished a pulse train
PIND |= ( 1<< PD5 );
#endif
}
} }
// ------------------------------------------------------------------------------ // ------------------------------------------------------------------------------
@ -720,7 +778,6 @@ void ppm_encoder_init( void )
// Enable servo input interrupt // Enable servo input interrupt
PCICR |= (1 << SERVO_INT_ENABLE); PCICR |= (1 << SERVO_INT_ENABLE);
// PPM OUTPUT PIN // PPM OUTPUT PIN
// ------------------------------------------------------------------------------ // ------------------------------------------------------------------------------
// Set PPM pin to output // Set PPM pin to output
@ -737,6 +794,9 @@ void ppm_encoder_init( void )
WDTCSR |= (1<<WDCE) | (1<<WDE ); WDTCSR |= (1<<WDCE) | (1<<WDE );
// Set 250 ms watchdog timeout and enable interrupt // Set 250 ms watchdog timeout and enable interrupt
WDTCSR = (1<<WDIE) | (1<<WDP2); WDTCSR = (1<<WDIE) | (1<<WDP2);
} }
// ------------------------------------------------------------------------------ // ------------------------------------------------------------------------------