Вопросы по работе с термометрами DS18B20
-
clawham
- Поставщик валерьянки для Кота
- Сообщения: 1957
- Зарегистрирован: Пт окт 31, 2008 09:38:55
- Откуда: Одесса
- Контактная информация:
А не дадите ли исходничек того как Вы опрашиваете термометр?
- Вложения
-
- 034.rar
- Видео как у меня работают термометры
первый и 3-й стоят в комнате 2 и 4-й = на улице
скорость 2 раза в секунду - (281.56 КБ) 250 скачиваний
Да.. пожалуйста.
Как это у Вас получается опросить датчик два раза в секунду в 12 битном режиме ??? если по даташиту у него преобразование 750 мс ..
Как это у Вас получается опросить датчик два раза в секунду в 12 битном режиме ??? если по даташиту у него преобразование 750 мс ..
- Вложения
-
- main.c
- main.c
- (7.59 КБ) 497 скачиваний
-
clawham
- Поставщик валерьянки для Кота
- Сообщения: 1957
- Зарегистрирован: Пт окт 31, 2008 09:38:55
- Откуда: Одесса
- Контактная информация:
ну вопервых нельзя запрещать прерывания на функцию 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 это сказано было чтоб "наверняка" успели таймера позаканчивать счёт.
Если интересует мой исходник - могу выкинуть - там много чего интересного вкусного навалено
во вторых где инициализация(ну хоть раз в жизни проги) самого термометра?
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
Если интересует мой исходник - могу выкинуть - там много чего интересного вкусного навалено
-
clawham
- Поставщик валерьянки для Кота
- Сообщения: 1957
- Зарегистрирован: Пт окт 31, 2008 09:38:55
- Откуда: Одесса
- Контактная информация:
Инициализация это именно то что Вы переспросили - вроде можно делать вроде можно и не делать
я делаю хотя в Дске есть ЕЕПРОМ ну да ладно
Теперь по поводу УАРТ - всё супер просто
Протеус у Вас есть? Если нету - Срочно обзаведитесь
прикрепил Вам дизайник для протеуса - там же можете понарисовывать динамическую индикацию и т.д. - для первичной отладки незаменимая весч
а в коде проги после
вставьте это-
и потом после функции чтения температуры -
получите в окошке терминала температуру и серийный номер термометра
Теперь по поводу УАРТ - всё супер просто
Протеус у Вас есть? Если нету - Срочно обзаведитесь
прикрепил Вам дизайник для протеуса - там же можете понарисовывать динамическую индикацию и т.д. - для первичной отладки незаменимая весч
а в коде проги после
Код: Выделить всё
// 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
- Откуда: Україна м.Луцьк
- Контактная информация:
RoTToR писал(а):Как это у Вас получается опросить датчик два раза в секунду в 12 битном режиме ??? если по даташиту у него преобразование 750 мс ..
Если я не ошибаюсь и правильно понял библиотеку ds18b20.lib то там используются программные задержки для преобразования температуры и для 12 бит результата это 800мс.
Я не Сашок!!!
-
clawham
- Поставщик валерьянки для Кота
- Сообщения: 1957
- Зарегистрирован: Пт окт 31, 2008 09:38:55
- Откуда: Одесса
- Контактная информация:
Именно!
Либа сделана так чтоб любой даже бракованный термометр закончил преобразование
А я практически не использую либу
Мне бы научиться читать скретчпад(что сейчас делает именно либа) и я отвяжусь полностью от конкретных термометров и ещё пары устройств.
Просто писать свою библиотеку 1wire как то не хочется - всётаки оно уже есть и написано умными людьми. Надо только разобраться как оно работает и где я косячу при попытке читать из ДС-ки
А по теме - дак Вы сами видите видео
и исходник у Вас на руках
Так что это возможно - 4 датчика 2 раза в секунду опрашивать
Либа сделана так чтоб любой даже бракованный термометр закончил преобразование
А я практически не использую либу
Мне бы научиться читать скретчпад(что сейчас делает именно либа) и я отвяжусь полностью от конкретных термометров и ещё пары устройств.
Просто писать свою библиотеку 1wire как то не хочется - всётаки оно уже есть и написано умными людьми. Надо только разобраться как оно работает и где я косячу при попытке читать из ДС-ки
А по теме - дак Вы сами видите видео
Так что это возможно - 4 датчика 2 раза в секунду опрашивать
- Вложения
-
- 035.rar
- Вот ещё для наглядности видик
- (283.5 КБ) 200 скачиваний
-
clawham
- Поставщик валерьянки для Кота
- Сообщения: 1957
- Зарегистрирован: Пт окт 31, 2008 09:38:55
- Откуда: Одесса
- Контактная информация:
а почему именно
а не как в документации
не понимаю почему может не работать и зачем умножать на 10
попробуйте написать
если отработает - значиться чтото с компилятором я тоже как-то с проблемами с переменными сталкивался изза криво крякнутого КодВижна...
Код: Выделить всё
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]));
если отработает - значиться чтото с компилятором я тоже как-то с проблемами с переменными сталкивался изза криво крякнутого КодВижна...
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
- Откуда: Одесса
- Контактная информация:
Ну вот теперь дело за малым - доделать процедуру вывода
классика жанра - округлить 23.0625 до 23 а потом сделать целочисленное деление на 10 и это будут десятки для вывода а если сделать остаток от деления на 10 - получим единицы для вывода, завести 2 переменные глобальные чаровские и в вечном цикле получения температуры разбивать полученный очередной флоат на 2 переменные глобальные а по прерыванию переполнения таймера - выводить циферки на 7сегм дисплюйчик
- с этим увы не помогу - не делал не пробывал и не разбирался...увы...мне лсд 3310 ближе....хотя в ближайшем будущем если научусь рисовать платки на лазернике - сделаю для меги 8 с 7-сегм индикатором термометр-термостат-таймер и т.д. для управления термоспотом...но не думаю что это будет скоро
классика жанра - округлить 23.0625 до 23 а потом сделать целочисленное деление на 10 и это будут десятки для вывода а если сделать остаток от деления на 10 - получим единицы для вывода, завести 2 переменные глобальные чаровские и в вечном цикле получения температуры разбивать полученный очередной флоат на 2 переменные глобальные а по прерыванию переполнения таймера - выводить циферки на 7сегм дисплюйчик
Неохота переделывать процедуру вывода на дисплейчик, много чего под эту процедуру написано.
Да и проверял я её только что (процедуру вывода на дисплей), загонял место значений температуры число в float 0xXXX, работает без проблем.
Это раз.
А второе, эта проуедура вывода на дисплейчик уже года два трудится на другом термометре (на тиньке 2313), и тоже без замеченный..
А где я набокапорил при переносе програмки с Тиньки на Мегу8 буду дальше смотреть.
Да и проверял я её только что (процедуру вывода на дисплей), загонял место значений температуры число в float 0xXXX, работает без проблем.
Это раз.
А второе, эта проуедура вывода на дисплейчик уже года два трудится на другом термометре (на тиньке 2313), и тоже без замеченный..
А где я набокапорил при переносе програмки с Тиньки на Мегу8 буду дальше смотреть.
- Вложения
-
- -0015_1.rar
- Верхний термометр поверен в петрологической лаборатории, а нижний - это тот, который я мучаю. Посмотрите как на нижнем скачет температура.:(
- (215.28 КБ) 188 скачиваний
-
clawham
- Поставщик валерьянки для Кота
- Сообщения: 1957
- Зарегистрирован: Пт окт 31, 2008 09:38:55
- Откуда: Одесса
- Контактная информация:
а Вы зарисуйте подключение 7-мисегментников в протеусе
и если там не будет скакать - значить чтото с железом
а вот если будет прыгать и в протеусе.....
ну и ещё вариант - терминал-то у вас запущен - дык воткните rx ножку мк в кои порт через максу - чисто ради експерименту
если в терминале будет тоже плыгать(всмысле в реальной схеме) то чтото с термометром или его питанием
а вот если будет прыгать и в протеусе.....
ну и ещё вариант - терминал-то у вас запущен - дык воткните rx ножку мк в кои порт через максу - чисто ради експерименту
если в терминале будет тоже плыгать(всмысле в реальной схеме) то чтото с термометром или его питанием
Я в протеусе с самого начала все набрасывал. прежде чем собрать в железе, так вот в протеусе вообще не отображается младший разряд (просто не показывает). Я подумал что это издержки умулирования динамической индикации и собрал всё в железе.
А можно по подробней, как железо подключить к компорту ???
TXD ножку контролера цепляем напряму или через что-то на TX(3) RS-232, ну землю кидаем общую???.
А можно по подробней, как железо подключить к компорту ???
TXD ножку контролера цепляем напряму или через что-то на TX(3) RS-232, ну землю кидаем общую???.
-
clawham
- Поставщик валерьянки для Кота
- Сообщения: 1957
- Зарегистрирован: Пт окт 31, 2008 09:38:55
- Откуда: Одесса
- Контактная информация:
Есть микруха - МАХ 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 кандёра для накачкиразности напряжений
А на компьютере просматривать что шлёт МК можно очень даже просто - через гипертерминал - только ком порт выбрать правильный и скорость