Разработка, производство и продажа радиоэлектронной аппаратуры
|
Требуется программист в Зеленограде - обработка данных с датчиков; ColdFire; 40 тыс.
e-mail: jobsmp@pochta.ru
|
Тамошнее решение не единственное, мало того - не на 100% корректное, даже в "улучшенных" версиях =GM= и singlskv. Вот мой 100% корректный алгоритм с использованием ТОЛЬКО Capture Interrupt(+)
Отправлено
=AVR= 30 декабря 2007 г. 12:44
В ответ на:
Захват значения расширенного программно таймера отправлено
Леонид Иванович 30 декабря 2007 г. 11:20
Все делается внутри Capture Interrupt. VARH:VARL = 32-битная переменная, куда надо считать значение:
- Читаем младшие (аппаратные) регистры захвата в VARL.
- Если старший бит = 1, то НЕ инкрементируем расширитель, читаем его в VARH и и выходим.
- Если старший бит = 0, то смотрим флаг TOV:
-- Если TOV = 0, то НЕ инкрементируем расширитель, читаем его в VARH и и выходим.
-- Если TOV = 1, то ИНКРЕМЕНТИРУЕМ расширитель, читаем его в VARH, чистим TOV и и выходим.
Теперь поясню:
- Выполнена главная задача - убраны проблемы с рассинхронизацией двух прерываний (TCAP и TOV), и все события обрабатываются в привязке ТОЛЬКО к моменту захвата.
- При TCAPH.7 = 1 ОЧЕВИДНО, что на момент ЗАХВАТА таймер еще не переполнился, и даже если TOV на момент ОБРАБОТКИ уже установлен, то нас он не волнует, мы его НЕ ТРОГАЕМ и не инкрементируем расширитель.
- При TCAPH.7 = 0 ВОЗМОЖНО, что на момент ЗАХВАТА таймер мог переполниться, тогда это отразилось бы в TOV. Соответственно, учитываем и манипулируем TOV и все ОК.
Почему "ВОЗМОЖНО"? Да потому, что и следующий после TOV захват, если он пришел раньше, чем через 32К тиков, тоже даст TCAPH.7 = 0. Вот тут-то и нужен TOV, а вот отдельное прерывание для него совсем не нужно, ибо вредно и вносит неизбежный раздрай
Составить ответ | Вернуться на конференцию
Ответы