- Вложения
-
- untitled.c
- (2.89 КБ) 450 скачиваний
Вопросы по работе с термометрами DS18B20
Вот решил переписать свою программку и делать опрос датчиков 1 раз в 2 секунди. завел таймер в нем считаем время (точнее инкрементируем переменную) потом в бесконечном цикле проверяем єту переменную и если она равна 100(єто за 2 секунды должно натикать) то запускаем функцию измерения температуры. но увы на дисплее полный бред и нифига не работает. прилагается участок программы.
Я не Сашок!!!
- Реклама
А что ж там на экране будет Судя по исходникам Вход в бесконеч цикл
А в temp (); вы меряете температуру 3 раза а выводите один Может тут и собака порыласьwhile (1)
{
// Place your code here
if (t==100)
{
temp ();
t=0;
}
};
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")
}
}
В temp(); я меряю температуру 3 отдельных датчиков но просто вывожу только температуру первого
Я не Сашок!!!
А вы не забыли в цикле инкремент 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")
}
Это равносильно тому что я писал:)
Я не Сашок!!!
- Реклама
Уважаемые Коты. Подскажите схемное решение Нужно отвязать гальванически ногу Аtmela от сети DS18b20.
- Сообщения: 28
- Зарегистрирован: Вс июл 22, 2007 10:23:21
Порт занят для связи с пк. Опрос датчиков идет одному из битов порта D. Вот его и хочу отвязать. Или это не реально? Может я чет не догоняю.
- Сообщения: 28
- Зарегистрирован: Вс июл 22, 2007 10:23:21
Так то оно так, но так бы я сделал если бы писал на асме. Программа написана на CodeVision. Во первых там библиотека поддерживает опрос только через один бит (или надо править библиотеку). Если бы писал на асме я бы многое не так сделал. Тут есть мои посты с вопросами как бы развесить по сети на битам чтобы сегментировать сеть. Вопрос как раз в том чтобы отвязать один бит.
- Сообщения: 804
- Зарегистрирован: Чт мар 12, 2009 16:31:05
Здравствуйте, есть такой вопрос - у ДС18Б20 есть одна интересная команда - Скип ром, которая как бы адресует следующую команду не к конкретному ДС а ко всем - и вот в чем суть вопроса - запускаем в шину команду скип ром(SKIP ROM [CCh]) после неё шлём команду на начало преобразования (CONVERT T [44h]) ждём одну секунду(ну или занимаемся своими делами в МК - вроде как не проблема - нужен только "Стронг Пуллап" шины....а потом - чтение (сначала выбор девайса - MATCH ROM [55h] а потом считывание - READ SCRATCHPAD [BEh]) - тоесть по идее время на передачу данных - мизер по сравнению со "ждать завершения преобразования" ? ну чтоб не простаивать 750 миллисек на каждом
и второй вопрос - а как будут вести себя другие сволочи на 1wire шине? у меня там ещё RTC и оцифраторы 16-тибитные 4-х канальные
и второй вопрос - а как будут вести себя другие сволочи на 1wire шине? у меня там ещё RTC и оцифраторы 16-тибитные 4-х канальные
Да по идее другие девайсы будут нормально работать, так как они все 1wire совместимые.

Получить бы эту самую d....Vov123 писал(а):если просто получить значения,то как вариант можно так,только с типами не путайте,если больше 255,то int a,b,c,d;
d=25.3*10
a=d/100;
b=(d%100)/10;
c=d-((a*100)+(b*10));
Видимо, это стандартная кодевиженовская функция.
Вот такая.
temp=ds1820_temperature_10(&rom_code[0]);
Переменная temp типа int. Вопрос#1: что будет в той переменной если температура равна 25,3?
Вопрос#2 что это такое: (&rom_code[0]), а также что такое i ?
Еще. В тех двух примерах, которые я ковыряю есть некие (малопонятно для меня как работающие ) функции поиска датчиков на шине. Так вот, после процедуры поиска в обоих примерах количество выводится на дисплей. Эти функции поиска необходимы только для работы с несколькими датчиками? Если датчик один, то...они не нужны?
Последний раз редактировалось Skrrmrchoh Чт апр 23, 2009 13:51:00, всего редактировалось 1 раз.
Уважаемые Коты. Где то с месяц я возился со своим изваянием. Выражаю признательность YellowTiger и ARV. Все заработало меряет, по порту отсылает. Красота. Захотел попробовать посадить
DSки на паразитное питание получил где то слышаное мною значение 85. При этом адрес считывается.
DSки на паразитное питание получил где то слышаное мною значение 85. При этом адрес считывается.
- Сообщения: 491
- Зарегистрирован: Вс янв 07, 2007 01:45:48
- Откуда: Российская Федерация, будь она неладна...
После запуска преобразования температуры надо подключать к шине 1-wire жёсткую подтяжку питания (резистору не вытянуть ток необходимый для АЦП датчиков). Хотя я просто запускал преобразование в каждом датчике отдельно, и при 10 датчиках и метрах 100-а провода (евро телефонки) всё работает "на ура".lkote68 писал(а): посадить DSки на паразитное питание
Научить нельзя, можно научиться. Пифагор.
Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
Skrrmrchoh писал(а): Видимо, это стандартная кодевиженовская функция.
Вот такая.
temp=ds1820_temperature_10(&rom_code[0]);
Переменная temp типа int. Вопрос#1: что будет в той переменной если температура равна 25,3?
А не float там должен быть? как в int впихнуть не целое число? о_О
По-моему в примерах от старого КодВижн там был именно float. А в кодвижн2 посмотрел, действительно, int ... странно.
Уважаемые Коты Растолкуйте плиз даташит DS18b20. работает у меня схема с экстарнал питанием. Кое где по ссылкам я нашел что достаточным условием для перевода на паразитное является коротыш на 1.3 ноги ДСки. Ну ни фига не работает. Так ли это?
В даташите там еще полевик и тоже как и резистор на питание. Не совсем пойму как им управлять
Зарабтало уменьшил подтяжку до 1кОм все теперь и с паразитным работает. Но вопрос по поводу полевика остался. Да и к стати что это за странное изображения полевика. Или кружок обозначает ставьте любой проводимости лижбы инвертировал ноль в 1 ну типа как в логике?
В даташите там еще полевик и тоже как и резистор на питание. Не совсем пойму как им управлять
Зарабтало уменьшил подтяжку до 1кОм все теперь и с паразитным работает. Но вопрос по поводу полевика остался. Да и к стати что это за странное изображения полевика. Или кружок обозначает ставьте любой проводимости лижбы инвертировал ноль в 1 ну типа как в логике?
- Сообщения: 491
- Зарегистрирован: Вс янв 07, 2007 01:45:48
- Откуда: Российская Федерация, будь она неладна...


