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.