Diego Codevilla
/
LED_me_uno_eb
Ejemplo de Blink con FSM - En esta versión se verifica si transcurrió el tiempo ON/OFF al inicio de la ME
main.cpp@0:3fae25a85dcd, 2018-03-19 (annotated)
- 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?
User | Revision | Line number | New 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 | } |