Ejercicio 1 tp1 lauckner lipari

Dependencies:   MMA8451Q mbed

main.cpp

Committer:
juanlipari
Date:
2018-05-23
Revision:
0:fc5ea8db410d

File content as of revision 0:fc5ea8db410d:

#include "mbed.h"
#define LED_TIC_ON 500  //Constante que se define para el control del tiempo de encendido del LED

enum {REPOSO, DEMORA, CONTROL, PULSADO, LEDOFF, LEDON}; //Estados de nuestras maquinas, tanto como la antirrebote como la del control del LED

PwmOut rled(LED1); //Pin de salida LED
Ticker timer;  //Timer para controlar los tiempos de LED y del pulsador
InterruptIn pulsador(PTA1);  //Pin de entrada del Pulsador

//Prototipos de funciones
void flanco (void);
void LEDTIC(void);
void LEDStep(void);
void anti_rebote_step (void);

unsigned char  memoria_puls = 0; //Variable que almacena el valor del pulsador, para que actue como un puls con retencion

int main(void)
{

    timer.attach(&LEDTIC, 0.001); //Configuracion del TIMER cada 1mSeg
    while(true) {
        anti_rebote_step(); //Maquina de estado antirrebote
        printf("Valor del Pulsador = %d\n",memoria_puls); //Se imprime para observar el valor del puls con Hercules
        if(memoria_puls == 1) //Si se presionó el pulsador, se llama a la Maquina que controla el LED
            LEDStep(); //Maquina de estado del LED
        else
            rled = 1;  //Si no se pulsó, se apaga el LED
    }
}


unsigned char anti_rebote_state = REPOSO; //Variable de estado, inicia en REPOSO
unsigned char estado_pulsador, puls; //Variables utilizadas en la Maquina de Estados
short LED_tic = 0, PULS_tic; //Variables de tiempo

//Maquina de estados que elimina el rebote
void anti_rebote_step (void)
{
    switch(anti_rebote_state) {
        default:  //Si no se definio estado, es REPOSO
        case REPOSO: //Estado REPOSO
            estado_pulsador = 0; //Variable que guarda el valor del pulsador, para utilizarlo como puls normal (sin retencion)
            pulsador.fall(&flanco); //Habilita interrupción por flanco descendente
            break;
            
        case DEMORA: //Estado DEMORA
            if(PULS_tic >0)  /Hasta que no pase el tiempo, sale de la funcion
                return;
            anti_rebote_state = CONTROL; //Proximo estado
            break;
            
        case CONTROL:  //Estado CONTROL
        
            puls = pulsador.read();   //Se lee el valor de la entrada con la funcion read();
            if(puls)  //Si vale 1, es decir que no se pulsó ya que esta conectado entre el micro y masa, vuelve al estado REPOSO
                anti_rebote_state = REPOSO;
            else {  //Si vale 0, significa que esta pulsado
                memoria_puls = !memoria_puls;  //Se niega el valor de memoria, que es el que actua como retencion y se pasa al estado PULSADO
                anti_rebote_state = PULSADO;
            }
            break;
            
        case PULSADO:  //Estado PULSADO
            estado_pulsador = 1;  //Variable que guarda el valor del pulsador, para utilizarlo como puls normal (sin retencion)
            pulsador.rise(&flanco); //Habilita interrupción por flanco ascendente
            break;
    }
}

//Funcion que se ejecuta cada vez que se detecta un flanco, ya sea ascendente o descendente
void flanco (void) 
{
    PULS_tic = 50; //Se reinicia el valor de la variable de tiempo del pulsador
    anti_rebote_state = DEMORA;  //Se pasa al estado DEMORA
}


unsigned char LEDState = LEDON;  //Variable de estado para la ME del LED
//Maquina de estados que controla el LED
void LEDStep(void)
{
    if(LED_tic>0)  //Como los tiempos son los mismos para los 2 estados, se espera hasta que pase el tiempo fuera del Switch
        return;
    switch(LEDState) {
        default:   //Si no se definio estado, es LEDOFF
        case LEDOFF:  //Estado LEDOFF
            rled = 1; //Se apaga el Led 
            LEDState = LEDON;  //Proximo estado 
            LED_tic = LED_TIC_ON;  //Se reinicia el valor de la variable de tiempo del LED
            break;
            
        case LEDON:  //Estado LEDON
            rled = 0.7f;  //Se enciende el LED a un valor 0.7 para que sea mas tenue
            LEDState = LEDOFF;  //Proximo estado 
            LED_tic = LED_TIC_ON;  //Se reinicia el valor de la variable de tiempo del LED
            break;
    }
}

//Funcion que se ejecuta cada 1mSeg
void LEDTIC(void)
{
    if(LED_tic > 0)
        LED_tic--;
    if(PULS_tic > 0)
        PULS_tic--;
}