亚博智能论坛  
  
查看: 542|回复: 0

用avr128调试mpu6050程序为什么出错

[复制链接]

该用户从未签到

18

主题

43

帖子

114

积分

新手上路

Rank: 1

积分
114
发表于 2017-6-21 18:46:30 | 显示全部楼层 |阅读模式

先谢谢各位大神了,这个程序开始后,没有反馈,感觉是卡在串口1的中断程序里的if(counter==0&&buf[0]!=0x55)return;这句话了,好像是buf[0]!=0x55不成立,弄了很久也没搞清楚是什么问题

mpu6050是可以接串口不用I2C通讯的那种
  1. /*************************************************************************************************************/
  2. //串口0负责向上位机发送数据并接收指令
  3. //串口1负责接收mpu的数据
  4. #include <string.h>
  5. #include <stdio.h>
  6. #define         F_CPU        16000000                //单片机主频为16MHz,用于延时子程序,熔丝位必须设置到外部高频晶振才行
  7. #include <util/delay.h>
  8. #include <avr/io.h>
  9. #include <avr/iom128.h>
  10. #include <avr/interrupt.h>           //中断信号头文件
  11. #include "Config.h"

  12. //***********************************************************************
  13. //                      全局变量区
  14. //***********************************************************************
  15. int usart_rx_data=0,b=2,c=3;                          //串口0收到的数  ,a=1,b=2,c=3,d=9;   a,b,c用来对串口0收到的数进行判断
  16. int buf[11],counter=0;           //存储串口1接收到的数据
  17. unsigned char sign;                           //串口1接收完成标志位
  18. float a[3],w[3],angle[3];                     //存储三轴的加速度,角速度,角度

  19. void usart0()
  20. {
  21.   UCSR0A=0x00;                                 //单倍速模式
  22.   
  23.   UCSR0B=0x98;                                 //接收中断允许,发送结束和寄存器空中断关闭,采用查询发送模式                              
  24.   
  25.   UCSR0C=(1<<UCSZ01)|(1<<UCSZ00);              //写UCSRC寄存器,异步通信无校验,8位数据1位停止位
  26.   
  27.   UBRR0H=baud_h;                               //写波特率的值
  28.   
  29.   UBRR0L=baud_l;
  30. }
  31. void usart1()
  32. {
  33.   UCSR1A=0x00;                                 //单倍速模式
  34.   
  35.   UCSR1B=0x98;                                 //接收中断允许,发送结束和寄存器空中断关闭,采用查询发送模式                              
  36.   
  37.   UCSR1C=(1<<UCSZ01)|(1<<UCSZ00);              //写UCSRC寄存器,异步通信无校验,8位数据1位停止位
  38.   
  39.   UBRR1H=baud_h;                               //写波特率的值
  40.   
  41.   UBRR1L=baud_l;
  42. }

  43. void Send_SingleChar(uchar usart_tx_data)    //串口0发送单个字符
  44. {
  45.         while(!(UCSR0A&(1<<UDRE0)));                     //等待发送寄存器空

  46.         UDR0=usart_tx_data;                                             //写入发送数据

  47.         while(!(UCSR0A&(1<<TXC0)));                             //等待发送完毕

  48.         UCSR0A|=(1<<TXC0);

  49. }
  50. //*************************************************************************
  51. //                串口相关中断服务子程序
  52. //*************************************************************************
  53.                                      //数据发送结束中断向量
  54. SIGNAL(SIG_USART0_TRANS)             //中断服务程序
  55. {
  56.    delay_ms(10);                            //相关操作
  57. }

  58.                                     //数据接收结束中断向量
  59. SIGNAL(SIG_USART0_RECV)             //中断服务程序
  60. {
  61.     usart_rx_data=UDR0;             //将接收到的数据取出
  62.         Send_SingleChar(usart_rx_data); //接收到的数据再发回电脑,显示在串口调试助手上
  63.         /*switch(usart_rx_data)
  64.         {
  65.         case '1':Send_SingleChar(b);break;  //2
  66.         case '2':Send_SingleChar(d);break;  //9
  67.         default :Send_SingleChar(c);break;  //3
  68.         }*/
  69. }
  70. SIGNAL(SIG_USART1_RECV)
  71. {
  72.         buf[counter]=UDR1;
  73.         if(counter==0&&buf[0]!=0x55)return;
  74.         counter++;
  75.         if(counter==10)
  76.         {
  77.                 Send_SingleChar(4);
  78.                 counter=0;
  79.                 sign=1;
  80.         }
  81. }

  82. //*************************************************************************
  83. //                        主程序
  84. //*************************************************************************
  85. int main(void)
  86. {

  87.         usart0();                               //usart0串口初始化配置
  88.         usart1();                                                        //usart0串口初始化配置
  89.   
  90.           SREG|=0x80;                               //开启全局中断
  91.           Send_SingleChar(3);
  92.         
  93.           while(1)
  94.         {
  95.                   if(sign)
  96.                 {
  97.                         if(buf[0]==0x55)
  98.                         {
  99.                                 switch(buf[1])
  100.                                 {
  101.                                         case 0x51:
  102.                                                 a[0]=((short)buf[3]<<8|buf[2])/32768.0*16;
  103.                                                 a[1]=((short)buf[5]<<8|buf[4])/32768.0*16;
  104.                                                 a[2]=((short)buf[7]<<8|buf[6])/32768.0*16;
  105.                                                 Send_SingleChar(a[0]);
  106.                                                 Send_SingleChar(a[1]);
  107.                                                 Send_SingleChar(a[2]);
  108.                                                 break;
  109.                                         case 0x52:
  110.                                                 w[0]=((short)buf[3]<<8|buf[2])/32768.0*2000;
  111.                                                 w[1]=((short)buf[5]<<8|buf[4])/32768.0*2000;
  112.                                                 w[2]=((short)buf[7]<<8|buf[6])/32768.0*2000;
  113.                                                 Send_SingleChar(w[0]);
  114.                                                 Send_SingleChar(w[1]);
  115.                                                 Send_SingleChar(w[2]);
  116.                                                 break;
  117.                                         case 0x53:
  118.                                                 angle[0]=(buf[3]<<8|buf[2])/32768.0*180;
  119.                                                 angle[1]=(buf[5]<<8|buf[4])/32768.0*180;
  120.                                                 angle[2]=(buf[7]<<8|buf[6])/32768.0*180;
  121.                                                 Send_SingleChar(angle[0]);
  122.                                                 Send_SingleChar(angle[1]);
  123.                                                 Send_SingleChar(angle[2]);
  124.                                                 break;
  125.                                 }
  126.                         }
  127.                 sign=0;
  128.                 }
  129.           }
  130. }
复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表