Всё по DS18(B/S)20.
Фигуре 11 и 12. Хоть они и на двух листах - смотреть вместе - 12-я продолжение одиннацатой. А дальше ходим по стрелочкам.
- Реклама
- Сообщения: 135
- Зарегистрирован: Ср фев 04, 2015 21:08:59
вот решил самостоятельно написать код для работы с датчиком.начал с первых строчек разбирать и вникать почему да как....оказывается не все так просто как кажется изначально.
так вот возник очередной вопрос:
мне никак не понятно каким образом происходит притягивание шины к нулю
#define OWI_LOW OWI_DDR |= 1<<OWI_BIT //притягиваем шину к 0
упрощу написанное и запишу так: DDRD|=1<<0
и разложу как DDRD=0b 0000 0000 // я так полагаю что раз мы никак не сконфигурировали этот регистр
он имеет значение 0
далее: 1<<0 =0b 0000 0001 //ну тут вроде все ясно
выполняю сложение: 0b 0000 0000|0b 0000 0001
получаю в регистре DDRD 0b 0000 0001 // что я понимаю как BIT0 у PORTD настроен на выход
так как происходит тот самый нулевой уровень на общей шине????
знаю что в покое на общей шине 1...
вот тот отрывок с рабочего кода))
#define OWI_PORT PORTD
#define OWI_DDR DDRD
#define OWI_PIN PIND
#define OWI_BIT 0
#define OWI_LOW OWI_DDR |= 1<<OWI_BIT//притягиваем шину к 0
#define OWI_HIGH OWI_DDR &= ~(1<<OWI_BIT)//отпускаем шину
заранее благодарен!!!
так вот возник очередной вопрос:
мне никак не понятно каким образом происходит притягивание шины к нулю
#define OWI_LOW OWI_DDR |= 1<<OWI_BIT //притягиваем шину к 0
упрощу написанное и запишу так: DDRD|=1<<0
и разложу как DDRD=0b 0000 0000 // я так полагаю что раз мы никак не сконфигурировали этот регистр
он имеет значение 0
далее: 1<<0 =0b 0000 0001 //ну тут вроде все ясно
выполняю сложение: 0b 0000 0000|0b 0000 0001
получаю в регистре DDRD 0b 0000 0001 // что я понимаю как BIT0 у PORTD настроен на выход
так как происходит тот самый нулевой уровень на общей шине????
знаю что в покое на общей шине 1...
вот тот отрывок с рабочего кода))
#define OWI_PORT PORTD
#define OWI_DDR DDRD
#define OWI_PIN PIND
#define OWI_BIT 0
#define OWI_LOW OWI_DDR |= 1<<OWI_BIT//притягиваем шину к 0
#define OWI_HIGH OWI_DDR &= ~(1<<OWI_BIT)//отпускаем шину
заранее благодарен!!!
Вы же сами написали :
А если он настроен на выход, то на него можно вывести что угодно - хоть 0, хоть 1.ROMan2947 писал(а):что я понимаю как BIT0 у PORTD настроен на выход
- Сообщения: 297
- Зарегистрирован: Ср дек 30, 2009 09:55:39
помимо регистра направления порта, смотрите что изначально было выведено в данный порт.ROMan2947 писал(а):...так как происходит тот самый нулевой уровень на общей шине????....
т.е. идёт управление не выводом в порт а именно направлением, чтобы не мешать выставлению уровня "0" датчику (ну или через резистор идёт подтяжка к "1")
удачи вам
(круглый)
ЗЫ
Ещё обратите внимание как идёт чтение каждого бита в протоколе 1-Wire. Более того - рекомендую прочитать именно текст, а не рассматривать картинку.
- Реклама
зарылся я тут с 1wire и ds18b20 в частности.
попытался получить хоть байт от датчика-и ни в какую
Тестирую на 100% рабочей плате.Используется PIC16F628A у которого на выводе RA4 подключен датчик..импульсы reset и presence проходят нормально-и далее ничего.Писал и свой код и брал с AppNote у Microchip"а.Не хочет сотрудначать и все тут.Так как железо рабочее- видимо ошибка в коде,может кто посмотрит на досуге и подскажет где её искать
- Вложения
-
- 1wire.rar
- файлы программы С
- (3.97 КБ) 177 скачиваний
Интересная,однако,штука
Может читаете поздно. Код удерживает линию 6мкс в 0, потом отпускает линию и только через 9мкс идет опрос. По мне, т.к. нижняя граница валидности не указана, лучше опрашивать несколько раз, допустим через 1мкс, на интервале 6...15мкс.
Read Data Valid tRDV max 15 μs
На АВР я бы свою библиотеку выложил.. А в ПИК, там подругому ассемблер команды называет. ))))
К моей же самописанной библиотеке надо добавить только подсчет контрольной суммы. Но с одним датчиком температуры работает и без контрольной суммы, хоть это и не правильно.
Там просто надо быть очень точным во всех задержках.
К моей же самописанной библиотеке надо добавить только подсчет контрольной суммы. Но с одним датчиком температуры работает и без контрольной суммы, хоть это и не правильно.
Там просто надо быть очень точным во всех задержках.
Станислав
СКАЗОЧНИК
'Там просто надо быть очень точным во всех задержках'.Так и есть))
akl Пасибки.Вы вовремя.поправил и получил 'настоящий' байт
'Там просто надо быть очень точным во всех задержках'.Так и есть))
akl Пасибки.Вы вовремя.поправил и получил 'настоящий' байт
Интересная,однако,штука
- Сообщения: 2
- Зарегистрирован: Ср сен 07, 2016 15:19:47
Доброго времени суток. Никак не могу понять как вывести адрес датчика на LCD. Имеется "unsigned char * id" с записанным туда адресом.
Что делать далее - не могу понять
Что делать далее - не могу понять
Адрес датчика - это набор из восьми 8-битных чисел. Вот и выводите эти числа (id[0], id[1] и т.д.), лучше в шестнадцатеричном виде - получится 2 символа на байт, как раз в 16 позиций поместится.
- Сообщения: 2
- Зарегистрирован: Ср сен 07, 2016 15:19:47
Спасибо, всё получилосьWiseLord писал(а):выводите эти числа (id[0], id[1] и т.д.)
Всем доброго 24/7.
В досье на 18В20 (да и на других его родственников наверное) написано, что после команды 0х44 (начать преобразование) датчик сажает шину в ноль на все время преобразования. На практике я такого не замечаю. Можно конечно тупо вставить паузу по ДШ (от 100 до 750 мс в зависимости от битности), а потом температуру читать, но...
Сразу скажу, что все работает и читается, но вот мысль, что либо ДШ врет, либо я туплю не дает мне покоя.
То есть если я делаю так
то всё работает.
Если же добавляю проверку, кто отработает первым - шина или таймаут:
то получаю в ответ отсутствие датчика.
Кто-то реально заморачивался этим вопросом? Должен или не должен датчик сажать шину на все время преобразования?
На всякий случай цитата из ДШ на 18В20 (стр.11):
В досье на 18В20 (да и на других его родственников наверное) написано, что после команды 0х44 (начать преобразование) датчик сажает шину в ноль на все время преобразования. На практике я такого не замечаю. Можно конечно тупо вставить паузу по ДШ (от 100 до 750 мс в зависимости от битности), а потом температуру читать, но...
Сразу скажу, что все работает и читается, но вот мысль, что либо ДШ врет, либо я туплю не дает мне покоя.
То есть если я делаю так
Код: Выделить всё
if (init_ds())
{
send_ds(0xCC); // Skip ROM
send_ds(0x44); // Start conversion
}
else return 0;
// Ждем окончания преобразования.
t1over = tconv/100; // Количество переполнений Т1.
t1set(0x3CAF); // 100ms to overflow
while (t1over);
Если же добавляю проверку, кто отработает первым - шина или таймаут:
Код: Выделить всё
if (init_ds())
{
send_ds(0xCC); // Skip ROM
send_ds(0x44); // Start conversion
}
else return 0;
_nop();
// Ждем окончания преобразования, на время которого DQ дожен быть в 0.
if (DQ) return 0; // Датчик не отвечает. Почему не 0 как говорит ДШ?????!!!
else
{
t1over = tconv/100; // Количество переполнений Т1.
t1set(0x3CAF); // 100ms to overflow
while (DQ ^ t1over); // Пока 0 и 1 результат будет 1.
}
Кто-то реально заморачивался этим вопросом? Должен или не должен датчик сажать шину на все время преобразования?
На всякий случай цитата из ДШ на 18В20 (стр.11):
Спойлер
If the DS18B20 is powered by an external supply, the master can issue read time slots after the Convert T command and the DS18B20 will respond by transmitting a 0 while the temperature conversion is in progress and a 1 when the conversion is done.
Каждый имеет право на свое личное ошибочное мнение.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
это не правда, там такого не написано. читайте внимательно: там написано, что в течение всего времени преобразования на тайм-слот чтения датчик всегда отвечает низким уровнем, т.е. нулем - это совсем не то же самое, что "сажает в 0 линию"! подавая время от времени тайм-слоты чтения вы можете определить конец преобразования более точно, чем просто подождав сколько-то там миллисекунд... но делать это нет особого смысла...Zhuk72 писал(а):В досье на 18В20 (да и на других его родственников наверное) написано, что после команды 0х44 (начать преобразование) датчик сажает шину в ноль на все время преобразования.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Ясно, спасибо за разъяснение.
Каждый имеет право на свое личное ошибочное мнение.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Вчера случайно воткнул 1820 с обратной полярностью на несколько секунд в рабочую схему. Сперва не понял, с чего это вдруг упала яркость 7-сегментника. Спохватился, выдернул, вставил правильно. Работает 
При этом абсолютно новый, правда очень давно купленный, 18В20 не желает работать. Причем в двух разных схемах, на двух абсолютно разных контроллерах. Проверял 2 штуки 1820 и один (другой уже) 18В20. Они работают без проблем, а этот выдает 85. Его я переполюсовкой не баловал
При этом абсолютно новый, правда очень давно купленный, 18В20 не желает работать. Причем в двух разных схемах, на двух абсолютно разных контроллерах. Проверял 2 штуки 1820 и один (другой уже) 18В20. Они работают без проблем, а этот выдает 85. Его я переполюсовкой не баловал
Каждый имеет право на свое личное ошибочное мнение.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Для DS18B20:
Скорее всего, где то в программе не выдержаны времена (вернее, допуски времён) при работе с DS18B20.The power-on reset value of the temperature register is +85°C
Другой 18В20 работает же. Тем более я использую 9-битный режим, там 100 мс хватает, но пробовал и 800 с тем же результатом. И с тайм-слотами все должно быть нормально, если три других датчика работают.
Каждый имеет право на свое личное ошибочное мнение.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
датчик всегда выдает 85, если не принял команду старта измерения. так что либо с процессом обмена что-то не то (адрес, например, не тот), либо вообще не начинается измерение
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!


