2441|0

4

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

请教高手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                                                    ;
  }
}
 
点赞 关注

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表