开启串口打印功能后单片机没有执行if语句
各位大佬,我经常遇到这个问题:在函数while(1)的大循环里面,如果开启串口打印信息功能,定时计时250mS时间到并没有打开绿灯,或者定时计时250mS时间到了打开绿灯但是到后面1050mS到了绿灯并没有关闭。如果关闭串口打印信息功能,一切正常。这是为什么?如果要开启串口打印信息功能同时也要单片机运行程序正常,怎么解决此问题?
while(1)
{
data_0x10=read_data(0x10);//读取充电盒各种状态的寄存器
ST_CH=0x20&data_0x10;//如果芯片在充电状态,ST_CH==0x20
ST_CH_END=0x40&data_0x10;//如果电池充满电,ST_CH_END==0x40
TI=1;
printf("ST_CH_END is 0x%bx\n",ST_CH_END);//串口打印ST_CH_END状态
while(TI==0);
TI=0;
if(open_lid_flag==1)
{
if(oc_lid_led_5ms==50)//定时器计时250mS到了
green_led=1; //打开绿灯
if(oc_lid_led_5ms==1050)//定时器计时5S时间到了
{
green_led=0;//关闭绿灯
open_lid_flag=0;
oc_lid_led_5ms=0;
hvbat_flag=0;
TR0=0;
}
}
}
void timer0() interrupt 1//count time 5ms
{
if((open_lid_flag==1)||(close_lid_flag==1))
oc_lid_led_5ms++;
}
if(oc_lid_led_5ms==50)//定时器计时250mS到了
这一行判断只有5ms间隙机会,不然中断里计数器累加超过50就要死变量溢出再回头了,
改为if(oc_lid_led_5ms>=50),或者中断里计数器做个50限幅应该就可以了
你试试, 网老四 发表于 2023-4-11 14:46
if(oc_lid_led_5ms==50)//定时器计时250mS到了
这一行判断只有5ms间隙机会,不然中断里计数器累加超过50就 ...
好的,中断里计数器做个50限幅,这个功能怎么写代码呢?谢谢 980578873 发表于 2023-4-11 16:12
好的,中断里计数器做个50限幅,这个功能怎么写代码呢?谢谢
后面用到5ms计数器值1050判断,所以中断限幅不可能了 网老四 发表于 2023-4-11 16:31
后面用到5ms计数器值1050判断,所以中断限幅不可能了
那麻烦解释一下我的疑问:
在函数while(1)的大循环里面,如果开启串口打印信息功能,定时计时250mS时间到并没有打开绿灯,或者定时计时250mS时间到了打开绿灯但是到后面1050mS到了绿灯并没有关闭。如果关闭串口打印信息功能,一切正常。这是为什么?为什么加入串口打印信息语句影响这么大?
980578873 发表于 2023-4-11 16:51
那麻烦解释一下我的疑问:
在函数while(1)的大循环里面,如果开启串口打印信息功能,定时计时250mS时间 ...
在主循环里加一个IO口翻转,通过测量IO口翻转时间就知道主循环多长时间执行一次,如果超过5ms的话,那么就可能判断不到绿灯开关的时间点。
串口打印是需要时间的,加上这个时间如果主循环一次就超过5ms的话,就会出现你说的那种现象。
最简单的方法就如2楼所说的,将判断语句里面的 “==50”、“==1050” 改成 “>=50”、“>=1050” 。 打印函数是查询的,需要时间长,你判断时间错过了,应该在定时器中断中判断,然后设置标志。 梁工 发表于 2023-4-11 21:14
打印函数是查询的,需要时间长,你判断时间错过了,应该在定时器中断中判断,然后设置标志。 ...
好的,明白了,谢谢。 乘风飞扬 发表于 2023-4-11 19:53
在主循环里加一个IO口翻转,通过测量IO口翻转时间就知道主循环多长时间执行一次,如果超过5ms的话,那么 ...
好的,明白了,谢谢大咖指点,但是不明白串口打印需要这么久
页:
[1]