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

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

1 4 17

Я предлагаю 7-сегментный индикатор не для мегазамка , а для того, чтобы научиться работать с клавиатурой. Для второго учебного проекта. Насчет алгоритма для замка вообще по-моему еще рано говорить. У нас еще кирпичики не готовы, а уже порываемся дом строить. Не из чего пока. Мегазамок ИМХО может быть проектом № 5, не раньше. Когда будем иметь готовые отлаженные программные модули для работы с клавиатурой, для работы с индикатором, для работы с энергонезависимой EEPROM, и т.п.
Модель индикатора для Протеуса была бы очень полезной при отладке программы. Гораздо оперативнее, чем на макете. И к тому же всем доступно - даже тем, у кого реального индикатора нет

 

У меня есть некие вспомогательные схемы.. Пару лет тому назад в Митино была палатка с громкой надписью:"PIC & AVR" ("старожилы" вспомнят... ) В палатке стояли 2 добродушных парня - Саша Шипов и Алексей Савостьянов (если не ошибаюсь..). Я вот иногда у них "затоваривался", задавал им разные вопросы... Они охотно отвечали. Сейчас их там давно уже нет, у них теперь своя серьёзная фирма. Так вот, хочу поделиться информацией по i2c индикаторам, которую они мне в своё время любезно предоставили!
http://www.paguo.newmail.ru/shema2.jpg - "монитор" - схема подключения индикатора к PIC-y.
http://www.paguo.newmail.ru/shema1.jpg - то же, упрощённый вариант.
http://www.paguo.newmail.ru/MONITOR.C - программа для этой схемы (на языке "С")
http://www.paguo.newmail.ru/DEMODISP.C - программа, пример индикации фамилии и тлф. создателя бегущей строкой.
Две последние ссылки лучше просматривать в кодировке DOS.

 

Что-то совсем тихо тут стало... Предлагаю для начала сделать клавиатуру по простой схеме:
http://www.pic16.nm.ru/likbez2/ButtonMatrix5.gif

Программа также получится несложной. RB1,RB2,RB3 - выходы; RB4,RB5,RB6,RB7 - входы. Поочередно выставляем лог.0 на выходах (столбцах) и проверяем состояние входов. RB0 предлагаю пока оставить свободным - он может пригодиться как вход внешнего прерывания INT.
Информацию о состоянии кнопок можем обработать и поместить в один байт. Например, так: младшие 4 бита (0-3) соответствуют нажатой цифре, биты 4 и 5 соответствуют состояниям кнопок "*" и "#", два старших бита могут использоваться для информации о том, что нажато более 1 кнопки. Таким образом, появится возможность использовать кнопки "*" и "#" совместно с цифровыми, подобно клавишам "Shift" и "Ctrl" на компьютере.

 

Не сдержался и забросил все дела!
Вот моя идея в реализации. Пока без обработки нажатия двух клавиш.
Токльо, я так понял, наоборот - RB1,RB2,RB3 - входы; RB4,RB5,RB6,RB7 - выходы
В связи с отсуствием макета и Протеуса, не смог нормально протестировать

39346.asm

 

Сергей К: наоборот - RB1,RB2,RB3 - входы; RB4,RB5,RB6,RB7 - выходы
Нет, всё написано правильно. Если все кнопки отпущены - то на всех четырех входах будут лог.1 благодаря подтягивающим резисторам. При нажатой кнопке ток пойдет по цепи "плюс - подтягивающий резистор - вход - внешний резистор - нажатая кнопка - диод - выход (лог.0) - минус (он же общий)". И на соответствующем входе появится лог.0.

Не стОит спешить с написанием кода. "Ведь дуги гнут с уменьем и не вдруг". Лучше начать с алгоритма - хотя бы для себя, на листке, упрощенно. Когда станет совершенно ясно, что контроллер должен делать в любой ситуации (а для этого полезен граф) - вот тогда правильный код ваять будет легко и приятно.

 

Allex: adc876proteus.gif - даже из названия рисунка видно, что это сделано в Proteus-е. Причем, это не просто схема, а действующая модель
Спасибо.Просто с Proteus'ом не работал, не было пока острой необходимости. Хотя... меня заинтересовали его возможности. Какую версию посоветуете? Интересует не самая свежая, а распространенная, надежная.

 

А в чем преимущество в использовании подтягивающих резисторов в этом варианте? Ведь нажимая на кнопку, мы практически делаем КЗ и весь ток идет через этот резистор.
А почему бы не сделать на оборот? RB1,RB2,RB3 - входы; RB4,RB5,RB6,RB7 - выходы. Тогда выставляя "1" поочередно на каждой строке, проверяем состояние колонки. При этом ток через МК будет минимальный (экономим киловатт*часы

picmaniac: Не стОит спешить с написанием кода
Поспешил

 

Преимущества внутренних подтягивающих резисторов:
1. Не требуются внешние резисторы, а ведь входы всё равно должны быть подтянуты либо к плюсу, либо к минусу.
2. Ток через них очень мал, так что расточительства киловатт не будет.
Если сделать наоборот, к чему подтянем 3 входа? И чем? К тому же программа усложнится. Надо будет 4 раза состояние выходов менять, а так только 3. А считываем всё равно одной инструкцией состояние всех 8 разрядов порта, лишние потом замаскируем. В принципе, сделать можем как угодно. Я предлагаю вариант, который считаю оптимальным для начала.

 

picmaniac: будет 4 раза состояние выходов менять, а так только 3
тогда, почему бы не просто поочередно выдавать по линии с1, с2, с3 логическую "1" и считывать, на каких r1, r2, r3, r4 она появилась? В этом случае можно исключить диоды и разделительные резисторы (220 Ом), т.е. оставить только саму матрицу кнопок.

 

...а потом нажать две кнопки и выжечь пару линий порта