TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: picalo en 31 de Marzo de 2011, 11:44:37
-
Hola amigos de todopic !!!
Quisiera hacerles una consulta sobre un problema que estoy teniendo y buscando por el foro no encontre solucion aun...
Lo que necesito hacer es interrumpir el Main Program mediante una interrupción pero una vez terminada la interrupción que esta no vuelva a donde se produjo, sino a donde yo necesito, el siguiente seria el caso (1º caso)
#include <16F876A.h>
#use delay(clock=20000000)
#fuses HS,NOWDT,NOPROTECT,PUT
#use fast_io(A)
#use fast_io(B)
#use fast_io(c)
void fun1(void);
**********************************
#int_ext
void IntRb0 (void)
{
IR A ETIQUETA
}
***********************************
void main(void)
{
set_tris_a(0b000000);
set_tris_b(0b11110001);
set_tris_c(0b00000000);
ext_int_edge(H_to_L);
enable_interrupts(int_ext);
enable_interrupts(GLOBAL);
ETIQUETA
while(true)
{
}
Trate de utilizar la funcion goto (aunque no es conveniente) pero no la pude compilar ... luego se me ocurrio utilizar una funcion (2º caso)
#include <16F876A.h>
#use delay(clock=20000000)
#fuses HS,NOWDT,NOPROTECT,PUT
#use fast_io(A)
#use fast_io(B)
#use fast_io(c)
void fun1(void);
**********************************
#int_ext
void IntRb0 (void)
{
fun1();
}
***********************************
void main(void)
{
set_tris_a(0b000000);
set_tris_b(0b11110001);
set_tris_c(0b00000000);
ext_int_edge(H_to_L);
enable_interrupts(int_ext);
enable_interrupts(GLOBAL);
while(true)
{
}
***********************************
void fun1(void)
{
}
Esto tampoco funciono porque parece que si no termino de ejecutar la interrupción, esta me queda deshabilitada
Espero que una vez mas me puedan ayudar y de antemano LES AGRADESCO POR ESTAR AHÍ SALUDOS
-
Así no se trabaja con interrupciones, no podes volver a donde quieras ;-) Lo que podes hacer es setear una bandera y tratarla adecuadamente en el bucle principal.
Saludos!
-
Picalo: como bien dice Suky el propósito de las interrupciones es ese precisamente. Ir a la interrupción y volver a donde fue llamada.
Podrías usar una bandera y una vez de regreso comprobar cada tanto dentro de tu while con un if para sensar si ocurrió la interrupción y que dispare un break para salir del bucle while. Y una vez allí elegir el camino con un switch o lo que fuere. Pero es una solución poco elegante.
Saludos a ambos.
Jukinch
-
BUENO AMIGOS UNA VEZ MAS ESTOY AGRADECIDO POR SUS RESPUESTAS...
Mi idea era interrumpir un delay(500); y no volver al mismo pero bueno intentare de manejarlo de otra manera.
OTRA PREGUNTITA
Para utilizar goto, primero el programa debe encontrarse con la etiqueta y luego con la llamada goto?
MUCHISIMAS GRACIAS
-
Te soy sincero al goto lo use muy poco ,creo que tienen que estar todos los labels dentro de main para que funcione.
Investigo y te cuento.
Saludos
Jukinch