• 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    }
    中断处理


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

  • 相关阅读:
    最小的K个数
    数组中出现次数超过一半的数字
    符串的排列
    二叉搜索树与双向链表
    复杂链表的复制
    String,StringBuilder,StringBuffer
    二叉树中和为某一值的路径
    二叉搜索树的后序遍历序列
    Java单例模式
    222. Count Complete Tree Nodes
  • 原文地址:https://www.cnblogs.com/wwjdwy/p/3186186.html
Copyright © 2020-2023  润新知