定时器可以理解为一个特殊的中断。计数器和定时器其实只是功能上的不同以及度量单位的不同,定时器里面肯定是有计数的。
1、软件定时方式(不是很准确,会被其他中断打断计数过程)
■CPU干预
■指令执行时间作间隔
2、不可编程的硬件定时方式(就像保险丝熔断一样,并不是由程序控制的)
■方式固定
■硬件设定参数
3、可编程的硬件定时方式
■程序设定、程序控制
■中断.
区别:对不同信号的计数
定时器:对时钟信号进行计数,所计数的脉冲具有周期性
计数器:对外部脉冲进行计数,所计数的脉冲周期性、非周期性都可能呈现。
计数和及时本质是相同的,他们都是对一个输入脉冲进行计数,如果输入脉冲的频率一定,那么记录脉冲的个数与所需的时间是一一对应的关系。例如输入脉冲频率为2Mhz,那么计数2x10 6
也就是1秒
1、可编程(工作方式/计数值)
2、三个独立的计数器通道
3、对初值进行减1计数
4、二进制/BCD计数初值
5、计数对象的最高频率为2MHz
由引脚可以看出,数据位是8位的,也就是说不能超过255;如果计数值超过255要分两次写。
读写控制电路以及三个计数器通道:
CLK(输入时钟)
OUT(输出时钟)
GATE(控制门):高电平有效,是计数器的开关
访问8253的信号由两组产生:
1、从十六根总线拿出两个接A0、A1 ,进行端口寻址:00:通道0、01:通道1、10:通道2、11:控制寄存器
2、CS可以拿另外14根(部分或者全部)外加一些逻辑电路构成CS片选信号
控制寄存器:决定工作模式(定时还是计数)
状态寄存器:决定工作状态
初值寄存器:计数的初值
计数输出寄存器:CPU从中读当前的计数值
计数器:执行计数操作,CPU不能访问
工作原理:对CLK信号进行减1处理
首先,CPU把控制字写入控制寄存器,计数初始值写入初值寄存器。
计数从初值开始,每当CLK信号出现一次,计数值减1,当计数值减到0,从OUT段输出规定的信号。
CLK信号出现,计数器是否减1,由门控制信号GATE决定。
CLK是计数输入信号,计数器对CLK端出现的脉冲个数进行计数:
CLK端可以输入外部事件
CLK端可以介入固定频率的时钟信号,从而实现计时。
OUT信号在计数结束时发生变化:
可将OUT作为外部设备的控制信号
可将OUT作为向CPU申请中断的信号
CPU可以从计数寄存器独处当前计数值,读前应向控制寄存器发出锁存信号
定时/计数器初值的计算:
定时时间=时钟脉冲周期 x 预置的计数初值
定时频率=时钟脉冲频率 / 预置的计数初值
1、写入控制字
选择计数通道
设置工作方式
初值的访问方式
确定初值的数制(二进制/BCD)
计数器清零、OUT初始化
2、写入初值
例题1:设三个计数器的CR/OI端口地址为70H、71H、72H,控制寄存器端口地址73H。计数器0,工作模式2,CR/OL仅 使用低8位,=初值为100,计数值使用二进制
分析:
1、根据要求配置控制寄存器:0001 x100,这里x我们认为是0,所以配置字为14H
2、计数值100转为16进制:64H
MOV AL, 14H
OUT 73H, AL
MOV AL, 64H
OUT 70H, AL
例题2:例:设三个计数器的CR/OL端口地址为70H、71H、72H,控制寄存器端口地址73H。计数器1,工作模式1, CR/OL使用16位,
初值为1234,计数值使用BCD
分析:
1、根据要求配置控制寄存器:0111 0011,所以配置字为73H
2、计数值1234H,为16位,而输出一次只能是8位,所以,分高低位分批次输出
MOV AL, 73H
OUT 73H, AL
MOV AX, 1234H ;此时是BCD码的形式,所以是1234
OUT 71H, AL
MOV AL, AH
OUT 71H, AL
步骤:
1、发出锁存命令,使当前计数值锁存在OL中,而CE会继续计数
2、用IN语句读OL,获得当前计数值
例题:设三个计数器的CR/OL端口地址为70H、71H、72H,控制寄存器端口地址73H。读出计数器0的当前计数值,放在BX中
分析:
1、根据要求配置控制寄存器:0000 0000,0H
2、读出的值分为两次传出,先低位后高位
MOV AL, 0H
OUT 73H, AL
IN AL, 70H ;从OL读取低位字节
MOV BL, AL
IN AL, 70H ;从OL读取高位字节
MOV BH, AL ;此时BX的内容就是计数器当前的计数值
在具体学习6种工作方式之前(第一次看是有点晕的),我先找了几篇博客,了解一下大致特点以及6种方式的区别。
8253的六种工作方式
8253与8255的工作方式
硬件触发什么意思?:触发与否与gate门的状态有关。
计数器写完计数值时,开始计数(软件触发),相应的输出信号OUT就开始变成低电平。当计数器减到零时,OUT立即输出高电平。
门控信号高电平时,计数器工作;为低电平时,计数器停止工作,计数值保持不变。
在计数器工作期间,如果重新写入新的计数值,计数器将按新写入的计数值重新工作。
例题:向8253的A1A0= 11B的地址写入0011 0000B,则表示计数器0设置成方式0,并且采用16位时常数,假设时常数为1500,则计数器0的初始化程序段如下:
MOV DX,COUNTD; 写入8253的方式控制字
MOV AL,0011 0000B
OUT DX,AL;
MOV DX,COUNTA; 计数器0置入时常数
MOV AX,1500
OUT DX,AL
XCHG AL,AH
OUT DX,AL
写入计数初值后,计数器开始工作。门控信号GATE上升沿有效,才开始工作(硬件触发),使输出OUT变成低电平,直到计数器减到0后,输出才变高电平。
在计数器工作期间,当GATE又出现一个上升沿时,计数器重新装入原计数初值并重新开始计数。
如果工作期间对计数器写入新的计数初值,则要等到当前的计数值记满回零且门控信号再次出现上升沿后,才按新写入的计数初值开始工作。
例题:向8253的A1A0= 11B的地址写入0101 0010B,则表示计数器1设置成方式1,并且采用低8位时常数,假设时常数为15,则计数器1的初始化程序段如下:
MOV DX,COUNTD; 写入8253的方式控制字
MOV AL,0101 0010B
OUT DX,AL;
MOV DX,COUNTA; 计数器1置入时常数
MOV AX,15
OUT DX,AL
方式2是一种具有自动装入时间常数(计数初值N)的N分频器。
特点:一次设置计数初值,计数器可自动重复进行减“1”操作,减“1”计数回“0”,可以输出端输出一负脉冲信号。
写入计数初值后,GATE为高开始工作,计数器为0时,OUT输出一个时钟脉宽的负脉冲后自动回复高电平;同时自动重新装入原计数初值,反复计数。
如果工作期间对计数器写入新的计数初值,则要等到当前的计数值记满回零后,才按新写入的计数初值开始工作。
在计数器工作期间,当GATE为低则停止计数,待GATE恢复后计数器重新装入原计数初值并重新开始计数。
例题:向8253的A1A0= 11B的地址写入1001 0100B,则表示计数器2设置成方式2,并且采用低8位时常数,假设时常数为13,则计数器1的初始化程序段如下:
MOV DX,COUNTD; 写入8253的方式控制字
MOV AL,1001 0100B
OUT DX,AL;
MOV DX,COUNTC; 计数器2置入时常数
MOV AX,13
OUT DX,AL
这样在OUT2端就产生了CLK2的13分频信号,若是通过逻辑电路实现起来比较麻烦
方式3工作方式与方式2基本相同,也具有自动装入时间常数(计数初值)的功能。
不同之处在于:工作在3方式,引脚OUT输出的不是一个时钟周期的负脉冲,而是占空比为1:1或近似1:1的方波。当计数值为偶数时,输出在前一半的计数过程中为高电平,在后一半的计数过程中为低电平;为奇数时高电平比低电平宽一个时钟脉冲。
例题:向8253的A1A0= 11B的地址写入0011 0110B,则表示计数器0设置成方式3,并且采用16位时常数,假设时常数为2000,则计数器0的初始化程序段如下:
MOV DX,COUNTD; 写入方式控制字
MOV AL.0011 0110B
OUT DX,AL
MOV DX,COUNTA; 计数器置入时常数
MOV AX,2000
OUT DX,AL
XCHG AL,AH
OUT DX,AL
这样在OUT0端就产生了CLK0的2000分频的方波信号。
此方式设定后,输出OUT就开始变为高电平,GATE为高时,当写完计数值后开始计数。当计数器减到零后,OUT输出一个宽度为一个时钟脉冲的负脉冲,然后恢复高电平,并一直保持高电平。
门控信号GATE为高电平时,计数器工作,为低电平时,计数器停止工作,恢复为高电平后计数器又从原装入的计数初值开始减1工作。
在计数器工作期间,如果重新写入新的计数初值,不影响当前计数状态,仅当当前计数值记完后,计数值才按写入的计数值工作。
例题:向8253的A1A0= 11B的地址写入0101 1000B,则表示计数器1设置成方式4,并且采用低8位时常数,假设时常数为75,则计数器1的初始化程序段如下:
MOV DX,COUNTD; 写入方式控制字
MOV AL.0101 1000B
OUT DX,AL
MOV DX,COUNTA; 计数器置入时常数
MOV AL,75
OUT DX,AL
方式5的工作特点是由GATE上升沿触发计数器开始工作。
在方式5工作方式下,当写入计数初值后,计数器并不立即开始计数,而要由门控信号的上升沿启动计数。
在计数过程中(或者计数结束后),如果门控信号再次出现上升沿,计数器将从原装入的计数初值重新计数。
需要注意的地方:
1、处理器写入8253的计数初值只是写入了预置寄存器,之后到来的第一个CLK输入脉冲(需先由低电平变高,再由高电平变低)才将预置寄存器的初值送到减1计数器。
2、方式0: 一般用作请求中断源.
方式1:一般用作输出固定时长的方波,比如定时器.
方式2差不多,只不过他n计数为零的时候,他只产生一次负脉冲,可作为一次信号,作为分频器使用.
方式0与方式4
方式0 OUT 端计数过程中为低,计数值减为0时,输出变高
方式4 OUT端计数过程中为高,计数值减为0时输出宽度为1个CLK的负脉冲.
方式1与方式5
方式1 OUT端输出宽度为n个CLK的低电平,计数值减为0时,输出为高
方式5 OUT 端计数过程中为高,计数值减为0时输出宽度为1个CLK的负脉冲
在已经设计好的8086系统总线的情况下,可以直接利用系统总线的信号与8253连接。
使用偶地址:
使用奇地址:
1、A0换成BHE’
2、D7~ D0换成D15~D8
使用偶地址:
使用奇地址:
1、A0换成BHE’
2、D7~ D0换成D15~D8
此时实际上和最大系统是相似的,不过由于系统中存在DMA机构,所以必须使AEN=0,此时为非DMA操作。由于数据位只有8位,不分奇偶。
关于这方面的应用其实就是书后习题,明天专门写一章关于应用的笔记。
8253译码电路设计以及初始化编程讲解
Reference:
8253的六种工作方式
8253与8255的工作方式
关于6种工作方式更加详细的过程请参考《微机原理与接口技术.楼顺天版》P253——P263。