|
请教高手MSP430F5438超声波进不了中断的问题
[复制链接]
我用MSP430F5438测试超声波,我用P2.2产生脉冲,P2.1接受回波,用示波器观测P2.1的波形是正确的,我觉得是TimeA配置得不对,请高手帮忙解决这个问题呀... 程序在下面
(红色字体部分为TimeA初始化)
#include "msp430x54x.h"
#include
#include
#include "PIN_DEF.H"
//#include "LED.H"
//***************************************************************************//
// //
// TimeA0中断服务程序 //
// //
//***************************************************************************//
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer0_A0 (void)
{
//switch(TA0IV)
// {
// case 0:
P1OUT ^= 0xF0 ;
P9OUT ^= 0x0F ;
//TA0CCR0 = (16000) - 1 ;
//_EINT();
// break;
//}
}
//************************************************//
// 函数名称:Delay_1ms //
// 功 能:延时约1ms的时间 //
// 参 数:无 //
// 返回值 :无 //
//************************************************//
void Delay_1ms(void)
{
unsigned char i;
for(i = 10;i > 0;i--)
_NOP();
}
//************************************************//
// 函数名称:Delay_Nms //
// 功 能:延时N个1ms的时间 //
// 参 数:n--延时长度 //
// 返回值 :无 //
//************************************************//
void Delay_Nms(unsigned int n)
{
unsigned int i;
for(i = n;i > 0;i--)
Delay_1ms();
}
//***************************************************************************//
// //
//函数:Init_CLK(void) //
//功能:初始化主时钟: MCLK = XT2 //
// //
//***************************************************************************//
void Init_CLK(void)
{
WDTCTL = WDTPW + WDTHOLD ; // 关看门狗
P5SEL |= 0x0C ; // 端口功能选择振荡器
UCSCTL6 &= ~XT2OFF ; // 振荡器使能
UCSCTL3 |= SELREF_2 ; // FLLref = REFO
UCSCTL4 |= SELA_2 ; // ACLK=REFO,SMCLK=DCO,MCLK=DCO
do
{
UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG); // 清除 XT2,XT1,DCO 错误标志
SFRIFG1 &= ~OFIFG ;
}while(SFRIFG1&OFIFG) ; // 检测振荡器错误标志
UCSCTL6 |= XT2DRIVE0 + XT2DRIVE1 ; // XT2 驱动模式 24~32MHz
UCSCTL4 |= SELS_5 + SELM_5 ; // SMCLK = MCLK = XT2
}
//***************************************************************************//
// //
// Init_Port(void): 设置IO端口 //
// //
//***************************************************************************//
void Init_Port(void)
{
P5DIR |= POWER ; // 主电源
MAIN_POWER_ON ;
P7DIR |= LED_PWR ; // 发光二极管电源
P7OUT &= ~LED_PWR ;
P1OUT = 0xF0 ; // 设置LED控制端IO属性
P1DIR = 0xF0 ;
P9OUT = 0x0F ;
P9DIR = 0x0F ;
P2DIR |= BIT2 ; //P1.2输出
P2DIR &=~BIT1 ; //P1.1输入
P2SEL |= BIT1 ; //P1.1第二功能,捕获输入
//P2IE |= BIT1 ;
//P2IES |= BIT1 ;
//P2IFG |= BIT1 ;
P2OUT &=~BIT2;
Delay_Nms(1000);
}
//***************************************************************************//
// //
// Init_TimerA0(void): 设置TimerA0 //
// //
//***************************************************************************//
void Init_Timer0_A5(void)
{
TA0CTL = 0 // 复位Timer0_A5, 分频系数设置为1
| (1 << 1) // 中断允许
| (1 << 2) // 计数器清0
| (2 << 8) // 计数时钟设为SMCLK
//| (1 << 4) // 连续计数
| (3 << 6) ; // 8分频
//TA0CCR0 = 16000 - 1 ; // SMCK=EX2=16MHz,设置计数器溢出时间为1ms
TA0CCTL0 = 0 // 初始化捕获控制
| (1 << 4) // 使能捕获中断
| (1 << 8) // 捕获模式
| (1 << 14) // 上升沿捕获
| (1 << 11) ; // 同步捕获
TA0CTL |= (1 << 5) ; // 设置计数器为加计数,启动
}
//***************************************************************************//
// //
// 主程序: 初始化时钟、端口和定时器 //
// //
//***************************************************************************//
void main( void )
{
WDTCTL = WDTPW + WDTHOLD ; // 关闭看门狗
Init_CLK() ;
Init_Port() ;
Init_Timer0_A5() ;
TA0CCTL0 = 0 // 初始化捕获控制
| (1 << 4) // 使能捕获中断
| (1 << 8) // 捕获模式
| (1 << 14) // 上升沿捕获
| (1 << 11) ; // 同步捕获
_EINT() ;
while(1)
{
P2OUT |= BIT2;
Delay_Nms(10);
P2OUT &=~BIT2;
Delay_Nms(80);
LPM3 ;
}
}
|
|