TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: dbuc en 23 de Enero de 2003, 15:58:00
-
Hola
Esty probando el pic 16F628 y tengo un problema.
Mi programa tiene una interrupción por RB0, que anda fenomenal. El problema es que para terminar la iterrupcion debo hacerlo con RETFIE, y esta instrucción hace que el programa retome sus acciones en la posición del programa donde se produjo la interrupción, mi pregunta es: No habrá una forma de hacer que la vuelta de la interrupcin, por medio de RETFIE, sea a una dirección, determinada por mi, del prgrama (coo si fuera un GOTO)?
-
Hola dbuc.
Si la hay la desconozco (RETFIE para interrupciones y RETURN y RETLW para subrutinas). De todas formas creo que tendrías que decir en concreto que quieres que haga el programa, hay soluciones para casi todo.
Un consejo: si el programa o proyecto no es largo y deseas aprender a manejar bits, registros y funcionamiento interno del PIC escribe en ensamblador. Si el proyecto es grande no lo dudes en C.
Un saludo
-
podrias dar un valor a una variable cuando se produzca la interrupcion.
cuando regreses al punto donde se produjo la interrupcion ,puedes comprobar el valor de esa variable (registro) si se da el caso saltar a la etiqueta que desees
a grandes rasgos esta estructura
interrupcion
pongo variable a 1
fin de interupcion
principal
si variable = 1 salto a subrutina
volver a principal
subrutina
pongo variable a 0
fin de subrutina
espero sirva de algo esto.salu2
-
Mucho me temo que no puedas, el valor del program counter se guarda en el stack (pila) para volver luego por donde lo habia dejado, el problema que tiene la familia 16 es que dicho stack no es accesible y por lo tanto el contador del programa no puede ser modificado, esto si es posible hacerlo con la familia 18, ya que el stack si es accesible y puedes hacer un retorno de una irq por donde te de la gana.
Tienes que tener cuidado con el numero de llamadas a las subrutinas y irq, ya que se puede producir un overflow en el stack si no sales de las sub con return y de la irq con retfie, ademas de tener un numero limitado de llamadas a subrutinas dentro de otras subrutinas.