Utilizar GOTO en C .... es algo que no deberia hacerse simplemente, incluso por ahi menzclar ASM y C no es nada facil
un GOTO como tenes implmentado no es mas que un
while(1)
{
// aca codigo
}
si observas cuando termina el while comienza de nuevo.. en fin es eso.
Por otro lado no entiendo que estas tratando de hacer. Seria una buena idea que trataras de explicar lo que quieres hacer asi se te dan algunas ideas para que puedas mejorar o tal ves simplificar el programa.
Con respecto a tu pregunta original sobre "ejecucion por un tiempo pre establecido"
Podes hacerlo de distintas formas:
Opcion 1Conociendo el tiempo que tarda en ejecutarse esa parte del programa, repetirlo X cantidad de veces tal que se cumple (X * tiempo) = tiempo establecido.
Esa es una... Suponete que tenes una funcion que tarda 50ms en hacer todo pero vos queres que marche constantemente por 1 segundo, entonces debo repetirlo 20 veces
i=0;
while(i++<20)
{
// Codigo que se repite 20 veces
}
o
Como ves es una ventaja lo simple que es, la desventaja es que tenes que conocer el tiempo de ejecucion y si por ahi cambia mucho el tiempo no podes aplicarlo, por otra parte el codigo SI o SI tiene que hacer las 20 vueltas esas.
Opcion 2Utilizar un timer. Los timers permiten contar los pulsos de reloj, si tenes un reloj (cristal) de 4Mhz vas a tener un ciclo de 1us ( 4/4Mhz ) los timer tienen preescalers y dividen ese valor hasta unos 256 veces, o que es lo mismo que decir que aumenta 256 veces su periodo 256us, El 16F887 si no mal recuerdo tiene un timer de 16bits, el cual podes hacerlo contar hasta 0.5 segundos, entonces si quiero contar esos 0.5s hago esto
TMR1 = valor_para_los_0.5_segundos;
Flag TMR1 = 0;
while (!TMR1) // Esto va a hacer que se ejecute hasta que el flag se ponga a 1, es decir cuando pasen los 0.5s
{
}
Un Poco mas complejo peeeero mas exacto, y no dependiente del codigo, tambien podemos usar una interrupcion y tomar como referencia cuantas veces entra a la interrupcion X * 0.5s , si entras 2 veces sabemos que ya paso 1 segundo. entonces ponemos a 1 una flag y eso hace que salga del while (donde el while pregunta por esa flag )
Como dije Ventajas: mas exacto, menos dependiente del codigo.
Desventajas: aun asi se queda ahi hasta que termine.
Cualquier otra opcion aparte que se me ocurra ya involucra cambios mas grandes en la forma de hacer las cosas, refriendome al programa.