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

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Аватара пользователя
delay
Нашел транзистор. Понюхал.
Сообщения: 173
Зарегистрирован: Чт мар 20, 2008 20:33:43
Контактная информация:

Сообщение delay »

У меня плавали показания у 2-х датчиков. Вопрос решился заменой.
RoTToR
Открыл глаза
Сообщения: 73
Зарегистрирован: Вс июн 07, 2009 23:16:16
Контактная информация:

Сообщение RoTToR »

Снял датчик 18В20 с подобного исправно работающего термометра, установил на свой, эффект тот же.. показания пляшут как и плясали.. Кстати прога написана на CVAVR 1.25.6 Standart с применением всех родных библиотек.
Где еще может быть косяк ?
clawham
Поставщик валерьянки для Кота
Сообщения: 1957
Зарегистрирован: Пт окт 31, 2008 09:38:55
Откуда: Одесса
Контактная информация:

Сообщение clawham »

А не дадите ли исходничек того как Вы опрашиваете термометр?
Вложения
034.rar
Видео как у меня работают термометры
первый и 3-й стоят в комнате 2 и 4-й = на улице
скорость 2 раза в секунду
(281.56 КБ) 250 скачиваний
RoTToR
Открыл глаза
Сообщения: 73
Зарегистрирован: Вс июн 07, 2009 23:16:16
Контактная информация:

Сообщение RoTToR »

Да.. пожалуйста.


Как это у Вас получается опросить датчик два раза в секунду в 12 битном режиме ??? если по даташиту у него преобразование 750 мс ..
Вложения
main.c
main.c
(7.59 КБ) 497 скачиваний
clawham
Поставщик валерьянки для Кота
Сообщения: 1957
Зарегистрирован: Пт окт 31, 2008 09:38:55
Откуда: Одесса
Контактная информация:

Сообщение clawham »

ну вопервых нельзя запрещать прерывания на функцию ds18b20_temperature(&rom_codes[0][0])*10;

во вторых где инициализация(ну хоть раз в жизни проги) самого термометра?

ds18b20_temperature - эта функция посылает устройству с заданным адресом комманду - начать конвертацию температуры, потом ждёт 750 милисекунд и читает из него данные, поэтому апрет прерываний на целую секунду считаю неоправданным, просто перед выводом нужно проверить правильно ли прочиталась температура и если не правильно - то не изменять выводимое число.

если и это не поможет - попробуйте временно вырубить индикацию и прерывания и соберите мегу + 1 термометр в протеусе и присоедините к выводам сом порта виртуальный терминал а в программе вместо вывода на экран - пишите в уарт через
printf("t%u(%i)= %f \n\r",i+1, rom_codes[i], ds_temp);
вот так например только ds_temp - это Ваша переменная temperature
ну и посмотрите чтоб в уарте было нормально тогда если в уарте лажа тоже - значиться чтото с термометром а если в порядке - значить в обработке вывода на экран лажа

П.С.
Как получается? Очень просто - 750 милисекунд это время для замера температуры в -50 градусов. термометр этот не адц и термоэлемент а два таймера один термонезависимый(типа) а второй сильно-линейно-термо-зависимый! вот и получается что пока первый досчитает до 100(ну например) - второй может и разу не считнуть = -50 а если досчитает 100 -> температура = +125 :) ну в общих чертах так...но не стоит забывать что и первый таймер до 100 может сосчитать и за 420 милисекунд(у ВСЕХ 5-ти экземплярах присланных как СЭМПЛЫ из америки) и за 510 милисекунд(при температуре +20 у экземпляра купленного за 10 доларов в местном радиомагазине) .... так что это просто практика. а 750 это сказано было чтоб "наверняка" успели таймера позаканчивать счёт.
Если интересует мой исходник - могу выкинуть - там много чего интересного вкусного навалено
RoTToR
Открыл глаза
Сообщения: 73
Зарегистрирован: Вс июн 07, 2009 23:16:16
Контактная информация:

Сообщение RoTToR »

С запретом прерываний это я экспериментировал :).
Что значит инициализация термометра ??? т.е. ds18b20_init(&rom_codes[0][0],20,30,DS18B20_12BIT_RES); ??

С USART я вообще не знаком.. так что не думаю что сходу получится проверить с выводом значений в терменал...
RoTToR
Открыл глаза
Сообщения: 73
Зарегистрирован: Вс июн 07, 2009 23:16:16
Контактная информация:

Сообщение RoTToR »

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

Сообщение clawham »

Инициализация это именно то что Вы переспросили - вроде можно делать вроде можно и не делать :) я делаю хотя в Дске есть ЕЕПРОМ ну да ладно

Теперь по поводу УАРТ - всё супер просто
Протеус у Вас есть? Если нету - Срочно обзаведитесь
прикрепил Вам дизайник для протеуса - там же можете понарисовывать динамическую индикацию и т.д. - для первичной отладки незаменимая весч

а в коде проги после

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

// Timer(s)/Counter(s) Interrupt(s) initialization
//TIMSK=0x05;
TIMSK=0x01;


вставьте это-

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

// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: Off
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=0x00;
UCSRB=0x08;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x19;


и потом после функции чтения температуры -

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

i=0; // так как у вас один термометр с номером 0 в массиве адресов
printf("t%u(%i)= %f \n\r",i+1, rom_codes[i], temperature);

получите в окошке терминала температуру и серийный номер термометра :)
Вложения
prog.rar
Подправленный исходничек - убран глюк с ком-портом(вроде - 3 дня полёт нормальный ) ну и так по мелочи оптимизировано
(10.15 КБ) 240 скачиваний
prog.rar
Мой исходничек - наверное сложно бует разобраться но...уж извините...тут есть практически всё для начинающего
(9.26 КБ) 246 скачиваний
.rar
дизайн для протеуса - зайдите в свойства МК и покажите Вашу прошивку - результат компилации хекс или кофф(но лучне хекс)
(10.83 КБ) 221 скачивание
Последний раз редактировалось clawham Вс июн 14, 2009 21:54:17, всего редактировалось 1 раз.
Аватара пользователя
sachok
Опытный кот
Сообщения: 849
Зарегистрирован: Сб янв 05, 2008 11:05:15
Откуда: Україна м.Луцьк
Контактная информация:

Сообщение sachok »

RoTToR писал(а):Как это у Вас получается опросить датчик два раза в секунду в 12 битном режиме ??? если по даташиту у него преобразование 750 мс ..

Если я не ошибаюсь и правильно понял библиотеку ds18b20.lib то там используются программные задержки для преобразования температуры и для 12 бит результата это 800мс.
Я не Сашок!!!
clawham
Поставщик валерьянки для Кота
Сообщения: 1957
Зарегистрирован: Пт окт 31, 2008 09:38:55
Откуда: Одесса
Контактная информация:

Сообщение clawham »

Именно!
Либа сделана так чтоб любой даже бракованный термометр закончил преобразование
А я практически не использую либу
Мне бы научиться читать скретчпад(что сейчас делает именно либа) и я отвяжусь полностью от конкретных термометров и ещё пары устройств.
Просто писать свою библиотеку 1wire как то не хочется - всётаки оно уже есть и написано умными людьми. Надо только разобраться как оно работает и где я косячу при попытке читать из ДС-ки

А по теме - дак Вы сами видите видео :) и исходник у Вас на руках
Так что это возможно - 4 датчика 2 раза в секунду опрашивать :)
Вложения
035.rar
Вот ещё для наглядности видик
(283.5 КБ) 200 скачиваний
RoTToR
Открыл глаза
Сообщения: 73
Зарегистрирован: Вс июн 07, 2009 23:16:16
Контактная информация:

Сообщение RoTToR »

В протеусе, в терменалке вижу t0(356)= и все, без значений температуры..
clawham
Поставщик валерьянки для Кота
Сообщения: 1957
Зарегистрирован: Пт окт 31, 2008 09:38:55
Откуда: Одесса
Контактная информация:

Сообщение clawham »

а почему именно

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

ds18b20_temperature(&rom_codes[0][0])*10;

а не как в документации

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

ds18b20_temperature(&rom_codes[0][0])


не понимаю почему может не работать и зачем умножать на 10

попробуйте написать

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

printf("t%u(%i)= %f \n\r",i+1, rom_codes[i], ds18b20_temperature(&rom_codes[0][0]));

если отработает - значиться чтото с компилятором я тоже как-то с проблемами с переменными сталкивался изза криво крякнутого КодВижна...
RoTToR
Открыл глаза
Сообщения: 73
Зарегистрирован: Вс июн 07, 2009 23:16:16
Контактная информация:

Сообщение RoTToR »

clawham писал(а):а почему именно

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

ds18b20_temperature(&rom_codes[0][0])*10;

а не как в документации

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

ds18b20_temperature(&rom_codes[0][0])


не понимаю почему может не работать и зачем умножать на 10

попробуйте написать

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

printf("t%u(%i)= %f \n\r",i+1, rom_codes[i], ds18b20_temperature(&rom_codes[0][0]));

если отработает - значиться чтото с компилятором я тоже как-то с проблемами с переменными сталкивался изза криво крякнутого КодВижна...


Есть у меня 18В20.h который возвращает температуры в int , так вот его не нужно было множить на 10, но решил попробовать родной 18В20.h, а он возвращает температуру в float, и почему то в 10 раз меньшуюю. потому и множил на 10.


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

Сообщение clawham »

Ой..сорри ... эт я не подумал - у Вас наверное в настройках проекта в функциях принтФ есть только инт и ленгхт
там надо поставить флоат...в общем самый нижний вариант
RoTToR
Открыл глаза
Сообщения: 73
Зарегистрирован: Вс июн 07, 2009 23:16:16
Контактная информация:

Сообщение RoTToR »

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

Сообщение clawham »

Ну вот теперь дело за малым - доделать процедуру вывода :)
классика жанра - округлить 23.0625 до 23 а потом сделать целочисленное деление на 10 и это будут десятки для вывода а если сделать остаток от деления на 10 - получим единицы для вывода, завести 2 переменные глобальные чаровские и в вечном цикле получения температуры разбивать полученный очередной флоат на 2 переменные глобальные а по прерыванию переполнения таймера - выводить циферки на 7сегм дисплюйчик :) - с этим увы не помогу - не делал не пробывал и не разбирался...увы...мне лсд 3310 ближе....хотя в ближайшем будущем если научусь рисовать платки на лазернике - сделаю для меги 8 с 7-сегм индикатором термометр-термостат-таймер и т.д. для управления термоспотом...но не думаю что это будет скоро
RoTToR
Открыл глаза
Сообщения: 73
Зарегистрирован: Вс июн 07, 2009 23:16:16
Контактная информация:

Сообщение RoTToR »

Неохота переделывать процедуру вывода на дисплейчик, много чего под эту процедуру написано.
Да и проверял я её только что (процедуру вывода на дисплей), загонял место значений температуры число в float 0xXXX, работает без проблем.
Это раз.
А второе, эта проуедура вывода на дисплейчик уже года два трудится на другом термометре (на тиньке 2313), и тоже без замеченный..
А где я набокапорил при переносе програмки с Тиньки на Мегу8 буду дальше смотреть.
Вложения
-0015_1.rar
Верхний термометр поверен в петрологической лаборатории, а нижний - это тот, который я мучаю. Посмотрите как на нижнем скачет температура.:(
(215.28 КБ) 188 скачиваний
clawham
Поставщик валерьянки для Кота
Сообщения: 1957
Зарегистрирован: Пт окт 31, 2008 09:38:55
Откуда: Одесса
Контактная информация:

Сообщение clawham »

а Вы зарисуйте подключение 7-мисегментников в протеусе :) и если там не будет скакать - значить чтото с железом :)
а вот если будет прыгать и в протеусе.....

ну и ещё вариант - терминал-то у вас запущен - дык воткните rx ножку мк в кои порт через максу - чисто ради експерименту :)
если в терминале будет тоже плыгать(всмысле в реальной схеме) то чтото с термометром или его питанием
RoTToR
Открыл глаза
Сообщения: 73
Зарегистрирован: Вс июн 07, 2009 23:16:16
Контактная информация:

Сообщение RoTToR »

Я в протеусе с самого начала все набрасывал. прежде чем собрать в железе, так вот в протеусе вообще не отображается младший разряд (просто не показывает). Я подумал что это издержки умулирования динамической индикации и собрал всё в железе.

А можно по подробней, как железо подключить к компорту ???
TXD ножку контролера цепляем напряму или через что-то на TX(3) RS-232, ну землю кидаем общую???.
clawham
Поставщик валерьянки для Кота
Сообщения: 1957
Зарегистрирован: Пт окт 31, 2008 09:38:55
Откуда: Одесса
Контактная информация:

Сообщение clawham »

Есть микруха - МАХ 232 и её аналоги
у неё 4 драйвера - 2 из компорта в +5 переводятся и 2 из +5В переводятся в +-12
Вам нужно только передавать из МК и не принимать от компьютера ->
необходимо ножку TXD Микроконтроллера кинуть на ногу 11 макса а с ноги 14 макса - в ножку 2 ком порта а массу кинуть на 5-й
Ну да...максимке нужно ещё 4 кандёра для накачкиразности напряжений :) вот и всё а если захотите и принимать по ком порту в МК - надо с ноги 3 ком порта кинуть линию на 13 ногу макса а с 12 ноги макса - кинуть на RXD Микроконтроллера ну и настроить УАРТ vrirb на приём и желательно - буферизированно через прерывание - в мастере начального кода очень даже легитимная версия такой организации ком порта сделана
А на компьютере просматривать что шлёт МК можно очень даже просто - через гипертерминал - только ком порт выбрать правильный и скорость ;)
Закрыто

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