改造成品单片机系统的方法
通过一个监控系统的研制,阐述了对一个不熟悉的微机系统进行改造时应遵循的原则及基本方法,介绍了双端口存贮器IDT7132和看门狗WDT的用法。
关键词:监控系统,单片机,双端口存贮器,WDT
制作微机监控系统时,若受监控对象本身也是一个微机系统,且又没有电路图、程序等资料时,如何采集对象的内部数据(如CPU状态等),如何修改对象的程序方不至令原系统运行不稳定和崩溃,如何充分利用监控对象的资源,是一个带有普遍性的问题。
笔者研制的“数字实验监控系统”,其主要功能是采集30台学生实验机状态和过程信息,送往中心主机显示。监控对象是一台型号为DLES的数字电路实验机,这是某公司的产品,除简单的用法说明书外别无其它资料。该机的核心是单片机8031,带6位键盘和数码管显示、并行口8155等,可选择CPU工作方式产生各种实验信号。
1用双端口RAM采集数据
监控系统的首要任务是获取受控对象的各种状态信息。用IO线取得的只是其外部信息,且当高频时容易遗漏。要取得重要的内部信息,必须设法使监控对象的CPU自动送出信息,即采用双CPU通讯。无论用并行通讯还是串行通讯,都要大幅修改原机程序,且要占用原机CPU很多等待、检测通讯口的时间,很容易破坏原机的固有时序。较好的方法是采用共享存贮器方式,只要在原机程序的适当位置插入一段程序,令其定时将自身的重要信息(例如片内RAM的256字节内容)送到共享存贮器就可以了。
本系统采用双端口存贮器IDT7132来实现两CPU的通讯。双口存贮器有2套独立的IO电路,可供2个CPU在不同时刻读写各个存贮单元。但同时访问同一存贮单元会产生冲突。IDT7132有一套冲突仲裁电路,使先到一方获得优先权实现读写操作,而向另一方发出一个冲突信号BUSY。
冲突发生时,访问存贮器失败的一方要将刚失败的一句指令再执行一次,本系统是将BUSY线接到单片机的中断线INT0,电路见图1。但单片机的程序指针PC不能直接被读写,而中断的发生又是随机的,无法掌握其出现的时刻,要重复执行中断前的一句指令殊不容易。为实现这功能,用了一点技巧:因为,中断服务程序执行前,PC值必自动压入堆栈,可在中断服务程序中将该PC值出栈,作减3处理后再入栈,则中断结束出栈的PC值已退回指向到中断前的一句指令了。
原实验机已经使用了5条高位地址线,若要增加2KB容量的IDT7132,将超过8031单片机最大64K存贮空间的限制。为此,利用单片机一条悬空的中断口引脚INT1充当IDT7132的片选控制线,CPU要访问IDT7132就不能仅用常规的MOVX指令,而必须在读写存贮器的前后各增加一条使INT1变低电平然后变高电平的指令,该指令如下:
CLRINT1MOVXA,@DPTR SETBINT1
2原系统已用资源的查找
要改造别人的系统,难点之一是要了解原系统对各种资源的使用情况。单片机的内部读写存贮器RAM只有128字节,而要增改原机程序必须使用这些片内RAM,从而可能造成资源冲突。为了解原系统对片内RAM的使用情况,借用了文字编辑软件的搜索功能。因为单片机对片内RAM的寻址方式只有2种:(1)直接寻址,此时,可将RAM的直接地址作为搜索关键字,调用编辑软件的搜索功能,在原实验机程序中逐个显示该地址出现的地方;(2)以R0和R1为指针的间接寻址,这时,可分别以@R0和@R1为关键字搜索原程序,在出现的地方分析R0和R1的变化情况及范围。
若以上两方法匀未找到所关注的RAM单元,则可以肯定原系统未使用该资源。若该单元同时又是可位寻址的,而位地址只有直接寻址一种方式,故必须采用上述的第(1)种方式搜索一次,结论也是非常明确的。
3修改和插入程序的方法
如果监控对象的信号是软件方式产生的(本实验机就是这样),修改、增加程序时在时间开销上要非常小心,否则会导致原机时序出错。以下是两种常用的可行方法:
(1)在原程序的延时过程中,删除其延时指令,插入执行时间大致同其原延时时间相当的新程序。例如,原实验机为数码管显示而设的延时子程序就被用于将适当个字节的信息传递到双端口存贮器。
(2)在原程序中等待某些事件发生的过程中,插入新程序。例如等待键盘按键时,可以控制程序跳往新的功能模块,执行适当时间后再返回。
4监视定时器WDT的处理
在大部分微机控制系统中,WDT(看门狗,在6800系列中是COP)都是首选的抗干扰措施之一,其作用是以软件和硬件方式设置一个定时器,定时强制系统复位,以防止程序失控“跑飞”。
修改旧程序时必须留意查看原系统有无WDT,否则可能导致系统崩溃。若有,则首先要找到WDT的定时时间。硬件WDT的时间值一般是固定的,可查资料得到。例如8096系列是64K个状态周
期。软件WDT要先找到所用的定时器,可循2个途径:(1)芯片自身的定时器。这可以在定时器中断服务程序中查找,例如8051系列的二个定时器的中断服务程序入口地址分别是000BH和0001BH,查看这2段程序可知哪一个是用于WDT的,然后进一步在主程序的初始化设置中查看对该定时器的设置,便可找到定时时间;(2)外围芯片(例如8155)的定时器,要将之用于WDT必须将定时器溢出线接到单片机的某外部中断线上,查看这些外部中断服务程序就可以找到相应的定时器,再查看主程序中对该定时器的设置,也能找到定时值。
知道了WDT的溢出时间后,就可以在修改或增加的程序中,每隔规定的时间插入一段指令清除定时器以使WDT不对系统复位。例如对8096系统,若不使用乘除指令,可以每执行约4K条指令插入以下2条指令:
MOV0AH,#1EH
MOV0AH,#E1H
5借用监控对象的资源
充分利用监控对象的资源,可以降低成本,最主要是可以使学生不必耗费时间多学习一台仪器的使用方法。本监控系统借用了原实验机上的键盘和数码管显示器。
原实验机以扫描IO口方式扩展6位键盘,每个键盘都赋予了固定的键值和键功能,以及固定的键处理程序段。为了利用原实验机的键盘使其执行新的键功能,又不破坏原来的功能,采用了这样的方法:改写原机的键盘扫描程序段,定义当某2个键(是在原机中没有用到的)同时按下时,就跳出原程序转往一个新编写的程序模块。在该新模块中,所有键功能都可以被任意重新定义,当处理完新按键后再转回原机程序中执行。
要利用原机的数码管显示器,可以有两种方法:
(1)编写新的显示程序;(2)利用原程序的显示功能,将要显示的内容嵌入原程序中。因后者能很好地兼容原机程序,不易导致系统出错或崩溃,故选用之。通过研究和测试,知原机的显示机理是将显示数据送缓冲区,由专用显示模块转为八段数码管显示值。但其转换算法非常复杂繁锁。为不占用原机CPU太多时间及不易出错,将所有可能的数据逐个送入缓冲区,测出一张数据同显示式样的对照表,在增加的新程序中,将显示数据查表转换后送缓冲区就可以了。
|