1193|0

1140

帖子

0

TA的资源

纯净的硅(初级)

楼主
 

MSP430单片机定时器TA中断 程序 [复制链接]

关于本程序的详细解说大家可以下载电子书点击上图即可
原书一共有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. }  
复制代码
 
点赞 关注

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表