Interrupciones en los PIC

Hola, quiero hacer que una vez atentida una interrupción por una patilla del puerto, me vuelva a la dirección de programa que yo quiero, no donde se quedó cuando fué a atender la interrupción.

¿Es posible, como?

Gracias y un saludo.
 
No! Siempre cuando el micro atiende una interrupción, una vez culminada la atención adicha interrupción, regresa a ejecutar la siguiente instrucción que quedó pendiente al momento de la atención de interrupcion....
 
Si es verdad el contador de programa PC (guarda la direccion de la memoria de programa que se esta ejecutando ) es guardado su valor en el STACK o PILA y al salir de la INT se recupera ese valor, esto debe ser asi porque un proceso interrumpido por la INTERRUPCION podria crear conflictos o valores indeseables al no ser concluido, supon que estabas haciendo una suma y tenias el REG W con un valor XX si ingresas a la INT y al salir te vas a hacer otra cosa sin tener en cuenta lo que tenia W entonces ese nuevo proceso no siempre sera el mismo o tendra errores, espero lo entiendas, chauuuuuuuuu
 
Y si yo supiera la dirección de memoria en la pila donde guarda el valor de PC de retorno, no podría yo modificarlo desde la rutina de la interrupción para que regrese donde yo quiero?

¿Como puedo saber la dirección de memoria donde guarda la dirección de retorno para poder modificarla?

Gracias y un saludo
 
que pic usas?? en el f84/f627/f628/f877 no tenes acceso a la pila, tendrias que generar un codigo dentro de la interupcion que prenda alguna bandera, al retornar al programa principal, dentro de algun loop tendrias que atender esa bandera para que el micro salte a donde quieras, desde ya este codigo puede tardar tiempos aleatorios dependiendo de cuan largo sea este loop.
 
Hola que tal soy nuevo por estos rumbos , quisiera ver si me pudieran aconsejar como hacer un reloj digital con un pic 16f877 utilizando la multiplexacion y la programacion por interrupciones.
Gracias.
 
yo hize algo parecido con un programa bastante complicado, lo que hago es marcar una bandera (flag) o bit de un registro en la memoria, en el servicio de salida de la interrupcion
y en la parte principal del programa lo checo constantemente entre llamadas a otras rutinas una vez detectado el 'flag' lo limpio y salto a donde yo quiera.
ojala eso te funcione.
 
Lo que tendrias que hacer es generar un registro y cuando se produzca la interrupcion se genere un valor dentro de la rutina de interrupcion guardaandolo en este registro y una vez fuera de ella, o sea cuando vuelve al programa estructurado que este estuviera dentro de un bucle que fuera testeando el valor de este registro para saltar a la parte del programa que quieras.
 
No veo ventaja ninguna en modificar la dirección de retorno de una rutina interrupcion.Es más sólo le veo inconvenientes. No se si los PIC se puede o no.
En otros microprocesadores sí que hay instrucciones (PUSH-POP) para poder almacenar en la pila copia de los registros o de direcciones de memoria que nos interesa salvar temporalmente mientras se ejecuta la interrupcion pero hay que tener cuidado de recuperar lo guardado y devolverlo al mismo lugar donde de tomo ya que sino es una verdadera fuente de problemas y al salir de la rutina puede ocurrir que el PC se cargue con un dato equivocado y nos devuelva la ejecución en una direccion aleatoria. A mí me ha pasado (concretamente para un Z80) este problema en un programa grabado a partir de un fichero HEX y me volví loco para descubrir el fallo. Tuve que desesensamblarlo y dedicarle muchas horas.

Si lo que quieres es ejecutar un programa a partir de una dirección lo lógico es incluir esa subrutina en la rutina de interrupción pero la salida de ésta debe ser siempre a la dirección donde quedo interrumpido el programa.
 
Hola que tal, leete el manual del pic, ahi hay algo acerca de modificar el stack que es lo que necesitas hacer, de esta manera manipulas directamente e stack, y la interrupcion y banderas las activas tmb a como tu desees..
el stack, tengo entendido que es el registro donde se guardan las direcciones de retorno, pero tmb hay un auxiliar de ese registro que es un contador, que indica cual es la posicion que guarda la direccion a la cua debe de regresar.

Hola que tal soy nuevo por estos rumbos , quisiera ver si me pudieran aconsejar como hacer un reloj digital con un pic 16f877 utilizando la multiplexacion y la programacion por interrupciones.
Gracias.
Necesitas 2 timers, uno para refrescar los display y otro para el contador de tiempo.
hh:mm:ss
hay un timer que te da hasta 5xx,xxx micro segundos, lo puedes programar para que te de 500000 microsegundos, y cada 2 desbordes del mismo te aumente los segundos.
en cuanto a los displays, debes de refrescar uno solo al menos 24 veces por segundo para evitar el parpadeo, como son 6 displays multiplexados:
24*(6displays)=144 veces por segundo para los 6 displays en total.
un segundo tiene 1000000 microsegundos
1000000/144=6944 microsegundos aprox.
esto significa usando la tcnica de multiplexacion, donde solo puedes encender uno a la vez, cada uno debera permanecer encendido durante 6944 microsegundos, para asi lograr que los 6 displays se enciendan 24 veces en 1 segundo.

hay bastante información de esto en el foro, te recomiendo crear un nuevo topic, cuando es distinto el objetivo. ya que la mayoria de nosotros no tendemos a leer la fecha del post inicial y publicamos respuestas sin leer los demas posts saludos!
 
Última edición:
Una consulta la pregunta es, si utilizo dos PCF8574 como entrada por ejemplo y en un pic solo tengo una entrada por interrupcion, puedo de alguna manera con una interrupcion adivinar cual de los dos fue el que interrumpio? hay alguna manera? o tengo que multiplexar las interrupciones? Gracias..
 
No se puede de forma sencilla, y también ocasionarías una colisión lógica.
Tendrías que usar diodos para aislar las salidas de interrupción.

Una solución ineficaz sería invertir la salida de uno y cuando se reciba la interrupción, cambiar el flanco.
Pero el problema es que se pierde la interrupción del dispositivo que la provocó, hasta que se produzca la interrupción del segundo para que se vuelva a cambiar el flanco.

La complicada y también ineficaz, es que cada dispositivo dispare un generador con cierta cantidad de pulsos y periodos definidos.
En la interrupción, por lecturas de los pulsos y su periodo, se determinaría cuál fue.
Esto sería algo así como decodificar un protocolo y obviamente también hay que aislar.

Lo más conveniente sería usar la interrupción RB7 <> RB4 y si no hay retardos de por medio, por poleo.
 
Una consulta la pregunta es, si utilizo dos PCF8574 como entrada por ejemplo y en un pic solo tengo una entrada por interrupcion, puedo de alguna manera con una interrupcion adivinar cual de los dos fue el que interrumpio? hay alguna manera? o tengo que multiplexar las interrupciones? Gracias..
No entiendo la pregunta.
¿Dos pics que manejan la misma entrada?

A ver, si adivino.
Tienes dos señales pero solo un pin de interrupción externa.
Entonces necesitas tres pines. A cada uno de los pines le conectas la señal externa y con ellas montas una OR para activar la interrupción.
Cuando llega la interrupción lo que haces es mirar los dos pines y entonces hacer lo que toque por el pin A, el pin B o los dos.

 
Lo que digo si hay un pic con solo una interrupción de entrada y tenés dos pcf8574 o 3 pcf8574 como entrada cada uno activa su interrupción como la distingo si el pico solo tiene una entrada

 
Hola.
Puedes hacer un OR con diodos según corresponda para dejar pasar la señal del pcf8574, es decir a cada salida INT le colocas diodo y la unión de estos al pin del PIC.

Solo quedaría por leer los datos de todos los pcf8574 y determinar quien fue del cambio.

Saludos
 
Y como decís vos qué es un método rápido como sabes cuál fue el que interrumpió de los 3? Porque sino tendría que leer los 3 es así no? cuando reciba una interrupción.

 
Recuerda que los dispositivos I2C tienen una dirección de acceso. Al leer o escribir un pcf8574, el pic envía la dirección de acceso, luego el bit de operación (lectura o escritura) y luego el bit de reconocimiento (ACK). En la datasheet (pág. 13-14) te explican el comportamiento de la salida INT' en cada diferente operación.

Datasheet (PCF8574): http://www.ti.com/lit/ds/symlink/pcf8574.pdf

Conexión de las salidas INT'
fig%2012.gif
 
Si se que tienen dirección pero la interrupción funciona cuando es modo entrada por lo tanto si tengo 3 y cada uno con un diodo y se produce una interrupción, el pic tiene que chequear los 3 porque no sabe cuál fue el que lo hizo. Porque los 3 van a una entrada en común.

 
Última edición:
Recuerda que el protocolo I2C funciona con un reloj (SCL), así que no pueden ocurrir 2 o más interrupciones por parte de los PCF8574 al mismo tiempo. De hecho, entre cada cambio de estado de la salida INT' existe un retardo de 4us, suficiente para identificar a cuál corresponde.

Comportamiento de INT' en modo lectura (R/W' = 1):
fig13p.gif
 
Última edición:
Atrás
Arriba