请看下面的代码,我想实现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;
}
}
//***********************************************************************
// 主程序
//***********************************************************************