void Eint4567_ISR(void) { /* Identificar la interrupcion (hay dos pulsadores)*/ int which_int = rEXTINTPND; switch (which_int) { case 4: push_debug(0xFFFFFFFF,0xFFFFFFFF); boton=1; rINTMSK =BIT_EINT4567 | rINTMSK; //deshabilitar boton Timer3_Empezar(); estado=1; int_count++; // incrementamos el contador if(int_count==10){ int_count=reset; } break; case 8: boton=2; rINTMSK =BIT_EINT4567 | rINTMSK; //deshabilitar boton Timer3_Empezar(); confirmacion=1; estado=1; break; default: break; } // } D8Led_symbol(int_count); // sacamos el valor por pantalla (módulo 16) /* Finalizar ISR */ rEXTINTPND = 0xf; // borra los bits en EXTINTPND rI_ISPC |= BIT_EINT4567; // borra el bit pendiente en INTPND //esto //rINTMSK = ~(BIT_GLOBAL | BIT_TIMER0| BIT_TIMER2); }
void timer2_ISR(void) { timer2_num_int++; // momento actual = momento alarma if (alarma > 0 && alarma <= timer2_num_int) { // almacenar interrupcion en pila debug uint32_t auxData = 0; auxData |= estado_botones << 16; auxData |= pulsado << 8; auxData |= tiempo_botones; push_debug(0xDEB1, auxData); // ID = DEB1 // comprobar estado del boton hasta 500 ms como maximo // (500 = 100 (trp) + 400 (= 40 * 10)) if (estado_botones == 1 && pulsado > 0 && tiempo_botones <= 40) { //leer bits 6 y 7 (pulsadores) //cuando NO estan pulsados hay un 1 en rPDATG[7:6] if ((rPDATG & 0xC0) == 0xC0) { pulsado = 0; } // comprobar cada 10 ms programar_alarma(10); tiempo_botones++; } // despues de mas de 400 ms (mas los 100ms iniciales) -> avanzar 8Led else if (estado_botones == 1 && pulsado > 0 && tiempo_botones > 40) { // comparar con 300ms ((40-10) * 10) solo cuando se mantenga pulsado tiempo_botones = 10; // comprobar cada 10 ms programar_alarma(10); // avanza el 8Led una posicion D8Led_siguiente(); } // cuando se detecta que se ha soltado el boton else if (estado_botones == 1 && pulsado == 0 && trd_esperado == 0) { // trd = 100ms programar_alarma(100); trd_esperado = 1; } // else if (estado_botones == 1 && trd_esperado == 1) { // Por precaucion, volver a borrar los bits de INTPND y EXTINTPND rEXTINTPND = 0xf; rI_ISPC |= (BIT_EINT4567); // volver a activar las IRQs de botones rINTMSK &= ~(BIT_EINT4567); // reinicializar estado estado_botones = 0; tiempo_botones = 0; trd_esperado = 0; // desactivar alarma alarma = 0; } } /* borrar bit en I_ISPC para desactivar la solicitud de interrupción*/ rI_ISPC |= BIT_TIMER2; // pone un uno en el bit 11 que correponde al Timer2 }