第七章 定时与计数技术
DESCRIPTION
第七章 定时与计数技术. 第一节 概 述. 一、定时与计数. 1 、定时 目的: 提供时间基准。. 分类: 内部定时、外部定时。. 外部定时实现: 已知 — 一个固定频率的脉冲,所需定时时长; 参数 — Num= 脉冲频率*所需定时时长; 工具 — 计数器 ( 每过一个脉冲 Num 减一 ) ; 结果 — 计数器 Num 为零时定时时间到。. 2 、计数 目的: 计算给定时间内脉冲个数。 计数与定时本质上是一致的,但复杂一些。. 实现: 已知 — 一个固定频率 (f1) 的脉冲,一个需计数 - PowerPoint PPT PresentationTRANSCRIPT
1
第七章 定时与计数技术
2
第一节 概 述一、定时与计数1 、定时 目的:提供时间基准。 分类:内部定时、外部定时。 外部定时实现: 已知—一个固定频率的脉冲,所需定时时长; 参数— Num= 脉冲频率 * 所需定时时长; 工具—计数器 ( 每过一个脉冲 Num 减一 ) ; 结果—计数器 Num 为零时定时时间到。
3
2 、计数 目的:计算给定时间内脉冲个数。 计数与定时本质上是一致的,但复杂一些。 实现:已知—一个固定频率 (f1) 的脉冲,一个需计数 目标脉冲,所需计数时长 (t) ; 参数—定时初值 Num1=f1*t , 计数初值 Num2= 计数器允许的最大值; 工具—计数器 1( 到零时控制计数器 2 停止 ) ; 计数器 2( 连接需计数脉冲 ) ; 结果—计数器 1 的 Num1 到零时,读计数器 2当前计数值 Num ,计数值 =Num2-Num , 需计数脉冲频率 =(Num2-Num)/t 。
4
二、定时方法1 、软件定时 通过软件指令周期方法定时,如执行循环程序。 增加 CPU 负担,通用性差,一般用于短延时。2 、不可编程硬件定时 采用中小规模 IC 构成。 不增加 CPU 负担,成本低,定时值不可改变。3 、可编程硬件定时 采用可编程定时 / 计数器完成,软件可改变计数值。 可编程定时 / 计数器: Intel8253/8254 等。
5
三、定时 / 计数器基本原理1 、内部逻辑
16 位当前计数值锁存器OL
16 位减 1 计数器CE
16 位计数初值寄存器 CR
OUT
MSBLSB
锁存后读出
MSBLSB装入
CTRLCLKGATE
2 、工作原理 初始化 ( 工作方式、初值 ) ,输入→输出的控制
回 15页
功能特性— (CR)=fCLK/fOUT
6
第二节 Intel 8254 8253→8254→82801BA 。一、 8254-2 基本功能 3 个独立的 16 位定时 / 计数器 (T/C) ; 每个 T/C 功能: 可按二、十进制方式计数; 有 6 种不同的工作方式; 最高频率 10MHz ; 8253—2MHz , 8253-5—5MHz , 8254—8MHz , 8254-5—5MHz , 8254-2—10MHz , 82801BA—14.31818MHz 有读回状态功能 (8253 没有 ) 。
7
二、 8254-2 结构与引脚1 、内部逻辑
总线缓冲器 [8 位 R/W] :写工作方式、计数初值, 读当前计数值等。
8
2 、外部引脚
(1) 译码: CS 与 A1A0 : (2) 读 / 写: RD 、 WR ; (3) 外部信号: CLK 、 OUT 、 GATE 。 不同工作方式 OUT 波形不同
9
3 、 CPU 操作功能及命令 I/O 端口地址: 8254 提供 4 个端口 ( 使用A1A0) ; 命令:初始化—设置工作方式、写计数器初值; 操 作—重写计数器初值、写锁存信息; 读当前计数值、读当前状态 I/O 端口与命令冲突的解决方法: ① 特征位—用数据的某几位表示操作的类型; 如: MOV AL , 83H MOV AL , 03H OUT 63H , AL 与 OUT 63H , AL 表示不同操作 ② 间接访问—两条命令完成一个操作 ( 不常用 ) 。 如: OUT+IN/OUT 命令
回下页
10
操 作 特征位 时序D7D6
0 1 0 0 0 计数初值写入 0# 计数器 ** 无0 1 0 0 1 计数初值写入 1# 计数器 ** 无0 1 0 1 0 计数初值写入 2# 计数器 ** 无0 1 0 1 1
向 T/C 控制 REG 写控制字
00~10 无锁存计数值 / 状态命令 11 无
0 0 1 0 0读 0# 计数器当前计数值 无 前一锁存命令
有效时,读取的是锁存对应的类型值;否则读取的是当前计数值。
读 0# 计数器状态 无0 0 1 0 1
读 1# 计数器当前计数值 无读 1# 计数器状态 无
0 0 1 1 0读 2# 计数器当前计数值 无读 2# 计数器状态 无
0 0 1 1 1 无操作1 * * * * 禁止使用0 1 1 * * 无效操作
CS RD WR A1 A0
8254 命令关系表:
转上页 回下页 回 12页 回 14页 回 15页 回 16页
11
三、 8254-2 命令及编程1 、设置工作方式命令—写工作方式控制字
工作方式控制字格式 端口地址: A1A0=11 ; 特征位: D7D6=00~10 为所选 T/C 设置工作方式命令, 11 为所有 T/C 读回命令。 读写格式: D5D4=01~11 ,只写 8 位时另 8 位自动清零。 例 1 : MOV AL , 01110100B ; T/C1 ,先低后高字节 OUT 43H , AL ;方式 2 ,十六进制方式
回 13页 转第 2章转上页
12
2 、写计数初值命令 端口地址: T/C0—A1A0=00 , T/C1—A1A0=01 , T/C2—A1A0=10 ; 步骤: (1) 每次写入一个字节 (8254 数据通道为 8位 ) ; (2) 根据工作方式控制字选择的读 / 写格式,决定计数器初值的高、低字节写入方法。 例 2 : MOV AL , 00H ;假设读写格式为先低后高字节格式 OUT 41H , AL ; BCD 方式计数时,则初值=2000 MOV AL , 20H ;二进制方式计数时,则初值=2000H OUT 41H , AL
转 10页
13
3 、锁存命令—软件锁存 有两种方法实现锁存当前计数值 / 状态功能( 1 )利用工作方式控制字实现锁存当前计数值功能 端口地址: A1A0=11 ; 特征位: D7D6=00~10— 选择 T/C ; D5D4=00— 锁存功能, 01~11-- 读写格式 功能:只能锁存当前计数值。 例 3 : MOV AL , 01000000B ;锁存 T/C1 当前计数值 OUT 43H , AL 特点:用工作方式控制字方法不能实现多个计数器的同时锁存。
转 11页 回下页回 19页
14
( 2 )利用读回命令实现锁存当前计数值 / 状态功能
读回控制字格式 端口地址: A1A0=11 ; 特征位: D7D6=11 。 功能:锁存当前计数值— D5D4=01 ; 锁存当前状态— D5D4=10 。 特点:读回控制字方法可同时锁存多个计数器; 8254 才支持该功能。
转 10页 转上页
15
4 、读出当前计数值命令 方法:⑴直接读取,一般在硬件锁存后读取; ⑵ 用工作方式控制字锁存 ( 软件 ) 后读取; ⑶ 用读回控制字锁存 ( 软件 ) 后读取。 实现:端口地址— A1A0=00~10 ,对应计数器号; 操作— 1~2 个读 (IN) 操作,个数取决于工作方式字的读写格式。
转 10页 转 5页
注意:锁存功能在 IN 操作后自动解锁!
16
5 、读出当前状态命令 方法:用读回控制字锁存 ( 软件 ) 后读取。 实现:端口地址— A1A0=00~10 ,对应计数器号; 操作— 1 个 IN 操作,所读出状态字格式如下
状态字格式
回 20页 转 10页
17
6 、 T/C 初始化编程 (1) 设置工作方式控制字 ( 端口地址 A1A0=11) (2) 设置计数初值 ( 所选 T/C 端口地址A1A0=00~10) 例 4 : MOV AL , 01110101B ; T/C1, 先低后高字节 ,方式 2,BCD OUT 43H , AL MOV AL , 00H OUT 41H , AL MOV AL , 20H OUT 41H , AL ;计数初值为 2000 注意: (1) 每个准备使用的 T/C 均要初始化; (2) 计数初值设置方法由控制字 D5D4 位决定; (3) 计数初值≤ 65536 。
18
7 、 T/C 工作编程—读取当前计数值(1) 硬件锁存后读取当前计数值—直接读取 一般直接读取在硬件方法锁存后使用。 例 5 : MOV AL , 01100101B ; T/C1, 只写高字节 ,方式 2,BCD OUT 43H , AL MOV AL , 20H OUT 41H , AL ;计数初值为 2000 ……… IN AL , 41H MOV AH , AL MOV AL , 0 ; AX 为 T/C1 当前计数值,低位忽略为 0 注意:当初始化采用 BCD 码时,高和低字节计数值按十进制规则减 1(60H 减 1 后,变成 59H ,而非5FH) 。
19
(2) 软件锁存后读取当前计数值—间接方式读取 例 6 :利用工作方式控制字锁存后读取 MOV AL , 01000000B ;锁存 T/C1 当前计数值 OUT 43H , AL IN AL , 41H ;假设 T/C1 初值只写低字节 MOV AH , 0 ; AX 为 T/C1 当前计数值 例 7 :利用读回命令锁存后读取 MOV AL , 11011010B ;锁存 T/C0 、 T/C2 当前计数值 OUT 43H , AL IN AL , 40H ;假设 T/C0 先低后高字节写初值 MOV AH , AL IN AL , 40H XCHG AH , AL ; AX 为 T/C0 当前计数值 IN AL , 42H ;假设 T/C2 只写低字节写初值 MOV AH , 0 ; AX 为 T/C2 当前计数值
转 13页
20
8 、 T/C 工作编程—读取当前状态 例 8 : MOV AL , 11100100B ;锁存 T/C1 当前状态值 OUT 43H , AL IN AL , 41H ;若 AL=00110101 ,状态是什么? MOV AL , 11100010B ;锁存 T/C0 当前状态值 OUT 43H , AL IN AL , 40H ;若 AL=00010110 ,状态是什么?9 、 T/C 工作编程—重写计数初值 方法:与写 T/C 计数初值一致。 效果:重写计数初值会影响输出效果; 不同工作方式导致新初值生效时间不同。
计数初值 CR CE
写计数初值时 不同工作方式传递时机不同转 16页
21
功能 命令 命令中 AL 值初始化
(以 T/Cxy 为例 )
OUT BASE+3, ALOUT BASE+xy, ALOUT BASE+xy, AL①
AL= xy ab cde f AL= 初值低 / 高字节AL= 初值高 / 低字节,
读当前计数值
硬件锁存 ( 直接 )
IN AL, BASE+xyIN AL, BASE+xy①
AL= 当前计数值低 / 高字节AL= 当前计数值高 / 低字节
软件锁存(间接)
工作方式字
OUT BASE+3, ALIN AL, BASE+xyIN AL, BASE+xy①
AL= xy 00 0000AL= 当前计数值低 / 高字节AL= 当前计数值高 / 低字节
读回命令
OUT BASE+3, ALIN AL, BASE+xyIN AL, BASE+xy①
AL= 11 01 0010,bitxy+1=1
AL= 当前计数值低 / 高字节AL= 当前计数值高 / 低字节
读当前状态 ( 间接 )OUT BASE+3, ALIN AL, BASE+xy
AL= 1110 0010,bitxy+1=1AL=bitOUT bitVa ab cde f
重写初值OUT BASE+xy, ALOUT BASE+xy, AL①
AL= 初值低 / 高字节AL= 初值高 / 低字节
说明:① -- 初始化时 ab=11 有该指令, ab=01/10 无该指令
22
四、 8254-2 工作方式1 、方式 0— 计数结束时中断
特点:一次计数; GATE 高允许、下降暂停、低禁止、上升继续计数; WR# 写 [ 重写 ] 后下一脉冲下降沿重新计数; OUT 在写完时变低、计数值为 0 时变高 (N+1 个低 ) 。 回 25页
23
2 、方式 1— 硬件可重触发单稳
特点:一次计数; GATE 上升重新计数,高、下降、低不影响计数; WR# 写 [ 重写 ] 在下次计数 ( 重新 ) 时有效; OUT开始计数时变低、计数值为 0 时变高 (N 个低 ) 。 与方式 0比较: GATE 效果不同、 OUT宽度不同。 回 26页
24
3 、方式 2— 频率发生器
特点:多次计数; GATE 上升重新、高允许、下降停止、低禁止计数 ; WR# 写 [ 重写 ] 在下次计数时有效; OUT 在计数值为 1 时输出宽度为 1 个 CLK 的负脉冲 ( 周期为 N) 回下页
25
4 、方式 3— 方波发生器
特点:多次计数; GATE 上升重新、高允许、下降停止、低禁止计数; WR# 写 [ 重写 ] 在下次计数时有效; OUT开始计数时变高,初值装入 (奇数时装 N-1) 、每个 CLK 计数减 2 、计数值为 0 时 OUT反向 (奇数时停 1 个 CLK) 与方式 2比较: OUT 波形不同。
转上页
26
5 、方式 4— 软件触发选通
特点:一次计数; GATE 上升重新、高允许、下降停止、低禁止计数; WR# 写 [ 重写 ] 后下降沿重新计数; OUT开始计数时变高,在计数值为 0 时输出 1 个CLK 的负脉冲 ( 总长 N+1) 。 与方式 0比较: GATE 上升沿效果、 OUT 波形不同。 转 22页
27
6 、方式 5— 硬件触发选通
特点:一次计数; GATE 上升重新计数,高、下降、低不影响计数; WR# 写 [ 重写 ] 在下次计数时有效; OUT 在计数值为 0 时输出 1 个 CLK 负脉冲 ( 总长N+1) 。 与方式 1比较: OUT 波形不同。
转 23页
28
方式 0 方式 1 方式 2 方式 3 方式 4 方式 5OUT状态
写 CW后 变 0 变 1 变 1 变 0 变 1 变 1
波形宽度 n+1 n n n n+1 n+1
初 值 自 动重装 无 无 计数到 0
重装计数到 0
重装 *无 无
计 数 过 程中 改 变 初值
立即有效 重新计数时有效
计数结束或重新计数时有效
计数结束或重新计数时有效
立即有效 重新计数时有效
GATE
0 禁止计数 无影响 禁止计数 禁止计数 禁止计数 无影响下降沿 暂停计数 无影响 停止计数 停止计数 停止计数 无影响上升沿 继续计数 重新计数 重新计数 重新计数 重新计数 重新计数
1 允许计数 无影响 允许计数 允许计数 允许计数 无影响说明: *-- 装入值为偶数,初值为奇数、 OUT 为高时,停顿 1 个 CLK再重装
工作方式比较表:n 0n 0 n 0 n 0 n 0 n 0
29
五、 8254-2 应用举例1 、分频器设计 用 8254( 地址 40H~43H)将 5MHz 的脉冲变为1Hz 脉冲。 思路:初值 =fCLK/fOUT=5×106> 216 ,需 2 个T/C级联,采用方式 3产生连续方波脉冲, T/C 的GATE统一控制。CLK0
GATE0OUT0CLK1
GATE1OUT1CLK2
GATE2OUT2
D0~D7
A1
A0
RD
WR
CS
5MHz
1Hz
MOV AL , 00110111B ; T/C0OUT 43H , ALMOV AL , 00HOUT 40H , ALMOV AL , 50HOUT 40H , AL ;初值 5000MOV AL , 01110111B ; T/C1OUT 43H , ALMOV AL , 00HOUT 41H , ALMOV AL , 10HOUT 41H , AL ;初值 1000回下页
30
思考: (1) 如何用 8254将 5MHz 的脉冲变为 0.2Hz 方波? (2) 如何用 8254将 5MHz 的脉冲变为先 3s 后2s 脉冲 ? (3) 程序初始化后, CPU 执行其它程序,结果如何 ? (4) 上例如下图连接, OUT1 结果如何?
CLK0GATE0
OUT0CLK1
GATE1OUT1CLK2
GATE2OUT2
D0~D7
A1
A0
RD
WR
CS
5MHz
?
2500 个原 CLK0.5ms
2500 个原 CLK0.5ms
OUT01kHz
0.2ms1000 个原 CLK
0.2ms1000 个原
CLK
OUT15kHz
转上页
31
2 、频率计数器设计 用 8254 计数外来信号频率 fIN( 设 fCLK=1MHz) 。 思路: fIN=(N-M)/t 。 用 T/C0得到 M( 初值为 N) ,采用方式 0 ; 用 T/C1得到 t ,采用方式 1 , OUT1 连接GATE0 ;
CLK0GATE0
OUT0CLK1
GATE1OUT1CLK2
GATE2OUT2
D0~D7
A1
A0
RD
WR
CS
信号fCLK
TRGTRG :计数开始控制信号;EOC :计数结束状态信号。
EOC
回下页 回 33页 回 34页
32
MOV AL , 0; TRG(D1位 )=0 , STC(D0 位 )=0 OUT PIO1 , AL MOV AL , 01110010B ; T/C1 ,先低后高字节OUT 43H , ALMOV AL , 10HOUT 41H , ALMOV AL , 27HOUT 41H , AL ;间隔为10msMOV AL , 00110000B ; T/C0 OUT 43H , ALMOV AL , 00HOUT 40H , ALOUT 40H , AL ;初值为N=65536; STC产生一个脉冲
MOV AL , 2 OUT PIO1 , AL ; TRG=1 ,开始计数S1 : IN AL , PIO2 ;读 EOC AND AL , 01H CMP AL , 01H JNZ S1 ;等到EOC=1 IN AL , 40H MOV AH , AL IN AL , 40H XCHG AH , AL ; AX 为当前计数值 M
转上页 回下页
33
结果: fIN=(N-M+1)/t=[(65536-AX+1)/10]*1000 Hz 注意: (1)10ms 时 M 应大于 0 ; (2)T/C0 在方式 0 时经过一个 CLK 后才将初值写到 CE 中,因此计数结果必须+1 。 思考:如何使结束结果不需要 +1?
信号
TRG
≥1 &
STC
GATE1
CLK0
;实现思路:;在 T/C0 初值写完后,送初值到CEMOV AL , 1OUT PIO1 , AL ; STC(D0位 ) 0→1MOV AL , 0OUT PIO1 , AL ; STC(D0位 ) 1→0;如此计数结果不需要 +1 。转上页 转 31页 回下页
34
综合思考: (1) 上例 T/C1 为方式 0 时,接线及程序如何改变? (2) 采用简化电路,用读回命令的实现方法能否很精确? (3) 为得到精确的 fIN ,需增大时间间隔,在时间间隔内 M=0怎么办? (4) 分析下图 T/C 间连接的效果。
CLK0GATE0
OUT0CLK1
GATE1OUT1
CLK0GATE0
OUT0CLK1
GATE1OUT1
CLK0GATE0
OUT0CLK1
GATE1OUT1
分频器转上页 转 31页
两个独立、同步控制T/C
间歇型 T/C
35
3 、组合波形发生器设计…
t1=0.5s t2=0.5s1 个定时周期
…
t1=1s t2=1s1 个定时周期
f1=1kHz f2=0Hz f1=1kHz f2=64Hz…
… …
OUT0=1Hz
OUT1=1KHz
分析:波形的组成
设计: T/C 的引脚连接CLK0
GATE0OUT0CLK1
GATE1OUT1CLK2
GATE2OUT2
CLK0GATE0
OUT0CLK1
GATE1OUT1CLK2
GATE2OUT2
… …
OUT0=0.5Hz
OUT1=1KHz
… …OUT2=64Hz
CLK0GATE0
OUT0CLK1
GATE1OUT1CLK2
GATE2OUT2
CLK0GATE0
OUT0CLK1
GATE1OUT1CLK2
GATE2OUT2
36
4 、电子钟显示功能实现 设计思路: ⑴ 8254 采用方式 2 ,每秒产生一个请求到8259A ; ⑵ 8259A 实现定时中断服务功能; ⑶中断服务程序实现 (简略 )电子钟的显示功能。 注意: ⑴ 8254 与 8259A 的端口地址不同,如何连接? ⑵ 8259A 有哪些手段尽量不遗漏中断请求? ⑶中断服务程序入口地址的写入与原入口地址的保存 /恢复?
37
第三节 8254 在微机中应用
PC 系列机定时系统结构框图回 41页
38
一、计数器 0— 系统定时器 工作方式: 3 方式,计数初值: 65536 。1 、系统定时器 OUT0 连接到 8259A 的 IRQ0( 中断类型号为 8)上。 fOUT0=1.1931816MHz/65536=18.2Hz , 即每秒产生 18.2 次中断用于日时钟计时。 应用: BIOS 提供 1CH 用户定时中断 (被 08H 中断调用 ) 。2 、软盘驱动器马达控制 系统要求:完成软盘操作后 2s 时关闭软驱马达。 实现:操作完成时,置 2s÷54.925ms=37 到40:40H单元 (BOIS映射 ) ,每次 08H 中断减 1 ,其为 0 时关闭马达
39
二、计数器 1— 动态存储器定时刷新控制 工作方式: 2 方式,计数初值: 18 。 OUT1 连接到 8237 的 DREQ0 上,定时产生负脉冲。 脉冲宽度=1/1.1931816MHz=838ns , 脉冲周期 =18/1.1931816MHz=15.08μs , 即:每隔 15.08μs产生一个脉冲用于 RAM刷新。
40
三、计数器 2—扬声器音频发生器 工作方式: 3 方式,计数初值:由调用程序设置。 连接: OUT2 与 8255 的 PB 口 D1 信号“与”后连接到扬声器上,控制扬声器发生频率及时长。
8255 的 PB 口 D1 位T/C2 的 OUT2
扬声器
控制: 时长: CPU 控制 8255 的 PB 口的 D1 位的电平实现; 频率: CPU 控制 8254 的 T/C2 的初值。
41
例:教材 P198乐曲播放程序。 音符序列: 1 2 3 1 1 2 3 1 3 4 5 3 … 音符频率: 262 294 330 262 262 294 330 262 330 349 392 330 … 音符时长 (10ms) : 10 10 10 10 10 10 10 10 10 10 20 10 … 8254 初始化,设置频率 (音符 )
取时间,等待 10ms 通过等待音符时长通过
打开扬声器
关闭扬声器直到乐曲结束
533H 时频率为 896Hz ,计数初值 =533H*896/ 频率
比较 dl(10ms) 不同即可计数并比较音符时长
转 37页