Ejemplo de Blink con FSM - En esta versión se verifica si transcurrió el tiempo ON/OFF al inicio de la ME

Dependencies:   mbed

Committer:
diegocode
Date:
Mon Mar 19 23:25:40 2018 +0000
Revision:
0:3fae25a85dcd
Ejemplo de blink de LED con FSM - otra versi?n (chequeo de timeout al inicio de ME)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
diegocode 0:3fae25a85dcd 1 #include "mbed.h"
diegocode 0:3fae25a85dcd 2
diegocode 0:3fae25a85dcd 3 /*
diegocode 0:3fae25a85dcd 4 * Ejemplo 01.eb - Máquinas de estados
diegocode 0:3fae25a85dcd 5 *
diegocode 0:3fae25a85dcd 6 * LED rojo 0.1s encendido y 1.9s apagado
diegocode 0:3fae25a85dcd 7 * Con máquinas de estados.
diegocode 0:3fae25a85dcd 8 *
diegocode 0:3fae25a85dcd 9 */
diegocode 0:3fae25a85dcd 10
diegocode 0:3fae25a85dcd 11 // constantes para configurar Ticker
diegocode 0:3fae25a85dcd 12 #define TICK_MS 10
diegocode 0:3fae25a85dcd 13
diegocode 0:3fae25a85dcd 14 // constantes para tiempo on y tiempo off (En ms)
diegocode 0:3fae25a85dcd 15 #define LED_T_ON_MS 100
diegocode 0:3fae25a85dcd 16 #define LED_T_OFF_MS 1900
diegocode 0:3fae25a85dcd 17
diegocode 0:3fae25a85dcd 18 #define TO_LED_OFF_MS LED_T_OFF_MS / TICK_MS
diegocode 0:3fae25a85dcd 19 #define TO_LED_ON_MS LED_T_ON_MS / TICK_MS
diegocode 0:3fae25a85dcd 20
diegocode 0:3fae25a85dcd 21 // Defines para GPIO en S08
diegocode 0:3fae25a85dcd 22 /*
diegocode 0:3fae25a85dcd 23 #define LED PTAD_PTAD0
diegocode 0:3fae25a85dcd 24 #define _LED PTADD_PTADD0
diegocode 0:3fae25a85dcd 25 */
diegocode 0:3fae25a85dcd 26
diegocode 0:3fae25a85dcd 27 // Define estado para apagado y encendido
diegocode 0:3fae25a85dcd 28 // (El RGB on-board de FRDM es AC => encendido si LO)
diegocode 0:3fae25a85dcd 29 #define APAGADO 1
diegocode 0:3fae25a85dcd 30 #define ENCENDIDO 0
diegocode 0:3fae25a85dcd 31
diegocode 0:3fae25a85dcd 32 // Estados de la máquina de estados
diegocode 0:3fae25a85dcd 33 enum {
diegocode 0:3fae25a85dcd 34 LED_OFF,
diegocode 0:3fae25a85dcd 35 LED_ON
diegocode 0:3fae25a85dcd 36 };
diegocode 0:3fae25a85dcd 37
diegocode 0:3fae25a85dcd 38 //
diegocode 0:3fae25a85dcd 39 Ticker tick;
diegocode 0:3fae25a85dcd 40
diegocode 0:3fae25a85dcd 41 // Declara LED como DigitalOut correspondiente a LED Rojo
diegocode 0:3fae25a85dcd 42 DigitalOut LED(LED_RED);
diegocode 0:3fae25a85dcd 43
diegocode 0:3fae25a85dcd 44 //Serial serusb(USBTX, USBRX);
diegocode 0:3fae25a85dcd 45
diegocode 0:3fae25a85dcd 46 // variable para time out encendido y apagado
diegocode 0:3fae25a85dcd 47 unsigned int LED_tout = 0;
diegocode 0:3fae25a85dcd 48
diegocode 0:3fae25a85dcd 49 // Variable de estado
diegocode 0:3fae25a85dcd 50 char LED_estado = LED_OFF;
diegocode 0:3fae25a85dcd 51
diegocode 0:3fae25a85dcd 52 // Máquina de estados
diegocode 0:3fae25a85dcd 53 void LED_Step();
diegocode 0:3fae25a85dcd 54 void LED_Tick();
diegocode 0:3fae25a85dcd 55
diegocode 0:3fae25a85dcd 56 // inicialización del HW
diegocode 0:3fae25a85dcd 57 void init_mcu();
diegocode 0:3fae25a85dcd 58
diegocode 0:3fae25a85dcd 59 int main()
diegocode 0:3fae25a85dcd 60 {
diegocode 0:3fae25a85dcd 61 init_mcu();
diegocode 0:3fae25a85dcd 62
diegocode 0:3fae25a85dcd 63 for(;;) {
diegocode 0:3fae25a85dcd 64 LED_Step();
diegocode 0:3fae25a85dcd 65
diegocode 0:3fae25a85dcd 66 }
diegocode 0:3fae25a85dcd 67 }
diegocode 0:3fae25a85dcd 68
diegocode 0:3fae25a85dcd 69 // Máquina de estados
diegocode 0:3fae25a85dcd 70 void LED_Step(){
diegocode 0:3fae25a85dcd 71 //serusb.printf("%d", LED_tout);
diegocode 0:3fae25a85dcd 72 if (LED_tout > 0) // Si no pasó el tiempo...
diegocode 0:3fae25a85dcd 73 return; // ...sale de ME
diegocode 0:3fae25a85dcd 74
diegocode 0:3fae25a85dcd 75 switch(LED_estado){
diegocode 0:3fae25a85dcd 76 default: // si estado no definido => LED_OFF
diegocode 0:3fae25a85dcd 77 case LED_OFF: // estado LED_OFF
diegocode 0:3fae25a85dcd 78 LED = APAGADO; // salidas: Apaga LED
diegocode 0:3fae25a85dcd 79 LED_estado = LED_ON; // próximo estado
diegocode 0:3fae25a85dcd 80 LED_tout = TO_LED_OFF_MS; // timeout <- timeout ON
diegocode 0:3fae25a85dcd 81 break;
diegocode 0:3fae25a85dcd 82
diegocode 0:3fae25a85dcd 83 case LED_ON: // estado LED_ON
diegocode 0:3fae25a85dcd 84 LED = ENCENDIDO; // salidas: Enciende LED
diegocode 0:3fae25a85dcd 85 LED_estado = LED_OFF; // próximo estado
diegocode 0:3fae25a85dcd 86 LED_tout = TO_LED_ON_MS; // timeout <- timeout OFF
diegocode 0:3fae25a85dcd 87 break;
diegocode 0:3fae25a85dcd 88 }
diegocode 0:3fae25a85dcd 89 }
diegocode 0:3fae25a85dcd 90
diegocode 0:3fae25a85dcd 91 // Para actualizar timeout de ME_LED
diegocode 0:3fae25a85dcd 92 void LED_Tick() {
diegocode 0:3fae25a85dcd 93 if (LED_tout > 0)
diegocode 0:3fae25a85dcd 94 LED_tout--;
diegocode 0:3fae25a85dcd 95 }
diegocode 0:3fae25a85dcd 96
diegocode 0:3fae25a85dcd 97 // ISR de TPM1 Overflow para MCU S08
diegocode 0:3fae25a85dcd 98 /*
diegocode 0:3fae25a85dcd 99 __interrupt VectorNumber_tpm1ovf tpm_overflow(){
diegocode 0:3fae25a85dcd 100 TPM1SC_TOF = 0;
diegocode 0:3fae25a85dcd 101
diegocode 0:3fae25a85dcd 102 LED_tick();
diegocode 0:3fae25a85dcd 103 }
diegocode 0:3fae25a85dcd 104 */
diegocode 0:3fae25a85dcd 105
diegocode 0:3fae25a85dcd 106 void init_mcu(){
diegocode 0:3fae25a85dcd 107 // ticker: ejecuta LED_Tick cada TICK_MS ms
diegocode 0:3fae25a85dcd 108 tick.attach(&LED_Tick, TICK_MS / 1000.0);
diegocode 0:3fae25a85dcd 109
diegocode 0:3fae25a85dcd 110 LED = APAGADO;
diegocode 0:3fae25a85dcd 111
diegocode 0:3fae25a85dcd 112 // Inicialización de GPIO y TPM1 para S08
diegocode 0:3fae25a85dcd 113 /*
diegocode 0:3fae25a85dcd 114 LED = 0;
diegocode 0:3fae25a85dcd 115 _LED = 1;
diegocode 0:3fae25a85dcd 116
diegocode 0:3fae25a85dcd 117 TPM1SC = 0b01001011; // ftpm = 1us
diegocode 0:3fae25a85dcd 118 TPM1MOD = 9999; // overflow cada 1ms
diegocode 0:3fae25a85dcd 119 */
diegocode 0:3fae25a85dcd 120 }