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