![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Ejercicio 1 tp1 lauckner lipari
main.cpp@0:fc5ea8db410d, 2018-05-23 (annotated)
- 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?
User | Revision | Line number | New 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 | } |