Ошибка работы DHT22 и stm32f3

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
swfvova
Родился
Сообщения: 11
Зарегистрирован: Ср апр 22, 2015 22:37:56

Ошибка работы DHT22 и stm32f3

Сообщение 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);
	}
}
Последний раз редактировалось swfvova Вт май 05, 2015 22:49:16, всего редактировалось 2 раза.
Реклама
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Ошибка работи dth22 и stm32f3

Сообщение oleg110592 »

dth22 это DHT22?
Похоже опять проблемы с регистром MODER
MODER:
00 - по умолчанию вход
01 (GPIO_MODER_MODER10_0) - выход
10 (GPIO_MODER_MODER10_1) - альтернативная функция
11 (GPIO_MODER_MODER10) - аналоговый режим
Реклама
swfvova
Родился
Сообщения: 11
Зарегистрирован: Ср апр 22, 2015 22:37:56

Re: Ошибка работи dth22 и stm32f3

Сообщение swfvova »

oleg110592 писал(а):dth22 это DHT22?
Похоже опять проблемы с регистром MODER
MODER:
00 - по умолчанию вход
01 (GPIO_MODER_MODER10_0) - выход
10 (GPIO_MODER_MODER10_1) - альтернативная функция
11 (GPIO_MODER_MODER10) - аналоговый режим
Да, извините за ошибку - это DHT22, я просто пробовал делать кнопку не через прерывание, а через считывание состояние через цикл, так с 01 - оно работало, можете, пожалуйста, объяснить как написать в коде 00.
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Ошибка работы DHT22 и stm32f3

Сообщение 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
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
balmer
Это не хвост, это антенна
Сообщения: 1433
Зарегистрирован: Вс дек 02, 2012 03:13:48
Откуда: Калининград

Re: Ошибка работы DHT22 и stm32f3

Сообщение balmer »

Или отсюда код скопипастить :))) .
Реклама
swfvova
Родился
Сообщения: 11
Зарегистрирован: Ср апр 22, 2015 22:37:56

Re: Ошибка работы DHT22 и stm32f3

Сообщение swfvova »

Если я правильно понял то: МК настроен на запись -> Делаем ноль -> Пауза 20мс -> Делаем высокий ур. -> Пауза 80мс -> Переключаем на чтение -> Читаем биты данных (температура и влажность + проверка), правильно я понял?
Еще вопрос, а как делается по "best practice" пауза (мне кажется точно не через цикл)?
Реклама
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Ошибка работы DHT22 и stm32f3

Сообщение 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
LexxUR
Родился
Сообщения: 4
Зарегистрирован: Пн июн 01, 2015 13:54:02

Re: Ошибка работы DHT22 и stm32f3

Сообщение 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 см и не на голом контроллере, а на отладочной плате.
Ответить

Вернуться в «ARM»