Buenas Sokoloko
La verdad es que este proyecto lo dejé hace un tiempo precisamente por tener problemas con la conexión con el WMP. Sin embargo y para felicidad mia hace unos dias lo retomé y conseguí finalmente la conexión, qué casualidad no?

Para empezar un pequeño error mio que mejor que soluciones:
void pedir_datos()
{
i2c_start();
i2c_write(0xA4);
i2c_write(0x00); //Se manda 0 antes de cada petición de datos
}Aquí se me olvidó cerrar la conexión con i2c_stop(). De todas formas, en el siguiente i2c_start() la conexión se reinicia y no hay más problema, a mí me funcionó bien con el nunchuk hasta que me di cuenta pero, por si acaso, añádele este comando.
Bueno, supondré que el LCD lo tienes bien conexionado y que te has asegurado de que representa bien los datos que le mandas. También de que has conexionado bien el WMP. Preguntas por qué no uso la dirección 0x52 para comunicarme con el WMP. Bien, si usas una calculadora científica capaz de pasar de hexadecimal a decimal y etc (como la que trae win7) observarás que 52 de hexadecimal pasado a binario es 1010010. Esto son 7 bits y el compilador de CCS requiere direcciones de 8 bits siempre. Por lo tanto para rellenar añadimos un 0 al final, osea, 10100100 que en hexadecimal es A4, precisamente la dirección que uso en mi ejemplo, lo pillaste?. Lo mismo para la dirección A6 (53).
Por otro lado, la función inicio_wm() la he cambiado recientemente por otra ya que a veces me ha fallado y no ha iniciado el WMP. Esta es la que uso actualmente con buenos resultados:
void inicio_wm()
{
i2c_start();
i2c_write(0xA6);
i2c_write(0xF0);
i2c_write(0x55);
i2c_stop();
delay_ms(1);
i2c_start();
i2c_write(0xA6);
i2c_write(0xFE);
i2c_write(0x04);
i2c_stop();
delay_ms(1);
i2c_start();
i2c_write(0xA4);
i2c_write(0xFB);
i2c_write(0x00);
i2c_stop();
} También he ordenado adecuadamente los datos que obtengo con el WPM, al menos eso creo por lo que he podido observar. Te muestro dos códigos que difieren ligeramente, prueba ambos a ver cual te convence más, yo a ver si los comparo suficientemente y averiguo cuál es mejor aunque seguramente sean iguales. Estas son las variables que tienes que enviar al lcd, puedes definirlas como int. Inserta esto después de obtener los datos por i2c:
roll = (((datos[4]&0xFC)<<6) + datos[1]);
pitch = (((datos[5]&0xFC)<<6) + datos[2]);
yaw = (((datos[3]&0xFC)<<6) + datos[0]);
yaw=((datos[3]>>2)<<8)+datos[0];
pitch=((datos[4]>>2)<<8)+datos[1];
roll=((datos[5]>>2)<<8)+datos[2];
Después de cualquiera de los dos párrafos anteriores te invito a que insertes otro más, esta vez para mostrar los bits que el WMP envía para saber el "modo de velocidad" del giroscopio. Para saber más mira en internet. Los valores posibles son 0 o 1, así que puedes definir estas nuevas variables como int1.
roll_fs = (datos[4]&0x02)>>1;
pitch_fs = (datos[3]&0x01);
yaw_fs = (datos[3]&0x02)>>1;
Con el WMP parado mostrarán 0, pero en cuanto lo agites un poco mostrarán 1.
Con respecto al nunchuk el primer código que posteé siempre me ha ido bien y está correctamente ordenado, no deberías tener problemas con él. Si después de estos cambios el pic sigue como "colgado" vuelve a revisar las conexiones, los fallos de conexiones sobretodo con protoplacas son muy puñeteros

Espero que te haya servido de algo. Si tienes más dudas que humildemente pueda ayudarte a solucionar, aquí estaré
