tdse-tf_3-02

Controlador PID para derretidor de miel con control local via botones y remoto via WiFi
Index Commits Files Refs Submodules README
commit 16137903b3ca391610bc1a5f938708de4b9ac7da
parent 30e05b0865d1d424d999ef1d45935cc3c67fa822
Author: Martin Kloeckner <mjkloeckner@gmail.com>
Date:   Tue, 24 Mar 2026 13:20:39 -0300

Actualizar statechart de DS18B20

Diffstat:
Mfirmware/app/inc/ds18b20.h | 80+++++++++++++++++++++++++++++++++++++++++++++++--------------------------------
Mfirmware/app/src/ds18b20.c | 50+++++++++++++++++++++-----------------------------
2 files changed, 69 insertions(+), 61 deletions(-)
diff --git a/firmware/app/inc/ds18b20.h b/firmware/app/inc/ds18b20.h
@@ -1,5 +1,4 @@
 /*
- * Copyright (c) 2023 Juan Manuel Cruz <jcruz@fi.uba.ar> <jcruz@frba.utn.edu.ar>.
  * Copyright (c) 2026 Martin Javier Klöckner <mklockner@fi.uba.ar>
  *
  * See file `LICENSE` for full details
@@ -8,43 +7,60 @@
 #ifndef _DS18B20_H_
 #define _DS18B20_H_
 
-#include <stdbool.h>
-#include <stdint.h>
-
 #ifdef __cplusplus
 extern "C" {
 #endif
 
 /* DS18B20 Non Blocking State Machine - Transition Table
  *
- * +------------------------------+-------+------------------------+------------------------------+---------------------------+
- * | Current state                | Event | [Guard]                | Next state                   | Actions                   |
- * +==============================+=======+========================+==============================+===========================+
- * |                              |       | [tick == 0]            | ST_DS18B20_BUSY_WAITING_CONV | Send start conversion cmd |
- * + ST_DS18B20_READY             +-------+------------------------+------------------------------+---------------------------+
- * |                              |       |                        | ST_DS18B20_READY             | tick--                    |
- * +------------------------------+-------+------------------------+------------------------------+---------------------------+
- * |                              |       | [tick == 0]            | ST_DS18B20_BUSY_WAITING_DMA  | Transmit/Receive DMA      |
- * |                              |       |                        |                              | tick = DMA_TIMEOUT_MAX    |
- * |                              |       |                        |                              | Data_LSB = 1              |
- * | ST_DS18B20_BUSY_WAITING_CONV +-------+------------------------+------------------------------+---------------------------+
- * |                              |       |                        | ST_DS18B20_BUSY_WAITING_CONV | tick--                    |
- * |                              |       |                        |                              |                           |
- * +------------------------------+-------+------------------------+------------------------------+---------------------------+
- * |                              |       | [tick == 0]            | ST_DS18B20_READY             | tick = TEMP_PERIOD        |
- * |                              |       |                        |                              |                           |
- * | ST_DS18B20_BUSY_WAITING_DMA  +-------+------------------------+------------------------------+---------------------------+
- * |                              |       | [tick != 0 &&          | ST_DS18B20_BUSY_WAITING_DMA  | tick--                    |
- * |                              |       |  Received_data == 0]   |                              |                           |
- * +                              +-------+------------------------+------------------------------+---------------------------+
- * |                              |       | [tick != 0 &&          | ST_DS18B20_BUSY_WAITING_DMA  | tick = DMA_TIMEOUT_MAX    |
- * |                              |       |  Received_data == 1 && |                              | Data_LSB = 0              |
- * |                              |       |   Data_LSB == 1]       |                              | Save received LSB data    |
- * |                              +-------+------------------------+------------------------------+---------------------------+
- * |                              |       | [tick != 0 &&          | ST_DS18B20_READY             | tick = TEMP_PERIOD        |
- * |                              |       |  Received_data == 0 && |                              | Save received MSB data    |
- * |                              |       |   Data_LSB == 0]       |                              |                           |
- * +------------------------------+-------+------------------------+------------------------------+---------------------------+
+ * +---------------------------------+-------------------------------------+---------------------------------+-----------------------------------+
+ * | Current state                   | [Guard]                             | Next state                      | Actions                           |
+ * +=================================+=====================================+=================================+===================================+
+ * | ST_READY                        | [g_DS18B20_tick == 0]               | ST_BUSY_SENDING_RESET           | Reset_DMA()                       |
+ * |                                 |                                     |                                 | prev_state = ST_READY             |
+ * +---------------------------------+-------------------------------------+---------------------------------+-----------------------------------+
+ * | ST_BUSY_SENDING_RESET           | [DMA_TX_done == true]               | ST_BUSY_SENDING_SKIP_ROM        | Write_DMA(SKIP_ROM_CMD)           |
+ * +---------------------------------+-------------------------------------+---------------------------------+-----------------------------------+
+ * |                                 | [(DMA_TX_done == true)              | ST_BUSY_SENDING_CONV_T          | Write_DMA(CONV_T_CMD)             |
+ * |                                 |   && (prev_state == ST_READY)]      |                                 |                                   |
+ * | ST_BUSY_SENDING_SKIP_ROM        +-------------------------------------+---------------------------------+-----------------------------------+
+ * |                                 | [(DMA_TX_done == true)              |                                 |                                   |
+ * |                                 |   && (prev_state ==                 | ST_BUSY_SENDING_READ_SCRATCHPAD | Write_DMA(READ_SCRATCHPAD_CMD)    |
+ * |                                 |         ST_BUSY_WAITING_CONV)]      |                                 |                                   |
+ * +---------------------------------+-------------------------------------+---------------------------------+-----------------------------------+
+ * | ST_BUSY_SENDING_CONV_T          | [DMA_TX_done == true]               | ST_BUSY_WAITING_CONV            | tick = G_DS18B20_CONV_TIME_MS     |
+ * +---------------------------------+-------------------------------------+---------------------------------+-----------------------------------+
+ * |                                 | [tick == 0]                         | ST_BUSY_SENDING_RESET           | Reset_DMA()                       |
+ * |                                 |                                     |                                 | prev_state = ST_BUSY_WAITING_CONV |
+ * | ST_BUSY_WAITING_CONV            +-------------------------------------+---------------------------------+-----------------------------------+
+ * |                                 |                                     |                                 | tick--                            |
+ * |                                 |                                     |                                 |                                   |
+ * +---------------------------------+-------------------------------------+---------------------------------+-----------------------------------+
+ * |                                 | [DMA_TX_done == true]               | ST_BUSY_WAITING_LSB             | DS18B20_Read_DMA()                |
+ * | ST_BUSY_SENDING_READ_SCRATCHPAD |                                     |                                 | DS18B20_Write_DMA(0xFF)           |
+ * |                                 |                                     |                                 |                                   |
+ * +---------------------------------+-------------------------------------+---------------------------------+-----------------------------------+
+ * |                                 | [DMA_RX_done == true]               | ST_BUSY_WAITING_MSB             | Temp_LSB = Get_RX_byte()          |
+ * |                                 |                                     |                                 | DS18B20_Read_DMA()                |
+ * |                                 |                                     |                                 | DS18B20_Write_DMA(0xFF)           |
+ * | ST_BUSY_WAITING_LSB             +-------------------------------------+---------------------------------+-----------------------------------+
+ * |                                 | [tick == 0]                         | ST_BUSY_WAITING_DMA             | prev_state = ST_BUSY_WAITING_LSB  |
+ * |                                 |                                     |                                 | HAL_UART_AbortReceive(&huart1)    |
+ * |                                 +-------------------------------------+---------------------------------+-----------------------------------+
+ * |                                 |                                     | ST_BUSY_WAITING_LSB             | tick--                            |
+ * +---------------------------------+-------------------------------------+---------------------------------+-----------------------------------+
+ * |                                 | [DMA_RX_done == true]               | ST_READY                        | Temp_MSB = Get_RX_byte()          |
+ * |                                 |                                     |                                 | Temp = (Temp_MSB<<8) | Temp_LSB   |
+ * |                                 |                                     |                                 | tick = G_TEMP_PERIOD_MS           |
+ * | ST_BUSY_WAITING_MSB             +-------------------------------------+---------------------------------+-----------------------------------+
+ * |                                 | [tick == 0]                         | ST_BUSY_WAITING_DMA             | prev_state = ST_BUSY_WAITING_MSB  |
+ * |                                 |                                     |                                 | HAL_UART_AbortReceive(&huart1)    |
+ * |                                 +-------------------------------------+---------------------------------+-----------------------------------+
+ * |                                 |                                     | ST_BUSY_WAITING_MSB             | tick--                            |
+ * +---------------------------------+-------------------------------------+---------------------------------+-----------------------------------+
+ * | ST_BUSY_WAITING_DMA             | [(huart.State == HAL_DMA_READY) &&  | ST_DS18B20_READY                | tick = G_TEMP_PERIOD_MS           |
+ * |                                 |  (huart.RxState == HAL_DMA_READY)]  |                                 |                                   |
+ * +---------------------------------+-------------------------------------+---------------------------------+-----------------------------------+
  *
  *
  */
diff --git a/firmware/app/src/ds18b20.c b/firmware/app/src/ds18b20.c
@@ -44,6 +44,7 @@ void DS18B20_Write_DMA(uint8_t data);
 void DS18B20_SetResolution(uint8_t resolution);
 void DS18B20_Read_temp(void);
 void DS18B20_Reset_DMA(void);
+uint8_t DS18B20_Get_RX_byte(void);
 
 uint8_t DS18B20_Reset(void)
 {
@@ -69,9 +70,6 @@ uint8_t DS18B20_Reset(void)
 
 void DS18B20_Reset_DMA(void)
 {
-    g_DS18B20_prev_state = g_DS18B20_state;
-    g_DS18B20_state = ST_DS18B20_BUSY_SENDING_RESET;
-
     __HAL_UART_DISABLE(&huart1);
     LL_USART_SetBaudRate(USART1, HAL_RCC_GetPCLK2Freq(), 9600);
     __HAL_UART_ENABLE(&huart1);
@@ -166,6 +164,20 @@ void DS18B20_Read_DMA(void)
     HAL_UARTEx_ReceiveToIdle_DMA(&huart1, g_DS18B20_RX_buffer, 8);
 }
 
+uint8_t DS18B20_Get_RX_byte(void)
+{
+    // Process received byte
+    uint8_t received_value = 0;
+    for (uint8_t i = 0; i < 8; ++i)
+    {
+        if (g_DS18B20_RX_buffer[i] == 0xFF)
+        {
+            received_value |= (1 << i);
+        }
+    }
+    return received_value;
+}
+
 void DS18B20_Update(void)
 {
     switch (g_DS18B20_state)
@@ -174,6 +186,8 @@ void DS18B20_Update(void)
             if (0 == g_DS18B20_tick)
             {
                 l_DS18B20_DMA_error_count = 0;
+                g_DS18B20_prev_state = g_DS18B20_state;
+                g_DS18B20_state = ST_DS18B20_BUSY_SENDING_RESET;
                 DS18B20_Reset_DMA();
             }
             else
@@ -224,6 +238,8 @@ void DS18B20_Update(void)
             if (0 == g_DS18B20_tick)
             {
                 // Start reading sensor data
+                g_DS18B20_prev_state = g_DS18B20_state;
+                g_DS18B20_state = ST_DS18B20_BUSY_SENDING_RESET;
                 DS18B20_Reset_DMA();
             }
             else
@@ -240,26 +256,12 @@ void DS18B20_Update(void)
                 DS18B20_Write_DMA(0xFF);
                 g_DS18B20_state = ST_DS18B20_BUSY_WAITING_LSB;
             }
-            else
-            {
-                g_DS18B20_tick--;
-            }
             break;
 
         case ST_DS18B20_BUSY_WAITING_LSB:
             if (true == b_DS18B20_DMA_RX_done)
             {
-                // Process received byte
-                uint8_t received_value = 0;
-                for (uint8_t i = 0; i < 8; ++i)
-                {
-                    if (g_DS18B20_RX_buffer[i] == 0xFF)
-                    {
-                        received_value |= (1 << i);
-                    }
-                }
-                Temp_LSB = received_value;
-
+                Temp_LSB = DS18B20_Get_RX_byte();
                 g_DS18B20_state = ST_DS18B20_BUSY_WAITING_MSB;
                 DS18B20_Read_DMA();
                 DS18B20_Write_DMA(0xFF);
@@ -299,17 +301,7 @@ void DS18B20_Update(void)
         case ST_DS18B20_BUSY_WAITING_MSB:
             if (true == b_DS18B20_DMA_RX_done)
             {
-                // Process received byte
-                uint8_t received_value = 0;
-                for (uint8_t i = 0; i < 8; ++i)
-                {
-                    if (g_DS18B20_RX_buffer[i] == 0xFF)
-                    {
-                        received_value |= (1 << i);
-                    }
-                }
-
-                Temp_MSB = received_value;
+                Temp_MSB = DS18B20_Get_RX_byte();
                 g_DS18B20_temp = ((Temp_MSB << 8) | Temp_LSB) / 16;
                 g_DS18B20_state = ST_DS18B20_READY;
                 g_DS18B20_tick = G_TEMP_PERIOD_MS;