当前位置:
文档之家› 第5章 定时器-计数器及编程
第5章 定时器-计数器及编程
例:利用Timer1的门控定时,测量施加在引脚T1CK上的正脉冲宽度
说明:主振荡器8MHz,PLL4倍频, 预分频系数=8,TMT1的计时分辨 率为0.5us。在Timer1的中断服务 程序中将TMR1送脉冲宽度存储单 元PulseT,并清零TMR1,为下一 个脉冲的测量作准备。
单片机及其应用
Int PulseT; //存储所测脉冲宽度,单位0.5us Int main(void) { TMR1=0; PR1=0xffff; //清TIMER1,置其周期寄存器为65535 SRbits.IPL=3; //CPU priority level IFSObits.T1IF=0; IPCObits.T1IP=4; //setup Timer1 interrupt priority level->4 IECOBIT.T1IE=1; //enable Timer1 interrupts T1CON=0X8050;//start Timer1:TON=1,TCS=0,TGATE=1,internal //instruction cycle, prescaler setting at 1:8 while(1){ SimPulseT( ); } //产生模拟脉冲,用于测试程序 } Void __attribute__((__interrupts__,no_auto_psv))__T1Interrupt(void) { PulseT=TMR1; //将所测脉冲宽度送PulseT单元 TMR1=0; //清Timer1计数器,准备下次测量 IFSObits.T1IF=0 ;//reset Timer1 interrupt flag and return from ISR
单片机及其应用
5.1 概述
C类定时器 大多数PIC24F器件中,如存在TIMER3和TIMER5,则他们是C类定时器。与 其他类型的定时器相比,C类定时器有下列独特的功能:
C类定时器可以和B类定时器相连形成32位定时器,C类定时器为32位 定时器的高16位。 在某个给定的器件上,至少有1个C类定时器能够触发A/D转换。 C类定时器无异步模式,它的工作总是与指令时钟同步。
单片机及其应用
5.3 工作模式
5.3.1 定时器模式(16位,非门控)
所有类型的定时器都可以工作于定时器模式。通过清零TCS控制位 (TxCON<1>)选择定时器模式。这时,定时器的输入时钟由内部系统时钟 (Fosc/2 )提供。 使能该模式时,对于1:1的预分频器设置,定时器的计数值在每个指令周 期都会递增。同步模式控制位TSYNC(TxCON<2>)在该模式下不起作用, 因为使用了系统时钟源作为定时器时钟。 设指令周期为Tcy,预分频系数为N,周期寄存器PRx赋值为X,则定时时间 为: T=Tcy×N×(X+1)
工作模式由各定时器模块的控制寄存器TxCON中的相应位控制: TCS(TxCON<1>):定时器时钟源控制位; TSYNC (TxCON<2>):定时器同步控制位(仅A类定时器有); TGATE(TxCON<6>):定时器门控控制位; TON(TxCON<15>):使能或禁止每个定时器模块 。
单片机及其应用
5.1 概述
B类定时器 大多数PIC24F器件中,如存在TIMER2和TIMER4,则他们是B类定时器。与 其他类型的定时器相比,B类定时器有下列独特的功能:
B类定时器的TxCON寄存器有一个T32控制位,若将位T32置为“1”,则 B类定时器和C类定时器相连形成32位定时器,B类定时器为32位定时器的 低16位。Timer2+Timer3; Timer4+Timer5。 B类定时器无异步模式,它的工作总是与指令时钟同步,在预分频逻 辑后执行。
单片机及其应用
Int main(void) { TMR1=0; PR1=1999; IFSObits.T1IF=0; SRbits.IPL=3; //Setup CPU priority level->3 IPCObits.T1IP=4; //setup Timer1 interrupt priority level->4 IECOBIT.T1IE=1; //enable Timer1 interrupts TRISD=0XFFFE; //Set RD0 as OUT T1CON=0X8010;//start Timer1:TON=1,TCS=0,TGATE=0,internal //instruction cycle, prescaler setting at 1:8 while(1){ ; } //recycle } Void __attribute__((__interrupts__,no_auto_psv))__T1Interrupt(void) { if(TD0) TD0=0; else TD0=1; IFSObits.T1IF=0 ;//reset Timer1 interrupt flag and return from ISR }
单片机及其应用
定时器模块的寄存器均是16位可读、可写寄存器。 TMRx /计数工作寄存器,它是增量型计数器,计数脉冲来源取决于控 工作在定时器方式时(TCS=“0”),若将控制寄存器 控制寄存器 PRx是定时 是周期寄存器,当 TxCON 中的TON TMRx 位控制定时器的运行 寄存器中的计数值与 /停止。将 PRx寄存器中值相同时(即 TxCON TON 中门控位 位置“1TGATE ”,启 制寄存器 TxCON中的TCS 位。 置为“ 动定时器工作;若将 “周期匹配”),中断标志位 1”,则定时器工作需同时满足 TON 位清“0 TXiF ”,则定时器停止工作, 置“ TON位为“ 1”,若允许该定时器中断,则向 1”和引脚TxCK TMRx为“ 寄存器保持其 1” 若TCS=“0”,则计数脉冲来源于片内的系统时钟 ,即指令周期 Tcy, 若TCS=“1”,则该定时器模块作计数器使用,计数脉冲来源于引脚 TxCLK (高电平)两个条件,且当引脚 原来的计数值。分频系数由控制寄存器 CPU申请中断。*产生周期匹配时 TxCK TMRx 由高电平变低电平时,即下跳沿,置 寄存器不会清零,而是在产生周期匹 TxCON中的fosc/2 TCKPS<1:0> 位设置。 信号,这时作为定时器使用。 在其信号上沿使 TMRx 寄存器加 1申请中断。这种方式为门控定时器模式。 ; 中断标志位 配后的下一时钟脉冲 TxIF为“ 1”,向 TMRx寄存器才清零。当周期寄存器 CPU PRx的值为0时,定 时器不能工作,周期匹配也不会产生定时器中断。
单片机及其应用
5.2 控制寄存器——定时器控制寄存器TxCON(A类)
单片机及其应用
5.2 控制寄存器——定时器控制寄存器TxCON(B类)
单片机及其应用
5.2 控制寄存器——定时器控制寄存器TxCON(C类)
单片机及其应用
5.3 工作模式
每个定时器模块均可工作在以下几种模式之一: 定时器模式; 同步计数器模式; 门控定时器模式; 异步计数器模式(TIMER1定时器)。
单片机及其应用
例:使用系统时钟的16位定时器的初始化代码 ——Enable Timer1 interrupts, load the Timer period register and start Timer1. T1CON=0x00; //stops the Timer1 and reset control register TMR1=0X00; //clear contents of the timer register PR1=0xFFFF; //load the period register with the value 0xffff IPCObits.T1IP=0x01; //setup Timer1 interrupt for desired //priority level- assigns level 1 priority IFSObits.T1IF=0; //clear the Timer1 interrupt status flag IECObits.T1IE=1; // Enable Timer1 interrupts T1CONbits.TON=1; //Start Timer1 with prescaler settings at 1:1 and clock //source set to the internal instruction cycle Void _ _attribute__((__interrupt__, __shadow__))_T1Interrupt(void) { /* Interrupt service routine code goes here */ IFSObits.T1IF=0; //Reset Timer1 interrupt flag and return from ISR }
大多数PIC24F芯片为5个16位的定时器,只有少数几种14pin、20pin和 28pin封装的KA系列(如PIC24F04KA201)为3个16位的定时器。而PIC24H 系列中有十几种型号的芯片有9个16位的定时器。
单片机及其应用
5.ቤተ መጻሕፍቲ ባይዱ 概述
PIC24系列的每个定时器模块都有3个16位可读/写的寄存器:TMRx、PRx 和TxCON。其中: TMRx:16位定时器寄存器,即工作寄存器(为“加”计数器)。 PRx: 定时器的16位周期寄存器。 TxCON:定时器的16位控制寄存器。
单片机及其应用
例:设主振荡器8MHz, PLL4倍频,利用Timer1定时,使端口RD的RD0输出周期 为2ms的方波,即每1ms改变一次RD0的电平 由条件:指令时钟Fcy=Fosc/2=32MHz/2=16MHz, 定时时间T=1ms=1000μs.设 TCKPS<1:0>=01(预分频系数=8),周期寄存器PR1所赋值为X,则 1000 = 1/16 * 8 * (X+1) X= 1000*16/8 – 1=1999 #include “P24fj64ga006.h” _CONFIG1(JTAGEN_OFF & GCP_OFF & GWRP_OFF & BKBUG_ON & COE_OFF & ICS_PGx1 & FWDTEN_OFF & FWPSA_PR32 & WDTPS_PS256) _CONFIG2(IESO_OFF & FNOSC_PRIPLL & FCKSM_CSDCMD &OSCIOFNC_OFF & POSCMOD_XT)