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

4

Estoy programando un PIC18F4680 con el compilador mikroC PRO de mikroElektronika y configuré la biblioteca de LCD para usar los siguientes puertos para comunicarse con la LCD:

// LCD module connections
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;

sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
// End LCD module connections

y la pantalla LCD a veces muestra basura. Me dijeron a LATB en lugar de registros PORTB y después de leer la sección Puertos de E / S de la hoja de datos, todavía no tengo claro cuándo debo usar PORT y cuándo se registra LAT.

    
pregunta AndrejaKo

3 respuestas

8

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

Algunos PIC no tienen un registro LAT, en ese caso, se ve obligado a usar el registro PORT para escribir en un pin, lo que lo expone a la temida Lectura-Modificación-Escritura (no es un error, ¡es una característica! ). Consulte mi explicación en Interconectando un teclado con un microcontrolador

    
respondido por el Wouter van Ooijen
2

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

    
respondido por el Hans
2

La regla más simple, aplicable al 99% de los tiempos en dispositivos que tienen direcciones LATx, es usar LATx (o LATxn) cada vez que escriba un puerto o lea un valor que se usará para calcular un valor para ser escrito de nuevo en un puerto . Use PORTx (o Rxn) solo cuando desee determinar qué circuitos externos están o no están haciendo 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, desea establecer los cuatro bits inferiores de un puerto IO coincida con el contenido de un registro que se sabe que está en blanco fuera de esos cuatro bits, el patrón

  LATB &= ~0x0F;  // Clear bottom four bits
  LATB |= new_data; // Set appropriate bits

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

  LATB = (LATB & 0xF0) | new_data;

Esto causará que los pines cuyo valor antiguo y nuevo eran "1" se conviertan momentáneamente en "0", pero funcionará correctamente incluso si una rutina de servicio de interrupción afectaría el contenido de LATB. Si se necesita la semántica de la última instrucción y las interrupciones podrían modificar el LATB, se deben desactivar las interrupciones durante la secuencia de lectura-modificación-escritura o usar algún código realmente desagradable para asegurar que la actualización se realice correctamente, incluso si se produce una interrupción durante la misma.

Por cierto, una formulación alternativa con semántica entre las primeras y las últimas es:

  LATB |= new_data;
  LATB &= (0xF0 | new_data);

Esta versión activará los "nuevos" bits unos pocos ciclos antes de desactivar cualquier bit que ya no debería ser alto, pero es seguro contra interrupciones siempre que la interrupción solo escriba en los cuatro bits superiores.

    
respondido por el supercat

Lea otras preguntas en las etiquetas