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 }
中断处理只需要记住结果,内部逻辑代码跟模块有关