Que timer0 salte a otra parte del codigo

hola amigos de foro electrónica, les quiero preguntar sobre un caso que tengo
yo estoy trabajando en un codigo donde uso timer0

el timer0 cada 500us salta a revisar una función determinada y luego vuelve en donde se quedo , hasta allí todo bien
lo que se me esta haciendo un problema es que no se la manera o si existe la forma de hacer que cuando el timer0 este revisando esa función predefinida según el resultado que obtenga este puede saltar a otra parte del código que yo desee que empiece

en pocas palabras quiero que si al revisar su función si es 1 entonces mandarlo a otra parte del código y si es 0 la respuesta entonces continué haciendo su operación normalmente

pensé en usar goto o break pero no tengo resultado correctos, por ejemplo si pongo goto y pongo la etiqueta en donde yo quiero que salte , el programa me dice que no existe etiqueta y bueno es obvio que salga eso ya que la etiqueta esta fuera de estructura
ejemplo
#int timer0
void timer() {
.............................
.......goto inicio1....................
}

void operacion(){
...............................
.................
inicio1:
................................
}

pueden darme luz si puedo hacer que salte a esa parte del codigo y como ? , gracias
 
Eso es muy peligroso, puedes ir donde quieras pero al final tienes que volver al sitio original o acabarás desbordando la pila.
Lo que puedes hacer es activar un flag y que en el código principal haga una u otra cosa según esté ese flag

 
Hola, coincido con Scooter, yo personalmente, jamás! uso un goto y un delay mayor a 10ms.
En C, utilizo banderas, para generar eventos condicionales.
De esa manera el programa será secuencial desde la 1ra. hasta la última línea de código.
 
Gracias Scooter y Gudino, por responder.

No tengo muy claro esa teoría que mencionan de los flag.
¿Podrían darme un ejemplo en código para comprender mejor lo que me aconsejan?
Porque sí, igual que ustedes pienso que Goto no es muy recomendable, pero como no encontraba otra forma, estaba probando con esas sentencias.

Necesitaría un ejemplo algo sencillo nada más para poder entender, como usando flag puedo hacer que dentro del Timer0 pueda dirigirse hacia otra parte del código.

Les voy a poner el código más o menos para que tengan un idea de a donde quiero dirigirme.

Esto es parte del código :
PHP:
#include<16f877a.h>
//CONFIGURACION ANALOGICA
#device ADC= 10  

#fuses XT,NOWDT,NOPROTECT
#use delay(clock=20000000) 

void luces(void);  //pulsador1

#int_timer0
void timer0(){

//LECTURA DE LDR EN CANAL0 ANALOGICO
    q=read_adc(); delay_us(50);
    v=(5.0*q)/1024.0;
   
   if(v>=0 && v<=0.99  ){   
   
   output_high(blanco); ld=0;
   output_low(rojo);output_low(verde);output_low(azul);
   output_low(rojo1);output_low(verde1);output_low(azul1);
   
   
   }else{
         output_low(blanco);ld=1;
        //reinicio1();//GOTO texto; AQUI ES DONDE YO QUIERO QUE SI ES ESTA RESPUESTA ENTONCES DESDE EL TIMER0 SALTE A LA ETIQUETA texto. 
   
   }

void main()
{
//Bloque de configurc de interrupciones para timer0
setup_timer_0(RTCC_INTERNAL |RTCC_DIV_16 );
SET_TIMER0(100);
enable_interrupts(INT_TIMER0); // Habilitamos la interrupción que deseamos
enable_interrupts(GLOBAL); //Habilita int. general 

//Configuracion de interrupciones por RB4-RB7
 enable_interrupts(INT_RB);

 while(TRUE)
   {   
   
   luces();
   
   
   }

void luces (){
  int a,b,b1,c,d;

texto: // AQUI ES DONDE QUIERO QUE SE DIRIJA NUEVAMENTE EL RETORNO DEL TIMER0 

 if(ld==1 && e==1){
  
  //1era enciende marco rojo queda encendido
   //output_low(blanco);
       output_high(rojo) ;delay_ms(Dminuto);output_low(rojo);
       output_high(verde);delay_ms(Dminuto);output_low(verde);
       output_high(azul) ;delay_ms(Dminuto);output_low(azul);//delay_ms(100);
       output_high(rojo) ;delay_ms(Dminuto);//output_low(rojo);

}
Espero me puedan ayudar sobre qué puedo hacer para lograr eso desde el Timer0

Gracias por su apoyo.
 
Última edición por un moderador:
A lo que se refieren es a esto mas o menos

Código:
#include<16f877a.h>
//CONFIGURACION ANALOGICA
#device ADC= 10 

#fuses XT,NOWDT,NOPROTECT
#use delay(clock=20000000) 

[COLOR="Red"]int1 flag=0;[/COLOR]

void luces(void); //pulsador1

#int_timer0
void timer0(){

//LECTURA DE LDR EN CANAL0 ANALOGICO
q=read_adc(); delay_us(50);
v=(5.0*q)/1024.0;

if(v>=0 && v<=0.99 ){ 

output_high(blanco); ld=0;
output_low(rojo);output_low(verde);output_low(azul );
output_low(rojo1);output_low(verde1);output_low(az ul1);


}else{
output_low(blanco);ld=1;
[COLOR="red"]flag=1;[/COLOR]

}

void main()
{
//Bloque de configurc de interrupciones para timer0
setup_timer_0(RTCC_INTERNAL |RTCC_DIV_16 );
SET_TIMER0(100);
enable_interrupts(INT_TIMER0); // Habilitamos la interrupción que deseamos
enable_interrupts(GLOBAL); //Habilita int. general 

//Configuracion de interrupciones por RB4-RB7
enable_interrupts(INT_RB);

while(TRUE)
{ 

luces();


{

void luces (){
int a,b,b1,c,d;

[COLOR="red"]if (flag==1)
{
' aqui tu texto que quieras hacer
flag=0;
}[/COLOR]
 

if(ld==1 && e==1){

//1era enciende marco rojo queda encendido
//output_low(blanco);
output_high(rojo) ;delay_ms(Dminuto);output_low(rojo);
output_high(verde);delay_ms(Dminuto);output_low(ve rde);
output_high(azul) ;delay_ms(Dminuto);output_low(azul);//delay_ms(100);
output_high(rojo) ;delay_ms(Dminuto);//output_low(rojo);

}
 
Hola papirrin, gracias por responder.
Acabo de incluir lo que me sugieres y probarlo, pero nada, esos flag se comportan como variables globales, sólo se cumple una vez, pero cuando entran al bucle luces () y el timer vuelve a llamar a la función, ya deja de funcionar, y más aún, sólo funciona en la primer ejecución del programa, pero ya cuando entra en el bucle luces, ya no sirve.

Lo que yo deseo, es que en vez de que el timer0 regrese a donde se quedo, éste mandarlo al inicio del programa, o mejor dicho, al inicio del bucle luces() y de allí nuevamente empiece el proceso luces()
No sé si me dejo entender, amigos.
¿Existe alguna forma de poder hacer eso?

Porque ya probé poniendo ah ld=0 y a e=0 para que cuando regrese se deje de cumplir esa función, pero nada, el timer0 regresa al punto donde se quedó y entonces así nunca vuelve a verificar si ld cambio a cero como e.
Y es lógico porque la tarea del timer0 es ese sólo ver el llamado un momento y luego volver al punto donde se quedó.

Lo que yo pregunto es, ¿hay alguna forma de terminarlo o de redireccionarlo a otro punto o parte del código?

Gracias por su tiempo y ayuda.
Espero me sigan dando luces, amigos.
 
Última edición por un moderador:
Yo no dije que iba a funcionar así, solicitaste un ejemplo de como se usan las banderas y te puse uno, lo que al igual que los compañeros me perece una de las mejores opciones, la lógica la debes diseñar tu pues tu eres el del proyecto y sabes lo que estas haciendo. También en tu rutina puede necesitar que desactives la interrupción.

 
Papirrin, gracias amigo y disculpe si por allí incomodé con mi comentario.
Sólo quería dejar claro que lo había probado con esas líneas pero que no me resultó, nada más no quise por alli incomodarlo.

Y claro, la lógica la estoy diseñando yo, no pido que me lo hagan.
Sólo es que siempre hay personas que saben más que uno y por eso pido si me pueden ayudar con alguna información de lo que deseo realizar, por eso expliqué lo más claro que puedo para dejarme entender a todos los amigos que gracias me están apoyando.

Y si tienes razón, creo que necesito desactivar justo en ese instante la interrupción.
¿Có
mo puedo realizar esa tarea? ¿Me puede dar una ayuda en eso?
Se lo agradecería mucho, Papirrin. :)
 
Última edición por un moderador:
Lo que quieres hacer no debes de hacerlo con interrupciones. Revisa el estado del timer en tu código por muestreo y saltas a donde quieras.

 
Atrás
Arriba