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

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

1 7 99

picmaniac: нежелательно устанавливать/сбрасывать биты командами bsf/bcf
не совсем понимаю, почему нежелательно?

 

Это относится только к регистрам портов.
Отвечу цитатой из книги В.С. Яценкова (стр.27-28):
Все операции записи в порт внутренне выполняются как чтение-модификация-запись. Например, когда исполняется команда bsf PORTA,3 (установить в единицу бит 3 порта А), то со всех линий порта А считываются реальные значения, присутствующие на выводах в этот момент, модифицируется третий бит и полученные значения записываются в регист-защелку PORTA. Таким образом, некоторые биты защелки PORTA могут иметь непредсказуемые значения. Если в процессе исполнения программы линии порта А после чтения будут перенастроены на вывод, на некоторых из них будут выставлены непредсказуемые уровни, что может привести к неожиданным результатам в работе устройства. В процессе написания программы, перед изменением настройки линий порта, рекомендуется явно задавать значения в защелке PORTA для критичных линий.
В общем, небольшая перестраховка, как правило не приводящая к заметному усложнению программы.
Splav56, предлагаю проиграть ситуацию по предложенному графу. Вначале все кнопки отпущены, затем нажмем кн.1, а затем (не отпуская кн.1) еще и кн.2. В каком состоянии окажемся?

 

picmaniac: Splav56, предлагаю проиграть ситуацию по предложенному графу. Вначале все кнопки отпущены, затем нажмем кн.1, а затем (не отпуская кн.1) еще и кн.2. В каком состоянии окажемся?

В состоянии "Запрет" - функция воздействия Х5 (нажато 2 и более кнопок), отклик Y5 (погасить все с/д).

 

Splav56: В состоянии "Запрет" - функция воздействия Х5 (нажато 2 и более кнопок), отклик Y5 (погасить все с/д).
А зачем их гасить, они и так будут все погашены откликами Y1/*.
Вообще функция с 2-мя кнопками какая-то лишняя (неинформативная)- гасить уже погасшие светодиоды, мало того, надо продумать насчёт дребезга контактов, а то при отпускании 2-х кнопок одна из них наверняка отключится раньше другой, и загорится комбинация последней кнопки. Какое-то временное окно надо ввести.
ПРрочитал и сообразил, что не въехал до конца в ТЗ, извиняюсь. С/д потухнут при отпускании, просто кратковременно вспыхнут, на время в зависимости у кого как руки дрожать будут.

 

gan: мало того, надо продумать насчёт дребезга

Да помним мы про дребезг контактов. В программе будет введена задержка на 20 мс, но на данном этапе рассмотрение таких мелочей обычно не делают. Включим этот эпизод в полный алгоритм.

 

Вот и алгоритм: http://b.foto.radikal.ru/0601/da3ce1b68ea2.gif

PS: в условиях проверки на нажатие клавиш нужно RB3:RB0=Fh заменить на RB0=1. Этого достаточно.

 

Всё равно не пойдёт. Нажали кнопку, первый раз заходим на условие RB=1, всё нормально, зажигаем с/д. На следующем цикле кнопку отпустить не успеем, опять попадаем на это же условие RB=0, тушим светодиоды, в следующем цикле опять поджигаем и т.д. нечётный цикл- зажигаем, чётный- гасим (пока нажата кнопка).
Я бы проверял по входам. Замаскировал бы соответств. бит, а потом проверял на FF.

 

Народ, спасибо за обсуждение, я тут всё копирую, печатаю, изучаю... Один вопрос по схеме... Там входы PIC-a (RB4-RB7) не нужно ли "подтянуть" к "+"? Или это делается программно? А ещё, дребезг контактов надо ли учитывать или как?

 

Левон: не нужно ли "подтянуть" к "+"?
В русском мануале на 16F62* стр.33 "К каждому выводу PORTB подключен внутренний подтягивающий резистор (типовое значение тока =200мкА). "
А насчёт дребезга, согласен с Splav56, не нужен. Если бы состояние на порту сохранялось бы после отпускания кнопки, тогда да, он бы был необходим. А так просто кратковременно вспыхнут ненужные с/д.

 

gan: Всё равно не пойдёт. Нажали кнопку, первый раз заходим на условие RB=1, всё нормально, зажигаем с/д. На следующем цикле кнопку отпустить не успеем, опять попадаем на это же условие RB=0, тушим светодиоды, в следующем цикле опять поджигаем и т.д. нечётный цикл- зажигаем, чётный- гасим (пока нажата кнопка).

gan где Вы такое увидели??? И что такое RB=1 и RB=0??? Нет таких. Есть конкретно 8 бит порта В: RB0 - RB7 из которых при проверке нас интересует только бит RB0, т.к. он устанавливается в ноль после обработки нажатия любой кнопки! Пишите, пожалуйста точнее!

Левон: Один вопрос по схеме... Там входы PIC-a (RB4-RB7) не нужно ли "подтянуть" к "+"? Или это делается программно? А ещё, дребезг контактов надо ли учитывать или как?

Левон, скачайте алгоритм. Подтягивающие резисторы включаются программно, Вы правильно заметили. Там в пятом сверху прямоугольнике значится: Включение подтягивающих резисторов порта В. А дребезг контактов (так всеми почему-то любимый и уважаемый , все о нем беспокоятся устраняется задержкой в 20 мс, введенной после нажатия каждой клавиши.

Алгоритм опроса кнопок в MPLAB не прогонял, т.к. во-первых подпрограмма еще не написана, а во-вторых и сам MPLAB 5-й версии я еще не установил. Поэтому в алгоритме вполне могут быть ошибки и неточности, которые надо будет устранить. Именно для этого мы здесь и ведем обсуждение.

Вопрос по графу: всех устраивает опубликованный вариант? Будем утверждать или еще уточнять? Правда мне совсем непонятно, облегчает-ли граф составление алгоритма? По-моему граф построить труднее, чем алгоритм. . Может быть в дальнейшем обойдемся без него, чтобы не забивать мозги?