社区导航

 

搜索
查看: 78|回复: 0

[资料分享] MSP430单片机定时器TA中断 程序

[复制链接]

1280

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2019-10-8 22:20 | 显示全部楼层 |阅读模式

关于本程序的详细解说大家可以下载电子书点击上图即可
原书一共有4个程序
程序1

  1.  
  2. #include  <msp430x41x.h>
  3. void main(void)
  4. {
  5.   WDTCTL = WDTPW + WDTHOLD;                       // 停止看门狗
  6.   FLL_CTL0 |= XCAP18PF;                         // 配置晶振负载电容
  7.   P1DIR |= BIT3;                                  // 设置P1.3为输出脚
  8.   TACCTL0 |= CCIE;                                // 允许比较/捕获模块0的中断
  9.   TACCR0 = 3277-1;                                //100ms约3277个ACLK周期
  10.   TACTL = TASSEL_1 + MC_1;                      //TA设为增计数模式,时钟=ACLK
  11.   _EINT();
  12.   LPM3;
  13. }
  14.  
  15. #pragma vector=TIMERA0_VECTOR
  16. __interrupt void TACCR0_ISR (void)              // 计至TACCR0中断
  17. {
  18.     P1OUT ^= BIT3;                              // P1.3取反
  19. }
复制代码


程序2

  1. #include  <msp430x41x.h>
  2. void main(void)
  3. {
  4.   WDTCTL = WDTPW + WDTHOLD;                    // 停止看门狗
  5.   FLL_CTL0 |= XCAP18PF;                 // 配置晶振负载电容
  6.   P1DIR |= BIT3+BIT1+BIT4;              // 设置P1.3、P1.1、P1.4为输出脚
  7.  
  8.   TACCR0 = 32768-1;                        // 1秒=32768个ACLK周期
  9.   TACCR1 = 6554-1;                        // 0.2秒=6554个ACLK周期
  10.   TACCR2 = 29938-1;                        // 0.7秒=29938个ACLK周期  
  11.   TACTL = TASSEL_1 + MC_1;              // TA设为增计数模式,时钟=ACLK
  12.   TACTL |= TAIE;                        // 允许TA溢出中断
  13.   TACCTL1 |= CCIE;                      // 允许比较/捕获模块1的中断
  14.   TACCTL2 |= CCIE;                      // 允许比较/捕获模块2的中断    
  15.   _EINT();
  16.   while(1)
  17.   {
  18.      //                                 CPU可以执行其他任务
  19.   }
  20. }
  21.  
  22. #pragma vector=TIMERA1_VECTOR
  23. __interrupt void TA_ISR(void)
  24. {
  25.   switch( TAIV )
  26.   {
  27.     case  2:    P1OUT &=~( BIT3+BIT1+BIT4);           
  28.                 P1OUT |= BIT1;           //TACCR1~TACCR2阶段只亮绿灯 
  29.                 break; 
  30.     case  4:    P1OUT &=~( BIT3+BIT1+BIT4);           
  31.                 P1OUT |= BIT4;           //TACCR2~0阶段只亮蓝灯
  32.                 break;                          
  33.     case 10:    P1OUT &=~( BIT3+BIT1+BIT4);           
  34.                 P1OUT |= BIT3;           //0~TACCR1阶段只亮红灯
  35.                 break;
  36.   }
  37. }
复制代码


程序3

  1. #include  <msp430x41x.h>
  2. void main(void)
  3. {
  4.   WDTCTL = WDTPW + WDTHOLD;                    // 停止看门狗
  5.   FLL_CTL0 |= XCAP18PF;                 // 配置晶振负载电容
  6.   P1DIR |= BIT3 + BIT4;                      // 设置P1.3、P1.4为输出脚
  7.   TACTL |= MC_1 + TASSEL_1 + ID_0; //定时器TA设为增量计数模式,ACLK 
  8.   TACCR0=328-1;               //PWM总周期 =328个ACLK周期约等于100Hz
  9.   TACCR1=246;                //TA1占空比 = 246/328= 75%
  10.   TACCR2=164;                //TA2占空比 = 164/328= 50%
  11.   TACTL |= TAIE;                                // 允许TA溢出中断
  12.   TACCTL1 |= CCIE;                              // 允许比较/捕获模块1的中断
  13.   TACCTL2 |= CCIE;                              // 允许比较/捕获模块2的中断    
  14.   _EINT();
  15.   while(1)
  16.   {
  17.      //... ...                                         // CPU可以执行其他任务
  18.   }
  19. }
  20. #pragma vector=TIMERA1_VECTOR
  21. __interrupt void TA_ISR(void)
  22. {
  23.   switch( TAIV )
  24.   {
  25.     case  2:    P1OUT &=~ BIT3;                   //计至TACCR1,P1.3置低 
  26.                 break; 
  27.     case  4:    P1OUT &=~ BIT4;                   //计至TACCR2,P1.4置低 
  28.                 break;                          
  29.     case 10:    P1OUT |=( BIT3 + BIT4);        //计至TACCR0,置高
  30.                 break;
  31.   }
  32. }
复制代码


程序4

  1. #include  <msp430x41x.h>
  2. int Result;
  3. int TA_OverflowCnt;                        //TA溢出次数存放变量
  4. unsigned long int ExeTime;                //执行时间存放变量
  5. /****************************************************************
  6. 运行时间待测函数1:求两个浮点数之和
  7. ****************************************************************/
  8. float FloatSum(float x ,float y)  /*226个指令周期*/
  9. {
  10.   return(x+y);
  11. }
  12. /****************************************************************
  13.                      运行时间待测函数2:求两个定点数之和
  14. ****************************************************************/
  15. int IntSum(int x ,int y)          /*17个指令周期*/
  16. {
  17.   return(x+y);
  18. }
  19. /****************************************************************
  20.                      运行时间待测函数3: 软件延时
  21. ****************************************************************/
  22. void Delay()                          /*774030个指令周期*/
  23. {  int i,j;
  24.    for(i=0;i<1234;i++)
  25.    {
  26.      for(j=0;j<123;j++);
  27.    }
  28. }
  29.  
  30. void main(void)
  31. {
  32.  
  33.   WDTCTL = WDTPW + WDTHOLD;                            // 停止看门狗
  34.   FLL_CTL0 |= XCAP18PF;                         // 配置晶振负载电容
  35.   _EINT();                                              // 总中断允许
  36.   while(1)
  37.   {
  38. //-------------------------测量定时器的固有延迟-------------------------
  39.     TACTL = TASSEL_2 + MC_2 + TAIE + TACLR; // TA清零并开始计时   
  40.     TACTL = TASSEL_2 + MC_0;            // TA停止计时
  41.     ExeTime=TAR;                        // 读取TA计数值,就是固有延迟时间
  42.     _NOP();                                // 在这一行设断点观察
  43. //-----------------------测量浮点求和函数的执行时间----------------------
  44.     TACTL = TASSEL_2 + MC_2 + TAIE + TACLR; // TA清零并开始计时   
  45.     Result=FloatSum(12345 ,12456);                // 执行待测函数1
  46.     TACTL = TASSEL_2 + MC_0;                           // TA停止计时
  47.     ExeTime=TAR;                                // 读取TA计数值,就是执行时间
  48.     _NOP();                                        // 在这一行设断点观察
  49. //-----------------------测量定点求和函数的执行时间-------------------
  50.     TACTL = TASSEL_2 + MC_2 + TAIE + TACLR; // TA清零并开始计时
  51.     Result= IntSum(12345 ,12456);        // 执行待测函数2
  52.     TACTL = TASSEL_2 + MC_0;            // TA停止计时   
  53.     ExeTime=TAR;                        // 读取TA计数值,就是执行时间
  54.     _NOP();                                // 在这一行设断点观察
  55. //----------------------测量延迟和函数的执行时间--------------------
  56.     TA_OverflowCnt=0;        // 长执行时间函数TA会溢出,用一变量计数溢出次数
  57.     TACTL = TASSEL_2 + MC_2 + TAIE + TACLR;     // TA清零并开始计时
  58.     Delay();                                        // 执行待测函数3
  59.     TACTL = TASSEL_2 + MC_0;                    // TA停止计时   
  60.     ExeTime=TA_OverflowCnt*65536+TAR; // 读取TA计数值及溢出次数,计算执行时间
  61.     _NOP();                                  // 在这一行设断点观察
  62.   }
  63. }
  64. #pragma vector=TIMERA1_VECTOR
  65. __interrupt void TA_ISR(void)
  66. {
  67.   switch( TAIV )
  68.   {
  69.     case  2:   break; 
  70.     case  4:   break;                          
  71.     case 10:  TA_OverflowCnt++;                //TA每次溢出,溢出次数变量+1
  72.                 break;
  73.   }
  74. }  
复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

关闭

站长推荐上一条 /5 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2019-11-16 08:08 , Processed in 0.086682 second(s), 18 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表