Autor Tema: PIC16F676-INTERRUPCIONES  (Leído 1923 veces)

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

Desconectado afta

  • PIC16
  • ***
  • Mensajes: 123
PIC16F676-INTERRUPCIONES
« en: 26 de Agosto de 2021, 00:43:18 »
Hola a todos estoy usando el PIC16F676 y tengo un programa con una instruccion sleep. Mediante una interrupcion externa sale del modo sleep para atender una subrutina. Averigue que es recomendable preservar los valores de los registros que pudieran modificarse en la subrutina de atencion a la interrupcion y restaurarlos antes de salir de la interrupcion.

La cuestion es que si quiero guardar el registro W en un registro de usuario W_TEMP me indica lo siguiente la hoja de datos:

El registro de usuario, W_TEMP, debe definirse en ambos bancos y debe definirse en el mismo desplazamiento desde la dirección base del banco (es decir, W_TEMP se define en 0x20 en el banco 0 y también debe definirse en 0xA0 en el banco 1).

No se como puedo definir el registro W_TEMP en ambos bancos y en las posiciones especificadas. Si alguien sabe como se hace espero su ayuda.

Gracias.

Desconectado Pinolillo16

  • PIC18
  • ****
  • Mensajes: 324
Re:PIC16F676-INTERRUPCIONES
« Respuesta #1 en: 26 de Agosto de 2021, 04:43:36 »
Solo lo declaras en un banco. Es decir tu sabes en que banco estas al entrar en modo sleep y a que banco te regresas. Entonces solo guarda w en donde ocupas regresar a tu banco.

Saludos

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Re:PIC16F676-INTERRUPCIONES
« Respuesta #2 en: 26 de Agosto de 2021, 05:46:23 »
Lo que te dice la hoja de datos, que los valores de los diferentes registros importantes, como ser el registro W; status, ect lo hagas en ambos bancos. Porque si justo estás trabajando en el banco 1; y se produce una interrupción, lo vas a guardar en la RAM del banco 1 y no en el 0. Y si no tenes esta precaución, podes sobre escribirlo sin querer.

Tienes que hacer esto, porque si estás trabajando en el banco 1 cuando se produce una interrupción, cuando quieras salvar el valor de W, vas a estar en el banco 1 y no en el 0. Si fuerzas ir al banco 0 para salvar el registro en la posición de memoria deseada, vas a modificar el valor del registro status, y no vas a saber si estabas en el banco 0 o 1.
Por consiguiente, si quieres primero guardar el valor del registro status, vas a perder el valor de w.
Si bien, una vez que guardes el valor de W puede guardar temporalmente el valor de status en W; forzar con BCF ir al banco 0 y luego guardar dicho valor de W (que es el status), estás consumiendo memoria de programa; que tal vez no puedas darte el lujo de usar (va a depender de la cantidad de memoria que necesites).
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:PIC16F676-INTERRUPCIONES
« Respuesta #3 en: 26 de Agosto de 2021, 07:21:05 »
Si eso dice el datasheet entonces el de Microchip se fumo algo terrible. Mas que nada porque solo tiene 1 banco y es el banco 0.

Ese PIC solo posee memoria RAM en el banco 0, y si intentas acceder al banco 1, lo que terminas haciendo es acceder al banco 0.

Por ejemplo si lees la direccion 0xA0 vas a leer en realidad 0x20. Por eso dice el datasheet en el banco 1 (accesses 20h-5Fh) Pag. 10 del datasheet

En fin... Solo "definis" tu W_TEMP y STATUS_TEMP en el banco 0 y listo. Si posees en un PIC que tenga mas RAM, usualmente estos tienen tambien un espacio de memoria compartido al final de la misma.

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:PIC16F676-INTERRUPCIONES
« Respuesta #4 en: 26 de Agosto de 2021, 10:44:33 »
Como KillerJC indica, hay regiones de la memoria RAM que son las mismas en cualquier banco, y son diseñadas de esa manera porque están dedicados a salvaguardar el contexto ante una interrupción. De esa manera no tienes que preocuparte en que banco de memoria estás, debes guardar el (los) acumulador (res) y otros registros importantes. Generalmente en las hojas de datos debe explicarse cuales son.

Si estás trabajando en un lenguaje de alto nivel como C, me parece no debes preocuparte de eso. El compilador se encarga de eso. Si es en ensamblador, debes tener mucha precaución ante las interrupciones.

El cambio de contexto (guardar o recuperar) implica una latencia que podría afectar el desempeño del sistema por lo que cualquier proceso que realicen ante una interrupción debe ser lo más rápido posible, es decir guardar un valor, modificar una variable, etc e inmediatamente terminar el proceso para regresar al proceso principal.

« Última modificación: 26 de Agosto de 2021, 19:26:36 por DominusDRR »
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado afta

  • PIC16
  • ***
  • Mensajes: 123
Re:PIC16F676-INTERRUPCIONES
« Respuesta #5 en: 26 de Agosto de 2021, 22:19:00 »
Gracias a todos. Ingresé al banco 0 antes de guardar el registro W y funciona bien.

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:PIC16F676-INTERRUPCIONES
« Respuesta #6 en: 27 de Agosto de 2021, 12:38:07 »
Gracias a todos. Ingresé al banco 0 antes de guardar el registro W y funciona bien.

Creo que también, por seguridad deberías guardar el registro STATUS.


Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32


 

anything