Autor Tema: Depurando el bus I2c bit a bit con logger digital, CCS y Proteus ( Isis)  (Leído 2480 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado PICPOWER

  • PIC10
  • *
  • Mensajes: 17
Saludos foreros picmaniacos.

Un gusto escribir este post y tratar de ser parte del engrandecimiento de este foro.

He teido muchos problemas con el protocolo I2c. Este proyecto es parte de un circuito de nanoposicionamiento a piezoeléctricos (de hecho de resolución subnanométrica, del orden de 1x10^-10 [m]). Para lo cual uso 3 DACs de 18 bits (X,Y y Z), más un cuarto que impondrá la corriente de tunelaje (del orden de 1 ó 2 [nA]). Bien, una parte de la instrumentación ya está comprada, la otra la diseño yo. Ya me comunicqué con los DACs (PCM69). Pero el sistema diseñado incluye un Master y 4 esclavos en bus I2c. El Master le dice a cada esclavo el paso que debe de tomar (voltaje de salida).

El problema objetivamente es que no recibo lo que quiero recibir, al menos no en el momento en que se supone debería recibirlo. Y lo peor, es que la comunicación entre los PICs se muere. Uso de Master: 16F886 y de Esclavo: PIC16F88. El 16F88 (que sólo puede ser Slave). He visto que muchísimos foreros tienen problemas de comunicación con bus I2c. Empecé con Isis, todo simulado, pero me cansé de hacer pruebas, navegando encontré que Isis no es muy confiable para el bus I2c. Pero debo decir que yo he hecho proyectos completos usando el bus I2c para memorias I2c EEPROMs. Y ese es el chiste, Isis sirve excelentemente con memorias I2c EEPROMs (y con los relojes DS130x), mas no estoy seguro de lo bien que funcione con otros dispos. Después de muchas pruebas abandoné ISIS y como en este momento, a depurar bit a bit. Para lo cual cuento con un logger digital que además es capaz de depurar I2c, SPI, etc...

Es uno de los mejores juguetes que he comprado, el logger digital me permite tomar muestras de hasta 24 [MHz] en un bus de 8 bits. Por 150 dólares, puedes ser la envidia de tus compañeros electrónicos  8) ( http://www.saleae.com/logic/features/ ). En fin, conectando todo, me dispuse a ver la comunicación, que no estaba del todo mal... En la imagen DSCN0584 se aprecia el circuito ( lo armé muy rápido, ya sé que se ve feo) y en la imagen DSCN0585 se ve el loger con su programa de fondo.

Ahora bien, el circuito usado es simplemente ambos PICs conectados a travás de clock y datos de I2c, más un led cada uno (sobre RB7), para comprobar que los PICs prenden y ejecutan su programa.

El problema... logré la comunicación, pero no es satisfactoria, de inicio el micro suele no responder bien cuando el Master quiere leer al Slave y lee 0xFF... pero después de algunas lecturas, los micros se ponen las pilas y empiezan la comunicación de lectura como debe de ser, es como si en lectura, al principio arrojara basura (ver imagen Log Completo y Log Primer Byte Read). La escritua, está bien, o eso parece (ver Log Primer Byte Write) Y lo más raro, es que aunque he colocado la lectura y escritura en un ciclo infinito, la comunicación se muere completamente a los casi 32 [ms] (y no, no hay WDT activado, ver final del log en imagen Log Completo). En un post, Nocturno comenta que es problema de overflow del buffer de I2c... no sé si eso me pase aquí.

Los programas son los expuestos (Master y Slave). Si alguien quiere ayudar, se lo agradecería mucho, por mi parte; rendirme no es opción, esto queda porque queda. Además, no he visto que nadie ponga a prueba el CCS a prueba por medio de un logger, y he visto muchos posts de intentos fallidos. Sería bueno postear una solución 100 % confiable, porque por más que navego, no hallo post que me oriente, o... ¿será que busco mal? Alguien ilumíneme si es así...

Desconectado PICPOWER

  • PIC10
  • *
  • Mensajes: 17
Re: Depurando el bus I2c bit a bit con logger digital, CCS y Proteus ( Isis)
« Respuesta #1 en: 18 de Julio de 2009, 18:07:52 »
Mmmhhh... no me dejó postear esta imagen...

Desconectado PICPOWER

  • PIC10
  • *
  • Mensajes: 17
Re: Depurando el bus I2c bit a bit con logger digital, CCS y Proteus ( Isis)
« Respuesta #2 en: 20 de Julio de 2009, 14:50:29 »
Saludos foreros...

Tengo noticias. Ya va funcionando esto, pero aún tiene detalles y tengo observaciones que comentar.

Primero, lo de los primeros bytes basura lo solucioné muy fácilmente colocando un retardo de 16 ms, con lo que le doy tiempo al SLAVE de configurar su módulo embebido I2c. Con esto, desde el primer byte, la info recibida es la correcta.

Segundo, como habrán visto, tenía configurado al bus a 450,000 bauds... pero en realidad, si revisaron las fotos que tomé directamente del logger, no funcionaba sino a unos 70 kbps, lo cual dista demasiado de los 450kbps. Bueno, esto es obvio ya que no forcé al hardware a ser activado, es decir, CCS se comunica por software y el módulo embebido I2c no está activo. Después de agregar force_hw, sorpresa, la velocidad subió a 500kbps. Lo cual, por cierto, no son 450kbps. Lo interesante es que yo creí que podría elevar la velocidad a niveles insospechadeos. Sólo limitado por unbyte de tipo BaudRateGenerator (como en las UARTs). Pero no fue así, aún no sé por qué, pero la máxima velocidad que he logrado obtener es 666.667 kbps. Si coloco fast=1000000, o sea 1M, no sirve, la velocidad máxima es la antepuesta. Ni siquiera colocar 1.2M. Y cuando pongo 2000000, 2M; aunque el compilador acepta perfectamente los valores, el programa se pierde, o mejor dicho, el módulo embebido se pierde. Al principio creí que el problema sería la velocidad del logger, así que subí la velocidad a 16MHz y nada, el módulo I2c en un momento se pierde y no deja de enviar pulsos de CLK sin ningún dato.

El otro problema que tengo, realmente grave problema, es que el módulo I2c se pierde a los 3230 us a partir del primer pulso de CLK mandado por el módulo I2c. Esto siempre lo hace a partir de una petición de lectura del MASTER, es cuando el SLAVE ya no responde y en ese punto, el sistema se muere.

A solucionar: Principalmente el por qué se muere en la lectura al cabo de un rato. Depués, si es es correcto que después de una mandar un READ (de Master a Slave), el esclavo responde con un byte, pero sin Acknowledge. Revisando el datasheet de la comunicación, no es correcto, aunque sí recibo bien el byte. Y lo importante al final es obtener una comunicación byte a byte, sin detenerme, para optimizar la comunicación a lo más rápido posible.

En la imagen, Logger 667kbps, se nota la lectura y su NoAcknowledge. En fin, hoy seguiré trabajando.

Saludos... PICPOWER.

Desconectado Duende_Azul

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 902
Re: Depurando el bus I2c bit a bit con logger digital, CCS y Proteus ( Isis)
« Respuesta #3 en: 20 de Julio de 2009, 15:58:58 »
Una herramienta muy útil para depuración de protocolos series es el pickit serial analyzer de microchip.

http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1406&dDocName=en028600

Desconectado PICPOWER

  • PIC10
  • *
  • Mensajes: 17
Re: Depurando el bus I2c bit a bit con logger digital, CCS y Proteus ( Isis)
« Respuesta #4 en: 20 de Julio de 2009, 19:59:55 »
Hola duende Azul.

Gracias por el interés. Me encanta la opción. De hecho, tal vez hubiera elegido ese Analyzer. Pero a estas alturas, ya buen parte del trabajo está hecho. Además de que noto mi logger mucho más rápido y con mejores prestaciones como logger. Lo malo es que no emula, tal como veo que lo hace este Analyzer.

En fin, muchas gracias por el aporte, si cuentas con él, creo que a más de uno nos serviria tus comentarios al respecto...


Bytes...