网站公告列表     本站开通全国范围代收货款业务,详情请点击  [dycxin  2008年5月14日]        
加入收藏
设为首页
联系站长
您现在的位置: EDA加油站 >> MSP430 >> MSP430入门 >> 基础知识 >> 正文
  [推荐]MSP430F149 定时器           ★★★ 【字体:
MSP430F149 定时器
MSP430F149 定时器
作者:未知    MSP430来源:本站原创    点击数:    更新时间:2008-10-21    

(1)利用定时器A的模式2(连续)实现的定时资料

利用定时器A的模式2(连续)实现的定时资料 在程序中对TACTL的控制,当TACTL为如下的赋值时

TACTL = TASSEL_2 + MC_2 + TAIE;           // SMCLK, contmode, interrupt

可以改变TASSEL_X来实现不同的定时,

当为TASSEL_1时选ACLK为定时时钟,可以实现最短2S的定时,其次为2S的倍数的定时。

当为TASSEL_2时选 SMCLK为定时时钟,定时取决于SMCLK的时钟源,

1、SMCLK选 DCO = 800KHZ为时钟源,最短定时时间 为 0.08S 的定时,其次为其倍数。
2、SMCLK选 XT2也即外部高频晶振,此时定时取决于晶振频率,及其对分频的设置上。主要是设置BCSCTL1及     BCSCTS2.

   BCSCTL1 &=  ~XT2OFF;
  BCSCTL2 |= SELS + DIVS_3;

通过对上面两句的不同设置,可实现不同的延时。

 

/******************************************************************************
//  MSP-FET430P140 Demo - Timer_A, Toggle P3.4, Overflow ISR, DCO SMCLK
//
//  Description: Toggle P3.4 using software and Timer_A overflow ISR.
//  In this example an ISR triggers when TA overflows. Inside the TA
//  overflow ISR P3.4 is toggled. Toggle rate is approximatlely 12Hz.
//  Proper use of the TAIV interrupt vector generator is demonstrated.
//  ACLK = n/a, MCLK = SMCLK = TACLK = default DCO ~800kHz
//
//           MSP430F149
//         ---------------
//     /||            XIN|-
//      | |               |
//      --|RST        XOUT|-
//        |               |
//        |           P3.4|-->LED
//
//  Dasheng
//  LiTian Electronic Inc.
//  Feb 2008
//  Built with IAR Embedded Workbench Version: 3.42A
功    能: 由定时器A,采用800KHz的DCO,来实现近一秒的定时中断;
计算方法: T = 1/800,000 = 1.25uS so 根据连续计数模式,当计到0XFFFF时,发生溢出中断
因此溢出一次的时间是: 65536*1.25 = 0.0819S,所以计时1秒需12次溢出。
******************************************************************************/

#include 

typedef unsigned char uchar;
typedef unsigned int  uint;
uchar flag=0;

void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  BCSCTL1 &=  ~XT2OFF;
  BCSCTL2 |= SELS + DIVS_3;

 P3DIR |= BIT4;

  TACTL = TASSEL_2 + MC_2 + TAIE;           // SMCLK, contmode, interrupt
  _BIS_SR(LPM0_bits + GIE);                 // Enter LPM0 w/ interrupt

}
// Timer_A3 Interrupt Vector (TAIV) handler
#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A(void)
{
 switch( TAIV )
 {
   case  2: break;                          // CCR1 not used
   case  4: break;                          // CCR2 not used
   case 10: P4OUT ^= BIT5;                  // overflow
            break;
 }
}

/*

// Timer A0 interrupt service routine
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
  P4OUT ^= BIT5;                       // Toggle P3.4
}

*/

(2)利用定时器A的模式1(上升)实现的定时资料

此时要用到TACCTL0 及 TACCR0 ,根据设定的不同的TACCR0及不同的TASSEL_X即可实现不同的定时。

但此时的中断程序要改变。

对定时器A的中断的说明:

1、TIMERA1_VECTOR  的中断地址为 0XFFEA, 此中断入口地址包含3个中断源,属于多源中断,通过TAIV的值,可以知道是哪个源的中断,当TAIV 为0X02H时  中断源为  TACCR1  CCR1IFG

                                      当TAIV 为0X04H时,中断源为 TACCR2  CCR2IFG

                                      当TAIV 为0X0AH时,中断源为 TA OVERFLOW TAIFG

2、TIMERA0_VECTOR  的中断地址为 0XFFEC  为单源中断,中断源为TACCR0 CCR0IFG

 

对定时时间的说明:

当TASSEL_1时,选ACLK = 32.768KHZ,此时根据选取不同的TACCR0来实现不同的延时,

当TASSEL_2时,选SMCLK = DCO 时,~~~~~~~~~~~~~~~~~~~~~

                            选SMCLK = XT2时,~~~~~~~~~~~~~~~~

关键语句:

TACTL = TASSEL_X + MC_1;

TACCR0 = ~~~~~~~;

TACCTL0 = CCIE;

(3)、利用定时器A的比较模式,及输出模式4和连续计数模式可实现同时实现4个独立的定时间隔,或4种不同的频率输出。

在实验的过程中,同时驱动数码管的4个段。  

在比较模式下主要区分TACCR0 TACCR1 TACCR2 及TAIFG,的中断向量及入口地址,及输出模式(共8种)

 

其程序如下:

#include 

typedef unsigned char uchar;
typedef unsigned int  uint;
uchar flag=0;
uchar table[] = {0x18,0x7e,0x51,0x52,0x36,0x92,0x90,0x5E,0x10,0x12}; //对应0---9的共阳极码
void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  //BCSCTL1 |=  XT2OFF;
  //BCSCTL2 |= SELS + DIVS_3;
  TACCTL0 = OUTMOD_4 +CCIE ;  //Enable interrupt
  TACCTL1 = OUTMOD_4 +CCIE ;
  TACCTL2 = OUTMOD_4 +CCIE ;

  TACCR1 = 0X8000;
  TACCR2 = 0X2000;
  TACCR0 = 0XF000;
  P3DIR |= BIT6 + BIT7;                            // P3.4 output
  P3OUT |= BIT6 + BIT7;
  P4DIR = 0XFF;
  P4OUT = 0XFF;
  TACTL = TASSEL_2 + MC_2 + TAIE;           // SMCLK, contmode, interrupt
  _BIS_SR(LPM0_bits + GIE);                 // Enter LPM0 w/ interrupt

}
/**/
// Timer_A3 Interrupt Vector (TAIV) handler
#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A(void)
{
 switch( TAIV )
 {
   case  2: P4OUT ^= BIT5; TACCR1 += 0X8000;break;                          // CCR1 not used
   case  4: P4OUT ^= BIT3;TACCR2 += 0X2000;break;                          // CCR2 not used
   case 10: flag++;
   if(flag==12){P4OUT ^= BIT2; flag = 0;    }             // overflow
            break;//flag++;
 }
}

/**/
// Timer A0 interrupt service routine
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer0_A (void)
{
  P4OUT ^= BIT4;                       // Toggle P3.4
  TACCR0 += 0XF000;
}

MSP430录入:dycxin    责任编辑:dycxin 
  • 上一篇MSP430:

  • 下一篇MSP430:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
    MSP430和实时时钟HT1381的接…
    MSP430与DS18B20的C程序
    MSP430 Flash编程程序
    msp430的定时器
    MSP430AD转换
    MSP430常见问题与解答
    MSP4250 AD和端口问题
    MSP430与ATMEL 93C46通讯子程…
    MSP430 串口函数
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    EDA加油站|我要EDA网|山东电子网--东营市荣燕商贸有限公司版权所有! 站长:阿荣
    联系电话:0546-7870320,13371507828 电邮:51edacn@163.com
    山东东营西城济南路百祥电脑商城B302室 邮编:257000 鲁ICP备07018763号  鲁ICP备07000091号 鲁ICP备05003434号
    公司帐号:1615011209000037682 户名:东营市荣燕商贸有限公司 开户行:工行西城支行石油大学分理处