Cortex_M3 发表于 2014-6-21 17:19:37

AVR xmega32 关于捕获配置!

本帖最后由 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 = 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 = tc_read_cc(&TCD0, TC_CCB);

麻烦大家给看看,是否这样配置。

Cortex_M3 发表于 2014-6-21 17:36:55

水贴太多,顶一下!

Cortex_M3 发表于 2014-6-21 20:46:45

为何没有人指导一下呢 {:cry:}{:cry:}

phnbs 发表于 2014-6-29 17:48:44

事件系统不需要中断
页: [1]
查看完整版本: AVR xmega32 关于捕获配置!