Урок 20
Часть 1
Подключаем датчик температуры DS18B20
Продолжаем изучать датчики компании DALLAS.
И сегодняшним представителем будет DS18B20, который является датчиком температуры.
Измеряет температуру данный датчик в градусах по цельсию. Измерения могут быть как 9-битной дискретности, так и 12-битной.
Распределяются данные биты следующим образом.
Мы будем измерять температуру в 12-битном виде и самые младшие 4 бита будут хранить показания долей градуса, а остальные старшие 8 — сами градусы.
Подключается данный датчик по однопроводной технологии (1-wire).
Диапазон измерений — от -55 0C до +125 0C, но наивысшая точность показаний достигается в диапазоне от -10 0C до +85 0C/
Погрешность данного датчика — 0,5 градуса, поэтому нам нет смысла использовать все младшие биты и мы их будем просто отсекать.
Режим 1-wire у нас не организован аппаратно в контроллере, поэтому мы будем весь протокол программировать.
Чем удобен для нас данный датчик? Удобен он тем, что мы можем его в часовой модуль, использованный на прошлых занятиях просто впаять и использовать. Для этого на модуле выведен отдельный контакт. У датчика всего 3 ножки. 2 из них ножки питания и одна — ножка данных.
Данный датчик существует в двух видах корпуса — Dip и TO-92. Мы будем использовать второй тип.
Таких датчиков, как пишут, на 1 провод можно повесить несколько, но я не пробовал.
В связи с этим у каждого датчика есть уникальный 64-битный код, записанный в его ROM, записанного постредством лазерных технологий.
Но, так как мы будем использовать только один датчик, то мы будем к нему обращаться другим способом, не используя ROM.
Мы подаём на датчик команду 44h последовательным кодом, тем самым заставляя датчик конвертировать температуру.
Посмотрим регистры, в которых хранится значение температуры после преобразования
В четырех младших битах младшего регистра хранятся доли градусов, в четырех старших, а также в трех младших битах старшего регистра — целые значения градусов.
В остальных битах — знак. Если 0, то плюс, если 1 — то минус.
Также в технической документации написано, что нужно обязательно подтянуть резистор на информационную ножку датчика к питанию.
Также написан ряд временных и других характеристик, которые мы уже будем рассматривать по мере того, как будем писать код.
Проект был создан новый и назван My1820LCD, все файлы проекта прошлого занятия MyClock1307LCD были вставлены в проект, а код главного модуля также был скопирован в главный модуль нового проекта. Всё это сделано потому, что мы работаем с тем же модулем, просто мы также впаяли туда датчик температуры, а время мы считывать не перестанем, пусть часы также ходят.
Добавим ещё файлы DS18B20.c и DS18B20.h для созадния библиотеки работы именно с датчиком температуры и заголовочный файл также подключим в main.h по нашему обыкновению, ну и его же подключим в одноименный c-файл.
Сначала создадим функцию конвертирования температуры в файле DS18B20.c. Надобность данной функции обусловлена тем, что датчик нам передаёт показания в двух байтах в определённом виде, рассмотренном нами выше, который без преобразования будет непонятен
//функция преобразования показаний датчика в температуру
int dt_check(void)
{
}
Создадим две переменных, которые нам пригодятся в дальнейшем в теле нашей функции
int dt_check(void)
{
unsigned char bt;//переменная для считывания байта
unsigned int tt=0;
Сразу сделаем прототип нашей функции в заголовочном файле
#include «main.h»
int dt_check(void); //функция преобразования показаний датчика в температуру
Чтобы нам дальше писать тело функции, нам будет нужна ещё функция. Напишем её выше, чтобы не создавать прототип. Данная функция будет узнавать, есть ли датчик на шине
//функция определения датчика на шине
char dt_testdevice(void) //dt — digital termomether | определим, есть ли устройство на шине
{
}
Теперь, прежде чем писать тело данной функции, самое время посмотреть схему подключения датчика к контроллера. Посмотрим опять же упрощённый вариант в протеусе (нажмите на картинку для увеличения изображения)
Мы видим, что датчик своим информационным портом подключен к ножке порта МК PD1, также мы видим подтягивающее сопротивление на 4,7 килоом с данного провода на шину питания.
И вот теперь на данной ножке мы должны как-то иммитировать определённые имплуьсы. То есть мы как-то должны инициализировать то ноль, то единицу. Делать мы это сможем благодаря тому, что у нас есть подтягивающий резистор. Мы будем её то отпускать от общей шины, то притягивать к ней. Соответственно, когда мы её отпустим, то через резистор на ней окажется высокий уровень, а когда подтянем к земле, то низкий.
Теперь вопрос, как это всё сделать. А сделать это можно вполне с помощью определённого бита регистра DDRB, который отвечает, как мы знаем, за направление работы определённых ножек порта. Но мы воспользуемся тем, что когда мы объявляем ножку на выход, она у нас притягивается к земле, понятно что при условии, что соответствующий бит регистра PORTD будет также нулём. А если мы уже в соответствующий бит регистра DDRB записываем значение, при котором соответствующая этому биту ножка объявится на вход, то, соответственно, от общей шины она. ясное дело отпустится, иначе как контроллер определит её состояние. Ну и, как и было написано выше, на этой ножке засчет подтягивающего резистора установится высокий логический уровень.
Также, начиная процесс обмена с датчиком, мы должны запретить прерывания, чтобы не получить искаженных данных. Также, прежде чем запретить прерывания, нам необходимо сохранить регистр статуса контроллера, или стек. Это регистр SREG. Поэтому в самом начале тела нашей функции проверки присутствии датчика на шине мы это и сделаем, сохранив его в определённую переменную, ну и затем уже запретим прерывания
char dt_testdevice(void) //dt — digital termomether | определим, есть ли устройство на шине
{
char stektemp=SREG;// сохраним значение стека
cli(); //запрещаем прерывания
Дальнейшую работу с датчиком мы продолжим в следующей части нашего занятия.
Предыдущий урок Программирование МК AVR Следующая часть
Техническая документация на датчик DS18B20
Программатор, датчик температуры DS18B20, плата для его подключения с микросхемой DS1307 и дисплей можно приобрести здесь:
Программатор USBASP USBISP с адаптером USBASP USBISP 3.3 с адаптером
Модуль RTC DS1307 с микросхемой памяти
Смотреть ВИДЕОУРОК (нажмите на картинку)
Отличная серия уроков, спасибо огромное за ваш труд. Все четко и внятно, только не могу понять откуда взялось SREG ? Описано только что это стек но откуда берется эта переменная?
Это регистр статуса контроллера SREG (что и написано в тексте урока).
Но почему автор называет его еще и стеком, мне тоже непонятно.
Серия уроков мне тоже нравится. Но надо быть готовым к большому количеству неточностей, ошибок и сбивающей с толку информации.
Просто у меня студия подчеркнула этот SREG . Хотя компилится все без ошибок.
Ваш ресурс настолько меня заинтересовал что задумался сохранить этот материал локально, боюсь чтобы не пропал с инета)))))))))))
Супер давно подписан на ваш канал миллиард вам подписчиков. Еще раз спасибо.
Очень интересные уроки, вы единственный, кто их делает, огромное спасибо за это. У меня появилась проблема — студия подчеркивает SREG и требует его инициализировать. Не подскажите куда копать? Спасибо.
Картинка схемы от часов(DS1307), а не DS1820.