您的位置 首页 电路

浅谈单片机调试办法

1利用IO11利用LED进行可视化管理这种方法需要有多余的IO。(如果可能,也可以将实现次要功能的IO暂时借来一用。)其电路很简单,

1. 运用I/O
1.1 运用LED进行可视化办理
这种办法需求有剩余的I/O。(假设或许,也能够将完成非有必要功用的I/O暂时借来一用。)
其电路很简单,一个LED经过限流电阻接到VCC电源。I/O设置为输出办法。
咱们能够用下面的宏来界说LED的操作。
#define LED_YELLOW_ON() PA6D=0
#define LED_YELLOW_OFF() PA6D=1
#define LED_YELLOW_FLASH() PA6D^=1
举个比方阐明它的用法。在低功耗的产品设计中,咱们一般选用“睡觉醒来作业睡觉醒来作业”的作业形式,其程序结构如下:
while(1)
{
HLT = 1; //进入睡觉
nop();
clear_WDT(); //清看门狗

//醒来,处理各种业务
}
假设咱们在程序醒来时点亮LED,业务处理完毕时平息LED,那么咱们就能“看见”程序的作业状况,LED将周期性地闪耀。这便是咱们称之为可视化办理的原因。(不记得在哪本书上看到“可视化办理”这个概念,我借用一下)
其软件结构是这样:
while(1)
{
HLT = 1; //进入睡觉
nop();
clear_WDT(); //清看门狗

LED_YELLOW_ON(); // debug
//醒来,处理各种业务
LED_YELLOW_OFF(); // debug
}
其实有些仿真器现已供给了这种监督程序睡觉状况的办法。假设没有供给,就能够用以上办法自行完成。
它的运用很灵敏。比方能够用来在双时钟体系中监督快时钟的翻开和封闭状况(慢时钟一般总是翻开,由于要用作实时时钟的时钟源,而且慢时钟耗电很小)。你能够在翻开快时钟时点亮LED,封闭快时钟时平息LED,这样一来快时钟的翻开和封闭就一望而知了。
你也能够在某个中止中将LED的状况取反(运用LED_YELLOW_FLASH()),用来监督此中止的产生是否正常。尽管设置断点也能够知道中止是否产生,但会中止程序的履行,形成不方便。
假设你想知道程序有没有履行到某个当地,你也能够将LED_YELLOW_FLASH()放到该方位。
顺次类推,你能够用这个办法调查任何你想调查的工作。
当然你有必要互斥地调查不同的工作。便是说,关于一个LED,在一次调试中,一般只能调查一个工作,不然你自己也弄不清LED的改变到底是代表产生哪一工作。
别的,你还能够一起运用两个或许更多不同色彩的LED来监督不同的工作,条件你有剩余的I/O。
不中止程序的履行,又能看到程序的履行状况,应该说是一种很有用的调试程序的办法。比较开发工具所供给的单步、断点、调查变量等调试手法,这能够算是一种有用的弥补。
1.2 运用示波器测验时刻
运用上面的办法,再加一个示波器,就能够丈量程序履行的时刻了。(你能够自己决议
接不接LED)。
比方,在初始化程序中,在翻开总中止之前,写如下代码:
LED_YELLOW_ON();
nop();
LED_YELLOW_OFF();
运用示波器,在捕获形式下,你应该能捕获到一个脉冲,测验它的宽度,假设为30.5us。以OKI ML610Q431为例,一条nop指令包含1 cycles,1 cycles包含1 system clock。这儿system clock等于振动周期。(留意,不同的单片机对cycles, system clock的界说是不同的,需求参阅各自的用户手册)。
那么咱们能够这样核算振动器的频率:1*1*(1/f)=30.5/1000000.
f=32786Hz
当然,假设示波器丈量精度不行,能够多放几个nop指令,核算时再求均匀。假设嫌示波器的捕获形式太费事,还能够选用循环结构,输出一串方波。比方:
while(1)
{
LED_YELLOW_ON();
nop();
LED_YELLOW_OFF();
nop();
clear_WDT(); //清看门狗
}
这种办法的运用也很灵敏。你能够用来测验主循环的履行时刻,调用某个函数所花的时刻,以及某个中止处理的时刻(不包含呼应中止和退出中止的时刻)等等。
当你发现某些时分主循环的履行时刻特别长时,能够选用逐渐缩小规模的办法来找出到底是哪个函数花费时刻长,有没有或许将其优化。
下面是测验主循环履行时刻的程序结构。
while(1)
{
HLT = 1; //进入睡觉
nop();
clear_WDT(); //清看门狗

LED_YELLOW_ON(); // debug
Fun1();
Fun2();
Fun3();
Fun4();
LED_YELLOW_OFF(); // debug
}
假设发现上面的履行时刻反常(比方太长),你能够调整测验的方位,如下所示:
while(1)
{
HLT = 1; //进入睡觉
nop();
clear_WDT(); //清看门狗

Fun1();
LED_YELLOW_ON(); // debug
Fun2();
Fun3();
Fun4();
LED_YELLOW_OFF(); // debug
}
这样,你就能够确认履行时刻过长是不是由于Fun1()引起。假设不是,则持续调整测验方位,逐一扫除,直到找到真实费时的函数,对其进行剖析,看看有没有或许优化。
当然,咱们还能够用两个或更多I/O对多个工作进行逻辑剖析,调查他们的先后顺序以及测验其时刻距离。这种办法也很有用,很灵敏。在此不胪陈。
2. 运用LCD进行可视化办理
假设你的产品带LCD显现,又没有剩余的IO可供调试,或许你仅仅想暂时的调试某个
功用,那么你能够暂时运用LCD上的某个图标来指示某个工作。当某个工作产生时,显现该图标,不然铲除该图标。
假设想在程序运转中取得更杂乱、更丰厚的信息,能够对不同的工作显现不同的数值。
3. 小结
不中止程序的履行,又能调查程序的履行状况,应该说是一种很有用的调试程序的办法。
比较开发工具所供给的单步、断点、调查变量等调试手法,这能够算是一种有用的弥补。
实际上,这些调试办法很像PC使用开发的printf调试手法。它能够在不打断程序运转
的状况下,借助于I/O,LED,示波器,数码管或LCD显现,给出各式各样的提示信息,协助咱们调试程序。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/fangan/dianlu/259826.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部