极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 14276|回复: 2

好心人快来帮帮新人啊,MsTimer2与I2C是否有冲突呢?

[复制链接]
发表于 2016-3-25 00:21:06 | 显示全部楼层 |阅读模式
在定时中断OnTimer()内调用MPU6050的getMotion6时,串口输出都会停下来,注释掉这个调用,只保留loop()中的getMotion6才能串口正常输出。
gy-521连接了VCC、GND、SCL、SDA。
请大侠赐教,问题出在哪里了?如何解决?
==================================
#include "Wire.h"
#include "I2Cdev.h"
#include "MPU6050.h"
#include <MsTimer2.h>
#define INTERVAL 1000

MPU6050 accelgyro;
int16_t ax, ay, az;
int16_t gx, gy, gz;
float Ax, Ay, Az;

void setup()
{
    Serial.begin(9600);
    InitMPU();
    MsTimer2::set(INTERVAL, OnTimer);
    MsTimer2::start();
}

void loop()
{
    accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
}
//初始化MPU6050
void InitMPU()
{
    Wire.begin();
    Serial.println("Initializing I2C devices...");
    accelgyro.initialize();
    Serial.println("Testing device connections...");
    Serial.println(accelgyro.testConnection() ? "MPU6050 connection successful" : "MPU6050 connection failed");
}

void OnTimer()
{
  Serial.println("------------");
  //accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
  Ax=ax/16384.00;
  Ay=ay/16384.00;
  Az=az/16384.00;
  Serial.print(atan(Ax/sqrt(Az*Az+Ay*Ay))*180/3.14);Serial.print(",");Serial.println(gy);
   
}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2016-3-26 14:02:02 | 显示全部楼层
在msTimer2定时器触发的时候是不可以使用串口的,所以你这个程序要做一个修改。1,先定一个标志位,可用bool型变量。2,定时器触发的函数内将标志位改为 true。3,串口程序根据标志位来工作,记得每次串口工作之后把标志位该回去。具体的情况请参考 http://www.arduino.cn/thread-12435-1-1.html 这里的说明。希望对你能有帮助
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-3-27 09:13:26 | 显示全部楼层
rick_hou 发表于 2016-3-26 14:02
在msTimer2定时器触发的时候是不可以使用串口的,所以你这个程序要做一个修改。1,先定一个标志位,可用boo ...

好的,多谢指点!我也找到了一个办法:ARV单片机默认不允许中断嵌套,而getMotion6()是给予I2C的,也是需要靠中断执行的,所以只要在调用getMotion6之前用sei()人为打开中断,getMotion6就能正常执行下去了。目前还没发现这方法有什么不妥之处。
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-15 02:14 , Processed in 0.039466 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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