单片机应用系统从研制到调试成功并不是一件容易的事,硬件的设计与制造以及软件的调试和修改要借助某种手段或工具才能完成。
一个单片机应用系统(或称目标系统)从提出任务到正式投入运行(或批量生产)的过程,称为单片机的开发。
单片机的开发有其自身的特点,只有对其特点了如指掌才能在学习时如鱼得水、事半功倍。单片机开发的几个主要特点如下。
(1)单片机的开发是一门综合技能,需要相关的数学基础知识、模拟及数字电子技术基础知识,甚至是计算机控制技术、智能控制等知识。
(2)单片机的开发是一项实践性很强的技能,只有不断地动手实践才能掌握,因此一般需要有计算机及相关的开发工具,如编程器、实验板等。
(3)单片机学习的初期如果有人指点,则可以事半功倍、少走弯路。
(4)单片机入门后技能的提高只能靠自己的勤奋与努力。
一般来讲,单片机本身只是一个电子元件,只有当它和其他器件、设备有机组合在一起,并配置适当的工作程序(软件)后,才能构成一个单片机的应用系统,完成规定的操作,具有特定的功能。因此,单片机的开发包括硬件和软件两个部分。
很多型号的单片机本身没有自开发功能,需借助于开发工具来排除目标系统样机中硬件故障,生成目标程序,并排除程序错误。当目标系统调试成功以后,还需要用开发工具把目标程序固化到单片机内部或外部EPROM中。
由于单片机内部功能部件多、结构复杂、外部测试点(即外部引脚)少,因此不能只靠万用表、示波器等工具来测试单片机内部和外部电路的状态。单片机的开发工具通常是一个特殊的计算机系统——开发系统。开发系统和一般通用计算机系统相比,在硬件上增加了目标系统的在线仿真器、逻辑分析仪、编程器等部件;软件中除了一般计算机系统所具有的操作系统、编辑程序、编译等以外,还增加了目标系统的汇编和编译系统以及调试程序等。开发系统有通用和专用两种类型,通用型配置多种在线仿真器和相应的开发软件,使用时只要更换系统中的仿真器板,就能开发相应的单片机;专用型只能开发一种类型的单片机。
单片机的开发工具有许多,尤其是具有51内核单片机的开发工具,更是不计其数。然而经过20多年的发展,特别是ISP技术的发展,人们逐渐可以不用仿真器进行开发实验,这就需要一个能够教学软件仿真调试、具有友好界面的仿真开发环境。
随着技术的进步,特别是由于具有片内Flash存储器的单片机的使用,使得开发单片机应用系统可以不用仿真器。不论是什么接口,只要能向Flash存储器下载和擦除程序,就不必使用仿真器。其方法是先将监控程序下载到单片机中去,然后借助监控程序调试应用程序。
开发系统中的在线仿真器应能仿真目标系统中的单片机,并能模拟目标系统的ROM、RAM和I/O接口,使在线仿真时目标系统的运行环境和脱机运行的环境完全“逼真”,以实现目标系统的完全的一次性开发。仿真功能具体体现在以下几方面。
1)单片机仿真功能
在线仿真时,开发系统应能将在线仿真器中的单片机完整地出借给目标系统,不占用目标系统单片机的任何资源,使目标系统在联机仿真和脱机运行时的环境(工作程序、使用的资源和地址空间)完全一致,实现完全的一次性的仿真。
单片机的资源包括:片上的CPU、RAM、SFR、定时器、中断源和I/O接口,以及外部可扩充的程序存储器和数据存储器地址空间。这些资源应允许目标系统充分自由地使用,不应受到任何限制,使目标系统能根据单片机固有的资源特性进行硬件和软件的设计。
2)模拟功能
在开发目标系统的过程中,单片机的开发系统允许用户使用其内部的RAM存储器和输入/输出来替代目标系统中的ROM程序存储器、RAM数据存储器以及I/O,使用户在目标系统样机还未完全配置好之前,便可以借用开发系统提供的资源进行软件开发。
最重要的是目标机的程序存储器模拟功能。因为在研制目标系统的开始阶段,目标程序还未生成,更谈不上在目标系统中固化程序。因此,用户的目标程序必须存放在开发系统的RAM存储器内,以便于在调试过程中对程序修改。开发系统所能出借的作为目标系统程序存储器的RAM,常称为仿真RAM。开发系统中仿真RAM的容量和地址映射应与目标机系统完全一致。
开发系统对目标系统软硬件的调试功能(也称为排错功能)强弱,将直接关系到开发的效率。性能优良的单片机开发系统应具有下面所述的调试功能。
1)允许控制功能
开发系统应能使用户有效地控制目标程序的运行,以便检查程序运行的结果,对存在的硬件故障和软件错误进行定位。
(1)单步运行:能使CPU从任意的目标程序地址开始执行一条指令后停止运行。
(2)断点运行:允许用户任意设置条件断点,启动CPU从规定地址开始运行后,当碰到断点条件(程序地址和指定断点地址符合或CPU访问到指定的数据存储器单元等条件)符合以后停止运行。
(3)连续运行:能使CPU从指定地址开始连续地全速运行目标程序。
(4)启停控制:在各种运行方式中,允许用户根据调试的需要,来启动或停止CPU执行目标程序。
2)对目标系统状态的读出修改功能
当CPU停止执行目标系统的程序后,允许用户方便地读出或修改目标系统所有资源的状态,以便检查程序运行的结果、设置断点条件以及设置程序的初始参数。可供用户读出和修改的目标系统资源包括以下几种:
(1)程序存储器(开发系统中的仿真RAM存储器或目标机中的程序存储器)。
(2)单片机片内资源:工作寄存器、SFR、I/O接口、RAM数据存储器及位单元等。
(3)系统中扩展的数据存储器及I/O接口等。
3)跟踪功能
高性能的单片机开发系统具有逻辑分析仪的功能。在目标程序运行过程中,能跟踪存储目标系统总线上的地址、数据和控制信号的状态/变化,跟踪存储器能同步地记录总线上的信息,用户可以根据需要跟踪存储器收集到的信息,也可以显示某一位总线的状态变化的波形,使用户掌握总线上状态变化的过程,对各种故障的定位特别有用,从而大大提高工作效率。
软件的辅助设计功能的强弱也是衡量单片机开发系统性能高低的重要标志。单片机系统的软件开发的效率在很大程度上取决于开发系统的辅助设计功能,主要包括以下几方面。
1)程序设计语言
单片机的程序设计语言有机器语言、汇编语言和高级语言。在程序设计时交叉使用汇编语言和高级语言是一种常用的方式。
2)程序编辑
通过不同的方式输入源程序并进行编辑。
3)其他软件功能
很多单片机开发系统都提供反汇编功能,并提供用户宏调用子程序库,以减少用户软件研制的工作量。
单片机开发系统其他的功能指标和一般的计算机系统相类似,如系统的可靠性、可维护性以及I/O的种类和存储器的容量等。
在完成目标系统样机的组装和软件设计之后,便进入系统的调试阶段。用户系统的调试步骤和方法是相同的,但具体细节则与所采用的开发系统以及目标系统所选用的单片机型号有关。
系统调试的目的是查出系统中硬件设计与软件设计中存在的错误及可能出现的不协调的问题,以便修改设计,最终使系统能正确地工作。最好能在方案设计阶段就考虑到调试问题,如采用什么调试方法、使用何种调试仪器等,以便在系统方案设计时将必要的调试方法综合到软件、硬件设计中,或提早做好调试准备工作。系统调试包括硬件调试、软件调试及软件、硬件联调。根据调试环境不同,系统调试又分为模拟调试与现场调试。各种调试所起的作用是不同的,它们所处的时间阶段也不一样,但它们的目标是一致的,都是为了查出系统中潜在的错误。
在单片机应用系统调试中,最常见的调试工具除了前面介绍的单片机开发系统(仿真器)之外,还有以下几种。
1)逻辑笔
逻辑笔可以测试数字电路中测试点的电平状态(高或低)及脉冲信号的有无。假如要检测单片机扩展总线上连接的某译码器是否有译码信号输出,可编写循环程序使译码器对特定的状态不断进行译码。运行该程序后,用逻辑笔测试译码器输出端,若逻辑笔上红、绿发光二极管交替闪亮,则说明译码器有信号输出;若只有红色发光二极管(高电平输出)或绿色发光二极管(低电平输出)闪亮,则说明译码器无译码信号输出。这样就可以初步确定由扩展总线到译码器之间是否存在故障。
2)逻辑脉冲发生器与模拟信号发生器
逻辑脉冲发生器能够产生不同宽度、幅度及频率的脉冲信号,它可以作为数字电路的输入源。模拟信号发生器可产生具有不同频率的方波、正弦波、三角波和锯齿波等模拟信号,它可作为模拟电路的输入源,这些信号源在调试中是非常有用的。
3)示波器
示波器可以测量电平、模拟信号波形及频率,还可以同时观察两个或三个以上的信号波形及它们之间的相位差(双综或多综示波器)。它既可以对静态信号进行测试,也可以对动态信号进行测试,而且测试准确性好。它是任何电子系统调试维修的一种必备工具。
4)逻辑分析仪
逻辑分析仪能够以单通道或多通道实时获取触发事件的逻辑信号,可保存显示触发事件前后所获取的信号,供操作者随时观察,并作为软件、硬件分析的依据,以便快速有效地查出软件、硬件中的错误。逻辑分析仪主要用于动态调试中信号的捕获。
单片机应用系统的硬件调试和软件调试是分不开的,许多硬件故障是在调试软件时才发现的,但通常是先排除系统中明显的硬件故障后才与软件结合起来调试。
1)常见的硬件故障
(1)逻辑错误。样机的逻辑错误是由于设计错误和加工过程中的工艺性错误所造成的。这类错误包括错线、开路、短路和相位错等几种,其中短路是最常见也较难排除的故障。单片机的应用系统往往要求体积小,从而使印制板的布线密度高,由于工艺等原因造成引线之间的短路。开路常常是由于印制板的金属化孔质量不好或接插件接触不良引起的。
(2)元器件失效。原因有两个方面:一是器件本身已损坏或性能差,诸如电阻电容的型号、参数不正确,集成电路已损坏,器件的速度、功耗等技术参数不符合要求等;二是由于组装错误造成的元器件失效,如电容、二极管、三极管的极性错误和集成块安装的方向错误等。
(3)可靠性差。系统不可靠的因素很多,如金属化孔、接插件接触不良会造成系统时好时坏,经受不起振动,内部和外部的干扰、电源纹波系数过大、器件负载过大等会造成逻辑电平不稳定。另外,走线和布局的不合理等也会引起系统可靠性差。
(4)电源故障。若样机中存在电源故障,则加电后将造成器件损坏,因此电源必须单独调试好以后才能加到系统的各个部件中。电源的故障包括:电压值不符合设计要求,电源引出线和插座不对应,各挡电源之间的短路,变压器功率不足,内阻大,负载能力差等。
2)硬件调试方法
硬件调试是利用开发系统、基本测试仪器,通过执行开发系统有关命令或运行适当的测试程序(也可以是与硬件有关的部分用户程序段)来检查用户系统硬件中存在的故障。硬件调试分为静态调试与动态调试。
(1)静态调试。在样机加电之前,根据硬件电气原理图和装配图仔细检查样机线路是否正确,并核对元器件的型号、规格和安装是否符合要求。应特别注意电源的走线,防止电源之间的短路和极性错误,并重点检查扩展系统总线(地址总线、数据总线和控制总线)是否存在相互间的短路或与其他信号线的短路。之后是加电后检查各插件上引脚的电位,仔细测量各点电位是否正常,尤其应注意单片机插座上的各点电位,若有高压,联机时将会损坏仿真器。然后是在不加电情况下,除单片机以外,插上所有的元器件,用仿真插头将样机的单片机插座和开发工具的仿真接口相连,这样便为联机调试做好了准备。
(2)动态调试。在静态测试中,只对样机硬件进行初步测试,只排除一些明显的硬件故障。目标样机中的硬件故障主要靠联机调试来排除。静态测试完成后分别打开样机和仿真器电源,就可以进行动态调试了。动态调试是在用户系统工作的情况下发现和排除用户系统硬件中存在的器件内部故障、器件间连接逻辑错误等的一种硬件检查。由于单片机应用系统的硬件动态调试是在开发系统的支持下完成的,故又称为联机仿真或联机调试。
动态调试的一般方法是由分到合、由近及远,进行分步、分层的调试。
由分到合是指,首先按逻辑功能将用户系统硬件电路分为若干块,如程序存储器电路、A/D转换器电路、输出控制电路,再分块调试。当调试某电路时,将与该电路无关的器件全部从用户系统中去掉,这样,可将故障范围限定在某个局部的电路上。当分块电路调试无故障后,将各电路逐块加入系统中,再对各块电路及电路间可能存在的相互联系进行试验。此时若出现故障,则最大可能是电路协调关系上出了问题,如相互间信息联络是否正确,时序是否达到要求等。直到所有电路加入系统后各部分电路仍能正确工作为止,由分到合的调试即告完成。在经历了这样一个调试过程后,大部分硬件故障基本上可以排除。
在有些情况下,由于功能要求较高或设备较复杂,使某些逻辑功能块电路较为复杂庞大,为确定故障带来一定的难度。这时对每块电路可以以处理信号的流向为线索,将信号流经的各器件按照距离单片机的逻辑距离进行由远及近的分层,然后分层调试。调试时,仍采用去掉无关器件的方法,逐层依次调试下去,就可以将故障定位在具体器件上。例如,调试外部数据存储器时,可先按层调试总线电路(如数据收发器),然后调试译码电路,最后加上存储芯片,利用开发系统对其进行读/写操作,就能有效地调试数据存储器。显然,每部分出现的问题只局限在一个小范围内,因此有利于故障的发现和排除。通过这种调试,可以测试扩展RAM存储器、I/O接口和I/O设备、程序存储器、晶振和复位电路等是否有故障。
动态调试借用开发系统资源(单片机、存储器等)来调试用户系统中单片机的外围电路。利用开发系统友好的人机界面,可以有效地对用户系统的各部分电路进行访问、控制,使系统在运行中暴露问题,从而发现故障。
1)常见的软件错误
(1)程序失控。这种错误的现象是当以断点或连续方式运行时,目标系统没有按规定的功能进行操作或什么结果也没有,这是由于程序转移到没有预料到的地方或在某处死循环所造成的。这类错误的原因有:程序中转移地址计算错误、堆栈溢出、工作寄存器冲突等。在采用实时多任务操作系统时,错误可能在操作系统中,没有完成正确的任务调度操作,也可能在高优先级任务程序中,该任务不释放处理器,使CPU在该任务中死循环。
(2)中断错误。主要有两种情况。一种是不响应中断,这种错误的现象是连续运行时不执行中断服务程序的规定操作,当断点设在中断入口或中断服务程序中时碰不到断点。错误的原因有:中断控制寄存器(IE,IP)的初值设置不正确,使CPU没有开放中断或不允许某个中断源请求;对片内的定时器、串行口等特殊功能寄存器和扩展的I/O接口编程有错误,造成中断没有被激活;某一中断服务程序不是以RETI指令作为返回主程序的指令,CPU虽已返回到主程序但内部中断状态寄存器没有被清除,从而不响应中断;由于外部中断源的硬件故障使外部中断请求无效。另一种是循环响应中断,这种错误是CPU循环地响应某一个中断,使CPU不能正常地执行主程序或其他的中断服务程序。这种错误大多发生在外部中断中。若外部中断(如 或 )以电平触发方式请求中断,当中断服务程序没有有效清除外部中断源,或由于硬件故障使中断源一直有效而使CPU连续响应该中断。
(3)输入/输出错误。这类错误包括输入/输出操作杂乱无章或根本不动作,错误的原因有:输入/输出程序没有和I/O硬件协调好(如地址错误、写入的控制字和规定的I/O操作不一致等),时间上没有同步,硬件中还存在故障等。
(4)结果不正确。目标系统基本上已能正常操作,但控制有误动作或者输出的结果不正确。这类错误大多是由于计算程序中的错误引起的。
2)软件调试方法
软件调试是通过对用户程序的汇编、连接和执行来发现程序中存在的语法错误与逻辑错误并加以排除纠正的过程。软件调试与所选用的软件结构和程序设计技术有关。如果采用实时多任务操作系统,一般是逐个任务进行调试。在调试某一个任务时,同时也调试相关的子程序、中断服务程序和一些操作系统的程序。若采用模块程序设计技术,则逐个模块(子程序、中断程序、I/O程序等)调好以后,再联成一个大的程序,然后进行系统程序调试。软件调试的一般方法是先独立后联机、先分块后组合、先单步后连续。
(1)计算程序的调试方法。计算程序的错误是一种静态的固定的错误,因此主要用单步或断点运行方式来调试。根据计算程序的功能,事先准备好一组测试数据,然后从计算程序开始运行到结束,运行的结果和正确数据比较,如果对所有的测试数据进行测试,都没有发现错误,则该计算程序调试正确;如果发现结果不正确,改用单步运行方式,即可检查出错误所在。
(2)I/O处理程序的调试。对于A/D转换一类的I/O处理程序也是实时处理程序,因此需用全速断点方式或连续运行方式进行调试。
(3)综合调试。在完成了各个模块程序(或各个任务程序)的调试工作以后,接着便进行系统的综合调试。综合调试一般采用全速断点运行方式,这个阶段的主要工作是排除系统中遗留的错误以提高系统的动态性能和精度。在综合调试的最后阶段,应使用目标系统的晶振电路工作,使系统全速运行目标程序,实现了预定功能技术指标后,便可将软件固化,然后再运行固化的目标程序,成功后目标系统便可脱机运行。一般情况下,这样一个应用系统就算研制成功了。如果脱机后出现了异常情况,大多是由目标系统的复位电路中有故障或上电复位电路中元器件参数等引起的。
在进行综合调试后,还要进行一段时间的试运行。只有试运行,系统才会暴露出它的问题和不足之处。在系统试运行阶段,设计者应当观测它能否经受实际环境考验,还要对系统进行检测和试验,以验证系统功能是否满足设计要求,是否达到预期效果。
系统经过一段时间的考机和试运行后,就可投入正式运行。在正式运行中还要建立一套健全的维护制度,以确保系统的正常工作。