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

Ликбез по программированию PIC , vol. # 2

1 2 17

picmaniac: Посмотрел я ту хитрую схему. Принцип там такой:

В нарисованной схеме ошибочка, первый от м/к диод надо анодом завести на RB7, а не на RB6 как нарисовано на схнме.

 

Вместо индикатора хорошо бы использовать этот:

Вот (407кб) его описание, а тут описание i2c-шной шины.

 

Splav56: В нарисованной схеме ошибочка
Да вроде нет там ошибки, так в исходной схеме тут и нарисовано:
http://www.disall.narod.ru/circuit.htm
Я уже в Протеусе эту схемку погонял. Проверьте внимательно соответствия, которые под рисунком указаны - я не вижу там ошибок.
А зачем в схеме от 15:27 резисторы на "общий"? И не лучше ли для сброса отдельную кнопку применить - по идее, не так уж часто потребуется сброс. А "*" задействуем в клавиатуре. Еще я предлагаю между клавиатурной матрицей и контроллерам поставить 4 защитных резистора (эдак Ом по 220-510) в "строки" и 3 диода в "столбцы" для развязки. В этом случае "нули" и "единицы" на столбцах не будут мешать друг другу.

Левон, до ЖК индикатора мы еще дойдем. Не у всех такой есть. У меня, например, нет такого пока. А светодиодный 7-сегментный наверняка найдется у всех. Поэтому предлагаю с него начать.

 

picmaniac: Да вроде нет там ошибки

Прокрутите: RB4=0 RB5, RB6, RB7 - входы.

 RB7  RB6  RB5  RB4
1 1 0 0 " * "
1 0 1 0 " 0 "
0 1 1 0 " # "

полагаю что должно быть так. Иначе при нажатии 0 и # мы получаем одинаковую комбинацию, вход RB7 вообще не участвует при этом.

 

picmaniac: по идее, не так уж часто потребуется сброс.

Сброс понадобится часто, как только будет набрана неверно хоть одна цифра в комбинации.

picmaniac: А зачем в схеме от 15:27 резисторы на "общий"?

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

picmaniac: Еще я предлагаю между клавиатурной матрицей и контроллерам поставить 4 защитных резистора (эдак Ом по 220-510) в "строки" и 3 диода в "столбцы" для развязки. В этом случае "нули" и "единицы" на столбцах не будут мешать друг другу.

Получится то же самое, что я нарисовал, только кол-во резисторов будет равно кол-ву диодов и наоборот.

 

picmaniac: светодиодный 7-сегментный наверняка найдется у всех.
Так ведь "жрут" они сколько - за минуту работы светодиодный "съест" столько, сколько ЖК за неделю... Причём в ЭТИХ и встроенные часы есть....
picmaniac: У меня, например, нет такого пока.
Их продают везде... Могу поискать, презентовать...

 

За предложение спасибо. Как на радиорынок выберусь - поищу. Прикуплю парочку, если найду. Сколько такие стоят примерно?
Вообще мне больше нравятся алфавитно-цифровые HD44780. Таких у меня аж 2 штуки есть (Winstar 16х2). Вот с ними я успешно работал.
http://www.pic16.nm.ru/likbez2/adc876proteus.gif

 

Splav56, давайте посмотрим внимательно.
RB4 = 0 (выход) ; RB5,RB6,RB7 - входы.
Нажата только "*". Ток вытекает из RB5 (благодаря подтягивающему резистору), проходит через второй справа по схеме диод, затем через нажатую кнопку "*", и втекает в RB4. Таким образом, на RB5 - лог.0. Через другие диоды ток не идет. RB6 и RB7 подтянуты к "плюсу" - на них лог.1. Получаем PORTB = B'1100xxxx'.
Нажата только кн."0". Ток вытекает из RB5 и из RB6, проходит через средние 2 диода, затем через нажатую кнопку и втекает опять же в RB4. Лог.0 - на RB5 и на RB6. RB7 подтянут к "плюсу" - лог.1. Получаем PORTB = B'1000xxxx'.
Нажата только "#". Ток вытекает из RB6, проходит через крайний левый по схеме диод, затем через нажатую кнопку "#", и втекает в RB4. Таким образом, на RB6 - лог.0. Через другие диоды ток не идет. RB5 и RB7 подтянуты к "плюсу" - на них лог.1. Получаем PORTB = B'1010xxxx'.
Всё достаточно просто.
Насчёт сброса. Аппаратный RESET по входу сброса _MCLR не так уж часто нужен. Для того, чтоб сбросить неверно введеную цифру, вовсе не обязателен RESET. Ведь если человек хочет "начать завтра новую жизнь", мы не станем бить его по голове до потери памяти, ресета и повторной инициализации Вот и PIC не обязательно лишний раз сбрасывать. Можем запрограммировать, к примеру, "*" - отменить набранный код, "#" - ввод набранного кода.
Насчёт резисторов для привязки к "земле". Входы висеть не будут, они у нас к плюсу подтянуты. А выходы - и подавно. Думаю, от этих резисторов можно безболезненно отказаться.
Насчёт развязок. Я предложил диоды поставить в столбцы вот почему. Допустим, строки настроены на вход, а столбцы на выход. Благодаря диодам возможна любая комбинация лог. уровней на выходах. Они не будут друг другу мешать даже при нажатии двух и более кнопок. Если поставить резисторы (см. самую первую схему на стр.1), то при нажатии двух кнопок (допустим, 1 и 2) возможна такая ситуация - на одном выходе 1, на другом 0, выходы при этом оказываются соединенными через резисторы. Какое при этом получится напряжение на линии r1 (на верхнем по схеме выводе контроллера)? Половина разницы напряжений между 1 и 0, т.е. возможна неопределенность.
Благодаря защитным резисторам в "строках" появляется возможность настраивать эти 4 вывода на выход и подключать к ним, допустим, индикатор. При этом нажатие двух и более кнопок также не представляет угрозы - ток ограничивается резисторами.

 

picmaniac: давайте посмотрим внимательно.

Я исхожу из того, что порт, устанавливаемый принудительно в 0 при опросе (например RB4) является выходным, а остальные (RB5 - RB7) - входные, в данный момент времени, и подтягивающие резисторы на них включены, т.е. изначально, когда ни одна кнопка не нажата, RB7:RB4 - 1110. При нажатии кнопки этой строки соответствующий порт сбрасывается в ноль. В чем тут ошибка? Я думаю такое решение тоже имеет место. А так как нарисовано в оригинале, смотрится криво. Правда исходник я не видел, но возникает вопрос, почему так сделано? Что мешает симметрично подключить диоды?

picmaniac: Вот и PIC не обязательно лишний раз сбрасывать.

А что ему от этого поплошает?

picmaniac: Насчёт развязок.

Давайте все-таки разберемся по очереди с каждой конкретной схемой подключения кнопок, а не скопом по всем. Иначе получается полный компот. Если говорим о 4-х портовой, то давайте обсудим все за и против, в том числе почему схема нарисована так, а не как я написал. Иначе мне не понятно.

 

Да, тут я небольшой винегрет устроил...
По схеме с четырьмя линиями и 6 диодами. Почему диоды подключены именно так - мне неизвестно. Видимо, у автора были свои определенные соображения. Я взял готовую схему по ссылке Левона. Проанализировав эту схему, пришел к выводу - она вполне работоспособна. Лог.0 будет на тех входах, которые через диоды и нажатую кнопку соединяются с выходом (а на этом выходе принудительно выставлен лог.0). Не вижу ничего плохого в том, что один из выводов контроллера (в данном случае RB7) останется свободным от диодов.
А последние 4 абзаца в моем предыдущем сообщении относятся к схеме с 7-ю линиями.
Контроллеру от сброса хуже не станет, конечно. Вопрос в том, нужно ли его лишний раз сбрасывать? Если действительно сочтём нужным - рука не дрогнет
Предлагаю обсудить возможные схемы подключения клавиатуры. В первую очередь те, которые уже предложены здесь. Выяснить достоинства и недостатки кадого варианта. И выбрать подходящую для наших целей схему.