Подключение avr. Подключение кнопки к AVR. Подключение AVR микроконтроллера к программатору
Микроконтроллеры Atmega8 являются самыми популярными представителями своего семейства. Во многом они этим обязаны, с одной стороны, простоте работы и понятной структуре, с другой - довольно широким функциональным возможностям. В статье будет рассмотрено программирование Atmega8 для начинающих.
Общая информация
Микроконтроллеры встречаются везде. Их можно найти в холодильниках, стиральных машинках, телефонах, заводских станках и большом количестве других технических устройств. Микроконтроллеры бывают как простыми, так и чрезвычайно сложными. Последние предлагают значительно больше возможностей и функционала. Но разбираться сразу в сложной технике не выйдет. Первоначально необходимо освоить что-то простое. И в качестве образца будет взят Atmega8. Программирование на нём не является сложным благодаря грамотной архитектуре и дружелюбному интерфейсу. К тому же он является обладателем достаточной производительности, чтобы использовать в большинстве Более того, они применяются даже в промышленности. В случае с Atmega8 программирование предусматривает знание таких языков как AVR (C/Assembler). С чего же начать? Освоение этой технологии возможно тремя путями. И каждый выбирает сам, с чего начать работу с Atmega8:
- Программирование через Arduino.
- Покупка готового устройства.
- Самостоятельная сборка микроконтроллера.
Нами будет рассмотрен первый и третий пункт.
Arduino
Это удобная платформа, выполненная в виде что подходит для быстрого создания различных устройств. В плате уже есть всё необходимое в виде самого микроконтроллера, его обвязки и программатора. Пойдя по этому пути, человек получит следующие преимущества:
- Низкий порог требований. Не нужно обладать специальными навыками и умениями для разработки технических устройств.
- Широкий спектр элементов будет доступен для подключения без дополнительной подготовки.
- Быстрое начало разработки. С Arduino можно сразу переходить к созданию устройств.
- Наличие большого количества учебных материалов и примеров реализаций различных конструкций.
Но есть и определённые минусы. Так, Arduino программирование Atmega8 не позволяет глубже окунуться в мир микроконтроллера и разобраться во многих полезных аспектах. Кроме этого, придётся изучить язык программирования, что отличается от применяемых AVR (C/Assembler). И ещё: Arduino имеет довольно узкую линейку моделей. Поэтому рано или поздно возникнет необходимость использовать микроконтроллер, что не используется в платах. А в целом это неплохой вариант работы с Atmega8. Программирование через Arduino позволит получить уверенный старт в мире электроники. И у человека вряд ли опустятся руки из-за неудач и проблем.
Самостоятельная сборка
Благодаря дружелюбности конструкции их можно сделать самими. Ведь для этого нужны дешевые, доступные и простые комплектующие. Это позволит хорошо изучить устройство микроконтроллера Atmega8, программирование которого после сборки будет казаться более лёгким. Также при необходимости можно самостоятельно подобрать иные комплектующие под конкретную задачу. Правда, здесь есть и определённый минус - сложность. Самостоятельно собрать микроконтроллер, когда нет нужных знаний и навыков, нелегко. Этот вариант мы и рассмотрим.
Что же нужно для сборки?
Первоначально необходимо заполучить сам Atmega8. Программирование микроконтроллера без него самого, знаете ли, невозможно. Он обойдётся в несколько сотен рублей - обеспечивая при этом достойный функционал. Также стоит вопрос о том, как будет осуществляться программирование Atmega8. USBAsp - это довольно хорошее устройство, что себя зарекомендовало с лучшей стороны. Но можно использовать и какой-то другой программатор. Или же собрать его самостоятельно. Но в таком случае существует риск, что при некачественном создании он превратит микроконтроллер в неработающий кусочек пластика и железа. Также не помешает наличие макетной платы и перемычек. Они не обязательны, но позволят сэкономить нервы и время. И напоследок - нужен источник питания на 5В.
Программирование Atmega8 для начинающих на примере
Давайте рассмотрим, как в общих чертах осуществляется создание какого-то устройства. Итак, допустим, что у нас есть микроконтроллер, светодиод, резистор, программатор, соединительные провода, и источник питания. Первый шаг - это написание прошивки. Под нею понимают набор команд для микроконтроллера, что представлен в качестве конечного файла, имеющего специальный формат. В нём необходимо прописать подключение всех элементов, а также взаимодействие с ними. После этого можно приступать к сборке схемы. На ножку VCC следует подать питание. К любой другой, предназначенной для работы с устройствами и элементами,подключается сначала резистор, а потом светодиод. При этом мощность первого зависит от потребностей в питании второго. Можно ориентироваться по такой формуле: R=(Up-Ups)/Is. Здесь p - это питание, а s - светодиод. Давайте представим, что у нас есть светодиод, потребляющий 2В и требующий ток питания на уровне 10 мА, переводим в более удобный для математических операций вид и получаем 0.01А. Тогда формула будет выглядеть следующим образом: R=(5В-2В)/0.01А=3В/0.01А=300 Ом. Но на практике часто оказывается невозможным подобрать идеальный элемент. Поэтому берётся наиболее подходящий. Но нужно использовать резистор с сопротивлением выше значения, полученного математическим путём. Благодаря такому подходу мы продлим срок его службы.
А что же дальше?
Итак, у нас есть небольшая схема. Теперь осталось подключить к микроконтроллеру программатор и записать в его память прошивку, что была создана. Здесь есть один момент! Выстраивая схему, необходимо её создавать таким образом, чтобы микроконтроллер можно было прошивать без распайки. Это позволит сберечь время, нервы и продлит срок службы элементов. В том числе и Atmega8. Внутрисхемное программирование, нужно отметить, требует знаний и умений. Но оно же позволяет создавать более совершенные конструкции. Ведь часто бывает, что во время распайки элементы повреждаются. После этого схема готова. Можно подавать напряжение.
Важные моменты
Хочется дать новичкам полезные советы про программирование Atmega8. Встроенные переменные и функции не менять! Прошивать устройство созданной программой желательно после её проверки на отсутствие «вечных циклов», что заблокируют любое иное вмешательство, и с использованием хорошего передатчика. В случае использования самоделки для этих целей следует быть морально готовым к выходу микроконтроллера из строя. Когда будете прошивать устройство с помощью программатора, то следует соединять соответствующие выходы VCC, GND, SCK, MOSI, RESET, MISO. И не нарушайте технику безопасности! Если техническими характеристиками предусмотрено, что должно быть питание в 5В, то нужно придерживаться именно такого напряжения. Даже использование элементов на 6В может негативно сказать на работоспособности микроконтроллера и сократить срок его службы. Конечно, батареи на 5В имеют определённые расхождения, но, как правило, там всё в разумных рамках. К примеру, максимальное напряжение будет держаться на уровне 5,3В.
Обучение и совершенствование навыков
На счастье, Atmega8 является очень популярным микроконтроллером. Поэтому найти единомышленников или же просто знающих и умеющих людей не составит труда. Если нет желания изобретать заново велосипед, а просто хочется решить определённую задачу, то можно поискать требуемую схему на просторах мировой сети. Кстати, небольшая подсказка: хотя в русскоязычном сегменте робототехника довольно популярна, но, если нет ответа, то следует его поискать в англоязычном - он содержит на порядок большее количество информации. Если есть определённые сомнения в качестве имеющихся рекомендаций, то можно поискать книги, где рассматривается Atmega8. Благо, компания-производитель берёт во внимание популярность своих разработок и снабжает их специализированной литературой, где опытные люди рассказывают, что и как, а также приводят примеры работы устройства.
Сложно ли начать создавать что-то своё?
Достаточно иметь 500-2000 рублей и несколько свободных вечеров. Этого времени с лихвой хватит, чтобы ознакомиться с архитектурой Atmega8. После небольшой практики можно будет спокойно создавать свои собственные проекты, выполняющие определённые задачи. К примеру, роботизированную руку. Одного Atmega8 должно с лихвой хватить, чтобы передать основные моторные функции пальцев и кисти. Конечно, это довольно сложная задача, но вполне посильная. В последующем вообще можно будет создавать сложные вещи, для которых понадобятся десятки микроконтроллеров. Но это всё впереди, перед этим необходимо получить хорошую школу практики на чем-то простом.
Мы провели эмуляцию схемы в программе 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 микроконтроллеров, разберемся c чтением PDF документов в операционной системе Linux. Узнаем как подключить микроконтроллер к программатору используя интерфейс ISP при помощи нескольких проводников.
Чтобы правильно подключить микросхему-микроконтроллер к программатору нужно разобраться где у него и какие выводы. Для получения исчерпывающей информации о интересующем нас микроконтроллере качаем на официальном сайте даташит (datasheet ) на интересующий нас чип - Даташиты по микроконтроллерам ATMEL .
На первой страничке даташита приводится подробное описание возможностей микроконтроллера, а далее приведена распиновка микросхем под каждый из типов корпусов. Каждый даташит по AVR чипу содержит массу подробной информации на английском языке, к примеру даташит на микроконтроллер ATmega8 содержит 326 страниц!
Не знаете английского? - старайтесь понемногу изучать, без него сейчас очень трудно в современном мире радиоэлектроники и компьютерной техники, это универсальный международный язык. А пока что, если не знаете что означает какое-то слово или предложение - переведите его через сервис машинных переводов translate.google.com.
Чтение PDF документов в Linux
Как правило, все даташиты на микросхемы поставляются в формате PDF (Portable Document Format) - формат электронных документов для использования на разных платформах, разработан фирмой Adobe Systems.
Под Windows есть множество разных программ для чтения и работы с документами формата PDF. В операционной системе Linux формат PDF тоже имеет отличную программную поддержку.
- Okular - универсальная и мощная программа для просмотра документов, входит в окружение рабочего стола KDE;
- Qpdfview - простая и легковесная программа для просмотра документов в формате PDF, DjVu и PS;
- Evince (Document Viewer) - очень быстрый и легковесный просмотрщик документов PostScript (PS), EPS, DJVU, DVI, PDF;
- Xpdf - высокопроизводительный просмотрщик PDF-файлов.
Какую программу выбрать для просмотра PDF под Linux? - очень хорошо справляются со своими задачами программы Okular и Evince.
Если у вас установлена рабочая среда KDE то скорее всего что программа Okular уже присутствует в системе. Если Okular не установлен то исправить это можно командой:
Sudo apt-get install okular okular-extra-backends
Если же у вас рабочая среда отличная от KDE - GNOME, XFCE, UNITY то более экономичным решением будет установить Evince, поскольку установка в данных средах программы Okular потребует некоторые компоненты от рабочей среды KDE.
Рис. 1. Универсальный просмотрщик документов Evince под Linux - средство для листания PDF документов по микроконтроллерам.
Просмотрщик документов Evince очень хорошо открывает огромные документы и справляется иногда с такими что не под силу прочитать для Okular. Установка Evince в Linux:
Sudo apt-get install evince
Думаю что у вас теперь не возникнет проблем с чтением документов в формате PDF под ОС GNU Linux .
Подключение AVR микроконтроллера к программатору
Выше было рассказано что для подключения микроконтроллера к программатору нужно соединить выводы ISP: VCC, GND, MISO, MOSI, SCK, RST. Выводы с данными названиями присутствуют у всех микроконтроллеров, так что даташит нам в помощь.
Рис. 2. Распиновка микроконтроллера ATmega8 и подключение его к ISP (USB ASP).
У программатора USB ASP на коннекторе ISP предусмотрено напряжение +5В (VCC), так что для программирования чипа можно воспользоваться питанием от программатора, а вернее от USB порта к которому он подключен.
В рассмотреных раньше программаторах , что используют COM и LPT порты, нет вывода VCC, а это значит что с использованием этих программаторов на выводы GND (-) и VCC (+) микроконтроллера нужно подать напряжение питания 5В от внешнего источника.
Подключения микроконтроллера к программатору USB ASP на беспаечной макетной панели очень просто реализовать при помощи перемычек (проводники со штырьками на двух концах).
Рис. 3. Подключение к ISP коннектору программатора USB ASP на беспаечной макетной панели.
Казалось бы простая тема, а однако в комментах меня завалили вопросами как подключить микроконтроллер. Как подключить к нему светодиод, кнопку, питание. Что делать с AGND
или AREF
. Зачем нужен AVCC
и все в таком духе. Итак, раз есть вопросы, значит тема не понятна и надо дать по возможности исчерпывающий ответ. Все описываю для контроллеров AVR, но для каких нибудь PIC все очень и очень похоже. Т.к. принципы тут едины.
Питание
Для работы микроконтроллеру нужна энергия — электричество. Для этого на него естественно нужно завести питалово. Напряжение питание у МК Atmel AVR
разнится от 1.8
до 5
вольт, в зависимости от серии и модели. Все AVR
могут работать от 5 вольт (если есть чисто низковольтные серии, то просьба уточнить в комментах, т.к. я таких не встречал). Так что будем считать что напряжение питания контроллера у нас всегда 5 вольт или около того. Плюс напряжения питания обычно обозначается как Vcc
. Нулевой вывод (а также Земля, Корпус, да как только его не называют) обозначают GND
. Если взять за пример комповый блок питания. То черный провод это GND (кстати, земляной провод традиционно окрашивают в черный цвет), а красный это +5, будет нашим Vcc
. Если ты собираешься запитать микроконтроллер от батареек, то минус батареек примем за GND
, а плюс за Vcc
(главное чтобы напряжение питания с батарей было в заданных пределах для данного МК, позырь в даташите. Параметр обычно написан на первой странице в общем описании фич:
Operating Voltages
–1.8 — 5.5V (ATtiny2313V)
–2.7 — 5.5V (ATtiny2313)
Speed Grades
–ATtiny2313V: 0 — 4 MHz @ 1.8 — 5.5V, 0 — 10 MHz @ 2.7 — 5.5V
–ATtiny2313: 0 — 10 MHz @ 2.7 — 5.5V, 0 — 20 MHz @ 4.5 — 5.5V
Обрати внимание, что есть особые низковольтные серии (например 2313V низковльтная) у которых нижня граница напряжения питания сильно меньше. Также стоит обратить внимание на следующий пункт, про частоты. Тут показана зависимость максимальной частоты от напряжения питания. Видно, что на низком напряжении предельные частоты ниже. А низковольтные серии раза в два медленней своих высоковольтных коллег. Впрочем, разгону все процессоры покорны;)))))
Для работы контроллерам серии AVR достаточно только питания. На все входы Vcc надо подать наши 5 (или сколько там у тебя) вольт, а все входы GND надо посадить на землю. У микроконтроллера может быть много входов Vcc и много входов GND (особенно если он в квадратном TQFP корпусе. У которого питалово со всех сторон торчит). Много выводов сделано не для удобства монтажа, а с целью равномерной запитки кристалла со всех сторон, чтобы внутренние цепи питания не перегружались. А то представь, что подключил ты питалово только с одной стороны, а с другой стороны чипа навесил на каждую линию порта по светодиоду, да разом их зажег. Внутренняя тонкопленочная шина питания, офигев от такой токовой нагрузки, испарилась и проц взял ВНЕЗАПНО и без видимых, казалось бы, причин отбросил копыта. Так что ПОДКЛЮЧАТЬ НАДО ВСЕ ВЫВОДЫ Vcc и GND . Соединить их соответственно и запитать.
Отдельные вопросы вызвают AGND и AVCC — это аналоговая земля и питание для Аналого-Цифрового Преобразователя. АЦП это очень точный измеритель напряжения, поэтому его желательно запитать через дополнительные фильтры, чтобы помехи, которые не редки в обычной питающей цепи, не влияли на качество измерения. С этой целью в точных схемах проводят разделение земли на цифровую и аналоговую (они соединены должны быть только в одной точке), а на AVCC подается напряжение через фильтрующий дроссель. Если ты не планируешь использовать АЦП или не собираешься делать точные измерения, то вполне допустимо на AVCC подать те же 5 вольт, что и на Vcc , а AGND посадить на ту же землю что и все. Но подключать их надо обязательно!!! ЕМНИП от AVCC питается также порт А.
Warning!!!
В чипе Mega8 похоже есть ошибка на уровне топологии чипа — Vcc и AVcc связаны между собой внутри кристалла. Между ними сопротивление около (!!!) 5Ом Для сравнения, в ATmega16 и ATmega168 между Vcc и AVcc сопротивление в десятки МЕГА ом! В даташите на этот счет никаких указаний нет до сих пор, но в одном из топиков за 2004 год на AVRFreaks сказано, что люди бодались с цифровым шумом АЦП, потом написали в поддержку Atmel мол WTF??? А те, дескать, да в чипе есть бага и Vcc и AVcc соединены внутри кристалла. В свете этой инфы, думаю что ставить дроссель на AVcc для Mega8 практически бесполезно. Но AVcc запитывать надо в любом случае — кто знает насколько мощная эта внутренняя связь?
Простейшая схема подключения Микроконтроллера AVR приведена ниже:
Как видишь, добавился дроссель в цепь питания AVCC
, а также конденсаторы. Хорошим тоном является ставить керамический конденсатор на сотню нанофарад между Vcc
и GND
у каждой микросхемы (а если у микрухи много вход питания и земель, то между каждым питанием и каждой землей) как можно ближе к выводам питания — он сгладит краткие импульсные помехи в шине питания вызыванные работой цифровых схем. Конденсатор на 47мКФ в цепи питания сгладит более глубокие броски напряжения. Кондесатор между AVcc
и GND
дополнительно успокоит питание на АЦП
.
Вход AREF
это вход опорного напряжения АЦП
. Туда вообще можно подать напряжение относительно которого будет считать АЦП
, но обычно используется либо внутренний источник опорного напряжения на 2.56 вольта, либо напряжение на AVCC
, поэтому на AREF
рекомендуется вешать конденсатор, что немного улучшит качество опорного напряжения АЦП
(а от качества опоры зависит адекватность показаний на выходе АЦП
).
Схема сброса
Резистор на RESET
. Вообще в AVR
есть своя внутренняя схема сброса, а сигнал RESET
изнутри уже подтянут резистором в 100кОм к Vcc
. НО! Подтяжка это настолько дохлая, что микроконтроллер ловит сброс от каждого чиха. Например, от касания пальцем ножки RST
, а то и просто от задевания пальцем за плату. Поэтому крайне рекомендуется RST
подтянуть до питания резистором в 10к. Меньше не стоит, т.к. тогда есть вероятность, что внутрисхемный программатор не сможет эту подтяжку пересилить и прошить МК внутри схемы не удасться. 10к в самый раз.
Есть еще вот такая схема сброса:
Она замечательна чем — при включении схемы конденсатор разряжен и напряжение на RST близко к нулю — микроконтроллер не стартует, т.к. ему непрерывный сброс. Но со временем, через резистор, конденсатор зарядится и напряжение на RST достигнет лог1 — МК запустится. Ну, а кнопка позволяет принудительно сделать сброс если надо.
Задержка будет примерно T=R*C для данного примера — около секунды. Зачем эта задержка? Да хотя бы для того, чтобы МК не стартовал раньше чем все девайсы платы запитаются и выйдут на установившийся режим. В старых МК (АТ89С51 , например) без такой цепочки, обеспечивающей начальный сброс, МК мог вообще не стартануть.
В принципе, в AVR
задержку старта, если нужно, можно сделать программно — потупить с пол секунды прежде чем приступать к активным действиям. Так что кондер можно выкинуть нафиг. А кнопку… как хочешь. Нужен тебе внешний RESET
? Тогда оставь. Я обычно оставляю.
Источник тактового сигнала
Тактовый генератор это сердце микроконтроллера. По каждому импульсу происходит какая нибудь операция внутри контроллера — гоняют данные по регистрам и шинам, переключаются выводы портов, щелкают таймеры. Чем быстрей тактовая частота тем шустрей МК выполняет свои действия и больше жрет энергии (на переключения логических вентилей нужна энергия, чем чаще они переключаются тем больше энергии надо).
Импульсы задаются тактовым генератором встроенным в микроконтроллер. Впрочем может быть и внешний генератор, все очень гибко конфигурируется! Скорость с которой тикает внутренний генератор зависит от настроек микроконтроллера и обвязки.
Генератор может быть:
- Внутренним с внутренней задающей RC цепочкой.
В таком случае никакой обвязки не требуется вообще! А выводы XTAL1 и XTAL2 можно не подключать вовсе, либо использовать их как обычные порты ввода вывода (если МК это позволяет). Обычно можно выбрать одно из 4х значений внутренней частоты. Этот режим установлен по дефолту . - Внутренним с внешней задающей RC цепочкой.
Тут потребуется подключить снаружи микроконтроллера конденсатор и резистор. Позволяет менять на ходу тактовую частоту, просто подстраивая значение резистора. - Внутренним с внешним задающим кварцем.
Снаружи ставится кварцевый резонатор и пара конденсаторов. Если кварц взят низкочастотный (до 1МГц) то конденсаторы не ставят. - Внешним.
С какого либо другого устройства идет прямоугольный сигнал на вход МК, который и задает такты. Полезен этот режим, например, если надо чтобы у нас несколько микроконтроллеров работали в жестком синхронизме от одного генератора.
У разных схем есть разные достоинства:
В случае внутренней RC цепи
мы экономим место на плате, нам не нужно дополнительных деталек, но мы не можем развить максимальную частоту и частота немного зависит от температуры, может плавать.
У внешнего кварца отличные показатели точности, но он стоит лишних 15 рублей и требует дополнительных деталей и, что самое обидное, часто съедает пару ног I/O. Также на внешнем же кварце можно добиться максимальной производительности от МК. Частота МК определяется частотой на которую заточен выбранный кварц. Внешная RC цепь
позволяет тикать генератору МК быстрей чем от внутренней, стоит дешевле кварца, но имеет те же проблемы со стабильностью частоты, что и внутренняя RC цепь.
Способы тактования МК описаны в даташите в разделе System Clock and Clock Options
и всецело определяются конфигурацией Fuse Bit’s
. Пока же я настоятельно рекомендую НЕ ТРОГАТЬ FUSE
пока ты не будешь твердо знать что ты делаешь и зачем. Т.к. выставив что нибудь не то, можно очень быстро превратить МК в кусок бесполезного кремния, вернуть к жизни который будет уже очень непросто (но возможно!)
Подключение к микроконтроллеру светодиода и кнопки
Сам по себе, без взаимодействия с внешним миром, микроконтроллер не интересен — кому интересно что он там внутри себя тикает? А вот если можно как то это отобразить или на это повлиять…
Итак, кнопка и светодиод подключаются следующим образом:
Для кнопки надо выбраную ножку I/O подключить через кнопку на землю. Сам же вывод надо сконфигурировать как вход с подтяжкой (DDRxy=0 PORTxy=1). Тогда, когда кнопка не нажата, через подтягивающий резистор, на входе будет высокий уровень напряжения, а из бит PINху будет при чтении отдавать 1. Если кнопку нажать, то вход будет положен на землю, а напряжение на нем упадет до нуля, а значит из PINxy будет читаться 0. По нулям в битах регистра PINх мы узнаем что кнопки нажаты.
Пунктиром показан дополнительный подтягивающий резистор. Несмотря на то, что внутри AVR на порт можно подключить подтяжку, она слабоватая — 100кОм. А значит ее легко придавить к земле помехой или наводкой, что вызовет ложное срабатывание. А еще эти внутренние подтягивающие резисторы очень любят гореть от наводок. У меня уже с десяток микроконтроллеров с убитыми PullUp резисторами. Все работает, но только нет подтяжки — сгорела. Вешаешь снаружи резистор и работает как ни в чем ни бывало. Поэтому, для ответственных схем я настоятельно рекомендую добавить внешнюю подтяжку на 10кОм — даже если внутреннюю накроет, внешняя послужит. В процессе обучения на это можно забить.
Светодиод
подключается на порт двумя способами. По схеме Порт-земля
или Порт-Питание
. В первом случае для зажигания диода надо выдать в порт лог1 — высокий уровень (примерно равен Vcc). Во втором случае для зажжения диода требуется выдать в порт лог0 — низкий уровень (около нуля). Для AVR
разницы вроде бы нет, а вот многие старые серии микроконтроллеров вниз тянули куда лучше чем вверх, так что схема Порт-Питание распространена чаще. Я применяю и ту и другую схему исходя из удобства разводки печатной платы. Ну, а на программном уровне разницы особой нет.
Вывод порта для работы со светодиодом надо сконфигурировать на выход
(DDRxy=1) и тогда в зависимости от значения в PORTxy на ножке будет либо высокий либо низкий уровень напряжения.
Светодиод надо подключать через резистор
. Дело в том, что прямое сопротивление светодиода очень мало. И если не ограничивать ток через него, то он просто напросто может сгореть нафиг. Либо, что вероятней, пожечь вывод микроконтроллера, который, к слову, может тянуть что то около 20-30мА. А для нормального свечения обычному светодиоду (всякие мы не рассматриваем сейчас, эти монстры могут и ампер сожрать) надо около 3…15мА.
Так что, на вскидку, считаем:
- Напряжение на выходе ноги МК около 5 вольт, падение напряжени на светодиоде обычно около 2.5 вольт (выше нельзя, иначе диод сожрет тока больше чем надо и подавится, испустив красивый дым)
- Таким образом, напряжение которое должен взять на себя ограничительный резистор будет 5-2.5 = 2.5В.
- Ток нам нужен 5мА — нефига светодиод зря кормить, нам индикация нужна, а не освещение:)
- R=U/I= 2.5/5E-3 = 500Ом. Ближайший по ряду это 510 Ом. Вот его и возьмем. В принципе, можно ставить от 220 Ом до 680 Ом что под руку попадется — гореть будет нормально.
Если надо подключить много светодиодов, то на каждый мы вешаем по собственному резистору. Конечно, можно пожадничать и поставить на всех один резистор. Но тут будет западло — резистор то один, а диодов много! Соответственно чем больше диодов мы запалим тем меньше тока получит каждый — ток от одного резистора разделится между четырьмя. А поставить резистор поменьше нельзя — т.к. при зажигании одного диода он получит порцию тока на четверых и склеит ласты (либо пожгет порт).
Немного схемотехнических извратов или пара слов о экономии выводов
То что не удается запаять приходится программировать. (С) народная мудрость.
Очень часто бывает так, что вроде бы и памяти контроллера под задачу хватает с лихвой, и быстродействия через край, а ножек не хватает. Вот и приходится ставить избыточный и более дорогой микроконтроллер только потому, что у него банально больше выводов. Покажу парочку примеров как можно за счет усложнения программного кода сэкономить на железе.
Во главу угла такой экономии обычно ставится принцип динамического разделения назначения выводов во времени. То есть, например, вывод может работать на какую-либо шину, а когда шина не активна, то через этот же вывод можно проверить состояние кнопки, или что нибудь передать по другой шине. Быстро (десятки или даже тысячи раз в секунду) переключаясь между двумя разными назначениями можно добиться эффекта «одновременной работы».
Главное, тут следовать двум правилам:
- Два разных применения не должны мешать друг другу т.е. разделение во времени должно быть построено таким образом, чтобы смежная функция не искажала результат работы проверяемой функции.
- Ни в коем случае нельзя допускать конфликта уровней напряжений.
Приведу пример:
- У есть у нас вывод на который повешан выход с некого датчика и кнопка. Выход с датчика может быть 0, 1 в активном режиме и Hi-Z когда на датчик не приходит сигнал Enable.
- Кнопка же дает на линию жесткий 0, путем короткого замыкания.
Как это должно работать:
Скажем, основную часть времени у нас ввод микроконтроллера настроен на вход Hi-Z и мы снимаем показания с датчика на который подан еще и сигнал Enable. Когда нам надо опросить кнопку, то мы отбираем у датчика Enable и его выходы становятся в режим Hi-Z и нам не мешают. Вывод микроконтроллера мы переводим в режим Pull-Up и проверяем нет ли на входе нуля — сигнал нажатой кнопки. Проверили? Переводим вход МК в Hi-Z вход и подаем Enable на датчик снова. И так много раз в секунду.
Тут у нас возникает два противоречия:
- Логическое противоречие
0 на линии может быть в двух случаях от датчика или от кнопки. Но в этом случае, пользуясь здравым смыслом и требуемым функционалом, мы логическое противоречие можем не брать во внимание.Просто будем знать, что нажатие кнопки искажает показания датчика, а значит когда датчик работает — мы кнопку жать не будем. А чтобы показания датчика не принять за нажатие кнопки мы, в тот момент когда ждем данные с датчика, просто не опрашиваем кнопку. От тупых действий, конечно, это не защитит. Но для упрощения примера защиту от дурака я сейчас во внимания не беру.
- Электрическое противоречие
Если датчик выставит 1, а мы нажмем кнопку, то очевидно, что GND с Vcc в одном проводе не уживутся и кто нибудь умрет. В данном случае умрет выход датчика, как более слабый — куда там хилому транзистору тягаться с медной кнопкой.Организационными методами такое противоречие не решить — на глаз нельзя определить напряжение на линии и решить можно жать кнопку или нет. Да и в каком месте сейчас программа можно тоже только догадываться. Поэтому решать будем схемотехнически.
Добавим резистор в цепь кнопки, резистор небольшой, рассчитывается исходя из максимального тока самого слабого вывода линии.Если у нас, например, вывод датчика может дать не более 10мА, то резистор нужен такой, чтобы ток через него от Vcc до GND не превышал этой величины. При питании 5 вольт это будет 510Ом. Теперь, даже если на линии со стороны датчика будет лог1, высокий уровень, то нажатие на кнопку не вызовет даже искажения логического уровня т.к. резистор рассчитан с учетом максимальной нагрузки порта
Пример получился немного сумбурный, но суть думаю понятна. Я хочу чтобы ты увидел и понял не только как делается, но и зачем это делается:)
Ну и несколько примеров нескольких функций на одной ноге:
Во-первых, ISP разьем
. Я уже давным давно забыл что такое тыкать микроконтроллер вначале в колодку программатора, потом в плату, потом обратно и так по многу раз, пока прогу не отладишь. У меня на плате торчат 6 выводов ISP разьема и при отладке программатор вечно воткнут в плату, а программу я перешиваю порой по нескольку раз в 10 минут. Прошил — проверил. Не работает? Подправил, перепрошил еще раз… И так до тех пор пока не заработает. Ресурс у МК на перепрошивку исчисляется тысячами раз. Но ISP разьем сжирает выводы. Целых 3 штуки — MOSI, MISO, SCK.
В принципе, на эти выводы можно еще повесить и кнопки. В таком случае никто никому мешать не будет, главное во время прошивки не жать на эти кнопки. Также можно повесить и светодиоды (правда в этом случае простейший может дать сбой, а вот молодцом!) тогда при прошивке они будут очень жизнерадостно мерцать:)))
На линии под ISP можно повесить и что нибудь другое, главное, чтобы при прошивке это ЧТОТО не начало ВНЕЗАПНО чудить . Например, управление стокилограммовым манипулятором висит на линии ISP и во время прошивки на него пошла куча бредовых данных — так он может свихнуться и кому нибудь бошку разнести. Думать надо, в общем. А вот с каким нибудь , который работает по шинному интерфейсу прокатит такая схема:
Переключаем выход с 0 на 1 и зажигаем то верхний то нижний диод. Если надо зажечь оба, то мы просто переводим вывод микроконтроллера в режим Hi-Z
и словно нет его, а диоды будут гореть сквозным током. Либо быстро быстро переключать диоды между собой, в этом случае на глаз они будут оба гореть. Недостаток схемы очевиден — диоды нельзя погасить. Но если по задумке хотя бы один должен гореть, то почему бы и нет? UPD:
Тут подумал, а ведь можно подобрать светодиоды и резисторы так, чтобы их суммарное падение напряжения было на уровне напряжения питания, а суммарные резисторы в таком случае загонят ток в такой мизер, что когда нога в Hi-Z то диоды вообще гореть не будут. По крайней мере на глаз это будет не заметно совсем. Разве что в кромешной тьме.
Следующий вариант он не дает экономию ножек, зато позволяет упростить разводку печатной платы, не таща к двум диодам еще и шину питания или земли:
А применив сходную тактику к кнопкам можно либо упростить разводку, либо по трем ножкам развести 6 кнопок.
Тут тоже все просто — одна нога дает подтяг, вторая косит под землю. Нажатие кнопки дает просадку напряжения на подтягивающей ножке. Это чует программа, поочередно опрашивающая каждую кнопку. Потом роли ножек меняются и опрашивается следующая кнопка.
В шестикнопочном режиме ситуация схожая — одна ножка дает подтяг, другая землю, а третья прикидывается ветошью Hi-Z и не отсвечивает. Но тут есть один побочный эффект. Например, опрашиваем мы кнопку «В». Для этого у нас верхняя линия встает на вход с подтяжкой
(PORTxy=1, DDRxy=0), средня дает низкий уровень на выходе
(PORTxy=0, DDRxy=1), нижняя не участвует в процессе ибо стоит в Hi-Z
(PORTxy=0, DDRxy=0). Если мы нажмем кнопку «В» то верхняя линия в этот момент просядет и программа поймет что нажата кнопка «В», но если мы не будем жать «В», а нажмем одновременно «Е» и «Б» то верхняя линия также просядет, а программа подумает что нажата «В», хотя она там и рядом не валялась. Минусы такой схемы — возможна неправильная обработка нажатий. Так что если девайсом будут пользоваться быдло-операторы, жмущие на все подряд без разбора, то от такой схемы лучше отказаться.
Ну и, напоследок, схема показывающая как можно обьединить кнопку и светодиод:
Работает тоже исключительно в динамике. То есть все время мы отображаем состояние светодиода — то есть выдаем в порт либо 0 (диод горит) либо Hi-Z (диод не горит). А когда надо опросить кнопку, то мы временно (на считанные микросекунды) переводим вывод в режим вход с подтягом (DDRxy=0 PORTxy=1) и слушаем кнопку. Режим когда на выводе сильный высокий уровень (DDRxy=1 PORTxy=1) включать ни в коем случае нельзя, т.к. при нажатии на кнопку можно пожечь порт.
Минусы — при нажатии на кнопку зажигается светодиод как ни крути. Впрочем, это может быть не багой, а фичей:)
Вот такие пироги. А теперь представьте себе прогу в которой реализованы все эти динамические фичи + куча своего алгоритма. Выходит либо бесконечная череда опросов, либо легион всяких флагов. В таких случаях простейшая диспетчеризация или кооперативная это то что доктор прописал — каждый опрос гонишь по циклу своей задачи и не паришься. Зато юзаешь везде какую-нибудь ATTiny2313 и ехидно глядишь на тех кто в ту же задачу пихает Mega8 или что пожирней:)
Я ничего не знаю и боюсь что либо сжечь, что мне делать???
Не бояться и делать. В конце концов, микроконтроллер не такая уж дорогая вещь чтобы сокрушаться по поводу его смерти. Выкинул в помойку и достал из пакетика новый. На худой конец, если совсем уж страшно, то можно купить готовую демоплату на которой все уже спаяно и разведено как надо. Тебе останется только программировать и смотреть результат.
А потом, на примере того как сделана демоплата, попробовать сделать что то свое. Сама же демоплата представляет собой микроконтроллер + немного стартовой периферии, которой хватит на ряд несложных опытов и которая может облегчить подключение и исследование других устройств. Демоплаты есть разные, например фирменные комплексы вроде STK500 или AVR Butterfly или моя которая была спроектированна исходя из моего опыта и на которой будет строится весь дальнейший учебный курс.
Существует два основных типа микроконтроллеров AVR. Первый из них предназначен для получения максимального быстродействия при высокой частоте, второй - для экономичной работы на небольших тактовых частотах. Маркировка микросхем второго типа отличается от первого тем, что на конце добавляется буква "L". Например, и , и .
Микроконтроллеры первой группы допускают питание в диапазоне от 4,5 до 5,5 вольт при тактовой частоте 0...16 МГц (для некоторых моделей - до 20 МГц, например или ), вторые - соответственно 2,7...5,5 вольт при частоте 0...8 МГц (для большинства моделей, у некоторых моделей диапазон может быть уже). Ток потребления у них также различается: микроконтроллеры с индексом "L" потребляют меньше электроэнергии.
Существуют также микроконтроллеры с возможностью понижения питания до 1.8 В, которые обычно маркируются буквой "V", например . При понижении питания соответствующим образом должна быть снижена и тактовая частота. Для ATtiny2313V при питании 1,8...5,5 В частота должна находиться в интервале 0...4 МГц, при питании 2,7...5,5 В - в интервале 0...10 МГц.
Такой подход может быть применим для экспериментального макетирования и любительских самоделок, но в промышленной автоматике может приводить к сбоям при помехах по питанию. В условиях сильных внешних помех сопротивление этого резистора (100-500 кОм) оказывается слишком большим, и при отсутствии на линии RESET сигнала высокого уровня может происходить случайный сброс микроконтроллера.
|
Для дополнительной защиты линии RESET от внешних помех рекомендуется также шунтировать ее на землю с помощью внешнего конденсатора емкостью около 0,1 мкф. Но при этом необходимо помнить, что вход внешнего сброса RESET может использоваться однопроводным интерфейсом debugWIRE при отладке программного обеспечения микроконтроллера. Наличие конденсатора, подключенного параллельно входу RESET, будет приводить к сбоям в работе этого интерфейса. Поэтому, если планируется отлаживать микроконтроллер на целевой плате с помощью debugWIRE, необходимо предусмотреть перемычку, чтобы отключать этот конденсатор на время отладки прикладного программного обеспечения.
|
Для поддержки режима высоковольтного программирования микроконтроллеры AVR не имеют стандартного внутреннего диода для защиты от избыточного напряжения на входе RESET. Поэтому, если высоковольтное программирование не используется, для защиты от помех рекомендуется подключать внешний диод, например 1N4148 между линией RESET и шиной питания микроконтроллера. Таким образом, типовая схема внешней "обвязки" для линии RESET будет выглядеть следующим образом.
Если же линия сброса не используется и внутрисхемное программирование не требуется, то в законченном устройстве вывод RESET может быть присоединен непосредственно к шине питания микроконтроллера.
Дополнительной мерой может служить шунтирование каждого контакта электродвигателя на его корпус или на "землю".
Емкость керамических конденсаторов С2 и С3 в этом случае также может лежать в диапазоне 0,01...0,1 мкф
|
При установке микроконтроллера в непосредственной близости от двигателей следует позаботиться о снижении риска возможных наводок на внешние цепи AVR. Так, цепь внешнего тактирования может служить транзитным путем для наводок. Чтобы устранить возможные сбои, рекомендуется конденсаторы С1 и С2 устанавливать как можно ближе к выводам XT1 и XT2, а их "земляные" обкладки подключать непосредственно к выводу GND микроконтроллера короткими проводниками. Кроме того, рекомендуется корпус кварцевого резонатора Q1 припаивать коротким проводом к цепи GND. Еще большую безопасность может обеспечить экранирующий контур на печатной плате вокруг кварцевого резонатора и конденсаторов.