commit 16137903b3ca391610bc1a5f938708de4b9ac7da
parent 30e05b0865d1d424d999ef1d45935cc3c67fa822
Author: Martin Kloeckner <mjkloeckner@gmail.com>
Date: Tue, 24 Mar 2026 13:20:39 -0300
Actualizar statechart de DS18B20
Diffstat:
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;