打印
[PIC®/AVR®/dsPIC®产品]

PIC24F16KLxx边沿捕捉导致“非法操作码'复位

[复制链接]
697|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ailingg|  楼主 | 2016-9-11 12:56 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 ailingg 于 2016-9-11 17:56 编辑

这个边沿捕捉是用来测算交流波形周期时间的,用的是CCP3引脚,PIC24F16KL402的捕捉设置非常简单,就只有CCP3CON控制寄存器需要设置,电平变化相关的功能默认都是关闭的,所以不存在设置上的问题。只要将CCP3捕捉关闭就再也不会出现“非法操作码”复位,用示波器看过波形,边沿很陡峭光滑的,最近被p24F16KLxx搞的很抓狂。波形输入硬件电路如下:



CCP3相关代码
void CCP3_Init(void)
{
    TRISAbits.TRISA7 = 1;
    CCP3CONbits.CCPM = 4;     //下降沿捕捉
    CCPTMRS0bits.C3TSEL0 = 0;
    IFS1bits.CCP3IF = 0;
    IEC1bits.CCP3IE = 1;
    g_SampleState = FREE;
    g_CycleSampleFullMsg = 0;
    g_ADC_BufInx = 0;
}
CCP3捕捉中断,改了下,让CCP3只在需要工作的时候使能,一下午没出现非法操作码复位了
/***************************************************************************************************************
* 模 块:过零捕捉
* 参 数:无
* 返 回:无
* 说 明:交流过零检测口在CCP3脚,过零加测电路采用交流悬浮衰减直入比较器翻转,2个下降沿之间的TMR1值就是波形周期时间。
*        ADC1由T1定时比较触发转换,PR1取值决定采样点之间的间隔时间,PR1的取值计算:
*        SAMPLE_POINTS = 32
*        波形周期 CycleTime = TMR1 * Tcy * 8
*        则有     PR1 = TMR1 * Tcy * 8 / Tcy / SAMPLE_POINTS = TMR1 * 8 / 32;
**************************************************************************************************************/
void __attribute__((interrupt, shadow,no_auto_psv)) _CCP3Interrupt(void)
{
    static UINT8 IntoTimes = 0;
   
    IFS1bits.CCP3IF = 0;
    if ( IntoTimes == 0 )         // 第一个下降沿
    {
        IntoTimes = 1;
        T1CONbits.TON = 0;
        T1CONbits.TCKPS = 0b01;   // 计算波形周期时,预分频1:8
        PR1 = 65000;
        TMR1 = 0;
        T1CONbits.TON = 1;   
    }
    else if ( IntoTimes == 1 )     // 第二个下降沿,根据所得波形周期和采样点数算出采样间隔,ADC采样转换开始   
    {
        IntoTimes = 0;
        T1CONbits.TON = 0;
        T1CONbits.TCKPS = 0b00;   // 计算ADC采样间隔时,预分频1:1
        /* PR1 = CycleTime / SAMPLE_POINTS = TMR1 * Tcy * 8 / Tcy / SAMPLE_POINTS = TMR1 * 8 / 32 */
        PR1 = TMR1 >> 2;               
        TMR1 = 0;               
        T1CONbits.TON = 1;
        IEC0bits.AD1IE = 1;
        AD1CON1bits.ADON = 1;     // 打开AD模块
        g_ADC_BufInx = 0;         // 缓存清空
        g_SampleState = BUSY;     
        IEC1bits.CCP3IE = 0;
        CCP3CONbits.CCPM = 0;     // 关闭CCP3捕捉
    }
}



发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

18

主题

167

帖子

2

粉丝