No conocia el bit_test pero por lo que veo me sirve igualmente meter lee=(Input_B () & 0XF0)>>4; dentro del mismo codigo. Cosa que queria evitar. La interrupcion es a intencion de no estorbar al codigo principal mientras no pulse button. Por lo que me an contado todos los compiladores no tienen el mismo defecto en mi caso el clear_interup con el timer fijo. un case: default no sirve en este caso para nada lo ideal es que no se cumpliese RB si es default
E mejorado esto implementando timer0 a RB como varrido de teclado. El resultado es similar al que hace el teclado de PC pulsas una tecla y opera, si continuas pulsando al cavo de cierto tiempo opera de manera continuada y mas rapido.
pero sige sin esplicarme por que rb se queda solo encerrado dentro de si mismo sin hacer nada.
#INT_RB//
void RB_isr(void){
clear_interrupt(INT_RB);
disable_interrupts(INT_RB); //RB se desactiva a si mismo
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_32);
SET_TIMER0(1);
//es mejor no utilizar aqui clear_interrupt(INT_TIMER0); si lo hago el timer0 tardara en responder
//sin el clear actua de inmediato
enable_interrupts(INT_TIMER0);//Activa timer0
//enable_interrupts(global);
clear_interrupt(INT_RB);
}
int1 puls=0;
int1 init=0,resul=0;
int1 trampa=0;//=1 datos que no debe mostrar
int1 mfin=0;//=1 muestra donde esta bola a prisionar boton-respuesta "case 1"
int mle=0;
int tolera=10;//tolerancia de error (+ - )
void tole(int1 t);
void defecto();
void estatico(trp);
void seesmilla(int16 semi);//mira la semilla inicial que impide que randon siempre empieze igual
#INT_TIMER0
void timer0(){
output_toggle(PIN_A2);
output_high(PIN_A3);
puls=1;
mle=lee;//se comprueva sise pulsa misma tecla
lee=(Input_B () & 0XF0)>>4;
switch(lee){
case 1 :
if(!init){ init=1; }
else { resul=1; }
break;
case 2 :
init=0; xg=5; yg=38; break;
case 3 :
mle=0;
puls=0;//no se acepta como pulsada
output_low(PIN_A3);
disable_interrupts(INT_TIMER0);
//clock0(0); //anula timer1 retrasando RB=true 1.2 sg
if(!trampa){
texto="TRAMPA "; glcd_text57(5,38,texto,1,on);
texto=" TRUE "; trampa=1;
} else {
texto="Trampa "; glcd_text57(5,38,texto,1,on);
texto=" False "; trampa=0;
}
glcd_text57(5,55,texto,1,on);
delay_ms(1100);
//glcd_text57(5,55,texto,1,off);
estatico(trampa);
ext_int_edge(l_to_h);//alto
clear_interrupt(INT_RB);
enable_interrupts(INT_RB);
break;
case 4 : yg--; break;
case 5 : yg++; break;
case 6 : if(vol<7){ vol++; xg++; glcd_circle(xg,yg,vol,on,off); } break;
case 7 : xg--; break;
case 8 : xg++; break;
case 9 : if(vol>1){ glcd_circle(xg,yg,vol,on,off); vol--; xg--; } break;
case 10 : if(tolera>1){ tole(0); } break;
case 11 : if(tolera<71){ tole(1); } break;
case 12 : defecto(); break;
case 13 :
mle=0; lee=0;
puls=0;//no se acepta como pulsada
output_low(PIN_A3);
disable_interrupts(INT_TIMER0);
set_adc_channel(0);
seesmilla(read_adc()); break;//mira la semilla inicial que impide que randon siempre empieze igual (y genera varios)
case 14 :
if(!mfin){
texto="FIN-VISUAL "; glcd_text57(5,44,texto,1,on);
texto=" TRUE "; mfin=1;
} else {
texto="Fin-visual "; glcd_text57(5,44,texto,1,on);
texto=" False "; mfin=0; }
glcd_text57(5,56,texto,1,on);
break;
//Aqui si es muy importante el default:
default://lee=0 u otras teclas no definidas (no se pulsa button)
mle=0;
puls=0;//no se acepta como pulsada
output_low(PIN_A3);
disable_interrupts(INT_TIMER0);//Timer0 se desactiva a si mismo
ext_int_edge(l_to_h);//alto
clear_interrupt(INT_RB);
enable_interrupts(INT_RB);//Activa RB el teclado podra a volver a interrumpir cuando quiera
break;
}
if(puls && mle==lee){ setup_timer_0(RTCC_INTERNAL|RTCC_DIV_4); }// misma tecla a anterior reduce tiempo de barrido //else { j1=1; }
SET_TIMER0(1);
}
Luego esta que esto solo va con un solo micro si lo implemento en el proyecto anterior, Proteus se traba con varios micros y no responde
Saludos