tris lat entre diferencia port pic pic18

lat - diferencia entre tris y port



Diferencia entre PORT y LATCH en PIC 18F (7)

Adaptaré mi respuesta de Ingeniería Eléctrica.

Vamos a usar la imagen del manual:

Cuando escribe un bit en un pin de E / S, está almacenando este bit del Bus de datos en el Registro de datos ( D-FlipFlop ). Si TRISx de este bit es 0, los datos de Q del registro de datos estarán en el pin de E / S. Escribir en LATx o PORTx es lo mismo. Vea abajo en rojo:

Por otro lado, leer de LATx es diferente de leer de PORTx.

Cuando estás leyendo desde LATx, estás leyendo lo que está en el Registro de datos ( D-FlipFlop ). Vea la imagen de abajo en verde:

Y cuando lees desde PORTx, estás leyendo el valor real del pin de E / S. Vea abajo en azul:

El PIC utiliza operaciones de lectura-modificación-escritura-escritura y esto puede ser un problem , por lo que utilizan este registro en la sombra para evitarlo.

Ya leí la hoja de datos y google pero todavía no entiendo algo.

En mi caso, configuré el PIN RC6 de un PIC18F26K20 en el modo ENTRADA:

TRISCbits.TRISC6 = 1;

Luego leo el valor con PORT y LATCH y tengo un valor diferente.

v1 = LATCbits.LATC6;

v2 = PORTCbits.RC6;

v1 me da 0 donde v2 da 1.

¿Es normal? ¿En qué caso tenemos que usar PORT y en qué caso LATCH?


Aquí hay un resumen útil de la hoja de datos.

11.2.3 Registros LAT
El registro LATx asociado con un pin de E / S elimina los problemas que podrían ocurrir con las instrucciones de lectura-modificación-escritura. Una lectura del registro LATx devuelve los valores retenidos en los cierres de salida del puerto, en lugar de los valores en los pines de E / S. Una operación de lectura-modificación-escritura en el registro LAT, asociada con un puerto de E / S, evita la posibilidad de escribir los valores de pin de entrada en los cierres del puerto. Una escritura en el registro LATx tiene el mismo efecto que una escritura en el registro PORTx.

Las diferencias entre los registros PORT y LAT se pueden resumir de la siguiente manera:

  • Una escritura en el registro PORTx escribe el valor de los datos en el cierre del puerto.
  • Una escritura en el registro LATx escribe el valor de los datos en el cierre del puerto.
  • Una lectura del registro PORTx lee el valor de los datos en el pin de E / S.
  • Una lectura del registro LATx lee el valor de los datos retenidos en el cierre del puerto.

El latch es el latch de salida en el que se escriben los valores. El puerto es el voltaje en el pin real.

Hay algunas situaciones donde pueden ser diferentes. El que he encontrado con más frecuencia es si tiene un pin (accidentalmente) en corto a tierra. Si configura el pestillo alto, el cerrojo leerá alto, pero el puerto leerá bajo porque el voltaje en el pin sigue siendo aproximadamente tierra.

Otra situación que conduce a lo que ha descrito es cuando el pin de puerto no se ha configurado correctamente. Yo (y todas las personas con las que trabajo) pasamos muchas horas tratando de averiguar por qué nuestro PIC no está funcionando a la perfección, para finalmente descubrir que ignoramos la desactivación de los módulos analógicos, por ejemplo. Asegúrese de revisar la sección Puertos de E / S -> ¿PORT ?, TRIS ?, y LAT? Se registra en la ficha técnica. Puede obtener más información en la página wiki de Microchip, que explica cómo leer el valor incorrecto inmediatamente después de escribir una salida en un pin conectado a una carga capacitiva.

Esa página wiki también explica:

Una lectura del registro de cierre del puerto devuelve la configuración de los controladores de salida, mientras que una lectura del registro de puerto devuelve los niveles lógicos vistos en los pines.

Además, aquí hay un fragmento de la sección Puertos de E / S en el 18F14K50 (que debería ser el mismo que el resto de la serie 18F):

Cada puerto tiene tres registros para su funcionamiento. Estos registros son:

  • Registro TRIS (registro de dirección de datos)
  • Registro PORT (lee los niveles en los pines del dispositivo)
  • Registro LAT (latch de salida)

Así que en la mayoría de las situaciones, escribirá en el pestillo y leerá desde el puerto.


Mi recomendación es considerar los valores de PORT como de solo lectura. Los valores LAT se pueden leer o escribir, pero el valor leído será el último valor escrito, no el valor de entrada del pin.

En los PIC más antiguos, los valores LATx no existían; la única forma de escribir en un puerto era a través de los registros PORTx. Curiosamente, algunos de los PIC realmente antiguos, que se remontan a los días de General Instruments (pre-Microchip), admitían LATx, pero Microchip no agregó esa función hasta la línea PIC18x.


Recientemente experimenté que la escritura en PORTx Ri (por ejemplo, PORTC RC1) de PIC18F14K50 es ineficaz cuando ya se ha configurado otro PORTx Rj (por ejemplo, PORTC RC0). Observé un vistazo en el osciloscopio en PORTx Ri pero no pude sostener la salida. Este problema se desvaneció tan pronto como estaba escribiendo en LATx.

La escritura LATx parece obligatoria en PIC18 y la escritura PORTx está prohibida.


Sí, es normal leer PORTx y LATx y, en ocasiones, descubrir que tienen valores diferentes.

Cuando quiera leer si algún hardware externo está activando un pin alto o bajo, debe configurar el pin en modo de entrada (con TRIS o el registro DIR), y debe leer PORTx. Esa lectura le dice si el voltaje real en el pin es alto o bajo.

Cuando desea conducir un pin alto o bajo, debe configurar el pin para que salga (con TRIS o el registro DIR); debe escribir el bit en el registro LATx.

(Escribir ese bit en el registro PORTx puede parecer que hace lo correcto: ese pin eventualmente irá alto o bajo según lo ordenado. Pero hay muchos casos, como cuando algún otro pin en ese puerto está conectado a un bus de colector abierto: la escritura en un bit del registro PORTx desordenará el estado de los otros pines en ese puerto, lo que dará lugar a problemas difíciles de depuración).

Circuitos abiertos: leer antes de escribir


Usa LATx : para escribir en un pin de salida

Use PORTx : para leer un pin de entrada

Para todos los PIC con registros LATx , todas las ENTRADAS deben ser de PORTx y todas las PORTx deben ser de LATx , lo que evita totalmente el problema de voltear bits cuando escribe en un solo bit del puerto.