Autor Tema: Duda existencial con las interrupcioes  (Leído 2204 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado pakuak

  • PIC10
  • *
  • Mensajes: 31
Duda existencial con las interrupcioes
« 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.

Desconectado poseidon20

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 762
Re: Duda existencial con las interrupcioes
« Respuesta #1 en: 01 de Junio de 2008, 00:32:40 »
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.

Desconectado pakuak

  • PIC10
  • *
  • Mensajes: 31
Re: Duda existencial con las interrupcioes
« Respuesta #2 en: 01 de Junio de 2008, 01:51:45 »
Esa explicacion era justo lo que estaba buscando y sin duda me has evitado muchos problemas para el futuro.
Muchisimas gracias   :mrgreen:
 

Desconectado poseidon20

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 762
Re: Duda existencial con las interrupcioes
« Respuesta #3 en: 01 de Junio de 2008, 02:19:45 »
No hay que, para eso estamos en el foro, para ayudarnos los unos a los otros :D.


 

anything