Страница 1 из 1
Ошибка работы DHT22 и stm32f3
Добавлено: Вт май 05, 2015 21:14:52
swfvova
Привет) Можете, пожалуйста, посмотреть посмотреть на код для роботы плати f3 и датчика температуры/влажности, по чему-то постоянно ноль читает, пытался читать даташин, но он какой-то не понятный. Заранее спасибо)
Спойлер
Код: Выделить всё
#include "main.h"
#define PIN_CONNECTION_DTH22 (1 << 10)
void init_read_dht22() {
RCC->AHBENR |= RCC_AHBENR_GPIOAEN;
GPIOA->MODER |= GPIO_MODER_MODER10_1;
GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR10_1;
GPIOA->PUPDR |= GPIO_PUPDR_PUPDR10_1;
}
void init_write_dht22() {
RCC->AHBENR |= RCC_AHBENR_GPIOAEN;
GPIOA->MODER |= GPIO_MODER_MODER10_0;
GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR10_1;
}
int main() {
uint16_t time;
RCC->AHBENR |= RCC_AHBENR_GPIOEEN;
GPIOE->MODER |= GPIO_MODER_MODER13_0 | GPIO_MODER_MODER14_0 | GPIO_MODER_MODER9_0;
while(1) {
init_write_dht22();
GPIOA->ODR &= ~PIN_CONNECTION_DTH22;
Delay_ms(18);
init_read_dht22();
GPIOA->ODR |= PIN_CONNECTION_DTH22;
Delay_ms(50);
time = 1000;
while(time--) {
if ((GPIOA->IDR & PIN_CONNECTION_DTH22) == 1) {
GPIOE->ODR |= 1 << 13;
}
else {
GPIOE->ODR |= 1 << 14;
}
}
Delay_ms(10000);
Delay_ms(10000);
}
}
Re: Ошибка работи dth22 и stm32f3
Добавлено: Вт май 05, 2015 21:49:10
oleg110592
dth22 это DHT22?
Похоже опять проблемы с регистром MODER
MODER:
00 - по умолчанию вход
01 (GPIO_MODER_MODER10_0) - выход
10 (GPIO_MODER_MODER10_1) - альтернативная функция
11 (GPIO_MODER_MODER10) - аналоговый режим
Re: Ошибка работи dth22 и stm32f3
Добавлено: Вт май 05, 2015 22:48:32
swfvova
oleg110592 писал(а):dth22 это DHT22?
Похоже опять проблемы с регистром MODER
MODER:
00 - по умолчанию вход
01 (GPIO_MODER_MODER10_0) - выход
10 (GPIO_MODER_MODER10_1) - альтернативная функция
11 (GPIO_MODER_MODER10) - аналоговый режим
Да, извините за ошибку - это DHT22, я просто пробовал делать кнопку не через прерывание, а через считывание состояние через цикл, так с 01 - оно работало, можете, пожалуйста, объяснить как написать в коде 00.
Re: Ошибка работы DHT22 и stm32f3
Добавлено: Ср май 06, 2015 06:29:35
oleg110592
Код: Выделить всё
void init_read_dht22() {
GPIOA->MODER &= ~(GPIO_MODER_MODER10_0); // вход
}
void init_write_dht22() {
GPIOA->MODER |= GPIO_MODER_MODER10_0; //выход
}
int main() {
uint16_t time;
RCC->AHBENR |= RCC_AHBENR_GPIOEEN;
GPIOE->MODER |= GPIO_MODER_MODER13_0 | GPIO_MODER_MODER14_0 | GPIO_MODER_MODER9_0;
RCC->AHBENR |= RCC_AHBENR_GPIOAEN; //достаточно один раз включить тактирование порта!
.......
для DHT22 нужна внешняя подтяжка - резистор 10K, внутренней мало. Вывод порта лучше настроить как
Output open-drain. Диаграммы работы датчика можно посмотреть в документации или, например, здесь:
http://www.kondratev-v.ru/spravochnik/d ... th-22.html
Re: Ошибка работы DHT22 и stm32f3
Добавлено: Ср май 06, 2015 10:11:57
balmer
Или
отсюда код скопипастить

.
Re: Ошибка работы DHT22 и stm32f3
Добавлено: Пн май 11, 2015 13:41:27
swfvova
Если я правильно понял то: МК настроен на запись -> Делаем ноль -> Пауза 20мс -> Делаем высокий ур. -> Пауза 80мс -> Переключаем на чтение -> Читаем биты данных (температура и влажность + проверка), правильно я понял?
Еще вопрос, а как делается по "best practice" пауза (мне кажется точно не через цикл)?
Re: Ошибка работы DHT22 и stm32f3
Добавлено: Пн май 11, 2015 16:29:48
oleg110592
Код: Выделить всё
DHT_0; //шину в 0
delay_ms(18);
DHT_1; //отпускаем шину, только подтяжка 10К
delay_us(50); // ждем ответа о присутствии
if(DHTIN){} //датчик не ответил или его нет - выходим из подпрограммы опроса датчика
//продолжаем
while(DHTIN == 0); //тут можно зависнуть
while(DHTIN); //тут можно зависнуть
//читаем данные
...
Реализация пауз
http://about-stm32.narod.ru/delay.html
Re: Ошибка работы DHT22 и stm32f3
Добавлено: Пн июн 01, 2015 20:58:59
LexxUR
oleg110592 писал(а):Код: Выделить всё
void init_read_dht22() {
GPIOA->MODER &= ~(GPIO_MODER_MODER10_0); // вход
}
void init_write_dht22() {
GPIOA->MODER |= GPIO_MODER_MODER10_0; //выход
}
int main() {
uint16_t time;
RCC->AHBENR |= RCC_AHBENR_GPIOEEN;
GPIOE->MODER |= GPIO_MODER_MODER13_0 | GPIO_MODER_MODER14_0 | GPIO_MODER_MODER9_0;
RCC->AHBENR |= RCC_AHBENR_GPIOAEN; //достаточно один раз включить тактирование порта!
.......
для DHT22 нужна внешняя подтяжка - резистор 10K, внутренней мало. Вывод порта лучше настроить как
Output open-drain. Диаграммы работы датчика можно посмотреть в документации или, например, здесь:
http://www.kondratev-v.ru/spravochnik/d ... th-22.html
Тут спорный вопрос относительно подтяжки, я читал несколько вариантов даташитов (так и не понял какой из них правильный в этом отношении), в одних пишут что нужна обязательно подтяжка и кондер на питание, в других вариантах, что и то и другое желательно только на длинных линиях. У меня работает без подтяжки, правда линия короткая 20 см и не на голом контроллере, а на отладочной плате.