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.