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