Страница 10 из 16
Добавлено: Пн июн 08, 2009 08:35:56
delay
У меня плавали показания у 2-х датчиков. Вопрос решился заменой.
Добавлено: Вт июн 09, 2009 21:48:06
RoTToR
Снял датчик 18В20 с подобного исправно работающего термометра, установил на свой, эффект тот же.. показания пляшут как и плясали.. Кстати прога написана на CVAVR 1.25.6 Standart с применением всех родных библиотек.
Где еще может быть косяк ?
Добавлено: Вт июн 09, 2009 22:23:52
clawham
А не дадите ли исходничек того как Вы опрашиваете термометр?
Добавлено: Вт июн 09, 2009 22:46:36
RoTToR
Да.. пожалуйста.
Как это у Вас получается опросить датчик два раза в секунду в 12 битном режиме ??? если по даташиту у него преобразование 750 мс ..
Добавлено: Вт июн 09, 2009 23:12:14
clawham
ну вопервых нельзя запрещать прерывания на функцию 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 это сказано было чтоб "наверняка" успели таймера позаканчивать счёт.
Если интересует мой исходник - могу выкинуть - там много чего интересного вкусного навалено
Добавлено: Вт июн 09, 2009 23:33:43
RoTToR
С запретом прерываний это я экспериментировал

.
Что значит инициализация термометра ??? т.е. ds18b20_init(&rom_codes[0][0],20,30,DS18B20_12BIT_RES); ??
С USART я вообще не знаком.. так что не думаю что сходу получится проверить с выводом значений в терменал...
Добавлено: Вт июн 09, 2009 23:38:42
RoTToR
Да.. Очень интересно Ваш исходник глянуть..
П.С. На сегодня спокойной ночи!! завтра на работу. Спасибо за советы..
Добавлено: Вт июн 09, 2009 23:47:28
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);
получите в окошке терминала температуру и серийный номер термометра

Добавлено: Ср июн 10, 2009 08:24:38
sachok
RoTToR писал(а):
Как это у Вас получается опросить датчик два раза в секунду в 12 битном режиме ??? если по даташиту у него преобразование 750 мс ..
Если я не ошибаюсь и правильно понял библиотеку ds18b20.lib то там используются программные задержки для преобразования температуры и для 12 бит результата это 800мс.
Добавлено: Ср июн 10, 2009 11:17:00
clawham
Именно!
Либа сделана так чтоб любой даже бракованный термометр закончил преобразование
А я практически не использую либу
Мне бы научиться читать скретчпад(что сейчас делает именно либа) и я отвяжусь полностью от конкретных термометров и ещё пары устройств.
Просто писать свою библиотеку 1wire как то не хочется - всётаки оно уже есть и написано умными людьми. Надо только разобраться как оно работает и где я косячу при попытке читать из ДС-ки
А по теме - дак Вы сами видите видео

и исходник у Вас на руках
Так что это возможно - 4 датчика 2 раза в секунду опрашивать

Добавлено: Ср июн 10, 2009 18:02:09
RoTToR
В протеусе, в терменалке вижу t0(356)= и все, без значений температуры..
Добавлено: Ср июн 10, 2009 18:41:33
clawham
а почему именно
а не как в документации
не понимаю почему может не работать и зачем умножать на 10
попробуйте написать
Код: Выделить всё
printf("t%u(%i)= %f \n\r",i+1, rom_codes[i], ds18b20_temperature(&rom_codes[0][0]));
если отработает - значиться чтото с компилятором я тоже как-то с проблемами с переменными сталкивался изза криво крякнутого КодВижна...
Добавлено: Ср июн 10, 2009 19:05:40
RoTToR
clawham писал(а):а почему именно
а не как в документации
не понимаю почему может не работать и зачем умножать на 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.
Написал, тоже самое..
Добавлено: Ср июн 10, 2009 19:34:48
clawham
Ой..сорри ... эт я не подумал - у Вас наверное в настройках проекта в функциях принтФ есть только инт и ленгхт
там надо поставить флоат...в общем самый нижний вариант
Добавлено: Ср июн 10, 2009 20:00:24
RoTToR
Заработал терминал, идет стабильно показания температуры, никто никуда не скачет

Добавлено: Ср июн 10, 2009 20:33:36
clawham
Ну вот теперь дело за малым - доделать процедуру вывода

классика жанра - округлить 23.0625 до 23 а потом сделать целочисленное деление на 10 и это будут десятки для вывода а если сделать остаток от деления на 10 - получим единицы для вывода, завести 2 переменные глобальные чаровские и в вечном цикле получения температуры разбивать полученный очередной флоат на 2 переменные глобальные а по прерыванию переполнения таймера - выводить циферки на 7сегм дисплюйчик

- с этим увы не помогу - не делал не пробывал и не разбирался...увы...мне лсд 3310 ближе....хотя в ближайшем будущем если научусь рисовать платки на лазернике - сделаю для меги 8 с 7-сегм индикатором термометр-термостат-таймер и т.д. для управления термоспотом...но не думаю что это будет скоро
Добавлено: Ср июн 10, 2009 21:46:48
RoTToR
Неохота переделывать процедуру вывода на дисплейчик, много чего под эту процедуру написано.
Да и проверял я её только что (процедуру вывода на дисплей), загонял место значений температуры число в float 0xXXX, работает без проблем.
Это раз.
А второе, эта проуедура вывода на дисплейчик уже года два трудится на другом термометре (на тиньке 2313), и тоже без замеченный..
А где я набокапорил при переносе програмки с Тиньки на Мегу8 буду дальше смотреть.
Добавлено: Ср июн 10, 2009 23:09:23
clawham
а Вы зарисуйте подключение 7-мисегментников в протеусе

и если там не будет скакать - значить чтото с железом

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

если в терминале будет тоже плыгать(всмысле в реальной схеме) то чтото с термометром или его питанием
Добавлено: Чт июн 11, 2009 07:13:36
RoTToR
Я в протеусе с самого начала все набрасывал. прежде чем собрать в железе, так вот в протеусе вообще не отображается младший разряд (просто не показывает). Я подумал что это издержки умулирования динамической индикации и собрал всё в железе.
А можно по подробней, как железо подключить к компорту ???
TXD ножку контролера цепляем напряму или через что-то на TX(3) RS-232, ну землю кидаем общую???.
Добавлено: Чт июн 11, 2009 11:21:45
clawham
Есть микруха - МАХ 232 и её аналоги
у неё 4 драйвера - 2 из компорта в +5 переводятся и 2 из +5В переводятся в +-12
Вам нужно только передавать из МК и не принимать от компьютера ->
необходимо ножку TXD Микроконтроллера кинуть на ногу 11 макса а с ноги 14 макса - в ножку 2 ком порта а массу кинуть на 5-й
Ну да...максимке нужно ещё 4 кандёра для накачкиразности напряжений

вот и всё а если захотите и принимать по ком порту в МК - надо с ноги 3 ком порта кинуть линию на 13 ногу макса а с 12 ноги макса - кинуть на RXD Микроконтроллера ну и настроить УАРТ vrirb на приём и желательно - буферизированно через прерывание - в мастере начального кода очень даже легитимная версия такой организации ком порта сделана
А на компьютере просматривать что шлёт МК можно очень даже просто - через гипертерминал - только ком порт выбрать правильный и скорость
