标题:
MSP430单片机定时器TA捕获程序
[打印本页]
作者:
51hei单片
时间:
2016-3-14 18:44
标题:
MSP430单片机定时器TA捕获程序
本程序是《MSP430系列单片机系统工程设计与实践》书里面的源码,完整例程下载(包含工程文件(例2.8.27))):
http://www.51hei.com/bbs/dpj-46245-1.html
‘
关于本程序的详细解说大家可以下载电子书点击上图即可
#include <msp430x42x.h>
#include "LCD_Display.h"
unsigned int TA_OverflowCnt; // TA溢出次数存放变量
unsigned long int Period; // 脉宽测量结果存放变量
unsigned int RiseCapVal; // 上升沿时刻捕获值存放变量
unsigned char Edge=0; // 当前触发沿
#define RISE 0
#define FALL 1
void main( void )
{
WDTCTL = WDTPW + WDTHOLD; // 停止看门狗
FLL_CTL0 |= XCAP18PF; // 配置晶振负载电容
P1DIR &=~(BIT2); // P1.2(TA1)设为输入(可省略)
P1SEL |= BIT2; // P1.2设为第二功能(TA1)
TACTL = TASSEL_2 + MC_2 + TAIE + TACLR; // TA连续计数,开始计时,SMCLK,开中断
TACCTL1 = CAP + CM_1 + CCIS_1 + SCS + CCIE;
//捕获模块1启动,选择TA1(P1.2)引脚作为捕获源,上升沿捕获,同步模式,开启捕获中断
BTCTL=0;
LCD_Init();
_EINT(); // 总中断允许
LPM0; // 进入低功耗模式3休眠,全部程序在中断内执行
}
#pragma vector=TIMERA1_VECTOR
__interrupt void TA_ISR(void) //Timer_A中断
{
switch( TAIV )
{
case 2: // 比较/捕获模块1中断
if(Edge==RISE) //如果是上升沿的捕获中断
{
RiseCapVal=TACCR1; //保存上升沿时刻捕获值
TACCTL1 = CAP +CM_2 +CCIS_1 +SCS +CCIE;//改为下降沿触发
Edge=FALL; //触发沿状态标志
}
else //如果是下降沿的捕获中断
{
Period=TA_OverflowCnt*65536 + TACCR1 - RiseCapVal;//计算周期
TA_OverflowCnt=0; //溢出次数清零
TACCTL1 = CAP +CM_2 +CCIS_1 +SCS +CCIE;//改为上升沿触发
Edge=FALL; //触发沿状态标志
LCD_DisplayLongNumber(Period); //显示
}
break;
case 4: break;
case 10: TA_OverflowCnt++; //TA每次溢出,溢出次数变量+1
break;
}
}
复制代码
作者:
51hei单片
时间:
2016-3-14 18:45
#include <msp430x42x.h>
#include "LCD_Display.h"
unsigned int TA_OverflowCnt; // TA溢出次数存放变量
unsigned long int Period; // 周期测量结果存放变量
unsigned int PervCapVal; // 前一次捕获值存放变量
void main( void )
{
WDTCTL = WDTPW + WDTHOLD; // 停止看门狗
FLL_CTL0 |= XCAP18PF; // 配置晶振负载电容
P1DIR &=~(BIT2); // P1.2(TA1)设为输入(可省略)
P1SEL |= BIT2; // P1.2设为第二功能(TA1)
TACTL = TASSEL_2 + MC_2 + TAIE + TACLR; // TA连续计数,开始计时,SMCLK,开中断
TACCTL1 = CAP + CM_1 + CCIS_1 + SCS + CCIE;
//捕获模块1启动,选择TA1(P1.2)引脚作为捕获源,上升沿捕获,同步模式,开启捕获中断
BTCTL=0;
LCD_Init();
_EINT(); // 总中断允许
LPM0; // 进入低功耗模式3休眠,全部程序在中断内执行
}
#pragma vector=TIMERA1_VECTOR
__interrupt void TA_ISR(void) //计满至65536溢出
{
switch( TAIV )
{
case 2: Period=TA_OverflowCnt*65536 + TACCR1 - PervCapVal;//计算周期
PervCapVal=TACCR1; //保存捕获值,供下一次使用
TA_OverflowCnt=0; //溢出次数清零
LCD_DisplayLongNumber(Period); //显示
break;
case 4: break;
case 10: TA_OverflowCnt++; //TA每次溢出,溢出次数变量+1
break;
}
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1