TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: pakuak en 31 de Mayo de 2008, 20:12:42
-
Durante mucho tiempo he usado este codigo que saco de la hoja de datos del pic 16f88 para salvar W,STATUS y PCLATH mientras se ejecutan mis interrupciones
MOVWF W_TEMP ;Copy W to TEMP register
SWAPF STATUS, W ;Swap status to be saved into W
CLRF STATUS ;bank 0, regardless of current bank, Clears IRP,RP1,RP0
MOVWF STATUS_TEMP ;Save status to bank zero STATUS_TEMP register
MOVF PCLATH, W ;Only required if using page 1
MOVWF PCLATH_TEMP ;Save PCLATH into W
CLRF PCLATH ;Page zero, regardless of current page
:
:(ISR) ;(Insert user code here)
:
MOVF PCLATH_TEMP, W ;Restore PCLATH
MOVWF PCLATH ;Move W into PCLATH
SWAPF STATUS_TEMP, W ;Swap STATUS_TEMP register into W
;(sets bank to original state)
MOVWF STATUS ;Move W into STATUS register
SWAPF W_TEMP, F ;Swap W_TEMP
SWAPF W_TEMP, W ;Swap W_TEMP into W
Este codigo se me hace muy rebuscado , preferiria usar algo asi
MOVWF W_TEMP ;MUEVE W A WTEMPORAL
MOVF STATUS,W ;MUEVE STATUS A W
MOVWF STATUS_TEMP ;MUEVE STATUS DE W A STATUS_TEMP
MOVF PCLATH,W ;MUEVE PCLATH A W
MOVWF PCLATH_TEMP ;MUEVE W A PCLATH
BCF STATUS,RP0 ;BANCO 0
CLRF PCLATH ;PAGINA 0
:
: (ISR) ;(Insert user code here)
:
MOVF PCLATH_TEMP,W ;MUEVE PCLATH_TEMP A W
MOVWF W,PCLATH ;RESTAURA PCLATH (PAGINA ORIGINAL RESTAURADA)
MOVF STATUS_TEMP,W ;MUEVE STATUS A STATUS A W
MOVWF STATUS ;MUEVE STATUS A A STATUS ORIGINAL(BANCO ORIGINAL RESTAURADO)
MOVF W_TEMP,W ;RESTAURA W ORIGINAL
¿Ambos codigos son lo mismo? o ¿Por que uno es mejor que otro?
Si se puede cambiar el valor de W por otro valor en cualquier momento ¿Cuando y por que se usa CLRW?
Gracias de antemano por su ayuda.
-
Bueno, dejame decirte que la opcion que te da el datasheet es la correcta, ya que la segunda manera esta errada en la parte de "movf status,w", no es que no se pueda hacer esto, el porblema esta en que corrompe el registro status, los bits de Z,C y DC, entonces para evitar eso se usa SWAPF STATUS,W, lo cual intercmabia los nibbles(4 bits) bajos con los altos del registro sin corromperlos. Con respecto de cuando o no se usa clrw, por lo menos en las rutinas que pusistes no lo veo, pero eso dependera de la aplicaion que estes desarrollando, ya que en algun momento necesitaras que w tenga 00h. Espero haber despejado en algo tus dudas :D.
-
Esa explicacion era justo lo que estaba buscando y sin duda me has evitado muchos problemas para el futuro.
Muchisimas gracias :mrgreen:
-
No hay que, para eso estamos en el foro, para ayudarnos los unos a los otros :D.