En el desarrollo de software amateur, el microcontrolador se enciende, configura sus pines y entra directamente al Súper Bucle (while(1)) para empezar a trabajar. En la industria, esto es una negligencia grave. ¿Qué pasa si durante la noche un roedor mordió el cable del transductor de presión? Si la máquina arranca y opera a ciegas, el resultado será catastrófico.
El POST (Power-On Self Test) es una rutina diagnóstica que se ejecuta una sola vez al encender el equipo, justo después de inicializar los relojes de hardware y antes de permitir cualquier operación funcional. Su objetivo es interrogar a todos los sensores, actuadores y módulos de memoria para verificar que responden con valores lógicos dentro de un rango de tolerancia.
Ejercicio 1: Diseña una función Ejecutar_POST() que evalúe tres condiciones críticas del sistema. Si alguna falla, el microcontrolador debe bloquearse en un estado seguro e informar el código de error en lugar de arrancar.
#include <stdint.h>
#include <stdbool.h>
#include <stdio.h>
// --- MOCKS DE LECTURA DE HARDWARE ---
extern uint32_t adc_leer_presion(void);
extern bool gpio_leer_paro_emergencia(void);
extern bool memoria_flash_validar_crc(void);
// Códigos de Error POST
typedef enum {
POST_OK = 0,
ERR_FLASH_CORRUPTA = 1,
ERR_SENSOR_PRESION_DESCONECTADO = 2,
ERR_PARO_EMERGENCIA_ACTIVO = 3
} POST_Result_t;
// --- RUTINA POST ---
POST_Result_t Ejecutar_POST(void) {
printf("\n[POST] Iniciando Diagnostico de Encendido...\n");
// 1. Revisar Integridad de Datos (Variables de cobro/volumen)
if (!memoria_flash_validar_crc()) {
return ERR_FLASH_CORRUPTA;
}
printf("[POST] - Memoria Flash OK\n");
// 2. Revisar Sensor Analógico (Linea base)
// Suponiendo ADC 12 bits (0-4095). Si el sensor envía 0.5V a 0 PSI,
// la lectura del ADC no debería ser menor a 500. Si es 0, el cable se rompió.
uint32_t adc_presion = adc_leer_presion();
if (adc_presion < 50 || adc_presion > 4000) {
return ERR_SENSOR_PRESION_DESCONECTADO;
}
printf("[POST] - Sensor de Presion OK\n");
// 3. Revisar Seguridad Perimetral
// El Paro de Emergencia NO debe estar presionado al bootear el equipo.
if (gpio_leer_paro_emergencia() == true) {
return ERR_PARO_EMERGENCIA_ACTIVO;
}
printf("[POST] - Botones de Seguridad OK\n");
return POST_OK;
}
// --- PUNTO DE ENTRADA AL FIRMWARE ---
int main(void) {
// Configuración a muy bajo nivel (Relojes, Puertos)
// SystemClock_Config();
// MX_GPIO_Init();
// Ejecutar Power-On Self Test antes de cualquier otra cosa
POST_Result_t resultado_arranque = Ejecutar_POST();
if (resultado_arranque != POST_OK) {
// FALLO CRÍTICO: Bloquear el equipo (Modo Falla)
printf("\n!!! ERROR CRITICO DE ARRANQUE. CODIGO: %d !!!\n", resultado_arranque);
// hardware_encender_led_rojo();
// lcd_mostrar_error_bloqueo(resultado_arranque);
while(1) {
// Halt System: El equipo requiere servicio técnico.
// No entraremos al Súper Bucle de operación ni lanzaremos FreeRTOS.
}
}
// Si llega aquí, la máquina es 100% segura para operar
printf("\n[POST] DIAGNOSTICO EXITOSO. Habilitando Despachador...\n");
while(1) {
// Súper Bucle de control
}
return 0;
}
Objetivo del día: Certificación Operativa Inicial.
Una máquina industrial despachadora de hidrocarburos jamás debe "asumir" que su entorno está en buenas condiciones al recibir energía. Las normativas de seguridad dictan que el sistema debe autoevaluarse. En tu placa diseñada en KiCad, antes de que el microcontrolador energice el bus que controla las electroválvulas principales, debe interrogar minuciosamente a su entorno.
El código que escribiste hoy es la barrera entre un prototipo ciego y un equipo inteligente. Al medir la "línea base" del transductor de presión antes de arrancar, garantizas que si un roedor o el operario cortó accidentalmente el cable del sensor, tu procesador STM32 (o ESP32) se dará cuenta instantáneamente al iniciar. En lugar de bombear gas a ciegas, bloqueará la pantalla con un mensaje de error y retendrá los relés apagados. Esto protege vidas, evita fugas y certifica el grado profesional de tu desarrollo.
1. Si detectas un error en el POST y bloqueas el sistema en un while(1), ¿qué evita que el Hardware Watchdog Timer (IWDG) reinicie la placa una y otra vez?
Respuesta: Este es un dilema clásico. En un estado de error de POST intencionado, debes colocar la instrucción de "alimentar" al perro guardián dentro de ese while(1) específico, o deshabilitar el watchdog al inicio si la arquitectura lo permite. De lo contrario, la máquina entrará en un ciclo infinito de reinicios rápidos (Bootloop), impidiendo que el técnico lea el código de error en la pantalla.
2. ¿Por qué es mala idea calibrar el ADC (ej. autotarar el sensor de presión a 0) automáticamente durante el POST?
Respuesta: Porque si el microcontrolador sufre un reinicio rápido durante un despacho (ej. una fluctuación eléctrica con la manguera aún presurizada), el POST leerá una presión alta, asumirá erróneamente que esa es la nueva "presión cero" y continuará operando. El POST solo verifica conectividad física; la calibración a "Cero" siempre debe ser un proceso manual comandado por el técnico.