Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы
Непрочитано 25.03.2010, 11:52  
-=EvR=-
Частый гость
 
Регистрация: 22.02.2010
Сообщений: 21
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
-=EvR=- на пути к лучшему
По умолчанию Re: Термометр на ds18b20

Здравствуйте.
начинаю изучать программирование с нуля. Вывожу на ЛСД дисплей время, дату (DS1307) и показания двух DS18B20. Но есть одна проблема, из за того, что время опроса датчика в 12 битном режима 750 мс у меня изображение на ЛСД тормозит (это хорошо видно по секундам, меняются через 2-3сек). и это при двух подключенных датчиках, а если их будет больше, то и тормозить будет сильнее.
как сделать опрос датчиков отдельно от основного цикла while(1), или может есть способ вывода одновременно и времени и температуры без подобных глюков?
вот часть программы:

void main(void)

{
unsigned char hour, min, sec, data, month;
unsigned year;



rtc_init(0,0,0);


// LCD module initialization
lcd_init(20);
lcd_putsf("Podklucenie Datcikov\n DS18B20 ");
delay_ms(5000);
lcd_clear();



//while(device!=0)
devices=w1_search(0xf0,rom_code);
sprintf(lcd_buffer,"%u DS18B20\nDevice detected",devices);
lcd_puts(lcd_buffer);
delay_ms(2000);



/* configure each DS18B20 device for 12 bit temperature
measurement resolution */
for (i=0;i‹devices
if (!ds18b20_init(&rom_code[i++][0],20,30,DS18B20_12BIT_RES))
{
sprintf(lcd_buffer,"Init error for\ndevice #%u",i);
lcd_clear();
lcd_puts(lcd_buffer);
//while (1); /* stop here if init error */
};
lcd_clear();

while (1)
{
rtc_get_time(&hour,&min,&sec);
rtc_get_date(&data,&month,&year);



temp=ds18b20_temperature(&rom_code[0][0]); //читаем температуру
if (temp›1000){ //если датчик выдаёт больше 1000
temp=4096-temp; //отнимаем от данных 4096
temp=-temp; //и ставим знак "минус"
}
temp1=ds18b20_temperature(&rom_code[1][0]); //читаем температуру
if (temp1›1000){ //если датчик выдаёт больше 1000
temp1=4096-temp1; //отнимаем от данных 4096
temp1=-temp1; //и ставим знак "минус"
}



delay_ms(500);

sprintf(lcd_buffer,"Time %02u:%02u:%02u \nData %02u/%02u/%02u \nT1=%+.1f\xdfC \nT2=%+.1f\xdfC",hour,min,sec,data,month,year,temp ,temp1);

lcd_gotoxy(0,0);
lcd_puts(lcd_buffer);
delay_ms(500);
};
}
Реклама:
__________________
Нельзя впихнуть невпихуемое!
-=EvR=- вне форума  
Непрочитано 25.03.2010, 12:49  
Himik_2
Прописка
 
Аватар для Himik_2
 
Регистрация: 27.04.2005
Сообщений: 125
Сказал спасибо: 10
Сказали Спасибо 26 раз(а) в 17 сообщении(ях)
Himik_2 на пути к лучшему
По умолчанию Re: Термометр на ds18b20

Лучше всего выводить время по прерыванию от внешнего вывода МК, для этого очень удобно использовать DS3107 у неё есть выход - SQW/OUT (пин 7) этот выход можно запрограммировать на выдачу импульсов 1гц. Подать его на вход МК который служит для внешнего прерывания и выводить время и температуру по прерыванию от этого входа. Тогда время и температура будут обновляться каждую секунду, независимо от того сколько стоит датчиков. Кстати этот же вывод очень удобно использовать для разделительных точек в часах...

Последний раз редактировалось Himik_2; 25.03.2010 в 12:52.
Himik_2 вне форума  
Непрочитано 25.03.2010, 14:07  
-=EvR=-
Частый гость
 
Регистрация: 22.02.2010
Сообщений: 21
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
-=EvR=- на пути к лучшему
По умолчанию Re: Термометр на ds18b20

этот вывод подключен к INT0 мк. и активен. получается что цикл приостанавливается до тех пор пока не получит данные от датчиков.
__________________
Нельзя впихнуть невпихуемое!
-=EvR=- вне форума  
Непрочитано 25.03.2010, 14:56  
_guardianangel
Почётный гражданин KAZUS.RU
 
Регистрация: 01.04.2009
Адрес: Рязань
Сообщений: 1,140
Сказал спасибо: 21
Сказали Спасибо 635 раз(а) в 344 сообщении(ях)
_guardianangel на пути к лучшему
По умолчанию Re: Термометр на ds18b20

Опрашивайте по очередно. 1 сек. - первый датчик, вторая - второй. температура быстро не меняется так что интервал опроса датчиков не критичен
_guardianangel вне форума  
Непрочитано 25.03.2010, 15:50  
-=EvR=-
Частый гость
 
Регистрация: 22.02.2010
Сообщений: 21
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
-=EvR=- на пути к лучшему
По умолчанию Re: Термометр на ds18b20

если я датчики опрашиваю таким образом:

while (1)
{
rtc_get_time(&hour,&min,&sec);
rtc_get_date(&data,&month,&year);



if (sec==1)
temp=ds18b20_temperature(&rom_code[0][0]); //читаем температуру
if (temp›1000){ //если датчик выдаёт больше 1000
temp=4096-temp; //отнимаем от данных 4096
temp=-temp; //и ставим знак "минус"
}


else

if(sec==10) temp1=ds18b20_temperature(&rom_code[1][0]); //читаем температуру
if (temp1›1000){ //если датчик выдаёт больше 1000
temp1=4096-temp1; //отнимаем от данных 4096
temp1=-temp1; //и ставим знак "минус"
}




delay_ms(500);

sprintf(lcd_buffer,"Time %02u:%02u:%02u \nData %02u/%02u/%02u \nT1=%+.1f\xdfC \nT2=%+.1f\xdfC",hour,min,sec,data,month,year,temp ,temp1);

lcd_gotoxy(0,0);
lcd_puts(lcd_buffer);
delay_ms(500);
};
}




то все равно когда sec=1 и потом 10 на дисплее видна небольшая задержка. как с ней бороться?
__________________
Нельзя впихнуть невпихуемое!
-=EvR=- вне форума  
Непрочитано 25.03.2010, 16:27  
UserM
Прописка
 
Регистрация: 14.08.2006
Сообщений: 106
Сказал спасибо: 19
Сказали Спасибо 7 раз(а) в 7 сообщении(ях)
UserM на пути к лучшему
По умолчанию Re: Термометр на ds18b20

Здесь можно посмотреть пример:
http://radiokot.ru/forum/viewtopic.php?f=20&t=21695
UserM вне форума  
Непрочитано 26.03.2010, 00:51  
_guardianangel
Почётный гражданин KAZUS.RU
 
Регистрация: 01.04.2009
Адрес: Рязань
Сообщений: 1,140
Сказал спасибо: 21
Сказали Спасибо 635 раз(а) в 344 сообщении(ях)
_guardianangel на пути к лучшему
По умолчанию Re: Термометр на ds18b20

функцию sprintf лучше заменить своей. ресурсов и времеи кушает - мама не горюй.
_guardianangel вне форума  
Непрочитано 26.03.2010, 11:42  
-=EvR=-
Частый гость
 
Регистрация: 22.02.2010
Сообщений: 21
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
-=EvR=- на пути к лучшему
По умолчанию Re: Термометр на ds18b20

Сообщение от _guardianangel Посмотреть сообщение
функцию sprintf лучше заменить своей. ресурсов и времеи кушает - мама не горюй.

как я понимаю тут не эта функция тормозит, а основной цикл, пока ждет ответ от датчиков.
__________________
Нельзя впихнуть невпихуемое!
-=EvR=- вне форума  
Непрочитано 28.03.2010, 21:11  
alexplev
Частый гость
 
Регистрация: 06.10.2007
Сообщений: 11
Сказал спасибо: 1
Сказали Спасибо 1 раз в 1 сообщении
alexplev на пути к лучшему
По умолчанию Re: термометр на ds18b20

Сообщение от oleg110592 Посмотреть сообщение
http://www.maxim-ic.com/quick_view2.cfm?qv_pk=2812
всегда хватало информации от производителя - если разберетесь - отпадут многие вопросы.
На странице http://www.dslev.narod.ru/utermo.htm есть бесплатная утилита для проверки DS18B20 и коммутаторов DS2413. Там есть и переходник СОМ 1wire.
alexplev вне форума  
Сказали "Спасибо" alexplev
ankar (01.04.2010)
Непрочитано 29.03.2010, 10:38  
Himik_2
Прописка
 
Аватар для Himik_2
 
Регистрация: 27.04.2005
Сообщений: 125
Сказал спасибо: 10
Сказали Спасибо 26 раз(а) в 17 сообщении(ях)
Himik_2 на пути к лучшему
По умолчанию Re: Термометр на ds18b20

Сообщение от -=EvR=- Посмотреть сообщение
этот вывод подключен к INT0 мк. и активен. получается что цикл приостанавливается до тех пор пока не получит данные от датчиков.
А где обработчик прерывания ? Т.Е. строка должна быть что-то типа того "void INT_0() interrupt 1 using 3
{sprintf(lcd_buffer,"Time %02u:%02u:%02u \nData %02u/%02u/%02u \nT1=%+.1f\xdfC \nT2=%+.1f\xdfC",hour,min,sec,data,month,year,temp ,temp1);
}"
Потому как функция 'sprintf' должна быть в обработчике прерывания а не в основном теле программы.
Himik_2 вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Atmega8 термометр Gizmors Микроконтроллеры, АЦП, память и т.д 77 13.12.2014 15:33
DS18B20 спонтанно греется, глюк или брак ? lukrom Коллекция глюков 32 21.10.2013 10:59
Китайский цифровой термометр СТ-2 Jack36 Делимся опытом 0 27.02.2010 16:55


Часовой пояс GMT +4, время: 07:16.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot