Ejemplo de LED Blink con máquinas de estados (mbed / S08)

Dependencies:   mbed

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?

UserRevisionLine numberNew 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 }