Вопросы по работе с термометрами DS18B20

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
clawham
Поставщик валерьянки для Кота
Сообщения: 1957
Зарегистрирован: Пт окт 31, 2008 09:38:55
Откуда: Одесса
Контактная информация:

Сообщение clawham »

Здравствуйцте уважаемые Дсководы :)
Есть такой вопрос - как правильно организовать опрос 20-ти даччиков на линии причём стандартными средствами CVAVR но суто в том что опрашивать даччики и притом все желательно раз в секунду!
Насколько я понял АЦП в этом термометре нету - есть два счетчика один отмеряет 750 милисекунд а второй просто тикает но хитро - если температура -55 то он и раз не тикнет а если +150 то натикает столько же сколько в бинаре будет 1111 1111 1111 :)
Есть такая команда на 1Wire шину - Skip ROM называется и после неё можно кинуть команду начала преобразования но относиться оно будет ко всем ДС на линии - потом подождать 800 милисекунд и в цикле проходиться по всем lc-кам считывая ихние скретчпады....у меня вроде всё это получилось но библиотека ds18b20.h в CVAVR при попытке считать скретчпад запускает новое температурное преобразование...подскажите ктото как то с этим справился? Или может у кого есть пример как получить из 1w шины содержимое скретчпада и преобразовать его в температуру?
Аватара пользователя
Pooher
Мучитель микросхем
Сообщения: 491
Зарегистрирован: Вс янв 07, 2007 01:45:48
Откуда: Российская Федерация, будь она неладна...

Сообщение Pooher »

Насколько я понял АЦП в этом термометре нету - есть два счетчика один отмеряет 750 милисекунд а второй просто тикает но хитро - если температура -55 то он и раз не тикнет а если +150 то натикает столько же сколько в бинаре будет 1111 1111 1111 Smile

:shock: :shock: :shock:
А как он МЕРИТ ТЕМПЕРАТУРУ без АЦП, таймерами что ли???:o

ЗЫ: Код опроса датчиков выложите.
Научить нельзя, можно научиться. Пифагор.
Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
Аватара пользователя
lkote68
Прорезались зубы
Сообщения: 231
Зарегистрирован: Пн мар 30, 2009 15:58:32
Откуда: Украина Запорожье

Вопросы по работе с термометрами DS18B20

Сообщение lkote68 »

Мой скромный опыт многоуважаемым Котам. Дак вот подключился я на объекте к сети ДС (нога atmegи подтянута 1кОм) и увидал 30 датчиков. Подтяжку пришлось уменьшать сами видите. На 4.7 не хочет видеть 15 шт. На 2кОм видит 20-25 на килооме увидел 30. Жаль больше не было остальные сегменты не рабочие.
Дак вот еще фишка проблема была именно с поиском ДСок.
Транзистор можно любой поставить. Он работает в ключевом режиме. На время преобразования температуры жёстко подтягивает шину к "1".

Это понятно. Вот не понятно как малой кровью это сделать при помощи CodeVision. Там же не понятно когда подтягивать Надо в либы лезть. Мы тут поговаривали о изменении библиотечных функции. Может кто то уже сделал?
clawham
Поставщик валерьянки для Кота
Сообщения: 1957
Зарегистрирован: Пт окт 31, 2008 09:38:55
Откуда: Одесса
Контактная информация:

Сообщение clawham »

именно таймерами один супер стабильный от температуры а второй - супер нестабильный
вот мой код в CVAVR

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

w1_init();
      w1_write(0b11001100); // SkipRom
      w1_write(0b01000100); // Convert T
      delay_ms(750); // ждем завершения конверсии
             
          for (i=0;i<devices;i++)
          {
              lcd_gotoxy(75,2+i);
              sprintf(a2, "<");
              lcd_putstr(a2);
             
              //Пробуем вручную получить скретчпад
              // отсылаем в шину команду MATCH ROM [55h]
              //delay_ms(800);
              putsf("writing 55 ...\n\r");             
              w1_init();
              delay_ms(8);
              while(w1_write(0x55)==0)
              {
                //wait
              }
              ;
              putsf("writed 55 ...\n\r");
             
              // отсылаем собственно сам адрес
              putsf("writing address ...\n\r");
//              for(CurrDev = 0;CurrDev<=9;CurrDev++)
//              {
//                    w1_write(rom_codes[i][CurrDev]);                   
//              }

              w1_write(rom_codes[i][0]);
              w1_write(rom_codes[i][1]);
              w1_write(rom_codes[i][2]);
              w1_write(rom_codes[i][3]);
              w1_write(rom_codes[i][4]);
              w1_write(rom_codes[i][5]);
              w1_write(rom_codes[i][6]);
              w1_write(rom_codes[i][7]);
              w1_write(rom_codes[i][8]);
              //w1_write(rom_codes[i][8]);
             
              putsf("writing address SUCCESS...\n\r");
             
              for(CurrDev = 0;CurrDev<=9;CurrDev++)
              {
                    w1_write(rom_codes[i][CurrDev]);
                    sprintf(a2, "Byte %i = %i \n\r" , CurrDev, rom_codes[i][CurrDev]);
                    puts(a2);                   
              }
             
              // запрос содержимого скретчпада
              putsf("writing BE ...\n\r");
              w1_write(0xBE);
                   
              // приём скретчпада
              putsf("Getting LSB ...\n\r");
              ds_scratch_pad.temp_lsb       = w1_read();
              //putsf("Getted LSB----getting msb ...\n\r");
              ds_scratch_pad.temp_msb       = w1_read();
              //putsf("Getted msb----getting high ...\n\r");
              ds_scratch_pad.temp_high      = w1_read();
              ds_scratch_pad.temp_low       = w1_read();
              ds_scratch_pad.conf_register  = w1_read();
              ds_scratch_pad.res1           = w1_read();
              ds_scratch_pad.res2           = w1_read();
              ds_scratch_pad.res3           = w1_read();
              ds_scratch_pad.crc            = w1_read();             
             
              /*
              struct ds_scratch_pad_struct
               {
               unsigned char temp_lsb,temp_msb,
                        temp_high,temp_low,
                        conf_register,
                        res1,
                        res2,
                        res3,
                        crc;
               } ds_scratch_pad;
               */
             
              // строчка для com порта
              sprintf(a2, "temp_lsb = %i \n\r" ,ds_scratch_pad.temp_lsb);
              puts(a2);
              sprintf(a2, "temp_msb = %i \n\r" ,ds_scratch_pad.temp_msb);
              puts(a2);
              sprintf(a2, "temp_high = %i \n\r" ,ds_scratch_pad.temp_high);
              puts(a2);
              sprintf(a2, "temp_low = %i \n\r" ,ds_scratch_pad.temp_low);
              puts(a2);
              sprintf(a2, "conf_register = %i \n\r" ,ds_scratch_pad.conf_register);
              puts(a2);
              sprintf(a2, "res1 = %i \n\r" ,ds_scratch_pad.res1);
              puts(a2);
              sprintf(a2, "res2 = %i \n\r" ,ds_scratch_pad.res2);
              puts(a2);
              sprintf(a2, "res3 = %i \n\r" ,ds_scratch_pad.res3);
              puts(a2);
              sprintf(a2, "crc = %i \n\r" ,ds_scratch_pad.crc);
              puts(a2);
             
              ds_temp = ds18b20_temperature(&rom_codes[i][0]);
              //Просто по-старому - долго и неправильно
              sprintf(a2, "t%u=%+.3f\xf8C\n\r",i+1, ds_temp);
                                                               
              lcd_clear_row(2+i);
              lcd_gotoxy(1,2+i);
              lcd_putstr(a2); // выводим на экранчик
             
              // строчка для com порта
              sprintf(a2, "t%u(%i)=%+.3f\xf8C\n\r",i+1, rom_codes[i], ds_temp);
              puts(a2);
             
              lcd_gotoxy(75,2+i);
              sprintf(a2, "-");
              lcd_putstr(a2);
          }
     
      };
clawham
Поставщик валерьянки для Кота
Сообщения: 1957
Зарегистрирован: Пт окт 31, 2008 09:38:55
Откуда: Одесса
Контактная информация:

Сообщение clawham »

Ну или вот весь исходник
Вложения
prog.c
(21.39 КБ) 352 скачивания
Аватара пользователя
Pooher
Мучитель микросхем
Сообщения: 491
Зарегистрирован: Вс янв 07, 2007 01:45:48
Откуда: Российская Федерация, будь она неладна...

Сообщение Pooher »

Я в Си конечно не силён, но по моему, код по меньшей мере странный.
Научить нельзя, можно научиться. Пифагор.
Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
Аватара пользователя
Pooher
Мучитель микросхем
Сообщения: 491
Зарегистрирован: Вс янв 07, 2007 01:45:48
Откуда: Российская Федерация, будь она неладна...

Сообщение Pooher »

именно таймерами один супер стабильный от температуры а второй - супер нестабильный

Ё моё, даже и представить не мог. Кому интересно, или не верится:
http://www.cqham.ru/super/dallas/digterm.htm
Научить нельзя, можно научиться. Пифагор.
Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
clawham
Поставщик валерьянки для Кота
Сообщения: 1957
Зарегистрирован: Пт окт 31, 2008 09:38:55
Откуда: Одесса
Контактная информация:

Сообщение clawham »

эт мой стиль написания тестовых программ где есть куча неоптимизированностей и т.д. но суть то от этого не меняется памяти у меня предостаточно в любых направлениях как и скорости...потому эт не недостаток
я вообще по жизни с++ с# программист и образование соответствующее но есть одно но - знать бы что писать где какие задержки выставлять и как написана вообще в принципе та библиотека КодВижиновская - не было б и вопросов....а вообще зря они загнали структуру скретчпада в ПРИВАТ .... если б она была Пабликом вопросов бы и небыло ибо чтение скретчпада встроеной функцией работает на ура вот только толку с того нету - доступа то к данным нет :( разве что просканировать оперативу и найти адресок этой структуры.....ужас в общем несусветный
А ВОТ И СОРРИ!!! стоило полазить по мап файлам и...

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

RAM Allocation
Variable                                                          Address   Size
----------
rx_buffer                                                         0100h        8
__ds18b20_scratch_pad                                             0108h        9
rom_codes                                                         0111h       72
a2                                                                0159h       30
ds_scratch_pad                                                    0177h        9
p                                                                 0180h        2
_seed                                                             0182h        4

EEPROM Allocation
Variable                                                          Address   Size
----------
mem_contr                                                         0000h        1

Register Allocation
Variable                                                          Register  Size
----------
rx_wr_index                                                       R5           1
rx_rd_index                                                       R4           1
rx_counter                                                        R7           1
rx_buffer_overflow                                                R2.0      1bit
devices                                                           R6           1
motor_step                                                        R8,R9        2
clawham
Поставщик валерьянки для Кота
Сообщения: 1957
Зарегистрирован: Пт окт 31, 2008 09:38:55
Откуда: Одесса
Контактная информация:

Сообщение clawham »

И снова здравствуйте! наконец-то добил этого гада!!!
Технология хакерская :) памяти то в МК мааалаааа вот и выходит что найти скретчром в эмуляторе стоило 5 секунд потом так же нашел и свою структуру и просто переписываю адреса
дальше - долго мучился с преобразованием в градусы, разложением на биты и самое интересное - временной задержкой....протупил что wait_ms параметр в инте берёт тоесть не более 255 :))) теперь время опроса тоже регулируется + написал микропрограммку на c# чтоб с ком1 работать красиво
В общем вот кому нужно - исходники и программка для ББ
Соль то вся в том что раз в пол секунды 4 датчика обновляются!!! та же скорость будет и в случае с 30-ю датчиками ) что и требовалось!!!
Думаю проектик будет полезен всем начинающим
Вложения
prog.c
исходник прошивки
(21.51 КБ) 466 скачиваний
WindowsFormsApplication1.rar
прожка для компика
(4.92 КБ) 258 скачиваний
1.rar
распайка меги 16 для протеуса
(24.32 КБ) 255 скачиваний
Аватара пользователя
Dexa
Встал на лапы
Сообщения: 119
Зарегистрирован: Ср ноя 07, 2007 15:17:20
Контактная информация:

Сообщение Dexa »

Для датчика DS18S20 необходим вход МК - SPI, но он у меня занят под микруху EEPROM, можно ли как-нибудь подругому реализовать подключение этого датчика?
......aлкоголь расширяет сосуды, курение их сужает, а сдают почему-то нервы......
clawham
Поставщик валерьянки для Кота
Сообщения: 1957
Зарегистрирован: Пт окт 31, 2008 09:38:55
Откуда: Одесса
Контактная информация:

Сообщение clawham »

кто такое страшное сказал что он по СПИ работает? это типичный 1-wire термометр только повышеной точности помоему
http://datasheets.maxim-ic.com/en/ds/DS18S20.pdf
его шину данных(топологии микролан) можно установить на любую ногу МК и если Вы кодите под КодВижнАВР то тем более проще простого эт раз а во вторых ну если вы и еепромку 1wire используете то проблем вообще не должно быть при правильном соблюдении протокола - можно хоть сотню термометров еепромок RTC шек и т.д. на одну линию цеплять :)
Лично у меня висит на МК 21 термометр+ 8 адресуемых свитчей + 4 16-битные ацп. проблема только в сохранении ром кодов - больно много памяти на одно устройство требуется. но я пока обошелся внешними 512 килобайтами NvSRAM с парралельным интерфейсом от Texas Instrumentals
Аватара пользователя
Dexa
Встал на лапы
Сообщения: 119
Зарегистрирован: Ср ноя 07, 2007 15:17:20
Контактная информация:

Сообщение Dexa »

Я делаю на Pic16f877. Вот для реализации передачи от DS к пику можно использовать выводы по даташиту, благодаря которым можно сделать эту двунапраленную связь. Либо подключать к любому выводу и SPI делать программно (чего не хочется, так как не знаю как это сделать). Вот в чем проблема.
Вложения
untitled.JPG
(58.35 КБ) 326 скачиваний
2.JPG
(22.12 КБ) 452 скачивания
......aлкоголь расширяет сосуды, курение их сужает, а сдают почему-то нервы......
Аватара пользователя
Pooher
Мучитель микросхем
Сообщения: 491
Зарегистрирован: Вс янв 07, 2007 01:45:48
Откуда: Российская Федерация, будь она неладна...

Сообщение Pooher »

Глупости какие-то :lol:
Научить нельзя, можно научиться. Пифагор.
Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
clawham
Поставщик валерьянки для Кота
Сообщения: 1957
Зарегистрирован: Пт окт 31, 2008 09:38:55
Откуда: Одесса
Контактная информация:

Сообщение clawham »

Чтото я не понимаю причём тут SPI - это 2-х проводная шина с сигналом тактования без которого она вообще не работает! а 1WIRE это вообще совершенная противоположность!!!! для 1 wire нужен один провод и он является и питанием и тактованием и входом и выходом!!!! каждое устройство имеет длинный уникальный код(мак адрес) который никогда не повторится! интерфейс шины конечно можно и на 2 ноги растянуть - например нужно шину подтянуть к +5 когда много ацп задумывают преобрахование выполнить или например для нормальной записи ячейки еепрома. но это уже кто как захочет можно и на 3 провода застянуть - 1 нога МК - вход, вторая - коротит на землю третья - на +5 хотя все эти функции с успехом выполняет ОДНА нога МК ATMega 16-16pu :)

Я чесно говоря не пробывал сделать программную эмуляцию своими руками - я делал с помощью готовой библиотеки в компиляторе но....у меня есть проектик да и в сети полно проектиков на асме где разжевано досконально как это делается а вообще....ну....я использую дисплей от нокии 3310 и первый раз СПИ делал программно для KGN порта на компьютере и мог легко перенести тот кон в МК ибо что в ББ что на МК пишу я на с++. моё мнение - пишите под АВР если не уверены в своих возможностях....по крайней мере у меня на них получается всё делать с пол оборота за вечер и с первого раза всё рабоатет :) ничего пока не спалил и не разбирался досконально всякий раз с канальным уровнем
Аватара пользователя
Секретный кот
Поставщик валерьянки для Кота
Сообщения: 2106
Зарегистрирован: Ср сен 17, 2008 14:32:15
Откуда: Старые Васюки
Контактная информация:

Сообщение Секретный кот »

clawham писал(а):кто такое страшное сказал что он по СПИ работает?

Действительно, ерунда какая-то.

clawham писал(а):это типичный 1-wire термометр только повышеной точности помоему

Этот обычный (=DS1820), повышенной точности - это DS18B20.
Аватара пользователя
Dexa
Встал на лапы
Сообщения: 119
Зарегистрирован: Ср ноя 07, 2007 15:17:20
Контактная информация:

Сообщение Dexa »

Да я наговорил глупостей. Могу я подключить например к АЦП пика и как программно описать это? 1-Ware - двунаправленная шина. Поэтому хотел вешать на эти выводы МК.
......aлкоголь расширяет сосуды, курение их сужает, а сдают почему-то нервы......
clawham
Поставщик валерьянки для Кота
Сообщения: 1957
Зарегистрирован: Пт окт 31, 2008 09:38:55
Откуда: Одесса
Контактная информация:

Сообщение clawham »

Обоснуйте пожалуйста почему вы выбрали ПИК контроллер если он обладает проблемами с компиляторами и отсутствием многих шин, малой памятью и так далее если даже не представляете даже как и что значит в даташите
Я например при написании программ под мегу 16 вообще в даташит заглянул только один раз - узнать какие фьюзы надо ставить для 16-ти мегагерц и какие кондеры нужны :)
большего мне и не потребовалось знать - всё нужное я нашел в генераторе начального кода замечательнейшего компилятора CodeVisionAVR ну и конечно же - в протеусе!!!
Аватара пользователя
Pooher
Мучитель микросхем
Сообщения: 491
Зарегистрирован: Вс янв 07, 2007 01:45:48
Откуда: Российская Федерация, будь она неладна...

Сообщение Pooher »

Dexa писал(а):Да я наговорил глупостей. Могу я подключить например к АЦП пика и как программно описать это? 1-Ware - двунаправленная шина. Поэтому хотел вешать на эти выводы МК.

Протокол 1-wire можно реализовать на ЛЮБОЙ линии ввода-вывода.
Научить нельзя, можно научиться. Пифагор.
Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
Аватара пользователя
sachok
Опытный кот
Сообщения: 849
Зарегистрирован: Сб янв 05, 2008 11:05:15
Откуда: Україна м.Луцьк
Контактная информация:

Сообщение sachok »

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

ds18b20_init(0,0,60,DS18B20_9BIT_RES);

Посмотрите я правильно делаю настройку датчика если он 1.? И ещё проводить эту настройку нужно каждый раз перед измерением температуры или можно 1 раз в основном теле программы(

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

void main (void)
).?
Я не Сашок!!!
clawham
Поставщик валерьянки для Кота
Сообщения: 1957
Зарегистрирован: Пт окт 31, 2008 09:38:55
Откуда: Одесса
Контактная информация:

Сообщение clawham »

Вобще-то вродебы правильно но в принципе этого делать не нужно если только мерить ибо сама Дс18Б20 по умолчанию с завода настроена на 12 бит и при перепрограммировании она настройки помнит и разрешение и границы верхнего и нижнего пределов
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»