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

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

1 64 99

Я что-то невнимательно читаю Начал отвечать на Ваше сообщение, и забыл его дочитать. Я про:

Zandy: При любой длительности входного сигнала, даже в сотни раз превышающей период прерываний, всегда при анализе прерываний обнаружится такой момент, когда изменение сигнала (или фронт) будет иметь место. И что мы с этим будем делать? Будем организовывать измерение длительности бесконечно большого периода, инкрементируя бесконечно длинный регистр ROLLOVER?

Я же уже написал, как это решается. Заводим флажок, который сигнализирует, что следующий импульс в канале будет первым. А при получении импульса смотрим, взведён этот флажок, или нет. Если взведён - только запоминаем значение таймера, и сбрасываем флажок. Если не взведён - то вычисляем длительность импульса.. Этот же флажок поможет нам при старте программы.

 

AHTOXA: и ждём импульса.
Так вот, импульс пришел, и довольно быстро после обнаружения тайм-аута. Что делать? Сбрасывать все флажки? В следующем прерывании опять есть импульс. И еще пять прерываний подряд есть импульс. Работаем штатно. На шестом прерывании опять тайм-аут. Мы так и будем дергаться? Вот я про что! Я и предлагал обработку именно такой ситуации.

 

AHTOXA: Заводим флажок, который сигнализирует, что следующий импульс в канале будет первым. А при получении импульса смотрим, взведён этот флажок, или нет. Если взведён - только запоминаем значение таймера, и сбрасываем флажок. Если не взведён - то вычисляем длительность импульса.. Этот же флажок поможет нам при старте программы.
Да, так можно. Одним выстрелом - двух зайцев. Но это возможно только в том случае, если, как вы и предлагаете, производить измерение в течении не менее двух периодов прерываний. Тогда получается. Но если нам этого не надо делать? Если нас в нашей задаче удовлетворяет измерение в течении одного периода, зачем же усложнять программу?

 

Ладно. Что-то мы зациклились на одном. Меня вот что интересует. Усреднять мы будем за 8 периодов или еще как? Откуда взялась эта цифра 8? Усреднять будем КАЖДЫЙ период по 8-и текущим отсчетам, или 8 периодов усредним, обнулим регистры, запишем новые 8 текущих значений, опять усредним и т. д? Усреднение будем проводить в прерывании или в основной программе? Сравнение с пороговыми значениями частот опять же где будем делать? В прерывании проще, но займет лишнее время, а это влияет на точность. В основной программе сложнее - опять надо будет дополнительно выстраивать очередность действий по каждому каналу. Выравнивать времена обработки по различным сценариям, т. к. еще и моргалки куда-то встраивать надо, т. е. вводить таймеры задержки. Как соорудить гистерезис при оценке значений? Короче, еще много ???????

Просто подумалось опять, а зачем нам такая быстрая обработка каналов (в прерывании), если самое быстрое мигание светодиода - 0.5 Гц. Это я по поводу предлагаемой в самом начале обсуждения последовательной обработки с ожиданием сигнала по каждому каналу.

 

Zandy: Так вот, импульс пришел, и довольно быстро после обнаружения тайм-аута. Что делать? Сбрасывать все флажки? В следующем прерывании опять есть импульс. И еще пять прерываний подряд есть импульс. Работаем штатно. На шестом прерывании опять тайм-аут. Мы так и будем дергаться? Вот я про что! Я и предлагал обработку именно такой ситуации.

Ну во-первых, можно и подёргаться, раз уж ТЗ такое
А во-вторых, можно тайм-аут сделать подлиннее. Тогда описанный Вами сигнал попадёт не в "пропадание" сигнала (то, о чём сигнализирует тайм-аут), а в "очень низкая частота". Но для этого надо научиться измерять длинные интервалы, чего Вы упорно не желаете

Zandy: Да, так можно. Одним выстрелом - двух зайцев. Но это возможно только в том случае, если, как вы и предлагаете, производить измерение в течении не менее двух периодов прерываний. Тогда получается. Но если нам этого не надо делать? Если нас в нашей задаче удовлетворяет измерение в течении одного периода, зачем же усложнять программу?

Нет, флажки никак не связаны с этим. Их можно применить в любом случае.

Насчёт остального. Начните уже писать программу, наконец Пусть пока без осреднения, без гистерезиса.
Программы не пишутся сразу набело, программы пишутся постепенно

 

Zandy: picmaniaca давно не слыхать. Способ, предложенный им, с задействованием дополнительного таймера тайм-аута самый простой и понятный
Бальзам на душу...

Я тут, никуда не делся. Просто вы так рванули вперёд, что мне не угнаться. На работе много дел свалилось, мозги работают там. Для расслабления вечерком уже выпил пивка. И сегодня буду не писателем, а читателем.

 

AHTOXA: Начните уже писать программу, наконец
Боюсь. Если уж по словесному алгоритму никак не договоримся, то уж в коде и совсем никому ничего понятно не будет.
А потом, я тут задал кучу вопросов, буду ждать ответов. Хоть направление дальнейшей работы понять.
Будем ждать, что picmaniac по поводу всего этого скажет. Он у нас здесь главный.

 

picmaniac: Просто вы так рванули вперёд, что мне не угнаться.

Йо-хоо! Я думал я один такой!

 

Спасибо, конечно, на добром слове и за доверие. Но, как сказано выше, на сегодня у меня - тайм-аут!

 

Просматривая ещё раз ветку, я вот под влиянием пива подумал - а не лучше ли будет сделать так, как скромно и тихо предложил chav1961 ещё на стр.50?
Отказаться от прерываний по изменению уровня на входах. И задействовать принудительный опрос порта через небольшие интервалы времени (t) в прерываниях по переполнению таймера. И неважно - какой уровень на каком входе в этот момент, и есть ли вообще сигнал. Нам важно получить "сэмплы" - уровни на входах через каждые t микросекунд, где t - период квантования, достаточно малый интервал времени, к примеру 512 мкс.
Такое квантование вполне допустимо. Максимально допустимая частота, к примеру, 50 Гц. Период минимум 20 мс. Длительность импульса - минимум 1 мс. Наверняка засечём.
А дальше уже анализируем, что на входах происходит. Выявляем фронты, спады, считаем интервалы времени между изменениями уровня, отслеживаем таймауты - это мы в общих чертах уже обсуждали.
Похоже, что такой подход заметно упростит решение задачи. Обсудим? (только уже не сегодня, пойду спать...)