好心人快来帮帮新人啊,MsTimer2与I2C是否有冲突呢?
在定时中断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);
}
在msTimer2定时器触发的时候是不可以使用串口的,所以你这个程序要做一个修改。1,先定一个标志位,可用bool型变量。2,定时器触发的函数内将标志位改为 true。3,串口程序根据标志位来工作,记得每次串口工作之后把标志位该回去。具体的情况请参考 http://www.arduino.cn/thread-12435-1-1.html 这里的说明。希望对你能有帮助 rick_hou 发表于 2016-3-26 14:02 static/image/common/back.gif
在msTimer2定时器触发的时候是不可以使用串口的,所以你这个程序要做一个修改。1,先定一个标志位,可用boo ...
好的,多谢指点!我也找到了一个办法:ARV单片机默认不允许中断嵌套,而getMotion6()是给予I2C的,也是需要靠中断执行的,所以只要在调用getMotion6之前用sei()人为打开中断,getMotion6就能正常执行下去了。目前还没发现这方法有什么不妥之处。
页:
[1]