Сообщение от dimanfet
|
А если, как вы говорите на время измерений запрещять прерывания, то не будут ли эти измерения занимать много времени?
|
Такие задачи я делаю методом мультиплексирования обработки задач требующих синхронизации:
Я совместил обработку 1WIRE и вывод на АЛС в одном прерывании.
Прерывание таймера 500 микросекунд. В каждом прерывании происходит отсчёт счётчика вывода на АЛС. А в основной програме делать ничего не остаётся.
Например период вывода на индикатор = 15 милисек, для исключения мерцаний инидкатора видимых глазом. Счётчик считает до 15000/500 = 30. Вывод на каждый сегмент в течение 1-2-3-4-5 прерываний, от этого зависит яркость. Для уменьшения пульсаций вывод разрядов распределить равномерно по времени. Каждый разряд выводится с временем кратным 500 микросек, от количества проходв в которых выводится состояние разрядов - зависит яркость.
например:
Счётчик=1, вывод на 1 разряд
Счётчик=11, вывод на 2 разряд
Счётчик=21, вывод на 3 разряд
в остальные отсчёты счётчика ничего не выводим на АЛС, то есть гасим все сегменты.
или так, яркость в 2 раза больше.
Счётчик=1,2, вывод на 1 разряд
Счётчик=11,12, вывод на 2 разряд
Счётчик=21,22, вывод на 3 разряд
или так, яркость в 3раза больше.
Счётчик=1,2,3 - вывод на 1 разряд
Счётчик=11,12,13 - вывод на 2 разряд
Счётчик=21,22,23 - вывод на 3 разряд
Из 500 микросекунд тратится 10-20 на обработку АЛС.
обработка 1WIRE.
С периодом в 500 микросек выводятся таймслоты чтения и записи.
То есть за одно прерывание таймера пишется или читается 1 бит... шина 1WIRE это позволяет, делать паузы между таймслотами. Таким образом из 500 микросекунд на обработку шины будет тратится максимум 120 микросекунд для формирования таймслота записи в шину бита.
А в остальное время 20-30 микросеунд.
Организовываем счётчик = 800000микросек(время имерения)/500(период прерывания)= 1600 проходов прерывания таймера это время для измерения датчиком температуры.
Теперь счётчик проходов считывания значения температуры из датчика =
50(проходов)*500 (прерывания таймера) = 25 милисек:
1 проход - старт формирование импульса сброса
2 проход - окончение формирование импульса сброса и считывание импульса присутствия, если его нет то переходим к времени ожидания между опросами.
3-10 проходы на запись команды пропуска сравниения номера
11-18 проходы на запись команды чтения температуры
19-26 проходы на чтения 1 го байта температуры
27-34 проходы на чтения 2 го байта температуры
35-42 проходы на запись команды пропуска сравниения номера
43-50 проходы на запись команды пуска измерения температуры датчиком
и далее опять 1600 проходов для ожидания конца измерения.
Возможно конечно добавить и чтение всей РАМ датчика для отсчёта контрольной суммы, но обычно для такой задачи хватает простого счётчика повторов считаных значений и вывод на индикацию только повторяющиеся несколько раз значения температуры.
Таким образом процессы вывода на АЛС и опроса датчика синхронны и не мешают друг другу.
Естественно период можно взять и другой, в пределах 100 -1000 микросекунд, в зависимости от того что ещё нужно обрабатывать.