|
发表于 2011-7-22 10:40:43
|
显示全部楼层
PPM的同步波形有十几个ms,可以用来识别通道数,这是我以前写的,MCU是AVR32
//接收机通道指针【0-7】
unsigned short gs_ppm_pointer = 0;
/*! \brief TC0 interrupt.
*/
#if __GNUC__
__attribute__((__interrupt__))
#elif __ICCAVR32__
#pragma handler = AVR32_TC_IRQ_GROUP, 1
__interrupt
#endif
static void tc0_irq(void)
{
volatile int li_temp_a, li_status;
li_status = tc_read_sr(&AVR32_TC, TC_CHANNEL0);
if (li_status & SR_ET_TRIG_MASK) {
//EXTERNAL TRIGGER INTERRUPT
} else if (li_status & SR_RA_LOAD_MASK) {
//RA LOAD INTERRUPT
li_temp_a = tc_read_ra(&AVR32_TC, TC_CHANNEL0);
tc_write_ra(&AVR32_TC, TC_CHANNEL0, 0);
gs_ppm_value[gs_ppm_pointer] = li_temp_a;
if ((li_temp_a>PPM_SYNC_TIME)||(gs_ppm_pointer>=PPM_CHANNEL_COUNT)) {
gs_ppm_pointer = 0;
} else {
gs_ppm_pointer ++;
}
} else {
//OVERRUN INTERRUPT
gs_ppm_pointer = 0;
}
}
另外中断程序要精简是对的,尽量不要有大循环,特别循环体内涉及全局变量 |
|