TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: elmasvital en 13 de Mayo de 2008, 16:17:33
-
Tengo un problema con un programa y estoy sospechando del contexto guardado antes de ir a la interrupcion
tengo esta rutina sacada de internet que hasta ahora habia funcionado sin problemas
GUARDA_CONTEXTO MACRO ;Guarda el contexto para que el servicio de interrupción
movwf REG_W_INTERRUPCION ;no afecte al buen funcionamiento del resto de rutinas
swapf STATUS,W ;que se interrumpen en cualquier momento por ésta.
clrf STATUS
movwf REG_STATUS_INTERRUPCION
movfw PCLATH
clrf PCLATH
movwf REG_PCLATH_INTERRUPCION
movfw FSR
clrf FSR
movwf REG_FSR_INTERRUPCION
ENDM
Que pasa si en el momento de entrar en la interrupción no estamos en el banco0 donde se guardan las variables? no guardaria el contexto no? Y no puedo poner al principio de este Guardar_contexto el cambio al banco0 pq logicamente modificaria status antes de guardarlo.
-
Buena sospecha yo ya tuve ese problema http://www.todopic.com.ar/foros/index.php?topic=17792.0 pero tambien te olvidastes de guardar W
la mejor solucion es,por ejemplo si trabajas con 16f87xA, es usar los registros en los que guardas el contexto a partir de la direccion 70h ya que en todos los bancos se ven la misma posicion.
GUARDA_CONTEXTO MACRO ;Guarda el contexto para que el servicio de interrupción
MOVWF REGW ; guarda W
movwf REG_W_INTERRUPCION ;no afecte al buen funcionamiento del resto de rutinas
swapf STATUS,W ;que se interrumpen en cualquier momento por ésta.
clrf STATUS
movwf REG_STATUS_INTERRUPCION
movfw PCLATH
clrf PCLATH
movwf REG_PCLATH_INTERRUPCION
movfw FSR
clrf FSR
movwf REG_FSR_INTERRUPCION
ENDM
recuperacion para la salida de interrupcion
................................................
...............................................
movfw REG_FSR_INTERRUPCION
movwf FSR
movfw REG_PCLATH_INTERRUPCION
movwf PCLATH
SWAPF REG_STATUS_INTERRUPCION,W
MOVWF STATUS
SWAPF REGW,F
SWAPF REGW,W
retfie
SAL u 2
-
Buena sospecha yo ya tuve ese problema http://www.todopic.com.ar/foros/index.php?topic=17792.0 pero tambien te olvidastes de guardar W
Según leo yo lo está guardando en REG_W_INTERRUPCION
elmasvital como habrás notado el guardado de contexto no es algo tan simple como parece al principio y en micros más grandes con más de una página de memoria de datos ocurren cosas como las que estas enfrentando.
He aquí mis consejos.
1) Si tu micro tiene memoria accesible desde todos los bancos y no la estas usando, úsala como te ha sugerido picnic.
2) Si tu micro tiene memoria accesible desde todos los bancos pero la usas para tu código entonces no es buena idea usarla, para ello te sugiero reserves una región de memoria de datos en todas las páginas, de esa forma te aseguras que los datos se grabaran y no serán borrados por tu propio código.
Yo uso ambas alternativas en mis códigos y no he tenido problemas.
-
No sabia que existia algun tipo de memoria accesible desde todos los bancos, al margen de los FSR.
Sabeis si el 16f877a tiene alguna region de memoria de los GPR o cualquier otra que pueda usa para compartir entre todos los bancos? Hay alguna otra manera de evitar el problema mencionado con el servicio de interrupción?
1 saludo
-
Yes. Las tiene...
Las posiciones 0x70 a 0x7F de la familia 16F87Xx son accesibles desde cualquier banco(son 16 registros GPR).
Saludos.
-
Ups... perdon no lo vi... :? :?