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