DS18S20 и время преобразования температуры
DS18S20 и время преобразования температуры
Пользую CVAVR и его функцию ds1820_temperature_10 Суть программы такова: контроллер должен каждые 30 мс выдавать значение температуры с датчика DS18S20 в особо извращенной форме. Понятно, что вышеозначенный датчик не может так часто мерить температуру, поэтому реальный замер температуры происходит раз в 30 итераций (около 900 мс), а его значение присваевается переменной, которая потом и используется для вывода.
Но есть проблема. Функция преобразования температуры выполняется нереально долго для
этой задачи (около 750 мс, как в даташите и сказано). Как заставить МК быстро читать данные с DS18S20, а преобразование выполнять "в фоне"?
Т.е.
1. Прочитал данные предыдущего преобразования и запустил новое (не дожидаясь его окончания)
2. 30 раз (900 мс) выдаем прочитанные в п.1 данные
3. Снова с п.1
Но есть проблема. Функция преобразования температуры выполняется нереально долго для
этой задачи (около 750 мс, как в даташите и сказано). Как заставить МК быстро читать данные с DS18S20, а преобразование выполнять "в фоне"?
Т.е.
1. Прочитал данные предыдущего преобразования и запустил новое (не дожидаясь его окончания)
2. 30 раз (900 мс) выдаем прочитанные в п.1 данные
3. Снова с п.1
Re: DS18S20 и время преобразования температуры
grishiny писал(а):Но есть проблема. Функция преобразования температуры выполняется нереально долго для
этой задачи (около 750 мс, как в даташите и сказано). Как заставить МК быстро читать данные с DS18S20, а преобразование выполнять "в фоне"?
кто тебя заставляет ждать эти 750мс ?
Быстренько прочитай прошлое значение, инициируй новое преобразование, заведи таймер на через 750мс и это время спокойно обрабатывай прочие задачи.
Re: DS18S20 и время преобразования температуры
Там вроде флажок в регистре есть который сигнализирует о завершенном преобразовании и готовности данных к чтению.
Re: DS18S20 и время преобразования температуры
Satyr писал(а):кто тебя заставляет ждать эти 750мс ?
Функция ds1820_temperature_10 так работает.
Satyr писал(а):Быстренько прочитай прошлое значение, инициируй новое преобразование, заведи таймер на через 750мс и это время спокойно обрабатывай прочие задачи.
вот в том и вопрос. Как это сделать? Как прочитать? Забить на использование библиотеки ds1820.h (или как там она) и свою функцию считывания изобрести? На ассемблере вставку сделать?
Re: DS18S20 и время преобразования температуры
Kotische писал(а):Там вроде флажок в регистре есть который сигнализирует о завершенном преобразовании и готовности данных к чтению.
И вышеозначенная функция, очевидно, не дает ничему выполняться, пока не дождется его.
Re: DS18S20 и время преобразования температуры
Исходники есть этой функции? поменяй у нее конец с началом местами -))
чтоб в начале получал значение преобразования, а в конце инициировал новое преобразование.
вызывай по таймеру с интервалом не менее 750мс
чтоб в начале получал значение преобразования, а в конце инициировал новое преобразование.
вызывай по таймеру с интервалом не менее 750мс
Re: DS18S20 и время преобразования температуры
Функция ds1820_temperature_10 объявлена в \lib\DS1820.LIB и там как раз стоит задержка в 550 мс. Разделите ее на "до" и "после" задержки, а между ними занимайтесь своими делами, не забывая про подсчет времени на преобразование температуры.
Re: DS18S20 и время преобразования температуры
Shutilla писал(а):Функция ds1820_temperature_10 объявлена в \lib\DS1820.LIB и там как раз стоит задержка в 550 мс. Разделите ее на "до" и "после" задержки, а между ними занимайтесь своими делами, не забывая про подсчет времени на преобразование температуры.
Спасибо! Буду ковырять.
Re: DS18S20 и время преобразования температуры
Если точности 9 бит хватит, то можно перевести датчик на время измерения 93,75мс. Если это спасет, конечно.
C0FFEE=12648430
Re: DS18S20 и время преобразования температуры
eufs писал(а):Если точности 9 бит хватит, то можно перевести датчик на время измерения 93,75мс. Если это спасет, конечно.
См название темы. У него ds18S20, а не ds18B20
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: DS18S20 и время преобразования температуры
Код: Выделить всё
int ds1820_temperature_10(unsigned char *addr)
{
if (ds1820_select(addr)==0) return -9999;
w1_write(0x44);
//delay_ms(550);
TCCR0B= 0x01;//запускаем заранее проинициализированный таймер.
}
А в обработке по переполнению читаем показания, обнуляем TCNT и останавливаем таймер.
Docendo discimus
Re: DS18S20 и время преобразования температуры
Намучился с переставлением местами, никак не хотело работать. В конце концов заработало просто вот так:
Код: Выделить всё
if (ds1820_select(addr)==0) return -9999;
w1_write(0x44);
//delay_ms(550);
if (ds1820_read_spd(addr)==0) return -9999;
w1_init();
return (((int)__ds1820_scratch_pad.temp_msb<<8)|
__ds1820_scratch_pad.temp_lsb)*5;- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: DS18S20 и время преобразования температуры
Так. Теперь, благодаря grishiny, мы знаем об избыточности 750мсек, о которых говорит даташит. Хотя там сказано о гарантированности результата.
Docendo discimus
- Леонид Иванович
- Друг Кота
- Сообщения: 4779
- Зарегистрирован: Сб апр 02, 2011 12:40:46
- Откуда: Минск
- Контактная информация:
Re: DS18S20 и время преобразования температуры
pyzh_man писал(а):Так. Теперь, благодаря grishiny, мы знаем об избыточности 750мсек, о которых говорит даташит. Хотя там сказано о гарантированности результата.
О какой избыточности? Преобразование идет примерно такое время. Просто не обязательно внутри функции тупо ждать его окончания. Я вообще делаю запуск измерения по таймеру. "Считал измеренное значение, скопировал в переменную, откуда его можно брать в любое время, запустил новое измерение". Через 1 сек я повторяю эти действия.
Re: DS18S20 и время преобразования температуры
Ничегонеработает писал(а):pyzh_man писал(а):Так. Теперь, благодаря grishiny, мы знаем об избыточности 750мсек, о которых говорит даташит. Хотя там сказано о гарантированности результата.
О какой избыточности? Преобразование идет примерно такое время. Просто не обязательно внутри функции тупо ждать его окончания. Я вообще делаю запуск измерения по таймеру. "Считал измеренное значение, скопировал в переменную, откуда его можно брать в любое время, запустил новое измерение". Через 1 сек я повторяю эти действия.
И после запуска измерения можно делать что-угодно НЕ МЕНЕЕ 750 мс - ТОЛЬКО НЕЖЕЛАТЕЛЬНО шевелить бит порта 1WIRE