Overflow enthusiasts!
I am trying to log accelerometer and gyro data using Serial.print. I have enabled the FIFO_Overflow interrupt. Whenever I log data, the serial port freezes. I am suspecting an interrupt issue while I am using Serial.print. Is there any way to get continuous data for debugging purposes? I know that the Serial library can affect interrupts and wonder whether you guys could help me a little bit ?
#include "Wire.h"
#include "I2Cdev.h"
#include "MPU9150.h"
#include "helper_3dmath.h"
// class default I2C address is 0x68
// specific I2C addresses may be passed as a parameter here
// AD0 low = 0x68 (default for InvenSense evaluation board)
// AD0 high = 0x69
MPU9150 accelGyroMag;
#define LED_PIN 13
volatile boolean state_fifo_int = false;
uint16_t fifo_count;
uint8_t fifo_buffer[8];
int16_t acc_temp[3];
int16_t gyro_x;
void setup(){
// join I2C bus (I2Cdev library doesn't do this automatically)
Wire.begin();
// initialize serial communication
// (38400 chosen because it works as well at 8MHz as it does at 16MHz, but
// it's really up to you depending on your project)
Serial.begin(115200);
// initialize device
Serial.println("Initializing I2C devices...");
accelGyroMag.initialize();
// verify connection
Serial.println("Testing device connections...");
Serial.println(accelGyroMag.testConnection() ? "MPU9150 connection successful" : "MPU9150 connection failed");
// configure Arduino LED for
pinMode(LED_PIN, OUTPUT);
attachInterrupt(0,fifo_int,CHANGE);
}
void fifo_int() {
state_fifo_int = true;
}
void loop(){
while(!state_fifo_int) {
accelGyroMag.setIntFIFOBufferOverflowEnabled(true);
// enable fifo_interrupt
accelGyroMag.setFIFOEnabled(true);
accelGyroMag.setAccelFIFOEnabled(true);
accelGyroMag.getXGyroFIFOEnabled();
accelGyroMag.getAccelFIFOEnabled();
fifo_count = accelGyroMag.getFIFOCount();
accelGyroMag.getFIFOBytes(fifo_buffer,8); // fill in fifo bytes
acc_temp[0] = (((int16_t)fifo_buffer[0]) << 8) | fifo_buffer[1];
acc_temp[1] = (((int16_t)fifo_buffer[2]) << 8) | fifo_buffer[3];
acc_temp[2] = (((int16_t)fifo_buffer[4]) << 8) | fifo_buffer[5];
gyro_x = (((int16_t)fifo_buffer[6]) << 8) | fifo_buffer[7];
Serial.print((float)acc_temp[0]/16384);
Serial.print(" ");
Serial.print((float)acc_temp[1]/16384);
Serial.print(" ");
Serial.print((float)acc_temp[2]/16384);
Serial.print(" ");
Serial.println(gyro_x);
}
accelGyroMag.setIntFIFOBufferOverflowEnabled(false);
// disable fifo_interrupt
accelGyroMag.resetFIFO();
state_fifo_int = false;
}
The library for the MPU9150 is by Jeff Rowberg.
Whenever I log data, the serial port freezes
- after how much data? A line? 100 lines? – Nick Gammon♦ Aug 9 '15 at 3:02