DÍA 056 DE 365

Fase 1: Fundamentos de C y Lógica de Software

📖 Teoría a Estudiar

Boot Sequence y el POST (Power-On Self Test)

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.

HARDWARE RESET 1. Init Relojes y GPIO 2. EJECUCIÓN DEL POST - Chequeo de Flash CRC - Paro de Emergencia = OFF? - Sensores en Rango Base? - Ping a Módulo I2C/SPI ¿PASS? NO HALT SYSTEM Pantalla de Error Físico SÍ READY Entrar al Súper Bucle

Estructura de un POST Robusto

  1. Prueba de Integridad de Memoria: Verificar que los datos guardados en Flash o EEPROM (Día 55) tienen un CRC o Checksum válido. Si está corrupto, la máquina no debe despachar.
  2. Línea Base de Sensores (Baselines): Un ADC de presión a 0 PSI no debe leer 0 voltios, ni 3.3 voltios. Un sensor industrial típico (como los de 4-20mA o 0.5-4.5V) debe dar una lectura "en reposo" conocida. Si se lee un extremo absoluto, el cable está en corto o trozado.
  3. Actuadores en Estado Seguro: Confirmar que los relés y válvulas estén físicamente en estado LOW antes de habilitar los botones de usuario.
  4. Interfaces de Comunicación: Hacer un "Ping" a los esclavos I2C (ej. la pantalla LCD) o SPI para asegurar que el bus no está bloqueado.

⚙️ Ejercicios Prácticos

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;
}
        

🚀 Avance del Proyecto Tesis: Despachador de Gas LP

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.

📝 Resumen del Día

❓ Cuestionario de Autoevaluación

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.