cursada_mc2
Base de control de temperatura para EDU-CIAA-NXP
Loading...
Searching...
No Matches
app.c
Go to the documentation of this file.
1
6#include "app/app.h"
7
13#include "drivers/lcd_driver.h"
14#include "drivers/led_driver.h"
16#include "app/parametros.h"
18#include "hmi/hmi.h"
19
21static bool app_sensor_inicializado_ = false;
23static uint16_t app_sensor_ticks_reintento_ = 0U;
24
26 .scu_port = 6U,
27 .scu_pin = 1U,
28 .scu_mode = (uint16_t) (MD_PUP | MD_EZI | MD_ZI),
29 .scu_func = FUNC0,
30 .gpio_port = 3U,
31 .gpio_pin = 0U,
32};
33
34// Salida adicional del control en el poncho UNSJ: P8 pin 3 -> GPIO4 -> P4_0 / GPIO2[0].
35#define APP_CONTROL_GPIO_SCU_PORT 4U
36#define APP_CONTROL_GPIO_SCU_PIN 0U
37#define APP_CONTROL_GPIO_SCU_MODE (MD_PUP)
38#define APP_CONTROL_GPIO_SCU_FUNC FUNC0
39#define APP_CONTROL_GPIO_PORT 2U
40#define APP_CONTROL_GPIO_PIN 0U
41
42#define APP_LOOP_DELTA_MS 20U
43#define APP_TIMER_TICK_MS 1U
44
45static uint32_t app_ultimo_tick_procesado_ms_ = 0U;
46
47static int16_t app_convertir_temperatura_raw_a_deci(int16_t temperatura_cruda)
48{
49 const int32_t temperatura_escalada = (int32_t) temperatura_cruda * 10;
50
51 if (temperatura_escalada >= 0) {
52 return (int16_t) ((temperatura_escalada + 8) / 16);
53 }
54
55 return (int16_t) ((temperatura_escalada - 8) / 16);
56}
57
58static void app_salida_control_init(void)
59{
60 Chip_SCU_PinMux(
65 );
66 Chip_GPIO_SetDir(LPC_GPIO_PORT, APP_CONTROL_GPIO_PORT, (1U << APP_CONTROL_GPIO_PIN), 1);
67 Chip_GPIO_SetPinOutLow(LPC_GPIO_PORT, APP_CONTROL_GPIO_PORT, APP_CONTROL_GPIO_PIN);
68}
69
70static void app_salida_control_escribir(bool activa)
71{
72 if (activa) {
74 Chip_GPIO_SetPinOutHigh(LPC_GPIO_PORT, APP_CONTROL_GPIO_PORT, APP_CONTROL_GPIO_PIN);
75 } else {
77 Chip_GPIO_SetPinOutLow(LPC_GPIO_PORT, APP_CONTROL_GPIO_PORT, APP_CONTROL_GPIO_PIN);
78 }
79}
80
81static void app_step_20ms(void)
82{
83 hmi_estado_proceso_t estado_hmi = {0};
84 int16_t temperatura_cruda = 0;
85 int16_t temperatura_deci_celsius = 0;
86 bool temperatura_valida = false;
87 bool salida_activa = false;
88
91 if (app_sensor_ticks_reintento_ >= 50U) {
96 }
97 }
98 } else {
100
106 }
107 } else {
109 }
110
111 // Lee la ultima conversion lista del DS18B20 y la pasa a decimas de grado.
112 if (ds18b20_get_latest_raw(&app_sensor_temperatura_, &temperatura_cruda)) {
113 temperatura_deci_celsius = app_convertir_temperatura_raw_a_deci(temperatura_cruda);
114 temperatura_valida = true;
115 }
116 }
117
118 estado_hmi.temperatura_valida = temperatura_valida;
119 estado_hmi.temperatura_deci_celsius = temperatura_valida ? temperatura_deci_celsius : 0;
120
122 hmi_process();
123
124 // Primero se procesa la HMI y despues se toma la configuracion confirmada en ese mismo ciclo.
126 if (parametros_actualizar(&parametros_hmi)) {
127 (void) parametros_guardar();
128 control_on_off_configurar(parametros_hmi);
129 }
130
131 // Sin una medicion valida, la salida queda inhibida y la HMI muestra sensor ausente.
132 estado_hmi.sensor_disponible = temperatura_valida;
133 estado_hmi.salida_activa = false;
134 if (temperatura_valida) {
135 control_on_off_procesar(temperatura_deci_celsius, APP_LOOP_DELTA_MS);
136 salida_activa = control_on_off_esta_salida_activa();
137 estado_hmi.salida_activa = salida_activa;
138 }
139
140 hmi_cargar_estado_proceso(&estado_hmi);
141
142 app_salida_control_escribir(salida_activa);
143}
144
145void app_init(void)
146{
147 const parametros_control_t* parametros = 0;
148
149 // Inicializacion de la base de tiempo y drivers discretos.
152 led_init();
154 buzzer_init();
156 buttons_init();
158
159 // Inicializacion de la persistencia de parametros.
160 (void) driver_eeprom_init();
161 (void) parametros_init();
162
163 // Inicializacion del sensor de temperatura.
168 }
169
170 // Inicializacion de la HMI con el estado persistido.
171 hmi_init();
172 parametros = parametros_obtener();
175
176 // Inicializacion del lazo de control a partir de los parametros cargados.
177 control_on_off_inicializar(*parametros);
178
179 // Arranque del lazo cooperativo temporizado.
181}
182
183void app_process(void)
184{
185 const uint32_t tick_actual_ms = board_timer_get_ticks();
186
187 while ((uint32_t) (tick_actual_ms - app_ultimo_tick_procesado_ms_) >= APP_LOOP_DELTA_MS) {
189
191 }
192}
#define APP_CONTROL_GPIO_SCU_MODE
Definition app.c:37
static uint16_t app_sensor_ticks_reintento_
Definition app.c:23
static int16_t app_convertir_temperatura_raw_a_deci(int16_t temperatura_cruda)
Definition app.c:47
#define APP_CONTROL_GPIO_PIN
Definition app.c:40
#define APP_TIMER_TICK_MS
Definition app.c:43
#define APP_CONTROL_GPIO_SCU_FUNC
Definition app.c:38
static ds18b20_driver_t app_sensor_temperatura_
Definition app.c:20
static uint32_t app_ultimo_tick_procesado_ms_
Definition app.c:45
static void app_salida_control_escribir(bool activa)
Definition app.c:70
#define APP_CONTROL_GPIO_SCU_PIN
Definition app.c:36
#define APP_LOOP_DELTA_MS
Definition app.c:42
static bool app_sensor_inicializado_
Definition app.c:21
void app_process(void)
Ejecuta una iteracion del lazo principal de la aplicacion.
Definition app.c:183
static const onewire_pin_config_t app_pin_ds18b20_
Definition app.c:25
#define APP_CONTROL_GPIO_SCU_PORT
Definition app.c:35
static void app_salida_control_init(void)
Definition app.c:58
static void app_step_20ms(void)
Definition app.c:81
void app_init(void)
Inicializa los modulos de la aplicacion.
Definition app.c:145
static uint16_t app_sensor_ticks_actualizacion_
Definition app.c:22
#define APP_CONTROL_GPIO_PORT
Definition app.c:39
Interfaz de la capa principal de aplicacion.
void buttons_process(uint32_t delta_ms)
Procesa el debounce y actualiza los eventos latcheados de teclas.
void buttons_init(void)
Inicializa los pines asociados a los cuatro pulsadores.
Interfaz del driver de pulsadores discretos.
void buzzer_init()
Inicializa el pin de control del buzzer.
void buzzer_turn_off()
Desactiva el buzzer.
Interfaz del driver de buzzer.
void control_on_off_inicializar(parametros_control_t parametros)
Inicializa el control on/off.
bool control_on_off_esta_salida_activa(void)
Indica si la salida del control esta activa.
void control_on_off_procesar(int16_t medicion, uint32_t delta_tiempo_ms)
Procesa una nueva medicion y actualiza la salida del control.
void control_on_off_configurar(parametros_control_t parametros)
Actualiza la configuracion del control on/off.
Implementacion de control on/off con histeresis.
void driver_delay_init(void)
Inicializa la base de tiempos usada por los delays bloqueantes.
Interfaz comun de delays bloqueantes basada en stopwatch de LPCOpen.
bool ds18b20_init(ds18b20_driver_t *driver, const onewire_pin_config_t *pin_config)
Inicializa el driver DS18B20 sobre el pin indicado.
void ds18b20_process(ds18b20_driver_t *driver, uint16_t elapsed_ms)
Avanza la maquina de estados no bloqueante del sensor.
bool ds18b20_is_busy(const ds18b20_driver_t *driver)
Indica si hay una conversion en curso.
bool ds18b20_start_conversion(ds18b20_driver_t *driver)
Inicia una conversion de temperatura.
bool ds18b20_get_latest_raw(const ds18b20_driver_t *driver, int16_t *raw_temperature)
Obtiene la ultima temperatura cruda ya convertida.
Interfaz del driver para sensor de temperatura DS18B20.
bool driver_eeprom_init(void)
Inicializa el periferico EEPROM.
Driver de acceso a la EEPROM interna del LPC4337.
void hmi_init(void)
Inicializa el estado interno de la HMI y dibuja la pantalla inicial.
Definition hmi.c:249
parametros_control_t hmi_obtener_parametros_control(void)
Obtiene todos los parametros de control actualmente cargados en la HMI.
Definition hmi.c:385
void hmi_process(void)
Procesa la navegacion de la interfaz y actualiza el LCD si es necesario.
Definition hmi.c:262
void hmi_cargar_parametros_control(const parametros_control_t *parametros)
Carga en la HMI los parametros de control vigentes.
Definition hmi.c:353
void hmi_cargar_estado_proceso(const hmi_estado_proceso_t *estado)
Carga en la HMI el estado visible actual del proceso.
Definition hmi.c:363
Interfaz publica de la HMI.
void driver_lcd_init(void)
Inicializa el LCD y ejecuta la secuencia de arranque.
Definition lcd_driver.c:94
Interfaz del driver para LCD alfanumerico.
void led_turn_off(uint8_t numero_led)
Apaga un LED.
Definition led_driver.c:58
void led_init(void)
Inicializa los pines asociados a los LEDs.
Definition led_driver.c:14
void led_turn_on(uint8_t numero_led)
Enciende un LED.
Definition led_driver.c:32
Interfaz del driver de LEDs discretos.
#define LED1
LED discreto 1.
Definition led_driver.h:18
bool parametros_guardar(void)
Definition parametros.c:126
bool parametros_actualizar(const parametros_control_t *nuevos_parametros)
Definition parametros.c:141
bool parametros_init(void)
Definition parametros.c:101
const parametros_control_t * parametros_obtener(void)
Definition parametros.c:121
Persistencia y administracion de parametros de la aplicacion.
Estado del driver DS18B20 para un sensor individual.
bool salida_activa
Definition hmi.h:16
bool temperatura_valida
Definition hmi.h:14
int16_t temperatura_deci_celsius
Definition hmi.h:15
bool sensor_disponible
Definition hmi.h:17
Configuracion fisica del pin usado por el bus 1-Wire.
uint32_t board_timer_get_ticks(void)
Devuelve la cantidad de ticks acumulados por el RIT.
void board_timer_init(uint32_t timer_value_ms)
Inicializa y arranca el temporizador RIT con un periodo dado.
Interfaz del driver del temporizador RIT.