TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: anfelgo en 13 de Agosto de 2009, 17:02:03

Título: reconocimiento de dispositivos en I2C???
Publicado por: anfelgo en 13 de Agosto de 2009, 17:02:03
Estoy haciendo un proyecto en donde un modulo maestro se comunica a traves de I2C con otros modulos esclavos que son extraibles, es decir que no siempre van a estar conectados al modulo maestro. alguno de ustedes sabe si existe alguna forma para saber que modulos estan conectados???
Título: Re: reconocimiento de dispositivos en I2C???
Publicado por: MLO__ en 13 de Agosto de 2009, 17:13:19
Pues lo que se me ocurre es preguntar la direccion de cada Slave, si pasado un tiempo no responde, pues se asumiria que no esta conectado o que tiene un fallo.

Saludos
Título: Re: reconocimiento de dispositivos en I2C???
Publicado por: fabianjsm en 13 de Agosto de 2009, 20:06:23
Hola anfelgo, como dice MLO__ podes preguntar por la direccion de cada esclavo.

Lo que tenes que hacer es enviar la condicion de START, la direccion de 7 bits y luego un octavo bit igual a cero que indica lectura, si el esclavo direccionado esta presente te envia la señal ACK poniendo un cero en el bus de datos.

Como con 7 bits solo se puede direccionar 128 dispositivos, podés barrer todo el rango de direcciones en menos de dos segundos, esto depende de la velocidad con la que estas trabajando obviamente. Tu dispositivo podria hacer esto cuando es reseteado o a cada sierto tiempo.
Título: Re: reconocimiento de dispositivos en I2C???
Publicado por: anfelgo en 14 de Agosto de 2009, 13:38:51
muchas gracias por las respuestas. Estuve leyendo y existe una direccion para llamar a todos los dispositivos, los 8 bits en 0 (7 de direccion y 1 de r/w) y cada dispositivo responde con un ack a esta direccion, lo cual me parece que podria tener alguna utilidad para esto. Alguno entiendo como funciona esto??? es que no entiendo como se hace para que no halla colisiones en el bus y para saber quien fue el que envio el ack.

Gracias
Título: Re: reconocimiento de dispositivos en I2C???
Publicado por: Suky en 14 de Agosto de 2009, 13:46:42
Si tu envías la dirección del dispositivo el único que va a enviar ack va a ser él, así que no habría colisión. Colisión surge cuando hay multimaster, en donde en algún momento mas de un master quiere establecer comunicación con algún dispositivo.

Saludos!
Título: Re: reconocimiento de dispositivos en I2C???
Publicado por: anfelgo en 14 de Agosto de 2009, 14:13:32
Si, eso lo entiendo.Lo que no entiendo es cuando hago un llamado a todos los dispositivos con un "general call address", como se quien fue el que me mando un ack?
Título: Re: reconocimiento de dispositivos en I2C???
Publicado por: Suky en 14 de Agosto de 2009, 14:18:41
Tendrías que direccionar un dispositivo, esperar su ack un determinado tiempo, y seguir, sino no tendrás manera de saber cual fue.

Saludos!
Título: Re: reconocimiento de dispositivos en I2C???
Publicado por: MLO__ en 14 de Agosto de 2009, 14:19:34
Pues lo que se me ocurre es preguntar la direccion de cada Slave, si pasado un tiempo no responde, pues se asumiria que no esta conectado o que tiene un fallo.

 :mrgreen: :mrgreen: :mrgreen:
Título: Re: reconocimiento de dispositivos en I2C???
Publicado por: Suky en 14 de Agosto de 2009, 14:28:25
Pues lo que se me ocurre es preguntar la direccion de cada Slave, si pasado un tiempo no responde, pues se asumiria que no esta conectado o que tiene un fallo.

 :mrgreen: :mrgreen: :mrgreen:
Exactamente, de a uno!  :D
Título: Re: reconocimiento de dispositivos en I2C???
Publicado por: anfelgo en 14 de Agosto de 2009, 14:34:06
Muchas gracias, al parecer usar ese tipo de direccionamiento solo es util cuando quiero que varios modulos reciban el mismo dato :shock:
Título: Re: reconocimiento de dispositivos en I2C???
Publicado por: Suky en 14 de Agosto de 2009, 14:57:20
Muchas gracias, al parecer usar ese tipo de direccionamiento solo es util cuando quiero que varios modulos reciban el mismo dato :shock:
A la vez, no! De a uno por vez si.

Porque para establecer comunicación con un dispositivo, lo direccionas indicando si pretendes leer o escribir, el slave devuelve un ack si todo es correcto. Los demás que tienen distinta dirección, no se dan por enterados.

Saludos!
Título: Re: reconocimiento de dispositivos en I2C???
Publicado por: fabianjsm en 15 de Agosto de 2009, 17:09:47
Como te dije antes. Lo que tenes que hacer es enviar la condicion de START, la direccion de 7 bits y luego un octavo bit igual a CERO que indica lectura, si el esclavo direccionado esta presente te envia la señal ACK llevando a masa el bus de datos.

Una vez que subis la señal de reloj no tenes que esperar tanto, solo lo suficiente por cuestiones de inestabilidad, porque cuando la señal de reloj esta en alto solo el maestro puede variar la señal de datos (lo que indica un START o un STOP). Si queres más velocidad no envies la señal de STOP.

Todos reciben el dato (imagino que ha eso te referis cuando decis "solo es util cuando quiero que varios modulos reciban el mismo dato"). En este caso el dato es la direccion, y solo el que tanga esa direccion te va responder llevando a masa la linea de datos, SDA. Si estas programando en C te paso el codigo, tengo hecho y funcionando, es para determinar la direccion de cada esclavo conectado al bus.
Título: Re: reconocimiento de dispositivos en I2C???
Publicado por: poi en 15 de Agosto de 2009, 18:33:53
Y porque no pruebas a crear una especie de tabla como crean los routers para saber que dispositivos tienes conectados y que se actualice cada cierto tiempo. Es mas no hara falta ni una tabla, con un vector de booleanos para saber si esta o no conectado creo que bastaria.
Título: Re: reconocimiento de dispositivos en I2C???
Publicado por: anfelgo en 18 de Agosto de 2009, 12:00:41
Ya todo esta mucho mas claro :). Voy a ejecutar una rutina cada vez que se encienda el modulo principal que identifique la direccion de cada esclavo conectado. Por cierto fabianjm, seria de gran ayuda si me puedes hacer el favor de enviarme el codigo. Cualquier cosa les aviso


Muchas Gracias
Título: Re: reconocimiento de dispositivos en I2C???
Publicado por: fabianjsm en 21 de Agosto de 2009, 15:17:08
Este es el codigo. Le modifique un poco dejando solo lo relacionado al i2c para evitar confuciones y le agregue varios comentarios.
Espero que me disculpes por la demora, resulta que me quede unos dias sin internet.
Título: Re: reconocimiento de dispositivos en I2C???
Publicado por: fidodido18 en 22 de Agosto de 2009, 15:59:34
Código: [Seleccionar]
#define sda_entrante()   TRISA |= 1
#define sda_saliente()   TRISA &= ~1
#define scl_entrante()   TRISA |= 2
#define scl_saliente()   TRISA &= ~2

para que utilizas esto??

Título: Re: reconocimiento de dispositivos en I2C???
Publicado por: fabianjsm en 23 de Agosto de 2009, 01:13:47
Esas macros definen la direccion de las señales.
Por ejemplo, despues de utilizar la macro 'sda_entrante()', la linea de datos queda configurada como 'de entrada', y podes leerla.
Lo unico que hacen es poner a uno o a cero el bit correspondiente del registro TRIS.
Como no se utiliza directamente los registros TRIS en ninguna funcion, si queres que SDA sea RB2 por ejemplo, solo tendrias que hacer estas modificaciones:
#define sda   RB2
#define sda_entrante()   TRISB |= 4  /* El cuatro sale de 1<<2 */
#define sda_saliente()   TRISB &= ~4
Título: Re: reconocimiento de dispositivos en I2C???
Publicado por: anfelgo en 24 de Agosto de 2009, 14:33:28
Muchas gracias fabianjm por el codigo. Los comentarios que agregaste hace que quede muy facil entenderlo.