====== Código fuente ====== Primero se inicializaron las funciones y variables globales necesarias según lo especificado por las hojas de fabricante del MPU-6050 y del microcontrolador ATmega16 para el protocolo I2E o tambien llamado TWI: // Encabezados de las funciones usadas. void TWI_init_SCL(void); // Inicializa el SCL con los valores de bit rate (TWBR) y prescala (TWSR). void TWI_start_condition(void); // Se manda la condición de inicio (START). void TWI_device_address(unsigned char); // Se escribe la dirección del esclavo (MPU-6050) cuando se está escribiendo. void TWI_register_address(unsigned char); // Dirección del registro del MPU-6050 que se desea leer (ACCEL_XOUT[15:8]) void TWI_start_repeated(void); // Se repite condicion de inicio (START) para lectura. void TWI_device_address_read(unsigned char); // Se escribe la dirección del esclavo (MPU-6050) cuando se está leyendo. unsigned char TWI_read_data(void); // Se devuelve la lectura del dato del MPU-6050. void TWI_stop(void); // Condición de parada. // Variables globales usadas. unsigned char slave_address=0xD0; // Dirección del MPU-6050 con AD0 a tierra 0b1101000X, el último bit es para indicar lectura o escritura. unsigned char register_acelX_address=0x3C; // Dirección del registro que tiene la aceleración en eje X. unsigned char read=1, write=0; // Estados de lectura (1) y escritura (0). Luego de esto viene el programa principal encargado de controlar el comportamiento del ATmega para la aplicación desarrollada, la primera línea de código define una matriz que posee la palabra "EIE" formada por columnas de 8 bits, estas columnas son las que desplegaran en los leds: // Programa principal. int main(void) { // Matriz con las letras a desplegar en los leds. unsigned char letras[] = {0x00,0xFF,0xFF,0xDB,0xDB,0xDB,0xC3,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0xDB,0xDB,0xDB,0xC3,0x00}; A continuación viene la secuencia de uso del protocolo I2C ya visto anteriormente en una imagen, simplemente se llaman las funciones que conforman cada parte del esquema del I2C: DDRA = 0xFF; // Activa los 8 puertos DDRA. TWI_init_SCL(); // Inicializa el SCL. PORTA = (1< acel_X_init) { if (i == 20) { i = 0; PORTA = letras[i]; } else { i = i+1; PORTA = letras[i]; } } // Si la aceleración fue negativa. if (acel_X_fin < acel_X_init) { if (i == 0) { i = 20; PORTA = letras[i]; } else { i = i-1; PORTA = letras[i]; } } acel_X_init = acel_X_fin; } TWI_stop(); } Se implementan las funciones definidas al principio para poder establecer la comunicación; primero hay que definir el reloj SCL a partir de dos registros que dan en la hoja del fabricante: // Inicializa el SCL con los valores de bit rate (TWBR) y prescala (TWSR). void TWI_init_SCL(void) { TWBR=0x08; // Bit rate. TWSR=(0<