Autor Tema: PUSH y POP para INTERRUPCION PIC873  (Leído 5555 veces)

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

Desconectado guille339682

  • PIC10
  • *
  • Mensajes: 3
PUSH y POP para INTERRUPCION PIC873
« en: 10 de Abril de 2005, 07:46:00 »
Saludos Amigos del PIC 16f873
Necesitaria una Rutina que
Salve Registros Importantes para una INTERRUPCION
 "PUSH y POP" .ya que la que uso no anda bien.
Desde ya Muchas GRACIAS.guille

Desconectado fer_zone

  • PIC12
  • **
  • Mensajes: 74
RE: PUSH y POP para INTERRUPCION PIC873
« Respuesta #1 en: 24 de Abril de 2005, 23:44:00 »
Aqui tienes una:

INTER                   BTFSC   STATUS,C   ;
      BSF      STA_REG,C   ;
      BCF      STA_REG,C   ;Equivalente
      BTFSC                   STATUS,Z   ;
      BSF      STA_REG,Z   ;al PUSH
      BCF      STA_REG,Z   ;de W y Status
      MOVWF   W_REG      
                                   ......
                                   ......
                                  .........  Rutina de interrupcion

SALE                   MOVF                   W_REG,W      ;Equivalente
                   BTFSC                   STA_REG,C
      BSF      STATUS,C                 ;a POP
      BCF      STATUS,C
      BTFSC                   STA_REG,Z
      BSF      STATUS,Z
      BCF      STATUS,Z
      RETFIE            

Desconectado antoniof

  • Moderadores
  • PIC24F
  • *****
  • Mensajes: 729
RE: PUSH y POP para INTERRUPCION PIC873
« Respuesta #2 en: 25 de Abril de 2005, 09:13:00 »
Una preguntita.

¿Que es eso de "Interrupción de PUSH y POP"?

Desconectado fer_zone

  • PIC12
  • **
  • Mensajes: 74
RE: PUSH y POP para INTERRUPCION PIC873
« Respuesta #3 en: 26 de Abril de 2005, 23:09:00 »
Algunos micros poseen instrucciones que permiten manejar la pila o stack como si fuera una memoria LIFO (last in first out) controlable por soft, esto es que tu puedes cargar datos con la instruccion push y descargar con pop.
Esto, por su puesto, no existe en los pic (en los pic18 se realiza de forma automatica), tu no tienes forma de manipular la pila con datos a tu antojo, por eso se debe realizar una rutina para salvar registros importantes cuando se atiende una interrupcion.
En los 8051, por ejemplo, se puede hacer con esas push y pop.
En vez de usar la pila, se utilizan posiciones de ram como backup del registro W y Status (y cualquier otro que desees)

Desconectado mario_pastor

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 101
RE: PUSH y POP para INTERRUPCION PIC873
« Respuesta #4 en: 01 de Mayo de 2005, 18:48:00 »
Esto es lo que uso y me va muy bien  Giño

Codigo:
;VECTOR DE INTERRUPCION
   ORG   4
   MOVWF   W_TEMP         ;SALVO EL REGISTRO W
   SWAPF   STATUS,W
   MOVWF   STATUS_TEMP      ;SALVO EL REGISTRO STATUS
   CLRF   STATUS         ;TRABAJO EN BANK 0
   MOVFW   PCLATH         ;SALVO EL REGISTRO PCLATH
   MOVWF   PCLATH_TEMP
   CLRF   PCLATH
         --------
         --------
         TRATAMIENTO DE INTERRUPCION
         --------
         --------      
   MOVFW   PCLATH_TEMP
   MOVWF   PCLATH
   SWAPF   STATUS_TEMP,W
   MOVWF   STATUS
   SWAPF   W_TEMP,F
   SWAPF   W_TEMP,W
   RETFIE



Saludos,
Mario
Saludos,
Mario.

Lima - Perú

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: RE: PUSH y POP para INTERRUPCION PIC873
« Respuesta #5 en: 15 de Diciembre de 2007, 10:07:27 »
Esto es lo que uso y me va muy bien  <img   src="http://pics.miarroba.com/caretos/wink.gif" alt="Giño" title="Giño" />

<span class="texto_mini">Codigo:</span>
;VECTOR DE INTERRUPCIO
N
   ORG   4
   MOVWF   W_TEMP         ;SALVO EL REGISTRO W
   SWAPF   STATUS,W
   MOVWF   STATUS_TEMP      ;SALVO EL REGISTRO STATUS
   CLRF   STATUS         ;TRABAJO EN BANK 0
   MOVFW   PCLATH         ;SALVO EL REGISTRO PCLATH
   MOVWF   PCLATH_TEMP
   CLRF   PCLATH
         --------
         --------
         TRATAMIENTO DE INTERRUPCION
         --------
         --------      
   MOVFW   PCLATH_TEMP
   MOVWF   PCLATH
   SWAPF   STATUS_TEMP,W
   MOVWF   STATUS
   SWAPF   W_TEMP,F
   SWAPF   W_TEMP,W
   RETFIE



Saludos,
Mario

hola mario_pastor.creo que has cometido algunos errores ya que no me funciona el codigo que has realizado.
hay algunas cosas que no entiendo de las que has realizado,como:

porque seleccionas el banco 0 si los dos registros que se utiizan PCLATH y STATUS estan implementados en todos los bancos.
luego hay una instruccion que no existe MOVFW
y los dos ultimos SWAPF no se para que sirven.

lo digo para que otra gente no se equivoque como lo he hecho yo,pero me ha ayudado mucho lo que has puesto aqui.
y ahora a ver si alguien me puede corregir a mi lo que he modificado de tu codigo,ya que aunque me funciona no se si me puede dar algun problema.

saludos.

PUSH      MACRO
         movwf   W_TEMP               ;guarda W en el registro W_TEMP
           swapf   STATUS,W            ;haz swapf con STATUS y lo guardas en W
         movwf   STATUS_TEMP         ;carga W en el registro STATUS_TEMP
           movf      PCLATH,W            ;guarda el registro PCLATH en W
         movwf     PCLATH_TEMP         ;carga W en PCLATH_TEMP
         ENDM

POP         MACRO                  
         movf      PCLATH_TEMP,W      ;restaura PCLATH_TEMP a W
         movwf   PCLATH             ;carga W en el registro PCLATH
         movf    STATUS_TEMP,W      ;restaura STATUS_TEMP en W
         swapf   W,W              ;haz swapf con W y lo metes en W
         movwf   STATUS            ;carga W en STATUS
         movf   W_TEMP,W          ;restaura el W
         ENDM
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: PUSH y POP para INTERRUPCION PIC873
« Respuesta #6 en: 15 de Diciembre de 2007, 10:24:28 »
hola mario_pastor.creo que has cometido algunos errores ya que no me funciona el codigo que has realizado.
hay algunas cosas que no entiendo de las que has realizado,como:

porque seleccionas el banco 0 si los dos registros que se utiizan PCLATH y STATUS estan implementados en todos los bancos.

No tiene que ver con eso. Sólo se hace para asegurar que se esté trabajando en el banco 0 de la RAM.

luego hay una instruccion que no existe MOVFW

Es exáctamente lo mísmo que hacer MOVF   Registro,W

y los dos ultimos SWAPF no se para que sirven.

Las SWAPF se usan porque no afectan ningun flag. No usarlas puede causar muchísimos problemas en el comportamiento de tu programa.



Tu rutina tiene severos errores:

Quitaste los SWAPF y eso te va a producir comportamiento incorrectos en el programa;
swapf   W,W              --> NO PODES aplicar instrucciones orientadas a registros sobre el acumulador!
swapf   W,W  = swapf 0,0  = swapf  INDF,0 pero INDF tampoco es un registro físico...             

Recomendación: no intentes modificar la rutina. Está hecha y comprobada hasta el hartazgo por Microchip.

Saludos!
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: PUSH y POP para INTERRUPCION PIC873
« Respuesta #7 en: 16 de Diciembre de 2007, 15:07:01 »
tenias razon.se ve que algo hize mal y por eso no me funcionava.

de todas formas las modificaciones que hize en el programa,trageron otros problemas.

gracias por tu respuesta.
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: PUSH y POP para INTERRUPCION PIC873
« Respuesta #8 en: 20 de Septiembre de 2009, 12:58:10 »
hola de nuevo.debido a una experiencia con los PUSH y POP queria ponerlo aqui para futuras cosultas.

he añadido otro registro por si surgieran errores en nuestra aplicacion.es el PCL.
quizas en algunas aplicaciones no nos haga falta.pero si en otras.



PUSH            MACRO               ;macro para salvar registros antes de una llamada a interrupcion   
               BANK0
            movwf   W_TEMP               
               swapf   STATUS,W
            movwf   STATUS_TEMP 
               clrf    STATUS               
               movfw   PCLATH               
                 movwf   PCLATH_TEMP
               clrf    PCLATH
            swapf   PCL,W
            movwf   PCL_REG
            ENDM

POP            MACRO               ;macro para restaurar registros   despues de una llamada a interrupcion
               BANK0
            movfw   PCLATH_TEMP         
               movwf   PCLATH
               swapf   STATUS_TEMP,W 
            movwf   STATUS
            swapf   W_TEMP,F         
               swapf   W_TEMP,W
            swapf   PCL_REG,W
            movwf   PCL
            ENDM
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: PUSH y POP para INTERRUPCION PIC873
« Respuesta #9 en: 20 de Septiembre de 2009, 13:38:21 »
Hola groundman.

Realmente no veo en qué aplicación requerirías guardar el PCL. Por ahí no ando muy iluminado...

Un saludo.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: PUSH y POP para INTERRUPCION PIC873
« Respuesta #10 en: 20 de Septiembre de 2009, 16:42:32 »
hola BrunoF. aqui: http://www.todopic.com.ar/foros/index.php?topic=26307.20

estoy realizando un programa que utiliza la interrupcion por recepcion de la usart.y lo estoy emulando en el isis de protel.
y al retornar de la interrupcion,se almacenan una serie de datos en los registros de proposito general.y da la casualidad de que tambien se almacenan datos en registros no implementados.
y me salen errores.no deberia pasar a mi entender.pero pasa.
puede que el problema sea del isis.pero por si a caso.mas vale prevenir que curar.
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: PUSH y POP para INTERRUPCION PIC873 -offtopic-
« Respuesta #11 en: 20 de Septiembre de 2009, 16:45:06 »
Saludos Amigos del PIC 16f873...

que quede claro amigo guille, que soy amigo de todos los pic  :D

pd: perdón por el offtopic, es que no me pude contener :5}
La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: PUSH y POP para INTERRUPCION PIC873
« Respuesta #12 en: 20 de Septiembre de 2009, 18:43:11 »
Hola groundman.

Voy a intentar ayudarte, pero creeme que no tiene nada que ver con guardar el PCL el error que estás teniendo...

:D
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: PUSH y POP para INTERRUPCION PIC873
« Respuesta #13 en: 20 de Septiembre de 2009, 19:06:28 »
Bueno, un par de errores como para empezar a solucionar el problema..

Código: ASM
  1. CBLOCK    0x74            
  2.                         W_TEMP        
  3.                                 STATUS_TEMP  
  4.                                 PCLATH_TEMP
  5.                                 TEMP_DATO_H
  6.                                 TEMP_DATO_L
  7.                                 DIR_EEPROM
  8.                                 DATO_EEPROM
  9.                                 TEMP_EEP
  10.                                 TEMP_NUMERICO
  11.                                 PRINCIPIO_RAM
  12.                                 TEMP_FSR
  13.                                 CARACTER
  14.                                 FSR_TEMP
  15.                        
  16.                                 ENDC

Acá. FSR_TEMP excede la posición 0x7F(que es la última de la página 0) provocando potenciales problemas a la hora de usar dicho registros. El bloque debería comenzar desde la posición 0x73 para corregirlo fácilmente.


Estás usando el registro FSR tanto dentro como fuera de la interrupción. Este es un registro especial compartido, por lo que tenés obligación de guardarlo a la hora de ingresar a la interrupción,y restaurarlo antes de salir de ella.

Código: ASM
  1. INTER           PUSH                    ;salva el contenido de W,STATUS Y PCLATH
  2.                BANK0
  3.                ;btfsc   PIR1,RCIF      ;comprueba si el shift register(RSR)esta lleno.y si es asi salta
  4.                call   LEEDATO
  5.             ;xorlw   '*'
  6.             ;btfss   STATUS,Z
  7.             ;call   GRARAM
  8.                POP                    ;restaura el contenido de W,STATUS Y PCLATH
  9.             bcf   PIR1,RCIF         ;borra flag de interrupcion por recepcion de usart
  10.             ;bsf   PIR1,RCIF
  11.             call   BORR_ERR
  12.             ;incf   INT_CONT,F      ;incrementa el contador de interrupciones para asegurarnos de que se entra al programa
  13.             ;btfsc   INT_CONT,0      ;-almenos una vez por cada dos interrupciones
  14.                ;retfie                 ;retorno de interrupcion
  15.             ;GIE_ON               ;deshabilita interrupciones
  16.             retfie

Debería ser:

Código: ASM
  1. INTER           PUSH                    ;salva el contenido de W,STATUS Y PCLATH
  2.                BANK0
  3.                ;btfsc   PIR1,RCIF      ;comprueba si el shift register(RSR)esta lleno.y si es asi salta
  4.                call   LEEDATO
  5.             ;xorlw   '*'
  6.             ;btfss   STATUS,Z
  7.             ;call   GRARAM
  8.             bcf   PIR1,RCIF         ;borra flag de interrupcion por recepcion de usart
  9.             ;bsf   PIR1,RCIF
  10.             call   BORR_ERR
  11.             ;incf   INT_CONT,F      ;incrementa el contador de interrupciones para asegurarnos de que se entra al programa
  12.             ;btfsc   INT_CONT,0      ;-almenos una vez por cada dos interrupciones
  13.                ;retfie                 ;retorno de interrupcion
  14.             ;GIE_ON               ;deshabilita interrupciones
  15.                POP                    ;restaura el contenido de W,STATUS Y PCLATH
  16.             retfie


Por otro lado, las interrupciones deberías ser lo más breves y concisas posible.

Lo ideal sería que reserves una porción de memoria(sería un buffer) para ir volcando los datos que van llegando. Cuando tienes suficientes datos, puedes realizar la comprobación correspondiente. No es bueno que estés esperando sólo el 1er dato por interrupción, y al resto lo hagas por polling.

Se entiende?


Saludos.



"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: PUSH y POP para INTERRUPCION PIC873
« Respuesta #14 en: 20 de Septiembre de 2009, 20:29:48 »
gracias por tu ayuda.tienes razon en todo lo que dijistes.
ya salve los datos del registro FSR.y por el momento funciona todo a la perfeccion.

solo decir que no se debe salvar el registro PCL.asi que desechado.
ya que si lo salvamos,al recuperalo.el programa nos saltara a una direccion que no nos corresponde.
Montando mi primera impresora 3D (Raprep Prusa i3)


 

anything