Программа считывания данных с датчика DHT22 • Все своими руками






Программа считывания данных с датчика DHT22

Программа считывания данных с датчика DHT22 на Ассемблере

     Здравствуйте, уважаемые посетители. Я думаю, что этот «рассказ» о программе и датчике DHT22, принесет пользу начинающим программистам. В одной из поздних статей я привел основные данные на этот датчик, теперь поговорим о программе считывания данных с него.


Программа для DHT22, programme

     На скриншоте 1 показана часть программы измерителя влажности и температуры. И так. Строка 187, метка Main – начало программы считывания данных и программы вообще. Алгоритм исполнения программы следующий: Сначала делаем паузу в две секунды после инициализации микроконтроллера Строка 187,188. Затем обнуляем регистры общего назначения, участвующие в этой программе, строки 190… 194. Записываем в регистр count_data число принимаемых бит информации, строки 195, 196. Шина данных подтянута к плюсовой шине питания через подтягивающий резистор. Это означает, что на ней всегда будет около +5 вольт или логическая единица при условии, что ни датчик и ни микроконтроллер ее не прижали. И так на шине логическая единица – «1», участок AB на рисунке Рис.1. Для того, что бы принять данные с датчика в соответствии с документацией, контроллер должен подать стартовый отрицательный импульс. Подаем. Контроллер прижимает шину к земле, отрезок ВС, в программе строка 198, ждем двадцать пять миллисекунд – CD, строки 199… 207. Отпускаем шину данных – DE, строка 208. Строка 209 необходима для сброса таймераTMR0, так как программа динамической индикации предполагает использование прерываний и сего таймера. Если в этом месте произойдет прерывание на высвечивание очередного сегмента индикатора, то произойдет сбой по времени программы связи с датчиком. EF – ожидание ответа от датчика.

Считывание данных с датчика DHT22, ris1-byte

     В программе предусмотрена просто пауза 60 микросекунд, большая, чем временной отрезок ожидания ответа датчика по документации – 20 микросекунд. Значит после того, как контроллер отпустил шину, мы через 60us попадаем в точку Х на рис 1. Проверяем состояние шины, строка 213, если датчик ответил, то на шине будет «0» и программа будет исполняться далее, если «1» то программа возвращается в начало – метку Main. И так программа исполняется далее, а далее ждем еще 80us, строки 215,216, и оказываемся в точке Y. Проверяем состояние шины, строка 217. Если на шине «0», то датчик работает не корректно и программа уходит на Main, если на шине, как и надо – «1», то ждем спада импульса, строка 219,220. Отрезок JK, это уже начало информационного бита, а именно старшего бита старшего байта значения влажности.

     Далее начинается непосредственно программа считывания и распределения принятых бит по соответствующим регистрам. И так. После того, как мы знаем начало бита, мы начинаем ждать, когда датчик отпустит шину данных, строки 222,223. Как только это произойдет, отрезок на рисунке 2 – LM, выделенный красным цветом, программа сделает паузу (32us) по времени большую, чем длительность положительной части импульса, соответствующего логическому нулю информации (26us), строки 224,225. Строка 226 – опять сбрасываем внутренний таймер TMR0 для предотвращения сбоя программы. Вот из-за этих сбросов и происходит небольшое мерцание индикаторов. Из рисунка 2 можно видеть, что информационные биты нуля и единицы отличаются как раз длительностью этой положительной части импульса. Поэтому, если после паузы 32us, мы фиксируем на шине «0», то бит информации равен нулю, а если «1», то — единице.

Датчик DHT22, ris2-bite

     Программа распределения принятых бит начинается со строки 227, где сбрасывается флаг заемапереноса «С» регистра STATUS, через который будет происходить перенос информации на шине в регистры. Строка 228 – проверяем состояние шины. Если ноль, то идем на метку shift и последовательно сдвигаем регистры влево, при этом в младший бит младшего байта температуры через бит «С» регистра STATUS в самом начале распределения впишется в данном случае ноль. Если на шине будет «1», то ждем, пока произойдет спад положительной части импульса и тогда ее через «С» переносим, опять-таки же, в младший бит младшего байта температуры. После последовательного сдвига всех необходимых регистров программа уменьшает содержимое регистра счетчика count_data. Далее программа возвращается для приема следующего бита. Так будет происходить до тех пор, пока не обнулится полностью данный счетчик. Так будут приняты и распределены все сорок бит информации. Из рисунка 1 видно, где находятся данные о влажности и температуре. Например, влажности, равной 70,3% в соответствующих регистрах будет лежать двоичное число равное b ’1010111111’. В старшем регистре влажности будет находиться b ’00000010’, а в младшем – b ‘10111111’. Так же распределяются данные и в регистрах температуры. В последнем, правом, регистре находится число, равное сумме чисел, находящихся в регистрах температуры и влажности. Эту сумму можно использовать для проверки правильности приема битовой информации. После приема всех бит программа уходит на преобразование двоичных числовых значений в двоично-десятичные для дальнейшей индикации.

     Как известно путей для решения одной и той же задачи, очень много. Вот и эта версия одна из многих. Но именно она помогла выявить неточность в документации на датчик.

     Когда программа была написана и опробована и доказала свое право на существование, захотелось ввести в ее состав подпрограмму обработки ошибки связи с датчиком. Вот здесь и выявилась неточность. Строка 214 – goto Main, была заменена на goto Error. Error – подпрограмма обработки ошибки. Если ошибка, то на индикатор выводятся тире. Как только строка была заменена – программа тут же оказалась не работоспособной. Сколько было в голове вариантов, описывать не буду. Но в результате появилась идея введения в программу включения технологического светодиода на свободный вывод контроллера. Лет тридцать пять назад мы включали светодиоды последовательно или параллельно сигналу, когда он терялся среди кучи микросхем жесткой логики. Смотрим рисунок 3.

Программа для датчика DHT22, ris3

     Когда начинается исполнение программы, с метки Main мы включаем светодиод, после секунды паузы выключаем его. После того, как основная программа выполнит все инструкции, заводим ее в вечное кольцо goto $. По идее светодиод должен мигнуть один раз, но он мигал два. Отсюда вывод: Стартовых импульсов должно быть два. Как же работала программа. Начиная с метки Main, программа выполняла все инструкции до строки 214 — goto Main. Естественно датчик не отвечал, и программа возвращалась в начало и посылала датчику второй стартовый отрицательный импульс, после чего датчик отвечал, и программа исполнялась далее по всему сценарию.
Работа датчика DHT22, programme-2
Новую программу смотрим на скриншоте 2. В ней для инициализации посылаются два стартовых импульса. И если датчик не ответит, то программа уходит на исполнение подпрограммы ошибки. Все. К.В.Ю. Надеюсь понятно, что не понятно – комментируйте или на форум. Скачать обе программы в asm формате.

[democracy id=2]


Программа считывания данных с датчика DHT22 (822 Загрузки )
Чуть не забыл. Эти же программы применимы и для датчика DHT11.

Просмотров:5 043
4 комментария




Метки: ,

4 комментария к “Программа считывания данных с датчика DHT22”

  • Даниил
    12 мая, 2015, 0:07

    Здравствуйте!

    Очень хорошая статья, но я никак не могу понять, какие биты отвечают за знак и сколько их. Судя по всему это последние биты старших байтов, но какие именно.

    А так же не могли бы вы описать сам процесс преобразования температуры в десятичный вид, ибо не совсем он понятен. Заранее спасибо.

    С уважением, Даниил.

  • admin
    12 мая, 2015, 1:22

    Здравствуй, Даниил. Программа считывания применима только к положительным температурам. Документации на русском языке для этих датчиков я не нашел, только китайский и английский. Поэтому на отрицательной температуре я не заострял внимания, да и цели у меня такой не было. В данном случае здесь есть несколько, на мой взгляд, решений. Или, как ты заметил, информация о знаке может находиться в седьмом бите старшего байта температуры, или может меняться фаза передачи информации. А может и то, и другое, как например, в датчике DS18B20. Здесь надо проверять в железе.

    Программу преобразования двоичных чисел в двоично-десятичные я брал из сети, описание алгоритма ее выполнения лучше тоже поискать в интернете у профессионалов. В свое время я начал было его изучать, а потом подумал, а зачем? Пользуюсь готовыми программами. Я исходил из того, что чтобы смотреть телевизор, не обязательно знать принцип его работы.

  • Сергей
    10 февраля, 2024, 16:19

    Добрый день! Думал я последний из могикан кто пишет на асме, оказывается был не прав. Взял на себя смелость поправить активизацию датчика — так красивше, и не требует два стартовых импульса, это происходило из-за завышенной длительности, может кому пригодится :

    ; Активизируем датчик

    call Delay_1 ;1 sek для 4мгц

    call Delay_1 ;1 sek для 4мгц

    bcf LED

    call clear_lcd

    bank1

    bcf TRISC,0×01 ; выход

    bank0

    bcf Shina_D ; прижимаем шину к земле Точка «А»

    call Delay_18 ; 18.5ms стартовый импульс в даташите 18ms

    bsf Shina_D ; отпускаем шину (точка «B»)

    bank1

    bsf TRISC,0×01 ; вход

    bank0

    ;жжжжжжжжжжжжжжжжжжжжжжжжжжжжж

    Shina_D_pulse_zero_80mks

    clrf TMR0

    wait_pulse_80mks_zero_Shina_D ; ждать 0 в течении 130мкс

    btfsc TMR0,0×07 ; 130mks 0×06=72mks

    goto Main_vlagomer

    btfsc Shina_D ;

    goto wait_pulse_80mks_zero_Shina_D

    Shina_D_pulse_one_80mks

    clrf TMR0

    wait_pulse_80mks_one_Shina_D ; ждать 1 в течении 130мкс

    btfsc TMR0,0×07 ; 130mks 0×06=72mks

    goto Main_vlagomer

    btfss Shina_D ;

    goto wait_pulse_80mks_one_Shina_D

    nop

    Shina_D_pulse_zero_50mks

    clrf TMR0

    wait_pulse_50mks_zero_Shina_D ; ждать 0 в течении 130мкс

    btfsc TMR0,0×07 ; 130mks 0×06=72mks

    goto Main_vlagomer

    btfsc Shina_D ;

    goto wait_pulse_50mks_zero_Shina_D

    ;жжжжжжжжжжжжжжжжжжжжжжжжжжжжж

    ; Считываем сорок бит информации

    Read_data ...

    с уважением к автору

  • admin
    13 февраля, 2024, 13:02

    Спасибо, и мы совсем не одиноки.

Оставить комментарий