|
|
|
|
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 операторов обязательно составлять алгоритм, но это моё личное мнение, основанное на моём личном опыте. |
|
|
|
|