Site Loader

Содержание

Как подключить к микроконтроллеру кнопки

   Почти ни одно изделие с микроконтроллером не обходится без кнопок. Тема эта уже избитая и во многом известная. Написанием этой статьи я не пытаюсь изобрести велосипед. Просто  решил собрать всю инфу по схемотехнике воедино. Думаю, что материал будет полезен начинающим.Чтобы не сбивать вас с толку, на приведенных ниже рисунках не показаны схемы питания, сброса и тактирования микроконтроллеров.
самый простой способ подключения кнопки к микроконтроллеру

                             рис1а                                                                            рис1б

 

   Если кнопок немного и дефицита выводов мк не наблюдается, используем традиционный способ подключения.

   Когда кнопка отпущена – вывод мк через резистор соединен с “плюсом” питания (рис. 1а). Когда кнопка нажата – вывод мк соединен с землей. Подтягивающий резистор R1  ограничивает силу тока в цепи переключателя. Если бы его не было, то при нажатии кнопки мы бы просто закоротили наш источник питания.

   В большинстве современных микроконтроллеров есть встроенные подтягивающие резисторы, поэтому внешние можно не ставить (рис1б). В программе микроконтроллера нужно будет настроить используемый вывод на вход и включить внутренний подтягивающий резистор.

   Что произойдет, если вывод микроконтроллера окажется в режиме выхода? Это будет зависеть от состояния этого вывода. Если на выводе “логический  ноль” – ничего страшного не случиться, потому что — в первом случае (рис1а) величина втекающего тока ограничена резистором R1, а во втором случае (рис1б)  никакой ток вообще не потечет. При нажатии кнопки тоже ничего не случиться, поскольку разность потенциалов между выводом и “землей” в этом случае будет равна нулю.

   Если же на выводе будет ”логическая единица” и кнопка окажется нажатой, то через вывод микроконтроллера на землю потечет ток величиной в несколько десятков миллиампер и вывод порта может “погореть”. Предельно допустимый ток для вывода микроконтролера AVR согласно документации равен 40 мА. Поэтому иногда нелишним бывает поставить между выводом мк и кнопкой резистор номиналом в несколько сотен ом, например 330 (рис 1с). Так, например, подключены кнопки на отладочной плате STK500. Это сделано для подстраховки, чтобы пользователь нечаянно не спалил микроконтроллер в ходе своих эксперементов.

   Для своих макетов впрочем можно обойтись и без этого резистора. 

самый простой способ подключения кнопки к микроконтроллеру

 Рис 1с

подключение кнопок к микроконтроллеру с помощью диодов

Рис. 2а

подключение кнопок к микроконтроллеру с помощью диодов
подключение кнопок к микроконтроллеру с помощью диодов

Рис. 2б

подключение кнопок к микроконтроллеру с помощью диодов

     Используется когда кнопок больше двух, а выводы мк хочется сэкономить. Каждой кнопке в данном случае соответствует свой цифровой код, а  количество кнопок, которые можно таким способом повесить на N выводов мк =  2

N  — 1. То есть на три вывода можно повесить 7 кнопок, на четыре – 15 и так далее… но я бы больше 7-ми вешать не стал. Увеличивается количество дополнительных внешних компонентов,  усложняется схема и программа мк. Кроме того, для большого количества кнопок есть и другие схемы включения. Подтягивающие резисторы на схеме не показаны, подразумевается, что используются внутренние.

   Кстати, через диоды еще можно завести сигналы от кнопок на вывод внешнего прерывания контроллера (рис. 3). При нажатии любой кнопки вывод внешнего прерывания через диод будет замыкаться на землю и вызывать прерывание (естественно при условии, что оно настроено и разрешено). Таким образом контроллеру не нужно будет постоянно опрашивать кнопки, эта процедура будет запускаться только по событию внешнего прерывания. 

подключение вывода прерывания через диоды ко всем кнопкам

                                                                             Рис. 3

подключение вывода прерывания через диоды ко всем кнопкам

 

   Данная схема актуальна не для всех микроконтроллеров AVR, потому что в некоторых моделях микроконтроллеров внешнее прерывание может возникать по любому изменению на любом выводе. (например в ATmega164P)

 

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

Рис. 4

 

   Такой вариант подключения обычно используется для блоков из нескольких кнопок, которые объединены конструктивно и соединены электрически по матричной схеме. Но никто не запрещает использовать эту схему и для включения  обычных кнопок, однако реальную экономию она дает при количестве кнопок ? 9.

   Выводы PС0, PС1, PС2, PC3  – это строки матрицы, выводы PB0, PB1, PB2 – это столбцы матрицы. Кнопки можно опрашивать либо по строкам, либо по столбцам. Допустим, мы опрашиваем их по столбцам. Процедура опроса будет выглядеть следующим образом. Начальное состояние всех выводов – вход с включенным подтягивающим резистором. Устанавливаем вывод PB0 в режим выхода и выставляем ноль. Теперь нажатие кнопок S1, S2, S3, S4 будет замыкать выводы PС0, PС1, PС2, PC3 на 0 питания. Опрашиваем эти выводы и определям нажата ли какая-нибудь кнопка в данный момент. Устанавливаем вывод PB0 в режим выхода и включаем подтягивающий резистор. Устанавливаем вывод PB1 в режим выхода и выставляем ноль. Снова опрашиваем выводы PС0, PС1, PС2, PC3. Теперь нажатие кнопок S5, S6, S7, S8 будет замыкать выводы PС0, PС1, PС2, PC3. Последний столбец кнопок опрашиваем аналогично. 

 

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

   Строки матрицы можно завести через диоды на вывод внещнего прерывания. Тогда логику программы можно было бы построить так. Если клавиатура не используется в течении нескольких минут, микроконтроллер переходит в режим пониженного энергопотребления. При этом выводы PB0, PB1, PB2 – конфигурируются как выходы с нулевым логическим уровнем.  Когда одна из кнопок нажимается, вывод прерывания через диод замыкается на ноль. Это вызывает внешнее прерывание, микроконтроллер просыпается и запускает таймер по сигналам которого происходит сканирование клавиатуры. Параллельно запускается счетчик времени, который сбрасывается при нажатии любой из кнопок. Как только он переполняется, микроконтроллер опять переходит в режим пониженного энергопотребления. 

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

   Это, пожалуй, пограничный случай экономии выводов при подключении кнопок, поскольку задействован только один вывод микроконтроллера – вывод АЦП. Суть способа понятна из рисунка. У нас есть резистивный делитель  с известными уровнями напряжений на резисторах, с помощью кнопок эти напряжения мы коммутируем на вход АЦП. Контроллер оцифровывает напряжение на этом выводе  и, исходя из того, в какой диапазон попадает считанное напряжение, определяет номер нажатой кнопки.

  Когда ни одна кнопка не нажата, вход АЦП притянут к земле резистором R2. Оставлять вход АЦП плавающим нельзя, а то он будет ловить помехи. При замыкании кнопок резистор R2 оказывается включенным параллельно с резисторами делителя. Чтобы он не влиял на уровень напряжения на входе АЦП, его значение выбирают довольно большим. Резистор R1 предназначен для ограничения величины входного тока в случае если вывод контроллера окажется в режиме цифрового входа и будет нажата кнопка S5.

подключение нескольких кнопок к ацп микроконтроллера

Рис. 5

подключение нескольких кнопок к ацп микроконтроллера

  Есть еще один вариант подобной схемы приведен на рис. 6. Здесь с помощью кнопок определенные резисторы делителя напряжения коммутируются на землю.

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

подключение нескольких кнопок к ацп микроконтроллера

Рис. 6

подключение нескольких кнопок к ацп микроконтроллера

Продолжение следует…

 

Подключение кнопки к AVR | Практическая электроника

Подключение кнопки к AVR не должно у вас вызывать никаких трудностей.

В предыдущей статье мы провели эмуляцию схемы в программе Proteus, помигали светодиодом и научились прошивать наш виртуальный микроконтроллер. Наверняка многим из читателей пришла в голову мысль: “А можно ли помигать светодиодом, использую кнопку, подключенную к МК?

Подключение кнопки к AVR

Да, разумеется, это возможно. Реализуется довольно легко. Причем можно сэмулировать кнопку как с фиксацией так и без фиксации. Причем в программе Proteus применить оба типа кнопок можно с помощью одного и того же одинакового макроса кнопки. В каких случаях это может быть полезно? Например, нам требуется осуществить выбор режимов работы устройства. Давайте разберем подробнее, как это реализовать с помощью микроконтроллера, и проведем эмуляцию в программе Proteus.

Подключение кнопки к AVR

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

Итак к делу. Так выглядит у нас наша схема в программе Proteus (кликните для увеличения):

Подключение кнопки к AVR

В этой схеме мы уже видим отличия от той, которую собирали еще в прошлой статье. В левой части схемы  мы видим обозначения кнопки и источника питания +5 вольт.

Как мы уже разобрали, питание и землю мы берем во вкладке “Терминал”. Обозначаются они у нас соответственно Power и Ground.

Подключение кнопки к AVR

Обозначается у нас питание схемы треугольником с чертой, делящей его по высоте. Рядом, на рисунке, изображено обозначение кнопки. Справа от кнопки мы видим закрашенный красный круг с двухнаправленной стрелочкой. Если во время эмуляции нажать на него, то кнопка у нас зафиксируется и будет постоянно нажата. После повторного нажатия на него фиксация снимается.

Подключение кнопки к AVR

Перед использованием нам нужно выбрать кнопку в библиотеке аналогично остальным деталям. Для этого нужно набрать в поле “Маска” слово “but”.  Затем в поле “Результаты” слово “BUTTON”:

Подключение кнопки к AVR

После этого кнопка появиться у нас в списке, вместе с выбранными деталями, применяемыми в проекте.

Какие порты у нас используются в проекте. Ниже на рисунке мы видим отходящие линии от портов РA0, РВ0, РВ1, РВ2 и РВ3. К порту В у нас подключены светодиоды, а к порту А –  кнопка.

Подключение кнопки к AVR

Итак, при нажатии, мы замыкаем цепь соединяющую +5 вольт с портом РА0 и верхним выводом резистора. Для чего у нас здесь вообще установлен резистор? Дело в том, что цепь кнопки должна быть замкнутой. После того как мы установили резистор, ток у нас течет от плюса питания через кнопку, резистор и дальше на землю.

Подключение кнопки к AVR

Номинал резистора достаточно взять равным 200 Ом. Итак, когда мы нажимаем кнопку, мы соединяем порт РА0 с +5 вольт питания, и если мы опросим ножку РА0 на наличие напряжения или его отсутствие, мы сможем влиять на выполнение нашей программы.

Скрины с текстом нашей программы я привел ниже:Подключение кнопки к AVR

Подключение кнопки к AVR

Итак отличия от прошлого проекта заключаются в том, что все 8 выводов порта РА мы конфигурируем на вход, выводы порта РВ0 – РВ3 мы конфигурируем на выход, а РВ4 – РВ7 на вход.

Подключение кнопки к AVR

Затем мы используем в нашей программе проверку условия “if”

Подключение кнопки к AVR

Итак, мы видим в строчке после “if”, в скобках, условие выполнения. Код ниже выполняется, если на порту PA0 у нас присутствует логический ноль, или ноль вольт. Этот текст в скобках –  сдвиг бита порта. Мы разберем в одной из следующих статей, а пока достаточно принять на веру, что этим мы опрашиваем кнопку на отжатие. Затем в фигурных скобках идет текст программы, который выполняется, если условие верно. Если условие не верно, программа продолжает выполняться дальше, пропустив текст в фигурных скобках.

Аналогично, с помощью условия “if” мы опрашиваем кнопку на нажатие. Обратите внимание, текст у нас в скобках изменился. Это означает что если на ножке РА0 у нас логическая единица, мы выполняем условие, то есть текст в фигурных скобках. То есть другими словами, у нас при отжатой кнопке, поочередно загораются и тухнут светодиоды с первого по четвертый, а при нажатии и удерживании, загораются и тухнут с четвертого по первый. Таким образом, мы можем влиять на выполнение программы, с помощью нажатия кнопки, опрашивая наличие на ней логического нуля, или логической единицы

Также прикрепляю архив, в котором находятся файл “сишник”, HEX и файл Протеуса.

А вот и видео

Подключение кнопки к микроконтроллеру | RadioLaba.ru

Кнопка и микроконтроллер
Кнопку к микроконтроллеру можно подключить двумя основными способами, с подтяжкой линии порта к высокому логическому уровню или низкому через резистор, как показано на картинке ниже.
Я обычно использую первый вариант подключения, можно конечно использовать внутренние подтягивающие резисторы на входах PORTB, но мне еще не доводилось применять такой способ.
Подключение кнопки к МК
В простейшем варианте микроконтроллер все время опрашивает одну или несколько кнопок, при нажатии которых выполняет соответствующую подпрограмму и снова возвращается на опрос кнопок. Подпрограмма обычно выполняется очень быстро, естественно за это время можно не успеть отжать кнопку, вследствие чего подпрограмма выполнится многократно. Чтобы этого не происходило после обнаружения нажатой кнопки необходимо добавить проверку отжатого состояния, но и в этом случае из-за явления дребезга контактов выполнение подпрограммы может начаться до отжатия кнопки. Поэтому после обнаружения нажатой кнопки необходимо добавить временную задержку в 5-20 мс. Проверка отжатого состояния будет многократно выполняться через заданный интервал времени. После обнаружения отжатия выполниться соответствующая подпрограмма, после чего опрос кнопок будет продолжен, но и здесь дребезг после отжатия может еще продолжаться, поэтому можно добавить паузу также перед опросом нажатого состояния кнопки. Я обычно этого не делаю, достаточно паузы во время опроса отжатого состояния кнопки. В итоге у нас получается примерно такой код:

; oproskn1 btfsc knp1 ;опрос 1-ой кнопки goto oproskn2 ;1-ая кнопка не нажата: переход на опрос 2-ой кнопки kn1 call pausknp ;1-ая кнопка нажата: вызов паузы (5-20мс), btfss knp1 ;опрос 1-ой кнопки goto kn1 ;1-ая кнопка не отжата: переход на метку kn1 call program1 ;1-ая кнопка отжата: вызов подпрограммы program1 oproskn2 btfsc knp2 ;опрос 2-ой кнопки goto oproskn1 ;2-ая кнопка не нажата: переход на опрос 1-ой кнопки kn2 call pausknp ;2-ая кнопка нажата: вызов паузы (5-20мс) btfss knp2 ;опрос 2-ой кнопки goto kn2 ;2-ая кнопка не отжата: переход на метку kn2 call program2 ;2-ая кнопка отжата: вызов подпрограммы program2 goto oproskn1 ;переход на метку oproskn1 ;

                                          ;

oproskn1      btfsc       knp1            ;опрос 1-ой кнопки

              goto        oproskn2        ;1-ая кнопка не нажата: переход на опрос 2-ой кнопки

kn1           call        pausknp         ;1-ая кнопка нажата: вызов паузы (5-20мс),

              btfss       knp1            ;опрос 1-ой кнопки

              goto        kn1             ;1-ая кнопка не отжата: переход на метку kn1

              call        program1        ;1-ая кнопка отжата: вызов подпрограммы program1

 

oproskn2      btfsc       knp2            ;опрос 2-ой кнопки

              goto        oproskn1        ;2-ая кнопка не нажата: переход на опрос 1-ой кнопки

kn2           call        pausknp         ;2-ая кнопка нажата: вызов паузы (5-20мс)

              btfss       knp2            ;опрос 2-ой кнопки

              goto        kn2             ;2-ая кнопка не отжата: переход на метку kn2

              call        program2        ;2-ая кнопка отжата: вызов подпрограммы program2

              goto        oproskn1        ;переход на метку oproskn1

                                          ;

Бывает нужно, чтобы кнопка имела две функции, на короткое и длительное нажатие. В этом случае во время опроса отжатого состояния необходимо добавить таймер времени. После обнаружения нажатого состояния записываем в дополнительный регистр число и уходим на паузу, после возврата декрементируем значение регистра и снова опрашиваем кнопку на предмет отжатого состояния. Этот цикл продолжается до тех пор, пока не отожмется кнопка или значение регистра не станет равным нулю. При обнаружении отжатого состояния до обнуления регистра, выполняется подпрограмма program1, при обнулении выполнится подпрограмма program2. Например, необходимо задать продолжительность длительного нажатия в 1 секунду, а пауза равна 10 мс, тогда в регистр счетчика надо записать число 100.

А если удерживать кнопку в течении 3 секунд, тогда подпрограмма program2 выполнится несколько раз, чтобы избежать этого в конце этой подпрограммы перед возвратом или после возврата нужно добавить опрос отжатого состояния кнопки. Ниже представлен код программы, где кнопка knp1 имеет 2 функции:

;кнопка knp1 имеет 2 функции: на короткое и длительное нажатие ;кнопка knp2 имеет одну функцию на короткое нажатие oproskn1 btfsc knp1 ;опрос 1-ой кнопки goto oproskn2 ;1-ая кнопка не нажата: переход на опрос 2-ой кнопки movlw .100 ;1-ая кнопка нажата: запись числа 100 в регистр shet movwf shet kn1 call pausknp ;вызов паузы (5-20мс) btfsc knp1 ;опрос 1-ой кнопки goto prog1 ;1-ая кнопка отжата: переход на метку prog1 decfsz shet,F ;1-ая кнопка не отжата: декремент регистра shet goto kn1 ;значение регистра не равно 0: переход на метку kn1 call program2 ;значение регистра равно 0: вызов подпрограммы program2 kn11 call pausknp ;вызов паузы (5-20мс) btfss knp1 ;опрос 1-ой кнопки goto kn11 ;1-ая кнопка не отжата: переход на метку kn11, ;ждем отжатия кнопки goto oproskn2 ;1-ая кнопка отжата: переход на метку oproskn2 prog1 call program1 ;вызов подпрограммы program1 oproskn2 btfsc knp2 ;опрос 2-ой кнопки goto oproskn1 ;2-ая кнопка не нажата: переход на опрос 1-ой кнопки kn2 call pausknp ;2-ая кнопка нажата: вызов паузы (5-20мс) btfss knp2 ;опрос 2-ой кнопки goto kn2 ;2-ая кнопка не отжата: переход на метку kn2 call program3 ;2-ая кнопка отжата: вызов подпрограммы program3 goto oproskn1 ;переход на метку oproskn1 ;

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

;кнопка knp1 имеет 2 функции: на короткое и длительное нажатие

;кнопка knp2 имеет одну функцию на короткое нажатие

 

oproskn1      btfsc       knp1            ;опрос 1-ой кнопки

              goto        oproskn2        ;1-ая кнопка не нажата: переход на опрос 2-ой кнопки

              movlw       .100            ;1-ая кнопка нажата: запись числа 100 в регистр shet

              movwf       shet

kn1           call        pausknp         ;вызов паузы (5-20мс)

              btfsc       knp1            ;опрос 1-ой кнопки

              goto        prog1           ;1-ая кнопка отжата: переход на метку prog1

              decfsz      shet,F          ;1-ая кнопка не отжата: декремент регистра shet

              goto        kn1             ;значение регистра не равно 0: переход на метку kn1

              call        program2        ;значение регистра равно 0: вызов подпрограммы program2

kn11          call        pausknp         ;вызов паузы (5-20мс)

              btfss       knp1            ;опрос 1-ой кнопки

              goto        kn11            ;1-ая кнопка не отжата: переход на метку kn11,            

                                          ;ждем отжатия кнопки

              goto        oproskn2        ;1-ая кнопка отжата: переход на метку oproskn2

    

prog1         call        program1        ;вызов подпрограммы program1    

 

oproskn2      btfsc       knp2            ;опрос 2-ой кнопки

              goto        oproskn1        ;2-ая кнопка не нажата: переход на опрос 1-ой кнопки

kn2           call        pausknp         ;2-ая кнопка нажата: вызов паузы (5-20мс)

              btfss       knp2            ;опрос 2-ой кнопки

              goto        kn2             ;2-ая кнопка не отжата: переход на метку kn2

              call        program3        ;2-ая кнопка отжата: вызов подпрограммы program3

              goto        oproskn1        ;переход на метку oproskn1

                                          ;

Возможно такое что, кнопка knp1используется внутри самой подпрограммы program2, в этом случае перед ее опросом внутри подпрограммы вначале также следует дождаться отжатия кнопки.

Иногда необходимо чтобы при однократном нажатии кнопки, подпрограмма выполнилась один раз, а при удерживании выполнялась многократно, например, ускоренное приращение числа на цифровом табло. Такую функцию можно реализовать очень просто, необходимо лишь исключить опрос отжатого состояния кнопки. Но здесь имеются свои недостатки, пропадает “дискретность” выполнения подпрограммы, ведь за одно кратковременное нажатие подпрограмма может выполниться несколько раз в зависимости от длительности нажатия, а нам требуется однократное выполнение. Данную функцию можно реализовать на основе предыдущего примера, немного изменив код. После длительного нажатия и выполнения подпрограммы, уходим на паузу, далее однократно выполняем проверку отжатого состояния (а не дожидаемся, пока отпустят кнопку), после чего при условии нажатой кнопки снова выполняем подпрограмму. Этот цикл будет продолжаться пока не отпустят кнопку. Здесь пауза будет определять скорость вызова подпрограммы (скорость приращения числа на цифровом табло). В итоге сохраняется “дискретность”, совместно с ускоренным многократным выполнением подпрограммы при удержании кнопки. Код программы выглядит следующим образом:

;кнопка knp1 имеет 2 функции: на короткое и длительное нажатие с многократным ускоренным ;выполнением подпрограммы program1 ;кнопка knp2 имеет одну функцию на короткое нажатие oproskn1 btfsc knp1 ;опрос 1-ой кнопки goto oproskn2 ;1-ая кнопка не нажата: переход на опрос 2-ой кнопки movlw .100 ;1-ая кнопка нажата: запись числа 100 в регистр shet movwf shet kn1 call pausknp ;вызов паузы (5-20мс) btfsc knp1 ;опрос 1-ой кнопки goto prog1 ;1-ая кнопка отжата: переход на метку prog1 decfsz shet,F ;1-ая кнопка не отжата: декремент регистра shet goto kn1 ;значение регистра не равно 0: переход на метку kn1 kn11 call program1 ;значение регистра равно 0: вызов подпрограммы program1 call pause ;вызов паузы (скорость вызова подпрограммы program1) btfsc knp1 ;опрос 1-ой кнопки goto oproskn2 ;1-ая кнопка отжата: переход на метку oproskn2 goto kn11 ;1-ая кнопка не отжата: переход на метку kn11 для ;повторного выполнения подпрограммы program1 prog1 call program1 ;вызов подпрограммы program1 oproskn2 btfsc knp2 ;опрос 2-ой кнопки goto oproskn1 ;2-ая кнопка не нажата: переход на опрос 1-ой кнопки kn2 call pausknp ;2-ая кнопка нажата: вызов паузы (5-20мс) btfss knp2 ;опрос 2-ой кнопки goto kn2 ;2-ая кнопка не отжата: переход на метку kn2 call program2 ;2-ая кнопка отжата: вызов подпрограммы program3 goto oproskn1 ;переход на метку oproskn1 ;

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

;кнопка knp1 имеет 2 функции: на короткое и длительное нажатие с многократным ускоренным

;выполнением подпрограммы program1

;кнопка knp2 имеет одну функцию на короткое нажатие

 

oproskn1      btfsc       knp1            ;опрос 1-ой кнопки

              goto        oproskn2        ;1-ая кнопка не нажата: переход на опрос 2-ой кнопки

              movlw       .100            ;1-ая кнопка нажата: запись числа 100 в регистр shet

              movwf       shet

kn1           call        pausknp         ;вызов паузы (5-20мс)

              btfsc       knp1            ;опрос 1-ой кнопки

              goto        prog1           ;1-ая кнопка отжата: переход на метку prog1

              decfsz      shet,F          ;1-ая кнопка не отжата: декремент регистра shet

              goto        kn1             ;значение регистра не равно 0: переход на метку kn1

kn11          call        program1        ;значение регистра равно 0: вызов подпрограммы program1

              call        pause           ;вызов паузы (скорость вызова подпрограммы program1)

              btfsc       knp1            ;опрос 1-ой кнопки

              goto        oproskn2        ;1-ая кнопка отжата: переход на метку oproskn2

              goto        kn11            ;1-ая кнопка не отжата: переход на метку kn11 для

                                          ;повторного выполнения подпрограммы program1

 

prog1         call        program1        ;вызов подпрограммы program1

 

oproskn2      btfsc       knp2            ;опрос 2-ой кнопки

              goto        oproskn1        ;2-ая кнопка не нажата: переход на опрос 1-ой кнопки

kn2           call        pausknp         ;2-ая кнопка нажата: вызов паузы (5-20мс)

              btfss       knp2            ;опрос 2-ой кнопки

              goto        kn2             ;2-ая кнопка не отжата: переход на метку kn2

              call        program2        ;2-ая кнопка отжата: вызов подпрограммы program3

              goto        oproskn1        ;переход на метку oproskn1

                                          ;

А теперь рассмотрим случай, когда микроконтроллер непрерывно выполняет какие-либо задачи, в этом случае ожидать отжатие кнопки недопустимо. Здесь можно воспользоваться прерываниями по изменению уровня на входах RB4-RB7 или по входу внешнего прерывания INT.

Для прерываний по входам RB4-RB7 алгоритм следующий: при изменении сигнала с 1 на 0 происходит переход в подпрограмму обработчика прерываний, где необходимо сначала определить, что вызвало прерывание, когда имеется несколько источников прерываний. Когда источник определен, необходимо выяснить на каком именно входе изменился уровень сигнала, определив его, выполняем соответствующие операции внутри самого обработчика прерываний, либо устанавливаем флаг в регистре, который специально выделяем для этих целей. Далее необходимо считать регистр PORTB, для устранения несоответствия ранее сохраненного значения с сигналом на входах порта, иначе флаг прерывания сбросить не удастся. После сброса флага выходим из обработчика прерывания.

Специально выделенный регистр с флагами проверяем в цикле основной программы, где по установленному флагу выполняем какую-либо подпрограмму, после чего сбрасываем флаг.
Опять же из-за дребезга контактов при таком алгоритме прерывания могут генерироваться многократно, добавлять паузу на время дребезга внутри обработчика прерываний бессмысленно, так как теряется процессорное время необходимое для выполнения других задач.

Также в данном алгоритме не учтено повторное возникновение прерывания при отжатии кнопки, смена сигнала с 0 на 1, ведь прерывания по входам RB4-RB7 возникают по переднему и заднему фронту сигнала. Но здесь все просто, одно прерывание можно пропустить, выполняя соответствующие операции только при наличии 0 на входе.

Решить проблему дребезга можно с помощью таймера. После перехода в подпрограмму обработчика прерываний, при смене сигнала с 1 на 0, запрещаем прерывания по входам RB4-RB7, определяем вход, где изменился сигнал, устанавливаем флаг в специально выделенном регистре, запускаем таймер на 5-20 мс и выходим из подпрограммы прерывания. Через установленный промежуток времени, по переполнению таймера возвращаемся в обработчик прерываний, останавливаем таймер, сбрасываем флаг по переполнению, считываем PORTB для устранения несоответствия, сбрасываем флаг и разрешаем прерывания по входам RB4-RB7. При повторном возникновении прерывания в результате отжатия кнопки, весь процесс повторится, за исключением того что, пропускаем выполнение соответствующих операций, так как сигнал на входе равен 1. Код программы представлен ниже:

;предварительно при начальной настройке регистров специального назначения необходимо сбросить ;флаг по переполнению TMR1, флаг прерывания по входам RB4-RB7 ;разрешить прерывание по переполнению TMR1, а также прерывания по входам RB4-RB7 ;регистр flag с флагами кнопок опрашиваем в теле основной программе, не забывая их сбросить org 0004h ;начать выполнение подпрограммы с адреса 0004h btfss PIR1,TMR1IF ;опрос флага прерываний по переполнению TMR1 goto metka1 ;флаг не установлен: переход на метку metka1 — опрос ;других источников прерываний bcf T1CON,TMR1ON ;флаг установлен: остановка таймера TMR1 bcf PIR1,TMR1IF ;сброс флага прерывания по переполнению TMR1 movf PORTB,W ;считывание значения PORTB для устранения несоответствия bcf INTCON,RBIF ;сброс флага прерывания по входам RB4-RB7 bsf INTCON,RBIE ;разрешение прерывания по входам RB4-RB7 retfie ;выход из обработчика прерываний metka1 btfss INCON,RBIF ;опрос флага прерываний по входам RB4-RB7 goto metka2 ;флаг не установлен: переход на метку metka2 — опрос ;других источников прерываний bcf INTCON,RBIE ;флаг установлен: запрет на прерывания по входам RB4-RB7 btfss PORTB,4 ;опрос линии RB4 bsf flag,0 ;0 на линии RB4: установка флага для линии RB4 btfss PORTB,5 ;1 на линии RB4: опрос линии RB5 bsf flag,1 ;0 на линии RB5: установка флага для линии RB5 btfss PORTB,6 ;1 на линии RB5: опрос линии RB6 bsf flag,2 ;0 на линии RB6: установка флага для линии RB6 btfss PORTB,7 ;1 на линии RB6: опрос линии RB7 bsf flag,3 ;0 на линии RB7: установка флага для линии RB7 movlw .224 ;запись числа 45536 в таймер TMR1, пауза 20мс, movwf TMR1L ;частота тактового генератора 4 МГц, movlw .177 ;коэффициент предделителя TMR1 заранее установлен 1:1 movwf TMR1H bsf T1CON,TMR1ON ;включение таймера TMR1 retfie ;выход из обработчика прерываний metka2 …………….. ;опрос других источников прерываний …………….. …………….. retfie ;выход из обработчика прерываний ;

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

;предварительно при начальной настройке регистров специального назначения необходимо сбросить

;флаг по переполнению TMR1, флаг прерывания по входам RB4-RB7

;разрешить прерывание по переполнению TMR1, а также прерывания по входам RB4-RB7

;регистр flag с флагами кнопок опрашиваем в теле основной программе, не забывая их сбросить

 

              org         0004h           ;начать выполнение подпрограммы с адреса 0004h

 

              btfss       PIR1,TMR1IF     ;опрос флага прерываний по переполнению TMR1

              goto        metka1          ;флаг не установлен: переход на метку metka1 — опрос

                                          ;других источников прерываний

              bcf         T1CON,TMR1ON    ;флаг установлен: остановка таймера TMR1

              bcf         PIR1,TMR1IF     ;сброс флага прерывания по переполнению TMR1

              movf        PORTB,W         ;считывание значения PORTB для устранения несоответствия

              bcf         INTCON,RBIF     ;сброс флага прерывания по входам RB4-RB7

              bsf         INTCON,RBIE     ;разрешение прерывания по входам RB4-RB7

              retfie                      ;выход из обработчика прерываний

              

metka1        btfss       INCON,RBIF      ;опрос флага прерываний по входам RB4-RB7

              goto        metka2          ;флаг не установлен: переход на метку metka2 — опрос

                                          ;других источников прерываний

              bcf         INTCON,RBIE     ;флаг установлен: запрет на прерывания по входам RB4-RB7

              btfss       PORTB,4         ;опрос линии RB4

              bsf         flag,0          ;0 на линии RB4: установка флага для линии RB4

              btfss       PORTB,5         ;1 на линии RB4: опрос линии RB5

              bsf         flag,1          ;0 на линии RB5: установка флага для линии RB5

              btfss       PORTB,6         ;1 на линии RB5: опрос линии RB6

              bsf         flag,2          ;0 на линии RB6: установка флага для линии RB6

              btfss       PORTB,7         ;1 на линии RB6: опрос линии RB7

              bsf         flag,3          ;0 на линии RB7: установка флага для линии RB7

              movlw       .224            ;запись числа 45536 в таймер TMR1, пауза 20мс,

              movwf       TMR1L           ;частота тактового генератора 4 МГц,

              movlw       .177            ;коэффициент предделителя TMR1 заранее установлен 1:1

              movwf       TMR1H

              bsf         T1CON,TMR1ON    ;включение таймера TMR1

              retfie                      ;выход из обработчика прерываний

 

metka2        ……………..           ;опрос других источников прерываний

              ……………..

              ……………..

 

              retfie                      ;выход из обработчика прерываний

                                          ;

Честно говоря, такую конструкцию я не применял, не нравится мне все это дело. Вешать кнопки на прерывания лучше всего для пробуждения микроконтроллера из спящего режима.

Гораздо проще и надежнее поместить код опроса кнопок в цикле основной программы, в то место где они будут опрашиваться хотя бы через каждые 100 мс, по мере выполнения других задач. Для предотвращения многократного выполнения подпрограммы при длительном нажатии на кнопку нужно использовать дополнительный регистр с флагами контроля состояния кнопок. Если во время очередного опроса в цикле основной программы кнопка окажется не нажатой, то устанавливаем в 1 соответствующий флаг регистра. При обнаружении нажатия сначала проверяем флаг, если он равен 1, сбрасываем его и выполняем подпрограмму, после чего идем на опрос второй кнопки или далее по циклу основной программы.
При следующем опросе флаг будет равен 0, ничего не делаем, идем также на опрос второй кнопки, или далее по циклу не задерживаясь. Такой пропуск будет происходить до тех пор, пока не отожмем кнопку и флаг снова не установиться в 1. Код выглядит следующим образом:

……………. ……………. ;код основной программы ……………. oproskn1 btfss knp1 ;опрос 1-ой кнопки goto kn1 ;1-ая кнопка нажата: переход на метку kn1 bsf flag,0 ;1-ая кнопка не нажата: устанавливаем флаг 1-ой кнопки goto oproskn2 ;переход на метку oproskn2 kn1 btfss flag,0 ;опрос флага состояния 1-ой кнопки goto oproskn2 ;флаг 1-ой кнопки не установлен: переход на метку oproskn2 bcf flag,0 ;сброс флага состояния 1-ой кнопки call program1 ;вызов подпрограммы program1 oproskn2 btfss knp1 ;опрос 2-ой кнопки goto kn2 ;1-ая кнопка нажата: переход на метку kn1 bsf flag,1 ;1-ая кнопка не нажата: устанавливаем флаг 2-ой кнопки goto metka1 ;переход на метку metka1 kn2 btfss flag,1 ;опрос флага состояния 2-ой кнопк goto metka1 ;флаг 2-ой кнопки не установлен: переход на метку metka1 bcf flag,1 ;сброс флага состояния 2-ой кнопки call program2 ;вызов подпрограммы program2 metka1 …………….. ;дальнейшее исполнение основной программы …………….. ……………..

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

              …………….            

              …………….            ;код основной программы

              …………….

 

oproskn1      btfss       knp1            ;опрос 1-ой кнопки

              goto        kn1             ;1-ая кнопка нажата: переход на метку kn1

              bsf         flag,0          ;1-ая кнопка не нажата: устанавливаем флаг 1-ой кнопки

              goto        oproskn2        ;переход на метку oproskn2

kn1           btfss       flag,0          ;опрос флага состояния 1-ой кнопки

              goto        oproskn2        ;флаг 1-ой кнопки не установлен: переход на метку oproskn2

              bcf         flag,0          ;сброс флага состояния 1-ой кнопки

              call        program1        ;вызов подпрограммы program1

 

oproskn2      btfss       knp1            ;опрос 2-ой кнопки

              goto        kn2             ;1-ая кнопка нажата: переход на метку kn1

              bsf         flag,1          ;1-ая кнопка не нажата: устанавливаем флаг 2-ой кнопки

              goto        metka1          ;переход на метку metka1

kn2           btfss       flag,1          ;опрос флага состояния 2-ой кнопк

              goto        metka1          ;флаг 2-ой кнопки не установлен: переход на метку metka1

              bcf         flag,1          ;сброс флага состояния 2-ой кнопки

              call        program2        ;вызов подпрограммы program2

 

metka1        ……………..           ;дальнейшее исполнение основной программы

              ……………..

              ……………..

Как видно все очень просто, не нужно никаких прерываний и таймеров.

Как подключать микроконтроллер

  • Staticvoid
  • 27 Июл 2019
  • пока нет комментариев

Если вас интересует подключение микроконтроллера (здесь и далее МК), а также подключения к нему кнопки, питания, или светодиода. Или вы хотите знать что делать с  выводами AREF или AGND, что представляет собой AVCC. И собственно понять как все таки подключить микроконтроллер то данная статья сможет вам слегка приоткрыть занавес в изучении мира микроконтроллеров.

Все нижеописанное относится к AVR контроллерам, но в случае с PIC все процедуры схожи, из-за единства принципов.

Питание микроконтроллера

В своей работе МК использует электроэнергию. Поэтому для того, чтобы правильно выполнить подключение микроконтроллера, требуется напряжения от 1.8 до 5 В. Любой МК AVR работает с напряжением от 5 Вольт. Поэтому примем это напряжение как эталон от него и будем отталкиваться. Оно имеет обозначение VCC.

Нулевой вывод — это GND. Если рассматривать блок питания ПК, то провод черного цвета является здесь GND (к тому же, провод Земли как правило черный), провод красного цвета — это +5, станет VCC. Если вы в качестве питания для микроконтроллера планируете использовать батарейки, то минус батареек обозначим как GND, а их плюс, как VCC. При этом важно, чтобы напряжение от батарей сохранялось в нужных лимитах для конкретной модели МК. Эти данные указаны в datasheet (документации) на микроконтроллер.

Такой вопрос как подключение микроконтроллера должен учитывать то, что существуют низковольтные модели (как 2313V), их нижний уровень напряжения будет значительно занижена. Также важны частоты. Здесь показано то, как наибольшая частота может зависеть от напряжения. Очевидно, что при низком уровне, предельные частоты будут ниже. При том низковольтные модели вдвое медленней высоковольтных. Но их можно разогнать, как и любой процессор.

Все, что требуется AVR контроллерам для функционирования, это питание. На входы VCC необходимо подавать 5 В. (или же другое значение в зависимости от модели), а входы GND необходимо заземлить. МК может иметь и ни один вход VCC, а несколько, это же относится и к GND входам (в особенности если они помещены в квадратный корпус TQFP, где питалово на виду). Важно, чтобы питание кристалла было равномерным со всех сторон, для избежания перегрева внутренних питательных цепей.

Иначе может возникнуть ситуация типа следующей: допустим, вы осуществили подключение питалова лишь с одной из сторон чипа. С другой стороны решили установить на каждую портовую линию светодиод, и затем все их сразу и зажгли. Реакция устройства будет такова: внутренняя шина питания, не поняв заданного параметра электричества, исчезла, а процессор, казалось бы не имея на то никаких причин, вдруг сгорел. Поэтому очень важно производить правильное подключение всех выводов GND и VCC. Необходимо соединить их требуемым образом и подать нужное питание.

AVCC и AGND — это питание аналогоцифрового преобразователя и аналоговая земля. АЦП измеряет напряжение, подавать на него питание лучше при помощи фильтров, чтобы избежать пагубного влияния помех в электроцепи.

Поэтому в схемах земля бывает аналоговой и цифровой (соединение их должно присутствовать только в 1 точке). Напряжение на AVCC нужно подавать при помощи дроссельного фильтра. Если не требуется применение АЦП и отсутствует необходимость в точных расчетах измерений, то на AVCC просто подайте 5 вт, равно как и на AGND и VCC, посадите на землю, как и все остальное. Но подключать их нужно!

Простое подключение микроконтроллера AVR

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

Следует использовать внешние навесные элементы.

Как видишь, добавился дроссель в цепь питания AVCC, а также конденсаторы. Хорошим тоном является ставить керамический конденсатор на сотню нФ между VCC и GND у каждой микросхемы (а если у микрухи много входов питания и земель, то между каждым питанием и каждой землей) как можно ближе к выводам питания — он сгладит краткие импульсные помехи в шине питания вызванные работой цифровых схем. Конденсатор на 47 мкФ в цепи питания сгладит более глубокие броски напряжения. Конденсатор между AVCC и GND дополнительно успокоит питание на АЦП.

Вход AREF это вход опорного напряжения АЦП. Туда вообще можно подать напряжение относительно которого будет считать АЦП, но обычно используется либо внутренний источник опорного напряжения на 2.56 вольта, либо напряжение на AVCC, поэтому на AREF рекомендуется вешать конденсатор, что немного улучшит качество опорного напряжения АЦП(а от качества опоры зависит адекватность показаний на выходе АЦП).

Схема сброса

Резистор на RESET. AVR имеет собственную схему сброса, сигнал RESET оснащен резистором на 100 кОм к VCC. Но это не надежно! Лучше подтянуть RST до питания при помощи резистора 10 кОм.
Еще одна схема сброса

Ее преимущество в том, что когда схема включается, конденсатор находится в разряженном состоянии и напряжение на RST почти нулевое, микроконтроллер не начинает свою работу, ибо ему выдается непрерывный сброс. Но вскоре конденсатор получит заряд через резистор и напряжение на RST составит лог1, и МК будет запущен.
Задержка равняется T=R*C ( в примере: 1 сек.). Она требуется, чтобы МК не начал работать раньше остальных устройств.

Тактовый сигнал и его источник

Тактовый генератор является центром МК. По всем импульсам происходят различные операции в контроллере — данные ходят по шинам и регистрам, выводы портов переключаются, и т.д. При большей скорости тактовой частоты, МК будет быстрее выполнять свою работу и использовать большее количество энергии.

Задают импульсы при помощи встроенного в МК тактового генератора, или внешнего. Быстрота внутреннего генератора может зависеть от настроек МК и обвязки.

Типы генератора:

  • внутренний (имеющий внутреннюю задающую цепочку RC).
  • Обвязка не нужна. Выводы XTAL2 и XTAL1 нет необходимости подключать, но их можно оставить в качестве портов ввода вывода (при возможности). Выбирается 1 из 4 (по умолчанию) значений внутренней частоты.
  • внутренний(имеющий внешнюю задающую RC цепь).Нужен внешний для мк резистор и конденсатор. Можно менять в процессе тактовую частоту, изменяя значение резистора.
  • внутренний (имеющий внешний задающий кварц).С внешней стороны устанавливается кварцевый резонатор и 2 конденсатора. При низкочастотном кварце (до 1 МГц) конденсатор не потребуется.
  • внешний. Другое устройство подает на вход МК прямоугольный сигнал, задающий такты.

Плюсы различных схем

При наличии внутренней цепи RC мы может получить экономию места на плате, не потребуются дополнительные элементы, но не будет максимальной частоты, плюс она будет зависеть от температуры.

Внешний кварц является точным, нужны дополнительные элементы. Возможен максимальный уровень производительности МК.

Методы тактования МК можно посмотреть в даташите в System Clock and Clock Options, при этом важна конфигурация Fuse Bit’s. FUSE лучше не трогать, если пока вы не являетесь спецом в настройках.

Как подключить кнопку или светодиод к микроконтроллеру

Если говорить о взаимодействии с внешней средой, то в качестве самостоятельного устройства микроконтроллер не представляет особого интереса — просто что-то там внутри сам с собой тикает. А если вы решите отобразить его действия, то уже станет интереснее.

Светодиод или кнопку можно подключить используя ряд нехитрых операций:

Для кнопки необходимо выбрать ножку I/O, и произвести ее подключение при помощи кнопки на землю. Конфигурация самого вывода будет представлять собой DDRxy=0 PORTxy=1 (вход с подтяжкой). При этом, если кнопка не находится в нажатом положении, при помощи подтягивающего резистора, вход будет иметь большое напряжение, а из бит PINху при чтении мы получим 1. При нажатой кнопке, вход будет на земле, а напряжение на этом входе упадет до нулевого, из PINxy будет прочитываться 0. По нулевым позициям в битах PINх регистра нам становится известно о нажатом состоянии кнопки.

Пунктиром выделен еще один подтягивающий резистор. Хотя внутри AVR возможно подключение к порту подтяжки, она будет ненадежной: 100 кОм. Поэтому она может быть просто придавлена к земле при помощи наводки или помехи, что даст ложное срабатывание. Для хорошей схемы необходима внешняя подтяжка на 10 кОм.

Способы подключения светодиода к порту

Всего существуют 2 схемы:

  • Порт-Питание;
  • Порт-земля.

В первом случае диод зажигается при выдаче в порт логический ноль: уровень низкий (близок к нулю). При втором способе, чтобы диод зажегся, следует выдать в порт логическую единицу: уровень высокий, приравненный к значению VCC.

Для AVR подходит любой их этих способов, но старые модели МК тянули вниз лучше, поэтому Порт-Питание более популярен. Настройка вывода порта на выход для светодиода (DDRxy=1), при этом, зависимо от параметра в PORTxy ножка будет иметь либо низкое либо высокое напряжение.

Производить подключение светодиода следует через резистор. Так как уровень прямого сопротивления светодиода небольшой. И при отсутствии лимитов проходящего сквозь него тока, он может сгореть, а также прожечь вывод МК. Для нормальной работы светодиода достаточно примерно 3…15 мА.

Поделиться ссылкой:

Подключение кнопки к Arduino. GyverButton [31.01.20]

Кнопка – простейший орган управления микроконтроллером. Подключить кнопку к Arduino очень просто, но нужно помнить, что пин должен иметь два стабильных состояния – высокое и низкое, GND или VCC. Для этого пин кнопки подтягивают резистором ~10 кОм противоположно подключению кнопки, т.е. если кнопка подключена второй ногой к GND, пин подтягивают к VCC, и наоборот.

Микроконтроллер имеет “встроенную” подтяжку ног к VCC, что даёт возможность подключать кнопку только к GND и пину, но режим работы пина нужно выбрать INPUT_PULLUP. Я, например, всегда подключаю отладочную кнопку на D3 вот таким образом:

Также можно подключить несколько кнопок к аналоговому пину, получится так называемая аналоговая клавиатура. Значение функции analogRead() будет зависеть от нажатой кнопки.

Устройство и работа портов ввода-вывода микроконтроллеров AVR. Часть 2 / Хабр

Подключение светодиода к линии порта ввода/вывода

Изучив данный материал, в котором все очень детально и подробно описано с большим количеством примеров, вы сможете легко овладеть и программировать порты ввода/вывода микроконтроллеров AVR.


Пример будем рассматривать на микроконтроллере ATMega8.

Программу писать будем в Atmel Studio 6.0.

Эмулировать схему будем в Proteus 7 Professional.

Первым примером в изучении микроконтроллеров является подключение и управление светодиодом, это самый простой и наглядный пример. Этот пример стал классическим при изучении микроконтроллеров, как программа «Hello World!» при изучении прочих языков программирования.
Максимальный ток, который способен пропустить каждый порт ввода/вывода составляет 40 mA.
Максимальный ток, который способна пропускать каждая линия порта ввода/вывода составляет 20 mA.
Прежде чем подключать нагрузку, в том числе и светодиод к линиям порта ввода/вывода нужно знать, что можно спалить микроконтроллер превысив допустимую нагрузку на линию порта ввода/вывода.
Что бы ограничить ток, который протекает через линии порта ввода/вывода микроконтроллера нужно рассчитать и подключить резистор.

Рис: Рапиновка светодиода.

Рис: Подключение светодиода анодом к микроконтроллеру.

Рис: Подключение светодиода катодом к микроконтроллеру.

Сопротивление токоограничивающего резистора подключаемого к линиям портов ввода/вывода при подключении светодиода рассчитывается по формуле:

где:
Vs — напряжение источника питания;
Vsp — падение напряжения на линии порта ввода/вывода;
Vd — прямое падения напряжения на светодиоде;
Id — прямой ток на светодиоде;
Кn — коэффициент надежности роботы светодиода;

Пример:
— напряжение источника питания – ;
— прямое падения напряжения на светодиоде – (Берётся с datasheet на светодиод);
— прямой ток на светодиоде – 10мА (Берётся с datasheet на светодиод);
— коэффициент надежности роботы светодиода – 75% (Берётся с datasheet на светодиод);
— падение напряжения на линии порта ввода/вывода – 0,5В (Берётся с datasheet на микроконтроллер: Vol(output low voltage) – если ток втекает, и Voh (output high voltage) – если ток вытекает);

Таким образом номинал резистора R = 166,66 Om, подбирается ближайшее большее значение сопротивления.

Если не известно прямое напряжение светодиода, сопротивление можно рассчитать по закону Ома.

где:
U — напряжение, приложенное к участку цепи;
I — номинальный ток линии порта ввода/вывода.

Пример:
— напряжение, приложенное к участку цепи – 4,5В;
— номинальный ток линии порта ввода/вывода – 20мА.

Определив номинал резистора R, необходимо рассчитать мощность P, измеряемая в ваттах, которая будет выделяться в резисторе, в виде тепла при протекании тока в цепи.

где:
U – напряжение, приложенное к участку цепи;
I — номинальный ток линии порта ввода/вывода.

Пример:
— напряжение, приложенное к участку цепи – 4,5В;
— прямой ток на светодиоде – 20мА.

Рассчитав выделяемую мощность на резисторе, выбираем ближайшее большее значение мощности резистора. Если рассеиваемой мощности резистора будет недостаточной, то он может выйти из строя.

— подключения маломощного светодиода анодом к линии порта ввода/вывода:

// Подключаем внешние библиотеки
#include <AVR/io.h> 
#include <stdint.h> 

// Основная программа
int main(void) 
{ 
 
 // Настраиваем порты ввода/вывода
 DDRC  = 0b11111111;  //Настраиваем все разрады порта С на режим "Выход"
 PORTC = 0b11111111;  //Устанавливаем все разряды порта C в лог.«1» (Навыходе порта напряжение равное Vcc)
 
 // Вечный цикл
 while (1) 
 { 
 } 
}

— подключения маломощного светодиода катодом к линии порта ввода/вывода:

// Подключаем внешние библиотеки
#include <AVR/io.h> 
#include <stdint.h> 

// Основная программа
int main(void) 
{ 
 
 // Настраиваем порты ввода/вывода
 DDRC  = 0b11111111;  //Настраиваем все разряды порта С на режим "Выход"
 PORTC = 0b00000000;  //Устанавливаем все разряды порта C в лог.«0»  (На выходе порта напряжение равное GND) 
 
 // Вечный цикл
 while (1) 
 { 
 } 
}

— подключения маломощного светодиода анодом и катодом к линии порта ввода/вывода:

// Подключаем внешние библиотеки
#include <AVR/io.h> 
#include <stdint.h> 

// Основная программа
int main(void) 
{ 
 
 // Настраиваем порты ввода/вывода
 DDRD  = 0b11111111;  //Настраиваем все разряды порта D на режим "Выход"
 PORTD = 0b11111111;  //Устанавливаем все разряды порта D в лог.«1» (На выходе порта напряжение равное Vcc) 
 
 DDRC  = 0b11111111;  //Настраиваем все разряды порта C на режим "Выход"
 PORTC = 0b00000000;  //Устанавливаем все разряды порта C в лог.«0»  (На выходе порта напряжение равное GND) 
 
 // Вечный цикл
 while (1) 
 { 
 } 
}  

Безопасное подключение устройств к микроконтроллеру

В этой статье рассматриваются важные драйверы и правильные схемы, необходимые для безопасного подключения внешних устройств к вводу/выводу MCU (микроконтроллер, англ. — Microcontroller Unit, MCU).

Введение

Как только у вас возникнет идея для проекта, очень заманчиво перейти прямо к подключению Arduino к схемам и устройствам, таким как светодиоды, реле и динамики. Однако делать это без правильной схемы может оказаться фатальным для вашего микроконтроллера.

Многие устройства ввода/вывода потребляют много тока (> 100 мА), которые большинство микроконтроллеров не могут обеспечить в безопасном режиме, а когда они пытаются обеспечить такое количество тока, они часто ломаются. Здесь нам на помощь приходят специальные схемы, которые называются «драйверы» (англ. — drivers). Драйверы — это схемы, которые могут принимать небольшой слабый сигнал от микроконтроллера, а затем использовать этот сигнал для управления каким-либо энергопотребляющим устройством.

Для правильной работы микроконтроллеров с внешними устройствами иногда требуются специальные схемы. Эти внешние устройства включают:

  • Цепи драйвера
  • Схемы защиты входа
  • Схемы защиты выхода
  • Цепи изоляции

Итак, давайте посмотрим на некоторые из этих схем и на то как они работают!

Простой светодиодный (LED) драйвер

Эта простая схема удобна для управления светодиодами с высоким энергопотреблением с помощью микроконтроллеров, где выход микроконтроллера подключен к «IN».

Пример простого светодиодного драйвераПример простого светодиодного драйвера

Когда микроконтроллер выводит 0, транзистор Q1 отключается, а также светодиод D1. Когда микроконтроллер выводит 1, транзистор включается, и поэтому D1 также включается. Значение R1 зависит от выходного напряжения вашего микроконтроллера, но значения между 1KΩ ~ 10KΩ часто работают хорошо. Значение R2 зависит от размера нагрузки, которую вы питаете, и эта схема подходит для питания устройств до 1А и не более.

Простой релейный драйвер

Устройствам, которые потребляют более 1 А тока и будут включаться и выключаться раз в несколько секунд, лучше подойдут реле.

Хотя реле достаточно просты (небольшой электромагнит, который привлекает металлический рычаг для замыкания схемы), они не могут управляться непосредственно микроконтроллером.

Для обычных реле требуются токи около 60 мА ~ 100 мА, что слишком много для большинства микроконтроллеров, поэтому реле требуют схему с использованием управления транзистором (как показано выше). Однако вместо резистора, который необходимо использовать для ограничения тока, требуется обратный диод защиты (D1).

Когда микроконтроллер (подключенный к «IN»), выдает 1, тогда включается транзистор Q1. Это включает реле RL1, и в результате загорается лампа (R2). Если микроконтроллер выводит 0, то транзистор Q1 отключается, что отключает реле, и поэтому лампа выключается.

Реле очень часто встречаются в схемах, требующих переключения цепей электропитания переменного тока, и доступны для переключения 230В и 13А (подходит для тостеров, чайников, компьютеров и пылесосов).

Пример простого релейного драйвераПример простого релейного драйвера

Кнопки

При подключении кнопки к микроконтроллеру могут иногда возникнуть простые проблемы. Первая (и самая раздражающая проблема) возникает в виде отскока, когда кнопка посылает много сигналов при нажатии и отпускании.

Кнопки обычно представляют собой кусок металла, который при контакте соприкасается с каким-то другим металлом, но когда кнопки вступают в контакт, они часто отскакивают (хотя они чаще всего крошечные). Этот отскок означает, что кнопка соединяется и отключается несколько раз, прежде чем зафиксироваться, а в итоге — результат, который ненадолго выглядит случайным. Поскольку микроконтроллеры очень быстрые, они могут поймать этот отскок и выполнять события нажатия кнопки несколько раз. Чтобы избавиться от отскока, можно использовать схему ниже. Схема, показанная здесь, представляет собой очень тривиальную схему, которая хорошо работает и проста в построении.

Пример простого релейного драйвера

Защита входа: напряжение

Не все устройства ввода будут дружественными к вашему микроконтроллеру, а некоторые источники могут даже нанести ущерб. Если у вас есть источники входного сигнала, которые поступают из окружающей среды (например, датчик напряжения, датчик дождя, человеческий контакт) или источники входного сигнала, которые могут вывести напряжения, превышающие то, что может обрабатывать микроконтроллер (например, цепи индуктора), тогда вам потребуется включать некоторую защиту ввода напряжения. Схема, показанная ниже, использует 5V стабилитронов для ограничения входных напряжений, так что входное напряжение не может превышать 5 В и ниже 0 В. Резистор 100R используется для предотвращения слишком большого тока, когда диод Зенера захватывает входное напряжение.

Пример защиты ввода напряженияПример защиты ввода напряжения

Защита ввода/вывода: ток

Входы и выходы микроконтроллеров иногда могут быть защищены от слишком большого тока. Если устройство, такое как светодиод, потребляет меньше тока, чем максимальный выходной ток от микроконтроллера, тогда светодиод может быть напрямую подключен к микроконтроллеру. Тем не менее, последовательный резистор будет по-прежнему необходим, как показано ниже, а общие значения последовательных резисторов для светодиодов включают в себя 470 Ом, 1 кОм и даже 2,2 кОм. Серии резисторов также полезны для входных контактов в редких случаях, когда неисправны контакты микроконтроллеров или входное устройство испытывает всплеск выходного тока.

Пример использования резисторов для защиты токаПример использования резисторов для защиты тока

Преобразователи уровня

В прошлом большинство сигналов в цепи работало бы на одном и том же напряжении, и это напряжение обычно составляло 5 В. Однако с увеличением технологических возможностей современной электроники снижается напряжение на новых устройствах. Из-за этого многие схемы включают смешанные сигналы, в которых более старые части могут работать при напряжении 5 В, в то время как более новые части работают при напряжении 3,3 В.

Хотя многие радиолюбители предпочли бы использовать один уровень напряжения, правда состоит в том, что более старые 5-вольтовые части могут не работать на 3,3 В, в то время как более новые устройства 3,3 В не могут работать при более высоком напряжении 5 В. Если устройство 5V и устройство 3.3V хотят общаться, то требуется сдвиг уровня, который преобразует один сигнал напряжения в другой. Некоторые устройства с напряжением 3,3 В имеют 5 В «толерантность», что означает, что сигнал 5 В может напрямую подключаться к сигналу 3,3 В, но большинство устройств 5 В не могут переносить 3.3 В. Чтобы охватить оба варианта, приведенные ниже схемы показывают преобразование от 5 до 3,3 В и наоборот.

Примеры преобразователей уровняПримеры преобразователей уровня

Изоляция: Оптоизолятор

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

Оптоизоляторы взаимодействуют с использованием света, когда одна цепь излучает свет, который затем обнаруживается другой схемой. Это означает, что оптоизоляторы не используются для аналоговой связи (например, уровни напряжения), но вместо этого для цифровой связи, где выход включен или выключен. Оптоизоляторы могут использоваться как для входов, так и для выходов на микроконтроллеры, где входы или выходы могут быть потенциально опасны для микроконтроллера. Интересно, что оптоизоляторы также могут использоваться для смещения уровня!

Пример использования optoisolation для защиты вашего микроконтроллераПример использования optoisolation для защиты вашего микроконтроллера

Наверх ↑

Интерфейс кнопки с PIC микроконтроллером

перейти к содержанию
  • Продукты
    • Платформы встраиваемого проектирования
    • Платы встраиваемой разработки
    • Комплекты базовой разработки для встраиваемых систем
    • Универсальные комплекты разработки IoT
    • Сенсорные платы
  • Учебный центр
    • Курс по Интернету вещей PIC186
    • PIC16 Microcontroller Course
    • ARM Cortex M Course Online
    • 8051 Microcontroller Course
    • Embedded C Course
    • Microcontroller Tutorials
    • Free Videos
    • Code Library
  • 41 My Account
  • Remember Me
  • Продукты
    • Платформы для встраиваемых систем проектирования
    • Платы для встраиваемых систем разработки
,Микроконтроллеры

— Руководство для начинающих

Микроконтроллер — Руководство для начинающих — Отключение кнопок с помощью программного обеспечения

Итак, теперь вы говорите себе, что мы ПРОСТО перешли на дребезг, и казалось работать нормально … Зачем углубляться в эту тему?!? Ну, в основном, устранение неполадок программного обеспечения, если пространство для программы и циклы микроконтроллера позволяют это, по существу бесплатно.Это всего лишь несколько строк кода, и вы можете обеспечить гораздо больший контроль над тем, как методы debouncing работают с конкретной кнопкой, которую вы используете. Debouncing в аппаратное обеспечение может увеличивать стоимость каждой разрабатываемой платы, и это сложнее для определения хорошего противодействия для всех кнопочных переключателей, которые будут использоваться. Однако, если вы хотите сохранить циклы выполнения программы, лучше всего использовать аппаратное обеспечение. маршрут.

Мой метод устранения неполадок с помощью программного обеспечения использует только две переменные, которые измеряют уверенность. уровень фактического нажатия кнопки. С помощью введенной переменной Pressed в Button Debouncing при нажатии кнопки будет поток единиц, и поток нулей при отпускании кнопки. Если есть подпрыгивание, поток единиц или нулей будет очень коротким, поэтому мы можем воспользоваться этим, введение двух переменных, которые измеряют длину этих потоков.Переменные вызываются Pressed_Confidence_Level для измерения состояния нажатия кнопки, и Released_Confidence_Level для измерения отпущенного состояния кнопки.

Итак, если кнопка нажата, Pressed_Confidence_Level повысится, и то же самое с Released_Confidence_Level при отпускании кнопки. Но эти переменные также будет сброшен на 0, если существует противоположное условие. Например, скажем кнопка была нажата некоторое время, и Pressed_Confidence_Level стал очень большое количество, например 153 356.Если кнопка была отпущена (или произошел отскок), переменная будет сброшена на 0. Уловка с этими переменными состоит в том, чтобы определить хороший порог для определения хорошего состояния нажатия или отпускания кнопки. Скажем, если Pressed_Confidence_Level показывает, что после увеличения до 500, это число является четким признаком кнопки нажмите, тогда светодиоды переключатся один раз. То же самое и для Released_Confidence_Level. потому что подпрыгивание также может произойти при отпускании кнопки.= 1 DDRB | = 1 DDRB & = ~ (1 PORTB | = 1

int Pressed = 0;
int Pressed_Confidence_Level = 0; // Измерение кнопки нажмите cofidence
int Released_Confidence_Level = 0; // Измерение уверенности при отпускании кнопки

while (1)
{

если (bit_is_clear (PINB, 1))
{ Pressed_Confidence_Level ++; // Увеличить сжатие
Released_Confidence_Level = 0; // Сбрасываем уверенность отпущенной кнопки, так как есть нажатие кнопки
if (Pressed_Confidence_Level> 500) // Индикатор хорошего нажатия кнопки
{ если (нажата == 0)
{

ПОРТБ ^ = 1 ПОРТБ ^ = 1 Нажат = 1;

}
// Обнулить, чтобы можно было оценить новое состояние нажатия
Pressed_Confidence_Level = 0; } }
еще
{ Released_Confidence_Level ++; // Работает так же, как нажатый
Pressed_Confidence_Level = 0; // Сбрасываем достоверность нажатой кнопки после отпускания кнопки
если (Released_Confidence_Level> 500
{

Нажат = 0;
Released_Confidence_Level = 0;

} } } }
,Микроконтроллеры

— Руководство для начинающих

Микроконтроллер — Руководство для начинающих — Понимание функции Button Debouncing

Давайте рассмотрим деблокировку кнопок более подробно. Важность кнопки не следует упускать из виду противодействие. Кнопочные переключатели — один из многих способов люди могут вводить данные в микроконтроллер.Когда кнопка нажата, человек будет ожидать реакции в какой-либо форме, например, переключение светодиода, меню на ЖК-дисплее (перемещение от одного пункта меню к другому), устройство, управляемое движением (перемещение и остановка), и т. д. Если кнопка не заблокирована каким-либо образом, человек может сильно расстроиться.

Отключение кнопки может вызвать несколько ложных нажатий кнопки. Представьте себе использование кнопки при выборе пункта меню.Кнопка не заблокирована, одно нажатие может вызвать меню, чтобы пропустить один или несколько пунктов меню. Еще хуже, когда вы пытаетесь выбрать конкретный элемент, и он постоянно пропускает при нажатии любой кнопки, делая конкретный выбор будет сделан.

Чтобы продемонстрировать это явление, в этом проекте будут два светодиода. Когда кнопка нажата, светодиоды будут переключаться между собой. Нажатие кнопки превратит один выключен, а другой включен.Когда кнопка будет отпущена, процесс снова начнется. и заставляют светодиоды снова переключаться после нажатия кнопки. Вы заметите что светодиоды будут переключаться дважды или даже больше раз при нажатии только одной кнопки.

Я покажу два способа устранения дребезга. Внутрисхемный метод (аппаратный) с использованием конденсатор, и программный дребезг. Оборудование будет просто использовать конденсатор для устранение дребезга, и программа введет переменную, которая измеряет уровень достоверности кнопки потока единиц или нулей.Отказ от ответственности: метод то, что я использую для устранения неполадок оборудования, — очень простой и плохой метод. Главный Проблема с этим методом заключается в том, что напряжение поднимается с 0 до 5 В, а не с немедленное или мгновенное изменение. Это может поместить сигнал в диапазон, в котором микроконтроллер не умеет бороться с напряжением. Этот диапазон — это площадь между порогами высокого и низкого сигналов, который составляет от 2 до 3 вольт.С учетом сказанного, я лично не видел никаких проблем с этой кнопкой дребезг. Если вы хотите исключить это лазание, воспользуйтесь спусковым крючком Шмитта.

На видео схема соединена на макетной плате без оборудования. debouncing, поэтому проблема может возникнуть. К микроконтроллеру подключены два светодиода, оба на порте B, один на контакте 0, а другой на контакте 2.обе эти булавки будут установлен на выход, и, поскольку светодиоды зеленые, резистор 330 Ом используется для каждого СВЕТОДИОД. Кнопочный переключатель подключен к контакту 1 порта B. Этот контакт будет установлен для вход и установите высокий уровень чтения (контакт установлен на «1»). для первого «отскока» мы будем не используйте конденсатор между двумя выводами кнопки.

Программа для переключения двух светодиодов при нажатии кнопки очень проста.Сначала инициализируются выводы: выводы, выводимые на светодиоды, устанавливаются на вывод в DDR (регистр направления данных). Один из светодиодов горит высоко, поэтому в начале один включен, а другой выключен. Затем запускается бесконечный цикл и код внутри этот блок выполняется до тех пор, пока микроконтроллер не потеряет питание. Используя этот цикл, штифт, подключенный к кнопке, постоянно проверяется, чтобы определить если горит.Если он нажат и показывает 1, то он проверяет, была ли кнопка впервые выпущен. Это важно, потому что, если у нас нет этой проверки, кнопка будет просто постоянно переключаться, пока кнопка нажата. Нам нужна только кнопка для переключения, если кнопка была нажата, а затем отпущена.

#include
int main (пусто)
{
DDRB | = 1 ПОРТБ ^ = 1 DDRB | = 1 DDRB & = ~ (1 ПОРТБ | = 1 int Pressed = 0; // Инициализируем / объявляем переменную Pressed

while (1)
{

if (bit_is_clear (PINB, 1)) // Проверяем нажата ли кнопка
{
// Убеждаемся, что сначала кнопка была отпущена
если (нажата == 0)
{

ПОРТБ ^ = 1 ПОРТБ ^ = 1 Нажат = 1;

} }
еще
{
// Этот код выполняется, когда кнопка не нажата.
Нажат = 0;
} } }

Итак, когда микроконтроллер запрограммирован, а кнопка нажата несколько раз, очевидно, что светодиоды будут переключаться, иногда правильно, а иногда — переключаться несколько раз одним нажатием кнопки. Добавьте конденсатор и проверьте нажатие кнопки и повторное переключение светодиода.На осциллископе с установленным конденсатором при нажатии кнопки создается постепенное повышение напряжения, в отличие от совокупность повышающих и понижающих напряжений, возникающих в результате отскока механических частей кнопки. Но когда кнопку отпускают, это показывает, что напряжение прямое. изменение. Это связано с тем, что между кнопкой и кнопкой не установлен другой конденсатор. микроконтроллер.

Далее метод устранения неполадок программного обеспечения исследуется.

,

alexxlab

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *