En PIC MCU, un pin asignado a una función IO al pin vecino también se ve afectado [cerrado]

0

He estado persiguiendo el problema de "lectura modificada, escritura" durante dos días. Este es un problema que al escribir en un pin se ve afectado un vecino. Empezó a suceder repentinamente - diferentes chips - diferentes computadoras - diferente breadboard. Lo único en lo que puedo pensar es en común es el programador y el clima. Nunca tuve este tipo de problema con ningún otro sistema integrado, Arduino, Raspberry Pi, Motorola, etc ...

Antes de rendirme por completo en (PIC), ¿es este un problema que alguien ha escuchado antes? ¿hay una solución?

    
pregunta j0h

1 respuesta

12

Estos PIC hacen exactamente lo que la hoja de datos dice que hacen. Si hay un problema, es con su código o su (falta de) lectura de la hoja de datos.

Lo importante a tener en cuenta es que las operaciones de bit en un registro de puerto leen el puerto, hacen la operación de bit y luego vuelven a escribir todo el puerto. Tenga en cuenta que al leer el registro de puertos se lee el estado instantáneo de los pines, NO necesariamente lo que se escribió por última vez en esos pines. Eso puede diferir de lo que se escribió por última vez en dos casos:

  1. El bit TRIS se establece para que el pin esté en estado de alta impedancia. Por lo tanto, el valor real del pin depende del circuito externo. Si tiene la intención permanente de que el pin sea una entrada en esta aplicación, entonces este caso no importa. El valor escrito en el bit de registro de puerto es irrelevante para un pin de entrada puro.

  2. El circuito externo mantiene el pin en el estado opuesto al que se configuró por última vez. Esto podría deberse a un error de hardware, pero también debido a limitaciones de velocidad de respuesta. Es posible que el pin no haya tenido tiempo suficiente para llegar a su nuevo estado antes de que su código lo lea nuevamente.

Por lo general, es el caso 2 que la gente se equivoca. Aquí hay un ejemplo clásico de este error:

;   All Port B pins were previously configured as outputs.
;
         banksel portb
         clrf    portb       ;drive all Port B pins low

         ...                 ;many cycles pass

         banksel portb
         bsf     portb, 0    ;RB0 starts going high
         bsf     portb, 1    ;Oops! RB0 not high yet, so gets set low

La solución simple es dejar suficiente tiempo entre las dos últimas instrucciones de BSF para que RB0 esté sólidamente en su nuevo estado cuando intente configurar RB1. Por lo general, solo una instrucción es suficiente.

Debido a la sincronización de las acciones individuales dentro de cada instrucción, el ejemplo anterior le da a RB0 solo 1 ciclo-Q, si recuerdo bien, entre el hecho de ser conducido a su nuevo estado y la lectura de PortB nuevamente. Eso es sólo un cuarto de ciclo de instrucción. Incluso una única instrucción entre los dos BSF proporciona 5 veces más tiempo para que RB0 llegue a su nuevo estado. Eso suele ser suficiente.

Sin embargo, no sigas las reglas generales. Haz las matematicas. La hoja de datos le indica la corriente mínima que generará el PIC en el intento de obtener un RB0 alto. Sabe lo que dibuja su circuito externo y la capacidad máxima de la línea.

Verás un montón de malos consejos para usar siempre registros de sombra. Eso hace que el código sea más torpe, agrega más posibilidades de error y es innecesario en la mayoría de los casos. La verdadera solución es en realidad entender lo que está sucediendo, y luego asegurarse de que no se activan los mecanismos que podrían causar problemas. En muy raras ocasiones he utilizado un registro sombra para un puerto en un PIC viejo 12 o 16, pero probablemente solo una o dos veces.

Tenga en cuenta que todas las familias PIC más nuevas del PIC 16 original tienen registros LAT. Estos solucionan completamente este problema. El registro LAT conserva el último valor escrito en un puerto. El registro de puertos todavía existe y, como antes, contiene el valor instantáneo de los pines del puerto en una lectura. Entonces, en lugar de hacer cosas como BSF en el registro de puertos (BSF PORTB, 1), lo hace en el registro LAT (BSF LATB, 1).

Todos los PIC 18, 24, 30, 33 y el nuevo PIC 16 mejorado tienen registros LAT. Realmente solo se encuentra con el problema de lectura-modificación-escritura en los núcleos de 12 bits y de 14 bits anteriores.

    
respondido por el Olin Lathrop

Lea otras preguntas en las etiquetas