4 votos

En la serie PIC18, ¿cuándo debería usar el registro LAT y cuándo PORT?

Estoy programando un PIC18F4680 usando el compilador mikroC PRO de mikroElektronika y he configurado la biblioteca LCD para utilizar los siguientes puertos para comunicarse con el LCD:

// Conexiones del módulo LCD
sbit LCD_RS en RB4_bit;
sbit LCD_EN en RB5_bit;
sbit LCD_D4 en RB0_bit;
sbit LCD_D5 en RB1_bit;
sbit LCD_D6 en RB2_bit;
sbit LCD_D7 en RB3_bit;

sbit LCD_RS_Direction en TRISB4_bit;
sbit LCD_EN_Direction en TRISB5_bit;
sbit LCD_D4_Direction en TRISB0_bit;
sbit LCD_D5_Direction en TRISB1_bit;
sbit LCD_D6_Direction en TRISB2_bit;
sbit LCD_D7_Direction en TRISB3_bit;
// Fin de conexiones del módulo LCD

y a veces el LCD muestra basura. Me dijeron que use los registros LATB en lugar de PORTB y después de leer la sección de Puertos de E/S de la hoja de datos, todavía no me queda claro cuándo debo utilizar los registros PORT y cuándo los registros LAT.

8voto

GetFree Puntos 495

Utilice el PORT para leer desde un pin y LAT para escribir en un pin (y TRIS para cambiar la dirección).

Algunos PICs no tienen un registro LAT, en esos casos estás obligado a usar el registro PORT para escribir en un pin, lo que te expone al temido Read-Modify-Write (no es un error, ¡es una característica!). Consulta mi explicación en Interfacing a keypad with a microcontroller

2voto

Alex Andronov Puntos 178

La regla más simple, aplicable el 99% del tiempo en dispositivos que tienen direcciones LATx, es usar LATx (o LATxn) siempre que estés escribiendo en un puerto, o leyendo un valor que se utilizará para calcular un valor que se escribirá de nuevo en un puerto. Utiliza PORTx (o Rxn) sólo cuando quieras determinar qué está haciendo o no haciendo la circuitería externa con el estado de los pines.

Como regla adicional, sugeriría evitar leer LATx fuera de su función en las instrucciones iorwf, andwf o xorwf (o los operadores |=, &= y ^= en C). Si, por ejemplo, quieres establecer los cuatro bits inferiores de un puerto de E/S para que coincidan con el contenido de un registro que se sabe que está vacío fuera de esos cuatro bits, el patrón

  LATB &= ~0x0F;  // Limpiar los cuatro bits inferiores
  LATB |= new\_data; // Establecer los bits apropiados

es a menudo más seguro que el patrón:

  LATB = (LATB & 0xF0) | new\_data;

Provocará que los pines cuyo valor antiguo y nuevo eran ambos "1" hagan una transición momentáneamente a "0", pero funcionará correctamente incluso si una rutina de servicio de interrupción afectara el contenido de LATB. Si se necesita la semántica de la última afirmación y las interrupciones pudieran modificar LATB, uno debe o bien deshabilitar las interrupciones durante la secuencia de lectura-modificación-escritura o usar un código realmente feo para asegurar que la actualización se realice correctamente incluso si una interrupción se produce durante ella.

Por cierto, una formulación alternativa con semántica entre la de la primera y la última es:

  LATB |= new\_data;
  LATB &= (0xF0 | new\_data);

Esta versión encenderá cualquier bit "nuevo" unos pocos ciclos antes de apagar cualquier bit que ya no debería estar alto, pero es segura ante interrupciones siempre que la interrupción sólo escriba en los cuatro bits superiores.

1voto

Avner Puntos 2065

LAT se usa para escribir una salida, PORT se usa para leer una entrada. TRIS se utiliza para configurar la dirección; una salida (=0) o una entrada (=1). Recuerdo fácilmente la configuración tris en las plataformas PIC porque Output es 0 (O) e Input es 1 (I).

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