Hay cinco enfoques que se pueden usar en las partes de PIC18Fxx para cambiar algún conjunto de bits en un registro.
-
Lee LATx en W, enmascara los bits adecuados y calcula el valor correcto, luego escribe el valor de nuevo. Esto actualizará todos los bits limpiamente, pero requiere que ninguna interrupción pueda escribir cualquier parte del registro. Todos los bits se actualizarán simultáneamente.
-
Cargue W con los bits que no son de interés, ANDWF los bits en el registro, cargue W con los valores deseados de los bits de interés e IORWF los bits en el registro. Todos los bits de interés se borrarán simultáneamente, y luego todos los bits que deben configurarse se establecerán simultáneamente. Las interrupciones pueden afectar de manera segura a otros bits del registro, o pueden modificar bits de interés de la misma manera que lo está haciendo el código de la línea principal.
-
Como arriba, pero IORWF todos los bits de interés, y luego ANDWF con un valor que tiene todos los bits establecidos excepto aquellos bits de interés que deben borrarse. Todos los bits de interés se establecerán simultáneamente, y luego todos los bits de interés que no deban establecerse se borrarán simultáneamente. Las interrupciones pueden afectar de manera segura a otros bits del registro, o pueden modificar bits de interés de la misma manera que lo está haciendo el código de la línea principal.
-
Cargue W con el valor del registro, XOR W con los valores de los bits de interés, Y W con los bits de interés, y luego XORWF de vuelta al registro. Esto realizará todas las actualizaciones simultáneamente. Las interrupciones pueden afectar de manera segura a otros bits del registro, pero las interrupciones que cambian cualquier bit de interés pueden tener efectos extraños, incluso si los cambios coinciden con lo que la línea principal está tratando de hacer.
-
Use una secuencia de instrucciones BSF / BCF para modificar los bits según sea necesario. Este enfoque afectará solo a los bits apropiados; las actualizaciones no serán simultáneas, pero evitarán cualquier borde inapropiado; la combinación de la línea principal y las operaciones de interrupción no tendrá ningún efecto secundario extraño.
Los enfoques # 1 y # 4 generan resultados perfectamente limpios; Solo la aproximación # 4 puede usarse de manera segura con interrupciones. Si el programa se escribiera en lenguaje ensamblador, el enfoque # 1 podría interactuar de manera segura con las interrupciones si el código se escribiera como algo así como:
UpdateBits: ; Call from main-line to write bits 0-3
movf LATA,w,c
andwf 0xF0
iorwf NewLowerBits
bsf PortAWFlag,0,c
mowwf LATA,c
bcf PortAWFlag,0,c
Interrupt:
movwff WREG,SAVED_W
...
... ; Code to write bits 4-7
movf _LATA,w,c
btfsc PortAWFlag,0,c
movf SAVED_W,w,c
andlw 0x0F
iorwf NewUpperBits
movwf _LATA,c
btfsc PortAWFlag,0,c
movwf SAVED_W,w,c
...
movff SAVED_W,WREG
retfie
No sé si alguna vez encontré escenarios en los que este enfoque sería mejor que simplemente deshabilitar las interrupciones antes de actualizar los bits de puerto en la línea principal, pero si hay un código de interrupción que simplemente no puede soportar la posibilidad de ser demorado unos seis ciclos mientras la línea principal actualiza el puerto, el enfoque anterior podría funcionar.