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

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

Сообщение sachok »

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

Сообщение 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")
}
}
Реклама
Опытный кот
Аватара пользователя
Сообщения: 849
Зарегистрирован: Сб янв 05, 2008 11:05:15
Откуда: Україна м.Луцьк

Сообщение sachok »

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

Сообщение lkote68 »

А вы не забыли в цикле инкремент i поставить?
А вообще я бы вашу функцию записал бы так если я конечно правильно понял что вы хотели.
void temp (void)
{
#asm("cli")
for (i=0;i<devices;i++)
{
ds18b20_init(&rom_code[0],0,85,DS18B20_9BIT_RES);
temp=ds18b20_temperature(&rom_code[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")
}
Реклама
Эиком - электронные компоненты и радиодетали
Опытный кот
Аватара пользователя
Сообщения: 849
Зарегистрирован: Сб янв 05, 2008 11:05:15
Откуда: Україна м.Луцьк

Сообщение sachok »

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

Сообщение lkote68 »

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

Сообщение lkote68 »

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

Сообщение smg123 »

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

Сообщение lkote68 »

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

Сообщение smg123 »

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

Сообщение lkote68 »

Так то оно так, но так бы я сделал если бы писал на асме. Программа написана на CodeVision. Во первых там библиотека поддерживает опрос только через один бит (или надо править библиотеку). Если бы писал на асме я бы многое не так сделал. Тут есть мои посты с вопросами как бы развесить по сети на битам чтобы сегментировать сеть. Вопрос как раз в том чтобы отвязать один бит.
Опытный кот
Сообщения: 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));
Поставщик валерьянки для Кота
Сообщения: 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-х канальные
Контактная информация:
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 375
Зарегистрирован: Вс мар 04, 2007 13:14:25
Откуда: Украина

Сообщение Krik99 »

Да по идее другие девайсы будут нормально работать, так как они все 1wire совместимые.
Изображение
Контактная информация:
Нашел транзистор. Понюхал.
Сообщения: 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[0]);

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

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


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

Сообщение lkote68 »

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

Сообщение Pooher »

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

Сообщение adrenocrome »

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

Вот такая.

temp=ds1820_temperature_10(&rom_code[0]);

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


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

Сообщение lkote68 »

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

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

Сообщение Pooher »

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

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