tangrongyong90 发表于 2018-12-10 17:14:52

STC15W404AS 单片机,T2 + 外部中断0,出现BUG

STC15W404AS 外部中断0 + T2 读取PWM脉宽和周期,出现脉宽在255的倍数的时候会出错,比如PWM在1275(255*5)的时候数据会显示1020,而在1020的时候数据会显示765.。。。什么情况?



/**************************************************************************************************       
函数名:Timer2Init( )
功能:        定时器初始化函数
作者:       
时间:       
备注: 1T
/***************************************************************************************************/

void Timer2Init(void)                //1000微秒@12.000MHz
{
        AUXR &= 0xFB;                //定时器时钟12T模式
        T2L = 0;                //设置定时初值
        T2H = 0;                //设置定时初值
//        IE2 |= 0x04;        //开启定时器2中断
//    AUXR |= 0x10;                //定时器2开始计时
        AUXR &= 0xEF;           //定时器2停止计时
}


/**************************************************************************************************       
函数名:INT0_Init( void )
功能:        外部中断0初始化
作者:        数码人科技
时间:        2018-4-5
备注:
/***************************************************************************************************/
void   INT0_Init( void )
{
    IT0 = 0;                  //设置INT0的中断类型 (1:仅下降沿 0:上升沿和下降沿)
    EX0 = 1;                  //使能INT0中断
//        INT_CLKO |= 0x10;                        //使能外部中断2
    PX0 = 1 ;                                       //设置中断优先级

}


void exint0() interrupt 0       //INT0中断入口
{
if( INT0 == 1 ) { AUXR &= 0xEF;;PWM_ALL = T2H*255 + T2L ;T2H = T2L = 0 ; AUXR |= 0x10; }
else   { PWM_H = T2H*255 + T2L;}
}

lcw_swust 发表于 2018-12-10 18:13:01

也许你读的时候T2L正在向T2H进位,建议多读两次判断 一下,或者干脆把T2关掉再读。

tangrongyong90 发表于 2018-12-12 15:33:22

lcw_swust 发表于 2018-12-10 18:13
也许你读的时候T2L正在向T2H进位,建议多读两次判断 一下,或者干脆把T2关掉再读。 ...

试一下,关掉再读!!!

小李非刀 发表于 2018-12-12 23:40:13

刚好出现进位了,要关闭T2再读。经常看到有人出现这个问题,就怀疑到MCU了,常见的是测频率,刚好差了256HZ。

tangrongyong90 发表于 2018-12-21 16:24:23

小李非刀 发表于 2018-12-12 23:40
刚好出现进位了,要关闭T2再读。经常看到有人出现这个问题,就怀疑到MCU了,常见的是测频率,刚好差了256HZ ...

是的,解决了!关闭之后正常!
页: [1]
查看完整版本: STC15W404AS 单片机,T2 + 外部中断0,出现BUG