打印
[PIC®/AVR®/dsPIC®产品]

在MPLAB的WATCH窗口观察变量以及更新Value值的问题

[复制链接]
2440|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 老麻烦了 于 2016-7-20 21:13 编辑

(模块与单片机是通过USATR通信)我写了一个关于AHRS的程序用来测量加速度,陀螺仪值,磁场和四元素的值,但是在晃动PCB时Watch窗口的值一直没有更新,不知道为什么,求助大家。(我用的是MPLAB IDE V8.8 编译工具MCC18.   编译通过)

20160718152943.png (17.78 KB )

watch窗口值

watch窗口值

20160718155540.png (169.01 KB )

模块各位含义

模块各位含义

HEW6F2RAE7HODERYTJ4XD$H.png (372.81 KB )

在窗口显示定义的数组的值为0x00,但为什么WATCH窗口有值

在窗口显示定义的数组的值为0x00,但为什么WATCH窗口有值

T9IQS1_)QG$43N94C7{215B.png (335.17 KB )

T9IQS1_)QG$43N94C7{215B.png

program.rar

1.64 KB

这模块的程序

沙发
XIEYUANBIN| | 2016-7-19 08:49 | 只看该作者
需要每次都运行,停下来看才会有变化,不是动态可观察的

使用特权

评论回复
板凳
yklstudent| | 2016-7-20 09:27 | 只看该作者
动态,楼主最好通过串口观察

使用特权

评论回复
地板
老麻烦了|  楼主 | 2016-7-21 09:40 | 只看该作者

使用特权

评论回复
5
老麻烦了|  楼主 | 2016-7-21 10:38 | 只看该作者
XIEYUANBIN 发表于 2016-7-19 08:49
需要每次都运行,停下来看才会有变化,不是动态可观察的

您好,谢谢提醒。但是在每次运行停下后,都没有变化,不知道是怎么回事

使用特权

评论回复
6
JY-DX-JY| | 2016-7-21 12:01 | 只看该作者
老麻烦了 发表于 2016-7-21 10:38
您好,谢谢提醒。但是在每次运行停下后,都没有变化,不知道是怎么回事 ...

会不会你的程序有问题?

使用特权

评论回复
7
老麻烦了|  楼主 | 2016-7-21 15:42 | 只看该作者
JY-DX-JY 发表于 2016-7-21 12:01
会不会你的程序有问题?

您好,我的程序是这样的不知道是哪里出错。




#include <p18f2525.h>
#include <math.h>
#include <string.h>
#define uchar unsigned char
#define uint unsigned int


//^^^^^^^^^^^^^^^^^^^^^配置位的软件设置^^^^^^^^^^^^^^^^^^^^^^//
#pragma config WDT = OFF     //看门狗禁止
#pragma config OSC = HS      //晶振
#pragma config LVP = OFF     //低电压编程禁止




float Acc[3],Gyr[3],Mag[3],rpy[3],Q[4];
float ROLL,PITCH,YAW;
unsigned char Re_buf[11];
unsigned char sign;
unsigned char counter=0;

void delayms(unsigned char time)   //延时函数
{
        unsigned char i;
        while(time--)
        {
                for(i=0;i<120;i++);
        }
}


//^^^^^^^^^^^^^^^^^^^^^单片机串口初始化^^^^^^^^^^^^^^^^^^^^^^//
void UartInit(void)                  
{


        TRISCbits.TRISC7=1;           //IO方向初始化RC7口设置为输入、RC6口设置为输出
        TRISCbits.TRISC6=0;       
        PIE1bits.RCIE=0;           //关闭接收使能RCIE
        RCSTA=0x00;                           //关闭串行端口
        PIE1bits.RCIE=1;           //使能外部中断PEIE
        PIE1bits.TXIE=1;       //串口发送中断
        RCSTA=0x90;                           //使能串行端口,使能连续接收
        TXSTA=0x24;                           //使能发送,高速波特率       
        SPBRG=51;                           //设置波特率寄存器X=51,波特率为9600;波特率=Fosc/[16(X+1)]
        INTCON=0xC0;                   //全局中断GIE打开;使能外部中断PEIE


}
//^^^^^^^^^^^字节发送函数^^^^^^^^^^^^^^^^^^^//
void UartData(uchar dat)
{
        TXREG=dat;
        while(TXSTAbits.TRMT==0);
}
//^^^^^^^^^^^字符串发送函数^^^^^^^^^^^^^^^^^^^//
void UartSend(uchar *ptr,unsigned char length)    //*s^^^^ptr
{
        int i=0;
        while(i<length)
        {
                UartData(*(ptr+i));
                i++;
        }
}
//***********************串口中断********************************//
void UartReceive()
{
        if(PIR1bits.RCIF)
        {
       
                 Re_buf[counter]=RCREG;
              if(counter==0&&Re_buf[0]!=0x5A&&counter==1&&Re_buf[1]!=0x5A) return;      //第0号和1号数据不是帧头
             
              counter++;                                                                //如果是帧头则开始计数
             
              if(counter==11)             //接收到11个数据
              {   
                 counter=0;               //重新赋值,准备下一帧数据的接收
                 sign=1;
              }
          }
}


void main(void)
{
        TRISBbits.TRISB3=0;
                PORTBbits.RB3=1;
                TRISBbits.TRISB4=0;
                PORTBbits.RB4=1;
        UartInit();
        delayms(20);


   while(1)
   {   
      if(sign)
      {
         sign=0;
         if(Re_buf[0]==0x5A&&Re_buf[1]==0x5A)      //检查帧头
              {  
                        switch(Re_buf[2])
                        {
                        case 0x15:          //三轴加速度
                        {
                        Acc[0]=((short)(Re_buf[4]<<8|Re_buf[5]))/16383.0;
                    Acc[1]=((short)(Re_buf[6]<<8|Re_buf[7]))/16383.0;
                        Acc[2]=((short)(Re_buf[8]<<8|Re_buf[9]))/16383.0;
               
                        }
                        break;


                        case 0x25:         //陀螺仪数据
                        {
                        Gyr[0]=((short)(Re_buf[4]<<8|Re_buf[5]))/16383.0;
                        Gyr[1]=((short)(Re_buf[6]<<8|Re_buf[7]))/16383.0;
                        Gyr[2]=((short)(Re_buf[8]<<8|Re_buf[9]))/16383.0;
       
                        }
                        break;


                        case 0x35:         //磁力计数据
                        {
                        Mag[0]=((short)(Re_buf[4]<<8|Re_buf[5]))/16383.0;
                        Mag[1]=((short)(Re_buf[6]<<8|Re_buf[7]))/16383.0;
                        Mag[2]=((short)(Re_buf[8]<<8|Re_buf[9]))/16383.0;
       
                        }
                        break;
                       
                        case 0x45:          //欧拉角数据
                        {
                        ROLL=((short)(Re_buf[4]<<8|Re_buf[5]))/16383.0*100;
                        PITCH=((short)(Re_buf[6]<<8|Re_buf[7]))/16383.0*100;
                        YAW=((short)(Re_buf[8]<<8|Re_buf[9]))/16383.0*100;
                        rpy[0]=ROLL;
                        rpy[1]=PITCH;
                        rpy[2]=YAW;
       
                        }
                        break;
                       
               
               
                       
                                }               
                }
       }
   }
}

使用特权

评论回复
8
XIEYUANBIN| | 2016-7-21 16:04 | 只看该作者
老麻烦了 发表于 2016-7-21 10:38
您好,谢谢提醒。但是在每次运行停下后,都没有变化,不知道是怎么回事 ...

要不就是程序有问题,根本没运行到,要不就是你的程序回位了,每次都一样的数据

使用特权

评论回复
9
XIEYUANBIN| | 2016-7-21 19:08 | 只看该作者
老麻烦了 发表于 2016-7-21 16:22
在每次step into//step over运行时程序都在图示1,2位置来回走,这样的原因大概是什么,请教您!
...

无语。。。。。你的sign标志在哪里立起来的,程序能否走到那边,光在这叫有什么用。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

24

主题

54

帖子

1

粉丝