在微机应用系统中,经常会提出这样的要求:一种是要求一些外部实时时钟,以实现延时控制或定时;另一种是要求能对外部事件计数的计数器。实现上述要求可采用三种方法:
(1)设计数字逻辑电路来实现计数或定时要求,即由硬件电路实现的计数器/定时器。这种电路,若要改变计数/定时的要求,必须改变电路参数,通用性和灵活性差。
(2)编制一段程序,用软件来实现计数器和定时的要求。这种方法通用性和灵活性都好,但要占用CPU的时间。
(3)采用可编程定时器/计数器,其定时与计数功能可由程序灵活地设定,设定后与CPU并行工作,不占用CPU的时间。
本节介绍的8253-5PIT(programmable Interval Timer)就是一种可编程定时器/计数器芯片,又称为“可编程间隔定时器”。
一、可编程定时器/计数器的基本工作原理
图7-16所示为可编程16位定时器/计数器的逻辑原理图。其中,左边的三个寄存器都是CPU可以访问的,而计数器执行单元CPU不能直接访问。16位计数初值寄存器CR用来存放计数初值,可通过程序来设定。计数执行单元CE是一个16位减1计数器,它的初值便是计数初值寄存器的内容,它只对CLK脉冲计数,一旦计数器被启动后,每出现一个CLK脉冲,计数执行单元中的计数值减1,当减为零时,通过OUT输出指示信号,表明计数执行单元已为零。显然,当CLK是一个周期性时钟信号时,计数器起定时功能;当CLK是一个非周期性事件计数信号时,此时呈计数器功能。计数输出锁存器OL通常跟随计数执行单元的内容而变化,当接收到CPU发来的锁存命令时,就锁定当前的计数值而不跟随计数执行单元变化,直到CPU从中读取锁存值后,才恢复到跟随计数执行单元变化的状态,从而避免了CPU直接读计数执行单元时干扰计数工作的可能。GATE是控制输入端,它有多种控制作用,如允许/禁止计数、启动/停止计数等。控制字寄存器用来控制定时器/计数器的工作方式,就是控制CLK脉冲和GATE门控信号适当配合来产生OUT端的输出信号的形状。所以,定时器/计数器可以归纳为以下几种工作方式:
图7-16 计数器逻辑原理图
(1)门脉冲控制时钟输入。此时,当门脉冲GATE到来时,时钟CLK有效,进行计数操作;当门脉冲结束时,时钟无效,计数停止。
(2)用门脉冲重新启动计数器。
(3)用门脉冲停止计数器工作。
(4)单次计数。此时仅要求GATE为高电平即可。
(5)循环计数。此时,每当计数执行单元为零时,输出端OUT输出一个信号,同时又重新装入计数初值寄存器内容到计数执行单元,重复原来的计数过程,从而在OUT端上可输出周期性的脉冲信号。
二、8253-5的结构和功能
8253-5为具有三个独立的16位计数器,它可用程序设置成多种工作方式,按十进制计数或二进制计数,最高计数速率可达2.6MHz。8253-5能用于多种场合,例如作为可编程方波频率发生器、分频器、实时时钟、事件计数器以及程控单脉冲发生器等。
8253-5的结构框图及引脚排列如图7-17所示。
图7-17 8253-5的结构框图和引脚排列
(a)结构框图; (b)引脚图
24条引脚中,D7~D0为8条双向数据线;为写输入信号; 为读输入信号; 为片选输入信号;A0、A1为片内寄存器地址输入信号。上述信号线都和CPU相接。三个计数器中每一个都有三条信号线;计数输入CLK用于输入定时基准脉冲或计数脉冲;输出信号OUT以相应的电平指示计数的完成,或输出脉冲波形;选通输入(门控输入)GATE用于起动或禁止计数器的操作,以使计数器和计测对象同步。
每个计数器中有三个寄存器:①控制寄存器。初始化时,将控制字寄存器内容写入该寄存器;②计数初值寄存器。初始化时写入该计数器的初始值;③减1计数寄存器。计数初值由计数初值寄存器送入减1计数寄存器,当计数输入端输入一个计数脉冲时,减1计数寄存器内容减1,当减到零时,输出端输出相应信号表示计数结束。
8253-5的读写控制逻辑接受系统总线的输入信号,当 接收到低电平时,8253-5根据 和 端的电平,控制本器件接受CPU的访问,双向三态的数据总线缓冲器根据指令接收或发送数据。这些数据是:编程8253工作方式的控制字;装入各计数器的初始值;读出各计数器的当前值。
用作寄存器选择的地址输入信号A1和A0决定CPU访问的对象。8253-5内部寄存器选择如表7-4所示。
表7-4 8253-5内部寄存器地址
A1 A0 |
读 |
写 |
BIOS使用的地址 |
0 0 0 |
CNT0 |
CNT0 |
40H |
0 0 1 |
CNT1 |
CNT1 |
41H |
0 1 0 |
CNT2 |
CNT2 |
42H |
0 1 1 |
|
工作方式寄存器 |
43H |
1 X X |
无 效 |
|
工作方式寄存器(又称控制字寄存器)是只写寄存器,它接受写入的控制字。8253-5内部有三个控制寄存器控制对应计数器的工作。它决定计数器的工作方式,按十进制或二进制计数,并控制CPU访问这些计数器的方法。控制字中的6位作控制,2位用于选择计数器,其内容如下:
工作方式控制字:
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
SC1 |
SC0 |
RL1 |
RL0 |
M2 |
M1 |
M0 |
BCD |
各字段说明见表7-5~表7-8。
表7-5 SC1,SC0——计数器选择
SC1 |
SC0 |
计数器 |
SC1 |
SC0 |
计数器 |
0 |
0 |
CNT0 |
1 |
0 |
CNT2 |
0 |
1 |
CNT1 |
1 |
1 |
不用 |
表7-6 RL1,RL0——CPU读/写操作
RL1 |
RL0 |
操 作 方 式 |
0 |
0 |
计数器锁存操作(供CPU读) |
0 |
1 |
读/写计数器低8位 |
1 |
0 |
读/写计数器高8位 |
1 |
1 |
先读/写8位,再读/写高8位 |
表7-7 M2M1M0——工作方式选择
M2 |
M1 |
M0 |
工作方式 |
0 |
0 |
0 |
方式0 |
0 |
0 |
1 |
方式1 |
X |
1 |
0 |
方式2 |
X |
1 |
1 |
方式3 |
1 |
0 |
0 |
方式4 |
1 |
0 |
1 |
方式5 |
表7-8 BCD-计数方式选择
0 |
16位二进制计数 |
1 |
4位十进制(BCD)码计数 |
8253-5的三个计数器是独立的16位减1计数器。计数器的工作方式由工作方式寄存器确定。计数器在编程写入初始值后,在某些方式下计数到0后自动预置,计数器连续工作。CPU访问计数器时,必须先设定工作方式控制字中的RL1RL0位。
计数器对CLK计数输入端的输入信号进行递减计数。选通信号GATE控制计数工作的进行,其功能如表7-9所示。
表7-9 选通信号GATE的功能
|
上 升 边 沿 |
高电平 | |
方式0 |
禁止计数 |
—— |
允许计数 |
方式1 |
— |
1. 初始化和计数 2. 下一个时钟后输出变为低电平 |
—— |
方式2 |
1. 禁止计数 2. 使输出立即变为高电平 |
1. 初始化和计数 2. 计数器重新装入 |
允许计数 |
方式3 |
1. 禁止计数 2. 使输出立即变为高电平 |
1. 初始化和计数 2. 计数器重新装入 |
允许计数 |
方式4 |
禁止计数 |
—— |
允许计数 |
方式5 |
—— |
初始化和计数 |
—— |
三、8253-5的工作方式
8253具有六种工作方式,在不同的方式下,计数器的启动方式、GATE端输入信号的作用以及OUT端的输出波形都有所不同。
在任何一种方式下,都必须先向8253写入控制字,控制字还起复位作用,它使OUT端变为工作方式中规定的状态和对计数初值寄存器CR清零;然后再将计数初值写到CR中,其最大值为0000H。
(一)方式0——计数结束中断
当程序把控制字写入控制寄存器时,苦工作在方式0,则该计数器的输出OUT立即变为低电平。在计数初值写入该计数器后,输出仍将保持为低电平,在门控GATE信号为高电平时,计数器开始减1计数,当计数器从初始值减到全0时,便产生一高电平OUT输出,利用此输出信号可向CPU发出中断请求,此高电平输出一直保持到该计数器装入新的工作方式或计数值为止。若在计数过程中装入新的初始值,则会导致装入第一字节停止现行计数,装入第二字节后从新的初始值开始计数。
方式0的时序波形如图7-18所示。
图7-18 方式0波形
图中取计数初值n-4,在GATE为高电平时,允许计数器计数;若GATE为低电平,则禁止计数器计数。
注意如下几点:
1)按方式0计数时,计数器只计一遍,当计数到0时,计数器并不装入初始值重新开始计数,其输出将保持为高电平。
2)方式0的计数过程可由门控信号GATE控制其起停。在计数过程中,GATE信号的变化不影响输出OUT的状态。
3)计数过程中可重新装入计数初值。如果是8位计数初值,在写入新的计数值后,计数器将按新的计数值重新开始计数,如果是16位计数初值,在写入第一个字节后,计数器停止计数,在写入第二个字节后,计数器按照新的计数值开始计数。
4)8253的内部操作是在CPU写计数值的 信号上升沿将该计数值送到与计数器对应的计数初值寄存器。在 信号上升沿之后的一个CLK脉冲,才将计数值从计数初值寄存器送到减1计数器,计数器才开始计数。如果设置计数初值为N,输出OUT是在N+1个CLK脉冲期间变为高电平的,这个特点也适合于方式l、方式2、方式4和方式5。
(二)方式1——可编程单稳
在设定为方式1工作时,输出OUT变为高电平。CPU执行输出指令装入计数初值时,OUT仍保持为高电平,在选通GATE输入信号上升沿后的计数过程中,OUT变为低电平;直至减1计数器为全0时,OUT将变为高电平。若在计数过程中(OUT为低电平时),装入一个新的计数值,则在下一次GATE触发之前不影响计数器的计数,即不影响上一次的单稳脉冲的宽度。任何时刻都可以读出计数器的值而不影响单稳脉冲的宽度。单稳是可重触发的,因而在任何GATE输入信号上升沿后,OUT输出低电平信号的宽度将取决于时钟频率和计数初值的设定。
方式1的时序波形如图7-19所示。
图7-19 方式1波形
在方式1时,GATE信号实际上是单稳态线路的触发信号,在GATE信号上升沿后的时钟脉冲CLK的由高电平到低电平的下降沿将计数初值装入计数器,同时使OUT变为低电平,然后开始递减计数过程。在计数初值为N时,则OUT输出的脉冲宽度为N个输入脉冲的间隔时间。
(三)方式2——频率发生器
当8253工作于方式2时,相当于一个N分频器,N为设定的计数初值,OUT变为低电平的时间是一个输入时钟周期,从一个输出脉冲到下一个输出脉冲之间的时间等于输入到计数寄存器中的计数初值N和时钟周期的乘积。如果在两个输出脉冲之间,对计数寄存器装入新的初始值,现行计数过程不受影响,但下一周期将反映新的计数初值。当GATE输入端为低电平时,将迫使OUT为高电平,并禁止计数;当GATE变为高电平时,计数器装入预置的计数值,且开始计数。这样,GATE信号就可用作计数器的同步控制信号。
在控制字设定一个计数器为方式2工作时,OUT输出保持为高电平,直至给计数寄存器重新装入计数初值。这样,OUT也能用软件来同步。
方式2的时序波形如图7-20所示。
图7-20 方式2波形
(四)方式3——方波发生器
这种方式类似于方式2,不同的是OUT输出是方波。当计数值是偶数时,在计数完成一半之前OUT保持为高电平,对另一半计数时OUT将变为低电平,然后重复上述计数操作,当计数值N是奇数时,对(N+1)/2进行计数时OUT是高电平,而对(N-1)/2进行计数时OUT则是低电平,然后重复计数,如果计数寄存器在计数期间重新装入新值,这个新值将在计数输出跳变以后立即反映出来。方式3波形如图7-21所示。
图7-21 方式3波形
(五)方式4——软件触发选通
设定为方式4后,OUT将是高电平。在CPU执行OUT指令时把计数值装入计数初值寄存器,在 信号后的一个时钟脉冲的下降沿把计数值装入计数器,此后计数器开始计数。在计数结束时,OUT输出一个时钟周期的低电平信号,然后再次变为高电平。如果在计数过程中写入一个新的计数值,则现行CLK时钟周期不受影响,但下一个时钟周期将新的计数值装入计数器,然后开始计数。
当GATE信号为低电平时禁止计数;GATE为高电平时允许计数。
方式4的时序波形如图7-22所示。
图7-22 方式4波形
(六)方式5——硬件触发选通
这种方式类似于方式4,不同的是GATE输入信号的作用不同,计数过程由GATE的上升沿触发,在GATE的上升沿后的一个时钟脉冲的下降沿将计数值装入计数器,然后开始计数过程。在计数结束时,OUT将输出一个时钟周期的低电平信号,计数器是可重触发的。在任何GATE触发脉冲上升沿之后,将把计数初值重新送入计数器,然后开始计数过程。
方式5的时序波形如图7-23所示。
图7-23 方式5波形
四、8253-5的初始化
(一)写入方式控制字
使用任一计数器通道,首先要向该通道写入方式控制字,以确定该通道的工作方式。注意,虽然三个通道用的控制字端口地址是相同的,但三个控制字写入后却存入对应通道的控制寄存器中。
(二)写入计数初始值
某个计数器在写入了方式控制字后,任何时候都可以按RL1RL0的规定写入计数初始值,对某一计数器的写入次序是必须严格遵守的,但是在符合次序情况下,允许在中间穿插着对别的计数器的读写操作。
当RL1RL0=01时,只写入低8位,则高位自动置0;
当RL1RL0=10时,只写入高8位,则低位自动置0;
当RL1RL0=11时,写入16位,先写低8位,后写高8位。
写入计数初始值时,还需注意的是:如果在方式控制字中的BCD位为1,即为十进制计数,在写入指令中时必须写成BCD数,例如计数初值为50,采用BCD计数,则指令中的50必须写为50H。下面举一个初始化的例子来说明上述过程。
要求计数器0工作于方式3,输出方波的重复频率为2KHz,计数脉冲输入为2.5MHz,采用BCD计数,试写出初始化程序段。
计算计数初始值
TC=2.5MHz/2KHz=1250
方式控制字为00110111=37H,即计数器0,写16位,方式3,BCD计数。
设8253的端口地址为80H,81H,82H,83H。
则初始化程序段为
MOV AL,37H ;写入方式控制字
OUT 83H,AL
MOV AL,50H ;写入计数初始值低8位
OUT 80H,AL
MOV AL,12H ;写入计数初始值高8位
OUT 80H,AL
(三)读计数值
在计数进行过程中,读出当前的计数值有时是有用的。在动态读计数值时可以有两种办法。
1. 以普通对计数器端口读的方法取得当前计数值
按工作方式控制字中RL1RL0位的规定,可以读出指定字节的计数值。考虑到计数器正在进行计数,可能会使从计数器直接读出的数值不稳定。为此,在这种直接读出方法使用时,可以用GATE无效或阻断时钟输入等方法,使计数器暂停计数,保证CPU读到稳定的数值。
由于8253内部逻辑安排,按RL1RL0的规定读完全部规定字节是绝对必要的,如果规定要读两个字节,那么必须在读出两个字节后,才有可能正确地向计数器写数。
2.锁存计数器的当前计数值
用一个方式控制字,其中SL1SL0=01指定要读的计数器通道号,RL1RL0=00,使这个方式控制字成为一个软件命令,方式字的其余各位内容可以不考虑。这个命令一写入后,就立即把当前计数值锁存到锁存寄存器,而计数器可以继续工作。此后,CPU通过和上面一样的办法读出计数值,即先用方式控制字规定读取的方式,然后再读计数值,但由于这是从锁存寄存器中读取的,所以是一个稳定的值。这种方法唯一的限定也是必须读完规定的字节数。
五、8253定时器时数器应用举例
用8253监视一个生产流水线,每通过50个工作,扬声器响5s,频率为2000Hz。
1. 硬件连接
8253的应用示意图如图7-24所示,图中工件从光源与光敏电阻之间通过时,在晶体管的发射极上会产生一个脉冲,此脉冲作为8253-5通道0计数器的计数输入CLK0,当通道0计数满50后,由OUT0输出负脉冲,经反相后作为8259A的一个中断请求信号,在中断服务程序中,启动8253-5通道1计数器工作,由OUT1连续输出2000Hz的方波,持续5s后停止输出。
图7-24 8253的应用示意图
本例中,通道0计数器工作于方式2,通道1计数器工作于方式3,通道1的门控信号GATE1由8255A的PA0控制,输出方波信号经驱动、滤波后送扬声器。
2. 控制字设置
通道0计数器工作于方式2,采用BCD计数,因计数初值为50,采用RL1RL0=01(读/写计数器的低8位),则工作方式控制字为00010101。
通道1计数器工作于方式3,CLK1接2.5MHz时钟,要求产生2000Hz的方波,则计数初值应为2.5×106/2000=1250,采用RL1RL0=11(先读/写低8位,后读/写高8位),BCD计数。则工作方式字为01110111。
3. 程序
设:通道0的地址为40H,通道1的地址为41H,控制口地址为43H,8255A的口地址为80H,则主程序为:
MOV AL,15H ;通道初始化
OUT 43H,AL
MOV AL,50H ;计数初值
OUT 40H,AL
STI ;开中断
LOP:HLT ;等待中断
JMP LOP
中断服务程序为:
MOV AL,01H ;通道1的GATE1置1,启动计数
OUT 80H,AL
MOV AL,77H ;通道1初始化
OUT 43H,AL
MOV AL,50H ;计数初值
OUT 41H,AL
MOV AL,12H
OUT 41H,AL
CALL DL5S ;延时5s
MOV AL,00H ;通道1的GATE1置0,停止计数
OUT 80H,AL
IRET
本例中,通道0工作于计数状态,通道1工作于定时状态。
本文标签:广东自考 工学类 微型计算机原理及应用学习笔记 可编程定时器
转载请注明:文章转载自(http://www.gdzkw.net)
热点关注: