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

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

1 36 99

Zandy: Вот Splav56, решил одну задачку и ему хватило.

Не хватило! Просто я недавно, как говоит picmaniac, "купил мотоцикл" - сварганил железо для работы с 874-м и загорелся одним проектом, который хочу выполнить на нем. Пишу на mb, поэтому въезжать дополнительно в тонкости программирования бегущих огней на асме просто физически не могу. Итак уже по ночам во сне программирую и алгритмы рисую.
. Но я слежу за веткой и все записываю.

 

Zandy, я просмотрел программу. Она с моими комментариями в аттаче. Разбираться по чужому коду не очень-то приятно, хоть и с комментариями. Поэтому я и призываю начинать с графов и алгоритмов. Тогда каждый желающий сможет охватить замысел программиста буквально "одним взглядом".

60872.asm

 

picmaniac: Разбираться по чужому коду не очень-то приятно, хоть и с комментариями. Поэтому я и призываю начинать с графов и алгоритмов.
Да, конечно, я понимаю. Вот привожу то ли граф, то ли алгоритм задачки Владимира Петровича. Рисовал, старался, думаю будет понятно. Там есть и краткое словесное описание сути работы.
Хотелось бы понять, правильный ли алгоритм? И правильно ли по нему составлена программа? В алгоритме условно показана обработка только одной кнопки. С другой кнопкой аналогично и независимо от первой в тех же прерываниях. Т. е. прерывание - обработка одной - обработка другой - выход из прерывания.
Хочу с этим закончить, а потом вернуться к основному заданию. Работать сразу с двумя заданиями пока сложновато. Как-то это задание вклинилось (не здорово конечно). Просто боюсь, что потом забуду всё. Но как-то эти задания перекликаются все-таки.
Если чего-то не уточнил или не договорил, готов сразу ответить и дать разъяснения. В голове-то держится всё, а вот на бумагу грамотно выложить - уж очень много времени уходит на осмысление, чего писать, а чего не надо. Поэтому, конечно какие-то моменты оказываются упущенными не по злому умыслу.
А в какой проге лучше графы и алгоритмы рисовать? Чтобы было максимально удобно? Я перепробовал разные, что-то ни одна не нравится.

Еще глянул и заметил двоякость понимания что-ли. Запись текущего состояния кнопки в отфильтрованное происходит ТОЛЬКО при обнулении счетчика. Нужно было в том квадрате написать "разрешение записи".
В том то и сложность составления графов-алгоритмов, что самому вроде все ясно, а вот до других понятно донести - проблема.

А алгоритм мне понравился тем, что происходит обработка кнопок и при отпускании. Т. е. тот самый случай, когда кнопка удерживается, и мы ослабляем давление на кнопку. Идет "борода". И если эта "борода" "укладывается" в алгоритм, ничего страшного не происходит.

60898.doc

 

неправильно, тот, что был раньше, был лучше (две ветки дублируются). Не знаю, как удалить вложение.

60912.doc

 

Так, ладно, отвлечёмся на промежуточную задачу ненадолго. "Прерывание от Петровича"
Как я понимаю суть этой задачи (для простоты сперва одну кнопку RB6 рассмотрим). Необходимо отстроиться от дребезга при нажатии/отпускании кнопки, а также от помех (возможных посторонних импульсов на входе). Информацию о выявленном состоянии кнопки (отфильтрованном от дребезга и помех) записать в предусмотренный нами для этого регистр TPORTB.
Признание кнопки нажатой происходит тогда и только тогда, когда получен одинаковый результат (нажата!) при нескольких повторных опросах её положения. Сколько раз подряд должен быть получен такой результат? Предлагается 5.
А как быть с отпусканием кнопки? Судя по "заданию" на стр.31, если мы 3 раза подряд опросили кнопку и получили результаты "нажата", а при следующем опросе получили результат "отпущена" - то надлежит предыдущие положительные результаты признать недействительными, и начать сначала. Пока не получим все 5 результатов "нажата" подряд. Так?
Как быть с выявлением положения "отжата"? Аналогично?

Как сделано в программе.
При инициализации записываем требуемое число повторных опросов в счётчик - регистр COUNTRB6, а в регистр REGRB6 записываем - положение кнопки "отпущена".
Периодически (допустим, каждые 18 мс) происходит прерывание от таймера.
В подпрограмме обработки прерываний (для краткости буду называть её просто "обработчик") считываем текущее положение кнопки и сохраняем его в регистре TEMP. Не интересующие нас биты маскируем нулями. Затем сравниваем полученный результат с тем положением кнопок, которое было выявлено ранее, и сохранялось в регистре REGRB6. Положение кнопок, сохраняемое в REGRB6, называем "отфильтрованным".

Если результаты отличаются - значит положение кнопки изменилось (а может быть это помеха появилась). Декрементируем (уменьшаем на 1) число в счётчике - регистре COUNTRB6. И только если после этого декремента счётчик дошёл до нуля - тогда записываем новое состояние кнопки в REGRB6 и записываем в счётчик COUNTRB6 исходное число требуемых повторных опросов (5).
Таким образом проверяем - сохранилось ли новое положение кнопки неизменным в течение требуемого количества её опросов. И если сохранилось - то записываем это новое отфильтрованное положение в REGRB6, а счётчик возвращаем в исходное состояние.

Если результаты одинаковы - значит :
- либо положение кнопки и не изменялось вовсе (или не нажимали, или не отпускали),
- либо оно вернулось к предыдущему до того как изменение положения было признано состоявшимся (т.е. была помеха или дребезг).
Признаём изменение положения не состоявшимся. Записываем в счётчик COUNTRB6 исходное число требуемых повторных опросов (5).

Перед выходом из обработчика - копируем данные из REGRB6 в TPORTB. Это и есть искомый отфильтрованный результат.
Выходим из обработчика. Результат сохранён в регистре TPORTB.
Обработка прерывания занимает очень небольшое время. Поэтому такой подход к решению задачи оставляет свободными большую часть ресурсов МК.
Теперь подумаю насчёт алгоритма.

 

Ну да, вроде бы все так. Алгоритм то я правильно нарисовал?

 

Это скорее не граф и не алгоритм, а поясняющий рисунок. Предлагаю придерживаться стандартных обозначений.
Для графа - кружочки (состояния) и стрелки. Над стрелками условия перехода, под стрелками действия.
Для алгоритма: действия - в прямоугольниках, условия - в ромбиках. Посмотрите, например, вариант алгоритма по техзаданию № 1 на стр.8. Или в "ликбезе № 2".
Рисую я обычно в Visio.

А по сути вроде всё нормально. Сходу я ошибок не нашёл. Zandy, примите мои поздравления!

Конечно, будет очень хорошо, если своё мнение выскажет заказчик - Vlad_Petr.

Кстати, мы вот устройство по техзаданию № 3 обсуждаем-обсуждаем... А схемы-то всё нет. Объявляю конкурс! Тот, кто первым нарисует принципиальную электрическую схему безошибочно и красиво - будет удостоен титула "почётный учаснег ветки Ликбез"

 

Пора нам уже макрокоманды освоить. Это совсем просто. Они очень здорово помогают. С их помощью программист может добавить к существующей системе команд PIC свои собственные. Подробности - см. "Радио" № 9 - 2001г., стр.24. Макрокомандами можно пользоваться при написании кода точно также, как и обыкновенными командами. Сколько угодно раз. Это мощный и удобный инструмент. Целый кусок кода можно заменить одной строчкой. При компиляции ассемблер заменяет каждую макрокоманду указанной программистом при её определении последовательностью обычных команд (из стандартного набора). Применение макрокоманд не даёт экономии памяти программ, в отличие от использования подпрограмм. Преимущество макрокоманд в удобстве для программиста и быстроте их работы (не расходуется стек и время на вызов, как для подпрограмм).
Предлагаю свой, очень удобный набор макрокоманд: http://www.pic16.nm.ru/likbez1/macro01.asm.txt
В дальнейшем, надеюсь, мы будем этот набор пополнять.

 

picmaniac: http://www.pic16.nm.ru/likbez1/macro01.asm.txt
А комментарий в какой кодировке?
Я добавил текстовый алгоритм (пример) обработки одной кнопки в "Чемберлене"....
Zandy , я посмотрел программу. К правильным замечаниям picmaniac ничего существенного добавить не могу.

 

picmaniac: Zandy, примите мои поздравления!
Спасибо. Но я все-таки думаю, что не все там оптимально, но сейчас для меня важнее, чтобы правильно было.
Vlad_Petr: Я добавил текстовый алгоритм (пример) обработки одной кнопки в "Чемберлене"....
Я почитал. Хоть и кракозябры несколько отличные от тех, которые приняты в пиках, но мне думается, что смысл алгоритма я уловил верно.

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

Посмотрел http://www.pic16.nm.ru/likbez1/macro01.asm.txt. С кодировкой комментов действительно не все в порядке.

Схему задания №3 я нарисую и выложу.

60978.asm