Hola amigo, te recomiendo que por cada pregunta relacionada con el mismo tema no abras un nuevo post, utiliza el que abriste inicialmente.
Te recomiendo que utilices una base de tiempo de 1 segundo, activando una bandera, ban_1seg, ya con esta puedes sincronizar todos los tiempos que necesites, ejemplo, para 3 minutos colocas en una rutina un contador con 180 y cuando este tiempo se cumpla realizas la operación que necesites, de esta forma el PIC puede realizar más tares y no quedarse anclado en una rutina de tiempo
revisa este ejemplo, saludos.
#include <16f876.h>
#fuses XT,NOWDT
#use delay(clock=4000000)
#use standard_io(b)
int cont=0, con_3min=0;
short ban_1seg=0;
void temporizar();
///////////////////////////////////////
#int_TIMER1 //Interrupción Timer1
void temp1s(void) //Función
{
delay_cycles(2);
set_timer1(3041); //62.500 * 8 (prescaler) = 0,5 seg
cont++;
if(cont == 2){ //0,5 seg x 10 son 5 segundos.
ban_1seg = 1;
cont = 0;
}
}
///////////////////////////////////////
void main ()
{
setup_timer_1 (t1_internal | t1_div_by_8);
set_timer1 (3041); //recarga del tmr1
enable_interrupts(int_timer1); //habilita interrupcion timer1
enable_interrupts(global); //habilita interrupción general
output_b(0);
while(true)
{
if(ban_1seg)
{
ban_1seg = 0;
temporizar();
}
}
}
///////////////////////////////////////
void temporizar()
{
con_3min++;
if(con_3min == 180)
{
con_3min = 0;
output_high(pin_b1);
}
}