第五章 8位单片机开发实例
前面我们介绍了利用仿真工具学习8位单片机的基本应用方法和功能的实例,本章将着重介绍以8位单片机为核心的应用系统的开发和设计实例。通过这些实例,可以帮助读者了解如何进行一个完整的嵌入式系统开发,以及在工程应用中需要注意的一些细节。这些细节虽然不一定是原理上的问题,但是却会在很大程度上影响系统的可靠性和成功率。
5.1 嵌入式系统开发流程
嵌入式系统的设计通常需要软硬件协同完成,其开发过程也相对复杂,主要包括产品定义、系统总体设计、软硬件设计、软硬件集成、产品测试、产品发布、产品维护等阶段,每个阶段完成的任务相对独立又相互关联。
这几个阶段的主要任务描述如下。
1.产品定义阶段
这个阶段是确定产品需求的阶段。在这个阶段,应该充分与用户讨论产品的用途、功能细节、技术指标等内容,从而确定最终的开发任务和设计目标,形成需求规格说明书,作为设计的指导性文件和最终产品验收的标准。系统的需求应分为功能性需求和非功能性需求两个方面。功能性需求是指产品所要完成的基本功能、使用方式、使用环境等,这是用户方首先会提出来的内容;非功能性需求则包括系统的性能要求、成本、功耗、体积、重量等因素,这是设计者必须主动提出并与用户进行讨论和分析的内容,为最终形成需求规格说明书打下实质性的基础。
2.系统总体设计
总体设计是描述如何实现需求规格说明书中定义的各类指标而提出的总体解决方案,方案中包括系统总体结构、软硬件和执行部件功能划分、处理器和外围器件选择、系统软件和开发工具选择等。总体设计中每个划分和器件选择、参数的确定都应该做到有理有据,以确保总体设计方案原理上具有正确性,实施起来具有可行性。所以,总体设计是系统开发能否成功的关键。
3.软硬件设计
由于软件工程师和硬件工程师具有各自的专业领域,因此,这个部分通常是分工后独立进行的。硬件工程师负责根据总体设计,完成硬件的具体设计方案和硬件部分的实现、测试及验证工作。软件工程师负责根据总体设计,完成软件部分的程序设计、代码实现和测试验证工作。
4.软硬件集成与测试
在基本的软硬件独立的功能性测试完成后,需要将软件和硬件集成起来进行联合调试,以检验系统的功能是否可用、是否达到设计目标。虽然软硬件在前期设计中都会通过一定的手段进行测试,但是有一些测试独立进行是很困难的。而且由于软硬件相互之间的影响,独立测试通过的部分,在联合调试时依然有可能会出现问题。所以软硬件的集成测试是整个系统能否最终完成的关键。
5.产品发布
所谓发布,就是根据产品定义及产品需求规格说明书,对嵌入式系统的各项功能和规格要求进行完整的测试,看能否满足需求规格说明书所提出的功能性指标和非功能性指标。只有通过了这个测试,才标志着产品能够提供给用户使用,否则,需要改进和进一步完善。
在本章中将介绍三个实例,一个是无线通信模块使用实例,另外两个是采用8位单片机设计的产品实例,其中一个采用的是传统的51单片机实现的无线鼠标装置,另一个是采用目前在8位单片机中应用非常多的一种单片机,被称为AVR(详见第二章介绍)单片机的产品,利用这种单片机实现了一个手持控制器。在对实例的介绍过程中,虽然没有完全按照嵌入式产品的开发流程进行,但是基本思路仍然是按照从任务目标到总体设计、从总体结构到硬件模块再到软件模块的过程进行描述的。通过这几个实例的介绍,希望读者能够掌握分析系统设计的基本思路、硬件设计的主要步骤和程序设计的流程方法,从而能够在实际工作中分析问题、解决问题。
5.2 简单无线通信模块应用实例
随着物联网被人们越来越多地关注,近距离无线通信技术也得到了越来越多的应用。为了能够与单片机等数字电路进行接口和使用,一些无线通信芯片生产厂商推出了具有数字接口能力的无线通信芯片,利用这些芯片加上简单的外围电路就可以构成一个近距离无线通信模块。在嵌入式系统中,近距离无线通信是十分有用的一种通信手段。使用近距离无线通信模块既可以减少设备之间的通信链路,又能够保证不会因信号干扰而相互影响,而且由于无线通信模块具有功耗低、使用方便、连接灵活等特点,也非常适合在嵌入式产品中运用。
5.2.1 常用无线通信模块
近距离无线通信模块一般都使用ISM(Industrial Scientific Medical)Band频段,这些频段一般是免许可证使用的。美国联邦通信委员会(FCC)分配的ISM频段主要分为三段(通信功率不超过1W),即工业用途(902~928MHz)、科学研究用途(2.42~2.4835GHz)和医疗用途(5.725~5.850GHz)。当然,各国在ISM频段的划分上会根据自身情况安排不同的频段,我国主要的免许可证频段有433MHz、866MHz、915MHz、2.4GHz波段等。在这些频段下进行无线通信,只要发射功率不超过1W,是不需要到相关管理部分进行登记报批的。因此我们通常使用的近距离无线通信模块都能够支持ISM频段的通信。常见的无线通信模块包括几种。
1.CC1100模块
CC1100是挪威Chipcon公司出品的一款低成本单片的UHF收发器,其工作电压为1.8~3.6V,20引脚QLP封装(外形尺寸仅为2mm×2.4mm),专为低功耗无线应用而设计。其电路工作频段可设定为在315MHz、433MHz、868MHz和915MHz的ISM(工业、科学和医学)和SRD(短距离设备)频率波段,也可以设置为300~348MHz、400~464MHz和800~928MHz的其他频率。RF收发器集成了一个高度可配置的调制解调器,这个调制解调器支持不同的调制格式,其数据传输率可达500kbps。通过开启集成在调制解调器上的前向误差校正选项,能使性能得到提升。CC1100为数据包处理、数据缓冲、突发数据传输、清晰信道评估、连接质量指示和电磁波激发提供广泛的硬件支持,只需要少量外围器件就可以组成一个通信模块,其通信模块尺寸约为29mm ×12mm。
2.nRF905模块
nRF905单片无线收发器是挪威Nordic公司推出的单片射频发射器芯片,其工作电压为1.9~3.6V,32引脚QFN封装(5mm×5mm),工作于433/868/915MHz3个ISM频段。nRF905可以自动完成处理字头和CRC(循环冗余码校验)的工作,可由片内硬件自动完成曼彻斯特编码/解码;使用SPI接口与微控制器通信,配置方便,其功耗也非常低,以-10dBm的输出功率发射时电流只有11m A,在接收模式时电流为12.5m A;具有直接模式和突发模式两种工作模式,用户可以根据需要和功耗开销进行设定和使用;只需要少量外围器件就可以组成一个通信模块,其通信模块尺寸约为38mm×44mm。
3.nRF24L01模块
nRF24L01是挪威Nordic公司推出的一款新型单片射频收发器件,工作于2.4GHz ~2.5GHz ISM频段,工作电压为1.9~3.6V,20引脚QFN封装(4mm×4mm),最高通信速率可达2Mb/s,内置频率合成器、功率放大器、晶体振荡器、调制器等功能模块,融合了增强型Shock Burst技术,其中输出功率和通信频道可通过程序进行配置。nRF24L01功耗极低,在以-6dBm的功率发射时,工作电流只有9m A;接收时,其工作电流只有12.3m A,而且该芯片还支持多种低功率工作模式(掉电模式和旁路模式),更加有利于节能设计。其外围器件极少,通信模块尺寸约为31mm×17mm。
除此以外,为了提高系统集成效率,一些公司也提供SOC(System On Chip)解决方案,即在微处理器产品上集成了近距离的无线通信功能,一块微处理器加上一定的外围器件,就可以组成具有无线通信功能的嵌入式系统,这样的产品可以提供更加方便易用的开发条件,也因此成为物联网应用中的新宠。这类的器件包括Chipcon公司出品的与CC1100对应的SOC解决方案CC1010;Nordic公司出品的与nRF905、nRF24L01对应的SOC解决方案nRF9E5、nRF24E1。它们都采用了无线通信射频芯片与8051单片机的整合方式,相当于一个带有无线通信部件的8051单片机。这在基于单片机的嵌入式系统中可以拥有广泛的用途,特别是在点对点通信模式下,十分方便简捷。不过由于其内部程序存储空间有限,都不超过32KB,而且也没有提供针对无线传感网络的网络协议支持,因此在需要进行无线联网的情况下,可能会出现一定的困难。
这里不得不提到另外一个公司的产品,那就是美国德州仪器公司(TI)出品的CC243x系列、CC253x系列,该解决方案能够提供满足以ZigBee为基础的2.4GHz ISM波段应用,以及系统对低成本、低功耗的要求。它结合一个高性能2.4GHz DSSS(直接序列扩频)射频收发器核心和一颗工业级高效的增强型8051控制器,并且由于提供了地址扩展的解决方案,其内部程序存储空间甚至可以达到256KB。为了解决对无线传感器网络支持,TI公司的专用ZigBee协议可以完整地烧写到微处理器中,从而为物联网应用中的低功耗无线传感器节点提供了十分便利的开发平台。
5.2.2 基于n RF2401的无线通信实例
本节将介绍一个以51单片机为中央控制单元、以nRF2401为无线通信单元的简单无线收发模块设计实例,通过软硬件设计,介绍这类模块的使用和开发方法。
1.系统总体结构和功能
本设计通过设计两个具有收发双重功能的电路单元,验证无线通信模块的数据传送和接收控制,提供了掌握和学习无线通信模块的使用和编程方法。系统的基本组成如图5-1所示。
图5-1 无线通信系列结构示意图
在这个实验系统中,两个模块结构和程序完全一样,任何一方的键盘按下,都会产生一个数据传送给对方,对方接收到数据后将通过点亮与键盘对应的发光二极管作为显示输出,以体现接收成功。该实例仅用于介绍无线通信模块的编程和使用方法,并通过实际硬件平台加以验证。读者可以根据自己的想法购买相应的产品,搭建类似平台进行验证和学习。
2.系统硬件设计
通信模块的电理原理图如图5-2所示。
图5-2 无线通信测试模块电路原理图
在模块中设计了4个微动开关作为人工交互的键盘,4个发光二极管与这4个微动开关一一对应。当某个微动开关被按下,则对应的发光二极管被程序点亮,并由程序将该开关的位置参数传送给另一方,对方在收到数据后,也将对应发光二极管点亮。电路中的JP1是与无线通信模块的接口,该接口共有16个引脚,其中有11个引脚需要与nRF2401无线模块进行连接,见图5-3。
图5-3 无线模块接口示意图
各接口引脚功能描述详见表5-1。
表5-1 nRF2401无线模块接口说明
以上通信模块的引脚是MCU控制通信模块所必须的,对于这些引脚的使用规则有以下约定。
(1)nRF2401具有1个无线数据发送通道,两个无线数据接收通道,分别被称为数据通道1和数据通道2。数据通道1作为芯片配置通道,数据发送通道和第一路数据接收通道使用数据线为DATA,时钟线为CLK1。发送数据时,MCU通过nRF2401的DATA、CLK1引脚作为数据引脚和时钟引脚,将数据传送给nRF2401,并由其进行发送。
(2)nRF2401接收通道中接收到数据时,将通过DR1/2引脚进行标识,当该引脚为高电平时表示对应通道接收到有效数据,可启动程序进行数据读取。数据通道1的数据读取使用数据线为DATA,时钟线为CLK1;数据通道2的数据读取使用数据线为DOUT2,时钟线为CLK2。
nRF2401共有4种工作状态,由功能引脚PWR-UP、CE、CS进行控制,其控制关系如表5-2所示。
表5-2 nRF2401工作模式设置表
nRF2401的4种工作模式分别代表4种不同的工作状态。
激活(Active)模式下,芯片处于正常工作状态,可以是接收数据,也可以是发送数据。而接收和发送数据还可以有两种工作方式,一种被称为突发(Shock Burst)方式,在这种方式下,芯片利用缓冲将需要发送的数据缓冲下来,然后以较短时间和较高的速率一次发送出去。这样,无线模块并不是一直在传送数据,而是以间歇的方式进行工作,从而可以减小电源的消耗。在这种模式下,每个模块有一个地址,发送方利用不同的地址来区别将数据发给哪个接收模块,而接收方则利用地址来区分哪些数据是发给自己的。因此在这种模式下可以实现不同点之间一对一的数据交换。另一种被称为直接(Direct)方式,在这种方式下,无线模块在收到MCU送来的数据后就直接发送出去,不作缓冲处理。由于一直处于工作状态,其电源消耗相对较大。在这种模式下,每个模块不再需要地址信息,而是相当于一个完全的信号转换器;发送方发送数据时不使用时钟信号,将数据信号直接送到芯片的数据端,芯片将数据端的数据以无线方式发送出去,不考虑数据的组成长短等参数;每次数据发送的时间长度不超过4ms,以避免数据出错;接收方根据约定的速率提供时钟信号,将接收到的数据交给MCU。这种模式下,不同收发双方只需要工作于相同通信频率即可通信,不需要根据地址对接收数据进行确认,很容易实现广播或多播应用。
配置(Configuration)模式是完成MCU对nRF2401进行设置的一种工作模式,在这种模式下,可以通过程序改变nRF2401的内部工作参数。这些参数由15个字节组成,其中包括以下功能的设置:本无线模块接收时的地址长度、无线模块接收时的地址标识(两个通道可不同)、无线模块的工作速率、无线通信时的工作频率通道选择、无线通信时的工作方式、是否打开两个数据通道(nRF2401可以支持两个通道同时工作)、是否进行CRC校验、是8位还是16位CRC校验、输出信号的功率选择等。关于配置字的详细内容在后面的程序设计中作进一步介绍和说明。
旁路(Stand by)模式是通信芯片处于不工作状态时的模式,这时通信模块只是一个配置好的待用设备,其功耗的开销在12u A~32u A之间(由晶振频率决定)。
掉电(Power down)模式是通信芯片处于节能状态的模式。在这个模式下,前面的配置参数仍然有效,只是这时无线通信芯片处于节能状态,其功耗开销在1u A以下。从掉电模式恢复到正工作激活模式有一定的时序要求。
在一般使用中,首先要完成对nRF2401的初始配置工作,然后就可以进入激活模式等待接收或发送数据了。
3.nRF2401配置字说明
nRF2401在使用前必须通过配置字进行设置,然后才能够按照设置的参数进入正常工作状态。配置字在突发方式下共18字节144bit,其中最前面的24bit用于测试,在进行设置时可以不作设置。因此,一般情况下配置字为15字节120 bit。在直接模式下配置字为2字节16bit。配置字按照由高位到低位的顺序在CLK1的控制下输入到DATA端,每个CLK1节拍送入1个bit。配置字的具体内容见表5-3。
表5-3 nRF2401配置字描述表
表中参数说明如下:
(1)RX有效载荷部分的数据长度:用于表示两个通道在接收数据时能够接收的数据包。有效数据长度以bit为单位表示,这个长度中不包括地址字节、校验字节等。有效数据bit的最大值受以下公式约束:
DATA2_W<=256—地址字节长度—CRC校验字节长度
该长度默认情况下为32bit,可以根据实际需要进行调整。
(2)RX地址:用于表示两个通道在接收数据时的地址编号,根据地址的不同,可以区分不同的通信模块。这个地址的长度最大为5个字节40bit,默认情况下该地址为2字节8 bit。
(3)地址位数目:用于表示两个接收通道的地址长度,以位为单位描述。默认情况下该值为8,也就是说,接收地址默认值为8bit。该值最大可取为40。
(4)8位或16位CRC:用于表示CRC校验位的长度,可以是8位或16。默认情况下为0表示8位CRC校验,设为1时表示使用16位的CRC校验。
(5)CRC校验使能:用于表示是否打开接收芯片的CRC校验功能。默认情况下为1表示使能CRC校验,设为0时表示关闭CRC校验功能。
(6)使能两个通道接收:用于表示是否打开第二个接收通道。默认情况下为0表示不打开第二通道,设为1时表示打开第二接收通道。
(7)通信方式选择:用于设置芯片的通信方式。默认情况下为0表示直接方式,设为1时表示突发方式。
(8)RF数据率:用于设置通信时的传输速率。默认情况下为0表示通信速率为250kbps,设为1时表示通信速率为1Mbps。
(9)晶振频率:用于设置该芯片外接晶振的工作频率。默认情况下为011表示16MHz晶振,其他值见表5-4。
表5-4 晶振频率设置表
(10)RF输出功率:用于设置芯片发送数据时的输出功率控制。默认情况下为11表示发送功率为0db,其他值见表5-5。
表5-5 nRF2401发送功率设置表
(11)频率选择:用于设置芯片工作时的工作频率。nRF2401的工作频段范围为2.4GHz~2.527GHz,为了保证不同模块在同一区域内工作时不会互相干扰,可以以1MHz为单位设定不同的工作频段,默认值为2,即2.402GHz。其具体设置规则如下:
发送时工作频率范围计算方式为
发送频率=2400MHz+RF_CH#×1MHz(RF_CH#的取值范围为0~127)
第1通道的接收时工作频率计算方式为
发送频率=2400MHz+RF_CH#×1MHz(RF_CH#的取值范围为0~124)
第2通道的接收时工作频率计算方式为
发送频率=2400MHz+RF_CH#×1MHz+8MHz(RF_CH#的取值范围为0~124)
(12)RX/TX选择:nRF2401是一个半双工的通信芯片,发送时不能接收,接收时就不能发送,这一位用于设置当前芯片工作于接收状态还是工作于发送状态。默认值为0表示发送,当设为1时处于接收状态。在实际使用中,如果只修改其发送/接收状态,则只需要在配置模式下写入一个bit来修改这一位即可,不需要为了切换发送/接收状态而写入15个字节。
图5-4 无线通信模块实例程序流程图
4.代码分析
在本实例中,两个实验模块中的代码完全相同,无线模块在不发送数据时都处于接收状态,收到数据就进行处理。如果未收到数据,却发现有键盘操作,则读取键盘值并将其值发送出去。主要功能函数包括无线通信模块初始化、键盘检测、接收数据检测和处理、数据发送等。
系统总体流程如图5-4所示。
由于整个模块的功能较为简单,本实例使用了最简单的重复循环方式的程序设计。程序除了检测按键和接收显示外没有其他功能,读者可以在该程序的基础上根据需要进行扩展。程序中涉及的几个关键函数介绍如下。
(1)void InitnRF2401()//无线通信模块初始化函数(在2401上电使能后稍作延时调用)
无线通信模块在突发模式下收到与自己地址对应的数据后,将取消CRC校验值和地址信号,只向数据接口提供有效数据。在本实例中,有效数据的长度为4字节,因此接收的循环次数设定为4即可。
发送数据时,需要将地址和数据两部分连续发出,其发送字节数受地址和待发送数据两部分影响,但不受CRC校验长度影响,因为CRC校验由通信芯片自身产生。
该实例主要介绍了基于nRF2401的硬件连接和程序控制方法,读者可以通过对此实例的学习,快速掌握其他无线通信芯片的使用方法。如果自己搭建硬件平台制作通信模块,建议在设计中加入对RS232接口的使用。这样可以通过RS232串口将实验硬件与PC机连接,并通过超级终端等工具,在PC机上查看发送或接收的数据,以利于系统的调试。
5.3 基于51单片机的无线鼠标设计实例
本小节介绍了一种基于51单片机的无线鼠标设计实例。该无线鼠标利用前面介绍的nRF2401无线通信模块作为数据通道,实现了一个无线鼠标装置。该装置利用了PC机上传统的PS/2接口,在一个接口上既可以连接有线的PS/2鼠标也可以连接使用无线鼠标,在不占用其他端口如USB接口的情况下,提高系统的灵活性。实例中涉及了单片机中断技术、PS/2接口通信协议、鼠标的数据通信协议、光电编码识别技术、近距离无线通信技术等内容。通过本实例,可以帮助读者对单片机的中断使用、鼠标工作过程和接口有较深入地认识,并能够了解到近距离无线通信模块的工作方式和性能特点,为完整地掌握嵌入式系统设计和开发过程提供参考。
5.3.1 系统总体结构
整个系统的结构如图5-5所示。系统包括两个部分组成,一部分是无线收发器部分,负责通过PS/2接口接收PC机的初始化指令,并从无线鼠标上接收鼠标移动参数,转换成PS/2接口协议传送给PC机;另一部分则是鼠标操作部件,负责完成将人的操作
?行为转换成一定的数值参数,并经过组装后按照一定格式发送给无线收发器,最终送到PC机的PS/2接口。
图5-5 无线鼠标总体结构示意图
5.3.2 无线收发器硬件结构
无线收发器需要完成PS/2接口协议和无线接口的两个部分功能,基本结构如图5-6所示。
其电路原理图如图5-7所示。
图5-6 无线收发器结构图
该接收器使用了一片89C2051作为主控芯片,JP1用于和无线通信模块连接,这里只使用了nRF2401的第一个数据通道,因此,只使用了通信模块的8个引脚。JP2用于连接有线的PS/2鼠标,为了保证单片机与无线通信模块间数据接口电平的一致,系统使用了1117为单片机提供3.3V电源,以确保无线通?信模块能够正常工作。接口JP3用于与PC机的PS/2接口连接,并通过该接口获取5V工作电源。
图5-7 无线收发器电路原理图
系统设计中为无线鼠标采用了无线接收后转发到PS/2接口的转发方式,与PS/2有线鼠标连接的通路则未使用转发式式的连接,而是采用了连接控制方式的通路设计,利用一个控制电路隔离PS/2鼠标与PC机的PS/2口的连接。由于只需要控制数据线和时钟线两个连线,所以控制电路中使用了两个三极管作为隔离部件以简化设计。三极管的基极由89C2051的P3.3引脚控制,当三极管基极被置为低电平时,PS/2鼠标JP2与PC接口JP3的连接将被断开。由于MCU作为PS/2接口设备与PC机通信,因此当三极管基极被置为高电平时,PS/2鼠标与PC的JP3接口联通进行数据传送。
由于无线收发器需要使用PS/2接口,因此,必需了解PS/2接口的相关时序和标准。PS/2接口属于同步接口电路,共使用4根接口线,其中两根用于电源和电线,另外两根作为时钟信号线CLK和数据信号线DATA。在PS/2的同步方式下,同步时钟由设备端提供,也就是说,无论收发器是接收PC机的数据,还是发送数据到PC机,都需要由该收发器给出同步时钟CLK。PS/2协议可以分为两种,一种是由外设向PC机发送数据,另一种是由PC向外设发送数据。每次发送数据以字节为单位,以低电平表示起始位,高电平表示停止位,加上每个字节的8位数据和1位校验位,每次收发数据为11位。
外设向PC机发送数据时的步骤:
(1)外设判断时钟线是否为低,如果为低表示主机禁止外设发送数据;
(2)如果时钟线为高,检测数据线是否则为低,如果为低表示主机准备发送数据,外设准备接受主机发送的数据;
(3)如果数据线也为高,则外设将数据线置为低,通知主机准备发送数据,拉低的时间为5~25μs,然后开始产生时钟信号,进行数据发送,每次要保证时钟的下降沿数据线的数据为稳定数据;
(4)外设在发送数据的过程中,前10个时钟周期在时钟高电平时,检测时钟线是否被主机拉低,如果被拉低,则发送过程被终止,否则一直发送数据;
(5)外设在第10个时钟周期的上升沿5μs完成最后一次对时钟线的检测;
(6)主机在时钟下降沿读取数据线上的数据,当一组数据收到后,由主机拉低时钟线,禁止继续传送数据,以便主机对已收到的数据进行处理;
(7)处理完成后,主机释放时钟线,允许外设下一组数据的发送。
主机向外设发送数据时的步骤:
(1)主机检测外设是否发送数据,如果已发送超过10个数据,则继续接收,否则可以强行将时钟线拉低以停止外设发送过程;
(2)如果外设未发送或停止发送数据,主机将时钟拉低至少60μs,然后拉低数据线,用数据线的低电平通知外设准备接收数据;
(3)主机释放时钟线,等待外设发出时钟信号;
(4)主机在外设的时钟信号为低电平时将数据放到数据线上;
(5)主机等待时钟信号变为高电平,直到下次变为低电平;
(6)重复(4)(5)两个步骤,直到数据全部发送完成;
(7)主机释放数据线,高电平信号表示数据发送结束;
(8)外设将数据线拉低,以示对结束发送的应答;
(9)主机等待外设将时钟线拉低;
(10)主机等待外设释放时钟线和数据线。
除了这个基本顺序外,还需要注意时钟和数据的保持时间和时序关系。时钟的高/低电平维持时间不得少于30μs,外设发送数据到下降沿不得小于5μs,时钟上升沿到外设开始发送数据到数据线不得小于5μs,外设发送一个字节数据的时间不得超过2ms。PS/2接口除了规定了物理层的数据传送格式和步骤外,还规定了一系列的上层协议,通过上层协议可以完成相关设备与PC机的连接。
无线收发器通过PS/2接口与PC机连接,传递鼠标移动后的距离、方向等参数,遵循的通信协议就属于PS/2的上层协议。该通信协议基本过程如下:首先由PC机向鼠标发出初始化命令序列,鼠标对相关命令进行应答,使PC确认鼠标的类型、工作参数等信息;然后鼠标进入正常工作状态,通过约定的数据格式向PC传送移动信息,PC机可以随时通过命令的方式对鼠标的工作参数进行调整和修正。PS/2通信协议的由一系列命令和应答回复过程构成,PC机发向鼠标的命令共16条,其功能和应答过程见表5-6所列。
表5-6 鼠标接口命令及回复方式十六进制表示
(www.xing528.com)
在PS/2鼠标的通信协议中,每一个命令字节都需要进行回复,如命令字“F3,XX”用于设置设备的采样率,XX表示每秒的数据采样次数,也就是传送次数,可以是10、20、40、60、80、100、200,不过通常设为40或80。命令传送时,PC机先发命令F3,鼠标回复应答FA,表示收到命令;然后PC机再发参数XX,鼠标回复应答FA,表示接收到参数。
PC机在上电后查找鼠标的方式就是通过一系列的命令与鼠标进行交互,了解鼠标的相关状态,并设置鼠标工作参数。在鼠标设计中,需要对所有这些命令进行回复和响应。PS/2鼠标可以有四种工作模式。
(1)复位模式:这是上电后进行初始复位的模式,该命令将鼠标设为禁止状态。
(2)流模式:这是鼠标正常的工作模式,鼠标反复回传采样数据。
(3)遥控模式:鼠标将等待PC机发出EB命令才回传采样数据。
(4)回传模式:鼠标将收到的数据回传给PC,用于检查鼠标是否与PC连接。
实际使用中,主要考虑复位模式和流模式即可,另外两种模式可以不予支持,对相关命令只需要进行应答回复。
鼠标向PC机发送的移动数据由4个字节构成,其内容见表5-7所示。
表5-7 标数据结构
数据中第1字节的高两位分别用于表示鼠标移动过程中,Y、X方向上的溢出情况,当对应值设为1时表示有溢出发生,此时的Y、X方向的绝对值应加上256。
次高两位用于表示鼠标在Y、X方向上移动数值的符号,以表示其方向。
低4位除第3位一直为1外,另外3位分别用于表示鼠标的中间键、右键、左键按下的情况。
数据后3个字节用于表示每次检测到的X方向、Y方向,以及中间滚轮的位移大小,X、Y方向的位移与第1字节中的符号共9位用于描述鼠标移动的方向及距离。而中间滚轮则只使用了第4个字节的低4位表示其移动的有效值,高4位则为符号扩展,以补码的方式表示滚轮的移动距离和方向。如果鼠标不具有滚轮功能,也可以略去第4个字节的内容,只发送前4个字节的数据。
由于PS/2通信协议具有较为固定的通信过程和命令格式,因此通过对PS/2鼠标通信协议的学习,读者可以很容易学习和理解PS/2键盘的接口协议和数据格式,并在实际工程中予以应用。
5.3.3 鼠标操作部件硬件结构
鼠标操作部件负责将机械移动转换成对应的计数信号,以达到描述鼠标位移的目的。鼠标操作部件结构如图5-8所示。
图5-8 无线鼠标操作部件结构图
其电路原理图如图5-9所示。
无线鼠标操作部件也使用了一片89C2051作为核心控制器件。该装置的JP1接口用于连接一个型号号为nRF2402的无线通信模块,该模块可以看做是nRF2401模块的简化版,它只有1个发送通路,也不带有接收功能,因此其接口和配置都更简单。
图5-9 无线鼠标操作部件电路原理图
鼠标采用了机械式位置检测方法来检测鼠标位移的参数,其核心是红外光电管和光电编码盘的机械组合(实验中可利用有线机械鼠标改造)。在X、Y两个方向各有两对红外光电管和一个光电编码盘,当鼠标移动时,由于机械滚球带动相应光电编码盘运动,使光电对管中的红外接收管产生电平波动。这个电平波动通过电压比较电路整形后,每一个方向上有一路比较信号(比较器1和3)作为中断源向MCU的中断引脚INT0、INT1发出中断。相应地,中断处理程序通过判断这时另一光电管的整形输出结果(比较器2和4),即可判断出光电编码盘的转动方向。中断的次数决定了鼠标移动的距离,程序每隔一段时间会将这个移动距离以数值的形式利用无线通信模块发送给PS/2接收器,再由接收器转换为PS/2信号发给PC机。为了能够模拟鼠标的左、右按键和中间滚轮的功能,在鼠标中加入了4个微动开关。其中,S3表示左键,S4表示右键,S1用于产生滚轮向上滚动的数据,S2用于产生滚轮向下滚动的数据。
由于无线鼠标使用电池供电,电池使用一段时间后会产生内阻增大、电压下降的问题,而系统中的两个红外发光二极管对电压的变化十分敏感,电压下降后其发光强度明显下降,这将直接影响光外接收管上的信号波动范围,严重时鼠标将根本无法使用。解决这个问题的方法也很简单,就是使用一个直流升压稳压电路为系统提供稳定电压。在实例中使用的是由上海贝岭公司生产的一种开关式稳压芯片BL8530,该芯片采用PFM(Pulse Frequency Modulation)方式进行DC/DC变换,转换效率可达85%,而且其静态功耗也非常小。所需外围元接器件也很简单,只要1个电感、1个输出电容、1个肖基特二极管即可。在输入电压0.8~12V的条件下,能够提供稳定的2.5~6V的输出工作电压,其输出电流最大可达200mA。利用该稳压电路,只要电池能够提供0.8V以上电压,就可以使鼠标可靠地工作,从而避免了电压波动对系统产生的影响。
在设计嵌入式系统时,而过是使用电池供电的产品,则需要在设计中考虑电压波动对系统的工作是否产生影响。如果电压波动可能较大,而且会影响到系统的稳定工作,那么就需要考虑使用此类专用电源芯片,从而保证系统不会因电池的原因而造成工作不稳定或频繁更换电池,影响系统的可用性。
5.3.4 无线鼠标操作部件代码
图5-10 无线鼠标主流程图
无线鼠标操作部件代码的主要功能包括两部分,一部分是用于处理鼠标移动行为,并将其转换为鼠标移动参数;另一部分是进行无线数据传输的功能。
无线鼠标操作部件的程序总体流程如图5-10所示。
为减少设计中不必要的代码,将鼠标的参数设置为固定值且不接收由主机发送来的调整命令,这样鼠标就只需要有发送功能即可。程序中采用以鼠标为主的无线联络机制。当鼠标开机后,将发出与该鼠标配合使用的数据接收机地址,未初始化的收发器收到后,将按新的地址进行初始化,这样就不会因多个鼠标同时工作而产生地址冲突了。鼠标部件的关键功能函数涉及定时器中断处理函数、外部中断处理函数和无线发送函数等。
(1)void timer0()interrupt 1 //定时器中断处理函数,每15ms中断一次,传送位移参数
在程序设计中,由于涉及多个中断处理程序,可能会因为中断处理程序优先级问题互相干扰,为避免出现因中断干扰出现错误,在每个中断处理程序中都加入了关闭中断的开关。中断处理程序首先关闭中断,然后进行数据处理,退出前再打开系统中断。这样,对于有互斥访问数据的多个任务程序的稳定性具有重要的意义。另外,在对X、Y计数处理时没有考虑数据的溢出问题,而在本设计中,由于每15m就会发送一次数据并清除数据,因此不会产生X、Y计数溢出的情况。
当然,本设计中未将看门狗电路打开,如果希望确保系统在任何情况下都不会死机,可以将看门狗电路打开。需要注意的是,看门狗的喂狗代码不要放在中断处理函数中,否则可能起不到保证系统不死机的作用。
5.3.5 无线收发器部件代码
无线收发器部件的功能包括两个部分:一部分是用于检测无线鼠标发送鼠标移动参数的功能;另一部分是检测PS/2串行接口,并将收到的无线鼠标数据发送到PC机的功能。由于需要考虑有线无线两个外接装置的连接,因此在设计时,该部件应具有对PC机命令进行响应的功能。不过对于PC机发送的参数设置功能,无线收发器仅作响应并不做实质性的调整,而且这些参数调整功能并不是必须的。采用这种方式的主要目的在于,减小系统复杂程序程度,提高系统稳定性和可用性。无线收发器部件的程序流程如图5-11所示。
图5-11 无线收发部件程序流程图
无线收发部件的总体程序流程看上去比较简单。为了处理好PS/2鼠标的上电检测和初始化工作,要求PS/2鼠标必须连接在无线接收装置上,系统才能工作,否则PC可能检测不到鼠标。如果不这样做就需要完成两个工作:一个是检测和接收PC机端发来的命令参数,并根据命令参数进行参数回复;二是检测PS/2鼠标是否接入无线收发部件,并利用初始化命令序列去初始化该鼠标,否则鼠标不会正确工作。为简化设计和说明,在实例中并没有采用后者,如果读者有兴趣,可以自己完成相关工作。相关函数在程序中处于注释状态。
为保证不同地址的鼠标之间不会因地址重叠而产生干扰,需要在无线鼠标打开后根据无线鼠标发送的地址参数进行二次初始化,以确保与某个鼠标的匹配。
在无线收发部件中,需要说明的功能函数包括:作为从设备向PC机PS/2口发送函数、无线接收函数、作为主设备向PS/2鼠标发送初始化命令函数、作为主设备接收PS/2鼠标数据函数等。
(1)unsigned char send_byte(unsigned char x)//PS/2鼠标的发送数据函数,每次1字节
(2)void ReceiveShock()//无线接收数据函数,该函数在前一小节已经作了完整的介绍,这里省略对其代码的分析。
(3)unsigned char mouse_send(unsigned char x)//作为主设备向PS/2鼠标发送初始化命令函数
{
unsigned char tmpe,i,char_temp,cnt=0;bit flag_check=1;
在对鼠标的操作前必须对鼠标进行初始化设置,这个设置的序列可以自己定义,也可以按照操作系统的一般流程来做。本实例中使用了Windows操作系统的默认初始化指令序列来完成对鼠标的初始化操作。该序列可以用一个字符型数据定义:
{0xff,0xf2,0xe8,0x00,0xe6,0xe6,0xe6,0xe9,0xe8,0x03,0xf3,0xc8,0xf3,0x64,0xf3,0x50,0xf3,0xc8,0xf3,0xc8,0xf3,0x50,0xf2,0xf3,0x3c,0xe8,0x03,0xf4}主要功能有复位、读设备类型、设置分辨率、清缩放位、读取鼠标状态信息、重设分辨率、设置采样率、启动鼠标传送功能。当然也可以不作设置,读取设备类型后直接启动鼠标传送功能。
(4)unsigned char mouse_receive()//作为主设备接收鼠标数据
通过本实例的介绍,读者可以实现一个具有完整使用功能的无线鼠标装置,并能够学习无线通信模块使用和PS/2接收的编程使用方法。
5.4 基于AVR单片机的手持控制器设计实例
在很多工业控制中,需要操作者与操作设备分离,以提供更大的灵活性和独立性。本小节将介绍一个在实际工程项目中得到使用的手持控制装置。该装置可以提供良好的人机交互界面,完成多个参数的输入,并能随时动态显示主机方发来的状态信息,以便操作人随时了解设备的工作状况,是具有良好实用性的一个控制装置。
5.4.1 系统功能总体结构
该设备为行车控制系统的输入控制装置,用于操控人员以手持方式对行车坐标的输入控制,并同步显示相关坐标位置。主要技术要求包括:
(1)在手持部分能够显示4个坐标值,分别是X、Y,Z、α值,显示共5行,第一行为提示信息,表明当前显示值的意义,可由键盘操作在不同显示界面上进行切换;
(2)X轴坐标范围为0~XXm,Y轴坐标范围1~YYm,Z轴坐标范围-1~ZZ,α取值范围0~360;
(3)运行速度取值范围为VX、V Y、VZ、Vα;
(4)对X、Y、Z、α等数据进行输入,输入分为三类,分别是绝对位置、相对位置、最大运行速度;
(5)对所输入的坐标和控制命令能够通过RS232接口输出到远端控制机,长度不小于5M;
(6)输入部分有20个按键。包括“0~9”、“.”、“—”、“绝对”、“相对”、“速度”、“←”、“确认”、“取消”、“启动”、“发送”等。
该装置的基本结构如图5-12所示。
图5-12 手持控制器基本结构图
根据功能要求,设计中将手持控制器分为4个部分,即单片机、LCD显示器、键盘、RS232通信接口。单片机负责控制装置的运行和与主控设备之间的交互;LCD用于显示编辑信息和设备状态的回显信息;键盘用于人工输入参数值;RS232接口用于处理主控机与单片机之间的通信。其硬件电路图如图5-13所示。
图5-13 手持控制器的电路原理图
在电路中直接使用MEGA16的AVR单片机引脚作为控制和接口线,在程序设计和电路设计上都可以做到更加简捷,也可以减少不必要的差错。另外,为了扩展系统功能,在电路中还设计了可以进行无线数据传送的接口,加上相应的无线模块,就可以通过无线方式进行数据交换,使操作的灵活性进一步扩大。
5.4.2 硬件电路设计
1.8位AVR单片机MEGA16
系统中的单片机选择了具有40个引脚的AVR单片机MEGA16,该单片机具有以下特点。
(1)基本性能包括32个8位全静态工作的通用工作寄存器;最高16MHz主频,性能可达16 MIPS的运算器;可在两个时钟周期完成乘法运算的硬件乘法器;具有16K字节的系统内可编程Flash,擦写寿命可达10000次;具有独立锁定位的可选Boot代码区,通过片上Boot程序实现系统内编程;具有512字节的EEPROM,擦写寿命可达100000次;具有1K字节的片内SRAM;可以对锁定位进行编程以实现用户程序的加密;支持JTAG接口(与IEEE 1149.1标准兼容)和JTAG调试标准。
(2)片内外设功能丰富,包括两个具有独立预分频器和比较器功能的8位定时器/计数器;一个具有预分频器、比较功能和捕捉功能的16位定时器/计数器;具有独立振荡器的实时计数器RTC;4通道PWM发生器;8路10位的ADC,可构成8个单端通道或7个差分通道,以及2个具有可编程增益(1x,10x,或200x)的差分通道。
(3)通信接口功能强大。内置面向字节的两线接口,两个可编程的串行USART;可工作于主机/从机模式的SPI串行接口;具有独立片内振荡器的可编程看门狗定时器;片内自带模拟比较器。
(4)另外,该CPU还支持片内RC振荡器和片内/片外的多个中断源;支持6种睡眠模式:空闲模式、ADC噪声抑制模式、省电模式、掉电模式、Standby模式以及扩展的Standby模式;在引脚设计上具有32个可编程的I/O口;工作电压为4.5~5.5V。
2.JHD662-12864点阵式LCD显示屏模块
JHD12864点阵式LCD显示模块属于STN液晶显示屏,具有128列、64行点阵的显示能力;模块内置8192个汉字的16×16点阵字库以及128个8×16符号点阵字库;另外支持64×256点阵显示的2KB显存功能;工作电压为3.3~5V。
3.通信接口芯片MAX232
MAX232是美信公司出品的RS232专用通信芯片,属于MAX220-249系列的一个产品,最高可支持120Kbps的通信速率,工作电压5 V,需要外接4支电容,用于升压电路工作。由于在本次产品设计中连接距离和速率均要求不高,因此使用了RS232作为通信接口。这样主控计算机不需要任何转换装置便可以与手持控制器连接。在使用RS232时请注意连接速率和距离的限制,而且232并不是一种总线结构,因此也不支持多设备的互联。如果互联设备多于两台则需要考虑使用RS422或者485总线了。
4.按键选择
由于工作环境和装置体积的限制,本装置中采用了印制板上的薄膜式键盘。这种键盘采用薄膜粘贴方式构成,体积小,可靠性高,使用方便。印制板结构如图5-14所示。
图5-14 薄膜键盘印制板图
5.4.3 程序流程及主要代码
由于该设计需要完成的工作比较繁琐,任务包括显示当前坐标位置、以绝对值方式输入编辑、以相对值方式输入编辑、设置极限参数的输入编辑、RS232通讯管理、键盘扫描及键值处理、数据校验及错误处理。如果采用上一例子中的循环程序方式设计,则任务间的调用和操作将变得十分杂乱。因此在系统设计时使用了一个实时的调度程序来完成任务间的切换和操作,以减小开发难度、提高系统的可维护性。系统软件总体分为两部分:一部分是各功能模块部分,按照功能不同实现了6个任务模块,每个功能模块完成一定的功能,各模块之间存在同步和协调的关系;另一部分是微型操作系统部分,该部分主要功能包括任务管理、调度、任务间的通信和同步等,也可以在操作系统中实现模块驱动及文件系统等功能。系统的总体构架结构如图5-15所示。
图5-15 手持控制器软件部分总体框架
这里的应用程序是指完成各具体功能的功能模块,在微操作系统中,这些功能模块以任务的方式进行管理。微操作系统负责管理所有的任务,实现任务的调度,任务间通信、同步等功能。在需要的时候,还可以将所有设备的驱动程序作为微操作系统的一部分,以实现设备的互斥访问、透明使用等功能。
在本实例中,功能模块共需实现6个任务,其任务分别是系统初始化任务、系统显示任务、串行口数据处理任务、出错管理任务、编辑界面显示任务、编辑按键处理任务。除系统初始化任务采用了单一流程外(运行后不再重复),其他任务均采用循环程序结构。在本实例中,这6个任务相对独立工作,同时又需要相互合作,其工作流程难以顺序化。如果直接采用任务间的调用方式来协同,其调用过程和互斥等问题将变得十分复杂,可能产生大量不确定调用,导致系统复杂性增加,稳定性和可靠性下降,而且也使开发难度变大。使用了微型的操作系统之后,所有任务间的协调和同步不再直接通过调用方式实现,而是通过操作系统的通信机制来完成,并由操作系统调度机制进行任务之间切换,使得系统的调用复杂性被大大减小,更易于理解和排错。因此,本实例中将介绍一个带个微型操作系统的程序设计实例,这对于开发多任务并行的嵌入式系统具有十分重要的意义。
本实例中的微型操作系统功能主要包括任务创建/管理/通信和调度模块、时钟管理模块、LCD显示屏驱动模块、串行口驱动模块、键盘扫描驱动模块5个部分。由于LCD的显示驱动、串行口驱动、键盘扫描等功能在前面的仿真实例中都做了介绍,因此本实例就不再详细说明,读者可以通过一些仿真实例进行学习和理解。本节主要介绍操作系统关于任务管理和调度方面的设计思想和代码。
先介绍一下系统main()函数的结构。这是系统的入口,但是由于使用了操作系统,其流程变得十分简单。首先是对微操作系统的初始化,然后创建各功能对应的任务,起动操作系统的转入操作系统,开始由操作系统负责任务管理、切换、通信、同步等操作。其代码如下:
这里实现的操作系统是一个微型的操作系统,其功能比较单一,主要针对具有以下特点的应用系统:一是系统可用程序和数据空间非常有限;二是任务数量较多时,任务间调度关系变得十分复杂;三是任务调度并非按一定顺序和周期进行,需要更为灵活的安排;四是任务间需要有一定的消息传递和同步机制;五是不同任务具有不同的优先级,需要在调度时对优先级高的任务予以照顾;六是任务数量固定,通常不会动态创建或删除任务;七是任务占用内存空间一般为静态分配,通常不会动态申请和释放内存;八是任务的优先级在使用过程中相对固定。
在使用该微型操作系统时,会有以下一些限制:
(1)操作系统与任务作为一个整体打包,下载到目标系统,代码均运行在同一特权级;
(2)所有任务均以静态分配方式进行内存分配,任务代码相对独立,不会存在代码重用等引起系统混乱的问题;
(3)操作系统不为任务提供内存分配和任务加载机制,即任务是静态方式创建的;(4)操作系统负责任务调度和任务间通信;
(5)设备驱动程序和文件管理作为操作系统的一部分,任务可直接使用;
(6)为保证系统的稳定性,系统中任务总数不超过16个。
该操作系统核心功能编译后,其占用程序存储空间应不超1K字节,占用RAM空间不超256字节。这对于8位单片机而言具有十分重要现实意义,也只有满足了这些要求,才可能在8位单片机上真正运行一个操作系统。下面对该微型操作系统作进一步的介绍和分析。
1.任务控制块struct TCB
在操作系统中第一个问题,就是要能够通过一定的数据结构描述本系统中的任务。该结构在创建任务时生成,用于在操作系统中对任务进行描述和管理。在这个结构中包括了任务的优先级、消息参数、请求参数、状态标志、等待参数、任务断点指针、邮件指列表、标识列表等。
本操作系统使用了一种静态优先级的调度算法,每个任务的优先级在创建时就已经确定,该优先级与任务索引号直接相关,任务索引号越小,任务优先级越高。
通过使用一个静态数组static Tcb Task_Tcb[Task_Total]来管理所有任务的TCB结构,该数组的大小决定了系统可调度的任务数量。为保证系统的资源占用量不会太大,本系统实现时定义为16个成员,这样整个系统中可以创建不超过16个任务,使用时可以按照实际的任务数来创建数组。如只创建10个任务,这个数组也可以只创建10个成员即可。
2.操作系统初始化函数Wrtos_Init
操作系统初始化函数完成的主要功能包括初始化任务控制块表及相关参数、初始化系统时钟、初始化设备列表、设定系统TICK时钟、任务状态及消息列表,其代码如下:
3.任务创建函数Task_Create
该函数用于创建一个任务控制块结构,初始化任务管理、调度及通信的相关参数,并保存该函数对应的任务代码指针。
4.任务调度函数Task_Switch
该函数完成任务的切换工作,首先从优级列表中读取优先级最高的就绪任务,然后找到与之对应的TCB控制块,最后切换到该任务。void Task_Switch()
5.任务删除函数Task_Delete(uint8 index)
任务删除函数用于将index所标志的任务控制块进行清空操作,一旦某优先级的任务被删除,则对应优先级就可以给另一个任务使用。
函数用于实现index任务的挂起,通常由调用该函数的任务在完成一定工作后将其自身挂起,以等待某事件的发生。当然,也可以是系统在调度时剥夺某任务的处理器使用权,将其挂起。
绪表
在单片机系统中,常常会有任务运行到某个状态时需要进行一定的延时操作,如果是任务自身用循环方式进行延时,不仅准确性难以保证,还可能导致很大的处理器资源浪费和系统操作时间的不确定。而利用系统中断方式进行延时控制,不但可以实现较高的定时精度,还可以减少不必要的处理器开销,提高系统的稳定性。该函数就是利用系统时钟来进行多任务延时控制。这种延时方式也会受到高优先级任务的影响而产生出入,并且其定时时间Time只有8位。如果需要更大的延时,则需要对该函数的实现和任务管理结构进行相应的调整。
这里实现的操作系统只包括基本的静态任务管理、调度、任务间通信和同步,用于实现一些固定任务和简单系统的设计完全可以胜任。读者可以在此基础上加上所需要的硬件驱动和文件系统支持,就可以实现功能较为完整的小型操作系统了。如果需要进行动态任务管理和动态内存管理功能,则需要参考操作系统的相关资料,此内容超出本书的介绍范围。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。