|
本帖最后由 Cortex_M3 于 2014-6-21 18:44 编辑
请各位朋友帮忙看看xmega32的外部输入捕获
EVSYS.CH0MUX = EVSYS_CHMUX_PORTD_PIN1_gc; // PD1
EVSYS.CH0CTRL = EVSYS_DIGFILT_1SAMPLE_gc;
//EVSYS.CH1MUX = EVSYS_CHMUX_PORTD_PIN1_gc; // PD1/
//EVSYS.CH1CTRL = EVSYS_DIGFILT_1SAMPLE_gc;
void Input_Capture _Init(void)
{
/*
* Configure TCD0 to input capture
*上升沿触发,2分频16M
*输入捕捉中断使能
*/
tc_enable(&TCD0);
tc_write_clock_source(&TCD0, TC_CLKSEL_DIV2_gc);
tc_set_input_capture(&TCD0, TC_EVACT_CAPT_gc | TC_EVSEL_CH0_gc);
tc_enable_cc_channels(&TCD0,(enum tc_cc_channel_mask_enable_t)(TC_CCAEN));
tc_set_cca_interrupt_callback(&TCD0, PMIC_LVL_LOW);
tc_set_cca_interrupt_callback(&TCD0, tos_egde_interrupt_callback);
/*
* Configure TCD1 to compare mode
*12us定时中断,在这段时间内没数据,认为帧结束,2分频16M
*/
tc_enable(&TCD1);
tc_set_wgm(&TCD1,TC_WG_NORMAL);
tc_write_clock_source(&TCD1, TC_CLKSEL_DIV2_gc);
tc_write_cc(&TCD1, TC_CCA, 192);
tc_set_cca_interrupt_level(&TCD1, PMIC_LVL_LOW);
tc_set_cca_interrupt_callback(&TCD1, tos_cca_interrupt_callback);
}
// 外部输入捕获中断处理函数
static void tos_egde_interrupt_callback()
{
tc_write_count(&TCD1, 0); // 清空TCD1的超时计数
if(!ReceiveEffective)
{
tos_time[time_sn] = tc_read_cc(&TCD0, TC_CCA);//每一次信号记录中断时间,将计数器值赋给计时数组
time_sn++; //计时栈标志加1
if (time_sn>23) {time_sn = 0;}
TosSig = 1;
}
}
//------------------------------------------------
// TCD1 CCA比较中断用于判断一帧数据结束
//------------------------------------------------
static void tos_cca_interrupt_callback()
{
tc_write_count(&TCD0, 0);
if(time_sn>15 && TosSig)
{
TosDataPos = time_sn;
ReceiveEffective = 1;
}
else
{
TosSig = 0;
time_sn = 0;
}
}
将PD1 外部输入配置到事件0通道可以使用
如果将PD1配置到事件1通道就无法使用
配置区别在于红色字体部分,具体如下。
tc_set_input_capture(&TCD0, TC_EVACT_CAPT_gc | TC_EVSEL_CH1_gc);
tc_enable_cc_channels(&TCD0,(enum tc_cc_channel_mask_enable_t)(TC_CCBEN));
tc_set_ccb_level(&TCD0, PMIC_LVL_LOW);
tc_set_ccb_interrupt_callback(&TCD0, tos_egde_interrupt_callback);
然后中断中读取的是通道1对应的TC_CCB
tos_time[time_sn] = tc_read_cc(&TCD0, TC_CCB);
麻烦大家给看看,是否这样配置。 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|