定时器捕获Word格式.docx
《定时器捕获Word格式.docx》由会员分享,可在线阅读,更多相关《定时器捕获Word格式.docx(10页珍藏版)》请在冰点文库上搜索。
2-例程
#include<
msp430x14x.h>
unsignedintstart,end;
unsignedcharoverflow;
voidmain(void)
{
WDTCTL
=WDTPW+WDTHOLD;
//关闭看门狗定时器
P1DIR=BIT0+BIT4;
//设置P1.0方向为输出
P1SEL=BIT2;
//设置P1.2端口为功能模块使用
TACTL=TASSEL0+TACLR+TAIE+MC1;
//定时器A时钟信号选择ACLK,同时设置定时器A计数模式为连续增计模式
CCTL1=MC0+SCS+CAP+CCIE;
//输入上升沿捕获,CCI0A为捕获信号源
_EINT();
//中断允许
while
(1);
//LOOP
}
#pragmavector=TIMERA1_VECTOR
//定时器A中断处理
__interruptvoidtimer_a(void)
switch(TAIV)
//向量查询
{
case
2:
//捕获中断
if(CCTL1&
CM0)
//上升沿
{
CCTL1=(CCTL1&
(~CM0))|CM1;
//更变设置为下降沿触发
start=TAR;
//记录初始时间
overflow=0;
//溢出计数变量复位
}
elseif(CCTL1&
CM1)
//下降沿
(~CM1))|CM0;
//更变设置为上升沿触发
end=TAR;
//用start,end,overflow计算脉冲宽度
}
break;
case10:
//定时器溢出中断
overflow++;
//溢出计数加1
default:
//例程结束
-----------------------------------
msp430单片机定时器Timer_A
Timer_A定时器:
注:
msp430有两个16位定时器Timer_A和Timer_B.二者基本相同。
主要有TACTL,TAR,CCTL0,CCR0,CCTL1,CCR1,CCTL2,CCR2,TAIV几个寄存器。
其中最主要的是TACTL寄存器,它决定Timer_A的输入时钟信号,Timer_A的工作模式,Timer_A的开启与停止,中断的申请等。
定时器A大致可分为四个功能模块:
计数器、比较/捕获寄存器0、比较/捕获寄存器1、比较/捕获寄存器2。
计数器是主体它是一个开启和关闭的定时器,如果开启它就是一直在循环计数,只会有一个溢出中断,也就是当计数由0xffff到0时会产生一个中断。
那怎么实现定时功能呢?
这就要靠三个比较/捕获寄存器了以后用CCRx表示。
CCR0比较特殊,通过他可以改变计数器的最大计数值,也就是当计数器计数到CCR0的值时自动会将计数器清零。
但这需要设置相应的工作模式,模式列表如下:
0——停止模式,用于定时器的暂停
1——增计数模式,计数器计数到CCR0,再清零计数
2——连续计数模式,计数器增计数到0xffff,再清零计数
3——增/减计数模式,增计数到CCR0,再减计数到0
当计数器计数到CCR0时,CCR0单元会产生一个中断。
同样当计数器计数到CCR1和CCR2时,两个单元也都会个产生一个中断。
这样我们可以通过定时器A得到三个定时时间了。
看程序中的定时器初始化模块。
CCTLx是相应比较/捕获寄存器的控制寄存器。
它可对比较/捕获寄存器进行设置,在这里只用到比较功能,也就是当计数到CCRx时产生中断,由于CCTLx默认的是比较功能,所以一般也就只用到CCIE这个控制字,就是开启相应比较器的中断。
CCRx就是相应比较器的值。
下面介绍几个Timer_A的重要寄存器:
TACTL寄存器:
15~10
9
8
7
6
5
4
3
2
1
未用
SSEL1
SSEL0
ID1
ID0
MC1
MC0
CLR
TAIE
TALFG
SSEL_1SSEL_0是时钟源的选择
0——TACLK,使用外部引脚信号作为输入
1——ACLK,辅助时钟
2——SMCLK,子系统主时钟
3——INCLK,外部输入时钟
对TACTL进行模式设置的同时也开启了定时器,要停止只需把MC_0赋值给TACTL就可以。
ID1ID0是时钟源的分频选择
00——不分频
01——2分频
10——4分频
11——8分频
MC1MC0是模式选择
CLR——————定时器清楚位
TAIE——————定时器中断允许位
TAIFG——————定时器溢出标志位
TAR寄存器:
16位计数器,是执行计数的单元,是计数器的主体。
我的理解:
即存储你的计数值,0——>
CCR0
CCTLx寄存器:
捕获比较控制寄存器:
15/14
13/12
11
10
7/6/5
CAPTMOD1~0
CCIS1~0
SCS
SCCIx
CAP
OUTMODx
CCIEx
CCIx
OUT
COV
CCIFGx
CAPTMOD1~0:
选择捕获模式
00————禁止捕获模式
01————上升沿捕获
10————下降沿捕获
11————上升沿与下降沿都捕获
CCIS1~0:
捕获事件输入源
00————选择CCIxA
01————选择CCIxB
10————选择GND
11————选择Vcc
SCS——选择捕获信号与定时器时钟同步、异步关系
0:
异步捕获
1:
同步捕获(实际中经常使用同步模式,捕获总是有效的)
SCCIx——比较相等信号EQUx将选中的捕获/比较输入信号CCIx(CCIxA,CCIxB,Vcc和GND)进行锁存,然后可由SCCIx读出。
CAP——选择捕获模式还是比较模式。
比较模式
捕获模式
OUTMODx:
选择输出模式
000————输出
001————置位
010————PWM翻转/复位
011————PWM置位/复位
100————翻转
101————复位
110————PWM翻转/置位
111————PWM复位/置位
CCIEx——捕获/比较模块中断允许位
禁止中断
允许中断
CCIx——捕获/比较模块的输入信号
由CCIS0和CCIS1选择的输入信号可通过该位读出
CCIx复位
OUT——输出信号(如果OUTMODx选择输出模式0,则该位对应于输入状态)
输出低电平
输出高电平
COV——捕获溢出标志
没有捕获溢出
发生捕获溢出
当CAP=0时,选择比较模式。
捕获信号发生复位。
没有使COV置位的捕获事件
当CAP=1时,选择捕获模式。
如果捕获寄存器的值被读出前再次发生捕获事件,则COV置位。
程序检测COV来判断原值读出前是否又发生捕获事件。
读捕获寄存器时不会使溢出标志复位,须用软件复位。
CCIFGx——捕获比较中断标志
寄存器CCRx捕获了定时器TAR值时置位
定时器TAR值等于寄存器CCRx值时置位
//******************************************************************************
//Date:
2009.8.4
//Author:
xurafreedom
//Email:
freedomxura@/mxh20999@
//Blog:
//
//Description:
ToggleP3.4usingsoftwareandTA_0ISR.Togglesevery
//50000SMCLKcycles.SMCLKprovidesclocksourceforTACLK.
//DuringtheTA_0ISR,P3.4istoggledand50000clockcyclesareaddedto
//CCR0.TA_0ISRistriggeredevery50000cycles.CPUisnormallyoffand
//usedonlyduringTA_ISR.
//ACLK=n/a,MCLK=SMCLK=TACLK=defaultDCO~800kHz
//Softwarerelease:
IARAssemblerforMSP430V4.09A/W32(4.9.1.9)
/********************函数声明******************/
voidInitClock();
/********************主函数********************/
voidmain(void)
WDTCTL=WDTPW+WDTHOLD;
//StopWDT
InitClock();
//Initializetheclock
P3DIR|=BIT4;
//P3.4output
CCTL0=CCIE;
//CCR0interruptenabled
CCR0=500;
TACTL=TASSEL_2+MC_1;
//SMCLK,UptoCCR0mode
_BIS_SR(LPM0_bits+GIE);
//EnterLPM0w/interrupt
/*******************************************
函数名称:
InitClock
功能:
初始化时钟函数
参数:
无
返回值:
********************************************/
voidInitClock()
unsignedintoscdly;
BCSCTL1&
=~XT2OFF;
//------------清OSCOFF/XT2,使XT2振荡器有效
do
IFG1&
=~OFIFG;
//------------清OFIFG
oscdly=255;
while(oscdly--);
//------------延时等待
while(IFG1&
OFIFG);
//------------直到OFIFG=0为止
//-------------------------------------------------------------
DCOCTL|=DCO0+DCO1+DCO2;
//MaxDCO
BCSCTL1|=RSEL0+RSEL1+RSEL2;
//XT2on,maxRSEL
//这两句设置DCOCTL和BCSCTL1,设置DCO的频率
//一般来说,PUC复位之后,如果没有特定设置系统时钟MCLK,MCU将默
//认DCO振荡器产生的频率为系统时钟,不过如果设置BCSCTL2来选定
//MCLK的时钟源的话(如:
BCSCTL2|=SELM_2+SELS;
)系统时钟就是由
//XT2振荡而来.
//SMCLKandMCLKusesXT2
//这一句设置BCSCTL2,选定MCLK和SMCLK的时钟源
//注意:
ACLK只能来源于LFXT1.可以在BCSCTL1里设置ACLK的分频。
Timer_A
定时器A中断服务子函数,当
//TimerA0interruptserviceroutine
#pragmavector=TIMERA0_VECTOR
__interruptvoidTimer_A(void)
P3OUT^=BIT4;
//ToggleP3.4
------------------------------