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

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

1 65 99

Мой тайм-аут, вижу, превратился во всеобщий...
Ну так как идейка? Реализовав принудительные опросы порта через каждые t мкс, что мы получим.
Прерывание от таймера. Опросили порт. Если уровни на входах не отличаются от тех, что были t мкс ранее - просто выходим. Если отличаются - это аналогично установившемуся флагу RBIF. Захватываем значение таймера. Определяем, на каких входах и что произошло - фронт или спад. Если это был не первый фронт после включения или таймаута - считаем период.
В общем получается похоже на вариант с прерываниями по изменению уровня. Только сигналом об изменении уровня на каком-либо входе уже не будет служить флаг RBIF. Изменения будем выявлять, проверяя уровни на входах через каждые t мск и сравнивая их.
При таком подходе не страшна слишком высокая частота сигнала на входе.
При работе с тайм-аутами всё-таки предлагаю начинать отсчёт времени от любого изменения уровня - учитывать как фронты, так и спады. Впрочем, это пока лишь предложение... я ещё подумаю - может ли грозить какими неприятностями учёт только фронтов.

Предлагаю пока сосредоточиться на определении периода. Когда придём к согласию и разработаем алгоритм - перейдём к усреднению значений.

 

picmaniac, честно говоря, рад. что народ начал дозревать до этой идеи Беда обработки таких вот "групповых" прерываний от портов заключается как раз в том, что на время обработки одного прерывания микроконтроллер становится слеп и глух к любым изменениям сигналов на линиях порта. Есть из такой ситуации один выход - немедленно сбрасывать флаг прерываний от порта при входе в обработчик, - но даже и он не гарантирует, что некоторые изменения сигнала не будут при этом потеряны. Поэтому групповые операции с портами лучше не привязывать к сигналам прерываний от линий порта, а делать их периодический опрос (или некую комбинацию из опроса и прерываний от порта). Во многих серьезных операционках работает даже специальная задача - обработчик потерянных прерываний, так что проблема эта не так легко разрешима, как это может показаться. На этом много шишек и шишечек было набито

 

Вот, как оказывается все непросто. А я-то страдаю и думаю, почему это наш ликбез застопорился? Наверное надо было попроще задачку для новичков взять?

 

chav1961: рад. что народ начал дозревать до этой идеи
Да, хорошо что подсказали. Наверно будем теперь в этом направлении идти.
Если бы Вы нам помогли пример из книги Шалыто разобрать (Приложение 12) - вообще бы замечательно получилось. Точно ли там допущена неточность в указании конъюнкций на дугах? (подробности см. на стр.57-59).

Zandy: попроще задачку для новичков взять?
Так разделим эту задачу на несколько простых подзадач. Первая - "отлавливание" изменений уровня на входах и расчёт периодов. Вторая - усреднение результатов и сравнение их с заданными диапазонами. Третья - организация миганий. Четвёртая - объединение всего в кучу.

 

Вот он, вред излишнего теоретизирования! Простенькая задача превратилась в мегасложный проект

ИМХО, всё же сначала проще по прерываниям от ножек. Кстати, пропущенные прерывания (а есть ли они?) выявляются на раз - той же самой проверкой изменения уровня с момента предыдущего прерывания.

picmaniac: Так разделим эту задачу на несколько простых подзадач.

Вот это правильно, вот это верно!

 

AHTOXA: Простенькая задача Ага. Например, проехать через весь мегаполис за рулём - тоже ооочень простенькая задачка, особенно для начинающих. Непонятно только, почему спина мокрая?

 

Ув picmaniac, в Шалыто смогу глянуть не ранее выходных К сожалению, ничем, кроме общих советов, помочь в обсуждении не могу - pic-и я просто не знаю, а на разных типах контроллеров одна и та же задача часто реализуется с точностью до наоборот. Но поделить задачу было бы действительно неплохо

 

Да мы особо не торопимся. Там, в общем-то, небольшой вопрос по построению графа, без привязки к конкретному МК.

 

picmaniac: Ага. Например, проехать через весь мегаполис за рулём - тоже ооочень простенькая задачка, особенно для начинающих.

Ну, тут разная степень риска С одной стороны - здоровье/жизнь/деньги, с другой - практически ничего

Вроде всё было определено:
- прерывания по изменению уровня;
- определение длительности импульса по разности между текущим и предыдущим значениями таймера;
- прерывания по таймеру (для тайм-аутов и мигания);

Вроде, всё? И чего тут рассусоливать?

(Это я пытаюсь бросить Zandy в воду, чтоб он наконец поплыл )

 

Тут каждый со своей колокольни смотрит, естественно. Если я, к примеру, написание кода уже освоил, то мне интереснее повозиться с теорией - получше разобраться с графами, например, и с оптимальными алгоритмами. Код написать потом - дело техники. А кто недавно начал - тому сам процесс создания программы и оживления контроллера интереснее, вспоминаю себя несколько лет назад. Хорошо, что одно другому особо не мешает. Набивать руку в написании кода можно безо всяких графов и алгоритмов. Я сам так и делал. Ставил себе простые задачки и постепенно разбирался. Моей учебной задачкой было создание программируемого таймера с четырьмя 7-сегментными индикаторами, до 99 мин 59 сек, с установкой любой выдержки кнопками, с выдачей звукового и светового сигналов по окончании выдержки. Начал с нуля, вообще с нуля. Компьютер с подключением к Инету, свежекупленный PIC16F84, пачка журналов "Радио", и - главное - огромный энтузиазм и решимость добиться успеха. Помаленьку разбирался вечерами, после работы, в основном по статьям ASD. Алгоритм выстраивался в голове. Через месяц таймер уже заработал в железе. До сих пор жив, лежит в шкафу.
А уже достаточно сложные задачки лучше решать сначала в виде графа и алгоритма. Вот я и осваиваю применение графов сейчас. Это и в жизни пригодится, не только для хобби.