Cuando se trabaja con microcontroladores, muchas veces es encesario agregar algunas funcionalidades extras que no contiene el micro que usamos, por ejemplo: sensores de temeratura o ultrasonicos, y es comun que dispositivos de este tipo se comuniquen con el bus i2c, lo que ahorra el uso de pines en el procesador.
Tambien es común que ciertos dispositivos que tienen la funcion complementaria que buscamos no se conecten al bus i2c, como por ejemplo una LCD de 16×2
Estos dispositivos, como se puede observar requieren mas recursos de hardware de nuestro microcontrolador. Por estos mismos dispositivos, a veces necesitamos incluir en nuetros proyectos microcontroladores mas grandes y programacion mas elaborada sin realmente necesitar tanto «poder».
Esto nos llevó a investigar, usando microcontroladores AVR de la serie Mega, como usar el hardware i2c que poseen para usar el procesador como esclavo; las razones para esta busqueda fueron muy sencillas:
- Simplificar el diseño del hardware. Al convertir parte del hardware en i2c (por decirlo de alguna manera), esas partes se hacen portables a otros proyectos, lo que el tiempo de diseño electronico disminuye.
- Dessarollo rapido y ligero de software. Como las funciones que interactuan con los perifericos extras estan en los procesadores que hacemos «esclavos», descargamos al procesador principal de esas funciones secundarias, lo que se traduce en menos lineas de codigo en el procesador principal; ademas de que podemos guardar variables que competen al uso de los perifericos en su procesador esclavo y tambien aligeramos el uso de la ram de nuestro porcesador principal.
- Multiproceso. Como estamos agregando procesadores, podemos hacer que hagan calculos de forma paralela a nuestro «hilo» (procesador) principal, esto puede ser muy util en aplicaciones de control, ya que «hilos» secundarios pueden estar dedicados, por ejemplo, a calculos de algortimos PID.
- Actualizacion y mantenimiento. Como nuestro proyecto se vuelve modular, es mas facil corregir errores en programas pequeños (aunque sean varios), que en un solo y monstruso programa.
Desventajas. Hay costos por hacer este tipo de implementaciones (siempre los hay):
- Incremento de costo de producción. Como estamos agregando procesadores extras ( y estos cuestan ) nuestro proyecto puede no quedar tan economico.
- Incremento en espacio. Esto se sigue del punto anterior. mas procesadores, mas espacio.
Pero bueno, pasemos a la implementacion. El tema del manejo del i2c en modo master, ha sido estudiado por muchas personas mucho tiempo, solo hay que googlear algunas palabras y tendremos a la mano una libreria para nuestro micro favorito. Pero para trabajar en modo esclavo, la informacion es escasa y en la mayoria de los casos muy oscura o demasiado tomada a la ligera. Es por eso que desarrollamos esta libreria para hacernos la vida mas facil.
En nuestro caso, optamos por los procesadores AVR de la serie Mega, ya que poseen un hardware TWI (i2c) de muy facil configuracion.
La libreria que compartimos ahora, esta para compilarse con el AVR-GCC para tener una base general, pero se puede portar facilmente a otros compiladores, de hecho lo usamos con el compilador CodeVision sin problemas.
La forma que implementa esta libreria el modo esclavo es simple: emula una memoria eeprom serial (como alguna de la serie 24LCXX), esto es, crea un buffer accesible al procesador master para lectura/escritura y que en el programa del procesador esclavo esta visto como un arreglo.
Este arreglo de intercambio puede servir para guardar variables, configuraciones, escribir mensajes, etc.
Para su uso solo hay una función de inicialización: «i2c_slave_ini()» donde indicaremos que dirección tendrá nuestro nuevo procesador esclavo (esta librería no contempla funciones «general call», no las necesitamos por el momento ), lo demas es hecho en el buffer y la interpretación de cada «registro» dependerá de la aplicación.
La transmisión típica debería ser: primero escribir el registro a leer/escribir, que indicara a la libreria donde escribir/leer y después hacer la lectura/escritura. El driver recorre automáticamente el puntero del registro a leer. La secuencia de operación es igual que si trabajáramos con una memoria 24LCXX.
En fin aqui, despues de tanto rollo, esta la libreria i2c en modo escalvo
Espero que les ahorre los dolores de cabeza que nosotros tuvimos jejejejeje.
Notas finales.
- Si quieren saber mas acerca del bus i2c, lean directo el manual del bus, es mas sencillo de leer de lo que parece. La verdad les recomiendo esta lectura, mas cuando necesitan conectar muchos dispositivos ya que hay limites de hardware y variantes del bus que pueden ser utiles a sus proyectos.
Sin mas por el momento….