Exemple #1
0
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);

}
Exemple #2
0
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
}