Hola llevo ya semanas con lo mismo aunque el "enable" es similar en ambos casos no entiendo porque no funciona en el segundo caso
Timer0 y Timer1 Son para el control de un ascensor
Hay 8 pisos 0 a 7 yo utilizo el 0 como piso B
el 8 significa ninguno
superior a 8 erroneo: varias ubicaciones (ascensor en 2 pisos a la vez) mas de 1 puerta exterior abierta y demas
//LAS PRINCIPALES VARIABLES SON...
//Finales de carreara Fisicos
int8 piso=8;//Finales de carrera para ubicazion de piso de 0 a 7//F.d.c
int8 atea=8;//"atea significa puerta" hace referencia a la puerta.exterior abierta de 0 a 7
//que debe corresponder con el piso donde se encuentra el ascensor
int1 open;//Final de carrera TRUE es puerta.interior hidraulica ABIERTA
int1 itxi;//Final de carrera TRUE es puerta.interior hidraulica CERRADA
//ints1 No fisicas// su estado activa pines correspondientes a tareas especificas
int1 okp=0;//para saber si esta "ocupado" realizando_tarea
//azti[0]=True Ascensor en marcha "activacion"
int1 azti[3]={0,0,0};//azti[1]=False_BAJANDO azti[1]=True_SUBIENDO
int1 hdra[3]={0,0,0};//hdra[0]=TRUE activacion hidraulica puerta.interior
//hdra[1]=TRUE ABRIENDO hidra[1]=FALSE CERRANDO
//(esa puerta.corredera.individual normalmente tienen ascensores en su interior)
int8 llma//"llamada" Pulsadores ya sean de interior o exterior del ascensor interfieren en ella
#INT_TIMER0//Este siempre a de estar activo
void TIMER0_isr(void){
if(borr<4){ borr++; } else { borr=0; lcd_putc("\f"); }
lcd_gotoxy(13,4); printf(lcd_putc,"t%utt%u.%u",borr,T1,f);//
lcd_gotoxy(8,1); printf(lcd_putc,"%u,%c,a%u,p%u(%u)",llma,210,atea,piso,okp);//,210);
if(llma!=8){//SE A PEDIDO PISO//si "llamada"=8 hace referencia a no hay llamada
if(llma!=piso){//No se a llegado a el MARCHA
if(atea==8 && 9>piso){//Normal//Ninguna ateak deberia estar abierta NI estar en varios pisos
if(itxi){ //hidraulico deberia estar itxi --
if(piso!=8){ azti[0]=1; //esta en un piso
if(llma>piso){ azti[1]=1; }//subir
else{ azti[1]=0; }//bajar
} //else{ azti[0]=0; hdra[0]=1; hdra[1]=1; }//llegada PARO & open-hidraulik
}else{ azti[0]=0; hdra[0]=1; hdra[1]=0; }//hidraulico NO!itxi
}else{ azti[0]=0; }
} else { ///PARO se a llegado
azti[0]=0;
if(!open){
hdra[0]=1; hdra[1]=1;
} else { hdra[0]=0;
llma=8; f=1; T1=0;
//ESTA ENTRADA A Timer1 VA BIEN//////////////////////////////////////////
clear_interrupt(int_timer1);
SET_TIMER1(1);
enable_interrupts(INT_TIMER1);
}
}
} //No hay peticion de piso || OR se a llegado a su destino
else { azti[0]=0;
//okp=0;//Para probarlo si pongo aqui okp=0; si entra en Timer_1 siempre que se cumpla el 2º IF
//pero no puede ser pone siempre el contador T1=0 y nunca sale de su segunda funcion f=2
if(!okp){//1º IF//int1 okp se refiere a ocupado
//2º IF
if(atea==piso){//Se abre la (puerta exterior corespondiente == al piso donde se encuentra el ascensor)
okp=1;//Este Ascensor ya esta "okupado=1" <--SOLO SE CUMLE ESTO Y ENTONCES YA NO VUELVE A ENTRAR EN 2º IF
f=2;//funcion_2º que va a desempeñar Timer_1 //EN ESTE CASO usuario entro se espera cierre atea=8.todas_cerradas
T1=0;//puesta a 0 de contador de espera
//ESTA ENTRADA A Timer1 NO SE CUMPLE/////////////////////////////////////////////
//pero segun el LCD de ambos PICS okp=1 pasa a True pero T1=0; Y f=0 siempre
clear_interrupt(int_timer1);
SET_TIMER1(1);
enable_interrupts(INT_TIMER1); }//delay_ms(2);
//else{
}
//if(!open){ hdra[0]=1; hdra[1]=1; } //hidraulico deberia pasar a open
//} else { hdra[0]=0; }
//}
}//PARO no hay peticion
if(!hdra[0]){ ulik=0; } else {
if(ulik>50){ lcd_gotoxy(3,1); lcd_putc("?"); lcd_gotoxy(6,1);
if(hdra[1]){ lcd_putc("No_Open!!"); }
else{ lcd_putc("No_Cierra!!"); } } else { ulik++; }
}
clear_interrupt(int_timer0);
SET_TIMER0(100);
}
#INT_TIMER1 //Este es para realizar labores de espera y cumplido un tiempo normalmente debe desavilitarse a si mismo
void TIMER1_isr(void){
switch(f){
case 1 ://Tras llegada al piso=llamada se espera que se abra atea=piso
lcd_gotoxy(1,4); printf(lcd_putc,"%c[%u]%c",127,piso,126);
if(atea!=piso){ T1++;//Nadie abre puerta"adecuada" tras llegada
if(T1>30){
lcd_gotoxy(1,3); lcd_putc("Nai abre tras llegar");//crt_20
lcd_gotoxy(1,4); printf(lcd_putc,"?[%u]?No open?? ",piso);//if(T2>X) Tiempo escesivo de espera dar por desocupado al ascensor
if(T1>60){ T1=0; f=20; }//"break" desokupar de todas formas
}else{ if(T1>4){ for(ct=5;T1>ct;ct+=6){ lcd_putc("?"); } } }
}else{//Apertura de atea en piso=llama=atea
T1=0; f=20; }//Ya no es necesario contadorT1 timer1 pasa a 20ºfuncion
break;
case 2 : //si alguien se mete-recientemente se da X opk=1
lcd_gotoxy(1,3); printf(lcd_putc,"intro%c<%u>",126,piso);
lcd_gotoxy(1,4); printf(lcd_putc,"%c[%u]%c",126,atea,127);
T1++; //delay_ms(1000);
if(atea!=8){ //T1++;//Se espera cierre de toda puerta
lcd_gotoxy(6,4);
if(T1>30){
printf(lcd_putc,"se spera %c[%u]%c",126,atea,127);
}else{ if(T1>4){
for(ct=5;T1>ct;ct+=6){ lcd_putc("?"); }
} }
} else {//se cerro toda ateak
f=3; T1=0;//se spera a k usuario introducido pulse piso"en interior" (nadie del exterior puede llamar)
clear_interrupt(INT_RB);
enable_interrupts(INT_RB);
lcd_putc("\f");
}
break;
case 3 :
if(llma!=8){//se spera a k usuario introducido pulse piso"en interior" (nadie del exterior puede llamar)
lcd_gotoxy(1,3); printf(lcd_putc,"<%c>",211);
if(T1>30){
if(T1<60){
lcd_putc("?se spera peticion ");
lcd_gotoxy(1,3); lcd_putc("Nai pide piso ");//crt_20
}else{//TIEMPO ESCESIVO desocupar okp=0;
clear_interrupt(INT_RB);
disable_interrupts(INT_RB);//ya no se espera peticion interna
f=20;
}
}else{ if(T1>4){ for(ct=5;T1>ct;ct+=6){ lcd_putc("?"); } } }
} else { f=20; T1=0; } //REALIZADA PETICION SE SUSPENDE TIMER1
break;
case 20 ://20º funcion
if(atea==8){ //Se espera el cierre de toda ateak//para poder dar como ok.u.p.ado=0 definitivamente
okp=0; llma=8; disable_interrupts(INT_TIMER1); }
break;
default :
okp=1; lcd_gotoxy(1,3); printf(lcd_putc,"ErroT1.f=%u ",f);
if(T1<70){ T1++; }
else{ T1=0; f=20; }
break;
}//swit(f)
clear_interrupt(int_timer1);
SET_TIMER1(1);
}