一.硬件定时器
(一).定时类型
在PC微机中,有两类时钟脉冲,用于系统同步、定时:
内部定时是由cpu的晶振产生的工作时钟,其频率为处理机工作频率。
非处理器时序结构的时钟统称‘外部定时’。
在《计算机组成原理》中有过基本讨论:外设工作频率相较CPU不高,外部定时一般为ms级别,而处理机定时一般为ns级。
(二).定时方法
1.软件定时
由指令来实现延时等待功能:常见的方法有延时指令NOP,CPU停顿一个指令周期,还有循环控制:将BX内置0FFEH,减至0000H时运行结束。
NOP
MOV BX,0FFEH
DELAY: DEC BX
JNZ DELAY
软件定时实现方便,不需要冗余硬件参与,但是CPU在期间长期闲置,没办法进行正常工作,显然软件实现不是最优选择。
2.硬件定时
靠硬件部件实现定时控制。
二.可编程定时/计数器(以82c54A为例)
(一).管脚特性
如下图所示,为82c54A外部管脚逻辑示意:
D0-D7为8位双向数据线,用于与8086CPU进行数据双向交互(如计数初值送入、发送工作命令、计数结果返回等)但是应该注意:82c54A内计数器为16bit,而数据总线仅为8位,故初值应该分两次送入芯片。
~CS为使能信号,低电平时82c54A正常工作。
A0-A1为两位片内端口地址,共有00-11四个端口可供访问。
~RD、~WR为读写使能信号,面向8086CPU,由8086发送控制微指令。
gate0--gate2为计数器使能信号。
OUT0--OUT2为82c54A的计数输出。
(二).内部结构
8254内部共有三个计数器,一个命令寄存器,共四个寄存器,由两位地址线进行片选。
如上图为8254内部结构逻辑示意,其中counter0---counter2为三个16位互相独立的减计数器,地址为304H---306H,置数位均与数据总线相连,OUT0--2、GATE0--2管脚分别对应计数器0--2,
control Register为控制寄存器,与总线相连,8254命令字长为8位,一次性发送即可。其地址为307H。命令字由组合逻辑分析产生控制信号,其内部结构不详细展开。对16位计数器,其计数范围为FFFFH---0000H。
但是最大计数初值应该置0000H
因为,在硬件无符号模式下,0000H-0001H=FFFFH,即相当于从10000H-0000H计数。
(三).命令格式
8254A共有6种工作模式,其命令真值如下所示:
D7--D6为计数器选择,其中00、01、10为选择工作的计数器标号,11为读回状态指令,当该位为‘11’时,后续格式有所不同,详见后续。
D5--D4为读写工作选择,其方式详细如下:
D3--D1为工作方式选择:Type0--Type5为6种不同的工作方式。
D0为计数方式选择,8254A有两种计数方式:2进制计数模式和BCD码计数模式。
读回命令格式如下所示:一条读回命令可以一次性锁存三个计数器的现态,以便判断硬件状态。
(四).功能逻辑
8254A的启动方式分为软启动和硬启动,两者区别在于是否需要对应GATE管脚输入一次脉冲信号:硬件启动在收到初值后等待对应GATE管脚上的脉冲信号,故称‘硬件启动’。
而软件启动在GATE电平满足条件的情况下,收到计数初值时即可开始计数,由计数初值启动,故称‘软件启动’。
1.方式0(软启动)
最常用的工作方式:计数次数即为计数初值,计数结束时刻在对应OUT管脚产生高电平。可用于产生中断申请信号(这即为微机中实时钟中断的产生方式,在操作系统中要基于时钟中断进行时间片下进程调度)。
其启动方式将对应的GATE管脚置‘1’即可,其对应OUT输出在计数结束前恒为‘0’,计数结束后立刻跳为‘1’。
2.方式1(硬启动)
称为单稳态可编程触发器:在确认收到计数初值时,每次对应GATE管脚上输入一个窄上跳脉冲时,计数启动。计数过程中对应OUT管脚输出‘0’,计数结束时输出‘1’。
3.方式2(软启动)
当对应GATE输入为1时,收到计数初值即刻开始计数。计数器循环计数,当计数值为0001H时,输出一个时钟周期宽度的低电平窄脉冲。
4.方式3(软启动)
称为“方波发生器”(或称“奇偶方波发生器”),其计数输出模式为:对偶数计数初值,按1/2时钟周期进行分频。而计数初值为奇数则多一拍分频:
计数初值为n=2k+1,kN+时,初值n为奇数,低电平占
拍,高电平占
拍,占空比n-1:n+1几乎近似于1:1。当对应GATE管脚为‘1’时,收到计数初值即刻开始计数。
5.方式4(软启动)
称为“软件触发选通方式”。与方式二类似:计数值减至0000H时,产生一个时钟周期宽度的低电平窄脉冲。但是方式四不会自动循环,OUT将一直保持‘1’直至下次重新写入计数初值。
6.方式5(硬启动)
称为“硬件触发选通方式”。其工作输出与方式四完全一致,唯一区别是要硬件启动。在一次计数结束时,等待对应GATE管脚上的一次上跳脉冲,重新开始计数。
(五).工作初始化
在系统内的8254A芯片端口地址确定,304H--307H>FFH,只能使用寄存器间接寻址的方式。且计数初值要分两次传送,8086汇编逻辑结构如下:
MOV DX , 307H
MOV AL , xxxx_xxxxb //先送工作命令字
OUT DX , AL
MOV AX , 0A8FCH //送计数初值
MOV DX , 30xH
OUT DX , AL //初值分两次送
MOV AL , AH
OUT DX , AL