Вопросы по работе с термометрами DS18B20
- Сообщения: 173
- Зарегистрирован: Чт мар 20, 2008 20:33:43
У меня плавали показания у 2-х датчиков. Вопрос решился заменой.
- Реклама
- Сообщения: 73
- Зарегистрирован: Вс июн 07, 2009 23:16:16
Снял датчик 18В20 с подобного исправно работающего термометра, установил на свой, эффект тот же.. показания пляшут как и плясали.. Кстати прога написана на CVAVR 1.25.6 Standart с применением всех родных библиотек.
Где еще может быть косяк ?
Где еще может быть косяк ?
А не дадите ли исходничек того как Вы опрашиваете термометр?
- Вложения
-
- 034.rar
- Видео как у меня работают термометры
первый и 3-й стоят в комнате 2 и 4-й = на улице
скорость 2 раза в секунду - (281.56 КБ) 255 скачиваний
ну вопервых нельзя запрещать прерывания на функцию ds18b20_temperature(&rom_codes[0][0])*10;
во вторых где инициализация(ну хоть раз в жизни проги) самого термометра?
ds18b20_temperature - эта функция посылает устройству с заданным адресом комманду - начать конвертацию температуры, потом ждёт 750 милисекунд и читает из него данные, поэтому апрет прерываний на целую секунду считаю неоправданным, просто перед выводом нужно проверить правильно ли прочиталась температура и если не правильно - то не изменять выводимое число.
если и это не поможет - попробуйте временно вырубить индикацию и прерывания и соберите мегу + 1 термометр в протеусе и присоедините к выводам сом порта виртуальный терминал а в программе вместо вывода на экран - пишите в уарт через
printf("t%u(%i)= %f \n\r",i+1, rom_codes, ds_temp);
вот так например только ds_temp - это Ваша переменная temperature
ну и посмотрите чтоб в уарте было нормально тогда если в уарте лажа тоже - значиться чтото с термометром а если в порядке - значить в обработке вывода на экран лажа
П.С.
Как получается? Очень просто - 750 милисекунд это время для замера температуры в -50 градусов. термометр этот не адц и термоэлемент а два таймера один термонезависимый(типа) а второй сильно-линейно-термо-зависимый! вот и получается что пока первый досчитает до 100(ну например) - второй может и разу не считнуть = -50 а если досчитает 100 -> температура = +125
ну в общих чертах так...но не стоит забывать что и первый таймер до 100 может сосчитать и за 420 милисекунд(у ВСЕХ 5-ти экземплярах присланных как СЭМПЛЫ из америки) и за 510 милисекунд(при температуре +20 у экземпляра купленного за 10 доларов в местном радиомагазине) .... так что это просто практика. а 750 это сказано было чтоб "наверняка" успели таймера позаканчивать счёт.
Если интересует мой исходник - могу выкинуть - там много чего интересного вкусного навалено
во вторых где инициализация(ну хоть раз в жизни проги) самого термометра?
ds18b20_temperature - эта функция посылает устройству с заданным адресом комманду - начать конвертацию температуры, потом ждёт 750 милисекунд и читает из него данные, поэтому апрет прерываний на целую секунду считаю неоправданным, просто перед выводом нужно проверить правильно ли прочиталась температура и если не правильно - то не изменять выводимое число.
если и это не поможет - попробуйте временно вырубить индикацию и прерывания и соберите мегу + 1 термометр в протеусе и присоедините к выводам сом порта виртуальный терминал а в программе вместо вывода на экран - пишите в уарт через
printf("t%u(%i)= %f \n\r",i+1, rom_codes, ds_temp);
вот так например только ds_temp - это Ваша переменная temperature
ну и посмотрите чтоб в уарте было нормально тогда если в уарте лажа тоже - значиться чтото с термометром а если в порядке - значить в обработке вывода на экран лажа
П.С.
Как получается? Очень просто - 750 милисекунд это время для замера температуры в -50 градусов. термометр этот не адц и термоэлемент а два таймера один термонезависимый(типа) а второй сильно-линейно-термо-зависимый! вот и получается что пока первый досчитает до 100(ну например) - второй может и разу не считнуть = -50 а если досчитает 100 -> температура = +125
Если интересует мой исходник - могу выкинуть - там много чего интересного вкусного навалено
- Реклама
- Сообщения: 73
- Зарегистрирован: Вс июн 07, 2009 23:16:16
С запретом прерываний это я экспериментировал
.
Что значит инициализация термометра ??? т.е. ds18b20_init(&rom_codes[0][0],20,30,DS18B20_12BIT_RES); ??
С USART я вообще не знаком.. так что не думаю что сходу получится проверить с выводом значений в терменал...
Что значит инициализация термометра ??? т.е. ds18b20_init(&rom_codes[0][0],20,30,DS18B20_12BIT_RES); ??
С USART я вообще не знаком.. так что не думаю что сходу получится проверить с выводом значений в терменал...
- Сообщения: 73
- Зарегистрирован: Вс июн 07, 2009 23:16:16
Да.. Очень интересно Ваш исходник глянуть..
П.С. На сегодня спокойной ночи!! завтра на работу. Спасибо за советы..
П.С. На сегодня спокойной ночи!! завтра на работу. Спасибо за советы..
Инициализация это именно то что Вы переспросили - вроде можно делать вроде можно и не делать
я делаю хотя в Дске есть ЕЕПРОМ ну да ладно
Теперь по поводу УАРТ - всё супер просто
Протеус у Вас есть? Если нету - Срочно обзаведитесь
прикрепил Вам дизайник для протеуса - там же можете понарисовывать динамическую индикацию и т.д. - для первичной отладки незаменимая весч
а в коде проги после
вставьте это-
и потом после функции чтения температуры -
получите в окошке терминала температуру и серийный номер термометра 
Теперь по поводу УАРТ - всё супер просто
Протеус у Вас есть? Если нету - Срочно обзаведитесь
прикрепил Вам дизайник для протеуса - там же можете понарисовывать динамическую индикацию и т.д. - для первичной отладки незаменимая весч
а в коде проги после
Код: Выделить всё
// 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 КБ) 244 скачивания
-
- prog.rar
- Мой исходничек - наверное сложно бует разобраться но...уж извините...тут есть практически всё для начинающего
- (9.26 КБ) 249 скачиваний
-
- .rar
- дизайн для протеуса - зайдите в свойства МК и покажите Вашу прошивку - результат компилации хекс или кофф(но лучне хекс)
- (10.83 КБ) 223 скачивания
Последний раз редактировалось clawham Вс июн 14, 2009 21:54:17, всего редактировалось 1 раз.
Если я не ошибаюсь и правильно понял библиотеку ds18b20.lib то там используются программные задержки для преобразования температуры и для 12 бит результата это 800мс.RoTToR писал(а): Как это у Вас получается опросить датчик два раза в секунду в 12 битном режиме ??? если по даташиту у него преобразование 750 мс ..
Я не Сашок!!!
Именно!
Либа сделана так чтоб любой даже бракованный термометр закончил преобразование
А я практически не использую либу
Мне бы научиться читать скретчпад(что сейчас делает именно либа) и я отвяжусь полностью от конкретных термометров и ещё пары устройств.
Просто писать свою библиотеку 1wire как то не хочется - всётаки оно уже есть и написано умными людьми. Надо только разобраться как оно работает и где я косячу при попытке читать из ДС-ки
А по теме - дак Вы сами видите видео
и исходник у Вас на руках
Так что это возможно - 4 датчика 2 раза в секунду опрашивать
Либа сделана так чтоб любой даже бракованный термометр закончил преобразование
А я практически не использую либу
Мне бы научиться читать скретчпад(что сейчас делает именно либа) и я отвяжусь полностью от конкретных термометров и ещё пары устройств.
Просто писать свою библиотеку 1wire как то не хочется - всётаки оно уже есть и написано умными людьми. Надо только разобраться как оно работает и где я косячу при попытке читать из ДС-ки
А по теме - дак Вы сами видите видео
Так что это возможно - 4 датчика 2 раза в секунду опрашивать
- Вложения
-
- 035.rar
- Вот ещё для наглядности видик
- (283.5 КБ) 203 скачивания
- Сообщения: 73
- Зарегистрирован: Вс июн 07, 2009 23:16:16
В протеусе, в терменалке вижу t0(356)= и все, без значений температуры..
а почему именно
а не как в документации
не понимаю почему может не работать и зачем умножать на 10
попробуйте написать
если отработает - значиться чтото с компилятором я тоже как-то с проблемами с переменными сталкивался изза криво крякнутого КодВижна...
Код: Выделить всё
ds18b20_temperature(&rom_codes[0][0])*10;
Код: Выделить всё
ds18b20_temperature(&rom_codes[0][0])
попробуйте написать
Код: Выделить всё
printf("t%u(%i)= %f \n\r",i+1, rom_codes[i], ds18b20_temperature(&rom_codes[0][0]));
- Сообщения: 73
- Зарегистрирован: Вс июн 07, 2009 23:16:16
Есть у меня 18В20.h который возвращает температуры в int , так вот его не нужно было множить на 10, но решил попробовать родной 18В20.h, а он возвращает температуру в float, и почему то в 10 раз меньшуюю. потому и множил на 10.clawham писал(а):а почему именноа не как в документацииКод: Выделить всё
ds18b20_temperature(&rom_codes[0][0])*10;не понимаю почему может не работать и зачем умножать на 10Код: Выделить всё
ds18b20_temperature(&rom_codes[0][0])
попробуйте написать
если отработает - значиться чтото с компилятором я тоже как-то с проблемами с переменными сталкивался изза криво крякнутого КодВижна...Код: Выделить всё
printf("t%u(%i)= %f \n\r",i+1, rom_codes[i], ds18b20_temperature(&rom_codes[0][0]));
Написал, тоже самое..
Ой..сорри ... эт я не подумал - у Вас наверное в настройках проекта в функциях принтФ есть только инт и ленгхт
там надо поставить флоат...в общем самый нижний вариант
там надо поставить флоат...в общем самый нижний вариант
- Сообщения: 73
- Зарегистрирован: Вс июн 07, 2009 23:16:16
Заработал терминал, идет стабильно показания температуры, никто никуда не скачет 
Ну вот теперь дело за малым - доделать процедуру вывода 
классика жанра - округлить 23.0625 до 23 а потом сделать целочисленное деление на 10 и это будут десятки для вывода а если сделать остаток от деления на 10 - получим единицы для вывода, завести 2 переменные глобальные чаровские и в вечном цикле получения температуры разбивать полученный очередной флоат на 2 переменные глобальные а по прерыванию переполнения таймера - выводить циферки на 7сегм дисплюйчик
- с этим увы не помогу - не делал не пробывал и не разбирался...увы...мне лсд 3310 ближе....хотя в ближайшем будущем если научусь рисовать платки на лазернике - сделаю для меги 8 с 7-сегм индикатором термометр-термостат-таймер и т.д. для управления термоспотом...но не думаю что это будет скоро
классика жанра - округлить 23.0625 до 23 а потом сделать целочисленное деление на 10 и это будут десятки для вывода а если сделать остаток от деления на 10 - получим единицы для вывода, завести 2 переменные глобальные чаровские и в вечном цикле получения температуры разбивать полученный очередной флоат на 2 переменные глобальные а по прерыванию переполнения таймера - выводить циферки на 7сегм дисплюйчик
- Сообщения: 73
- Зарегистрирован: Вс июн 07, 2009 23:16:16
Неохота переделывать процедуру вывода на дисплейчик, много чего под эту процедуру написано.
Да и проверял я её только что (процедуру вывода на дисплей), загонял место значений температуры число в float 0xXXX, работает без проблем.
Это раз.
А второе, эта проуедура вывода на дисплейчик уже года два трудится на другом термометре (на тиньке 2313), и тоже без замеченный..
А где я набокапорил при переносе програмки с Тиньки на Мегу8 буду дальше смотреть.
Да и проверял я её только что (процедуру вывода на дисплей), загонял место значений температуры число в float 0xXXX, работает без проблем.
Это раз.
А второе, эта проуедура вывода на дисплейчик уже года два трудится на другом термометре (на тиньке 2313), и тоже без замеченный..
А где я набокапорил при переносе програмки с Тиньки на Мегу8 буду дальше смотреть.
- Вложения
-
- -0015_1.rar
- Верхний термометр поверен в петрологической лаборатории, а нижний - это тот, который я мучаю. Посмотрите как на нижнем скачет температура.:(
- (215.28 КБ) 191 скачивание
а Вы зарисуйте подключение 7-мисегментников в протеусе
и если там не будет скакать - значить чтото с железом 
а вот если будет прыгать и в протеусе.....
ну и ещё вариант - терминал-то у вас запущен - дык воткните rx ножку мк в кои порт через максу - чисто ради експерименту
если в терминале будет тоже плыгать(всмысле в реальной схеме) то чтото с термометром или его питанием
а вот если будет прыгать и в протеусе.....
ну и ещё вариант - терминал-то у вас запущен - дык воткните rx ножку мк в кои порт через максу - чисто ради експерименту
если в терминале будет тоже плыгать(всмысле в реальной схеме) то чтото с термометром или его питанием
- Сообщения: 73
- Зарегистрирован: Вс июн 07, 2009 23:16:16
Я в протеусе с самого начала все набрасывал. прежде чем собрать в железе, так вот в протеусе вообще не отображается младший разряд (просто не показывает). Я подумал что это издержки умулирования динамической индикации и собрал всё в железе.
А можно по подробней, как железо подключить к компорту ???
TXD ножку контролера цепляем напряму или через что-то на TX(3) RS-232, ну землю кидаем общую???.
А можно по подробней, как железо подключить к компорту ???
TXD ножку контролера цепляем напряму или через что-то на TX(3) RS-232, ну землю кидаем общую???.
Есть микруха - МАХ 232 и её аналоги
у неё 4 драйвера - 2 из компорта в +5 переводятся и 2 из +5В переводятся в +-12
Вам нужно только передавать из МК и не принимать от компьютера ->
необходимо ножку TXD Микроконтроллера кинуть на ногу 11 макса а с ноги 14 макса - в ножку 2 ком порта а массу кинуть на 5-й
Ну да...максимке нужно ещё 4 кандёра для накачкиразности напряжений
вот и всё а если захотите и принимать по ком порту в МК - надо с ноги 3 ком порта кинуть линию на 13 ногу макса а с 12 ноги макса - кинуть на RXD Микроконтроллера ну и настроить УАРТ vrirb на приём и желательно - буферизированно через прерывание - в мастере начального кода очень даже легитимная версия такой организации ком порта сделана
А на компьютере просматривать что шлёт МК можно очень даже просто - через гипертерминал - только ком порт выбрать правильный и скорость
у неё 4 драйвера - 2 из компорта в +5 переводятся и 2 из +5В переводятся в +-12
Вам нужно только передавать из МК и не принимать от компьютера ->
необходимо ножку TXD Микроконтроллера кинуть на ногу 11 макса а с ноги 14 макса - в ножку 2 ком порта а массу кинуть на 5-й
Ну да...максимке нужно ещё 4 кандёра для накачкиразности напряжений
А на компьютере просматривать что шлёт МК можно очень даже просто - через гипертерминал - только ком порт выбрать правильный и скорость


