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

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Аватара пользователя
sachok
Опытный кот
Сообщения: 849
Зарегистрирован: Сб янв 05, 2008 11:05:15
Откуда: Україна м.Луцьк
Контактная информация:

Сообщение sachok »

Вот решил переписать свою программку и делать опрос датчиков 1 раз в 2 секунди. завел таймер в нем считаем время (точнее инкрементируем переменную) потом в бесконечном цикле проверяем єту переменную и если она равна 100(єто за 2 секунды должно натикать) то запускаем функцию измерения температуры. но увы на дисплее полный бред и нифига не работает. прилагается участок программы.
Вложения
untitled.c
(2.89 КБ) 450 скачиваний
Я не Сашок!!!
Аватара пользователя
lkote68
Прорезались зубы
Сообщения: 231
Зарегистрирован: Пн мар 30, 2009 15:58:32
Откуда: Украина Запорожье

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

Сообщение lkote68 »

А что ж там на экране будет Судя по исходникам Вход в бесконеч цикл
while (1)
{
// Place your code here

if (t==100)
{
temp ();
t=0;
}


};

А в temp (); вы меряете температуру 3 раза а выводите один Может тут и собака порылась
void temp (void)
{
for (i=0;i<devices;)
{
#asm("cli")
ds18b20_init(&rom_code[0][0],0,85,DS18B20_9BIT_RES);
temp1=ds18b20_temperature(&rom_code[0][0]);
sprintf(lcd_buffer1,"t%u=%i\xdfC",i+1,temp1);
lcd_gotoxy(0,0);
lcd_puts(lcd_buffer1);

ds18b20_init(&rom_code[1][0],0,85,DS18B20_9BIT_RES);
temp2=ds18b20_temperature(&rom_code[1][0]);
sprintf(lcd_buffer3,"t%u=%i\xdfC",i,temp3);

ds18b20_init(&rom_code[2][0],0,85,DS18B20_9BIT_RES);
temp3=ds18b20_temperature(&rom_code[2][0]);
sprintf(lcd_buffer3,"t%u=%i\xdfC",i+3,temp3);
#asm("sei")
}
}
Аватара пользователя
sachok
Опытный кот
Сообщения: 849
Зарегистрирован: Сб янв 05, 2008 11:05:15
Откуда: Україна м.Луцьк
Контактная информация:

Сообщение sachok »

В temp(); я меряю температуру 3 отдельных датчиков но просто вывожу только температуру первого
Я не Сашок!!!
Аватара пользователя
lkote68
Прорезались зубы
Сообщения: 231
Зарегистрирован: Пн мар 30, 2009 15:58:32
Откуда: Украина Запорожье

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

Сообщение lkote68 »

А вы не забыли в цикле инкремент i поставить?
А вообще я бы вашу функцию записал бы так если я конечно правильно понял что вы хотели.
void temp (void)
{
#asm("cli")
for (i=0;i<devices;i++)
{
ds18b20_init(&rom_code[i][0],0,85,DS18B20_9BIT_RES);
temp=ds18b20_temperature(&rom_code[i][0]);
sprintf(lcd_buffer,"t%u=%i\xdfC",i,temp);
if(i==0){
lcd_gotoxy(0,0);
lcd_puts(lcd_buffer1);
}
if(i==1)temp2 = temp;
if(i==2)temp3 = temp;
}
#asm("sei")
}
Аватара пользователя
sachok
Опытный кот
Сообщения: 849
Зарегистрирован: Сб янв 05, 2008 11:05:15
Откуда: Україна м.Луцьк
Контактная информация:

Сообщение sachok »

Это равносильно тому что я писал:)
Я не Сашок!!!
Аватара пользователя
lkote68
Прорезались зубы
Сообщения: 231
Зарегистрирован: Пн мар 30, 2009 15:58:32
Откуда: Украина Запорожье

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

Сообщение lkote68 »

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

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

Сообщение lkote68 »

Уважаемые Коты. Подскажите схемное решение Нужно отвязать гальванически ногу Аtmela от сети DS18b20.
smg123
Первый раз сказал Мяу!
Сообщения: 28
Зарегистрирован: Вс июл 22, 2007 10:23:21

Сообщение smg123 »

Разделить Tx и Rx на контроллере, передать/принять оптопарами и собрать на стороне шины 1wire + отдельное питание для неё.
Двух оптопар 6N137 и пары полевиков 2N7000 думаю хватит.
Или посмотреть в сторону DS2480 + гальваноразвязка RS232.
Аватара пользователя
lkote68
Прорезались зубы
Сообщения: 231
Зарегистрирован: Пн мар 30, 2009 15:58:32
Откуда: Украина Запорожье

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

Сообщение lkote68 »

Порт занят для связи с пк. Опрос датчиков идет одному из битов порта D. Вот его и хочу отвязать. Или это не реально? Может я чет не догоняю.
smg123
Первый раз сказал Мяу!
Сообщения: 28
Зарегистрирован: Вс июл 22, 2007 10:23:21

Сообщение smg123 »

Используйте любые 2 разряда любого порта для обмена с шиной. По одному идут запросы в шину(Tx), второй её слушает(Rx). После опторазвязки их надо совместить в "один провод".
Аватара пользователя
lkote68
Прорезались зубы
Сообщения: 231
Зарегистрирован: Пн мар 30, 2009 15:58:32
Откуда: Украина Запорожье

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

Сообщение lkote68 »

Так то оно так, но так бы я сделал если бы писал на асме. Программа написана на CodeVision. Во первых там библиотека поддерживает опрос только через один бит (или надо править библиотеку). Если бы писал на асме я бы многое не так сделал. Тут есть мои посты с вопросами как бы развесить по сети на битам чтобы сегментировать сеть. Вопрос как раз в том чтобы отвязать один бит.
Vov123
Опытный кот
Сообщения: 804
Зарегистрирован: Чт мар 12, 2009 16:31:05

Сообщение Vov123 »

если просто получить значения,то как вариант можно так,только с типами не путайте,если больше 255,то int a,b,c,d;
d=25.3*10
a=d/100;
b=(d%100)/10;
c=d-((a*100)+(b*10));
clawham
Поставщик валерьянки для Кота
Сообщения: 1957
Зарегистрирован: Пт окт 31, 2008 09:38:55
Откуда: Одесса
Контактная информация:

Сообщение clawham »

Здравствуйте, есть такой вопрос - у ДС18Б20 есть одна интересная команда - Скип ром, которая как бы адресует следующую команду не к конкретному ДС а ко всем - и вот в чем суть вопроса - запускаем в шину команду скип ром(SKIP ROM [CCh]) после неё шлём команду на начало преобразования (CONVERT T [44h]) ждём одну секунду(ну или занимаемся своими делами в МК - вроде как не проблема - нужен только "Стронг Пуллап" шины....а потом - чтение (сначала выбор девайса - MATCH ROM [55h] а потом считывание - READ SCRATCHPAD [BEh]) - тоесть по идее время на передачу данных - мизер по сравнению со "ждать завершения преобразования" ? ну чтоб не простаивать 750 миллисек на каждом
и второй вопрос - а как будут вести себя другие сволочи на 1wire шине? у меня там ещё RTC и оцифраторы 16-тибитные 4-х канальные
Аватара пользователя
Krik99
Потрогал лапой паяльник
Сообщения: 375
Зарегистрирован: Вс мар 04, 2007 13:14:25
Откуда: Украина
Контактная информация:

Сообщение Krik99 »

Да по идее другие девайсы будут нормально работать, так как они все 1wire совместимые.
Изображение
Skrrmrchoh
Нашел транзистор. Понюхал.
Сообщения: 185
Зарегистрирован: Чт сен 06, 2007 22:36:09
Откуда: Санкт-Петербург

Сообщение Skrrmrchoh »

Vov123 писал(а):если просто получить значения,то как вариант можно так,только с типами не путайте,если больше 255,то int a,b,c,d;
d=25.3*10
a=d/100;
b=(d%100)/10;
c=d-((a*100)+(b*10));


Получить бы эту самую d....

Видимо, это стандартная кодевиженовская функция.

Вот такая.

temp=ds1820_temperature_10(&rom_code[i][0]);

Переменная temp типа int. Вопрос#1: что будет в той переменной если температура равна 25,3?

Вопрос#2 что это такое: (&rom_code[i][0]), а также что такое i ?


Еще. В тех двух примерах, которые я ковыряю есть некие (малопонятно для меня как работающие ) функции поиска датчиков на шине. Так вот, после процедуры поиска в обоих примерах количество выводится на дисплей. Эти функции поиска необходимы только для работы с несколькими датчиками? Если датчик один, то...они не нужны?
Последний раз редактировалось Skrrmrchoh Чт апр 23, 2009 13:51:00, всего редактировалось 1 раз.
Аватара пользователя
lkote68
Прорезались зубы
Сообщения: 231
Зарегистрирован: Пн мар 30, 2009 15:58:32
Откуда: Украина Запорожье

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

Сообщение lkote68 »

Уважаемые Коты. Где то с месяц я возился со своим изваянием. Выражаю признательность YellowTiger и ARV. Все заработало меряет, по порту отсылает. Красота. Захотел попробовать посадить
DSки на паразитное питание получил где то слышаное мною значение 85. При этом адрес считывается.
Аватара пользователя
Pooher
Мучитель микросхем
Сообщения: 491
Зарегистрирован: Вс янв 07, 2007 01:45:48
Откуда: Российская Федерация, будь она неладна...

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

Сообщение Pooher »

lkote68 писал(а): посадить DSки на паразитное питание

После запуска преобразования температуры надо подключать к шине 1-wire жёсткую подтяжку питания (резистору не вытянуть ток необходимый для АЦП датчиков). Хотя я просто запускал преобразование в каждом датчике отдельно, и при 10 датчиках и метрах 100-а провода (евро телефонки) всё работает "на ура".
Научить нельзя, можно научиться. Пифагор.
Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
Аватара пользователя
adrenocrome
Потрогал лапой паяльник
Сообщения: 365
Зарегистрирован: Вт окт 21, 2008 15:03:06
Откуда: moscow
Контактная информация:

Сообщение adrenocrome »

Skrrmrchoh писал(а):Видимо, это стандартная кодевиженовская функция.

Вот такая.

temp=ds1820_temperature_10(&rom_code[i][0]);

Переменная temp типа int. Вопрос#1: что будет в той переменной если температура равна 25,3?


А не float там должен быть? как в int впихнуть не целое число? о_О
По-моему в примерах от старого КодВижн там был именно float. А в кодвижн2 посмотрел, действительно, int ... странно.
Аватара пользователя
lkote68
Прорезались зубы
Сообщения: 231
Зарегистрирован: Пн мар 30, 2009 15:58:32
Откуда: Украина Запорожье

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

Сообщение lkote68 »

Уважаемые Коты Растолкуйте плиз даташит DS18b20. работает у меня схема с экстарнал питанием. Кое где по ссылкам я нашел что достаточным условием для перевода на паразитное является коротыш на 1.3 ноги ДСки. Ну ни фига не работает. Так ли это?
В даташите там еще полевик и тоже как и резистор на питание. Не совсем пойму как им управлять

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

Сообщение Pooher »

Транзистор можно любой поставить. Он работает в ключевом режиме. На время преобразования температуры жёстко подтягивает шину к "1".
Научить нельзя, можно научиться. Пифагор.
Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
Закрыто

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