单片机程序跑飞了,各路大神帮小菜找下BUG吧
时间:10-02
整理:3721RD
点击:
先贴上部分代码://---------------------------- ADC -----------------------------------//
unsigned int GET_ADC_Result(unsigned char ch)
{
unsigned int ADC_VAL=0x0000;
ADC_CONTR = ADC_POWER | ADC_SPEEDHH | ch | ADC_START;
_nop_();
_nop_();
_nop_();
_nop_();
while(!(ADC_CONTR & ADC_FLAG));
ADC_CONTR &= ~ADC_FLAG;
ADC_VAL = ADC_RES; //??8??
return ((ADC_VAL << 2)+ADC_RESL); //10??
}
//----------------- 延迟0.5ms 18.432MHz --------------------//
void Delay(unsigned int n)
{
unsigned int x;
while(n--)
{
x = 500;
while(x--);
}
}
//------------------- 定时计数器0中断服务函数 40ms ------------------//
unsigned int Int_times,Zero_times = 0;
void timer0_isr() interrupt 1 using 1
{
TF0 = 0;
Int_times++;
BEEP = !BEEP;
if(GET_ADC_Result(CURT_SAMP)<0x02){
Zero_times++;
if(Zero_times>130){
BEEP = 1;
LED_R = 1;
LED_G = 0;
}
if((Int_times==Zero_times)&&(Zero_times==150)){
EA = 0; //关中断
ET0 = 0;
TR0 = 0;
IAP_CONTR = 0x20; //软复位
}
}
else{
Int_times = 0;
Zero_times = 0;
}
}
,主函数里面主要是控制一些LED和一些开关,中间也要用上ADC。
情况是这样的: 我想通过单片机来检测一个管脚的电压信号,如果这个管脚的电压低于0x02那我就让单片机复位,也就是这个 定时计数器0中断服务函数 正常情况下完成的内容。
现在问题是:上面的程序正常运行起来的话程序会跑进一个BUG里面,有时候2分钟就进了BUG,有时候40分钟进BUG,但是BUG现象一致,BUG造成的现象是 单片机 会长期处于一个固定状态,比如说 LED 和开关都处于打开状态。 但是如果这个时候我把ADC采样输入那个脚电压设置为0的时候,程序又能正常进入 定时计数器0中断服务函数 ,然后程序重新跑起来,又过2分钟到40分钟,又会出现同样的情况。
如果把 定时计数器0中断服务函数 中不用AD采样,那就不会出现这个BUG!
我查了2天了都没查出来什么问题,实在是查不到哪里出了问题了,还请坛子里大神帮我看看,跪谢~~~
unsigned int GET_ADC_Result(unsigned char ch)
{
unsigned int ADC_VAL=0x0000;
ADC_CONTR = ADC_POWER | ADC_SPEEDHH | ch | ADC_START;
_nop_();
_nop_();
_nop_();
_nop_();
while(!(ADC_CONTR & ADC_FLAG));
ADC_CONTR &= ~ADC_FLAG;
ADC_VAL = ADC_RES; //??8??
return ((ADC_VAL << 2)+ADC_RESL); //10??
}
//----------------- 延迟0.5ms 18.432MHz --------------------//
void Delay(unsigned int n)
{
unsigned int x;
while(n--)
{
x = 500;
while(x--);
}
}
//------------------- 定时计数器0中断服务函数 40ms ------------------//
unsigned int Int_times,Zero_times = 0;
void timer0_isr() interrupt 1 using 1
{
TF0 = 0;
Int_times++;
BEEP = !BEEP;
if(GET_ADC_Result(CURT_SAMP)<0x02){
Zero_times++;
if(Zero_times>130){
BEEP = 1;
LED_R = 1;
LED_G = 0;
}
if((Int_times==Zero_times)&&(Zero_times==150)){
EA = 0; //关中断
ET0 = 0;
TR0 = 0;
IAP_CONTR = 0x20; //软复位
}
}
else{
Int_times = 0;
Zero_times = 0;
}
}
,主函数里面主要是控制一些LED和一些开关,中间也要用上ADC。
情况是这样的: 我想通过单片机来检测一个管脚的电压信号,如果这个管脚的电压低于0x02那我就让单片机复位,也就是这个 定时计数器0中断服务函数 正常情况下完成的内容。
现在问题是:上面的程序正常运行起来的话程序会跑进一个BUG里面,有时候2分钟就进了BUG,有时候40分钟进BUG,但是BUG现象一致,BUG造成的现象是 单片机 会长期处于一个固定状态,比如说 LED 和开关都处于打开状态。 但是如果这个时候我把ADC采样输入那个脚电压设置为0的时候,程序又能正常进入 定时计数器0中断服务函数 ,然后程序重新跑起来,又过2分钟到40分钟,又会出现同样的情况。
如果把 定时计数器0中断服务函数 中不用AD采样,那就不会出现这个BUG!
我查了2天了都没查出来什么问题,实在是查不到哪里出了问题了,还请坛子里大神帮我看看,跪谢~~~
这个AD的采样率,转换时间什么的都多少啊? 在定时器中断里等待转换不合适吧。具体还得你自己调调,有时候硬件没出错,软件逻辑上没错,得看看软件和硬件性能搭不搭配
没问题
18.432M晶振,采一次需要540个时钟,手册是这么介绍的。我改成中断以后就OK了,不过还是谢谢你啦