当前位置: 代码迷 >> 单片机 >> MSP430F149的捕获中断有关问题
  详细解决方案

MSP430F149的捕获中断有关问题

热度:17   发布时间:2016-04-28 15:16:48.0
MSP430F149的捕获中断问题
请看下面的代码,我想实现MSP430F149单片机通过端口P1.1或者P1.2捕获外部信号发生器输入的方波,计数到变量num,然后将这变量在LCD12864屏幕上显示。但是却遇到两个问题:
①time_A定时器的捕获模块,为什么我用TACCTL0捕获通道0进行捕获,就能够成功实现功能,num正常变化并显示。但如果改用TACCTL1捕获通道1捕获,则12864空白一片,无法正常显示,而且num也不能变化。
我只是改了TACCTL0和TACCTL1的设置,然后将端口由CCIOA的P1.1改到CCI1A的P1.2,其他未作变化,而结果前者正常实现功能,后者甚至屏幕无法正常显示。
②我在开启TACCTLO捕获通道0中断,保证正常捕获的前提下:开启看门狗,开门狗定时中断扫描键盘。然后观察发现单片机死机,屏幕无反应,按键无反应,捕获无反应。我怀疑是系统时钟设置的问题,但无从下手。

求解惑。
#include<msp430x14x.h>
#include"LCDNEW.h"

#define uchar unsigned char
#define uint  unsigned int
#define ulong unsigned long
uchar dis[3];
uint num=0;
uint flog=0;

void capture_init()
{
    
    TACTL|=TAIE+TASSEL_1  +ID_0    +MC_2;    
    //     中断 ACLK时钟 无分频    连续技术模式
                                       
   
   
    
   // TACCTL0|=CCIE   +CAP       +CCIS_0      +CM_1      +SCS;  
    
    //模式0 中断 捕获模式 外部P1.1输入CCI0A 上升沿捕获 同步捕获
    TACCTL1|=CCIE+CAP+CCIS_0+CM_1+SCS;
    //P1.2中断
    //P2SEL=0xff;
    //P2DIR=0x00;
    P1SEL=0XFF;
    P1DIR=0X00;
    
     _EINT();
    
}

//***********************************************************************
//函数名称:DisplayCgrom(uchar hz)显示CGROM里的汉字
//***********************************************************************
void DisplayCgrom(uchar addr,uchar *hz)
{
LCD_write_com(addr);
        delay_ms(5);
while(*hz != '\0')
{
LCD_write_data(*hz);
hz++;
                delay_ms(5);
}


//****************************************************************
//函数名称:Display()显示测试结果
//****************************************************************
void Display1(void)
{
DisplayCgrom(0x80,"the result is");



}
void Display2(void)
{
  DisplayCgrom(0x88,dis);
}


//*************************************************************************
//                    系统时钟初始化
//*************************************************************************
void Clock_Init()
{
  uchar i;
  BCSCTL1&=~XT2OFF;                 //打开XT振荡器
  BCSCTL2|=SELM1+SELS;              //MCLK为8MHZ,SMCLK为8MHZ
  do{
    IFG1&=~OFIFG;                   //清除震荡标志
    for(i=0;i<100;i++)
       _NOP();                      //延时等待
  }
  while((IFG1&OFIFG)!=0);           //如果标志为1,则继续循环等待
  IFG1&=~OFIFG; 
}

//*************************************************************************
//              MSP430内部看门狗初始化
//*************************************************************************
void WDT_Init()
{
  //WDTCTL=WDTPW+WDTHOLD;
   WDTCTL = WDT_MDLY_32;       //OPEN看门狗
   IE1|=WDTIE;
  _EINT();
}

/***
#pragma vector=WDT_VECTOR                    //看门狗中断
__interrupt void watchdog_timer(void)
{
  check();//这里是按键扫描
}
***/

/***
#pragma vector=TIMERA0_VECTOR                //捕获CCA0中断
__interrupt void TACCR0_ISR()
{
  num++;

}
***/


#pragma vector=TIMERA1_VECTOR              //捕获CCA1中断
__interrupt void TA_ISR()
{
  switch(TAIV)
  {
  case 2:
     num++;
     break;
  }
}



//***********************************************************************
//      主程序
//***********************************************************************