微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 单片机程序跑飞了,各路大神帮小菜找下BUG吧

单片机程序跑飞了,各路大神帮小菜找下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天了都没查出来什么问题,实在是查不到哪里出了问题了,还请坛子里大神帮我看看,跪谢~~~

这个AD的采样率,转换时间什么的都多少啊? 在定时器中断里等待转换不合适吧。具体还得你自己调调,有时候硬件没出错,软件逻辑上没错,得看看软件和硬件性能搭不搭配

没问题

18.432M晶振,采一次需要540个时钟,手册是这么介绍的。我改成中断以后就OK了,不过还是谢谢你啦

上一篇:NV32F100x开箱体验
下一篇:stm32工程

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top