![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Ejemplo de LED Blink con máquinas de estados (mbed / S08)
main.cpp@0:b9a539dbd0fe, 2018-03-19 (annotated)
- Committer:
- diegocode
- Date:
- Mon Mar 19 17:39:32 2018 +0000
- Revision:
- 0:b9a539dbd0fe
- Child:
- 1:d488a7a0c9e1
Ejemplo de Blink con ME (mbed / S08 / etc.)
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
diegocode | 0:b9a539dbd0fe | 1 | #include "mbed.h" |
diegocode | 0:b9a539dbd0fe | 2 | |
diegocode | 0:b9a539dbd0fe | 3 | /* |
diegocode | 0:b9a539dbd0fe | 4 | * Ejemplo 01 - Máquinas de estados |
diegocode | 0:b9a539dbd0fe | 5 | * |
diegocode | 0:b9a539dbd0fe | 6 | * LED rojo 0.1s encendido y 0.9s apagado |
diegocode | 0:b9a539dbd0fe | 7 | * Con máquinas de estados. |
diegocode | 0:b9a539dbd0fe | 8 | * |
diegocode | 0:b9a539dbd0fe | 9 | */ |
diegocode | 0:b9a539dbd0fe | 10 | |
diegocode | 0:b9a539dbd0fe | 11 | // constantes para configurar Ticker |
diegocode | 0:b9a539dbd0fe | 12 | #define TICK_MS 10 |
diegocode | 0:b9a539dbd0fe | 13 | |
diegocode | 0:b9a539dbd0fe | 14 | // constantes para tiempo on y tiempo off (En ms) |
diegocode | 0:b9a539dbd0fe | 15 | #define TO_LED_OFF_MS 900 / TICK_MS |
diegocode | 0:b9a539dbd0fe | 16 | #define TO_LED_ON_MS 100 / TICK_MS |
diegocode | 0:b9a539dbd0fe | 17 | |
diegocode | 0:b9a539dbd0fe | 18 | // Defines para GPIO en S08 |
diegocode | 0:b9a539dbd0fe | 19 | /* |
diegocode | 0:b9a539dbd0fe | 20 | #define LED PTAD_PTAD0 |
diegocode | 0:b9a539dbd0fe | 21 | #define _LED PTADD_PTADD0 |
diegocode | 0:b9a539dbd0fe | 22 | */ |
diegocode | 0:b9a539dbd0fe | 23 | |
diegocode | 0:b9a539dbd0fe | 24 | // Define estado para apagado y encendido |
diegocode | 0:b9a539dbd0fe | 25 | // (El RGB on-board de FRDM es AC => encendido si LO) |
diegocode | 0:b9a539dbd0fe | 26 | #define APAGADO 1 |
diegocode | 0:b9a539dbd0fe | 27 | #define ENCENDIDO 0 |
diegocode | 0:b9a539dbd0fe | 28 | |
diegocode | 0:b9a539dbd0fe | 29 | // Estados de la máquina de estados |
diegocode | 0:b9a539dbd0fe | 30 | enum { |
diegocode | 0:b9a539dbd0fe | 31 | LED_OFF, |
diegocode | 0:b9a539dbd0fe | 32 | LED_ON |
diegocode | 0:b9a539dbd0fe | 33 | }; |
diegocode | 0:b9a539dbd0fe | 34 | |
diegocode | 0:b9a539dbd0fe | 35 | // |
diegocode | 0:b9a539dbd0fe | 36 | Ticker tick; |
diegocode | 0:b9a539dbd0fe | 37 | |
diegocode | 0:b9a539dbd0fe | 38 | // Declara LED como DigitalOut correspondiente a LED Rojo |
diegocode | 0:b9a539dbd0fe | 39 | DigitalOut LED(LED_RED); |
diegocode | 0:b9a539dbd0fe | 40 | |
diegocode | 0:b9a539dbd0fe | 41 | // variable para time out encendido y apagado |
diegocode | 0:b9a539dbd0fe | 42 | unsigned int LED_tout = 0; |
diegocode | 0:b9a539dbd0fe | 43 | |
diegocode | 0:b9a539dbd0fe | 44 | // Variable de estado |
diegocode | 0:b9a539dbd0fe | 45 | char LED_estado = LED_OFF; |
diegocode | 0:b9a539dbd0fe | 46 | |
diegocode | 0:b9a539dbd0fe | 47 | // Máquina de estados |
diegocode | 0:b9a539dbd0fe | 48 | void LED_Step(); |
diegocode | 0:b9a539dbd0fe | 49 | void LED_Tick(); |
diegocode | 0:b9a539dbd0fe | 50 | |
diegocode | 0:b9a539dbd0fe | 51 | // inicialización del HW |
diegocode | 0:b9a539dbd0fe | 52 | void init_mcu(); |
diegocode | 0:b9a539dbd0fe | 53 | |
diegocode | 0:b9a539dbd0fe | 54 | int main() |
diegocode | 0:b9a539dbd0fe | 55 | { |
diegocode | 0:b9a539dbd0fe | 56 | init_mcu(); |
diegocode | 0:b9a539dbd0fe | 57 | |
diegocode | 0:b9a539dbd0fe | 58 | for(;;) { |
diegocode | 0:b9a539dbd0fe | 59 | LED_Step(); |
diegocode | 0:b9a539dbd0fe | 60 | } |
diegocode | 0:b9a539dbd0fe | 61 | } |
diegocode | 0:b9a539dbd0fe | 62 | |
diegocode | 0:b9a539dbd0fe | 63 | // Máquina de estados |
diegocode | 0:b9a539dbd0fe | 64 | void LED_Step(){ |
diegocode | 0:b9a539dbd0fe | 65 | switch(LED_estado){ |
diegocode | 0:b9a539dbd0fe | 66 | default: // si estado no definido => LED_OFF |
diegocode | 0:b9a539dbd0fe | 67 | case LED_OFF: // LED_OFF |
diegocode | 0:b9a539dbd0fe | 68 | LED = APAGADO; // salidas: Apaga LED |
diegocode | 0:b9a539dbd0fe | 69 | if (LED_tout == 0) { // transición: Si timeout apagado... |
diegocode | 0:b9a539dbd0fe | 70 | LED_estado = LED_ON; // próximo estado |
diegocode | 0:b9a539dbd0fe | 71 | LED_tout = TO_LED_ON_MS; // timeout <- timeout ON |
diegocode | 0:b9a539dbd0fe | 72 | } |
diegocode | 0:b9a539dbd0fe | 73 | break; |
diegocode | 0:b9a539dbd0fe | 74 | |
diegocode | 0:b9a539dbd0fe | 75 | case LED_ON: // LED_ON |
diegocode | 0:b9a539dbd0fe | 76 | LED = ENCENDIDO; // salidas: Enciende LED |
diegocode | 0:b9a539dbd0fe | 77 | if (LED_tout == 0) { // transición: Si tiemeout encendido... |
diegocode | 0:b9a539dbd0fe | 78 | LED_estado = LED_OFF; // próximo estado |
diegocode | 0:b9a539dbd0fe | 79 | LED_tout = TO_LED_OFF_MS; // timeout <- timeout OFF |
diegocode | 0:b9a539dbd0fe | 80 | } |
diegocode | 0:b9a539dbd0fe | 81 | break; |
diegocode | 0:b9a539dbd0fe | 82 | } |
diegocode | 0:b9a539dbd0fe | 83 | } |
diegocode | 0:b9a539dbd0fe | 84 | |
diegocode | 0:b9a539dbd0fe | 85 | // Para actualizar timeout de ME_LED |
diegocode | 0:b9a539dbd0fe | 86 | void LED_Tick() { |
diegocode | 0:b9a539dbd0fe | 87 | if (LED_tout > 0) |
diegocode | 0:b9a539dbd0fe | 88 | LED_tout--; |
diegocode | 0:b9a539dbd0fe | 89 | } |
diegocode | 0:b9a539dbd0fe | 90 | |
diegocode | 0:b9a539dbd0fe | 91 | // ISR de TPM1 Overflow para MCU S08 |
diegocode | 0:b9a539dbd0fe | 92 | /* |
diegocode | 0:b9a539dbd0fe | 93 | __interrupt VectorNumber_tpm1ovf tpm_overflow(){ |
diegocode | 0:b9a539dbd0fe | 94 | TPM1SC_TOF = 0; |
diegocode | 0:b9a539dbd0fe | 95 | |
diegocode | 0:b9a539dbd0fe | 96 | LED_tick(); |
diegocode | 0:b9a539dbd0fe | 97 | } |
diegocode | 0:b9a539dbd0fe | 98 | */ |
diegocode | 0:b9a539dbd0fe | 99 | |
diegocode | 0:b9a539dbd0fe | 100 | void init_mcu(){ |
diegocode | 0:b9a539dbd0fe | 101 | // ticker: ejecuta LED_Tick cada TICK_MS ms |
diegocode | 0:b9a539dbd0fe | 102 | tick.attach(&LED_Tick, TICK_MS / 1000); |
diegocode | 0:b9a539dbd0fe | 103 | |
diegocode | 0:b9a539dbd0fe | 104 | // Inicialización de GPIO y TPM1 para S08 |
diegocode | 0:b9a539dbd0fe | 105 | /* |
diegocode | 0:b9a539dbd0fe | 106 | LED = 0; |
diegocode | 0:b9a539dbd0fe | 107 | _LED = 1; |
diegocode | 0:b9a539dbd0fe | 108 | |
diegocode | 0:b9a539dbd0fe | 109 | TPM1SC = 0b01001011; // ftpm = 1us |
diegocode | 0:b9a539dbd0fe | 110 | TPM1MOD = 9999; // overflow cada 1ms |
diegocode | 0:b9a539dbd0fe | 111 | */ |
diegocode | 0:b9a539dbd0fe | 112 | } |