[PIC®/AVR®/dsPIC®产品] PIC24F16KLxx边沿捕捉导致“非法操作码'复位

[复制链接]
 楼主| ailingg 发表于 2016-9-11 12:56 | 显示全部楼层 |阅读模式
本帖最后由 ailingg 于 2016-9-11 17:56 编辑

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



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



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
您需要登录后才可以回帖 登录 | 注册

本版积分规则

18

主题

167

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部

18

主题

167

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部