微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > MCU和DSP > EH78系列单片机的编程技巧

EH78系列单片机的编程技巧

时间:09-02 来源:互联网 点击:

4 采用分区指令冗余技术提高软件抗干扰性

为了确保程序稳定可靠运行,有时必须采用软硬件抗干扰设计。在某些场台,大量的干扰源虽然不会造成单片机硬件系统的破坏,却常常会破坏数字信号的时序,更改单片机寄存器内容,导致程序的“跑飞”或进入死循环。因此在提高硬件可靠性的基础上,还需要在程序设计中采取软件抗干扰,从而提高软件的可靠性,减少软件错误的发生或者在发生错误的情况下仍能使系统恢复正常运行。

针对EM78系列单片机,笔者采用了分区指令冗余技术来防止程序的跑飞。即对程序中没有使用的程序空间用“NOP_NOP_JMP”指令将其填满。当程序跑飞到单指令的“NOF”上时,不会发生将操作数当作指令来执行的错误,同时后面增加“JMP”指令使程序跳转到程序跑飞处理程序上。图4给出图例。



图4中,针对EM78系列单片机ROM的结构特点,分别在4个页里存放一个单独的跑飞处理程序Error(),程序的功能可以是“踢狗”(外置“狗”)。这样做的原因如下:如果只编写一个跑飞处理程序,假设放在PageO里,如果程序在Page2跑飞后,它不会跳到PageO的跑飞处理程序,反而会跳到Page2中,这样程序仍然处于一种跑飞的状态。所以在每个Page里添加Error()程序,这样无论程序在哪个Page里跑飞,都会跳到Error()处理程序中。笔者实际中采用了这种方法取得了很好的效果。

5 其它常见问题分析

在使用EM78系列芯片进行开发时,除了上面要注意的几点,还会遇见一些其它小问题。下面就提出这些问题及解决方法,希望读者编程时有所注意。

(1)切记堆栈的深度

汇编语言编程中经常调用子程序,子程序的使用可以大大减少程序的书写量,提高程序的使用效率。但在对EM78系列芯片进行开发时,调用子程序应切记堆栈的深度。EM78系列单片机采用的是5级深度的硬件堆栈,它既不占用程序空间也不占用数据空间,是独立的暂存空间,不需要进栈和出栈的堆栈操作专用指令。堆栈的使用是环行的,若已有5个返回地址被存入堆栈后,若再次调用子程序,则第6个返回地址将被存入堆栈的第一层中(该层原有的内容将被覆盖),所以设计应用程序时,子程序的嵌套调用层数不能超过5层,若嵌套调用超过5层,则会发生程序跑飞。

(2)长时间的软件延时方法

EM 78系列芯片内部带有定时器,但对于较长时间的延时(如几十s)则不太适用。笔者在开发中要使用20s的延时,编写了一段软件延时程序,采用3层嵌套程序,源代码如下,程序可以直接移植运行。


(3)查表程序中防止程序跑飞的技巧

在单片机开发应用中,经常要用到查表程序来实现代码转换,例如8段LED的译码显示。EM78系列芯片的指令系统中,有查表所需的专用指令TBL和RETL。查表过程是,先通过把被显数字(即索引值)作为在数据表中的偏移量存入A,通过子程序传递参数,子程序将参数和当前PC相加,则PC跳到偏移位置,然后经由RETL将所列数据装入A,然后退出子程序。假设所列数据表中只有1O项,则传递到子程序的参数最大为9。但如果程序跑飞,则有可能传入大于9的参数,这样此数加上PC指针则跳出数据表的范围,程序出错。笔者在自己的程序中加上如下措施,从而有效的解决了这个问题。即进入子程序后,首先判断传人参数是否大于9,即偏移量是否正确,不正确则跳到错误处理程序ERROR(),正确则继续执行。这样可确保显示的数据都是正确的。



RETL 0810110111 ;“9”段码’′ABCDFG′,"0XB7"以上是笔者在产品开发中的一些心得,文中所列举的程序均经ELAN WICE。E编译通过,读者可直接引用。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top