Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
Darios
0 / 0 / 0
Регистрация: 17.05.2015
Сообщений: 104
1

DS18b20

11.02.2019, 17:00. Просмотров 138. Ответов 4
Метки нет (Все метки)

Проблема заключается в том, что в переменную, в которую записывается окончательный результат попадает не совсем понятное число. Подскажите пожалуйста, на каком участке у меня ошибка, буду благодарен.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
#include "main.h"
 
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "dwt_stm32_delay.h"
/* USER CODE END Includes */
 
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
 
/* USER CODE END PTD */
 
/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
 
/* USER CODE END PD */
 
/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
 
/* USER CODE END PM */
 
/* Private variables ---------------------------------------------------------*/
TIM_HandleTypeDef htim1;
 
UART_HandleTypeDef huart3;
 
PCD_HandleTypeDef hpcd_USB_OTG_FS;
 
/* USER CODE BEGIN PV */
uint8_t check =2, temp_l, temp_h;
uint16_t temp;
float temperature;
/* USER CODE END PV */
 
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USB_OTG_FS_PCD_Init(void);
static void MX_USART3_UART_Init(void);
static void MX_TIM1_Init(void);
/* USER CODE BEGIN PFP */
GPIO_InitTypeDef GPIO_InitStruct;
 
void gpio_set_input (void)
{
  GPIO_InitStruct.Pin = GPIO_PIN_9;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
 
 
void gpio_set_output (void)
{
  GPIO_InitStruct.Pin = GPIO_PIN_9;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
uint8_t ds18b20_init (void)
{
    gpio_set_output ();   // set the pin as output
    HAL_GPIO_WritePin (GPIOB, GPIO_PIN_9, 0);  // pull the pin low
    DWT_Delay_us (480);   // delay according to datasheet
 
    gpio_set_input ();    // set the pin as input
    DWT_Delay_us (80);    // delay according to datasheet
 
    if (!(HAL_GPIO_ReadPin (GPIOB, GPIO_PIN_9)))    // if the pin is low i.e the presence pulse is there
    {
        DWT_Delay_us (400);  // wait for 400 us
        return 0;
    }
 
    else
    {
        DWT_Delay_us (400);
        return 1;
    }
}
 
void write (uint8_t data)
{
    gpio_set_output ();   // set as output
 
    for (int i=0; i<8; i++)
    {
 
        if ((data & (1<<i))!=0)  // if the bit is high
        {
            // write 1
 
            gpio_set_output ();  // set as output
            HAL_GPIO_WritePin (GPIOB, GPIO_PIN_9, 0);  // pull the pin LOW
            DWT_Delay_us (1);  // wait for  us
 
            gpio_set_input ();  // set as input
            DWT_Delay_us (60);  // wait for 60 us
        }
 
        else  // if the bit is low
        {
            // write 0
 
            gpio_set_output ();
            HAL_GPIO_WritePin (GPIOB, GPIO_PIN_9, 0);  // pull the pin LOW
            DWT_Delay_us (60);  // wait for 60 us
 
            gpio_set_input ();
        }
    }
}
 
 
uint8_t read (void)
{
    uint8_t value=0;
    gpio_set_input ();
 
    for (int i=0;i<8;i++)
    {
        gpio_set_output ();   // set as output
 
        HAL_GPIO_WritePin (GPIOB, GPIO_PIN_9, 0);  // pull the data pin LOW
        DWT_Delay_us (2);  // wait for 2 us
 
        gpio_set_input ();  // set as input
        if (HAL_GPIO_ReadPin (GPIOB, GPIO_PIN_9))  // if the pin is HIGH
        {
            value |= 1<<i;  // read = 1
        }
        DWT_Delay_us (60);  // wait for 60 us
    }
    return value;
}
/* USER CODE END PFP */
 
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
 
/* USER CODE END 0 */
 
/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */
 
  /* USER CODE END 1 */
 
  /* MCU Configuration--------------------------------------------------------*/
 
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();
 
  /* USER CODE BEGIN Init */
 
  /* USER CODE END Init */
 
  /* Configure the system clock */
  SystemClock_Config();
 
  /* USER CODE BEGIN SysInit */
 
  /* USER CODE END SysInit */
 
  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USB_OTG_FS_PCD_Init();
  MX_USART3_UART_Init();
  MX_TIM1_Init();
  /* USER CODE BEGIN 2 */
  HAL_TIM_Base_Start(&htim1);
  DWT_Delay_Init();
  /* USER CODE END 2 */
 
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
      check = ds18b20_init ();
            write (0xCC);  // skip ROM
            write (0x44);  // convert t
 
            HAL_Delay (800);
 
            ds18b20_init ();
            write (0xCC);  // skip ROM
            write (0xBE);  // Read Scratchpad
 
            temp_l = read();
            temp_h = read();
            temp = (temp_h<<8)|temp_l;
            temperature = (float)temp/16;
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.02.2019, 17:00
Ответы с готовыми решениями:

DS18b20 + STM32F100 = ?
Доброго всем времени суток. Пытаюсь запустить датчик DS18b20 на МК ST32F100. Взял библиотеки,...

STM32F103+DS18b20
Добрый день!!! Плиз подскажите где у меня ошибка!!!! Написал библиотеку для работы с ds18b20 однако...

STM32 и DS18B20 по uart
Пытаюсь завести данный датчик у себя, но пока не выходит( датчик запаял по...

DS18B20 проблема с температурой
Ребят, кто может сказать, почему датчик не меряет температуру более 58-59 градусов? с 59 просто...

[РЕШЕНО]Работа с DS18B20
Добрый день, форумчане. Попробовал сделать работу с DS18B20 через один из таймеров. Сначала делаю...

4
tvsdig
7 / 8 / 1
Регистрация: 22.09.2017
Сообщений: 25
11.02.2019, 20:23 2
На мой взгляд, в функции чтения байта некорректны тайминги.
Строка 127 - всего 2 мкс и сразу чтение, а датчик возможно еще не готов отвечать

И после 111 строки нужно добавить задержку 1 мкс.
0
_SayHello
618 / 365 / 114
Регистрация: 30.07.2015
Сообщений: 1,283
11.02.2019, 20:25 3
Darios, непонятное это какое? в какой переменной temp temp или tempertature? Подтяжка на линии есть?
0
Rius
Эксперт .NET
5290 / 3482 / 842
Регистрация: 25.05.2015
Сообщений: 10,623
Записей в блоге: 11
Завершенные тесты: 4
11.02.2019, 20:43 4
Darios, обмен с этим чипом делают не ногодрыгом, а uart'ом, т.к. тайминги в нём выдерживаются автоматически, а DMA освобождает процессор.
Работа с Serial port и шиной 1-Wire. Датчик температуры DS18B20. Кто сталкивался?
0
Darios
0 / 0 / 0
Регистрация: 17.05.2015
Сообщений: 104
11.02.2019, 21:51  [ТС] 5
В переменной temperature, подтяжка есть, а именно два последовательно соединенных резистора 3.9 кОм и 680 Ом.
0
11.02.2019, 21:51
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.02.2019, 21:51

ds18b20 и STM8L – Discovery.
Задумал я подключить датчик ds18b20 STM8L – Dyscovery. Код думаю писать в ИАРе. Погуглил на этот...

Проблемы с UART stm32f100rb + ds18b20
Возникла проблема с подключением датчика температуры ds18b20 к stm32 f100rb на момента приема...

проблема с подключением DS18b20 к stm32vldiscovery
Доброго времени суток! Возникла проблема с подключением DS18b20 к stm32vldiscovery подключаю...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru