5 votos

Puede pines GPIO interferir el uno con el otro?

Tengo una simple circuito donde no bitbang I2C (SCL/SDA es GP5/GP4) en un pic 12F629. Funciona perfectamente, todos los tiempos son correctos, no hay errores, etc. La exacta esquemático es irrelevante, porque yo la deconstrucción de todo el circuito de bloques básicos y probado cada parte por separado para asegurarse de que el esclavo no tiene la culpa.

Nota que he probado con diferentes chips y los diferentes modelos y el problema persiste.

Ahora me quiero llevar un pin aleatorio, decir GP2 baja. En el momento en que hago esto, el I2C de la forma de onda se vuelve loco. Aquí está la forma de onda después de tirar de la GP2 baja (SDA azul, SCL amarillo): enter image description here

Después de algunos experimentos, aquí están mis conclusiones:

En I2C los dispositivos sólo son permitidos tire hacia abajo o de liberación de la SDA/SCL (en cuyo caso son sacados de pull-ups). Así, en orden a designar ALTA establecemos SCL SDA o pin de entrada y por lo tanto se libera y se detuvo a +5V, y para designar BAJA, se establece que la salida y es conducido BAJO. Por supuesto, para la unidad SDA/SCL baja cuando la configuración de la salida, durante la inicialización del programa tanto estos pines son el primer conjunto de salida y dado el valor BAJA, por lo que ahora cada vez que se activan a partir de las entradas en salidas durante el i2c de comunicaciones que se dirigen automáticamente de BAJA.

Y esa última parte es donde yo pienso que todo se rompe.

Si después de un cierto punto, después de una comunicación i2c, yo conduzco un pin GPIO por ejemplo. GP2 BAJA o ALTA, esto de alguna manera afecta el GPIO valor de los OTROS pines gpio (es decir, SCL/SDA), que se mete de todo. es decir. SDA/SCL pines GPIO se establece en 1, así que cuando se cambia de la entrada a la salida durante el i2c comms, que toma el valor 1 en lugar de 0 y por lo tanto en lugar de conducir el bus i2c BAJA que la unidad es ALTO, lo que no está permitido. Y ahora la única manera de hacer que funcione de nuevo es: 1. Conjunto de SDA/SCL dirección en TRISIO a la SALIDA 2. Conjunto de SDA/SCL valor en GPIO 0 3. Conjunto de SDA/SCL dirección de regreso a la entrada para liberar el bus y se deja tirado por la pullups.

Y ahora estamos listos para reanudar la comunicacón. Hasta que me tire otro GPIO de alta o de baja del curso donde todo es jodido de nuevo.

Ahora mi pregunta es esta: ¿Cómo se podría ir sobre la fijación de este? Este podría ser un leer-modificar-escribir problema? Pensé que esto sería un problema común, yo estaba seguro de que habría un montón de personas que utilizan i2c y un pin gpio a la vez y tienen ellos interefere el uno con el otro, pero mis búsquedas no devuelve resultados.

Mantenga en mente que no hay nada conectado a la uC, pero el osciloscopio. He quitado todo lo que uno por uno para encontrar el problema y el problema aún persiste.

24voto

Link Puntos 148

Creo que he encontrado el problema, y (sé que no como este) precisa un esquemático habría puesto de relieve el problema (al menos algunos) de los lectores de inmediato. :-)

Buscando en el arranque de la tensión en los dos alfileres en sus dos trazas de arriba, que el voltaje es de alrededor de +3.3 V. Que me dice que el PIC es alimentado de tensión. A continuación, vemos el aumento de tensión de +5V, cuando sus cambios de código el de los pines de entradas y el I2C resistencias pull-up tomar el relevo.

Así que usted está tirando el I2C señales de +5V, pero el PIC recibe alimentación de +3.3 V. , Ese es el problema. Lo que provoca un continuo flujo de corriente a través de la interna "ESD abrazadera de diodos" (que generalmente no son diodos de estos días, pero eso es otra historia). Hay consecuencias de esto (especialmente en más de un mínimo de corrientes), incluidos los que afectan a otras partes de la PIC o incluso causando fallas debido a EOS, debido a la corriente que se inyecta en donde no debería estar.

Algunos de los síntomas en tu pregunta de ayer:"Todo lo que deja de funcionar después de habilitar el PWM" - sugirió esta posibilidad, específicamente cuando se informó que todo estaba bien cuando desmonté el circuito y reconstruido (ya que, si no hay daño permanente que se ha hecho, los efectos de este problema a veces desaparecen cuando el poder está completamente eliminado). Sin embargo, sin un esquema que no podía hacer una hipótesis que yo era feliz con el, ya que no dijo nada, fue conectado a un PIC - pero algo estaba conectado al PIC: el I2C resistencias pull-up +5V!

Luego de su anterior pregunta de hoy - "Es mi pin GPIO frito?" - parecía confirmar los daños en el hardware. Que podría ser verdad, y que dicho daño (o la alternativa temporal resultado de lo que estaba ocurriendo en su primera pregunta) encaja con esta hipótesis.

Esta hipótesis también completamente explica su nuevo comentario en esta pregunta:

Nota que he probado con diferentes chips y los diferentes modelos y el problema persiste.

Sí, todos los dispositivos similares que se comporten en forma similar, en esta situación de pull-ups a un voltaje muy por encima de +Vdd.

En la correspondiente hoja de datos del PIC (que voy a descargar en un minuto). esto demuestra que "Recomienda las Condiciones de Funcionamiento" (en otras palabras, las condiciones en que el chip de trabajo) no se satisfacen con un chip powered by +3.3 V e insumos recepción de +5V (a través del I2C resistencias pull-up). Sin embargo, con la actual limitación de los efectos de los I2C pull-ups, usted puede tener la suerte de que los efectos son temporales, si no superar el Máximo de la Pinza de Corriente debajo de "Absoluta Máximos" de la sección.

La solución estará a ejecutar el bus I2C en el mismo voltaje que la foto en sí, no más. Si es requerido por las restricciones impuestas por el I2C Esclavo(s) (lo que son), use I2C nivel de traductores para lograr un local I2C de voltaje para el PIC, el cual cumple con esa regla.

[Esperar un nuevo editar más tarde, cuando yo puedo citar algunas cifras de la hoja de datos, sólo para la integridad.]

1voto

egregious Puntos 23

Suena como que usted está escribiendo el puerto (ex. PORTA == valor de Puerto de registro para el puerto A) registra en lugar de que el pestillo de registros (ex. LATA == Salida pestillo de registro para el puerto A). El registro del puerto de pistas el valor actual de la entrada, el pestillo de registro mantiene su estado. Si intenta establecer/borrar un bit en un registro del puerto, de las otras partes serán set/desactivada para que coincida con su actual estado de entrada. Si usted establecer/borrar un bit en un pestillo de registro, sólo que el bit de salida se verá afectada.

Edit: a partir De la hoja de especificaciones.

La lectura de la GPIO registrar lee el estado de los pines, mientras que escribir escribir en el puerto seguro. Todas las operaciones de escritura son leer-modificar-escribir las operaciones. Por lo tanto, de una escritura a un puerto implica que los pines del puerto se leen, este valor es modificado y, a continuación, escrito para el puerto de cierre de datos. GP3 se lee '0' cuando MCLREN = 1.

Parece que esta PIC de la serie hecho saltar el PESTILLO se registra como te han comentado. Una solución sencilla (no la solución más limpia pero el trabajo) es el uso de una variable global que hacer manualmente el estado de seguimiento para usted. Simplemente bits modificar este mundial y, a continuación, copie toda la cosa para el registro del puerto (GPIO en esta serie).

-3voto

Jeremy Puntos 424

esto de alguna manera afecta el GPIO valor de los OTROS pines gpio (es decir, SCL/SDA), que se mete de todo.

esto sólo puede suceder en un sistema en el que el software está mal diseñado.

Ahora mi pregunta es esta: ¿Cómo se podría ir sobre la fijación de este?

escribir código de forma adecuada para que no suceda.

fuera de eso, restablecer el pin de salida de datos de registro para garantizar su correcto estado antes de cambiar su dirección de salida de registro.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X