shouchengcheng
just do it
我主要是通过频率发生器产生固定频率,然后接在msp430f149的p1.2口(此处是TA1的捕获口,TA1开启捕获模式)。使用TB0定时,TA1采用8MHz的SCLK,TB0采用32768Hz的ACLK,定时1s,这样的话,测得的频率和实际的频率误差在个位数。当把定时用的定时器改成TA0时,测得的频率和实际误差在+-50Hz左右。
寄存器初始化和中断函数(实测误差在个位数) 能够开启LPM1
  1 void Init_cap(void)
  2 {
  3     P1SEL  |=0x04;               //选择P1.2作为捕获的输入端子
  4     TACCTL1|=CM0+SCS+CCIS_0+CAP+CCIE;//上升沿触发,同步模式,使能中断
  5     TACTL  |=TASSEL1+ID_0;   //选择8M-SMCLK时钟
  6 }
  7 void Init_timer_b(void)
  8 {
  9   TBCCTL0 = CCIE;                           // CCR0 interrupt enabled
 10   TBCCR0 = 32768;                          //定时1秒
 11   TBCTL = TBSSEL_1 + MC_1;                  // ACLK, upmode
 12 }
 13 #pragma vector=TIMERA1_VECTOR
 14 __interrupt void Timer_A(void)
 15 {
 16     switch(TAIV)
 17     {
 18     case 2:
 19       {
 20         count++;
 21         break;
 22       };
 23     case 4: 
 24       break;
 25     case 10:
 26       break;
 27     }
 28  }
 29 #pragma vector=TIMERB0_VECTOR
 30 __interrupt void Timer_B (void)
 31 {
 32     TACCTL1 &= ~(CCIE);//关闭捕获中断
 33     TBCCTL0 &= ~(CCIE); //关闭定时中断
 34    // count=count;
 35     result[5]=count/100000;
 36     result[4]=count%100000/10000;
 37     result[3]=count%10000/1000;
 38     result[2]=count%1000/100;
 39     result[1]=count%100/10;
 40     result[0]=count%10;
 41     count=0;
 42     dile();
 43     Display(msp430);
 44     P3OUT^=BIT4;
 45     TBCTL|=TBCLR;
 46     TBCCTL0 |= (CCIE);
 47     TACCTL1 |= (CCIE);
 48  }
 49 
 50 寄存器初始化和中断函数(实测误差在+-50 51 void Init_TA(void)
 52 {
 53     P1SEL  |=0x04;               //选择P1.2作为捕获的输入端子
 54     TACCTL1|=CM0+SCS+CCIS_0+CAP+CCIE;//上升沿触发,同步模式,使能中断
 55     TACCTL0 = CCIE;                           // CCR0 interrupt enabled
 56   TACCR0 = 8000;                          //定时1秒
 57   TACTL = TBSSEL_2 + MC_1+ID_0;                  // ACLK, upmode
 58 }
 59 #pragma vector=TIMERA1_VECTOR
 60 __interrupt void Timer_A1(void)
 61 {
 62   
 63     switch(TAIV)
 64     {
 65     case 2:
 66       {
 67         count++;
 68         break;
 69       };
 70     case 4: 
 71       break;
 72     case 10:
 73       break;
 74     }
 75   
 76 }
 77 #pragma vector=TIMERA0_VECTOR
 78 __interrupt void Timer_A0 (void)
 79 {static int i=0;
 80 if(++i==1000){
 81     TACCTL1 &= ~(CCIE);//关闭捕获中断
 82     TACCTL0 &= ~(CCIE); //关闭定时中断
 83     //count=count;
 84 
 85     result[5]=count/100000;
 86     result[4]=count%100000/10000;
 87     result[3]=count%10000/1000;
 88     result[2]=count%1000/100;
 89     result[1]=count%100/10;
 90     result[0]=count%10;
 91     count=0;
 92     i=0;
 93     dile();
 94     Display(msp430);
 95   P3OUT^=BIT4;
 96     TACTL|=TBCLR;
 97     TACCTL0 |= (CCIE);
 98     TACCTL1 |= (CCIE);
 99   
100     }
101 }

 

 

posted on 2013-12-25 23:44  shouchengcheng  阅读(912)  评论(0编辑  收藏  举报