8098单片机原理介绍(续)

🏠 首页 《无线电》杂志 1992年 🔗 第7期 🔗 第27页 分类:无线电技术自学经验交流 🔗 陈尚品 🔗, 梁建国 🔗, 朱小华 🔗

二 、高速通道

1.HSI(高速输入)部件:

(1)8098芯片内设置有高速输入部件,它主要用来解决高速记录外部事件发生的时间和状态变化。8098的高速输入部件共有4条输入通道(HSI.0~HSI.3),每条通道都可记录一个以定时器T1为时间基准的时间值引脚上的状态变化。在8098的HSI部件工作时,4个输入口中的任何一个口发生了规定的变化过程,变化的状态和对应的时间值就会被记录在FIFO之中。FIFO是一种先进先出寄存器,它的工作原理就相当于一个存储管道一样,先送进的东西最先从另一个端口送出。8098的FIFO寄存器是一个7×20位的先进先出的寄存器,它可存放定时器T1,16位的时间值和同一时刻4个HSI引脚上的状态。当任何一个HSI引脚发生了规定的跃变时,就将定时器T1的时间值及HSI的状态送到FIFO之中,经过8个状态周期之后,当保持寄存器为空时,这些数据就会被传送到保持寄存器中。由于FIFO之中能保存7个事件,保持寄存器中可保存一个事件,故HSI部件一次共能记录8个事件。如果HSI部件已经记录了8个数据,而CPU又没有进行处理的话,HSI部件就不再继续记录事件了,只将最先记录的8个事件保持住。图4是HSI部件原理图。

图1
图1 🔍原图 (868×352)

(2).HSI的工作方式:每一个HSI通道都具有4种输入方式,输入方式的选择,可由HSI工作方式寄存器中相应的位来决定,HSI工作方式寄存器的地址是03H。每条输入引脚的工作方式,是由寄存器中的2位来决定的,故它们有4种工作方式。①方式0(对应位为00):HSI引脚上每8次正跳变定义为一次事件;②方式1(对应位为01):HSI引脚上每次正跳变定义为一次事件;③方式2(对应位为10):HSI引脚上每次负跳变定义为一次事件;④方式3(对应位为11):HSI引脚上无论发生一次正跳变或负跳变均定义为一次事件。

(3)HSI的工作状态:I/O状态寄存器1中的6.7位(即IOS1.6和IOS1.7)指示了HSI部件中FIFO和保持寄存器的状态,可以通过测试IOS1.6和IOS1.7来了解HSI的工作状态。如果证实FIFO之中的数据有效,就可进一步了解事件的有关数据。在HSI状态寄存器中保存了事件发生时HSI引脚的状态,在HSI时间寄存器中保存了事件发生的时间。HSI状态寄存器的地址为06H,HSI时间寄存器的地址为04H和05H。

HSI状态寄存器中的两位对应一个引脚的状态,高位对应了引脚的当前状态(1表示引脚是高电平,0表示引脚是低电平);低位表明在HSI时间寄存器所记录的时刻该引脚上是否有事件发生(1表示有事件发生,0表示没有事件发生)。需要指出的是,HSI时间寄存器只能按字读取;读取状态寄存器和时间寄存器的操作应放在保持寄存器即IOS1.7=1后,否则读出的数据将是无意义的。

每一个HSI通道是否开通或关闭,都可由寄存器IOC0来控制,当对应的位为0时,就关闭该通道,当对应的位为1时,就开通该通道。如果某一通道被关闭,该通道引脚上的信号变化,不会进入FIFO之中。

当IOS1.6为1时,表示FIFO之中至少已装入了7个事件,当IOS1.7为1时,FIFO之中至少记录了一个事件。当读取FIFO之中信息或测试IOS1时,必须谨慎小心,因为这种操作都会使IOS1寄存器(包括定时器的溢出标志)清零。

(4).HSI的分辨率:由于HSI部件在记录外部事件时,是以定时器T1的时间为参考时间,而定时器T1是每过8个状态周期才计数一次,也就是说每过8个状态周期HSI部件才能记录一次事件,当采用12MHz晶振时,对事件的时间分辨率为2μs(0.25μs×8)。对于一个引脚来说,2μs时间内发生的事件只能记录一次。

HSI部件在每个状态周期内对引脚的状态采样一次,这就要求输入信号的高电平或低电平最少应在一个状态周期内保持不变,以保证能正确地检测到引脚的状态。

(5).HSI的中断:HSI的中断方式可由IOC1.7来决定,HSI有两种中断方式。一是当IOC1.7为0时,保持寄存器加载后立即产生中断,即事件一旦发生,其状态和发生时间就立即被送到保持寄存器中,并发出中断信号。这种发中断的方式比较适合使用单个HSI通道或外部信号变化缓慢的场合,有时利用HSI的这个特点,把一个HSI引脚来作外部中断用。另一种方法是,IOC1.7为1,只有当FIFO中记录了6个以上事件时,才发生中断,这种方式较适合多个HSI通道同时被使用的场合,以避免频繁发生中断请求。

(6).读取事件的信息:如果知道了HSI部件中已经记录了有效事件,可通过读HSI状态寄存器和HSI时间寄存器来获得有关事件的数据。但应先读HSI状态寄存器,然后再读HSI时间寄存器,因为每读一次HSI的时间寄存器,FIFO之中的事件就会减少一个,如果没有先读HSI状态寄存器而先读了HSI时间寄存器的话,HSI状态寄存器中的内容就丢失了,读入的状态就不是对应时间下HSI引脚的状态。

2.HSO(高速输出)部件:

(1).8098芯片内设有HSO(高速输出)通道,HSO部件能在设定的时刻触发外部事件,当CPU对HSO部件设定之后,HSO部件便能不需要CPU的干预,自动完成事件的触发。利用HSO部件的这个功能,只需占用很少的CPU时间便能完成复杂的工作。HSO部件能触发的事件包括:启动A/D转换器、复位定时器T2、设置4个软件定时器标志和接通6条HSO引脚(HSO.0~HSO.5)。其中HSO.4与HSI.2共用一个引脚;HSO.5与HSI.3共用引脚,引脚的功能是由IOC1.4和IOC1.6来控制的。HSO部件能一次预置8个事件。

HSO的原理图见图5,由图中不难看出,高速输出部件的核心是CAM(内容定址存储器),它由8个23位的寄存器组成,与普通的存储器不同,它是一种根据所存储数据的全部或部分信息特征来进行存取的存储器。

图2
图2 🔍原图 (1020×620)

(2).内部CPU通过保持寄存器,将命令和时间分别写入到HSO命令寄存器和HSO时间寄存器。当CAM之中有空位时,经过8个状态周期之后,保持寄存器之中的内容就被传送到CAM之中。CAM之中存放的时间值与定时器的时间值每个状态周期都比较一个,8个状态周期就能将CAM之中的8个事件的时间值全部比较一遍。由于CAM存储是采用的时间值优先方式,而不是FIFO方式,故只要任何一次比较的时间值一致,就执行(规定时刻)命令寄存器中的命令。HSO部件的参考定时器既可以是定时器T1也可以是定时器T2,究竟采用哪一个,可由HSO命令寄存器中的第6位决定。

由于需要8个状态周期才能将CAM之中的8个寄存器单元内的时间值全部比较一遍,所以HSO部件的分辨率为8个状态周期,当采用12MHz晶振时,需要2μs能完成一次全比较。

虽然CAM只有8个存储单元,但HSO部件实际上能预置9个事件,这是因为当CAM之中装满8个事件后,第9个写入的事件就只能保持在保持寄存器之中。只有进入CAM之中的事件才参与比较,而保持寄存器中的事件不参与比较。但只要CAM之中有空位,经过8个状态周期之后,保持寄存器中的事件就会传送到CAM之中。

(3).HSO部件的命令寄存器:HSO命令寄存器用来规定事件的属性,它的地址是06H。其中0~3位为选择通道号,HSO部件中共有6条输出通道可供选择,由于HSO.4和HSO.5分别与HSI.2和HSI.3共用引脚,当使用HSO.4和HSO.5时,应该将控制寄存器中的IOC1.4和IOC1.6置1,这样它们只能作输出口使用。第4位I是选择当有触发事件时是否产生中断。第5位D是选择输出是高电平还是低电平。第6位T是选择以定时器T1为参考定时器,还是选择定时器T2为参考定时器。定时器T1是每2μs(12MHz晶振时)自动加1,由于定时器T1是系统的时钟参考源,是不能通过软件清零的,只有通过复位才能使定时器T1清零。当选择定时器T2为参考时钟源时,定时器T2的时钟及复位均可由IOCO(命令寄存器)来控制选择。

(4).HSO时间寄存器:HSO时间寄存器是用来存放事件的触发时间,它的地址是04H(低位字节)和05H(高位字节),这里所指的时间是相对于定时器T1或T2的时间,因此在设置时间时应使用ADD指令,典型的格式如下:ADD HSO_TIME,TIME1,#WHEN_TO_DO_IT

这里#WHEN_T_DO_IT表示相对于定时器T1的时间值,其最短时间为2μs(12MHz晶振时),由于HSO部件将HSO_COMMAND和HSO_TIME中的内容从保持寄存器传送到CAM之中,最少需要8个状态周期,而ADD指令执行的时间需要6个状态周期,再加上其它硬件动作所需的时间,因此实际上HSO相对于定时器T1的触发时间至少要大于4μs(12MHz晶振),即相对的时间值应大于02H。如果将上述的指令中#WHEN_TO_DO_IT用#03H取代,那么这条指令执行完毕2μs之后,便会触发事件。如果用#00H取代的话,ADD指令执行完毕之后,所规定的触发时刻已过,就要等到定时器T1再次溢出,大约要等131ms才能触发所设定的事件。

(5).HSO的状态:在对HSO部件操作时,可通过查询IOS0状态寄存器来了解HSO部件的状况。在将有关事件的数据写入HSO部件时,起码应保证HSO的保持寄存器是空的,否则会发生写入错误。IOS0.6和IOS0.7表示了HSO的状态,如果IOS0.6为0,表明不但保持寄存器是空的,而且CAM之中至少还有一个空单元。如果IOS0.7为0,则表示只有保持寄存器是空的。

在保持寄存器为空或CAM中有空单元时,可将事件的数据写入到HSO部件之中。在写事件数据时,最好先写命令寄存器,再写时间寄存器。

例: LDB HSO_COMMAND,#WHAT_TO_DO

ADD HSO_TIME,TIMER1, #WHEN_TO_DO

€?
第一条指令指出了做什么事情,第二条指令则规定了从当前时刻(这里使用的是定时器T1,也可使用定时器T2)开始隔多少时间去触发事件。实际工作时,当把时间数据写入到HSO_TIME之中时,就把命令和时间数据同时传入到保持寄存器之中,因此在执行上两条指令期间,HSO部件最好不要被其它中断所打断。因为如果发生这种情况,中断服务程序有可能将某些数据写入到HSO时间寄存器之中,这时命令特征就与中断服务程序送来的假时间值一起进入CAM之中。这样HSO虽然知道应该做什么,但何时去做却可能是不正确的。为了避免这类问题的发生,在写命令和写时间值到HSO部件时,应禁止HSO中断。

(6).HSO命令的清除:对已写入到CAM之中的命令在没有被执行之前,如果想将它删除,除了采用复位之外,还可用软件来解决,其具体做法是,在CAM寄存器之中再设置一个与原来命令相反的命令,则可将原命令删除。例如:原来命令是当定时器T1=3456H时,将HSO.1引脚置高。如果想删除这个命令,可在定时器T1还未到达3456H之前,将相反的命令送入CAM之中,即当定时器T1=3456时,将HSO.1引脚量低这个命令也送入CAM之中。这样当定时器T1=3456H时,这两条命令的结果是使HSO.1引脚上发生了一次空操作,并在CAM寄存器之中空出了两个单元。当然在送入相反命令时,CAM中应还有空单元,否则相反命令就送不进去。

另外在使用定时器T2作基准定时器时,在CAM不为全空时,不应清定时器T2,否则未被执行的命令及时间就一直保留在CAM之中,并占用CAM的寄存单元。

(7).软件定时器:8098内部通过软件可设置四个软件定时器,并且能同时工作,软件定时器也是HSO部件的一部分。当定时器达到预先设置的时间时,HSO就将软件定时器标志置1(标志由IOS.1指示),此时如果HSO命令寄存器中的中断允许位为1的话,就会产生软件定时器中断。由于4个软件定时器合用一个中断向量单元,因此在进入中断服务程序后,可对IOS.1来查询,从而判别是哪一个软件定时器产生的中断。

此外还应注意,若用HSO清除定时器T2或启动一次A/D转换器,当HSO_COMMAND中的第四位为1时,也会产生中断,但这时没有相应的标志来指示这类事件。在同一时间帧(8个状态周期)内,还可能发生多个软件定时器中断。

利用HSO部件很容易实现高速可编程控制器,例如可将一个过程控制的操作步数存放在0B000H单元之中,命令依次存放在0B010H单元中,时间长度则依次存放在0B800H单元之中,那么步数就可设置2000多步,足以满足较复杂的控制。

它的工作过程是:由使用者将自己要设定的控制过程的步长写入0B000H单元之中,再将HSO引脚的状态依次填入到0B010H开始的单元中,然后将每步之间的时间间隔填入到0B800H开始的单元之中。程序运行时首先从0B000H单元之中取出步长数,然后从0B010H单元之中取出对应第一步的命令和从0B800H单元之中取出时间值,并将这些数据写入到HSO的CAM中。当第一步命令执行完毕后,又重新从第一步命令开始执行。在这个程序中,每执行一步操作,就产生一次HSO中断。在对速度要求特别高的场合,可稍修改这个程序,也可执行08步操作产生一次HSO中断。 (未完待续)(朱小华 陈尚品 梁建国)