-
XX
科技大学
Freescale
单片机原理与设计
实验报告
实验项目
TPM
编程应用
【实验目的】
1
、
理解
HCS08
的定时器
/PWM
模块
TP
M
(
Timer/Pulse-Width
Modulator
)模块原理
p>
2
、学会
TPM
模
块设计
3
、
进一步认识
“对
MCU
外部管脚
/
内部模块的控制正是通过
Regs
的控制来实现”
【实验原理】
MC9S08AW60
系列中的定时器系统包括两个独立的
TPM
:
一个
6
通道的
< br>TPM1
和一个
2
通道的
TPM2
。
TPM
模
块管脚和
I/O
管脚复用。定时器系统总共
8
个通道,每一个通道都可作为输入
捕捉、输出比较、或带
缓冲的边缘对齐
PWM
。每一个
TPM
的所
有通道
都可以
配置成
为带缓
冲的中
心对齐
脉宽调制
CPWM
(
buffered, center-aligned pulse-width modulation
)
。
每一个
TPM<
/p>
预
分频器的时钟源都可以独立选择总线时钟、固定系统时钟或外部
管脚对每个
TPM
,每个通道一个中断
,还有一个计数中止中断。
定时器系统的内部结构为:两个独
立的
TPM
每个
TPM
都由
1
个
16<
/p>
位的计数器与
n(n=6 or 2)
个
输入
/
输出通道组成;
每一个通
道都可作为输入捕捉、输出比较、或带缓冲的边缘对齐
PWM
。
TPM
模块自由计
数定时核心是一个
16
位的计数器。三种时
钟源之一经过分频之后的脉冲即作为定时器的计数脉冲;每过一
个计数脉冲,
Counter
便自动
+1
< br>,
Counter
加到
FFFF
后翻转到
$$0000
,
同时置溢出标志位
TOF
为
1
,
然后重新开始计数;
溢出时
若
TOIE
为
1
,
还会产生中断请求。
Fbus
和分频比的不同可以产生
不同的溢出时间间隔;但是这种自由计数定时方式定
时有限。只
读的
16
位
TPM
计数寄存器由两个字节寄存器
TPMxCNTH
和
TPMxCNTL
构成。
TPM
预
置
计
数
定
时
:
向
16
< br>位
模
数
计
数
寄
存
器
T
PMxMODH:TPMxMODL
写入一个确定的数值,
则计
数器每进行
一次计数都会将计数和模数计数寄存器的值进行比较,如果相同
就产生溢出,同时置溢出标志位
TOF
为
1
,然后重新开始计数,
溢出时若
TOIE
为
1
,还会产生中断
请求。
TPM
每个自由计数器包含三个寄存器:一个
8
位状态控制寄
存器(
TPMxSC
)
,一个
16
位计数器(
TPMxCNTH:TPMxCNTL
,
一个<
/p>
16
位模数寄存器
(
TPMxMODH:TPMxMODL
)
。
其中,
x=1/2
(
1
p>
)定时器
x
状态控制寄存器(
TPMxSC
)如下图:
其中,
TOF
为溢出标志位,为
0
则没有达到预置计数寄存器
中的值没有溢出
,
为
1
则达到了预置计数寄存器中的值
溢出。
TOIE
为定时溢出中断允许位,可读
< br>/
可写位用来允许定时器的溢出中
断。
< br>TOIE
为
1
,
TOF
为
1
时允许中断,复位
清
TOIE
。
定时器
x
状态控制寄存器(
TPMx
SC
)
CLKS[B:A]
与
PS[2:0]
功能如下图:
(
2
)定时
器
x
计数寄存器(
TPMxCNTH:
TPMxCNTL
)只读的
16
位
p>
TPM
计数寄存器由两个字节寄存器
TPM
xCNTH
和
TPMxCNTL
构成。
读两个字节中的任何一个字节都会把两个字节内容锁存进
内部缓冲器,直到另外一个字节
也被读取为止。这允许以任何顺
序读取连贯的
16
位寄存器。如下图:
(
3
)定时器
x
模数寄存器(
TPMxMODH:TPMxMODL
)
。可读
/
写的
TPM<
/p>
模数寄存器中包含
TPM
计数器的模数值
。
当
TPM
计数
器到达这个模数值后,
TPM
计数器在下一个时钟要么重新从
0x0000
开始计数(
CPWMS=
0
)
,要么从这个模数值往下减
1
p>
计数
(
CPWMS=1
)
,
同时溢出标志
TOF
(
Timer Overflow Flag
)
变为
1
。
只写
TPMxMODH
或者
TPMxMOD
L
其中的一个会抑制住
TOF
和
溢出中断直到些另外一个字节也被写为止,因此两个寄存器一定
都要写
,
不能只写一个而不管另一个。
复位会使
TPM
模数寄存器
为
0x0000<
/p>
,相当处于自由运行定时器计数模式(模数禁止)
。如
下图:
【实验装置】
Freescale
HC08
单片机,
CodeWarrior
开发环境
【实验内容】
⑴利用
TPM
,编程实现下列功能:利用两个
七段数码管,实现
00-59
秒显示:自动从
< br>00
开始,每一秒钟,数字加
1
;加到
59
之
后,自动回到
00
,重复开始;
⑵外
接
IRQ
按键,平时
00-59
自动加数显示,按
IRQ
按键一次
后,加数显示停止,再按一次
IRQ
按键,继续加
数显示。
【结果分析】
实验(
1
)最终实现了用
TPM2
模块精确定时半秒,再利用半
秒产生秒的各位和十位,
并把秒的各位和十位送到两位数码管上
显示。数码管采用动态扫描的方式显示。
TPM2_ISR
每隔
500ms
清零一次,对秒钟的高地位进行加处理。对
TPM2
溢出标志清零
首先读标志位,然后写
0
到标志位。实验结果显示正确。
实验(
2
)在(
1
)的基础上,增加了
IRQ
中断模块。每按一
次
IRQ
按键
FLAG
计数加
1
,然后取
FLAG
的最低位。若最低位
为
0
,则停
止秒计时,数码管显示时间保持不变;若最低位为
1
,
则正常计时、显示。这样就实现了按
IRQ
按键
一次后,加数显示
停止,再按一次
IRQ
按键,继续加数显示。
【实验代码】
(
1
)
INCLUDE
包含头文件
ORG $$0070
Half_Sec DS
1;
半秒时间变量
SEG_Select DS
1;
数码管位选变量
Second_L DS
1;
秒钟低位
Second_H
DS 1;
秒钟高位
NUM DS
1
COUNT DS 1
ORG
$$1860
LED_Table: DC.B
$$c0,$$f9,$$a4,$$b0,$$99,$$92,$$82,$$f8
字形码表
DC.B
$$80,$$90
recycle: MOV
#70t,NUM
;
软件延时
5ms
DBNZ
NUM,*
RTS
Delay_5ms:
MOV
#38t,COUNT
;LED
recall:
BSR
recycle
DBNZ
COUNT,recall
MOV
#07t,COUNT
DBNZ
COUNT,*
RTS
IO_Init:
MOV
#$$FF, PTGD
据寄存器
MOV
#$$FF,
PTDD
数据寄存器
MOV #$$FF, PTAD
存器
LDA
#%11111111
STA
PTADD
脚作为输出
STA
PTDDD
为输出
STA
PTGDD
为输出
RTS
;IO
初始化模块
;
初始化输出端口的数
;
初始化输出端口的
;
初始化输出端口的数据寄
;
初始化
PTA
口的八个管
;
初始化
PTD
口的八个管脚作
;
初始化
PTG
口的八个管脚作
;
子程序返回
TPM2_Init:
p>
;TPM2
模块中断方式初
始化子程序
p>
MOV
#$$4E,TPM2SC
;BUSCLK
< br>为
TPM2
时
钟源,
64
分频,允许
TPM2
中断
MOV #$$7A,TPM2MODH
MOV #$$12,TPM2MODL
CLI
RTS
TPM2_ISR:
子程序
LDA TPM2SC
BCLR
7,TPM2SC
标志位
INC Half_Sec
LDA Half_Sec
CMP #2T
BNE TPM2_END
MOV
#$$00,Half_Sec
半秒清零
INC Second_L
LDA Second_L
CMP #10T
;500ms
对应模数值
开总中断
;TPM2
溢出中断服务
;
先读标志位
T
EF
;
写
0
到
TEF
清
TEF
;
是否到了
1S
;
到则秒钟加一,
;
秒钟是否加到
10
;
BNE TPM2_END
MOV #$$00,Second_L
p>
:
到则秒钟各位清
零,十位加
1
INC
Second_H
LDA
Second_H
CMP
#6T
BNE TPM2_END
MOV #$$00,Second_H
TPM2_END:
RTI
Main:
CLRX
CLRA
CLRH
STA
$$1802
MOV #$$00,Half_Sec
MOV #$$00,Second_H
MOV #$$00,Second_L
JSR
IO_Init
端口初始化
JSR
TPM2_Init
AGAIN:
;
秒钟十位是否到
6
p>
;
到则秒钟
10
位
清零
;
禁止
COP
;
秒高位初始化
;
秒低位初始化
;
对
PTD
,
PTG
,
P
TA
;TPM2
初始化
-
-
-
-
-
-
-
-
-
上一篇:美国国防部架构框架DoDAF介绍
下一篇:IC读写EEPROM问题总结