TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Vala220805 en 05 de Diciembre de 2016, 18:54:18
-
Buen dia a todos.
Estoy trabajando en un proyecto donde debo mover unos servos por medio de un imu, para esto se que debo hacer uso de la comunicación i2c. Pero es aqui donde tengo problema, al momento de simular la i2c, me da ruido el i2c, adjunto mi codigo por si me pueden ayudar, muchas gracias. Por cierto uso mikroc como compilador
- Tienes que ingresar para ver archivos adjuntos -
Despues de haber agregado las interrupciones, ocurrio esto
- Tienes que ingresar para ver archivos adjuntos -
-
¿Las lineas de datos y clock del I2C tienen resistores de pullup?
-
Gracias por tu respuesta, si los pullups estan activados
-
Ok... ahí no me dejaste otra opción que mirar el ćodigo :P
Aparentemente en el main() pusiste código de prueba, porque veo que hay funciones de lectura y escritura de registro que no están siendo llamadas.
Cuestiones:
1) Adentro del while(1) usas _start(), _Wr(), _Stop() cosa que no haría nada porque la acción solo sería tomar el bus i2c, escribir dirección del esclavo, y parar. Habría que mandar otro dato que sería la dirección del registro a leer. Quiero decir, que la secuencia sería (sacado de http://download.mikroe.com/documents/compilers/mikroc/pic/help/i2c_library.htm ):
Para leer un registro:
I2C1_start();
I2C1_Wr(direccionEsclavo);
I2C1_Wr(direccionRegistro);
I2C1_Repeated_Start();
I2C1_Wr(direccionEsclavo + 1);
valorRegistro = I2C1_Rd(0);
I2C1_Stop();
Para escribir un registro:
I2C1_start();
I2C1_Wr(direccionEsclavo);
I2C1_Wr(direccionRegistro);
I2C1_Wr(valorAEscribirEnRegistro);
I2C1_Stop();
1.1) Hacen falta los delay() entre las funciones que mencioné arriba?, creería que son funciones no asíncronos, o síncronas bah, pero en última instancia no deberían alterar el comportamiento.
2) ¿Será que está mal la dirección de esclavo? veo que en tu código del main estás usando
I2C1_Wr( 0x42 );
Pero luego en MPU6050.c veo
#define MPU6050_ADDRESS 0b11010010
Que sería 0xD2 y no 0x42.
Verifica que la dirección de esclavo sea la correcta, de lo contrario el esclavo I2C no responderá nada porque le estaríamos hablando al dispositivo equivocado.
-
Muchas gracias por responder.
Si en efecto solo es de prueba el while, y si ya intente con la configuracion como viene en el ejemplo de mikroc
Referente a los delay ya los agregue, meti un delay de 100ms entre las funciones.
Y lo de la dirección, por lo mismo que era de prueba meti esa, pero aun haciendo los cambios como me comentas, sigue metiendome ruido, de hecho ocurrio algo curioso, ahora me aparecen mas signos de interrogación en el debugger. adjuntare eso en el primer mensaje.
Añadiendo informacion, ya comprobe que el bit ack este respondiendome, y lo hace. aun sigo sin encontrar el fallo.
-
La direccion esta formada por 7 bits. 6 son : 110100
1 depende del pin 7 del MPU, si esta en 1 queda: 1101001
Si esta en 0 queda: 1101000
Luego el 8vo bit es para escribir/leer.
Sera por que el pin7 estara en 0 ?
-
Gracias por tu respuesta KILLERJC,
Por lo que entendi en el datasheet, en efecto son 7 bits los del mpu, el LSB bit puede ser uno o cero, pero tengo entendido que esto es para identificar al mpu, por que se pueden poner dos mpu en el mismo pic, pero para identificarlos uno sera 1101000 y otro seria 1101001. mas el octavo bit que como mencionas seria el de escritura o lectura
-
Exacto, ese 7mo bit tendrias que ver, si es 1 o 0. Ese 7mo bit se toma desde uno de los pines del MPU que creo que se llama AD0, pero para no complicarse la vida midiendo. Proba con la direccion 1101000 y si fuonciona era la direccion :P
-
Tienes mucha razon KILLERJC por esa parte del mpu si, pero aun tengo el problema con la comunicacion i2c, que me esta metiendo mucho ruido en la simulación
-
ruido en la simulación
En una simulacion no tenes ruido... es algun otro problema seguro.
-
Bueno eso si tienes razon, a lo que me refiero es que al usar el i2c debugger, me aparece que existe ruido y me salen esos signos de interrogación, se que debe ser algun error en el codigo, pero no ubico cual es. Ya que probe con otro ejemplo de i2c en proteus, y no me salieron esos signos de interrogacion.
Gracias por responder
-
.... Las pull-ups de que valores son?
... Por que se esta enviando un start y un stop? Ya que segun el datasheet del MPU es
start ( S )
direccion
direccion registro
dato
stop ( P )
Es eso o la simulacion anda para la ............ ( rellene con el sustantivo que mas le parezca )
Y tal ves os estamos rompiendo la cabeza cuando es el simulador que no funciona. O tal ves ni si quisiera tiene realizado la simulacion del MPU
-
:D Bueno en esa parte puede que sea verdad, a lo mejor solo es la simulacion que da problemas, en estos dias probare en fisico. Muchas gracias por sus respuestas