MSP430:输入捕获

在做超声模块时用到

 1 //捕获上升沿
 2 void Capture_Pos(void)
 3 {
 4       P2SEL |= Echo;    //选择P23作为捕捉的输入端子    Timer1_A
 5 
 6       //TA1CCTL1 |=CM_3+SCS+CAP+CCIE;  //上下沿都触发捕捉,用于测脉宽,同步模式、时能中断  CCI1A
 7 
 8       TA1CCTL1 |=CM_1+SCS+CAP+CCIE;  //上升沿触发捕捉,同步模式、时能中断  CCI1A
 9 
10       TA1CTL |= TASSEL1+MC_2;  //选择SMCLK时钟作为计数时钟源,不分频   增计数模式不行,必须连续计数模式
11 
12 }
//捕获上升沿
 1 //捕获下降沿
 2 void Capture_Neg(void)
 3 {
 4       P2SEL |= Echo;    //选择P23作为捕捉的输入端子    Timer1_A
 5 
 6       TA1CCTL1 |=CM_2+SCS+CAP+CCIE;  //下降沿触发捕捉,同步模式、时能中断  CCI1A
 7 
 8       TA1CTL |= TASSEL1+MC_2;  //选择SMCLK时钟作为计数时钟源,不分频   增计数模式不行,必须连续计数模式
 9 
10 //      TA1R=0;
11 
12 }
//捕获下降沿
 1 #pragma vector=TIMER1_A1_VECTOR      //Timer1_A CC1  的中断向量
 2 
 3 __interrupt void Timer_A1(void)
 4 
 5 {
 6     unsigned int count;
 7     char countH,countL;
 8     float mile;
 9     UCHAR shi[2];
10        //的方法进行判断是哪一个中断源产生的中断
11 
12   switch(TA1IV)    //如果是Timer1_A CC1产生的中断
13 
14   {
15 
16     case 2:      // CCR1 not used   捕获/比较器1
17 
18     {
19         if(CaptureFlag==0)
20         {
21 //            uart_send_ch('H');
22             CaptureFlag=1;
23             Capture_Neg();
24         }
25         else if(CaptureFlag==1)
26         {
27             /*
28              * 声速340m/s = 34cm/ms;
29              * distance = 34/2*time
30              * time=count/1000 (ms) 认为频率为1Mhz
31              * */
32 //            uart_send_ch('L');
33             count=TA1CCR1;
34 //            countL=(char)(count&0xff);
35 //            countH=(char)(count>>8);
36             mile=(float)count;
37             mile=mile/1000*17;
38             distance=(char)mile;
39             P1OUT ^= GRN_LED;
40             uart_send_ch(distance);
41 //            shi[0]=distance/10+0x30;
42 //            shi[1]=distance%10+0x30;
43 //            OLED_SSD1306_Display8x16Str(0,80,&shi[0]);
44 //            OLED_SSD1306_Display8x16Str(0,96, "cm");
45             CaptureFlag=2;
46 //             uart_send_ch(distance);
47 //            uart_send_ch(shi[0]);
48 //            uart_send_ch(shi[1]);
49 //            CaptureFlag=0;
50 //            Capture_Pos();
51 
52         }
53 
54 
55         break;
56 
57      }
58 
59     case 4:break;  // CCR2 not used    捕获/比较器2
60 
61     case 10:break; // overflow  定时器溢出
62 
63    }
中断处理


中断处理只需要记住结果,内部逻辑代码跟模块有关

posted @ 2013-07-12 13:49  wwjdwy  阅读(1228)  评论(0编辑  收藏  举报