Всё по DS18(B/S)20.

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Аватара пользователя
RoboC
Мудрый кот
Сообщения: 1795
Зарегистрирован: Ср апр 04, 2012 09:55:53
Откуда: Северодонецк
Контактная информация:

Re: Всё по DS18(B/S)20.

Сообщение RoboC »

вполне достаточно 750 миллисекунд ожидания.


Это же совсем в впритык. :)

перед "Skip Rom, Read Scratchpad" еще один "reset pulse"


Так точно! Упустил :oops: .
У того, кто делает — получается редко. У того, кто не делает — не получается никогда.
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Всё по DS18(B/S)20.

Сообщение Gudd-Head »

Аlex, сколько датчиков, какое питание?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Всё по DS18(B/S)20.

Сообщение Аlex »

2 датчика, питание паразитное, провода 3 и 15 метров.
Chelovek
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Пт дек 02, 2011 16:31:40

Re: Всё по DS18(B/S)20.

Сообщение Chelovek »

С кодом немного разобрался. Но возникли вопросы. Не понял подпрограмму rw_byte. И не понял как вычисляется crc.
Аватара пользователя
taraserker
Открыл глаза
Сообщения: 63
Зарегистрирован: Ср окт 08, 2008 23:09:58
Откуда: Израиль.
Контактная информация:

Re: Всё по DS18(B/S)20.

Сообщение taraserker »

Chelovek писал(а):С кодом немного разобрался. Но возникли вопросы. Не понял подпрограмму rw_byte. И не понял как вычисляется crc.


Зайти в википедию и взять пример кода :)

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

/*
  Name  : CRC-8
  Poly  : 0x31    x^8 + x^5 + x^4 + 1
  Init  : 0xFF
  Revert: false
  XorOut: 0x00
  Check : 0xF7 ("123456789")
  MaxLen: 15 байт(127 бит) - обнаружение
    одинарных, двойных, тройных и всех нечетных ошибок
*/
unsigned char Crc8(unsigned char *pcBlock, unsigned int len)
{
    unsigned char crc = 0xFF;
    unsigned int i;
 
    while (len--)
    {
        crc ^= *pcBlock++;
 
        for (i = 0; i < 8; i++)
            crc = crc & 0x80 ? (crc << 1) ^ 0x31 : crc << 1;
    }
 
    return crc;
}



Полином для датчика 1 00110001 = 0x31 остается тем же
В двух словах по коду:
crc ^= *pcBlock++; // берем по очереди считанніе байті и делаем XOR с текущим содержимым контрольной суммы (это который x^8)
crc = crc & 0x80 ? (crc << 1) ^ 0x31 : crc << 1; // если старший разряд "0" просто сдвигаем регистр на <<1, если "1" делаем XOR с полиномом.

И замечание, если на линии короткое, будут приняты все нули, то и контрольная сумма будет ноль. Желательно ввести проверку на ноль иначе контрольная сумма совпадет.
Женский паяльник? Плойка - это.
Аватара пользователя
IM1
Грызет канифоль
Сообщения: 268
Зарегистрирован: Вт фев 16, 2010 12:10:38
Откуда: Воронеж, Россия

Re: Всё по DS18(B/S)20.

Сообщение IM1 »

Chelovek писал(а):С кодом немного разобрался. Но возникли вопросы. Не понял подпрограмму rw_byte. И не понял как вычисляется crc.
Если посмотреть картинку в даташите, то легко видеть, что тайм-слот чтения и записи практически одинаковы. Так зачем тратить аппаратные ресурсы на 2 подпрограммы, когда можно обойтись одной? Впрочем, можете сделать 2 отдельные, просто у меня в тини-13 нет для этого места. Комменты вроде подробные, добавлю что байт outByte служит для приема и передачи: из него побитно выдаем информацию и в него же принимаем (и так 8 раз в цикле). Просто для чтения предварительно в него пишем 0xff.
По поводу CRC: это одна из реализаций алгоритма вычисления из даташита. Можно придумать множество вариантов, некоторые даже по таблице считают, но это уж совсем с жиру беситься...
ПС
Извините, но Вы уже просто капризничаете. Вопросы скатились до уровня: "Пап, а почему солнце всходит?" А мы тут всей толпой объясняем.
Аватара пользователя
Саид
Встал на лапы
Сообщения: 105
Зарегистрирован: Вс апр 05, 2009 14:30:07

Re: Всё по DS18(B/S)20.

Сообщение Саид »

arelaw1 писал(а):мужики , подскажите как будет себя вести DS1820 к критическим для него отметкам температуры т.е в реале может быть и 125 гр. делал простенький терморегулятор по этой схеме http://www.radiosait.ru/page_281.html , и планирую его использовать в автоматике самодельного автоклава ? будет ли работать , или загнется быстро?

У меня в автоклаве работает DS18S20, температура воды 120 градусов, но и на 125 работает без проблемм. Датчик расположен в герметичной трубке, ввареной в дно автоклава и не контактирует с водой, и давление атмосферное в трубке.
Сериг писал(а):оФИГЕННО!Спасибо!пойду пробовать перевести в CVAVR!именно то что я искал!!

А как с результатом? Чтото получилось, или нет? Тоже интересует эта тема, никак не могу в CodeVision сообразить.
Последний раз редактировалось Gudd-Head Сб мар 30, 2013 08:34:47, всего редактировалось 1 раз.
Причина: Нарушение п.2.2 Правил Форума
Планы на будущее, несоответствующие вашим финансовым, умственным и физическим возможностям, называются мечтами!
Chelovek
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Пт дек 02, 2011 16:31:40

Re: Всё по DS18(B/S)20.

Сообщение Chelovek »

Я понимаю, что я надоел, но давайте я попробую описать, почему используются эти команды в rw_byte, а вы скажите что правильно, а что нет.

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

rw_byte:
ldi      bit,8


dec      bit
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   brne   rw_byte1

Тут получается мы 8 раз выполняем подпрограмму rw_byte1, bit можно сказать как счетчик, если он равен 0, то мы выходим из подпрограммы?

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

sbi      DDR1wire, BIT1wire   ; Переводим линию в "0" в течении минимум 6 мкс
nop
nop
sbrc   outByte, 0
cbi      DDR1wire, BIT1wire   ; Если нужно выдать "1" переводим

Чтобы передать 0 нужно удерживать линию в низком логическом уровне, а если 1 то мы сравниваем outBute с 0 и если нужно передать 1, то выдаем 1? Но почему команда sbi, а написано что переводим в 0, ведь sbi это установить бит в РВВ? А cbi это установить 0, а написано 1, или я опять не так понял?

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

clc                     ; готовим 0 в outByte, 7
ror      outByte

Здесь мы отчищаем флаг переноса, и сдвигаем outByte для передачи следующего бита?

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

sbic    pin1wire, BIT1wire
sbr      outByte, 0x80

Вот это я не понял, почему если 1 в BIT1wire, то мы получается ставим последний бит в 0? То есть в любом случаем в конце этих двух команд последний бит в outByte будет 0?

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

ldi      DelayReg, 20      ; Выдерживаем интервал Tslot=67 мкс
rcall   usDelay
   
cbi      DDR1wire, BIT1wire

Задержка и перевод линии в 1?
Все верно?
Аватара пользователя
IM1
Грызет канифоль
Сообщения: 268
Зарегистрирован: Вт фев 16, 2010 12:10:38
Откуда: Воронеж, Россия

Re: Всё по DS18(B/S)20.

Сообщение IM1 »

Chelovek писал(а):Тут получается мы 8 раз выполняем подпрограмму rw_byte1, bit можно сказать как счетчик, если он равен 0, то мы выходим из подпрограммы?
Ну, да. Так оно и есть: этот кусочек подпрограммы принимает/передает 1 бит, так как в байте их целых 8, то и повторяем 8 раз. bit и есть счетчик циклов, при каждом проходе уменьшаем его значение на 1 и так до 0.
Chelovek писал(а):Чтобы передать 0 нужно удерживать линию в низком логическом уровне, а если 1 то мы сравниваем outBute с 0 и если нужно передать 1, то выдаем 1? Но почему команда sbi, а написано что переводим в 0, ведь sbi это установить бит в РВВ? А cbi это установить 0, а написано 1, или я опять не так понял?
Посмотрите внимательнее, мы устанавливаем/снимаем бит в DDRB, который определяет состояние вывода: вход-выход, т.е. мы подаем "1" в DDRB и переводим вывод BIT1wire на выход, а PORTB предварительно установлен в "0", что будет на выводе? Конечно "0", а когда DDRB "0", то вывод будет в высокоимпедансном состоянии, плюс подтягивающий резистор, итого "1".

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

sbrc   outByte, 0
Смотрите систему команд: не сравниваем мы байт outByte с 0, а смотрим его мл. бит и если он сброшен, т.е. "0", то пропускаем следующую команду, а если "1", то и мы даем в линию "1", способом описанным чуть выше.
Chelovek писал(а):Здесь мы отчищаем флаг переноса, и сдвигаем outByte для передачи следующего бита?
Точно так, чтобы не вдвинуть чего лишнего и гарантированно вдвигаем "0".
Chelovek писал(а):Вот это я не понял, почему если 1 в BIT1wire, то мы получается ставим последний бит в 0? То есть в любом случаем в конце этих двух команд последний бит в outByte будет 0?
Опять см. систему команд: не последний бит будет "0", а самый старший (левый) бит станет "1", мы туда уже засунули "0" чуть выше, а он не пригодился...
Chelovek писал(а):Задержка и перевод линии в 1?
Все верно?
Точно так.
ПС
Ничего нет идеального, все можно сделать разными способами.
Здесь можно вместо ror применить lsr и убрать clc, но правда, вместо него придется поставить nop, чтобы не нарушить временную последовательность.
allbest
Родился
Сообщения: 4
Зарегистрирован: Вс мар 31, 2013 20:53:52

Re: Всё по DS18(B/S)20.

Сообщение allbest »

ds18b20 подключаю к отладочной плате, по 3-х проводной схеме:
- VDD датчика к VDD платы;
- GND датчика к GND платы;
- DQ датчика к порту платы, подтянутый через 4.7кОм к VDD.
Результат: плату "замыкает".

В чем может быть проблема?
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Всё по DS18(B/S)20.

Сообщение Gudd-Head »

Датчик грохнулся?
Подключение неправильное?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
allbest
Родился
Сообщения: 4
Зарегистрирован: Вс мар 31, 2013 20:53:52

Re: Всё по DS18(B/S)20.

Сообщение allbest »

Точно не скажу, но на момент подключения он был новым :))
Проверял несколько раз, собрана верно.

Т.е. иных вариантов нет?
Т.к. в интернете находил аналогичный случай, где проблема решилась подключением по 2-х проводной схеме.
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Всё по DS18(B/S)20.

Сообщение Gudd-Head »

allbest писал(а):проблема решилась подключением по 2-х проводной схеме.

Конечно, если в датчике замкнуто только VDD c GND, подключение по двухпроводной шине решит проблему.
Попробуйте запитать датчик через резистор... 100 Ом, а не напрямую чтобы исключить КЗ для целевой платы — посмотрите сколько жрёт.
Ну и просто мультиметром датчик прозвоните.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Chelovek
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Пт дек 02, 2011 16:31:40

Re: Всё по DS18(B/S)20.

Сообщение Chelovek »

Решил на выходных код пописать. Так вот тактовая частота лучше всего 1-2 мГц? Легче задержки делать будет. Верно?
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Re: Всё по DS18(B/S)20.

Сообщение shads »

Переходи лучше на Си, тогда голова не будет болеть, с какой частоты как получить нужную задержку.....
Chelovek
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Пт дек 02, 2011 16:31:40

Re: Всё по DS18(B/S)20.

Сообщение Chelovek »

Переходить буду, но потом, когда на ассемблере научусь писать. Так проще будет, по-моему.
Аватара пользователя
RoboC
Мудрый кот
Сообщения: 1795
Зарегистрирован: Ср апр 04, 2012 09:55:53
Откуда: Северодонецк
Контактная информация:

Re: Всё по DS18(B/S)20.

Сообщение RoboC »

Chelovek писал(а):Решил на выходных код пописать. Так вот тактовая частота лучше всего 1-2 мГц? Легче задержки делать будет. Верно?


Все равно.Просто посчитайте сколько циклов надо подождать..
Начните с опроса наличия датчика. Ответил датчик - запалили светодиод.
У того, кто делает — получается редко. У того, кто не делает — не получается никогда.
Amstron
Нашел транзистор. Понюхал.
Сообщения: 173
Зарегистрирован: Вт дек 21, 2010 21:18:52

Re: ds18b20 maxim (64 bit) или dallas

Сообщение Amstron »

Проблема такая: программа тупить до такой степени, что кнопка 3 струдом срабатывает.
Тупит, это когда жмешь на кнопку и порядковый номер датчика перебирается с третьей попытки...

Если убрать строчку temp=ds18b20_temperature(&rom_code[nomer_datchika][0]); , то датчики перебираются без проблем
Подскажите где надо написать, что бы было минимальное разрешение измерение тампературы датчика?
Что я не так делаю?

Спойлерcase 3: // Показание температуры "ТЕРМОМЕТР"

if (knopka3==3)
{ while (knopka3==3){ } ;
nomer_datchika++;
if (nomer_datchika > MAX_DEVICES) nomer_datchika = 1;
ff = 0;
}

x = 0 ; // что бы не мигал дисплей если выходиш с режима когда мигает дисплей
tochka = 0;
lamp_G=0;
lamp_R=0;
temp=ds18b20_temperature(&rom_code[nomer_datchika][0]); //читаем температуру с выбранного датчика


if (ff > 40) ff = 0;

if (ff < 10)
{
bukva_0 = 24;
bukva_1 = 25;
bukva_2 = 255;
bukva_3 = 255;
indication_IND = nomer_datchika ;
// indication_IND = 1;
}
else
{
if (temp>1000)
{ //если датчик выдаёт больше 1000
temp=4096-temp; //отнимаем от данных 4096
bukva_0 = 25;
}
else bukva_0 = 255;
vukluchit_bukvu();
bukva_3 = 19;
indication_IND = temp*10;
}
break;
Amstron
Нашел транзистор. Понюхал.
Сообщения: 173
Зарегистрирован: Вт дек 21, 2010 21:18:52

Re: ds18b20 maxim (64 bit) или dallas

Сообщение Amstron »

Изменил время измерения на 9 бит лучше стало работать
ds18b20_init(0,-35,35,DS18B20_9BIT_RES); // переключения термометра в 9 битный режим

Народ, напомните мне что значат три числа в скобках : 0,-35,35 ?
изменял их на 0,0,0 - работает .
Аватара пользователя
RomanT
Это не хвост, это антенна
Сообщения: 1335
Зарегистрирован: Ср июн 09, 2010 16:44:54
Откуда: Пермь
Контактная информация:

Re: Всё по DS18(B/S)20.

Сообщение RomanT »

Ну малоли, мож кому пригодится viewtopic.php?p=1643037#p1643037


Изображение
Вложения
ds18b20s.JPG
(18.36 КБ) 945 скачиваний
Ответить

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