Estoy programando un 16F2550 usando CCS me surgio el siguiente problema que no se si es mi error de alguna configuracion o sera otra cosa quisiera su opinion, para hacerlo mas sencillo reduje el codigo para poder ver bien el error, sucede que si miran el codigo cada vez que se dispara la interrupcion 0 de Alto a Bajo enciende o apaga un led e incrementa un contador
ya en la rutina principal Activo las interrupciones y espero que sea la tercera pulsacion para
encender durante 2 segundos otro led
Aqui esta la cosa rara si despues de disable_interrups(GLOBAL) no se presiona el boton todo normal 0 problemas, ahora si despues de eso se presiona el boton durante el tiempo que el delay esta activado no se activa la interrupcion y eso esta bien PERO la rutina de interrupcion se ejecuta automaticamente al pasar por enable_interrups lo cual lo pueden comprobar con el primer led.
1era Interrupcion LED ON
2da Interrupcion LED OFF
3ra Interrupcion LED ON << y asi se tendria que quedar esperando hasta que sea presionado el boton y lo apague
Aqui les envio el codigo para que si quieren lo prueben a ver si les pasa lo mismo o me digan si tengo algun error.
ya en la rutina principal Activo las interrupciones y espero que sea la tercera pulsacion para
encender durante 2 segundos otro led
Aqui esta la cosa rara si despues de disable_interrups(GLOBAL) no se presiona el boton todo normal 0 problemas, ahora si despues de eso se presiona el boton durante el tiempo que el delay esta activado no se activa la interrupcion y eso esta bien PERO la rutina de interrupcion se ejecuta automaticamente al pasar por enable_interrups lo cual lo pueden comprobar con el primer led.
1era Interrupcion LED ON
2da Interrupcion LED OFF
3ra Interrupcion LED ON << y asi se tendria que quedar esperando hasta que sea presionado el boton y lo apague
Aqui les envio el codigo para que si quieren lo prueben a ver si les pasa lo mismo o me digan si tengo algun error.
Código:
#use delay(clock=48000000) // el clock que tendremos a la entrada del CPU
#use fast_io(B) //compilador usar puerto rapido no reconfigurar cada vez q se setea el puerto
#zero_ram //limpia ram
int CuentaClicks;
#int_ext
void ext_handler() {
output_toggle(PIN_C4);
CuentaClicks++;
}
void main(){
//---------------------desactivo interrupciones globales--------------------
disable_interrupts(GLOBAL);
//-------------------------configuracion de puertos-------------------------
setup_adc_ports(NO_ANALOGS); //desactivando puertos analogicos
setup_adc(ADC_OFF); //desactivando conversor analogo digital
//-------------------------configuracion de timers---------------------------
setup_timer_0(RTCC_INTERNAL | RTCC_DIV_256); //tiempo del timeout 4/48000000*65536*128 = 699ms
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED, 255, 1);
setup_timer_3(T3_DISABLED | T3_DIV_BY_1);
//-------------------------configuracion de los edges de disparo---------------
ext_int_edge(0,H_TO_L);
set_tris_b(0b11111111); //todo el puerto como entrada
//------------------------activando interrupciones-----------------------------
enable_interrupts(INT_EXT);
//------------------------inicializacion del display---------------------------
output_low(PIN_C4);
output_low(PIN_C5);
while(TRUE) {
CuentaClicks = 0;
enable_interrupts(GLOBAL); //solo aqui pueden haber interrupciones
while(CuentaClicks <= 2){
}
disable_interrupts(GLOBAL);
output_high(PIN_C5);
delay_ms(2000);
output_low(PIN_C5);
}//mega while
}//main