|
|
|
|
Мой тайм-аут, вижу, превратился во всеобщий... Ну так как идейка? Реализовав принудительные опросы порта через каждые t мкс, что мы получим. Прерывание от таймера. Опросили порт. Если уровни на входах не отличаются от тех, что были t мкс ранее - просто выходим. Если отличаются - это аналогично установившемуся флагу RBIF. Захватываем значение таймера. Определяем, на каких входах и что произошло - фронт или спад. Если это был не первый фронт после включения или таймаута - считаем период. В общем получается похоже на вариант с прерываниями по изменению уровня. Только сигналом об изменении уровня на каком-либо входе уже не будет служить флаг RBIF. Изменения будем выявлять, проверяя уровни на входах через каждые t мск и сравнивая их. При таком подходе не страшна слишком высокая частота сигнала на входе. При работе с тайм-аутами всё-таки предлагаю начинать отсчёт времени от любого изменения уровня - учитывать как фронты, так и спады. Впрочем, это пока лишь предложение... я ещё подумаю - может ли грозить какими неприятностями учёт только фронтов. Предлагаю пока сосредоточиться на определении периода. Когда придём к согласию и разработаем алгоритм - перейдём к усреднению значений. |
|
|
picmaniac, честно говоря, рад. что народ начал дозревать до этой идеи Беда обработки таких вот "групповых" прерываний от портов заключается как раз в том, что на время обработки одного прерывания микроконтроллер становится слеп и глух к любым изменениям сигналов на линиях порта. Есть из такой ситуации один выход - немедленно сбрасывать флаг прерываний от порта при входе в обработчик, - но даже и он не гарантирует, что некоторые изменения сигнала не будут при этом потеряны. Поэтому групповые операции с портами лучше не привязывать к сигналам прерываний от линий порта, а делать их периодический опрос (или некую комбинацию из опроса и прерываний от порта). Во многих серьезных операционках работает даже специальная задача - обработчик потерянных прерываний, так что проблема эта не так легко разрешима, как это может показаться. На этом много шишек и шишечек было набито  |
|
|
Вот, как оказывается все непросто. А я-то страдаю и думаю, почему это наш ликбез застопорился? Наверное надо было попроще задачку для новичков взять? |
|
|
chav1961: рад. что народ начал дозревать до этой идеи Да, хорошо что подсказали. Наверно будем теперь в этом направлении идти. Если бы Вы нам помогли пример из книги Шалыто разобрать (Приложение 12) - вообще бы замечательно получилось. Точно ли там допущена неточность в указании конъюнкций на дугах? (подробности см. на стр.57-59). Zandy: попроще задачку для новичков взять? Так разделим эту задачу на несколько простых подзадач. Первая - "отлавливание" изменений уровня на входах и расчёт периодов. Вторая - усреднение результатов и сравнение их с заданными диапазонами. Третья - организация миганий. Четвёртая - объединение всего в кучу.
|
|
|
Вот он, вред излишнего теоретизирования! Простенькая задача превратилась в мегасложный проект ИМХО, всё же сначала проще по прерываниям от ножек. Кстати, пропущенные прерывания (а есть ли они?) выявляются на раз - той же самой проверкой изменения уровня с момента предыдущего прерывания. picmaniac: Так разделим эту задачу на несколько простых подзадач. Вот это правильно, вот это верно! 
|
|
|
AHTOXA: Простенькая задача Ага. Например, проехать через весь мегаполис за рулём - тоже ооочень простенькая задачка, особенно для начинающих. Непонятно только, почему спина мокрая? 
|
|
|
Ув picmaniac, в Шалыто смогу глянуть не ранее выходных К сожалению, ничем, кроме общих советов, помочь в обсуждении не могу - pic-и я просто не знаю, а на разных типах контроллеров одна и та же задача часто реализуется с точностью до наоборот. Но поделить задачу было бы действительно неплохо  |
|
|
Да мы особо не торопимся. Там, в общем-то, небольшой вопрос по построению графа, без привязки к конкретному МК. |
|
|
picmaniac: Ага. Например, проехать через весь мегаполис за рулём - тоже ооочень простенькая задачка, особенно для начинающих. Ну, тут разная степень риска С одной стороны - здоровье/жизнь/деньги, с другой - практически ничего Вроде всё было определено: - прерывания по изменению уровня; - определение длительности импульса по разности между текущим и предыдущим значениями таймера; - прерывания по таймеру (для тайм-аутов и мигания); Вроде, всё? И чего тут рассусоливать? (Это я пытаюсь бросить Zandy в воду, чтоб он наконец поплыл )
|
|
|
Тут каждый со своей колокольни смотрит, естественно. Если я, к примеру, написание кода уже освоил, то мне интереснее повозиться с теорией - получше разобраться с графами, например, и с оптимальными алгоритмами. Код написать потом - дело техники. А кто недавно начал - тому сам процесс создания программы и оживления контроллера интереснее, вспоминаю себя несколько лет назад. Хорошо, что одно другому особо не мешает. Набивать руку в написании кода можно безо всяких графов и алгоритмов. Я сам так и делал. Ставил себе простые задачки и постепенно разбирался. Моей учебной задачкой было создание программируемого таймера с четырьмя 7-сегментными индикаторами, до 99 мин 59 сек, с установкой любой выдержки кнопками, с выдачей звукового и светового сигналов по окончании выдержки. Начал с нуля, вообще с нуля. Компьютер с подключением к Инету, свежекупленный PIC16F84, пачка журналов "Радио", и - главное - огромный энтузиазм и решимость добиться успеха. Помаленьку разбирался вечерами, после работы, в основном по статьям ASD. Алгоритм выстраивался в голове. Через месяц таймер уже заработал в железе. До сих пор жив, лежит в шкафу. А уже достаточно сложные задачки лучше решать сначала в виде графа и алгоритма. Вот я и осваиваю применение графов сейчас. Это и в жизни пригодится, не только для хобби. |
|
|
|
|