复费率智能电表的单片机软件设计

更新时间:2024-06-24 09:22:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

国防科学技术大学

本科生学位论文

基于单片机的复费率智能电能表软件系统设计

姓名:王付生

申请学位级别:本科

专业:电子计算机

19950620

目录

摘要 第一章 引言

§1.1 单片机的发展

§1.2 复费率表的需求背景 §1.3 复费率表目前的技术状况

§1.4 设计的基本目标、实现状况、后续开展

第二章 MCS-51系列单片机及其AT89C51简介 §2.1 MCS-51系列单片机 §2.2 AT89C51之新特点

第三章 硬件的基本构成及软硬接口 §3.1 系统的大致硬件结构

§3.1 PCF8583 日历时钟芯片简介 §3.3 软硬件之间的接口

第四章 软件总要及关键技术分析 §4.1 软件总体思想 §4.2 软件组成 §4.3 各模块功能分配及调用关系 §4.4 几处关键算法的说明 §4.5 关键技术分析

第五章 软件模拟 I2C通讯 §5.1 I2C总线规约

§5.2 软件模拟 I2C的实现 §5.3 出现的问题及其解决

第六章 键处理

§6.1 键之功能安排

§6.2 键盘监控程序设计方法综述 §6.3 键分析法及安排

第七章 软件采用的抗干扰及容错技术 §7.1 可靠性设计综述 §7.2 抗干扰及容错技术简介 §7.3 系统采用的抗干扰容错措施

第八章 系统评价 附录

1 参考书目 2 致谢

3 软件文档及程序清单

摘要

本文主要论述了如何用 AT89C51单片机构复费率智能电能表的计费模块设计,而且主要涉及其中的软件问题。

复费率表的主要特点是随时段变化将电量计入不同的计量单元。本文主要论述了采用 AT89C51 单片机作为分时计量之核心,将其计量模块的时段编制、分时计量、数据显示、数据处理及下电保存和上电恢复给以有效实现的一般技术。这其中之关键问题有:一、时段的准确切换。二、数据的可靠计量与安全保存。

为了保证系统实时时钟的精度, 该系统采用了飞利浦PCF8583日历时钟芯片, 并通过软件模拟I2C总线实现了 89C51与 PCF8583的有效通讯, 为系统提供了精确的实时时钟和掉电时数据在 PCF8583里的可靠保存。

在系统监控程序的编制中, 成功地用软件模拟了 I2C的通讯;在分析已有的直接分析法、图解法、状态分析法等的基础上, 提出并成功地使用了一种新型键分析技术; 综合采取了软件WATCHDOG、数据冗余、软件陷肼等多种软件抗干扰容错措施。

通过对系统硬件资源的合理配置使用及软件的精心设计安排, 该系统较好地解决了编程、显示、下电保存、上电恢复等,取得了满意的效果。

关键词:

89C51单片机 PCF8583日历时钟 复费率表 软件模拟 I2C通讯 键分析技术 软件抗干扰容错技术 软件WATCHDOG

第一章 引言

我们这次毕业设计主要任务是利用AT89C51单片机研制开发一种新型复费率智能电能表。设计的硬件部分由唐靖飙同学完成,我则负责其中的软件部分。下面对这次设计的背景做一些介绍。

§1.1 单片机的发展

本世纪40年代以来信息和微电子技术的飞速发展, 给人类的生活带来了深刻的影响。 而70年代大规模集成电路的发展更为自动化技术的革新迎来了黎明前的曙光----单片机诞生了。

单片微型计算机( Single Chip Microcomputer)简称单片机, 又称微处理器( Microcontroller ), 是将计算机的基本部件微型化, 使之集成在一块芯片上的微机。片内含有 CPU、ROM、RAM、并行I/O、串行 I/O、定时器/计数器、中断控制、系统时钟及系统总线等等。单片机有着体积小、功耗低、功能强、性能价格比高、易于推广应用等显著优点, 在自动化装置、智能化仪表、过程控制和家用电器等领域得到日益广泛的应用。近年来, 单片机结合专用集成电路ASIC( Applied Specific Integrated Circuit) 和精简指令集计算机 RISC( Reduced Intruction Set Computer)技术发展成嵌埋式处理器(Embedded Procssor), 使得单片机可集成众多的软件和硬件, 而成为更深意义上的单片应用机型, 使其更强的功能深入到数据、数值分析, 信号处理, 智能机器人及图象处理等高技术领域。

自1974年美国德克萨斯仪器公司推出第一块单片机以来, 许多家公司参与了单片机的研制和生产的竞争。 目前通用型单片机至少有50多个

系列400 多个品种。 其中最具代表性的典型机种为 Intel公司的MCS-51系列, Motorola公司的MC6805系列和Zilog公司的 Z8系列及其派生的各种产品。而我国应用最多的是MCS-51系列, 它为我国单片工作者所最熟悉, 而且有多种性能完善的开发工具, 在各个技术领域的科研和技术改造、产品开发中起着越来越大的作用。 同时, 这也为我们开发研制新型复费率智能电能表提供了良好的基础。

§1.2 复费率表的需求背景

随着我国国民经济的迅猛发展, 电力资源的紧张日显突出。而且众所周知, 电力生产的特点是发、供、用电同时完成, 加之电能存储既困难成本又高, 因而在一般情况下,发电量是由用电量多少决定的。电力的使用又有明显的时段性: 在用电集中时,要求发电量增加形成电网负荷高峰; 反之, 当用电负荷大量减少时, 则要求减少发电量形电网负荷低谷。这种运行状况不仅很不经济, 有时甚至危及电网的安全。为了平衡负荷, 电力部门采取了许多措施, 实行多部电价就是主要措施之一。

所谓多部电价就是根据用电的时段性特征, 在用电高峰期提高电价, 限制用电; 在低谷期降低电价, 以鼓励用电。这样, 对于供电部门有利于提高电网的效率; 对于用电部门来说可适当减少电费开支, 并避免在用电高峰期的拉闸限电现象。 这对于双方都是有利的。因此就需要有可以将不同时段的用电情况分别记量的复费率电表。而我国目前生产的电表多为机械式总量表, 不具备复费率功能, 从国外引进的不仅价格十分昂贵, 许多质量也不稳定。电力部门迫切需要研制与生产我们自己的复费率表, 以期多部电价顺利实施, 并对电能的使用管理起到许多积极作用。

§1.3 复费率表目前的技术状况

复费率表( Multitariff Watt Hour Meter) 最早出现于七十年代后期的美国, 我国于八十年代初期进行了有限的引进。其主要特点是按时段不同将电量计入不同的计量单元, 以提供按多部电价收费的依据和给电力技术经济管理提供数据。

从国内外的各种复费率电表生产情况来看, 各厂家设计的结构、选用的元件、所采用的技术措施方式很多, 因此表的品种也较繁多, 性能不一, 但总的来说大都是在机械母表的基础上增加分时计量和显示功能而成。其发展过程中大致出现过以下几种:

㈠ 按工作原理分类:

* 采用全机械传动的机械式;

* 分时计量和时钟控制均采用电子线路实现的电子式;

* 采用电子时钟电路和机械计时部件与机械计数部件的机电

混和式;

㈡ 按分时计量模块和机械母表的结合方式分类:

* 两相合一的一体式; * 两相分离的分离式;

㈢ 按电能→计数的转换方式分类:

* 机械式; * 感应脉冲式; * 光电转换式;

在各种表的种种不同中, 核心内容是工作原理的区别。

从复费率表的特点和功能可知, 任一复费率表都必须有以下四个基本组成部分:

①电能测量部分, ②时间控制部分,

③电量分别计录装置和切换部分, ④控制及时控电源。

采用何种技术措施来将其给以有效的实现就是问题之根本点。

复费率表刚刚出现之时, 由于技术上的不成熟, 最为简单的机械式和机电混和式占很大部分。而近年来随着单片机技术的广泛应用和日趋完善, 采用单片机作为其分时计量的核心单元的复费率表成了技术上的主流, 其余的都已经和正在被淘汰。而且,由于用户需求的不断提出, 复费率表已不仅仅是分时计量和显示,而成为集计量、显示、编程、电力数据统计、负荷

控制信号传送等于一体的智能仪器, 其组成部分大都要求有: 光电脉冲电能信号转换、单片机时控、分时计量、需量功能、红外抄表、数码管/液晶板显示、RS232/RS485接口以实现与微机联网和远程抄表等等。但目前市场上出现的复费率表( 包括从国外进口的一些表)往往都存在着这样或那样的不足, 如: 时钟误差较大、数据可靠性不高、与微机联网的接口不完善等。基于此, 我们决定研制开发一种各方面较为完善的新型复费率智能电能表。

§1.4 设计的基本目标、实现状况、后续开展

㈠ 基本目标

基于对新型复费率智能电能表的需求, 我们决定采用以AT89C51单片机和飞利浦PCF8583日历时钟芯片作为主要器件,而这次设计的基本目标就是完成其中软件部分的时段编制、分时计量、数据显示、数据处理及下电保存和上电恢复。

由于PCF8583日历时钟芯片是通过 I2C接口与外界通讯, 而 AT89C51没有I2C接口, 所以软件还要完成模拟 I2C通讯的任务。 ㈡ 实现情况

由于银河计算技术发展中心已经开发并投放市场了一种复费率电能表( 采用的是专用单片机。 软时钟技术), 设计开发的新型表要和原有的保持功能兼容,设计中就基本按照原有 产品说明, 将其显示和编程完全给以实现,并将时段由八个增加为十个。 软件顺利实现了模拟 I2C通讯, 为系统提供了高精确度的实时时钟。至此, 新型表软件模块的设计已基本完成。 ㈢ 后续开展

这次毕业设计由于时间紧, 任务重, 软件设计简化掉了红外抄表和RS485串行通讯, 但留下了较好的接口, 使得红外遥控只需将键码分析出来就可使用已有程序完成功能, RS485串行通讯也正着手编制加入, 争取早日将新型复费率智能电能表推上市场。

第二章 MCS-51系列单片机及AT89C51简介

§2.1 MCS-51系列单片机

MCS-51系列单片机根据片内有无程序存贮器及存贮器的形式, 分为3 种基本产品: 8051, 8751和8031。8051单片机片内含有掩膜 ROM型程序存贮器; 8751片内含有EPROM型程序存贮器, 其程序可多次擦除重写; 8031片内没有程序存贮器, 但可外部扩展一片或多片含用户程序的EPROM, 使用较为灵活。 它们之间除程序存贮器的形式不同外, 其它结构与功能全都相同。

MCS-51系列单片机的主要特征如下:

* 适合于控制应用的 8位 CPU; * 64K 外部程序存贮器地址空间; * 64K 外部数据存贮器地址空间; * 128/256 Byte 内部 RAM;

* 32~56 位双向可分别寻址的 I/O 线; * 2~4 个16位定时/计数器;

* 全双工异步串行口( UART );

* 5~19个中断源/5~11个向量的中断结构; * 片内时钟振荡器; * 布尔处理器。

§2.2 AT89C51之新特点

AT89C51是一种低功耗。高性能的 8位CMOS微处理器芯片, 片内含有4K 字节的闪速可编程及可擦除只读存贮器( Flash Programmable and Erasable ROM, 简写为PEROM), 128字节的RAM, 32条I/O线, 2 个 16位

定时/计数器, 一个全双工异步串行口( UART ), 一个五源两级的中断结构, 片上振荡器与时钟电路。

经我们实验认为, AT89C51是一种很可靠的性能非常优良的芯片, 它的使用给我们这次设计提供了很多便利。

第三章 硬件的基本构成及软硬接口

§3.1 系统的大致硬件结构

★ 系统使用了一片带有4K 字节的闪速可编程及可擦除只读存贮器的

AT89C51单片机作为中央控制器;

★ 采用一片飞利浦 PCF8583 日历时钟芯片作为系统硬时钟, 并使用其中的 256个 Byte RAM 作为掉电时数据保存区;

★ 采用 8位 LED七段显示器作为显示部件, 4个发光二极管作为峰平

谷和电能脉冲指示灯;

★ 用七个按钮接到P2.0~P2.6作为系统控制键;

★ 用光电头得到电能脉冲信号, 以外部中断方式INT1将脉冲信号送

入89C51;

★ 用一块7705得到上电复位和掉电中断信号,掉电信号从INT0接入

89C51;

★ 用变压器作为系统正常工作电源,用一个高能锂电池作为掉电时

PCF8583备用电源以维护系统实时时钟和数据。

§3.2 PCF8583 日历时钟芯片简介

PCF8583是一个低电压源的日历时钟芯片和RAM电路, 它的主要功能特性如下:

* 4 年日历时钟, 24或12点格式; * 具有串行I2C总线接口;

* 256字节RAM, 自动字节地址增量; * 具有可编程的闹钟.定时和中断功能。

RAM的头8个字节单元(地址为00~07)作为可寻址的寄存器, 其中地址为00的单元为控制/状态寄存器, 01~07单元为时钟计数器,地址为的08~0F的单元可编程为空闲单元或闹钟寄存器。

由于我们只用到了它的计时功能, 所以下面只简单谈一下时钟计数器和控制寄存器。

00单元: 复位后状态为的00H, 此时为32.767kHz时钟方式, 取消了起闹功能, 读5至6单元时不屏蔽。装入实时时间时应先给00单元送80H;

01, 02, 03, 04单元依次为百分之一秒、秒、分、时计数器,其数据格式为压缩BCD码;

05单元为年和日期寄存器, 06单元为星期和月份寄存器,其格式如下:

PCF8583的其它单元被用作RAM,本文将在附录中对其详细说明。

§3.3 软硬之间的接口及硬件资源的分配

由上述硬件构成可知, 硬件在外围电路方面为软件提供的接口有: * 显示部分: P0.0~P0.3为数字0~9的BCD码, P0.4为小数点, P1 为八个七段的位选择, 如0010,0000B 则显示左数第三个七段。

* 按键信息: 七个按钮分别挂接在P2.0~P2.6上, 平时为高电平, 按下时为低, 定义如下:

键名 键值 对应89C51引脚

——————————————————

01000000B P2.6 00100000B P2.5 00010000B P2.4 00001000B P2.3 00000100B P2.2 00000010B P2.1 00000001B P2.0

* 掉电中断: 掉电信息由INT0引入89C51。 * 电能脉冲: 电能脉冲由INT1引入89C51。 * 与PCF8583的通讯:

PCF8583具备I2C接口, 其中SDA(数据线)接P0.7,SCL(时钟线)接P2.7。

又: PCF8583有开放式中断, 接P0.5, 软件检测其由高到低跳变

作为秒信号。

* 指示灯: P3.4~P3.7接四个发光二极管, 软件将其定义如下:

P3.4 峰电指示, P3.5 平电指示, P3.6 谷电指示, P3.7 电能脉冲指示, P3.4和P3.5同时亮为尖峰电量指示, P3.4~P3.6全亮为总电量指示。

程序对系统内部硬件的资源分配为: T0定时器用作定时, 它的中断用于软件WATCHDOG, T1计数/定时器、TI/RI串行I/O 中断留作系统扩展用。 其余如P0,P1,P2,P3等在软硬接口中已有定义, 不再赘述。AT89C51中128字节RAM分配为: 25字节用作堆栈, 30 字节用作计算需量用的滑差队列, 第0第1两组寄存器, 8 字节的显示缓冲区以及一些常用常修改的数据。 PCF8583的RAM中设有实时时钟, 并存放下电保护数据和系统一些不常修改的数据(如: 时段定义、用户号、抄表密码等)。

在上述软硬接口定义和硬件资源分配下进行了软件设计以完成系统功能。

第四章 软件总要及关键技术分析

§4.1 软件总体思想

单片机程序又称为监控程序, 它负责监督管理智能仪器的全部资源和全部操作。它是智能仪器的心脏和灵魂, 监控程序质量的好坏直接决定着一个智能仪器性能。

由于程序将用在新型电表上, 所以其数据的安全性与可靠性就是至关重要的了, 这就要求首先要尽可能保证程序的正确性。而简单将在某种程度上导致正确, 因此在编程处理中尽可能避免了程序结构的过于复杂,而将其分为相对较为独立的功能模块。并且, 按照软件工程学的思想, 软件在其生存周期中其维护是很占用人力的, 所以尽可能应使程序有较好的可读性。本着正确、简单、可读的原则编制了整个软件。当然, 这是以程序代码效率的降低为代价的。 笔者认为, 在内存不是主要矛盾的情况下, 代码量在一定限度内的增加以换取软件的高可靠性和良好的可读性是很值得的。

§4.2 软件组成

本设计中监控程序由主程序和三个中断服务程序组成。

T0中断服务程序和RAM H单元一起作为软件WATCHDOG, 是系统抗干扰措施之一。

电能脉冲中断服务程序负责记录电能脉冲数目, 如果满一个计量单位就修改总电量, 并根据当前时段峰平谷值修改分电量。

掉电中断服务程序负责保存掉电保护数据, 然后停止程序执行以防数据丢失。

主程序则首先调用初始化, 给各特殊寄存器置初始值, 并依掉电标志的状态不同给各工作单元送初值。 如果是掉电恢复还要处理掉电时间记录和抄表等工作, 然后进入主循环。在这个主循环中喂软件WATCHDOG一次; 不断调用显示子程序显示数据;同时, 检测 PCF8583秒信号得到实时

时间, 维护滑差队列、计算最大需量、修改相应记录,并检测是否到时段转换点, 是则更新当前时段峰平值; 检测有无键按下, 若有, 则转到键处理子程序完成处理; 然后跳转到循环头继续循环; 这期间如果有中断则由中断服务程序处理之。 整个软件中显示项号是系统最重要的数据: 显示内容由它指示, 在调用键处理程序和数据送显示的子程序时都靠它来传递参数。

主程序流程如下:

软件大体框架如下:

§4.3 各模块功能分配及调用关系

软件大体按功能分为多个模块, 其功能分配及调用关系如下: .1. I2C通讯模块:

从PCF8583中读出或向PCF8583写入若干个数据。

.2. 掉电中断(INT0)服务程序:

保存脉冲计数值, 显示项号和当前时间, 中止程序执行。 调用:

.1. I2C通讯模块

.3. 电能脉冲中断(INT1)服务程序:

接收脉冲信号, 并判断是否需要修改总电量, 及按当前时段峰平谷值指示修改分电量。 调用:

.1. I2C通讯模块

.4. T0中断服务程序:

软件WATCHDOG监视器, 将 H增1, 并判是否大于3, 是则转出错处理。 .5. 更新显示缓冲区模块(READ):

将DSPNUM(显示项号)所指示的数据送入显示缓冲区。 调用:

.1. I2C通讯模块

.6. 编程数据记录模块: 记录修改过的编程数据。 调用:

.1. I2C通讯模块。 .7. 上电初始化模块:

各单元送初始值, 初始化各特殊寄存器, 各变量送缺省值。 调用:

.1. I2C通讯模块

.5. 更新显示缓冲区模块(READ) .8. 抄表模块:

记录抄表数据, 重置工作单元, 记录需量数据。 调用:

.1. I2C通讯模块 .9. 掉电恢复模块:

恢复掉电保护数据, 记录停电时间, 如需要则抄表。 判断当前时段, 恢复正常工作。 调用:

.1. I2C通讯模块

.5. 更新显示缓冲区模块(READ) .8. 抄表模块 .10. 键处理模块:

分析键码, 并按程序不同状态执行对应操作。 调用:

.1. I2C通讯模块

.5. 更新显示缓冲区模块(READ) .8. 抄表模块

.11. 显示模块:

将显示缓冲区数据送数码管显示。 .12. 主程序模块:

根据系统时钟及时切换时段, 调用各模块完成系统功能。

§4.4 几处关键算法的说明

(1) 秒信号的获得:

PCF8583的INT脚有开放中断,当它不作闹钟功能时,此引脚上为以秒为周期的方波信号,读该引脚,如有由高到低跳变记为1秒,秒计数在8951里完成,满一分钟时读PCF8583内时间,修改8951 内时间以和8583保持一致。

(2) 需量的计算:

设有滑差队列指针QUETHIS, 抄表后自动回到队列头QUEHEAD, 当

QUETHIS指向队列最后一个元素时置队列满标志QUEFALL,软件检测到有这个标志时开始计算当前需量,及判读并记录最大需量。

(3) 循环显示的实现:

非编程态当循环键( )摁下,则进入循环显示。 置循环标志,同时置显示项号DSPNUM为01项,软件检测有循环标志则做如下动作: SC_LAST移入PRE_LAST, 秒最后一位移入SC_LAST, 若PRE_LAST≠SC_LAST 则显示项号DSPNUM增1, (增 1后若DSPNUM=06就置DSPNUM为01, 即只显示前五项), 这样就依次循环显示01~05项。

(4) 判当前时段(SD_NOW):

程序先判断用户定义了多少个时段, 由于规定最后一个时段为23:59, 软件从时段02 开始检测最后一个时段值不为23:59 的时段, 则SYSDS (使用时段数)等于这个时段号,再看该时段的费率是否为谷, 不为谷SYSDS再增1, 这样就得到用户定义的时段数目。

根据当前时间, 程序搜索最后一个小于当前时间的时段值, 它即为当前时段,将当前时段费率填入DQSDFPG (当前时段峰平谷值, 它指示分电量的记录), 并将下个时段值填入 XGSD (下个时段), 以供软件在出现分信号时检测,若时钟等于XGSD则更新DQSDFPG和XGSD。

(5) 时段的切换

系统设有 XGSD (下个时段值, 两个字节, 分别为下个时段点的小时和分钟值), 以供软件在出现分信号(秒计时为00H)时检测,若时钟等于XGSD则更新DQSDFPG和XGSD。 将当前时段费率填入DQSDFPG(当前时段峰平谷值, 它指示分电量的记录), 并将下个时段值填入XGSD (下个时段), 以供下次检测。

(6) 数据的显示

显示由两部分共同完成,显示程序 DISPLAY和显示缓冲区更新程序READ。

DISPLAY负责把显示缓冲区的内容送到八个七段上显示出来,做法是:关闭P1口(送00H), 显示缓冲区一个字节送P0, P1口开放( 每次开放一位, 如01000000B开放左数第二个七段), 顺次从高则低送八个七段同时开放该数码管。

READ负责把显示项号DSPNUM 指示的数据送到显示缓冲区 DSPNUM<50 时为普通(非编程态)显示, DSPNUM≥50时为编程态显示。 做法是利用类似高级语言Switch的机构, 用 CJNE A,#项号1,#标号1 AJMP #(功能子程序)标号2 标号1:

CJNE A,#项号2,#标号3 AJMP #(功能子程序)标号4 标号3:

: :

(功能子程序)标号2:

送项号为项号1的数据; AJMP READ_END

(功能子程序)标号4:

送项号为项号2的数据; AJMP READ_END : :

READ_END(更新程序结束点):

语句来实现跳转到该项数据处理处, 这使和分折和处理两相分离, 程序易读、易编制、易调试, 更方便后续工作的开展和维护如需增加显示项仅增加

CJNE A,#新项号,#处理 AJMP #新处理标号 新处理标号: 处理??

AJMP READ_END 即可。

若READ数据在PCF8583中,则先调用READPCF子程序将数据读入读缓冲区(R_BUF), 然后将之分解送入DSPBUF, 同时根据对该数据意义的解释对相应位置小数点位, 如DSPNUM=01时是总电量, 此时若为两位小数, 则DSPBUF的37H第4bit置1, 送显示时即有小数点被点亮。

(7) 编程数据记忆(FWRITE):

对数据编程时, 有一个MODI_F位,若该位为1 时,则说明该项数据系统修改过, 则调用FWRITE记忆之, 否则不修改原值。 FWRITE先按DSPNUM的不同解释显示缓冲区数据的意义, 将数据装配起来, 例由六字节变为三字节压缩 BCD码, 且不含小数点信息( 小数点只在显示时按对该数据的解释加上)。 同样对 DSPNUM采用了类似 Switch的机构。 若数据存放在PCF8583则调用WRITEPCF写入之。

(8) 键处理程序:

键分析时程序分为两个状态: 编程态和非编态。 在不同的状态下同一个键功能不同, 程序也按不同功能状态聚簇, 在不同的状态下分析到同一个键也执行不同的程序。

(9) 编程态数据闪烁的实现:

程序设了一个闪烁指示字BLINK, 一个闪烁标志位BLINK_F, 进入编程态时置位BLINK_F, 当秒计数最后一位为 1时, DISPLAY程序就不打开BLINK 所指示的对应数码管, 当秒计数最后一位为0时, DISPLAY程序正常显示所有有值的数码管。 这样就得到了闪烁的效果。

§4.5 关键技术分析

为了程序较好的可读性, 在软件的编制中许多地方使用了类似高级语言的结构化技术, 并使用了类似 C语言中SWITCH机构的结构。具体实践中主要就是严格按功能划分程序模块, 使得各模块之间功能相对独立, 接口定义清晰, 参数传递尽量简单,以减少可能出现的失误, 避免引起系统功能紊乱。 设计过程中还严格按照软件工程学的要求,先行设计出了伪代码程序, 这也给软件由抽象的设计思想到具体的汇编程序的编制带来了很大的方便。 这使得程序代码段功能分配明确, 控制转移十分清楚, 给程序的编制和调试带来了很大方便。 突出例证就是程序在编码完成后, 仅用了五天就基本上调通了近3000行汇编程序。 而且, 可以预见, 它还将给以后的维护工作带来极大的便利。

由于程序数据量较大, 8951的128字节RAM不能满足要求, 再加上下电时数据要在PCF8583中保存, 如何实现没有I2C接口的 AT8C951和只靠I2C接口和外部联系的PCF8583之间的有效通讯, 便成为设计能否成功的关键。这个问题将在第五章中予以详细讨论。

作为智能仪器的单片机系统是要和外部有联系的。这其中的主要手段之一就是键盘。当然这里所说的键盘可能只有很少几个按钮组成。而且常常出现同一键在不同状态下按下具有不同的意义, 如何编制出高质量的键盘监控程序就成了一个需要好好研究的问题。我们将在第六章重点研究这个问题。

由于电能表使用的环境比较复杂, 各种干扰可能很大,而且还会因用户的误操作给系统带来难以预料的不良影响, 所以如何提高系统的可靠性就也成为了一个至关重要的事情。第七章将会有这方面的详细说明。

对于以上的几个问题系统都给予了较好的解决。

第五章 软件模拟 I2C通讯

§5.1 I2C总线规约

(1) I2C总线概念:

I2C串行总线是器件与器件(IC与IC简称为I2C)之间的通讯总线, 使用两根线( 时钟线 SCL和数据线 SDA) 就可以实现器件之间的串行通讯。飞利浦的很多单片机具有I2C总线接口,同时还生产配置I2C接口的外围电路(RAM,I/O口,AD,DA 等), 它为系统的扩展提供了很方便的手段。

I2C的硬件逻辑提供了开始和结束信号检测。 从器件地址识别、总线的竞争与同步、定时和控制等功能。 这里我们主要关心有关软件模拟方面的特性。

I2C 总线根据地址识别每个器件。根据器件的功能可以工作于发送或接收

方式。 另外, 对于发送器或接收器来说, 在进行数据传送时可以认为是主器件或从器件。 一个主器件是启动在总线上传送数据并产生时钟以允许传送的器件, 这时任何被寻址的器件认为是从器件。

数据有效性:

在时钟高电平期间SDA上的数据必须稳定(见下图),只有在时钟线SCL低电平期间SDA线上高电平后低电平状态才能发生变化。

开始和结束信号:

开始信号: SCL为高时, SDA由高到低跳变; 结束信号: SCL为高时, SDA由低到高跳变;

(2) 数据传送: .1. 字节格式

送到SDA线上的每个字节必须为 8位长度, 每次传送的字节数是不受限制的, 每个字节后面必须跟一个响应位。 数据在传送时先传送最高位(详见下图)。

.2. 响应(认可)

确认数据是必须的, 认可位相对于主器件产生的 1 个时钟,在这个时钟内发送器释放SDA线。

接收器件在这个时钟内必须将SDA拉成低电平,使SDA 在该时钟的高电平期间为稳定的低电平(见下图)。 当然也应考虑置位和保持的时间(详见后面的定时说明)。

(3) 数据格式:

数据传送遵循下图所示的格式。 在开始信号后送出一个器件从地址,地址为7位, 第八位为方向位(R/W), \表示发送(写), \表示请求数据(读)。 一次数据传送总是由主器件产生的结束信号而终止的。 主接收方式中, 在 第一个响应位时主发送器变成主接收器, 从接收器变成从发送器, 但该认可位仍由从器件产生。 结束信号仍由主器件产生。

(4) 寻址:

开始信号后第一个字 节确定主器件所选择的从器件。该字节前七位组成从器件地址, 最后位确定信息的方向。 其格式如下:

最后位为\时表示主器件把信息写到所选择的从器件, 为\表示主器件将从从器件读信息。

信号开始后, 系统中各器件把自己的地址和主器件送到总线

上的地址进行比较, 如果发生匹配, 该器件人为被主器件寻址, 接收或发送由 R/W 位决定。 器件的地址由固定部分和可编程部分组成, 如PCF8583地址固定部分(A6~A1)为101000B, 有一位可编程位A0, 则系统中可有两片PCF8583, 它们通过A0编址的不同来区别。 我们系统中A0接低电平, 所以读PCF8583时第一字节为A1H, 写时则为A0H。

(5) 定时:

I2C总线上最小低电平为4.7μs, 最小高电平为4μs, 主器

件产生的时钟频率为0~100kHz。

§5.2 软件模拟 I2C的实现

飞利浦公司生产的具有I2C总线接口的外围芯片种类十分繁多,其.性能和操作要求也多种多样, 这里我们主要以PCF8583 为例介绍一下.如何用软件模拟的方法来实现没有I2C接口的主处理器和只靠I2C接口和外部联系的具有RAM 特性的外围器件之间的有效通讯, 且将它们统称为外部RAM器件。

根据I2C总线规约可知, 软件模拟I2C通讯的大体流程可划分如下:

(1) 向外部RAM里写入:

*1* 发开始信号; ( SCL为高时, SDA由高到低跳变) *2* 发从器件地址(7 个Bit)和R/W( 0为写入 )位; *3* 检测等待外部RAM器件的应答信号ACK; *4* 发送字地址( 即RAM 单元的地址);

*5* 检测等待外部RAM器件的应答信号ACK; *6* 发送数据

.1. 发送一个数据字节;

.2. 检测等待外部RAM器件的应答信号ACK; .3. 是最后一个字节吗?

是, 则转到*7*; 否则, 转到.1.

*7* 发送结束信号; (SCL为高时,SDA由低到高跳变)

(2) 从外部RAM里读出:

*1* 发开始信号; ( SCL为高时, SDA由高到低跳变) *2* 发从器件地址(7 个Bit)和R/W( 0为写入 )位; *3* 检测等待外部RAM器件的应答信号ACK; *4* 发送字地址( 即RAM 单元的地址);

*5* 检测等待外部RAM器件的应答信号ACK; *6* 发开始信号; ( SCL为高时, SDA由高到低跳变) *7* 发从器件地址(7 个Bit)和R/W( 1为读出 )位; *8* 检测等待外部RAM器件的应答信号ACK; *9* 发送数据

.1. 发送一个数据字节; .2. 是最后一个字节吗?

是, 则转到 .5. ; 否则,执行 .3.

.3. 主器件(如本例中的 8951)发应答信号ACK,即在一个时钟周期内SCL为高时拉低SDA电平; .4. 转 .1.

.5. 主器件不响应,

即在一个时钟周期内SCL为高时保持SDA为高电平;( 从器件检测到这个高电平的下一个时钟周期放弃SDA线, 以使主器件能产生结束信号)

.6. 转*10* ;

*10* 发送结束信号; (SCL为高时,SDA由低到高跳变) 有关的详细说明请参考附录的软件文档。

这里有很关键的一点就是要严格保证, 在一次传送开始后和结束前数据线SDA 在时钟线为高时不能发生变化( 因为I2C 规约将之定义为开始或结束信号), 否则将会导致传送的非常结束。 只要满足I2C规约的

时序定义, SCL的低电平时间可以根据需要适当延长。

软件在给以实现时, 可考虑使用一个定时/计数器来实现I2C对时序的要求。 这样软件可以在I2C通讯的同时执行其它的操作。其不足是软件编制较为复杂, 较易出错。 还可考虑全由软件来满足时序要求, 靠调整指令安排顺序来实现, 包括加入一些 NOP指令。这样的不足是要占处理器的全部时间, 很难再插入其它操作。而且还要考虑中断可能造成的影响。本系统是采用纯软件方法实现时序要求的, 对中断的处理是采用全屏蔽的方法, 在一次通讯开始就关闭所有的中断, 结束时将之重新打开。由于一次通讯耗时极短,实验证明对中断的响应基本上没有影响 (读/写一个字节耗时不到 0.2ms, 读/写完成后立即开中断。而电能脉冲中断最快也只有每隔250ms有一次, ?所以不会造成中断信号丢失 )。 另外一种处理方法是不屏蔽中断, 但进入中断后不马上进行中断处理, 而是先等待 SCL为低再开始中断处理, 并在中断处理过程中始终保持SCL为低即可。 这一方法适于在中断不宜屏蔽的系统中使用。

§5.3 出现的问题及其解决

在程序的调试过程中, 发现所编制的I2C通讯程序工作不正常,具体表现是

如果一次传送大批量数据, 则会有前几个数据正确, 而后面的读出错误或者读出几个字节后死机的可能, 但如果每次只读写一个字节则可保证正确。 经过对程序的反复检查, 发现可能问题出在指令的安排不能满足 I2C规约对时序的要求。于是, 程序调整了对SDA 和SCL操作的指令的时序, 把在SDA线上输出一位\或\的功能由一个子程序完成改变为直接语句输出, 使得该操作与启/停信号和ACK信号的时序取得一致,并减少了子程序调用的开销和可能因此带来的错误。并在写SCL线和写SDA线的指令之间加入了一条NOP指令, 以调整时序。重新编译之后, 问题果然得到解决。

最初的程序还有一个不令人满意的地方就是通讯速度太慢, 有些地方大量

数据传送时可以看到明显的滞留, 影响到显示的效果, 而且, 这还给掉电时

通过 I2C通讯保存数据带来一定的困难。在上面所谈到的时序问题解决后, 尽可能减少了通讯子程序中的空等待, 而是调整指令次序以配合定时要求。结果将传送一个字节所需要的时间从2ms左右减少到 0.2ms, 从而使通讯速度得到了很大提高, 也保证了通讯的质量。

第六章 键处理

作为智能仪器的单片机系统主要通过键盘和外部有联系, 当然这里所说的

键盘通常是几个按钮组成或一个4×4的小键盘。为了完成较为复杂的操作, 常常要定义一系列键盘指令来实现各种不同的功能, 这样就会出现同一键在不同状态下按下具有不同的意义, 要想编制出高质量的键盘监控程序就要有一个科学的方法来指导, 这就是所谓键分析法。 下面结合这次设计的实践来给以讨论。

§6.1 键之功能安排

系统采用了七个按钮, 分别挂接在P2.0~P2.6上,平时为高电平, 按下时为

低电平, 定义如下:

键名 键值 对应89C51引脚 —————————————————————— 01000000B P2.6 00100000B P2.5 00010000B P2.4 00001000B P2.3 00000100B P2.2 00000010B P2.1 00000001B P2.0 功能说明:

(1) 编程态 退出编程态。

系统总清, 恢复为出厂状态。 无效。

如已选择了数据位, 该位值增1(模10),

否则, 编程项号增1(模21)

如已选择了数据位, 该位值减1(模10), 否则, 编程项号减1(模21) 选择要编程改变的数据位。

如果数据被改变,记忆改变后的数据,同时编程项号增1 否则,编程项号增1,但不记忆当前数据。

(2) 非编程态 进入编程态。

无效。

抄表,同时进行需量清零。

进入非循环显示,显示项号增1(模 50)。 进入非循环显示,显示项号减1(模 50)。 进入循环显示, 同时置显示项号为01H 进入非循环显示, 同时置显示项号为01H

§6.2 键盘监控程序设计方法综述

键盘监控程序要完成的工作主要有两部分: 一是获得键码, 二是分析是哪

一键, 并根据不同的程序状态调用相应的处理程序完成键的功能。 由于

键盘监控程序设计是以计算机为基础的设计的基本组成部分之一, 具有很重要性的意义, 所以已经有很多人对这个问题进行过深入研究, 提出了一些很好的方法。 目前, 设计键盘监控程序主要有两种方法: 直接分析与转移表法和状态分析法。 早期多采用直接分析法。 这种方法的缺点是键盘分析程序与动作程序混为一体, 不可分割。 程序的编写。 修改。 阅读。 移植都比较麻烦。 对一键多义键盘尤甚。 而美国学者 J.B.Peatman 在1977年提出的 \键盘分析算法\克服了直接分析法的不足, 国内从1982年开始使用这种方法, 并称之为\状态分析法\。 随着单片机应用的日益广泛, 人们又逐渐认识到了这种方法的缺点与不足, 并提出了相应的改进方法, 其中以中国科学院感光化学研究所陶培德提出的 \图解法\为优秀的代表。 直接分析与转移表法由于大家都比较熟悉, 这里就不再赘述。 下面简要介绍一下键码的获得和\图解法\。

键码的获得:

键码的获得其实也是键分析法研究的一个方面, 但又有相对的独立性, 它

是分析实现键功能的基础,所以先单独给以讨论。

键码获取方法较多(不同的方法可以给出不同的键码), 它可以完全由键盘

硬件电路直接给出(编码键盘), 也可以由简单的键盘接口电路配上一定的键扫描, 由键译码程序给出(非编码键盘)。 智能仪器为充分利用微电脑的软件

资源, 减少硬件开支,一般多采用非编码键盘。非编码键盘又有行扫描法和线翻转法两种给出键码的方法, 其中线翻转法采用中断技术。

\图解法\

\图解法\的基本思想是把监控程序看作一个系统, 键开关作为该系统的

输入, 动作程序看作系统的输出。 根据系统理论: 系统的输出取决于系统当前的状态和输入激励, 并 伴随当前状态跃迁到下一个状态(有时下一个状态与当前状态相同,构成自身循环)。若令PREST( PREsent STate)表描述当

前状态, 令NEXST (NEXt STate) 表描述下个状态(简称\次态\。 那么监控程序可以描述为: 系统输出的动作程序取决于输入键开关的键码和系统现态值, 并由现态PREST 跃迁到次态NEXST。 而任一时刻系统的状态是唯一确定的。可见某时刻键开关输入后系统跃迁到的次态(NEXST) 就是下一时刻键开关输入的当前状态(PREST), 即现态与次态是相对而言的。 这样, 即使是同一键开关, 只要在不同的现态按下, 也可执行不同的程序。显然, 把系统概念引入监控后, 可以完全解决一键多义键盘的监控程序设计问题。

\图解法\的大致过程如下:

(1) 绘制键状态跃迁图。

.1. 确定系统状态数目。

.2. 确定一个初始状态, 使任一键功能对应的键输入序列均起、止于该状

态。

.3. 在图上标记有效键输入(伴随着一次状态跃迁), 无效输入不标记,系统不响应。

.4. 一次状态跃迁对应于执行一个动作程序;

同一状态下任一键输入伴随的状态跃迁是唯一的;

不同状态下, 同一键开关输入伴随着一次不同的状态跃迁。

(2) 确定键码表, 给键一个确定的码字。

(3) 确定键功能码表。

键功能码由键名、功能键码、分支参数部分组成。

功能键码就是将任一现态下按下都跃迁到相同次态的键赋于一个

相同的功能码字, 而对于它们所要执行的不同部分, 则依据分支参数不同选择执行。调整功能键码的安排,使功能键码按状态的不同分别聚集, 这样不同的动作程序就对应于键功能码表的不同项, 以此实现了键功能的完成。

\状态分析法\算法):

状态分析法基本上与图解法思想相同, 稍有不同的是在绘制键跃迁图时将

某状态下无效输入也标记在其中( 用*表示无效输入), 并设置了一些伪状态来表示对应于无效输入的情况, 在确定键码表和键功能码表时要多考虑许多状态, 相对于图解法较为复杂且响应速度也比图解法稍差。

除以上介绍的几种方法外, 还有 \时序状态分析法\等。\时序状态分析法\

采用了状态分析法关于状态分析的思想, 但其功能程序的调用和分析是混

为一体的, 不是一种规范的做法, 适用范围不广。本文不再详细论述。

§6.3 键分析法及安排

由§6.1的键功能安排可知本设计中也有一键多义现象, 是否就采用 \图解

法\编制我们的键盘监控程序呢? 经分析本系统特点可知, 键盘定义主要在两种状态下工作, 这就是编程态和非编程态。在非编程态下各键功能唯一, 在编程态中也只有两个键功能随是否选择数据位有变化, 针对这个特点, 若采用“图解法”设计监控程序则开销太大,而且对调试也没有明显好处,因此, 程序中采用了一种结合直接分析和图解法二者长处又适应本系统特点的方法, 具体是这样做的。 (1) 键码的获得:

程序完全由软件获得键值, 由于七个按钮都直接挂接在P2口上, 所以读入

P2口,屏蔽掉P2。7位后,就获得了键值,程序分析时直接判读 是否与一个键码相等, 对应的键码都只有一位为1, 所以程序对多于1个位的键值都不响应, 这就避免了同时有多个键按下的错误情况。 (2) 分析及功能执行:

首先, 程序定义为两个状态: 编程态和非编程态将对键码的分析聚簇起来,

作为一个模块按编程态和非编程态的不同, 设了两个类似 Switch的机构, 以分析在不同的状态下哪个键被按下, 由于采用的是

AJMP # 功能子程序标号

的方式, 完全排除了因软件的复杂跳转使键盘操作混

乱的可能。 对编程态的 两键仍有二义性的处理是这样的: 在编程态 功能子程序中判MODI_F位,根据MODI_F位状态的不同执行子程序中不同部分, 这样, 就完全解决了本系统中一键

多义的问题。

由于键的分析和键功能的执行在程序上是分离的, 所以不会造成跳转混乱

不清的问题, 而且键功能若有改变, 则只需要修改相应的功能程序段, 而不需去考虑键码分析识别。再加上软件采用的模块化和结构化思想, 使程序有很好的可读性, 这无疑给程序的调试和维护带来极大的方便。

由上可知, 本系统分析方法既解决了直接分析法分析程序和功能程序混和

在一起, 不可分割造成的编制, 阅读。 调试和维护的困难, 较图解法或状态

分析法而言又减少了编制键功能码表的聚琐和因之可能带来的错误, 在识别键码后转去执行功能子程序又比图解法少了一个子程序调用过程, 特别是可省去其分支参数的麻烦, 故而对本系统的监控程序设计来说有较强的优越性。 同时, 这种方法对有类似特点的系统的键盘监控程序的设计也有一定的指导意义。

第七章 软件采用的抗干扰及容错技术

§7.1 可靠性设计综述

作为智能仪器核心的单片机由于往往使用在工业环境中, 常有大量电磁设

备启动、停止, 电源波形畸变等因素影响, 使得单片机系统遭到较强干扰而破坏其正常运行, 使整个系统出现混乱。复费率电表就面临着这样一个严重的技术困扰。它所安装的地方许多是野外, 高热或高寒, 有些是大型电网计量关口, 电磁影响很大, 电源电压的连续尖峰干扰也很常遇到。因此, 为我们的系统加入抗干扰措施就成为十分必要的工作。 一般消除单片机实时系统干扰所采取的措施有硬件和软件两种方法, 如硬件工艺上可加入电磁屏蔽措施等, 本文主要涉及我们系统中所采用的软件抗干扰措施。

下面我们将分析单片机实时系统的特点, 研究错误可能出现的原因, 以找

到解决的办法。

实时系统通常有如下的特点:

(1) 实时性

在系统中有些事件的发生是随机的( 例如掉电处理等 ), 要求系统软件对这类事件的处理具有一定的实时性。 (2) 周期性

实时控制软件一般在完成对系统初始化后, 接下来反复执行主程序, 同时等待中断 (及随机事件的发生), 当有中断申请, CPU就执行相应的中断服务程序, 并且返回后, 继续主程序的循环。 因此在软件执行过程中存在大量的周期性活动。 (3) 相关性

一个单片机实时控制软件一般常有多个任务模块组成。各模块是配合工作的, 它们之间存在着多种关联因素, 并互相依赖, 互相存

在。

(4) 人为性

在实时控制软件中常要求通过人-机对话, 操作人员可直接干预系统的运行, 设置。 调整相应的系统参数。

在正常情况下, 实时控制软件是按照上述四个特性规定的秩序执行。但受到现场的干扰后或用户的不正确使用, 就会破坏程序的正常运行, 导致整个系统失控。

干扰对系统的影响大致可分成如下几个方面: (1) 程序\跑飞\

干扰使CPU中的程序计数器PC出错, 使程序\跑飞\ 转去执行一个毫无意义或错误的程序段, 使系统出现严重混乱或失控。 (2) RAM内容被破坏

RAM区域受到干扰, 造成其数据段被冲毁, 使系统出现运行不正常, 输出出错。

(3) 程序的错误走向

程序\跑飞\后的去向, 一种可能是转入无意义的\循环\中去出不来,这 就是所谓的\死循环\另一种可能是PC值不断增大, 当PC值增至FFFFH值之后, 转为执行地址从0000H开始的程序, 这等于是重新启动控制程序, 这一般是不允许的, 是控制失误的另一种形式。 (4) 不响应中断

如在CPU执行中断服务程序未返回之前程序\跑飞\ 则由于开放中断的指令未执行, CPU将对其它中断不响应。这样优先级低的中断申请就不会的得到响应, 造成低级中断丢失。

在得到以上分析结果后, 我们就可以针对错误的不同特点来在程序中采取一定的手段来给以克服, 提高系统可靠性。

§7.2 抗干扰及容错技术简介

抗干扰和容错技术多种多样, 各自有不同的针对方面, 下面对其有代表性

的技术给以简要介绍。

(一) 抗干扰技术

1. 在程序中插入空操作指令NOP以实现PC的容错 分析MCS-51单片机的指令系统可知, 对八位二进制数

00H~FFH中256个数值全部具有定义的指令的操作码, 而指令的长度又有一、二、三字节三种不同的指令。 操作码在程序中的具体地址是根据程序顺序安排、无规律放置的, 操作数往往是随机的, 不具有确定的机器码。而单片机最易受到干扰的是内部程序计数器---PC的值。在受到强干时, PC的值被改变, 改变后的值又是随机的, 为一不确定值, 这就使CPU误将程序从正确位置跳到另一个无意义的区域内执行,使整个程序处于无序状态。 处于这种状态下的时间越短对系统的影响越小。 解决这一问题的办法, 就是有意识地在程序中插入一些空操作指令NOP。由于该指令为单字节指令, 它对CPU的工作状态无任何影响。这就使失控的程序在遇到该指令后, 使PC的内容得以调整, 而使PC内容修改到正确秩序, 使接下来的指令得到正确的执行。其插入原则为:

(1) 在跳转或多字节指令前插入, 以使程序得到正确转移或指令正确执行。

(2) 在比较重要的指令前插入, 如中断。 堆栈等有关指令。 (3) 在程序中每隔若干条指令, 插入一次。

(4) 根据具体情况, 每个地方只需连续插入一到两条空操作指令即可。

2。 采用WATCHDOG来避免程序长期陷入死循环。

WATCHDOG就是\程序运行监视系统\也叫\看门狗\它有如下特性:

(1) 本身能独立工作, 基本上不依赖CPU;

(2) CPU在一个固定时间间隔中和该系统打一次交道(喂一次狗), 以表明系统\目前尚正常\

(3) 当CPU掉入死循环后, 能及时发觉并使系统复位。 在8096系列单片机和增强型8051系列单片机中, 已将该系统做入芯片内, 使用起来很方便。 但在普通型8051系列单片机中, 必须由用户

自己建立。 如要达到WATCHDOG的真正目标, 该系统必须包括一定的硬件部分, 它完全独立于CPU之外。 如为了简化硬件电路, 也可以采用纯软件的WATCHDOG系统。 其思想是用比死循环更高级的中断子程序夺得对CPU的控制权。 为此, 可使用一个定时器来做WATCHDOG, 将它的溢出设为高级中断, 系统中的其它中断设为低级中断。 可让T0定时为一固定时长 (具体要看软件主程序多久能完成一次循环, 设为两到三个循环时长即可),系统启动后就给它一个计时值, 例如16ms, WATCHDOG启动后系统工作程序必须不断喂它——给它重新送值, 每两次之间的间隔不能超过16ms, 每喂一次可以使它安静一段时间。这个送值动作可放在监控循环中或另外一个定时中断中(定时周期小于16ms)。 当程序运行错误, 掉入死循环后, 16ms之内即可引起T0溢出, 产生高级中断, 从而退出死循环。 在T0中断向量区安放一个软件陷肼, 引导到出错处理程序, 由出错处理程序来完成各种善后工作, 并用软件方法使系统复位。

纯软件WATCHDOG需要系统让出一个定时器资源, 如果系统难以办到, 可以让T0作兼职WATCHDOG, 由T0中断子程序分担部分工作任务。这时可以另外用一个单元作为计数器, 来统计T0中断的次数。当中断次数达到某个规定值时 (例如5次), 即作出错处理。 这时在主程序中应加入使计数器清零的指令。系统正常运行时计数器的值增加不起来,故不会引起出错处理。 如果系统受到干扰进入死循环, 计数器就会加到指定值而引起出错处理。

出错处理一般采用 \热启动\的方法模拟复位来使系统恢复正常。这里有一点比较关键的是要注意清除可能存在的中断激活标志, 否则可能会阻止所有中断响应。 中断标志只有RETI指令才能清除, 而且要连续两次使用RETI指令才能保证清除全部中断激活标志。

3。 设置软件陷肼。

软件陷肼设置在程序正常运行不可能到达的地方。 一般只有在系统出错时才有可能运行到这里。 一旦程序被软件陷肼 \捕获\就转到出错处理程序, 从而使系统恢复正常运行。

4。 采用数据冗余技术实现RAM内容的自救。

对实时系统来说, 干扰造成的比较严重的危害之一就是冲毁RAM中的数据, 由于RAM中保存的是各种原始数据、标志、变量等, 如果被破坏, 会造成系统出错或无法运行。 对RAM 数据的保护常用的方法有 \

校验法\和 \设标法\。这两种方法各有千秋, 校验法比较繁琐,但查错的置信度高。设标法简单, 但对个别数据被冲毁的情况, 查错则无能为力。 所以在编程中一般应综合使用。 其具体做法为:

(1) 将RAM工作区重要区域的始端和尾端各设置一个标志码\或\

(2) 对RAM中固定不变的数据表格设置校验字。

在程序的执行过程中, 每隔一定的时间通过事先设计的查错程序来检查其各标志码是否正常, 如果不正常, 则利用数据冗余技术通过抗干扰程序来修正。

(二) 容错技术

容错技术又分为软件容错和硬件容错, 在许多场合中,软件容错更为优越, 下面只介绍软件容错技术。按设计思想软件容错可简单分为时间冗余和信息冗余两种。 实际应用时常有机配合之。 1。 时间冗余

时间冗余是通过消耗时间资源来达到容错的目的, 它包括指令复执和程序卷回两种常用方法。 (1) 指令复执

当程序因为外界干扰或其它原因引起瞬间性错误时, 计算机将发生错误甚至无法执行。 指令复执等于程序中每条指令都是重新启动点, 一旦发生错误, 就重新运行被错误破坏的现行指令, 实现指令复执的基本要求是:

* 当发现错误时, 能准确保留现行指令的地址, 以便重新取出执行。

* 现行指令使用的初始数据必须保留, 以便重新执行时使用。 在指令复执时, 应注意不能让当前的指令执行完毕,而要在传送结果之前就要停止现行指令的执行, 以保持上一条指令结束时的现场。此外, 程序计数器PC还要回退一步, 即 PC-1→PC。

指令复执的目的是在于消除瞬间性故障对系统的影响, 通常要控制指令复执的次数, 在一定次数或时间内复执成功就算故障排除。

(2) 程序卷回

程序卷回是一小段程序的重复执行。 为了实现卷回 (追溯),也要保留现场。 具体做法如下:

* 程序分成若干小段, 卷回时也就卷回到小段而不是程序的起点。

* 在第N段之末, 将当时各寄存器。 程序计数器的内容移入内存, 并将内存中被第N 段程序所更改的单元另行开辟一区保存起来。 如在第(N+1)段不出错, 则将第(N+1)段现场存档, 并撤消第N段的档案。

* 如果在第 (N+1)段中出了错, 就把第N 段的档案送给机器的有关部分, 然后从第 (N+1) 段的起点开始重复执行第(N+1)段程序。 如果卷回一次不解决问题, 可以卷回若干次, 直到故障排除或者判断故障不能排除为止。

2。 信息冗余

信息冗余是靠增加信息的多余度来提高可靠性的。 一般而言, 附加的信息位越多, 其检错和纠错的能力越强。奇偶码、汉明码、循环码等都有很强的检错和纠错能力。它的优点是增加的冗余度比别的方法低, 而且许多码的信息位和校验位在运算中统一处理。此外, 它能纠正瞬间错误,提供故障的自检测、自定位、自纠正。其缺点是产生延时,不能纠正编码器及译码器自身的错误。

由上述抗干扰容错技术的一般性讨论, 我们可以看到抗干扰容错手段多种多样, 其针对的错误特性也不尽相同, 而采取哪几种措施来提高系统的可靠性, 要看其花费的代价和可能取得的效果以及对系统抗干扰容错标准的技术性要求。一般来说, 在要求不太严格的系统中只需选择性地使用两到三种有不同针对性的措施即可。

§7.3 系统采用的抗干扰及容错措施

本文来源:https://www.bwwdw.com/article/eot3.html

Top