打印
[51单片机]

调试时,如何判断程序停在哪里了?

[复制链接]
745|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
any_014|  楼主 | 2015-7-18 16:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
还是前阵子做的温度变送器。
测量时,对被测信号定时积分,时间到了后定时器中端切换到基准电压通道进行定值反向积分;
当反向积分到一定值后引发比较器输出反转,进而引起单片机外部中断;
在中断里记下此时的计时器的计数。以该技术来换算成被测信号的电压值。

为了减小测量误差,引入PT100的第三根线,测量线上的电压,从而是要进行两次双积分。
为了减小测量输出值的跳动,用多次测量取平均值法滤波,结果就是进行二十多次后双积分后输出一次结果。
结果还是有点跳,暂时就这样吧。

问题是,带着被测电阻加电,能正常测量(被测数据通过串口发送上来),如果想换一个电阻,把这个电阻拿下来,就因输入端悬空停止工作(因为有上拉,结果输入信号比基准信号电压还高,无法进行双积分ADC转换)。
重新加上电阻也无法使电路恢复正常工作。(我这里应该加上超时检测,每隔一定时间强制进行一次积分转换)

现在想不通程序会停在哪里。想知道群里朋友们是如何判断程序跑到什么地方了?

相关帖子

沙发
any_014|  楼主 | 2015-7-18 16:30 | 只看该作者
本帖最后由 any_014 于 2015-7-18 16:34 编辑

定时器中断里,如果timer_flag == 1,则是由外部中断里置位的,是正常的双积分引起的中断。
如果timer_flag == 0,则是由于定时器溢出中断引起的,定时器溢出中断后强制进行对外部信号定时积分,从而引发下一次正常的定时器中断。
void tm0_isr() interrupt 1 using 2
{
    TR0 = 0;                                             
    TH0 = TL0 = 0;                                       
    if(timer_flag)
    {
        P1 &= 0xf0;                                       
        P1 |= 0x07;
        timer_flag = 0;
        EX1 = 1;
    }
    else
    {
        P1 &= 0xf0;                                       
        P1 |= 0x02;
        EX1 = 0;
        TR0 = 1;
    }
    TR0 = 1;
    RUNLED = 1;                                               
    adc2dac_flag++;

使用特权

评论回复
板凳
gx_huang| | 2015-7-18 16:39 | 只看该作者
如果没有实时的仿真器,你可以在某个空余的GPIO输出高低信号,来判断程序执行到哪里,就是判断过程比较慢一些。

使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
any_014 + 3 赞一个!
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

132

帖子

3

粉丝