Estoy intentando leer los valores del acelerómetro de mpu 6050 en atmega328p (Arduino UNO). Quiero un programa en C incorporado, por eso no quiero usar ninguna biblioteca externa. Así que leí sobre el protocolo I2C, leí la hoja de datos de MPU 6050, registré la hoja de MPU 6050 y desarrollé un código según mi entendimiento. Aquí está el código
#include<avr/io.h>
const int MPU_addr=0x68;
void i2c_init() {
TWSR=0x00;
TWBR=0x48;
TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWEA);
}
void i2c_start() {
TWCR=(1<<TWEN)|(1<<TWINT)|(1<<TWSTA);
while((TWCR&(1<<TWINT))==0);
}
void i2c_stop() {
TWCR=(1<<TWEN)|(1<<TWINT)|(1<<TWSTO);
}
void i2c_write(uint8_t data) {
TWDR=data;
TWCR=(1<<TWINT)|(1<<TWEN);
while((TWCR&(1<<TWINT))==0);
}
uint8_t i2c_read(unsigned char isLast) {
if(isLast==0) {
TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWEA);
}
else {
TWCR=(1<<TWINT)|(1<<TWEN);
}
return TWDR;
}
int main() {
uint16_t i;
i2c_init();
i2c_start();
i2c_write((MPU_addr<<1)|(1<<0));
i2c_write(0x6B);
i2c_write(0);
i2c_stop();
Serial.begin(9600);
while(1) {
i2c_start();
i2c_write((MPU_addr<<1)|(1<<0));
i2c_write(0x3B);
i2c_start();
i2c_write((MPU_addr<<1)|(0x00));
i=(i2c_read(0)<<8)|i2c_read(0);
Serial.println(i,BIN);
}
return 1;
}
El problema está en el bucle while, el programa se bloquea después de i2c_start (); llamada. He comprobado esto poniendo un Serial.println ("a"); después de esa línea, pero nada se imprime en el monitor de serie. También he comprobado que el programa entra en el bucle while con éxito. Entonces, ¿alguien puede ayudar dónde está el problema en el código?
Nota: 1. Todas las funciones i2c están de acuerdo con el libro "El microcontrolador Avr y el sistema integrado que utiliza el ensamblaje y la C" de Ali Mazidi ".