DHT11 трудности использования в CodeVisionAVR

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Аватара пользователя
balmer
Это не хвост, это антенна
Сообщения: 1433
Зарегистрирован: Вс дек 02, 2012 03:13:48
Откуда: Калининград

Re: DHT11 трудности использования в CodeVisionAVR

Сообщение balmer »

Garin писал(а):Прошу, кто разбирается помочь, переложить этот код для CodeVisionAVR.
DHT.C

Код: Выделить всё

/*
    for (i=0; i<MAXTIMINGS; i++) {
        //While state is the same count microseconds
        while (laststate==DHT_Read_Pin) {
            _delay_us(1);
            counter++;
        }



Пробовал использовать подобный код для AVR правда на GCC и для DHT22. Но это неважно.
Дело в том, что код не слишком удачный. Он еще может быть работает на частоте 16 мегагерц и выше. Но при более низких частотах - не очень.

Вкратце:
Пусть частота процессора 1 Mhz у нас.
Тогда каждая asm команда у нас будет выполняться по одной микросекунде.
В строчке while (laststate==DHT_Read_Pin) минимум 3 команды, то есть уже 3 микросекунды.
Поэтому counter будет иметь в конце совсем не количество микросекунд, а количество интервалов по 5-7 микросекунд, что уже путает все карты.

Такой код надо писать для определенной частоты процессора. Желательно на ассемблере, но можно и на С, но тогда он будет работать только на определенном компиляторе с определенными флагами оптимизации.
Ответить

Вернуться в «Периферия»