标题: msp430f149开捕获为什么无法进入case2 [打印本页]

作者: 七禾页    时间: 2021-7-19 17:47
标题: msp430f149开捕获为什么无法进入case2


#include "msp430x14x.h"
#include "iic.h"

unsigned int TA_OverflowCnt;      //TA溢出次数存放变量
unsigned long int Period;       //周期测量结果存放变量
unsigned int PervCapVal;         //前一次捕获值存放变量

void display()     //显示
{

    // OLED_ShowString(0, 2, "haha:",16);
     //OLED_ShowString(0, 0, "20",16);
     //OLED_ShowChar(33, 0, '-',16);
     //OLED_ShowChar(57, 0, '-',16);
   //  OLED_ShowChar(78, 2,':',16);
    // OLED_ShowChar(102, 2,':',16);
     OLED_ShowCHinese(0,0,0);
     OLED_ShowCHinese( 16,0,1);
    // OLED_ShowChar(32, 4,':',16);   
     //OLED_ShowString(0, 6, "new money:",16);
    // OLED_ShowNum(0,4,TA_OverflowCnt,2,16);
     OLED_ShowString(112,0,"HZ",16);
     //OLED_ShowNum(0,6,3,5,16);      //显示
}

void main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;

  P1SEL |= BIT2;      //P1.2设为第二功能(TA1),不同单片机可能不同
  P1DIR &= ~(BIT2);   //P1.2(TA1)设为输入(可省略)

  TACTL= TASSEL_2+MC_2+TACLR+TAIE;

  TACCTL1 =CAP + CM_3 +CCIS_1 + SCS + CCIE;
  //捕获模块1启动,选择TA1(P1.2)管脚作为捕获源,上升沿捕获,同步捕获,开启捕获中断

  Initial_LY096BG30();   //OLED初始化
  OLED_Clear();
  display();
  _EINT();      //总中断允许
  LPM0;       //因为TimerA要用SMCLK,只能进入低功耗模式0休眠

}


#pragma vector = TIMERA1_VECTOR
__interrupt void TA_ISR(void)   //Timer_A中断入口
{
  switch(TAIV)
  {
  case 2:     //比较/捕获模块1中断
            Period = TA_OverflowCnt*65536 + TACCR1-PervCapVal;    //计算周期
            PervCapVal = TACCR1;      //保存捕获值,供下一次使用
            TA_OverflowCnt = 0;     //溢出次数清零
            OLED_ShowNum(0,2,Period,5,16);      //显示
            OLED_ShowNum(0,6,3,5,16);      //显示
            break;
  case 4:   break;
  case 10:  TA_OverflowCnt++;     //TA每次溢出,溢出次数变量+1
            break;  
  }
}


进入不了这个中断,我查了一下手册    捕获模式:寄存器 CCRx 捕获了定时器 TAR 值时置位。
说明没有捕获到定时器TAR


  case 2:     //比较/捕获模块1中断
            Period = TA_OverflowCnt*65536 + TACCR1-PervCapVal;    //计算周期
            PervCapVal = TACCR1;      //保存捕获值,供下一次使用
            TA_OverflowCnt = 0;     //溢出次数清零
            OLED_ShowNum(0,2,Period,5,16);      //显示
            OLED_ShowNum(0,6,3,5,16);      //显示
            break;



问题是:为什么捕获不了TAR中的值   我的oled ,脉冲输入没有问题


IMG_20210719_174246(1).jpg (1.68 MB, 下载次数: 122)

IMG_20210719_174246(1).jpg

作者: 七禾页    时间: 2021-7-19 18:12
已解决,谢谢admin
作者: 七禾页    时间: 2021-7-19 18:16
CCISx:在捕获模式中用来定义提供捕获事件的输入源
0: 选择 CCIxA
1: 选择 CCIxB
2: 选择 GND
3: 选择 Vcc
应该选择 CCIS_0  选择CCIXA
因为我使用的就是Timer_A
作者: 轩辕顶托    时间: 2021-7-20 15:36
一是查看中断是否打开;二是查看你的标志位是否置1或置0;三是查看中断模块初始化;我以前也试过这种情况。
作者: shumivan    时间: 2021-7-21 14:34
首先确定你的捕获源对不对,然后是确定源的上升下降沿方式,确定好了来龙去脉如果还是不行的话,那就是你配置不对,这两点对了肯定能进去
作者: 1024153202    时间: 2021-7-29 13:57
应该是你的捕获源不对




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1