[51单片机] 调试时,如何判断程序停在哪里了?

[复制链接]
962|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,则是由于定时器溢出中断引起的,定时器溢出中断后强制进行对外部信号定时积分,从而引发下一次正常的定时器中断。
  1. void tm0_isr() interrupt 1 using 2
  2. {
  3.     TR0 = 0;                                             
  4.     TH0 = TL0 = 0;                                       
  5.     if(timer_flag)
  6.     {
  7.         P1 &= 0xf0;                                       
  8.         P1 |= 0x07;
  9.         timer_flag = 0;
  10.         EX1 = 1;
  11.     }
  12.     else
  13.     {
  14.         P1 &= 0xf0;                                       
  15.         P1 |= 0x02;
  16.         EX1 = 0;
  17.         TR0 = 1;
  18.     }
  19.     TR0 = 1;
  20.     RUNLED = 1;                                               
  21.     adc2dac_flag++;
gx_huang 发表于 2015-7-18 16:39 | 显示全部楼层
如果没有实时的仿真器,你可以在某个空余的GPIO输出高低信号,来判断程序执行到哪里,就是判断过程比较慢一些。

评分

参与人数 1威望 +3 收起 理由
any_014 + 3 赞一个!

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

132

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部