1946|2

6

帖子

2

TA的资源

一粒金砂(初级)

楼主
 

提问-菜鸟学MSP430的疑问[持续更新] [复制链接]

本帖最后由 西芷何稻 于 2014-2-22 15:52 编辑

浅浅学过51,现在因为要做东西,学习MSP430,一边学一遍提高51. 我还是把所有疑问都写在一个帖子上来,菜鸟好多疑问。


【2014.2.21】【已解决】  学完了向导和实验手册的定时和中断部分,对定时器有了一个初步的认识。现在我找来TI的官方例程,继续学习定时器。现在遇到疑问。不理解下面的swith函数,2,4,10如何确定?自己找了资料,在仔细的看了看user guide, 明白了
中断优先级      中断源                       缩写       TAIV的内容
  最高          捕获/比较器1                CCIFG1            2
                   捕获/比较器2                CCIFG2            4
                           ……
                   捕获/比较器x                 CCIFGx
最低          定时器溢出                    TAIFG1            10
                 没有中断将挂起
  1. #include <msp430.h>

  2. int main(void)
  3. {
  4.   WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  5.   P1DIR |= 0x01;                            // P1.0 output
  6.   TACTL = TASSEL_2 + MC_2 + TAIE;           // SMCLK, contmode, interrupt
  7.   _BIS_SR(LPM0_bits + GIE);                 // Enter LPM0 w/ interrupt
  8. }
  9. /*对于每一个定时器来说,它有两个中断,TIMERA0_VECTOR 和TIMERA1_VECTOR 。
  10. * 这两个中断何时被触发呢?在MSP430中,TIMERA0_VECTOR在TACCR0寄存器溢出时被触发;
  11. * 而TIMERA1_VECTOR 在三个时候都可以被触发(TACCR1 CCIFG、TACCR2 CCIFG,TAIFG
  12. * 只要这三个寄存器中的任何一个被置位了,TIMERA1_VECTOR 中断就会被触发)。
  13. */
  14. // Timer_A3 Interrupt Vector (TA0IV) handler
  15. #pragma vector=TIMER0_A1_VECTOR
  16. __interrupt void Timer_A(void)
  17. {
  18. switch( TA0IV )
  19. {
  20.    case  2: break;                          // CCR1 not used
  21.    case  4: break;                          // CCR2 not used
  22.    case 10: P1OUT ^= 0x01;                  // overflow
  23.             break;
  24. }
  25. }
复制代码






  2014.2.21 【中断怎么才结束】【已解决】:原因:自己另外用51模仿了差不多的程序,发现自己想多了。程序是一直跑的。麻烦解决一下我的疑问。tks
下面是学习向导和实验手册的Lab5程序,我的理解是,BIT0(红灯)一开始就闪烁,然后Timer0的 计数器加到12000,就调用中断,红灯停止闪烁,(BIT6)绿灯闪烁。

但是板子上的情况是红灯闪烁两下,然后绿灯闪烁,然后红灯闪两下,然后绿灯闪烁,但是每次绿灯闪烁的次数不同。我不明白为什么会这样。  或者说我不是很明白 这个程序的中断怎么跑。 另外“Since the ACLK (VLO) is running at 12 kHz, the value needs to be 12000 cycles.”我不是很明白。

ps:CCS的字体怎么调整?

  1. //***********************************************************
  2. // Lab5_Start.c  Temperature sampling example using ADC10
  3. //         Clocking: MCLK and SMCLK = 1.1MHz DCO/8
  4. //                                         ACLK = 12kHz VLO
  5. //
  6. // SFB 1/2012
  7. //***********************************************************

  8. #include <msp430g2553.h>

  9. #ifndef TIMER0_A1_VECTOR
  10. #define TIMER0_A1_VECTOR    TIMERA1_VECTOR
  11. #define TIMER0_A0_VECTOR    TIMERA0_VECTOR
  12. #endif

  13. volatile long tempRaw;
  14. volatile unsigned int i;

  15. void FaultRoutine(void);
  16. void ConfigWDT(void);
  17. void ConfigClocks(void);
  18. void ConfigLEDs(void);
  19. void ConfigADC10(void);
  20. void ConfigTimerA2(void);

  21. void main(void){

  22.         ConfigWDT();
  23.         ConfigClocks();
  24.         ConfigLEDs();
  25.         ConfigADC10();
  26.         ConfigTimerA2();
  27.         _BIS_SR(GIE);//开启总中断

  28.   while(1){

  29.          P1OUT |= BIT0;
  30.          for(i = 100; i>0; i--);
  31.          P1OUT &= ~BIT0;
  32.          for(i= 500; i>0; i--);
  33.   }
  34. }

  35. void ConfigWDT(void){

  36.         WDTCTL = WDTPW + WDTHOLD;                 // Stop watchdog timer
  37. }

  38. void ConfigClocks(void){

  39.         if (CALBC1_1MHZ ==0xFF || CALDCO_1MHZ == 0xFF)
  40.         FaultRoutine();                                    // If calibration data is erased
  41.                                                                                                 // run FaultRoutine()
  42.         BCSCTL1 = CALBC1_1MHZ;                                         // Set range
  43.         DCOCTL = CALDCO_1MHZ;                                          // Set DCO step + modulation
  44.         BCSCTL3 |= LFXT1S_2;                      // LFXT1 = VLO
  45.         IFG1 &= ~OFIFG;                           // Clear OSCFault flag
  46.         BCSCTL2 |= SELM_0 + DIVM_3 + DIVS_3;      // MCLK = DCO/8, SMCLK = DCO/8
  47. }

  48. void FaultRoutine(void){

  49.         P1OUT = BIT0;                            // P1.0 on (red LED)
  50.         while(1);                                             // TRAP
  51. }

  52. void ConfigLEDs(void){

  53.         P1DIR = BIT6 + BIT0;                             // P1.6 and P1.0 outputs
  54.         P1OUT = 0;                                // LEDs off
  55. }

  56. void ConfigADC10(void){

  57.         ADC10CTL1 = INCH_10 + ADC10DIV_0;        // Temp Sensor ADC10CLK
  58. }

  59. void ConfigTimerA2(void){

  60.         CCTL0 = CCIE;//使 计时器counter/比较器寄存器compare register 在CCTL0 capture/compare 控制寄存器 中 中断
  61.         CCR0 = 12000;//计时器数值达到CCR0,中断就会生成
  62.         TACTL = TASSEL_1 + MC_2;
  63.         //TACTL   is the Timer_A control register
  64.         //TASSEL_1  selects the ACLK(辅助时钟)
  65.         //MC_2    sets the operation for continuous mode
  66. }

  67. #pragma vector=TIMER0_A0_VECTOR
  68. __interrupt void Timer_A (void){
  69. /*
  70.           ADC10CTL0 = SREF_1 + ADC10SHT_3 + REFON + ADC10ON;
  71.           _delay_cycles(5);                         // Wait for ADC Ref to settle
  72.           ADC10CTL0 |= ENC + ADC10SC;               // Sampling and conversion start
  73.           P1OUT |=BIT6;                                         // P1.6 on (green LED)
  74.           _delay_cycles(100);
  75.           ADC10CTL0 &= ~ENC;                                   // Disable ADC conversion
  76.           ADC10CTL0 &= ~(REFON + ADC10ON);        // Ref and ADC10 off
  77.           tempRaw = ADC10MEM;                                                // Read conversion value
  78.           P1OUT &= ~BIT6;                                                 // green LED off
  79. */
  80.          P1OUT |= BIT6;
  81.          for(i = 5000; i>0; i--);
  82.          P1OUT &= ~BIT6;
  83.          for(i= 5000; i>0; i--);
  84.          CCR0 += 12000;//CCR0在中断结束后会自动清零,这里在给CCR0赋值,以便之后的中断使用

  85. }
复制代码











最新回复

P1OUT |= BIT0;                            // P1.0 on (red LED) P1DIR |= BIT6 + BIT0;                             // P1.6 and P1.0 outputs 最好加上|= CCS5,.1的字体怎么调? https://bbs.eeworld.com.cn/forum. ... 9074&fromuid=415653 (出处: 电子工程世界-论坛)   详情 回复 发表于 2014-2-21 17:29
 
点赞 关注

回复
举报

2781

帖子

419

TA的资源

五彩晶圆(中级)

沙发
 
P1OUT |= BIT0;                            // P1.0 on (red LED)
P1DIR |= BIT6 + BIT0;                             // P1.6 and P1.0 outputs
最好加上|=
CCS5,.1的字体怎么调?
https://bbs.eeworld.com.cn/forum. ... 9074&fromuid=415653
(出处: 电子工程世界-论坛)


点评

谢谢,解决了,可以再看看我的新疑问吗?tks  详情 回复 发表于 2014-2-22 00:22
 
个人签名
 

回复

6

帖子

2

TA的资源

一粒金砂(初级)

板凳
 
qinkaiabc 发表于 2014-2-21 17:29
P1OUT |= BIT0;                            // P1.0 on (red LED)
P1DIR |= BIT6 + BIT0;                ...

谢谢,解决了,可以再看看我的新疑问吗?tks
 
 
 

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

随便看看
查找数据手册?

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
快速回复 返回顶部 返回列表