Пользую CVAVR и его функцию ds1820_temperature_10 Суть программы такова: контроллер должен каждые 30 мс выдавать значение температуры с датчика DS18S20 в особо извращенной форме. Понятно, что вышеозначенный датчик не может так часто мерить температуру, поэтому реальный замер температуры происходит раз в 30 итераций (около 900 мс), а его значение присваевается переменной, которая потом и используется для вывода.
Но есть проблема. Функция преобразования температуры выполняется нереально долго для
этой задачи (около 750 мс, как в даташите и сказано). Как заставить МК быстро читать данные с DS18S20, а преобразование выполнять "в фоне"?
Т.е.
1. Прочитал данные предыдущего преобразования и запустил новое (не дожидаясь его окончания)
2. 30 раз (900 мс) выдаем прочитанные в п.1 данные
3. Снова с п.1
grishiny писал(а):Но есть проблема. Функция преобразования температуры выполняется нереально долго для
этой задачи (около 750 мс, как в даташите и сказано). Как заставить МК быстро читать данные с DS18S20, а преобразование выполнять "в фоне"?
кто тебя заставляет ждать эти 750мс ?
Быстренько прочитай прошлое значение, инициируй новое преобразование, заведи таймер на через 750мс и это время спокойно обрабатывай прочие задачи.
Satyr писал(а):кто тебя заставляет ждать эти 750мс ?
Функция ds1820_temperature_10 так работает.
Satyr писал(а):Быстренько прочитай прошлое значение, инициируй новое преобразование, заведи таймер на через 750мс и это время спокойно обрабатывай прочие задачи.
вот в том и вопрос. Как это сделать? Как прочитать? Забить на использование библиотеки ds1820.h (или как там она) и свою функцию считывания изобрести? На ассемблере вставку сделать?
Исходники есть этой функции? поменяй у нее конец с началом местами -))
чтоб в начале получал значение преобразования, а в конце инициировал новое преобразование.
вызывай по таймеру с интервалом не менее 750мс
Функция ds1820_temperature_10 объявлена в \lib\DS1820.LIB и там как раз стоит задержка в 550 мс. Разделите ее на "до" и "после" задержки, а между ними занимайтесь своими делами, не забывая про подсчет времени на преобразование температуры.
Shutilla писал(а):Функция ds1820_temperature_10 объявлена в \lib\DS1820.LIB и там как раз стоит задержка в 550 мс. Разделите ее на "до" и "после" задержки, а между ними занимайтесь своими делами, не забывая про подсчет времени на преобразование температуры.
pyzh_man писал(а):Так. Теперь, благодаря grishiny, мы знаем об избыточности 750мсек, о которых говорит даташит. Хотя там сказано о гарантированности результата.
О какой избыточности? Преобразование идет примерно такое время. Просто не обязательно внутри функции тупо ждать его окончания. Я вообще делаю запуск измерения по таймеру. "Считал измеренное значение, скопировал в переменную, откуда его можно брать в любое время, запустил новое измерение". Через 1 сек я повторяю эти действия.
pyzh_man писал(а):Так. Теперь, благодаря grishiny, мы знаем об избыточности 750мсек, о которых говорит даташит. Хотя там сказано о гарантированности результата.
О какой избыточности? Преобразование идет примерно такое время. Просто не обязательно внутри функции тупо ждать его окончания. Я вообще делаю запуск измерения по таймеру. "Считал измеренное значение, скопировал в переменную, откуда его можно брать в любое время, запустил новое измерение". Через 1 сек я повторяю эти действия.
И после запуска измерения можно делать что-угодно НЕ МЕНЕЕ 750 мс - ТОЛЬКО НЕЖЕЛАТЕЛЬНО шевелить бит порта 1WIRE