单片机复位后必定进入初始化操作,在初始化程序中必须考虑对于瞬时断电、软件复位(RST指令)、看门狗WDT,以及外部按钮强迫复位等原因引起的复位动作的处理。
1.冷、热启动的定义
冷启动通常包括清除内部RAM中的所有中间运行数据、各种状态标志、堆栈指针、定时/计数器等;热启动是以单片机停电时保存的中间数据和各种有关标志为基础继续运行的。由于控制对象的要求不同,热启动的起点可能不同。如热启动是从停电前的程序断点处开始运行,就要求在停电时完整地保存程序断点地址、堆栈指针及堆栈内容,以及各种运行标志、中间数据等(热启动方式1);如热启动是从停电前所执行的任务入口处开始执行,甚至重新开始扫描任务表,停电前运行的中间数据仍然有效,但堆栈指针和某些运行状态标志被清零,则在停电时不要求保存程序断点、堆栈指针和堆栈内容,以及某些标志,对断电保护的要求较低(热启动方式2)。
热启动方式1适用于高精度、高速响应的控制,如运动位置控制等。热启动方式2适用于如温度、压力、流量等慢变过程的控制。
2.定时/计数器的初始化
使用计算机内部的定时/计数器时,采用热启动方式1没有多大意义。如掉电子程序保存定时/计数值的时刻,控制对象或变量不可能停止变化,当产生复位时,定时/计数器已经清零,无论冷启动还是热启动,都需要重新启动定时/计数器,热启动装入保存的中间数据,而冷启动装入初值。
3.停电时间的长短与强迫复位的判定
停电时间长短取决于控制对象的特性。如在许多工程装置中,停电时间大于2。为长时停电,小于2s为短时停电。停电时间测量有两种方法:一是根据RC放电中的电容C上的电压值计算;另一种是采用带掉电保护的实时时钟电路,把断电前后的值进行比较。
通过测量断电时间,可以判断是否为强迫复位。例如瞬时断电及为防止程序失控而设置的RST指令和WDT中断,以及外部按钮复位等原因引起的强迫复位,其电容放电电压值接近或等于稳态值(5V),通过区别长短时断电和强迫复位就可以分别采取不同的启动操作。
4.启动方式的判定
通过判定停电时间的长短,可以区分长时断电、短时断电、瞬时断电和强迫复位,为初始化程序中分支转移提供依据。停电时间的长短和冷热启动方式之间可能并无固定联系,需要根据工艺或设备的具体情况而定。而对于强迫复位,一般采用热启动。
5.I/O口的初始化
I/O口的初始化主要是针对I/O口的工作方式及状态。当I/O口复位信号与单片机复位信号相连时,必须对I/O口进行初始化。当I/O口复位信号与单片机复位信号不相连时,RST指令和WDT中断引起的复位,可不必对全部I/O口进行初始化。通常输出操作是由单片机从输出缓存区取数。对冷启动来说,缓存区中存放的是预定初值;而对热启动来说,存放的是停电前的值。若预定初值不全为零,则需要在初始化中把ROM中的预定初值转存于缓存区。