Diego Codevilla
/
LED_me_uno
Ejemplo de LED Blink con máquinas de estados (mbed / S08)
Diff: main.cpp
- Revision:
- 0:b9a539dbd0fe
- Child:
- 1:d488a7a0c9e1
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Mon Mar 19 17:39:32 2018 +0000 @@ -0,0 +1,112 @@ +#include "mbed.h" + +/* +* Ejemplo 01 - Máquinas de estados +* +* LED rojo 0.1s encendido y 0.9s apagado +* Con máquinas de estados. +* +*/ + +// constantes para configurar Ticker +#define TICK_MS 10 + +// constantes para tiempo on y tiempo off (En ms) +#define TO_LED_OFF_MS 900 / TICK_MS +#define TO_LED_ON_MS 100 / TICK_MS + +// Defines para GPIO en S08 +/* +#define LED PTAD_PTAD0 +#define _LED PTADD_PTADD0 +*/ + +// Define estado para apagado y encendido +// (El RGB on-board de FRDM es AC => encendido si LO) +#define APAGADO 1 +#define ENCENDIDO 0 + +// Estados de la máquina de estados +enum { + LED_OFF, + LED_ON +}; + +// +Ticker tick; + +// Declara LED como DigitalOut correspondiente a LED Rojo +DigitalOut LED(LED_RED); + +// variable para time out encendido y apagado +unsigned int LED_tout = 0; + +// Variable de estado +char LED_estado = LED_OFF; + +// Máquina de estados +void LED_Step(); +void LED_Tick(); + +// inicialización del HW +void init_mcu(); + +int main() +{ + init_mcu(); + + for(;;) { + LED_Step(); + } +} + +// Máquina de estados +void LED_Step(){ + switch(LED_estado){ + default: // si estado no definido => LED_OFF + case LED_OFF: // LED_OFF + LED = APAGADO; // salidas: Apaga LED + if (LED_tout == 0) { // transición: Si timeout apagado... + LED_estado = LED_ON; // próximo estado + LED_tout = TO_LED_ON_MS; // timeout <- timeout ON + } + break; + + case LED_ON: // LED_ON + LED = ENCENDIDO; // salidas: Enciende LED + if (LED_tout == 0) { // transición: Si tiemeout encendido... + LED_estado = LED_OFF; // próximo estado + LED_tout = TO_LED_OFF_MS; // timeout <- timeout OFF + } + break; + } +} + +// Para actualizar timeout de ME_LED +void LED_Tick() { + if (LED_tout > 0) + LED_tout--; +} + +// ISR de TPM1 Overflow para MCU S08 +/* +__interrupt VectorNumber_tpm1ovf tpm_overflow(){ + TPM1SC_TOF = 0; + + LED_tick(); +} +*/ + +void init_mcu(){ + // ticker: ejecuta LED_Tick cada TICK_MS ms + tick.attach(&LED_Tick, TICK_MS / 1000); + + // Inicialización de GPIO y TPM1 para S08 + /* + LED = 0; + _LED = 1; + + TPM1SC = 0b01001011; // ftpm = 1us + TPM1MOD = 9999; // overflow cada 1ms + */ +} \ No newline at end of file