Ejercicio 1 tp1 lauckner lipari

Dependencies:   MMA8451Q mbed

Committer:
juanlipari
Date:
Wed May 23 23:22:17 2018 +0000
Revision:
0:fc5ea8db410d
Ejerecicio 1 tp1 Lauckner Lipari

Who changed what in which revision?

UserRevisionLine numberNew contents of line
juanlipari 0:fc5ea8db410d 1 #include "mbed.h"
juanlipari 0:fc5ea8db410d 2 #define LED_TIC_ON 500 //Constante que se define para el control del tiempo de encendido del LED
juanlipari 0:fc5ea8db410d 3
juanlipari 0:fc5ea8db410d 4 enum {REPOSO, DEMORA, CONTROL, PULSADO, LEDOFF, LEDON}; //Estados de nuestras maquinas, tanto como la antirrebote como la del control del LED
juanlipari 0:fc5ea8db410d 5
juanlipari 0:fc5ea8db410d 6 PwmOut rled(LED1); //Pin de salida LED
juanlipari 0:fc5ea8db410d 7 Ticker timer; //Timer para controlar los tiempos de LED y del pulsador
juanlipari 0:fc5ea8db410d 8 InterruptIn pulsador(PTA1); //Pin de entrada del Pulsador
juanlipari 0:fc5ea8db410d 9
juanlipari 0:fc5ea8db410d 10 //Prototipos de funciones
juanlipari 0:fc5ea8db410d 11 void flanco (void);
juanlipari 0:fc5ea8db410d 12 void LEDTIC(void);
juanlipari 0:fc5ea8db410d 13 void LEDStep(void);
juanlipari 0:fc5ea8db410d 14 void anti_rebote_step (void);
juanlipari 0:fc5ea8db410d 15
juanlipari 0:fc5ea8db410d 16 unsigned char memoria_puls = 0; //Variable que almacena el valor del pulsador, para que actue como un puls con retencion
juanlipari 0:fc5ea8db410d 17
juanlipari 0:fc5ea8db410d 18 int main(void)
juanlipari 0:fc5ea8db410d 19 {
juanlipari 0:fc5ea8db410d 20
juanlipari 0:fc5ea8db410d 21 timer.attach(&LEDTIC, 0.001); //Configuracion del TIMER cada 1mSeg
juanlipari 0:fc5ea8db410d 22 while(true) {
juanlipari 0:fc5ea8db410d 23 anti_rebote_step(); //Maquina de estado antirrebote
juanlipari 0:fc5ea8db410d 24 printf("Valor del Pulsador = %d\n",memoria_puls); //Se imprime para observar el valor del puls con Hercules
juanlipari 0:fc5ea8db410d 25 if(memoria_puls == 1) //Si se presionó el pulsador, se llama a la Maquina que controla el LED
juanlipari 0:fc5ea8db410d 26 LEDStep(); //Maquina de estado del LED
juanlipari 0:fc5ea8db410d 27 else
juanlipari 0:fc5ea8db410d 28 rled = 1; //Si no se pulsó, se apaga el LED
juanlipari 0:fc5ea8db410d 29 }
juanlipari 0:fc5ea8db410d 30 }
juanlipari 0:fc5ea8db410d 31
juanlipari 0:fc5ea8db410d 32
juanlipari 0:fc5ea8db410d 33 unsigned char anti_rebote_state = REPOSO; //Variable de estado, inicia en REPOSO
juanlipari 0:fc5ea8db410d 34 unsigned char estado_pulsador, puls; //Variables utilizadas en la Maquina de Estados
juanlipari 0:fc5ea8db410d 35 short LED_tic = 0, PULS_tic; //Variables de tiempo
juanlipari 0:fc5ea8db410d 36
juanlipari 0:fc5ea8db410d 37 //Maquina de estados que elimina el rebote
juanlipari 0:fc5ea8db410d 38 void anti_rebote_step (void)
juanlipari 0:fc5ea8db410d 39 {
juanlipari 0:fc5ea8db410d 40 switch(anti_rebote_state) {
juanlipari 0:fc5ea8db410d 41 default: //Si no se definio estado, es REPOSO
juanlipari 0:fc5ea8db410d 42 case REPOSO: //Estado REPOSO
juanlipari 0:fc5ea8db410d 43 estado_pulsador = 0; //Variable que guarda el valor del pulsador, para utilizarlo como puls normal (sin retencion)
juanlipari 0:fc5ea8db410d 44 pulsador.fall(&flanco); //Habilita interrupción por flanco descendente
juanlipari 0:fc5ea8db410d 45 break;
juanlipari 0:fc5ea8db410d 46
juanlipari 0:fc5ea8db410d 47 case DEMORA: //Estado DEMORA
juanlipari 0:fc5ea8db410d 48 if(PULS_tic >0) /Hasta que no pase el tiempo, sale de la funcion
juanlipari 0:fc5ea8db410d 49 return;
juanlipari 0:fc5ea8db410d 50 anti_rebote_state = CONTROL; //Proximo estado
juanlipari 0:fc5ea8db410d 51 break;
juanlipari 0:fc5ea8db410d 52
juanlipari 0:fc5ea8db410d 53 case CONTROL: //Estado CONTROL
juanlipari 0:fc5ea8db410d 54
juanlipari 0:fc5ea8db410d 55 puls = pulsador.read(); //Se lee el valor de la entrada con la funcion read();
juanlipari 0:fc5ea8db410d 56 if(puls) //Si vale 1, es decir que no se pulsó ya que esta conectado entre el micro y masa, vuelve al estado REPOSO
juanlipari 0:fc5ea8db410d 57 anti_rebote_state = REPOSO;
juanlipari 0:fc5ea8db410d 58 else { //Si vale 0, significa que esta pulsado
juanlipari 0:fc5ea8db410d 59 memoria_puls = !memoria_puls; //Se niega el valor de memoria, que es el que actua como retencion y se pasa al estado PULSADO
juanlipari 0:fc5ea8db410d 60 anti_rebote_state = PULSADO;
juanlipari 0:fc5ea8db410d 61 }
juanlipari 0:fc5ea8db410d 62 break;
juanlipari 0:fc5ea8db410d 63
juanlipari 0:fc5ea8db410d 64 case PULSADO: //Estado PULSADO
juanlipari 0:fc5ea8db410d 65 estado_pulsador = 1; //Variable que guarda el valor del pulsador, para utilizarlo como puls normal (sin retencion)
juanlipari 0:fc5ea8db410d 66 pulsador.rise(&flanco); //Habilita interrupción por flanco ascendente
juanlipari 0:fc5ea8db410d 67 break;
juanlipari 0:fc5ea8db410d 68 }
juanlipari 0:fc5ea8db410d 69 }
juanlipari 0:fc5ea8db410d 70
juanlipari 0:fc5ea8db410d 71 //Funcion que se ejecuta cada vez que se detecta un flanco, ya sea ascendente o descendente
juanlipari 0:fc5ea8db410d 72 void flanco (void)
juanlipari 0:fc5ea8db410d 73 {
juanlipari 0:fc5ea8db410d 74 PULS_tic = 50; //Se reinicia el valor de la variable de tiempo del pulsador
juanlipari 0:fc5ea8db410d 75 anti_rebote_state = DEMORA; //Se pasa al estado DEMORA
juanlipari 0:fc5ea8db410d 76 }
juanlipari 0:fc5ea8db410d 77
juanlipari 0:fc5ea8db410d 78
juanlipari 0:fc5ea8db410d 79 unsigned char LEDState = LEDON; //Variable de estado para la ME del LED
juanlipari 0:fc5ea8db410d 80 //Maquina de estados que controla el LED
juanlipari 0:fc5ea8db410d 81 void LEDStep(void)
juanlipari 0:fc5ea8db410d 82 {
juanlipari 0:fc5ea8db410d 83 if(LED_tic>0) //Como los tiempos son los mismos para los 2 estados, se espera hasta que pase el tiempo fuera del Switch
juanlipari 0:fc5ea8db410d 84 return;
juanlipari 0:fc5ea8db410d 85 switch(LEDState) {
juanlipari 0:fc5ea8db410d 86 default: //Si no se definio estado, es LEDOFF
juanlipari 0:fc5ea8db410d 87 case LEDOFF: //Estado LEDOFF
juanlipari 0:fc5ea8db410d 88 rled = 1; //Se apaga el Led
juanlipari 0:fc5ea8db410d 89 LEDState = LEDON; //Proximo estado
juanlipari 0:fc5ea8db410d 90 LED_tic = LED_TIC_ON; //Se reinicia el valor de la variable de tiempo del LED
juanlipari 0:fc5ea8db410d 91 break;
juanlipari 0:fc5ea8db410d 92
juanlipari 0:fc5ea8db410d 93 case LEDON: //Estado LEDON
juanlipari 0:fc5ea8db410d 94 rled = 0.7f; //Se enciende el LED a un valor 0.7 para que sea mas tenue
juanlipari 0:fc5ea8db410d 95 LEDState = LEDOFF; //Proximo estado
juanlipari 0:fc5ea8db410d 96 LED_tic = LED_TIC_ON; //Se reinicia el valor de la variable de tiempo del LED
juanlipari 0:fc5ea8db410d 97 break;
juanlipari 0:fc5ea8db410d 98 }
juanlipari 0:fc5ea8db410d 99 }
juanlipari 0:fc5ea8db410d 100
juanlipari 0:fc5ea8db410d 101 //Funcion que se ejecuta cada 1mSeg
juanlipari 0:fc5ea8db410d 102 void LEDTIC(void)
juanlipari 0:fc5ea8db410d 103 {
juanlipari 0:fc5ea8db410d 104 if(LED_tic > 0)
juanlipari 0:fc5ea8db410d 105 LED_tic--;
juanlipari 0:fc5ea8db410d 106 if(PULS_tic > 0)
juanlipari 0:fc5ea8db410d 107 PULS_tic--;
juanlipari 0:fc5ea8db410d 108 }