Добрый вечер, господа матерые электронщики! Помогите пожалуйста познающему науку программирования контроллеров (пока AVR). Задолбал гадский датчик DS18B20. Я к нему и так и этак, а он, собака злая, мне 85 выдает хоть ты тресни. Прогу царапаю на асме. Команды выдаю в таком порядке: Инициализация датчика Init_DS:
clr DATA ;В регистре с первым байтом все нули rcall Write_DS ; clr DATA ;В регистре со вторым байтом все нули rcall Write_DS ; clr DATA ;В регистре конфигурации все нули rcall Write_DS ;
далее следует преобразование в знаки для индикатора... Программа тестовая, просто чтобы запустить датчик и снять показания. Модель в гадском "Proteus" работает замечательно, даже после разных программных извратов. Игрался с подтяжкой от 2-х до 10-ти кОм. Поставил кварц на 4МГц (по пути залочил 2 контроллера, теперь жду когда принесут параллельный программатор). Вроде все как производитель просит, ан нет, "85" и все тебе. Прилагаю осцилограммы с Proteus, реальные к сожалению снять нечем. А датчик заведомо рабочий, проверял на готовом термометре. Очень прошу помогите, а то просто голова взрывается.
Проще делать через таймер. Взять мануал по датчику и вперед. Сначала ловить ответ на старт команды. Как вариант смотреть осциллографом ответ. Синхронизацию для осциллографа задавайте на отдельном выводе. И датчик температуры может давать температуру 85 градусов если нет питания на выводе ( паразитное питание и его не хватает). Или не воспринимает команду на старт преобразования. Попробуйте прочитать ром сначала. Там в конце байт контроля. У gcc для avr есть функция расчета контрольной суммы.
ПС: восьмиразрядного таймера достаточно.
ППС: а какова цель проекта? Может проще вам ацп задействовать и резистивный датчик температуры? Зачем вам такая точность?
С АЦП не работал, думал с DS-кой проще будет . Цель - термостат, с дельтой 1-2 градуса и таймером, для опытов. Прогу почти закончил - только датчик подводит. Нацарапал тестовую прогу для отработки датчика и вот теперь сношаю себе мозг по вечерам. Таймеры заняты к сожалению.
Извините, если не в тему... а вы даташиты принципиально не читаете? Там есть диаграмма, какие команды в какой последовательности подавать. И если не используется паразитное питание - нет никакой надобности отмерять паузы между командами. Всё работает строго по статусам. После посылки команды convert temperature просто опрашивайте статус, пока не получите сигнал готовности. Тогда можно считать измеренную температуру.
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
If the DS18B20 is powered with parasite power, this notification technique (опрос готовности преобразования) cannot be used since the bus must be pulled high by a strong pullup during the entire temperature conversion. The bus requirements for parasite power are explained in detail in the Powering the DS18B20 section.
Вместо транзистора достаточно порт настраивать на вывод "1".
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Пока "задвинул" на паразитное питание, обиделся и сделал на трех проводах! Все замечательно работает. На двух "85" хоть застрелись. Появится время, обязательно докопаюсь и отпишусь! Да кстати, пробовал по совету уважаемого Gudd-Head выставлять порт в "1" на время преобразования и записи ОЗУ в ПЗУ - эффекта не дало! Всем большое спасибо!
85 - это или нет питания, или не закончена конвертация, или не запущена конвертация. p.s. Забыл еще одну возможность - температура, и вправду, 85 градусов.
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
1. Насколько я помню, в даташите написано, что при достаточно высокой температуре увеличиваются утечки на датчике и паразитного питания не хватит в любом случае.
2. Точность 1-2 градуса достижима на обычном резистивном датчике.
3. Помехоустойчивость линии, при включении-выключении нагревателя, очень слабая. Скорее всего будут сбои при передаче информации. Резистивные датчики такими проблемами не страдают ( и два провода всего).