第 7 章 MC9S12 单片机 ECT 模块
description
Transcript of 第 7 章 MC9S12 单片机 ECT 模块
第七章 IO 接口及增强型捕捉定时器模块
第 7 章 MC9S12 单片机 ECT 模块
山东大学控制科学与工程学院
2010.7
第七章 IO 接口及增强型捕捉定时器模块
MC9S12 系列单片机增强型定时器模块是在标准定时器模块的基础上添加了新的功能。
定时器的核心是一个 16 位的可编程计数器,计数的频率可以通过分频来调整。
用途很多普通定时器的工作,例如脉冲计数、定时等可以用来测量输入的脉冲宽度产生我们需要的脉冲波形。
增强型定时器 ECT 模块
第七章 IO 接口及增强型捕捉定时器模块
ECT 模块的组成: 1 个预分频器 1 个 16 位自由运行计数器 8 个 16 位 IC/OC 通道 2 个 16 位( 4 个 8 位)脉
冲累加器 1 个 16 位模数递减计数器
第七章 IO 接口及增强型捕捉定时器模块
输入捕捉功能是用来监测外部的事件和输入信号。 当外部事件发生或信号发生变化时,在指定的输入捕捉引脚
上发生一个指定的沿跳变(可以指定该跳变是上升沿还是下降沿)。定时器捕捉到特定的沿跳变后,把计数寄存器当前的值锁存到通道寄存器。
如果输入捕捉控制寄存器中设定允许输入捕捉中断,系统会产生一次输入捕捉中断,利用中断处理程序可以得到事件发生的时刻或信号发生变化的时刻。
触发沿选择触发事件16 位捕捉锁存器
16 位计数器
计数器时钟
输入捕捉
第七章 IO 接口及增强型捕捉定时器模块
在特定的时刻在管脚上输出特定电平,用来控制外电路工作。 原理是:输出比较寄存器的值和计数器的值每隔 4 个总线周期
比较一次,当两个值相等的时候,会在该通道的引脚上输出预先规定的电平。
如果输出比较中断允许,还会产生一个硬件的定时中断。 输出比较最简单和最常用的功能就是产生一定间隔的脉冲。
16 位输出比较寄存器
比较器
16 位计数器
计数器时钟
输出比较
第七章 IO 接口及增强型捕捉定时器模块
输入捕捉 / 输出比较通道 有 8 个输入捕捉输出比较通道。共有 8 个外部引
脚,分别为 IOC0—IOC7 ,与 PORTT 复用。 通过选择 TIOS 寄存器的 IOSx 位可以选择是输
出比较还是输入捕捉。 对于输入捕捉:
带缓冲的输入捕捉通道 不带缓冲的输入捕捉通道
第七章 IO 接口及增强型捕捉定时器模块
不带缓冲的输入捕捉通道 8 个输入捕捉,其中 4 个( PT4~PT7 )带有一个捕捉寄
存器用来记录管脚上电平变化时自由计数器的锁存值。 捕捉寄存器 TCx
当输入覆盖控制寄存器( ICOVW )的 NOVWx 位清 0
时,每发生一次输入捕捉,新的计数器的值就会覆盖原来的输入捕捉寄存器的内容;
当该位置 1 时,除非输入捕捉寄存器为空,否则新的值不能写入(使输入捕捉寄存器为空的方法是读取该寄存器)。这样就避免了新的计数值覆盖旧的计数值。
ICOVW 复位时为 0x00 。
第七章 IO 接口及增强型捕捉定时器模块
带缓冲的输入捕捉通道PT0~PT3 是带缓冲的输入捕捉通道。 捕捉寄存器 TCx 保持寄存器 TCxH 。
可以在不产生中断的情况下,连续记录两次自由计数器的值。
入口设置了延迟计数器 用来提高抗干扰能力
第七章 IO 接口及增强型捕捉定时器模块
锁存方式: 每个有效的引脚事件只将自由定时器的值放入捕捉
寄存器 TCx ,而 TCx 到保持寄存器 TCxH 的传送必须依赖强制锁存命令才能实现 当模数计数器减为“ 0” 向模数计数器写入“ $0000” 写强制锁存位 ICLAT (输入控制系统控制寄存器 ICSY
S )
输入捕捉寄存器的值将锁存到相应通道的保持寄存器中,并将输入捕捉寄存器的值清零。
两种工作模式:( TCx 到保持寄存器 TCxH )
第七章 IO 接口及增强型捕捉定时器模块
队列方式TCx 与 TCxH 形成了一个类似先进先出
的队列,每个捕捉结果从 TCx 进入,然 后随着下一个捕捉结果的到来移入 TCxH 。
程序可以从 TCxH 取得结果,也可以直接从 TCx 取得捕捉结果。
第七章 IO 接口及增强型捕捉定时器模块
4 个 8 位的通道 PAC0-PAC3 组成
可以通过级联形成两个 16 位通道 PACA 、 PACB
通过检测相应管脚上的有效边缘来记录脉冲的个数。
各通道的 8 位累加器与 4 个缓冲 IC 通道相关联的,它们共享边沿检测与延迟电路。
脉冲累加器
第七章 IO 接口及增强型捕捉定时器模块
两种工作模式– 锁存方式:
• 通过锁存命令,将脉冲累加计数器的值锁存到相应通道的保持寄存器中
– 队列方式• 当读取某通道保持寄存器的值时,相应脉
冲累加器的值将被写入保持寄存器。
第七章 IO 接口及增强型捕捉定时器模块
16 位递减模数计数器 (MDC) 可以用作时钟基准,产生周期性的中断请求。
也可用于将 IC 寄存器和脉冲累加器的值锁存到各自的保持寄存器中。
模数递减计数器
第七章 IO 接口及增强型捕捉定时器模块
模数递减计数器( MCCNT ) 模数递减标志寄存器( MCFLG ) 模数递减控制寄存器( MCCTL ) 模数计数器由初值递减,递减到 0 时,会产生相应
的中断。 递减频率由总线时钟经分频得到。 初值可以由用户写入
第七章 IO 接口及增强型捕捉定时器模块
在模数模式允许后( MODMC=1 ),向模数递减计数器的写操作会更新预置数的值,模数计数器递减到 0 时,就会装载最新的预置数,
装载的操作也可以由置 MCCTL 寄存器的 FLM
C 位为 1 来强制执行。 总定时时间 = 预置数 × 总线周期 × 中断次数
第七章 IO 接口及增强型捕捉定时器模块
在中断程序中,需要清除相应的中断标志位( MCF
LG) ,并将中断次数减 1 ,当中断次数减为 0 时,一次延时就完成了。
第七章 IO 接口及增强型捕捉定时器模块
第七章 IO 接口及增强型捕捉定时器模块
三个例子
举三个例子讲述本节内容– 流水灯显示– 使用输入捕捉功能,对外来脉冲进行计数– 使用输出比较功能,输出一个具有一定宽
度的高电平脉冲
第七章 IO 接口及增强型捕捉定时器模块
ECT 计数寄存器( TCNT )
TCNT 为自由计数器的计数值,本例通过读取它的值实现延时。这是一个 16 位的加法计数器,最大值为 65535 。任意时刻可读,正常模式下写操作无效。
第七章 IO 接口及增强型捕捉定时器模块ECT 控制寄存器 1 ( TSCR1 )
必须设置 TSCR1 才可以使主定时器工作,需要在 ECT 模块初始化时就设置好。
TEN=1 :主定时器使能。 0= 主定时器禁止,进入低功耗状态。TSWAI=0 :等待模式时主定时器继续工作,方便调试。 0= 停止工作。TSFRZ=0 :冻结模式时主定时器继续工作。 0= 停止工作。TFFCA=0 :自动清除标志位。 1= 手动清除。
本例设置 TSCR1=0x80 。
第七章 IO 接口及增强型捕捉定时器模块ECT 控制寄存器二( TSCR2 )
TOI :禁止定时器溢出中断。 1= 允许。TCRE :定时计数器复位允许 。 0= 禁止复位,计数器自由计数。 1= 允许复位。
进行完一次输出比较时,可以使定时计数器复位PR2 、 PR1 、 PR0 :预分频因子选择
第七章 IO 接口及增强型捕捉定时器模块
void TimerOverflow(void){
unsigned char i=1,j=0x80;while((i!=0)&&(j!=0)){PORTA=(i|j);i<<=1;j>>=1;while(TCNT!=0x0000); // 延时while(TCNT==0x0000);}
}void main(void){
EnableInterrupts;TSCR1=0x80; // 定时器使能TSCR2=0x07; // 分频系数为 128DDRA=0xff;PORTA=0xff;for(;;){TimerOverflow();}
}
流水灯的显示PORTA 输出
调用函数
设置控制寄存器1
设置控制寄存器2
延时控制
第七章 IO 接口及增强型捕捉定时器模块
while(TCNT!=0x0000);
while(TCNT==0x0000);
这两句的含义是: TCNT 开始计数后值不为 0 ,等待直到 TCNT 溢出返回 0 ,然后再等到 TCNT 不为 0 。为什么要弄两个 while ?
第七章 IO 接口及增强型捕捉定时器模块
例二:输入捕捉
利用输入捕捉 0 通道对外来的方波信号进行捕捉,采用中断的形式。中断发生后,读取捕捉后的计数值,并通过 PORTB 口使 LED 灯点亮以指示中断成功。
通道 0 设置为输入捕捉,采用双沿触发(上下沿均触发), IC0 开中断,可以进入中断服务程序。方波信号由 PORTA_BIT6 产生, PORTA_BIT6 和 IOC0 硬件连接。
第七章 IO 接口及增强型捕捉定时器模块
输入控制系统寄存器 -ICSYS
SHxy=0 :正常操作。 1=x 通道和 y 通道将产生一样的输入动作, x 通道的设置同样适用于 y 。TFMOD=0 :当出现有效的输入捕获事件, TFLG1 中的对应中断标志位 CxF 就置 1 。 1= 队列模式时才使用。PACMX=0 : 8 位脉冲累加器溢出后自动回 0 。 1= 不自动回 0 ,停留在 0xFF 。脉冲累加器对 IC 通道捕获的有效边沿数量进行计数。
第七章 IO 接口及增强型捕捉定时器模块
输入控制系统寄存器 -ICSYS
BUFEN=1 :使用输入捕获缓冲区。 0= 不使用。( 输入捕捉和脉冲累加器的保持寄存器 )LATQ=0 :输入捕获队列模式使能。产生一次成功的输入捕获时, IC 通道寄存器中保留的计数值会被送到保持器中,然后 IC 寄存器会接收新的计数值。1= 锁存模式使能。
ICSYS=0x02; //IC 缓冲使能
第七章 IO 接口及增强型捕捉定时器模块
TFLG1 :主定时器中断寄存器 1 BIT 7 6 5 4 3 2 1 0
RC7F C6F C5F C4F C3F C2F C1F C0F
W
RESET 0 0 0 0 0 0 0 0
TFLG1 指示了中断发生在哪个通道,需要对相应位清零时,可以对它进行置 1 操作。 C7F-C0F : IC/OC的中断标志。当 TSCR 寄存器中的 TFFCA 位被置位时,对于输入捕捉和输出比较通道的读写操作,将清除对应通道的CxF 位。
第七章 IO 接口及增强型捕捉定时器模块
定时器输入捕捉和输出比较寄存器TC0-TC7 寄存器:
用来锁存自由计数器的值,当得到有效的边沿触发时,我们可以通过读这些寄存器来获得输入捕捉计数值;通过写这些寄存器来设置输出比较的计数值。
任意时刻可读。在输出比较模式任何时刻可写。在输入捕捉模式对寄存器的写操作没有意义。当寄存器复位后,寄存器值等于 $0000 。
第七章 IO 接口及增强型捕捉定时器模块IC/OC 通道选择寄存器 --TIOS
IOSx : 1= 通道 x 为输出比较;
0= 通道 x 为输入捕获。
第七章 IO 接口及增强型捕捉定时器模块控制寄存器 3/4 — TCTL3/4
EDGnA/B :输入捕捉边沿控制。
本例设置 0x03(EDG0A=1 , EDG0B=1) 。即 IC0 通道采用上升,下降沿都触发。
n 代表通道序号。
第七章 IO 接口及增强型捕捉定时器模块
定时器中断使能寄存器 -TIE
CxI :1= 第 x 个通道中断允许;0= 第 x 个通道中断禁止。
第七章 IO 接口及增强型捕捉定时器模块例二:输入捕捉IC0 的初始化:void ic_init(void)
{
TSCR1= 0x90; // 主定时器使能 , 对 TCNT 访问即可清除标志
TSCR2=0x07; // 分频因子 =128
ICSYS=0x02; //IC 缓冲使能 ( 保持寄存器 )
TIOS=0; // 通道设置为输入捕获
TCTL4= 0xff; // 采用上升、下降沿触发
TIE=0b00000001; // 通道 0 开中断
}
第七章 IO 接口及增强型捕捉定时器模块例二:输入捕捉初始化好后,需要在 main 函数中调用初始化函数 ic_init() 。以下是在 main 函数中,如何使用 PORTA_BIT6 来产生一个方波信号。DDRA=0xff; // 设置 PORTA 的方向寄存器,为输出PORTA=0x00; //PORTA 的输出初始化为低电平DDRB=0xff; //PORTB 设置为 LED 灯的控制信号PORTB=0x00; //LED 全灭for(;;){
for(i=0;i<6000;i++){
PORTA_BIT6=1;// 循环中设置信号为高电平}for(i=0;i<6000;i++){PORTA_BIT6=0; // 循环中设置信号为低电平,产生方波 }
}
第七章 IO 接口及增强型捕捉定时器模块
例二:输入捕捉方波信号已经成功得产生了,下面是中断服务程序:
#pragma CODE_SEG NON_BANKED// 必须有这句
void interrupt 8 ic0_int(void){
TFLG1_C0F=1;// 中断标志清除ic4=TC0;
// 通过读 TC0 寄存器来响应中断, ic4 、 ic40 为用户定义的变量
dic4=ic4-ic40; ic40=ic4;
PORTB=0x55;// 用 LED 灯来指示已经进入了中断/* 以下放置其他代码 */
}
第七章 IO 接口及增强型捕捉定时器模块
强制输出比较寄存器 --CFORC
FOCx—x 通道强制输出比较
在相应的寄存器位写入强制输出比较命令,会立即使相应的通道处于输出比较状态。
第七章 IO 接口及增强型捕捉定时器模块定时器控制寄存器 1/2—TCTL1/2
OMn:输出模式 OLn:输出等级这 8 对控制位是用来指定输出比较的输出动作的,当 OMn 和 OLn 二者任意一个为 1 时, OCn 对应的端口会有相应的输出。如果需要用 OMn 和 OLn 来控制相应定时器端口的输出,则 OC7M 中的对应位必须清零。
第七章 IO 接口及增强型捕捉定时器模块
void oc_init()
{
TSCR2=0x07; 128 分频,定时器溢出中断禁止
TIOS=0x01; 通道 0 输出比较 TIE=0x01; 中断使能 TCTL2_OM0=1; 输出低电平 TCTL2_OL0=0;
TSCR1=0x90;
}
第七章 IO 接口及增强型捕捉定时器模块
void main(void)
{
EnableInterrupts;
DDRB=0x00;
PORTB=0xff;
DDRM=0xff;
PTM=0xff;
oc_init();
for(;;) {
}
第七章 IO 接口及增强型捕捉定时器模块
#pragma CODE_SEG NON_BANKED
void interrupt 8 oc0_int(void)
{
TCTL2_OM0=1;
TCTL2_OL0=!TCTL2_OL0;
PTM_PTM1=PORTB_BIT1;
TC0=TCNT+4000;
}
第七章 IO 接口及增强型捕捉定时器模块
谢谢!