Esempio n. 1
0
void cmd_stack(void)
{
#if (RECORD_FREE_STACK_SPACE == 1)
	printf("maxstack %x\r\n", maxstack);
	printf("SP_start %x\r\n", SP_start());
	printf("SP_limit %x\r\n", SP_limit());
	printf("SP_current %x\r\n", SP_current());
	printf("stack usage %u\r\n", maxstack - SP_start());
#else
	printf("stack reporting disabled.\r\n");
#endif
}
void __attribute__((__interrupt__,__no_auto_psv__)) _DMA0Interrupt(void)
{
	indicate_loading_inter;
	interrupt_save_set_corcon;

#if (RECORD_FREE_STACK_SPACE == 1)
	uint16_t stack = SP_current();
	if (stack > maxstack)
	{
		maxstack = stack;
	}
#endif
	
#if (HILSIM != 1)
	int16_t *CurBuffer = (DmaBuffer == 0) ? BufferA : BufferB;

	udb_xrate.input = CurBuffer[xrateBUFF-1];
	udb_yrate.input = CurBuffer[yrateBUFF-1];
	udb_zrate.input = CurBuffer[zrateBUFF-1];
	udb_xaccel.input = CurBuffer[xaccelBUFF-1];
	udb_yaccel.input = CurBuffer[yaccelBUFF-1];
	udb_zaccel.input = CurBuffer[zaccelBUFF-1];
#if (NUM_ANALOG_INPUTS >= 1)
	udb_analogInputs[0].input = CurBuffer[analogInput1BUFF-1];
#endif
#if (NUM_ANALOG_INPUTS >= 2)
	udb_analogInputs[1].input = CurBuffer[analogInput2BUFF-1];
#endif
#if (NUM_ANALOG_INPUTS >= 3)
	udb_analogInputs[2].input = CurBuffer[analogInput3BUFF-1];
#endif
#if (NUM_ANALOG_INPUTS >= 4)
	udb_analogInputs[3].input = CurBuffer[analogInput4BUFF-1];
#endif

#endif

	DmaBuffer ^= 1;				// Switch buffers
	IFS0bits.DMA0IF = 0;		// Clear the DMA0 Interrupt Flag

	if (udb_flags._.a2d_read == 1) // prepare for the next reading
	{
		udb_flags._.a2d_read = 0;
		udb_xrate.sum = udb_yrate.sum = udb_zrate.sum = 0;
		udb_xaccel.sum = udb_yaccel.sum = udb_zaccel.sum = 0;
#ifdef VREF
		udb_vref.sum = 0;
#endif
#if (NUM_ANALOG_INPUTS >= 1)
		udb_analogInputs[0].sum = 0;
#endif
#if (NUM_ANALOG_INPUTS >= 2)
		udb_analogInputs[1].sum = 0;
#endif
#if (NUM_ANALOG_INPUTS >= 3)
		udb_analogInputs[2].sum = 0;
#endif
#if (NUM_ANALOG_INPUTS >= 4)
		udb_analogInputs[3].sum = 0;
#endif
		sample_count = 0;
	}

	//	perform the integration:
	udb_xrate.sum += udb_xrate.input;
	udb_yrate.sum += udb_yrate.input;
	udb_zrate.sum += udb_zrate.input;
#ifdef VREF
	udb_vref.sum  += udb_vref.input;
#endif
	udb_xaccel.sum += udb_xaccel.input;
	udb_yaccel.sum += udb_yaccel.input;
	udb_zaccel.sum += udb_zaccel.input;
#if (NUM_ANALOG_INPUTS >= 1)
	udb_analogInputs[0].sum += udb_analogInputs[0].input;
#endif
#if (NUM_ANALOG_INPUTS >= 2)
	udb_analogInputs[1].sum += udb_analogInputs[1].input;
#endif
#if (NUM_ANALOG_INPUTS >= 3)
	udb_analogInputs[2].sum += udb_analogInputs[2].input;
#endif
#if (NUM_ANALOG_INPUTS >= 4)
	udb_analogInputs[3].sum += udb_analogInputs[3].input;
#endif
	sample_count ++;

	//	When there is a chance that read_gyros() and read_accel() will execute soon,
	//  have the new average values ready.
	if (sample_count > ALMOST_ENOUGH_SAMPLES)
	{
		udb_xrate.value = __builtin_divsd(udb_xrate.sum , sample_count);
		udb_yrate.value = __builtin_divsd(udb_yrate.sum , sample_count);
		udb_zrate.value = __builtin_divsd(udb_zrate.sum , sample_count);
#ifdef VREF
		udb_vref.value = __builtin_divsd(udb_vref.sum , sample_count);
#endif
		udb_xaccel.value =  __builtin_divsd(udb_xaccel.sum , sample_count);
		udb_yaccel.value =  __builtin_divsd(udb_yaccel.sum , sample_count);
		udb_zaccel.value =  __builtin_divsd(udb_zaccel.sum , sample_count);
		
#if (NUM_ANALOG_INPUTS >= 1)
		udb_analogInputs[0].value = __builtin_divsd(udb_analogInputs[0].sum, sample_count);
#endif
#if (NUM_ANALOG_INPUTS >= 2)
		udb_analogInputs[1].value = __builtin_divsd(udb_analogInputs[1].sum, sample_count);
#endif
#if (NUM_ANALOG_INPUTS >= 3)
		udb_analogInputs[2].value = __builtin_divsd(udb_analogInputs[2].sum, sample_count);
#endif
#if (NUM_ANALOG_INPUTS >= 4)
		udb_analogInputs[3].value = __builtin_divsd(udb_analogInputs[3].sum, sample_count);
#endif
	}

	interrupt_restore_corcon;
}
Esempio n. 3
0
void __attribute__((__interrupt__,__no_auto_psv__)) _T4Interrupt(void)
{
	indicate_loading_inter;
	// "set_ipl_on_output_pin" macro not here as _T4 Interrupt disabled when testing Interrupt Priorities
	// interrupt_save_set_corcon;

	switch (outputNum) {
		case 0:
#if (USE_CASTLE_LINK_THROTTLE != 1)
			HANDLE_SERVO_OUT(1, SERVO_OUT_PIN_1);
#else
			cll_start_servo_out(SCALE_FOR_PWM_OUT(udb_pwOut[1]), SCALE_FOR_PWM_OUT(100));
            outputNum++; // usually handled in HANDLE_SERVO_OUT()
#endif
			break;
		case 1:
#if (USE_CASTLE_LINK_THROTTLE != 1)
			SERVO_OUT_PIN_1 = 0;
#else
			cll_start_listening();
			if (outputNum >= NUM_OUTPUTS) _T4IE = 0;  // usually handled in HANDLE_SERVO_OUT()
#endif
			HANDLE_SERVO_OUT(2, SERVO_OUT_PIN_2);
			break;
		case 2:
			SERVO_OUT_PIN_2 = 0;
			HANDLE_SERVO_OUT(3, SERVO_OUT_PIN_3);
			break;
		case 3:
			SERVO_OUT_PIN_3 = 0;
			HANDLE_SERVO_OUT(4, SERVO_OUT_PIN_4);
			break;
		case 4:
			SERVO_OUT_PIN_4 = 0;
			HANDLE_SERVO_OUT(5, SERVO_OUT_PIN_5);
			break;
		case 5:
			SERVO_OUT_PIN_5 = 0;
			HANDLE_SERVO_OUT(6, SERVO_OUT_PIN_6);
			break;
		case 6:
			SERVO_OUT_PIN_6 = 0;
			HANDLE_SERVO_OUT(7, SERVO_OUT_PIN_7);
			break;
		case 7:
			SERVO_OUT_PIN_7 = 0;
			HANDLE_SERVO_OUT(8, SERVO_OUT_PIN_8);
			break;
		case 8:
			SERVO_OUT_PIN_8 = 0;
			HANDLE_SERVO_OUT(9, SERVO_OUT_PIN_9);
			break;
#ifdef SERVO_OUT_PIN_10
		case 9:
			SERVO_OUT_PIN_9 = 0;
			HANDLE_SERVO_OUT(10, SERVO_OUT_PIN_10);
			break;
		case 10:
			SERVO_OUT_PIN_10 = 0;   // end the pulse by setting the SERVO_OUT_PIN_10 pin low
			_T4IE = 0;              // disable timer 4 interrupt
			break;
#else
		case 9:
			SERVO_OUT_PIN_9 = 0;
			_T4IE = 0;              // disable timer 4 interrupt
			break;
#endif // SERVO_OUT_PIN_10
	}

	_T4IF = 0;                      // clear the interrupt

#if (RECORD_FREE_STACK_SPACE == 1)
	// Check stack space here because it's a high-priority ISR
	// which may have interrupted a whole chain of other ISRs,
	// So available stack space can get lowest here.
	uint16_t stack = SP_current();
	if (stack > maxstack)
	{
		maxstack = stack;
	}
#endif

	// interrupt_restore_corcon;
}
Esempio n. 4
0
// When testing interrupt priorities, all servo output timings are sent to pin 8 
// Pins 1-7 for are then indicating the timing of  interrupt priorities
// No Servos should be attached to the board outputs, only a logic analyser.
void __attribute__((__interrupt__,__no_auto_psv__)) _T4Interrupt(void)
{
	indicate_loading_inter;
	set_ipl_on_output_pin;
	// interrupt_save_set_corcon;

	switch (outputNum) {
		case 0:
			HANDLE_SERVO_OUT(1, SERVO_OUT_PIN_8);
			break;
		case 1:
			SERVO_OUT_PIN_8 = 0;
			HANDLE_SERVO_OUT(2, SERVO_OUT_PIN_8);
			break;
		case 2:
			SERVO_OUT_PIN_8 = 0;
			HANDLE_SERVO_OUT(3, SERVO_OUT_PIN_8);
			break;
		case 3:
			SERVO_OUT_PIN_8 = 0;
			HANDLE_SERVO_OUT(4, SERVO_OUT_PIN_8);
			break;
		case 4:
			SERVO_OUT_PIN_8 = 0;
			HANDLE_SERVO_OUT(5, SERVO_OUT_PIN_8);
			break;
		case 5:
			SERVO_OUT_PIN_8 = 0;
			HANDLE_SERVO_OUT(6, SERVO_OUT_PIN_8);
			break;
		case 6:
			SERVO_OUT_PIN_8 = 0;
			HANDLE_SERVO_OUT(7, SERVO_OUT_PIN_8);
			break;
		case 7:
			SERVO_OUT_PIN_8 = 0;
			HANDLE_SERVO_OUT(8, SERVO_OUT_PIN_8);
			break;
		case 8:
			SERVO_OUT_PIN_8 = 0;
			HANDLE_SERVO_OUT(9, SERVO_OUT_PIN_8);
			break;
#ifdef SERVO_OUT_PIN_10
		case 9:
			SERVO_OUT_PIN_8 = 0;
			HANDLE_SERVO_OUT(10, SERVO_OUT_PIN_8);
			break;
		case 10:
			SERVO_OUT_PIN_8 = 0;   // end the pulse by setting the SERVO_OUT_PIN_10 pin low
			_T4IE = 0;              // disable timer 4 interrupt
			break;
#else
		case 9:
			SERVO_OUT_PIN_9 = 0;
			_T4IE = 0;              // disable timer 4 interrupt
			break;
#endif // SERVO_OUT_PIN_10
	}

	_T4IF = 0;                      // clear the interrupt

#if (RECORD_FREE_STACK_SPACE == 1)
	// Check stack space here because it's a high-priority ISR
	// which may have interrupted a whole chain of other ISRs,
	// So available stack space can get lowest here.
	uint16_t stack = SP_current();
	if (stack > maxstack)
	{
		maxstack = stack;
	}
#endif

	// interrupt_restore_corcon;
	unset_ipl_on_output_pin;
}