注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
沉浮大师的个人空间 https://home.eeworld.com.cn/space-uid-556937.html [收藏] [复制] [分享] [RSS]
日志

求分析错误原因

已有 453 次阅读2014-7-22 10:53

#include<msp430g2553.h>
#define uchar unsigned char //定义一下方便使用
#define uint  unsigned int
unsigned char  dis1[]="0123456789";
unsigned int  result1_start,result1_end;
unsigned char index=0;
unsigned int  temp;
unsigned juli;
double   distance;
unsigned char dis2[]="the juli";
unsigned char dis3[]="000.0cm";

/*==================================TA的初始化设置=========================================
函数名称: void CAP_Init()
函数功能:定时器A捕获设置,用于捕获上升下降沿
函数参数:
=========================================================================================*/
void CloseWDTCTL()
{
    WDTCTL=WDTPW+WDTHOLD;
}
void ClockInit()
{
    BCSCTL1|=RSEL2;
    DCOCTL|=DCO0+DCO1;  
}
void PortInit()
{
        P2DIR &=~BIT1;          //P2.1,为输入引脚
        P2SEL |= BIT1;   // P2.1 = (InputDirection + TA0.1) = CCIxA.1 --> CCR1,P2.1作为输入,CCI1A,指定输入
        P2DIR|=BIT0;
}
void Timer1Init()
{
        TACCTL1 = CAP + CCIS_0 + CM_3 + CCIE+SCS;     // Capture CCIxA, both edge, interrupt enable.CCI1A->p1.2
        TACTL |=TASSEL_2 + ID_0 + MC_2+ TAIE+TACLR ;//选择1M-SMCLK时钟,continuous mode
        TACCR1=0;
        _EINT();
        LPM0;   
        _NOP();
     
}
/*void delay(uint n)
{
  uint i,j;
  for(i=0;i<n;i++)
    for(j=0;j<110;j++);
}*/
void send_25us()//超声波发送15us的高电平
{
         P2OUT&=~BIT0;
        _NOP();
         P2OUT|=BIT0;
        _NOP();
         P2OUT&=~BIT0;
   
}
/*==================================TA的中断服务程序=========================================
函数名称: Timer_AISR
函数功能: 定时器A中断服务子函数,捕获待测信号上升沿,下降沿
函数参数:这里注释下吧,CCR0单独的占用了个中断,好像是TIMER0_A0_VECTOR,其他的合着用,所以进入中断
后要判断是CCR1,还是CCR2产生的中断,也就是TAOIV或者TA1IV对应case  :2 和4,另外如果你不访问TAIV这个寄存器,
那你产生的一些标志位就要你手动的软件复位了,反之是硬件自己复位。由于捕获是硬件捕获的,测距比较准。
=========================================================================================*/
#pragma vector=TIMER0_A1_VECTOR

__interrupt void timer_a(void)
{
switch(TAIV)
{
case 2:                    //ccr1中断向量
if (TACCTL1&CM0)    //上升沿触发
{
   TACCTL1=(TACCTL1&(~CM0))|CM1;
result1_start=TAR;//记录初始值
index=0;
  }
else
   if (TACCTL1&CM1)
  {
    TACCTL1=(TACCTL1&(~CM1))|CM0;
result1_end=CCR1;          //记录结束值
if(result1_end>result1_start)//结果比开始数值小,表示溢出了一次或者几次,但是一般从0开始计数的话是不溢出的,这超声波实际测不了那么远,最多有个4米,5米的样子已经很好了                                                                        
temp=result1_end-result1_start;
  else
temp=result1_end+index*65535-result1_start;
distance=temp*0.0172;
juli=(uint)(distance*10+0.5);            //取一位小数,四舍五入
  dis3[0]=dis1[juli/1000];
  dis3[1]=dis1[juli%1000/100];
  dis3[2]=dis1[juli%100/10];
  dis3[4]=dis1[juli%10];
  index=0;         //溢出清零
   break;
   }
  case 4:break;
  case 10: index++;break;           //溢出中断向量,其实就2,4,10号向量有用那些手册里也没说,用不到
default :break;
                }
       LPM0_EXIT;
                }
  

void delay(uint n)
{
  uint i,j;
  for(i=0;i<n;i++)
    for(j=0;j<110;j++);
}
void write_command(uchar command_data)//发送命令
{
  uchar i;
  uchar i_data;
  i_data=0xf8;                //写命令为11111000
  P1OUT |=BIT0;             //p1.0置1
  P1OUT &= ~BIT2;           //p1.2置0触发下降沿写命令
  for(i=0;i<8;i++)
  {
    P1OUT &= ~BIT2;
    if(i_data&0x80)
      P1OUT |= BIT1;      //p1.1置1
    else
      P1OUT &= ~BIT1;    //p1.1置0
   // P1OUT &= ~BIT2;      //p1.2置0
    P1OUT |= BIT2;         //p1.2置1触发上升沿写命令
    //_NOP();
    //P1OUT &=~BIT2;
    i_data=i_data<<1;   
  }
  i_data=command_data;
  i_data&=0xf0;       //取高四位,先写高电平,再读低电平
  for(i=0;i<8;i++)
  {
    P1OUT &= ~BIT2;
    if(i_data&0x80)
      P1OUT |= BIT1;    //p1.1置1
    else
      P1OUT &= ~BIT1;   //p1.1置0
   
   // P1OUT &= ~BIT2;     //p1.2置0
    P1OUT |= BIT2;         //p1.2置1触发上升沿写命令
   // _NOP();
   // P1OUT &=~BIT2;
    i_data=i_data<<1;   
  }
  i_data=command_data;
  i_data<<=4;       //取低四位
  for(i=0;i<8;i++)
  {
    P1OUT &= ~BIT2;
    if(i_data&0x80)
      P1OUT |= BIT1;
    else
      P1OUT &= ~BIT1;  
   // P1OUT &= ~BIT2;
    P1OUT |= BIT2;         //p1.2置1触发上升沿写命令
    //_NOP();
   // P1OUT &=~BIT2;
    i_data=i_data<<1;  
  }
  P1OUT &= ~BIT0;    //p1.0置0选择命令
  delay(10);     //稍作延迟,为了稳定信号
}
void write_data(uchar command_data)//发送数据
{
  uchar i;
  uchar i_data;
  i_data=0xfa;   //写数据为11111010
  P1OUT |= BIT0;  //p1.0置1,把CS拉高
  for(i=0;i<8;i++)
  {
    P1OUT &= ~BIT2;
    if(i_data&0x80)
      P1OUT |= BIT1;  //p1.1置1读
    else
      P1OUT &= ~BIT1;   //p1.1置0写
    //P1OUT &= ~BIT2;     //p1.2置0
    P1OUT |= BIT2;         //p1.2置1触发上升沿写命令
    //_NOP();
    //P1OUT &=~BIT2;
    i_data=i_data<<1;   
  }
  i_data=command_data;
  i_data&=0xf0;       //取高四位
  for(i=0;i<8;i++)
  {
    P1OUT &= ~BIT2;
    if(i_data&0x80)
      P1OUT |= BIT1;     //p1.1置1读
    else
      P1OUT &= ~BIT1;   //p1.1置0写
   // P1OUT &= ~BIT2;     //p1.2置0
    P1OUT |= BIT2;         //p1.2置1触发上升沿写命令
    //_NOP();
   // P1OUT &=~BIT2;
    i_data=i_data<<1;   
  }
  i_data=command_data;
  i_data<<=4;       //取低四位
  for(i=0;i<8;i++)
  {
    P1OUT &= ~BIT2;
    if(i_data&0x80)
      P1OUT |= BIT1;
    else
      P1OUT &= ~BIT1;
   // P1OUT &= ~BIT2;
    P1OUT |= BIT2;         //p1.2置1触发上升沿写命令
   // _NOP();
   // P1OUT &=~BIT2;
    i_data=i_data<<1;   
  }
  P1OUT &= ~BIT0;       //p1.0置0,选择命令
  delay(10);       //稍作延时为了稳定
}
void LCD_INIT()       //液晶初始化
{
  delay(100);
  write_command(0x30);   //设置8为数据接口,基本指令模式
  write_command(0x02);   //清DDRAM
  //write_command(0x06);   //游标及显示右移一位
  write_command(0x0c);   //整体显示开,游标关,反白关
  write_command(0x01);   //写入空格清频
  write_command(0x80);   //设定首次显示位置

}
void display_dis1()
{
  uchar a;
  write_command(0x80);     //定义起始地址   
  for(a=0;a<10;a++)
  {
    write_data(dis1[a]);
    _NOP();
  }
      delay(10);
    }   
void display_dis2()
{
  uchar a;
  write_command(0x90);  //设定起始地址
  for(a=0;a<8;a++)
  {
    write_data(dis2[a]);  
  }                        
      delay(10);
}
void display_dis3()
{
    uchar a;
    write_command(0x88);//设定起始地址
    for(a=0;a<7;a++)
    {
    write_data(dis3[a]);
    }
      delay(10);
         }  

void main(void)
{
  WDTCTL=WDTPW+WDTHOLD;
  P1SEL=0X00;   //把P1口设置为普通的IO口
  P1DIR=0XFF;   //把P1口设置为输出
  P2SEL=0X00;
  P2DIR=0XFF;
        ClockInit();
        LCD_INIT();
        PortInit();
    Timer1Init();
    _EINT();
  display_dis2();
  display_dis3();
   while(1)
   {
            send_25us();
            delay(100);
   }
}

  
  就是进不了中断,各位大神、高手,求破解啊1

本文来自论坛,点击查看完整帖子内容。

全部作者的其他最新日志
评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章