Свежие обсуждения
Микроконтроллеры

Ликбез по программированию PIC

1 62 99

Zandy: AHTOXA, вы предлагаете точно тоже самое, что и я

И действительно Тогда в чём проблема?
В широких импульсах? Шире чем период таймера? Это решаемо. Заводим 4 переменные ROLLOVER1...ROLLOVER4, в таймерном прерывании их увеличиваем.
При вычислении ширины импульса используем формулу:
ширина1 = текущее - предыдущее1 + 256*ROLLOVER1, потом обнуляем ROLLOVER1.

 

Zandy: не следите за ходом моих мыслей
Ещё как слежу Просто считаю, что лучше лишний раз переспросить, чем что-то упустить.
Вариант с одним таймером обдумаю...

 

Кстати, проблема первого импульса тоже легко решаема - 4 флага, взводятся при старте программы и при тайм-ауте. Сбрасываются при поступлении первого импульса.

 

Сеть весь день не работала.
AHTOXA: При вычислении ширины импульса используем формулу:
ширина1 = текущее - предыдущее1 + 256*ROLLOVER1

AHTOXA: Кстати, проблема первого импульса тоже легко решаема - 4 флага, взводятся при старте программы и при тайм-ауте. Сбрасываются при поступлении первого импульса.
Как-то не очень понятно. Поподробнее можно.

Мне вот тут другая мысля пришла по поводу Zandy: Если сигнал отсутствует, то все в порядке, это работает, а вот, если период вышел за пределы, то тут не все в порядке. Работает, но не в каждом прерывании. Т. е. засечь то мы можем, но, что дальше делать, не понятно.
Посмотрите внимательно на мой маленький рисуночек, что был выше. Допустим То - период переполнения нашего тактового таймера (период прерываний - красный цвет). Тх - период измеряемого сигнала. Если Tx<To, то все в порядке, измерения штатные. Если nТо < Тх < 1.5nТо, где n - любое целое 1,2,3... при вычислении периода путем нахождения разности между текущим и предыдущим значениями нашего таймера, результат всегда будет меньше, чем То/2. Т. е. эти значения Тх мы отсечем (забракуем), как внедиапазонные на этапе вычисления длительности. Если 1.5nТо < Тх < 2nТо, то ситуации, показанные на рисуночке обведенным кружочком будут повторяться, в худшем случае через один период То. Чтобы "забраковать" такое чередование (факт настоящего таймаута) надо принимать решение по лог. "and" между текущим значением ERROR и запомненным значением ERROR в предыдущем прерывании по переполнению таймера. "and" - потому, что я уж изначально так принял, что полезным сигналом (отсутствие прерываний по измеряемым сигналам) является ноль.
Почему-то значки "больше", "меньше" не отражаются. img src="/smile/sad.gif" width="15" height="15" alt="" /> ?

 

Отражаются в < латинском > регистре.

 

Mastak: Отражаются в < латинском > регистре
Это глюки. То есть, то нет <<<>>>

 

Zandy: Почему-то значки "больше", "меньше" не отражаются.

Засуньте их в тэги pre, может поможет.

Zandy: Как-то не очень понятно. Поподробнее можно.

Хорошо.
1. Пришёл импульс. Мы запомнили показание таймера (в PREV_TMR), скажем, 15, обнулили ROLLOVER.
2. таймер досчитал до 255, импульса нет, прерывание от таймера, увеличиваем ROLLOVER (стало 1)
3. таймер снова досчитал до 255 импульса нет, прерывание от таймера, увеличиваем ROLLOVER (стало 2)
4. Пришёл импульс.Вычисляем его длительность: TMR (скажем, 25) + ROLLOVER * 256 - PREV_TMR = 522.

или:

4. таймер снова досчитал до 255 импульса нет, прерывание от таймера, увеличиваем ROLLOVER (стало 3) - а это уже тайм-аут!

Где-то так...

 

А вот и очередной широкий рисунок - на этот раз для варианта с одним таймером и сбросом флагов как по фронтам, так и по спадам: http://www.pic16.nm.ru/likbez1/drawing7.gif
Похоже на правду?

 

И про флаги.

Заводим переменную START_FLAGS.
При старте программы присваиваем START_FLAGS значение 0b00001111, для 4 каналов.

При появлении импульса - проверяем, установлен ли в 1 соответствующий каналу бит START_FLAGS в 1.
Если установлен, то:
запоминаем показание таймера
сбрасываем бит
иначе
вычисляем ширину импульса.

Короче, это флажок, который означает, что импульс - первый, и длительность вычислить нельзя.
Его же устанавливаем при тайм-ауте, чтобы не иметь проблем после появления сигнала.

 

В принципе при 4 входах все флаги можно в один регистр запихать. Только нужно ли?