Ввод информации в мк. подключение кнопки к мк bascom-avr

Урок 8. Ввод информации в МК. Подключение кнопки к МК BASCOM-AVR

В предыдущих уроках были проведены способы вывода информации из микроконтроллера: подключение светодиода и ЖК индикатора. Но как, же вводить информацию в микроконтроллер? Существует множество вариантов и устройств для этого. Но пока что рассмотрим самый простой вариант, это обычная кнопка. Кнопки бывают двух видов: тактовые и фиксирующие. Тактовые кнопки работают по такому принципу: нажал – контакты замкнулись, отпустил – контакты разомкнулись. Следует учесть, что существуют тактовые кнопки, которые изначально замкнуты, а при нажатии размыкаются. Фиксирующие кнопки (их иногда называют: тумблеры, выключатели, переключатели) в отличии от тактовых фиксируют своё положение при нажатии, то есть: нажал – контакты замкнулись, еще раз нажал – контакты разомкнулись. В общем, с кнопками разобрались, теперь будем разбираться, как подключить эти кнопки к микроконтроллеру. А подключить на самом деле очень даже просто! Смотрим схему:

Возможно, вы спросите: Зачем резистор R1? А затем, что без резистора R1, когда кнопка S1 будет разомкнута, микроконтроллер на порте, к которому всё это подключено, будет видеть то логическую 1, то логический 0 тем самым будут производиться ложные срабатывания кнопки. Чтобы этого не происходило необходимо этот порт “подтягивать” сопротивлением к плюсу питания. Сопротивление резистора R1 может быть в интервале от 4,7кОм до 10кОм. С резистором получается такая картина: кнопка S1 нажата – на порте МК возникает логический 0, кнопка S1 не нажата – на порте МК возникает логическая 1 за счёт сопротивления R1. Конечно, нужно знать, что в некоторых AVR микроконтроллерах есть встроенные подтягивающие резисторы сопротивление порядка 50кОм, по умолчанию они отключены. В BASCOM-AVR эти резисторы можно включить, записав в необходимый порт логическую 1. Но я крайне не рекомендую использовать эти встроенные, гораздо надёжнее использовать внешние, как показано на схеме выше. Ну что, со схематическим решением разобрались, теперь будем разбираться программно. Для работы с кнопкой сначала нужно сконфигурировать порт микроконтроллера на вход, в BASCOM-AVR это делается вот так:
Config (порт микроконтроллера) = input
Пример:
Config PINB.3 = input

Обратите внимание, что для работы порта на вход, имя порта должно начинаться с PIN, а не с PORT как для конфигурации порта на выход!

После конфигурации порта на вход мы можем считать с него значение 1 или 0, в нашем случае 0 – кнопка нажата, 1 – кнопка не нажата. А проверить, что кнопка нажата, мы можем так:
If (порт микроконтроллера) = 0 then
(если кнопка нажата, то выполняем, действия описанные здесь)
End if
Можно и наоборот, проверить, не нажата ли кнопка:
If (порт микроконтроллера) = 1 then
(если кнопка не нажата, то выполняем, действия описанные здесь)
End if
Пример:
If PINB.3 = 0 then
PORTB.2 = 1 «если кнопка нажата, то включаем светодиод подключенный к PB.2
End if

Просто, не правда ли? Итак, теперь попробуем реализовать подключение кнопки к микроконтроллеру в “железе”. За основу возьмём микроконтроллер Attiny13 и отладочную плату для него сделанную немного ранее. Для того кто не делал отладочную плату, вот схема:

Алгоритм работы программы такой: кнопка S1 нажата – светодиод не горит, кнопка S1 не нажата – светодиод горит. А вот и сама программа на BASCOM-AVR:

Вот такая простая программа. Скомпилированная прошивка находится в архиве ниже. Фьюз биты можно не выставлять, так как в такой простой программе тактовая частота не особо важна. Для ленивых собирать в железе есть проект в нашем любимом симуляторе Proteus, скачать можно в архиве ниже. Работа в схемы в симуляторе Proteus:

Скачать файлы для урока (проект в Proteus , исходник, прошивка) вы можете ниже

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Читайте также  Простой термостат на компараторе

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

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

AVR Урок 7. Кнопка

Урок 7

Кнопка

Сегодня мы расширим свой кругозор по изучению работы портов микроконтроллера и изучим второе назначение порта – работу на вход. И для изучения работы на вход мы применим обычную тактовую кнопку.

Как всегда, создадим проект в Atmel Studio, выберем Atmega8A, назовем проект Test04 и код также в main.c, как обычно, скопируем с проекта предыдущего урока.

В качестве подопытного порта давайте возьмём порт B. Можно с успехом использовать любой порт. И в качестве ножки возьмем нулевую ножку. Итак у нас ножка B0.

Также опять мы соберём проект, скопируем и переименуем файл протеуса, откроем его и в свойствах контроллера покажем путь к новому проекту. Запустим на выполнение и убедимся, что всё работает.

Добавим кнопку в протеусе, для этого в поиске компонентов найдём Button

Затем подключим нашу кнопку вот таким вот образом к ножке B0 контроллера

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

Для этого мы, во-первых настроим порт B. Мы можем объявить все ножки порта B на вход, так как нам не важны настройки остальных ножке, ибо мы их не используем

DDRB = 0x00;

В случае, когда мы работали с портом D на выход, биты регистра PORTD отвечали за уровень на соответствующих ножках. А в случае, когда порт инициализирован на вход, как наш порт B, то биты регистра PORTB будут уже отвечать за подтягивание к соответствующим ножкам порта резисторов на шину питания. Если будет логическая единица, то регистр будет подтягиваться, а если логический ноль – то не будет. Поэтому мы в 0 бите регистра установим 1

PORTB = 0b00000001;

Соберём код и запустим его в протеусе. Мы видим, что на ножке B0 у нас установилась логическая 1, а если мы нажмём кнопку, то увидим, что на ней будет логический , о чём свидетельствует синий цвет квадратиков на ножке и на кнопке.

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

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

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

Условие в языке C добавляется с помощью команды if.

И в качестве условия мы возьмём состояние ножки 0 порта B или состояние бита 0 регистра PINB.

Как же можно получить состояние одного бита, ведь в языке C в отличие от ассемблера нет битовых операций?

Можно пойти на хитрость и применить вот такую конструкцию PINB &0b00000001.

Данная конструкция нам и проверит нулевой бит. То есть если в регистре PINB также будет 1 в нулевом его бите, то независимо от состояния остальных битов в данном регистре мы получим ненулевой результат, что также является истиной. То есть если ни с чем не сравнивать в условии результат, то условие эквивалентно сравниванием с нулём, только наоборот. Для истинности результат должен быть ненулевым – (результат!=0).

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

if (!( PINB &0b00000001))

else

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

PORTD = 0b0000000;

if (!( PINB &0b00000001))

PORTD = 0b00000001;

PORTD = 0b00000000;

Теперь давайте пересоберём проект и пойдём в протеус смотреть, удалось ли нам что-то.

Чтобы у нас при сборке не было даже предупреждений, уберём объявление переменной i, так как она в коде не используется

// unsigned char i;

unsigned char butcount =0;

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

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

И чтобы это как-то отследить и определить, что это было именно нажатие, а не дребезг, то мы будим отслеживать нажатие некоторое время, ну или некоторое количество тактов или циклов. Для этого в начале функции main() до бесконечного цикла мы добавим другую переменную (i нам ещё пригодится и мы её портить не будем). Назовём мы переменную butcount, так как имя переменной должно как-то само за себя говорить и тем самым достигается ещё большая читабельность кода

// unsigned char i;

unsigned char butcount =0;

И чтобы воспользоваться данной переменной, мы применим ещё одно условие. И у нас будет условие в условии. Это всё допустимо и очень широко используется. И в зависимости от этого условия мы данную переменную будем наращивать (инкрементировать). Условием будет у нас достижение данной переменной определённой величины. То есть попробуем сделать так, чтобы значение переменной не достигало 5

if (!( PINB &0b00000001))

if ( butcount 5)

butcount ++;

А когда значение данной переменной достигнет значения 5, то мы уже в данный цикл не попадём, а попадём мы в тело оператора else, который мы сейчас и добавим и в его теле напишем следующий код

PORTD = 0b00000001;

То есть мы как раз после достижения пятёрки и будем обрабатывать нажатие кнопки и включать на нулевой ножке порта D высокое состояние.

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

if ( butcount > 0)

butcount –;

else

PORTD = 0b00000000;

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

Читайте также  Apple remote shield на arduino

Давайте теперь соберём проект и проверим его работу сначала в протеусе, а затем и на практике. Выглядит это приблизительно так. Интереснее конечно это смотреть в видеоуроке

Купить программатор можно здесь (продавец надёжный) USBASP USBISP 2.0

Ввод информации в мк. подключение кнопки к мк bascom-avr

Пора уже прекращать с этим. Можно подумать, кто-то родился сразу со знаниями.

Подскажите пожалуйста, каким образом я могу вводить текст в устройство.
Так понимаю что символы можно хранить в переменной типа «String». Но как мне организовать ввод по средствам четырех кнопок — вверх/вниз — выбор символа, ок — кнопка подтверждения выбранного символа, кнопка — стереть последний символ.

Если есть примеры работы таких программ. Для начала хоть ввести пару слов, вывести их на ЖКИ и отправить в терминал.

JLCPCB, всего $2 за прототип печатной платы! Цвет — любой!

Зарегистрируйтесь и получите два купона по 5$ каждый:https://jlcpcb.com/cwc

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

При замене в современном автомобиле электромеханических реле на интеллектуальные силовые ключи PROFET производства Infineon необходимо учитывать особенности их коммутации по сравнению с «сухими контактами» реле, а также особенности управления с их помощью различными типами нагрузок.

Вебинар посвящен проектированию и интеграции встроенных и внешних антенн Quectel для сотовых модемов, устройств навигации и передачи данных 2,4 ГГц. На вебинаре вы познакомитесь с продуктовой линейкой и способами решения проблем проектирования. В программе: выбор типа антенны; ключевые проблемы, влияющие на эффективность работы антенны; требования к сертификации ОТА; практическое измерение параметров антенн.

Интересно, как оно работает, если в коде вообще никакой обработки нажатия нет. Даже стандартная команда Debounce не дописана.

_________________
«Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом». Томас Алва Эдисон

А вот этого я не знал — что резисторы можно не ставить. Только не очень понятно — как собственно включить
эти внутренние подтягивающие резисторы ? Или достаточно будет:

_________________
С уважением,
Алексей.

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

По умолчанию внутренние резисторы отключены.

_________________
«Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом». Томас Алва Эдисон

По умолчанию внутренние резисторы отключены.

_________________
С уважением,
Алексей.

В даташите указывается номинал этих резисторов. Для Attiny2313:

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

Кстати, pavel123, у Вас как раз в коде и включен внутренний резистор. И это при том, что Вы подключаете внешний. Так что определяйтесь.

_________________
«Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом». Томас Алва Эдисон

Оригинально. Я те та бу соо пи. Ну а что, ответ же есть, просто я не весь текст показываю. А правильно будет и так и этак. Тут всего лишь желательно для определенных задач.

_________________
«Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом». Томас Алва Эдисон

Да, все верно. Для опроса кнопки нужно чтобы на выводе был какой-то определенный уровень. Нельзя оставлять болтающийся в воздухе вывод, после отпускания кнопки на выводе должен установиться противоположный уровень. Вот как раз подтягивающий резистор и обеспечит 1 на выводе, а нажатая кнопка — 0. А какой резистор будет, внутренний или внешний — решать Вам.

Резистор же на 330R ограничит ток в случае неправильной конфигурации вывода порта. Если Вы по ошибке настроите этот вывод на ВЫХОД и выставите 1, то при нажатии кнопки пин порта скорее всего выйдет из строя. Резистор же спасет от такой неприятности. Если код написан без ошибок, то этот резистор не нужен. Но если Вы делаете первые шаги или это отладочная плата, то этот резистор просто обязателен.

_________________
«Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом». Томас Алва Эдисон

Доброго времени суток !

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

Config Int0 = Rising
On Int0 Read1307

Вот «выводим на LCD» нужно запихнуть в подпрограмму, так как обращаться к ней будем не только из подпрограммы прерывания. Потому что выводить на LCD будем очень хитро и через одно место (об этом позже, если всё получится). И если это «выводим на LCD» писать несколько раз где это нужно, то никакой памяти не хватит.

_________________
С уважением,
Алексей.

Ввод информации в мк. подключение кнопки к мк bascom-avr

Аппаратная реализация.

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

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

Для примера нам потребуется светодиод, подключеный через токоограничивающий резистор 220-330 Ом.

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

Программная реализация.

Простейший случай.

Для того чтобы контроллер мог отслеживать состояние кнопки, он должен в цикле проверять состояние входа. Пусть на линии порта, содержащей кнопку, установлен высокий логический уровень (5В). Тогда при нажатии кнопки (соединении линии порта с землей) линия будет иметь низкий уровень. Это изменение и будет отслеживать наша программа.
Рассмотрим пример, в котором при каждом нажатии на кнопку, светодиод будет менять свое состояние. Для этого организуем цикл.

Алгоритм получился примерно вот такой:

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

Дребезг контактов.

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

Для человека такое время колебания незначительно – мы его даже не заметим. Другое дело, микроконтроллер: предположим, проверка кнопки осуществляется в цикле, а контроллер работает на частоте 8 МГц, в таком случае, проверка кнопки будет осуществляться несколько тысяч, если не десятков тысяч раз в секунду. Может получиться так, (а скорее всего так и получится) что за то время, пока происходит дребезг, программа еще раз проверит кнопку – в таком случае предсказать результат сложно (раз на раз не приходится)

Программный антидребезг

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

Читайте также  Каталоги описание бытовых электросчетчиков

Важно помнить, что при отпускании кнопки дребезг так же будет происходить!


Ожидание отпускания кнопки.

Предположим, вы нажали кнопку и держите. Программа проверит ее в первый раз – сделает все так, как надо. Обработает антидребезг, выполнит все что нужно. А потом при последующей проверке снова обнаружит, что кнопка нажата – непорядок. Надо сделать так, чтобы программа дождалась отпускания кнопки. Для этого после выполнения нужных от нажатия кнопки действий запускаем цикл, выйти из которого можно будет только при отпущенной кнопке. (Это лишь один из вариантов. он далеко не самый производительный, зато наиболее простой для начинающих) Получается, что пока вы держите кнопку программа не проверяет ее состояние заново. После выхода из этого цикла надо прописать антидребезг (аналогичным образом).
Алгоритм приобретет такой вид:

В плане теории, в общем-то все) Поздравляю, если вы дочитали до этого места!

Пример применения всего вышеописанного.

Как и было заявлено в начале статьи, рассмотрим программу управления светодиодом.
Схема приведена выше.
Алгоритм работы программы следующий:

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

200?’200px’:»+(this.scrollHeight+5)+’px’);»>
/*****************************************************
This program was produced by the
CodeWizardAVR V2.04.0a Evaluation
Automatic Program Generator
© Copyright 1998-2009 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project : Test
Version : 1.0.0.0.1
Date : 20.09.2009
Author : DeepBlack
Company :
Comments:
for robotsspace.ucoz.ru

Chip type : ATmega8
Program type : Application
AVR Core Clock frequency: 16,000000 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 256
*****************************************************/

// Declare your global variables here
bit flag = 0;

void set() < // функция смены значения на выходе
flag = !flag;
PORTD.4 = flag;
>
void main(void)
<
// Declare your local variables here

// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=P State0=T
PORTB=0x02;
DDRB=0x00;

// Port C initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State6=T State5=T State4=T State3=T State2=P State1=T State0=T
PORTC=0x04;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=Out Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=0 State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x10;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

while (1)
<
if (PINC.2==0) < // ждем нажатия
delay_ms(50); // антидребезг
if (PINC.2==0) set(); // если все норм, переключаем
else continue;
>
else continue;

while(PINC.2==0) <>; // ждем отпускания кнопки
delay_ms(50); // антидребезг
>;
>

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

AVR Lab устройства на микроконтроллерах AVR

Форум по AVR

  • не работает программа из примера про пролистывания меню
  • sinaprog не работает
  • Пароль к архивам на сайте
  • Пароль
  • HDD и прерывания — доработка программы из статьи /node/220

Работа с кнопками программа обработки нажатия для микроконтроллера ATmega8

  • atmega8
  • avr
  • HD44780
  • key
  • keyboard
  • LCD

В этой заметке пойдет речь о считывании информации с помощью клавиш. Выводить введенную информацию будем на алфавитно-символьный ЖКИ. Предлагаю начать с самого простого. Подсоединим одну клавишу, без фиксатора, нормально разомкнутую и рассмотрим некоторые тонкости работы.

В этой заметке пойдет речь о считывании информации с помощью клавиш. Выводить введенную информацию будем на алфавитно-символьный ЖКИ. Предлагаю начать с самого простого. Подсоединим одну клавишу, без фиксатора, нормально разомкнутую и рассмотрим некоторые тонкости работы.


Испытуемая клавиша А2 при нажатии закорачивает вывод PB0 на «землю». Вся остальная обвязка стандартна.
Первой тонкостью работы является дребезг контактов, неизбежный при использовании не специализированных кнопок. Его можно убрать с помощью таймера LM555, но это извращение, если мы собрались использовать микроконтроллер.

Второй тонкостью является вопрос:

«когда считать кнопку нажатой?»

При появлении логического нуля на выводе порта микроконтроллера на протяжении 1мс? Но при залипании клавиши может возникнуть неприятная ситуация.
Третьим будет вопрос,

«с какой периодичностью проверять клавиши?»

Так как реакция человека на внешние раздражители редко когда превышает 0,03с. То условимся считывать состояние клавиатуры 100 раз в секунду. Клавишу будем считать нажатой, тогда, когда на порту микроконтроллера в течении более чем 0,01с будет присутствовать низкий уровень, после чего клавиша будет отжата (на порту микроконтроллера появится единица). В связи с этими рассуждениями напишем программу, которая будет обрабатывать нажатие одной клавиши, имитируя включение чего-то, на ЖКИ соответственно будем писать «On», «Off».

Как видно из кода, используется прерывания по переполнению нулевого таймера. Разберемся немного с прерываниями. Прерывание микроконтроллера – это реакция, быстрая реакция микроконтроллера на какое-то внешнее или внутреннее событие все зависимости от выполняемого в данный момент кода. Под реакцией подразумевается выполнения некой функции, обрабатывающей прерывания. События, вызывающее прерывания могут быть самыми разнообразными, например переполнение таймера, прием байта по USART, смена уровня на выводе INT0. В прерывания и есть особая фишка микроконтроллеров семейства AVR, можно реализовать «псевдомультизадачность». Для разрешения прерываний есть 2 бита. Для глобального разрешения прерывания бит I в регистре SREG должен равняется единице, а для запрета прерываний вообще – нулю (функция sei() разрешает прерывания; cli(); — запрещает). Далее для разрешения конкретного прерывания требуется установка бита, отвечающего за прерывание от данного события. Например, для прерывания по переполнению таймера нужно активировать бит TOIE0 в регистре TIMSK, а для прерывания по окончанию приема байта USART, бит RXCIE в регистре USCRB в ATmega8. Конкретные имена битов и регистров нужно смотреть в даташите микроконтроллера. Функция обработки прерывания описывается в виде:

Это на порядок чаще, чем мы условились выше, но на обработку прерывания тоже нужно время. Итого будем иметь около 200-300 прерываний в секунду. В функцию обработки прерывания запихнем алгоритм считывания нажатия клавиши: сперва ждем 0,01с, если на PB0 нулевой потенциал, ждем отжима клавиши, меняем состояние и выходим. В теле программы мы инициализируем порты, разрешаем прерывания и в вечном цикле выводим текущее состоянии, оглашенное глобальной переменной (1=«On», 0=«Off») на ЖКИ.
Аналогичную программу можно было написать без использования прерываний. Просто в вечном цикле считывая нажатие клавиши, а после выводя считанное значение на экран. Но при этом тратиться все машинное время процессора, что не есть хорошо. Все более-менее сложные проекты на AVR не обходятся без прерываний.