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

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

1 8 99

Splav56: где Вы такое увидели??? Да на блок-схеме вашей.
Ещё раз повторяю. Заходим первый раз после после нажатия кнопки до условия RB0=1. ДА, равен еденице. Зажигаем светодиоды, в том числе устанавливаем и RB0=0 !!! Это правильно?
Проходит несколько десятков микросекунд, начинается второй цикл, а кнопка у нас ещё НЕ ОТЖАТА. Следовательно снова попадаем на условие RB0=1. А НЕТ, не равно еденице- прошлый раз мы его установили в ноль, ГАСИМ светодиоды. Это правильно?
И так далее.
В данном конкретном случае это приведёт только к тому, что яркость светодиодов будет в 2 раза меньше, в данном случае это непринципиально, но это стопроцентный баг.

 

Есть замечание по графу, я вчера уже упоминал об этом.
Разберем ситуацию подробнее. Кнопки отпущены - состояние "ожидание". Нажали кн.1 (выполнили условие Х1) - перешли в состояние "работа 1" по ветви Y1. Выход из состояния "работа 1", если посмотреть на граф, возможен только при ОТПУЩЕННОЙ кн.1 (условие Х1/1) и происходит по ветви Y1/1. А мы, не отпуская кн.1, нажимаем кн.2. По ТЗ - все светодиоды должны погаснуть. И куда теперь деваться из состояния "работа 1"?
Предлагаю такой вариант - выход из состояния "работа 1" происходит при любом положении кнопок, кроме одного (когда нажата только кн.1). Аналогично для других состояний "работа". Примерно так: (если картинка не грузится, вот ссылка http://www.pic16.nm.ru/graf03.gif )

Насчет дребезга. Задержка сама по себе ничего не дает. Подавление дребезга в простейшем случае осуществляется так: проверяем нажатие кнопки, если нажата - делаем паузу от дребезга и повторно проверяем. Если и в этот раз кнопка нажата - признаем нажатие состоявшимся. В противном случае - был дребезг. А в критичных случаях - желательно несколько задержек сделать, несколько проверок, и только если ВСЕ результаты совпадут - признаем, что нажатие было.
На первом этапе при хороше алгоритме дребезг нам не помешает. Не успеет глаз его заметить. Для простоты подавление пока можно не делать.

 

gan: Заходим первый раз после после нажатия кнопки до условия RB0=1.

Еще раз отвечаю, мне (ЧАЙНИКУ) не понятно. Куда заходим первый раз, после нажатия кнопки до условия RB0=1???

Смотрим алгоритм после инициализации:
1. Действие №1 - гасим светодиоды , подключенные к выводам порта В: RB0:RB3, записав в защелку порта FFh, т.е единицы. Т.к. выводы порта В RB4:RB7 сконфигурированы как входы, то это не отразится на их состоянии.
2. Начинаем опрашивать кнопки. Опрашиваем, начиная с кнопки №1.
Допустим кнопка №1 нажата. Для исключения дребезга контактов и подмаргивания с/д задаем задержку в 20 миллисекунд, после чего включаем светодиод №1, т.е. на выводе RB0 устанавливаем лог. ноль. Если кнопка №1 не нажата, то продолжаем опрашивать клавиатуру: следующей опрашиваем кнопку №2. Допустим к тому моменту кнопка №1(или любая другая) еще не отпущена и на выводе RB0 сохраняется лог.0. Если кнопка №2 не нажата, переходим к опросу кнопки №3. Если кнопка 2 нажата: вызываем подпрограмму задержки 20мс, для исключения дребезга, после чего проверяем состояние бита RB0. Т.к. на сей момент кнопка №1(или любая другая) еще нажата, то условие RB0=1 не выполняется, следовательно все светодиоды должны погаснуть (см переход на "Гашение светодиодов Port B=FFh".
Если же на выходе порта RB0 установлена лог.1(все кнопки отжаты, кроме опрашиваемой), RB0=1 (что соответствует условию, когда ни одна кнопка не нажата), включаем соответствующие с/д и переходим к опросу кнопки №3. Далее по образцу.
Ну и где здесь баг???

picmaniac: А мы, не отпуская кн.1, нажимаем кн.2. По ТЗ - все светодиоды должны погаснуть. И куда теперь деваться из состояния "работа 1"?

To picmaniac: Александр, давайте обсудим алгоритм, а к графу вернемся чуть позже.

Пока же могу только сказать что этот режим отражает часть графа с вершиной "Запрет" Х5/Y5. Из узла "Работа1" выход может быть осуществлен только по событию "отпускание кнопки №1". На графе не отражены события, которые не воляют на узлы графов непосредственно. Я так понял объяснения в статье Гладштейна. Возможно я не прав и надо из каждого узла еще провести связь Y5. Буду еще думать.

 

Splav56, попробуйте проиграть ситуацию, когда нажата и удерживается нажатой кнопка 2. Пройдитесь по алгоритму несколько раз циклически - и всё поймёте!

Предлагаю прислушаться к народной мудрости "будь проще" и сделать так:
http://www.pic16.nm.ru/likbez_algo01.gif

Здесь TEMP - выбранный программистом для временного хранения данных регистр ОЗУ (любой из свободных, какой выберем, например с адресом 020h)

 

picmaniac: попробуйте проиграть ситуацию, когда нажата и удерживается нажатой кнопка 2. Пройдитесь по алгоритму несколько раз циклически - и всё поймёте!

ОК! завтра покумекаю.

А пока вопрос: установил MPLAB5.70, но при копировании текста через буфер обмена в редактор МПЛАБа вся кириллица заменяется вопросительными знаками. Он что вообще кириллицу не воспринимает или где-то надо переключить раскладку. Если надо, то где?

 

Вот блин, протупил я немного. Вместо двух, трех, четырех светодиодов зажигал второй, третий, четвертый по одному. Уже исправил в алгоритме.

MPLAB5.70 кириллицу воспринимает нормально, только что попробовал из .txt вставить русскоязычный фрагмент. Пользуюсь обычно Windows Commander - ом, открываю файл клавишей F3, выделенный фрагмент "копировать как текст" - и вставляется в MPLAB нормально. А раскладка переключается как обычно, Ctrl+Shift.

 

По алгоритму: усек ошибку в нарисованном мной. Действительно будет мигалка.

По МПЛАБу: он кириллицей пишет в редакторе нормально, но когда скопировал из "блокнота" в его редактор, он всю кириллицу заменил на вопросительные знаки.

PS: пошел разбираться с алгоритмами.

 

Раньше не придавал значения, но по мере накопления опыта программирования пришел к тому, что лучше разделять ввод, обработку и вывод информации. Потому предлагаю немного изменить последний алгоритм (см. рис.). Кроме того, такое изменение приведёт к уменьшению количества операций в дальнейшем. Чтобы сильно не запутывать изменениями не стал удалять последнее W:=B'00001111'. Вместо этого присвоения можно просто перейти на начало данного алгоритма.
А вообще, лично для себя никогда не рисую блок-схемы потому, что это другой язык описания алгоритма и потом придется всё переписывать повторно, но уже на язык программирования, получается как бы переводим с русского на немецкий, чтобы потом перевести на английский, но в каждом языке есть своя красота, и часто невозможно целым предложением объяснить то, что в другом языке обозначается одним словом. Я не настаиваю, каждый изучает так, как ему удобнее и это, наверное, правильно.

 

кто подскажет, в чём проблема, MPLAB пишет следующее:
"MPLAB is unable to find output file "A.HEX". This may be due to a compile, assemble, or link process failure.
Build failed"
что я сделал не так? первый раз пробую MPLAB, больше привык к TASMу, так что ошибка может быть вообще какаянибудь глупая за которую потом стыдно будет. происходит в момент компиляции, выполняется следующее:
Compiling A.ASM:
Command line: "C:\PROGRA~1\MPLAB\MPASMWIN.EXE /e+ /l+ /x- /c+ /p16F84A /q D:\проект\проект\A.ASM"

 

SAK: лично для себя никогда не рисую блок-схемы потому, что это другой язык описания алгоритма и потом придется всё переписывать повторно, но уже на язык программирования
Я тоже так думал, пока программки были на 10-20 команд. Но когда прога приближается к 1000 команд и в ней море переходов, условных-безусловных- с прямой- косвенной адресацией- кучей подпрограмм, а метки переходов в самых разных концах, программа становится абсолютно нечитаемой (а если ещё экономить на комментариях...)- через неделю вы всё забудете и даже сами будете смотреть на свою же программу круглыми глазами. А блок-схема алгоритма это костяк (скелет), на который потом навешивается мясо из команд, и который можно окинуть одним взглядом. Я для себя решил на программы больше 100 операторов обязательно составлять алгоритм, но это моё личное мнение, основанное на моём личном опыте.