Есть в наличии Atmega16, DHT11; Proteus и CodevisionAVR. Я только начинаю разбираться со всем с этим, так что не судите строго. Датчик подключен к ножке PD7.
Написал функцию для работы с dht22 т.к. для CodevisionAVR не нашёл библиотеки. Но при моделировании схемы, выдается "0" температуры и влажности. Я так понимаю у меня ошибка в цикле считывая данных с датчика, прошу помочь отладить данный код, своих знаний на текущий момент не хватает это сделать.
Спойлер
Код: Выделить всё
int D_1=123, D_2=456, D_3=789, D_4=012, D_5= 045;
unsigned int DHT_Read_Data(unsigned int *humidity, unsigned int *temp){
int data[50];
int counter = 0, sum = 0, i = 0;
// Очистить массив контролльных сумм
data[0] = data[1] = data[2] = data[3] = data[4] = 0;
DDRD.7 = 1; // делаем вывод мк выходом
// Подготока шины для передачи
PORTD.7 = 1;
delay_ms(250);
// Инициализаруем передачу
PORTD.7 = 0; // прижимаем к земле не менее чем на 18 мс
delay_ms(20);
DDRD.7 = 0; // делаем выход мк входом
delay_us(40);
if (PIND.7 == 1) return 1; // если на входе всё ещё "1" то датчик так и не ответил
delay_us(80);
if (PIND.7 == 0) return 2; // если на линии по прежнему 0, то датчик умер
// Если датчик жив и всё хорошо, идём дальше...
while( PIND.7 == 0)
{
delay_us(80); // ждём появления нуля на шине первый раз
while (counter <= 40) // принимаем 40 бит данных
{
while( PIND.7 == 0)
{
// запускаем по битовый приём
if( PIND.7 == 1)
{
data[counter] = 0;
}
delay_us(40); // если 1 держится более 68 мкс, то передаётся 1
if (PIND.7 == 1)
{
data[counter] = 1;
}
delay_us(20); // ждём появления нуля на шине
counter++; // увеличиваем счётчик на один
}
}
}
// пока сделал костыль для наглядности
D_1 = data[0];
D_1 = D_1 <<1;
D_1 = D_1 | data[1];
D_1 = D_1 <<1;
D_1 = D_1 | data[2];
D_1 = D_1 <<1;
D_1 = D_1 | data[3];
D_1 = D_1 <<1;
D_1 = D_1 | data[4];
D_1 = D_1 <<1;
D_1 = D_1 | data[5];
D_1 = D_1 <<1;
D_1 = D_1 | data[6];
D_1 = D_1 <<1;
D_1 = D_1 | data[7];
D_3 = data[16];
D_3 = D_3 <<1;
D_3 = D_3 | data[17];
D_3 = D_3 <<1;
D_3 = D_3 | data[18];
D_3 = D_3 <<1;
D_3 = D_3 | data[19];
D_3 = D_3 <<1;
D_3 = D_3 | data[20];
D_3 = D_3 <<1;
D_3 = D_3 | data[21];
D_3 = D_3 <<1;
D_3 = D_3 | data[22];
D_3 = D_3 <<1;
D_3 = D_3 | data[23];
// проверяем сходимость CRC сумм
// sum = D_1 + D_2 + D_3 + D_4;
// if ((sum != D_5) || (sum == 0x11) || (sum == 0xff)) return 3; // контрольная сумма не сошлась
temp = D_3;
humidity = D_1;
return 0; // всё работает успешно
}


