Подключение кнопки к микроконтроллеру avr. Микроконтроллеры Atmega8. Программирование Atmega8 для начинающих. Генератор может быть

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

Общая информация

Микроконтроллеры встречаются везде. Их можно найти в холодильниках, стиральных машинках, телефонах, заводских станках и большом количестве других технических устройств. Микроконтроллеры бывают как простыми, так и чрезвычайно сложными. Последние предлагают значительно больше возможностей и функционала. Но разбираться сразу в сложной технике не выйдет. Первоначально необходимо освоить что-то простое. И в качестве образца будет взят Atmega8. Программирование на нём не является сложным благодаря грамотной архитектуре и дружелюбному интерфейсу. К тому же он является обладателем достаточной производительности, чтобы использовать в большинстве Более того, они применяются даже в промышленности. В случае с Atmega8 программирование предусматривает знание таких языков как AVR (C/Assembler). С чего же начать? Освоение этой технологии возможно тремя путями. И каждый выбирает сам, с чего начать работу с Atmega8:

  1. Программирование через Arduino.
  2. Покупка готового устройства.
  3. Самостоятельная сборка микроконтроллера.

Нами будет рассмотрен первый и третий пункт.

Arduino

Это удобная платформа, выполненная в виде что подходит для быстрого создания различных устройств. В плате уже есть всё необходимое в виде самого микроконтроллера, его обвязки и программатора. Пойдя по этому пути, человек получит следующие преимущества:

  1. Низкий порог требований. Не нужно обладать специальными навыками и умениями для разработки технических устройств.
  2. Широкий спектр элементов будет доступен для подключения без дополнительной подготовки.
  3. Быстрое начало разработки. С Arduino можно сразу переходить к созданию устройств.
  4. Наличие большого количества учебных материалов и примеров реализаций различных конструкций.

Но есть и определённые минусы. Так, 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 должно с лихвой хватить, чтобы передать основные моторные функции пальцев и кисти. Конечно, это довольно сложная задача, но вполне посильная. В последующем вообще можно будет создавать сложные вещи, для которых понадобятся десятки микроконтроллеров. Но это всё впереди, перед этим необходимо получить хорошую школу практики на чем-то простом.

В статье будет рассмотрено подключение светодиодов к микроконтроллеру, работа с портами и написание программы на СИ. Статья, прежде всего, предназначена новичкам, которые только взялись за микроконтроллеры AVR.

Для начала нужно выбрать микроконтроллер. В моем случае это ATmega8535. В данном случае микроконтроллер можно брать любой, так как данная задача легко реализуется под любой МК. Писать программу для микроконтроллера можно на Ассемблере, СИ, Pascal-е и Bascom. Я использовал язык СИ, все эти языки разные.
Конкретную разницу между Си и Паскалем можно увидеть ниже.

//Мигающий светодиод void main() { ddrB = 0b11111111; //задаём порты B на выход portB = 0b11111111; //по умолчанию всё выключено while(1) { portB = ˜portB; //переключаем состояние светодиода на обратное delay_ms(100); //делаем задержку на 100 миллисекунд } }

Program First; begin ddrB:= $FF; //задаём порт B на выход portB:= $FF; //по умолчанию ничего не горит while(1) do begin portB:= not(portB); //переключаем состояние светодиода на обратное delay_ms(100); //делаем небольшую задержку end; end.

Список радиоэлементов

Обозначение Тип Номинал Количество Примечание Магазин Мой блокнот
U1 МК AVR 8-бит

ATmega8535

1 В блокнот
R1-R8 Резистор

220 Ом - 1 кОм

8 В блокнот
R9-R11 Резистор

10 кОм

3 В блокнот
V1-V8 Светодиод 8 В блокнот
Тактовая кнопка 3

Способы тактирования

Каноническим способом тактирования МК является подключение кварцевого резонатора к соответствующим выводам (рис. 18.11, а). Емкость конденсато­ров С1 и С2 в типовом случае должна составлять 22-36 пФ (о включении кварцев см. главу 15). В большинстве моделей Tiny и Mega имеется специ­альный конфигурационный бит скрот, который позволяет регулировать по­требление. При установленном в единицу (незапрограммированном) этом бите размах колебаний уменьшается, однако при этом сужается возможный диапазон частот и общая помехоустойчивость, поэтому использовать этот режим не рекомендуется (см. далее). Может быть также использован низко­частотный кварцевый резонатор (например, «часовой» 32 768 Гц), при этом конденсаторы С1 и С2 можно не устанавливать, так как при установке скрот в значение О подключаются имеющиеся в составе МК внутренние конденса­торы 36 пФ.

Вместо кварцевого может быть использован керамический резонатор. Автору этих строк удавалось запускать МК на нестандартных частотах, используя вместо кварца в том же подключении миниатюрную индуктивность (при ее значении в 4,7 мкГ и емкостях конденсаторов 91 пФ частота получается око­ло 10 МГц).

Рис. 18.11. Способы тактирования МК AVR с использованием: а - кварцевого резонатора; б - внешнего генератора; в - RC-цепочки

Естественно, тактировать МК можно и от внешнего генератора (рис. 18.11, б). Особенно это удобно, когда требуется либо синхронизировать МК с внешними компонентами, либо иметь очень точную частоту тактирова­ния при использовании соответствующих генераторов (например, серии SG-8002 фирмы Epson).

Наоборот, когда точность не требуется, можно использовать внешнюю ЛС-цепочку (рис. 18.11, в). В этой схеме емкость С1 должна быть не менее 22 пФ, а резистор R1 выбирается из диапазона 3,3-ЮОкОм. Частота при этом определяется по формуле F= 2/3 RC, CI можно не устанавливать вооб­ще, если записать логический ноль в конфигурационную ячейку скрот, под­ключив тем самым внутренний конденсатор 36 пФ.

Наконец, можно обойтись вообще без каких-то внешних компонентов - ис­пользовать встроенный /гС-генератор, который может работать на четырех частотах, приблизительно равных 1, 2, 4 и 8 МГц. Эту возможность наиболее целесообразно использовать в младших моде.(1ях Tiny, выпускающихся в 8-контактном корпусе- тогда выводы, предназначенные для подключения резонатора или внешнего генератора, можно использовать для других целей, как обычные порты ввода-вывода. Семейство Classic встроенного RC-генератора не имело.

По умолчанию МК семейств Tiny и Mega установлены в состояние для рабо­ты со встроенным генератором на частоте 1 МГц (cksel = oooi), поэтому для работы в других режимах нужно соответствующим образом установить конфигурационные ячейки cksel (см. табл. 18.1). Как это осуществить на практике, будет рассказано в главе 19, Рекомендуемое значение этих ячеек для обычных резонаторов от 1 МГц и более - все единицы в ячейках cksel, и ноль в скрот.

Подробности

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

Таблица 18.1. Установка конфигурационных ячеек CKSEL в зависимости от режимов тактирования

Источник тактирования

Внешняя частота

Встроенный /?С-генератор

Встроенный RC-генератор

Встроенный /?С-генератор

Встроенный RC-генератор

Внешняя RC-цепочка

Внешняя /?С-цепочка

Внешняя RC-цепочка

Внешняя RC-цепочка

Низкочастотный резонатор

Таблица 16.1 (окончание)

Источник тактирования

Керамический резонатор

Керамический резонатор

кварцевый резонатор

Кварцевый резонатор

Параллельные порты ввода/вывода

Портов ввода-вывода (повторим, что их не следует путать ни с регистрами ввода-вывода, ни с последовательными портами МК для обмена информаци­ей с внешними устройствами) в разных моделях может быть от 1 до 7. Номи­нально порты 8-разрядные, в некоторых случаях разрядность ограничена числом выводов корпуса и может быть меньше восьми. Порты обозначаются буквами А, В, С, D и т. д., причем необязательно по порядку: в младших мо­делях могут наличествовать, например, только порты В и D (как»в ATtiny2313) или вообще только один порт В (как в ATtinylх).

Для сокращения числа контактов корпуса в подавляющем большинстве слу­чаев внешние выводы, соответствующие портам, кроме своей основной функции (двунаправленного ввода/вывода) несут также и дополнительную. Отметим, что’ кроме как для вывода Reset, если он может работать в альтер­нативном режиме, никакого специального переключения выводов портов не требуется. Если вы, к примеру, в своей программе инициализируете последо­вательный порт UART, то соответствующие выводы порта (например, в ATmega8335 это выводы порта PDO и PD1) будут работать именно в альтер­нативной функции, как ввод и вывод UART. При этом в промежутках между таким специальным использованием выводов их можно в принципе исполь­зовать, как обычные двунаправленные выводы. На практике приходится применять схемотехнические меры для изоляции функций друг от друга, по­этому злоупотреблять этой возможностью не рекомендуется.

Выводы портов в достаточной степени автономны, и их режим может уста­навливаться независимо друг от друга. По умолчанию при вк;^ючении пита­ния все дополнительные устройства отключены, а порты работают на вход, причем находятся в третьем состоянии с высоким гшпедансом (то есть с вы­соким входным сопротивлением). Работа на выход требует специального указания, для чего в программе нужно установить соответствующий нужно­му выводу бит в регистре направления данных (этот регистр обозначается DDRx, где x - буква, обозначающая конкретный порт, например для порта А это будет ddra). Если бит сброшен (то есть равен логическому нулю), то вы­вод работает на вход (как по умолчанию), если установлен (то есть равен ло­гической единице) - то на выход.

Для установки выхода в состояние единицы нужно отдельно установить со­ответствующий бит в регистре данных порта (обозначается portx), а для ус­тановки в О - сбросить этот бит. Направление работы вывода (вход-выход, регистр DDRx) и его состояние (О-1, portx) путать не следует.

Регистр данных portx фактически есть просто выходной буфер, все, что в него записывается, тут же оказывается на выходе. Но если установить вывод порта на вход (то есть записать в регистр направления ddrx логический ноль), как это сделано по умолчанию, то регистр данных portx будет играть несколько иную роль - установка его разрядов в ноль означает, что вход находится в третьем состоянии с высоким сопротивлением, а установка в единицу подключит к выводу «подтягивающий» (pull-up) резистор сопротив­лением 35-120 кОм.

Заметки на полях

Встроенного pull-up-резистора в большинстве случаев оказывается недоста­точно для надежной работы - из-за наводок МК может сбоить, и лучше уста­навливать дополнительный внешний резистор параллельно этому внутренне­му, с сопротивлением от 1 до 5 кОм (в критичных по отношению к потреблению случаях его величину можно увеличить до 20-30 кОм). Например, если вы подключаете ко входу выносную кнопку с двумя выводами, которая коммути­руется на «землю», или вывод работает на «общую шину» с удаленными (на­ходящимися на другой плате) устройствами, или вывод осуществляет функ­цию внешнего прерывания (см. далее), то такой дополнительный резистор следует подключать обязательно.

Процедура чтения уровня на выводе порта, если он находится в состоянии работы на вход, не совсем тривиальна. Возникает искушение прочесть дан­ные из регистра данных portx, но это ничего не даст - вы прочтете только то, что там записано вами же ранее. А для чтения того, что действительно имеется на входе (непосредственно на выводе микросхемы) предусмотрена другая возможность. Для этого нужно обратиться к некоторому массиву, ко­торый обозначается pinx. Обращение осуществляется так же, как и к отдель­ным битам обычных РВВ (см. главу 19\ но pinx не есть регистр, это просто некий диапазон адресов, чтение по которым предоставляет доступ к инфор­мации из буферных элементов на входе порта. Записывать что-либо по адре­сам piNx, естественно, нельзя.

Прерывания

Как и в ПК, прерывания (interrupts) в микроконтроллерах бывают двух видов. Но если в ПК прерывания делятся на аппаратные (например, от таймера или клавиатуры) и программные (фактически не прерывания, а подпрограммы, записанные в. BIOS- с распространением Windows это понятие почти ис­чезло из программистской практики), то в МК, естественно, все прерыва­ния - аппаратные, а делятся они ria внутренние и внешние. Любое прерыва­ние отдельно, а также вообще возможность их возникновения требуют предварительного специального разрешения.

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

Внутренние прерывания могут возникать от любого устройства, которое яв­ляется дополнительным по отношению к ядру системы - от таймеров, от аналогового компаратора, от последовательного порта и т.д. Внутреннее прерывание - это событие, которое возникает в системе и прерывает выпол­нение основной программы. Система внутренних прерываний в AVR доволь­но разветвленная и представляет собой основную систему взаимодействия устройств с ядром системы, и к этому вопросу мы еще будем неоднократно возвращаться.

Внешних прерываний у МК AVR как минимум два, INTO, INT1 (у большин­ства Mega есть еще третье - ИЧТ2). Внешнее прерывание - событие, кото­рое возникает при появлении сигнала на одном из входов, специально пред­назначенных для этого. Различаются три вида событий, вызывающих прерывание, и их можно устанавливать в программе: это может быть низкий уровень напряжения, а также пюложительный или отрицательный фронт на соответствующем выводе. Любопытно, что прерывания по всем этим собы­тиям выполняются, даже если соответствующий вывод порта сконфигуриро­ван на выход.

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

В отличие от этого, прерывания по фронту или спаду выполняются один раз. Конечно, от дребезга контактов там никакой защиты нет и быть не может, потому что МК не способен отличить дребезг от серии коротких импульсов. Если это критично, нужно либо принимать внешние меры по защите от дре­безга, либо использовать тот же способ, что и для прерывания по уровню - внутри процедуры обработчика прерывания первой же командой запретить само прерывание, а через некоторое время в другой процедуре (по таймеру или по иному событию) опять его разрешить (этот способ «антидребезга» фактически идентичен применению одновибратора, см. главу 15).

Подробности

у внимательного читателя возникает законный вопрос - а зачем вообще ну­жен режим внешнего прерывания по уровню? Дело в том, что оно во всех мо­делях выполняется асинхронно - в тот момент, когда низкий уровень появил­ся на выводе МК. Конечно, обнаружение прерывания может произойти только по окончании текущей команды, так что очень короткие импульсы могут и про­пасть. Но прерывания INTO и INT1 в режиме управления по фронту у большин­ства моделей определяются наоборот, только синхронно - в момент перепа­да уровней тактового сигнала контроллера, поэтому их длительность не должна быть короче одного периода тактового сигнала. Но это не самое глав­ное: по большому счету разницы в этих режимах никакой бы не было, если бы не то обстоятельство, что синхронный режим требует непременно наличия этого самого тактового сигнала. Потому асинхронное внешнее прерывание, соответственно, может «разбудить» контроллер, находящийся в одном из ре­жимов глубокого энергосбережения, когда тактовый генератор не работает, а синхронное - нет. И обычные МК, вроде AT90S8515 семейства Classic (но не его mega-аналога!), могут выводиться из глубокого «сна» только внешним пре­рыванием по уровню, которое не всегда удобно использовать. У большинства же моделей семейства Меда (из младших моделей - кроме ATmegaS), имеет­ся еще одно прерывание INT2, которое происходит только по фронтам (по уровню не может), но, в отличие от INTO и INT1, асинхронно. В ATtiny2313 (но не в его «классическом» аналоге!) такое асинхронное прерывание может про­исходить по сигналу с любого из 8 выводов порта В. Это значительно повыша­ет удобство пользования контроллером в режиме энергосбережения.

Таймеры-счетчики

в большинстве МК AVR присутствуют два или три таймера-счетчика, один из которых- 16 разрядный, а остальные- 8-разрядные (в старших моде­лях Mega общее число счетчиков может быть до 6). Все счетчики имеют возможность предварительной загрузки значений и могут работать непо­средственно от тактовой частоты (СК) процессора или от нее же, поделен­ной на 8, 64, 256 или 1024 (в отдельных случаях еще на 16 и 32), а также от внешнего сигнала. В целом устройство таймеров в МК, как мы говорили, похоже на счетчики 561HEU/14 (см. главу 15), только функциональность их значительно расширена.

В архитектуре AVR 8-разрядным счетчикам-таймерам присвоены номера О и 2, а 16-разрядным- 1, 3 и далее. Некоторые 8-разрядные счетчики (обычно Timer 2, если их два) могут работать в асинхронном режиме от отдельного тактового генератора, причем продолжать функционировать даже в случае «спящего» состояния всей остальной части МК, что позволяет использовать их в качестве часов реального времени.

При использовании счетчиков-таймеров, как обычных счетчиков внешних импульсов (причем возможна реакция как по спаду, так и по фронту импуль­са) частота подсчитываемых импульсов не должна превышать половины час­тоты тактового генератора МК (причем при несимметричном внешнем меан­дре инструкция рекомендует еще меньшее значение предельной частоты - 0,4 от тактовой). Это обусловлено тем, что при счете внешних импульсов их фронты обнаруживаются синхронно (в моменты положительного перепада тактового сигнала). Кроме того, стоит учитывать, что задержка обновления содержимого счетчика после прихода внешнего импульса может составлять до 2,5 периода тактовой частоты.

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

При наступлении переполнения счетчика возникает событие, которое может вызывать соответствующее прерывание. 8-разрядный счетчик Timer О в ряде случаев этой функцией и ограничивается. Счетчик Timer 2, если он имеется, может также вызывать прерывание по совпадению подсчитанного значения с некоторой заранее заданной величиной. 16-разрядные счетчики - более «продвинутые» и могут вызывать прерывания по совпадению с двумя незави­симо заданными числами А и В. При этом счетчики могут обнуляться или продолжать счет, а на специальных выводах при этом могут генерироваться импульсы (аппаратно, без участия программы).

Кроме того, 16-разрядные счетчики могут осуществлять «захват» (capture) внешних одиночных импульсов на специальном выводе. При этом может вы­зываться прерывание, а содержимое счетчика помещается в некий регистр. Сам счетчик при этом может обнуляться и начинать счет заново или просто продолжать счет. Такой режим удобно использовать для измерения периода внешнего сигнала или для подсчета неких нерегулярных событий (вроде прохождения частиц в счетчике Гейгера). Немаловажно, что источником та­ких событий может быть также встроенный аналоговый компаратор, который тогда используется, как формирователь импульсов.

Все счетчики-таймеры могут работать в т. н. режимах PWM, то есть в качест­ве 8-, 9-, 10- или 16-битных широтно-импульсных модуляторов (ШИМ), при­чем независимо друг от друга, что позволяет реализовать многоканальный ШИМ. В технической документации этим режимам, в силу их сложности, многовариантности и громоздкости, посвящено много страниц. Простейший вариант использования этих режимов для воспроизведения звука мы кратко рассмотрим в главе 22 в связи с голосовой сигнализацией. Отметим, что син­тез звука - не единственное и даже не самое приоритетное назначение ре­жимов PWM, их также можно использовать для регулирования мощности или тока (например, при зарядке аккумуляторов), управления двигателями, выпрямления сигнала, при цифроаналоговом преобразовании.

Кроме таймеров-счетчиков, во всех без исключения AVR-контроллерах есть сторожевой (Watchdog) таймер. Он предназначен в основном для вывода МК из режима энергосбережения через определенный интервал времени, но мо­жет использоваться и для аварийного перезапуска МК. Например, если рабо­та программы зависит от прихода внешних сигналов, то при их потере (на­пример, из-за обрыва на линии) МК может «повиснуть», а Watchdog-таймер выведет его из этого состояния.

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

Последовательные порты для обмена данными с внешними устройствами - важнейшая составляющая любого МК, без них его «общение» с внешним ми­ром резко ограничено. Последовательными их называют потому, что в них в каждый момент времени передается только один бит (в некоторых случаях возможна одновременная передача и прием, но все равно только по одному биту за раз). Самое главное преимущество последовательных портов перед параллельными (когда одновременно производится обмен целыми байтами или полубайтами-тетрадами) - снижение числа соединений. Но оно не единственное: как ни парадоксально, но последовательные интерфейсы дают значительную фору параллельным на высоких скоростях, когда на скорость передачи начинают влиять задержки в линиях. Последние невозможно сде­лать строго одинаковыми, и это одна из причин того, что последовательные интерфейсы в настоящее время начинают доминировать (типовые приме­ры - USB и FireWire вместо СОМ, LPT и SCSI, или Serial ATA вместо IDE).

В микроконтроллерных устройствах с нашими объемами данных, конечно, скорость передачи нас волнует во вторую очередь, но вот количество соеди­нительных проводов - очень критичный фактор. Поэтому все внешние уст­ройства, с которыми мы будем иметь дело в этой книге, будут иметь после­довательные интерфейсы.

Практически любой последовательный порт можно имитировать программ­но, используя обычные выводы МК. Когда-то так и поступали даже в случае самого популярного из таких noptoB - UART. Однако с тех пор МК обзаве­лись аппаратными последовательными портами, что, впрочем, не означает необходимости их непременного использования. Легкость программной ими­тации последовательных портов - еще одно их достоинство.

Из всех разновидностей портов, которые могут наличествовать в МК AVR, мы особенно обратим внимание на UART- Universal Asynchronous Receiver-Transmitter, «универсальный асинхронный приемопередатчик». UART есть основная часть любого устройства, поддерживающего протокол RS-232, но и не только его (недаром он «универсальный») - например, про­мышленные стандарты RS-485 и RS-422 также реализовываются через UART, так как они отличаются от RS-232 только электрическими параметра­ми и допустимыми скоростями, а не общей логикой построения. В персо­нальных компьютерах есть СОМ-порт, который работает по тому же прото­колу RS-232, и узел UART точно так же является его базовой частью.

Поэтому UART служит основным способом обмена данными МК с компью­тером. Отметим, что отсутствие СОМ-порта в большинстве современных мо­делей ПК не является препятствием: для этого существуют переходники USB-COM, а в настольную модель можно вставить дополнительную карту с СОМ-портами.

Заметки на полях

А почему это для нас так важно? Дело в том, что, соединив макет прибора с компьютером, даже если обмен данными функциональностью прибора и не предусмотрен, программу гораздо проще отлаживать, просто временно встав­ляя в нужных местах программы операции посылки значений задействованных регистров в ПК и принимая их в реальном времени с помощью какой-либо про­граммы- эмулятора терминала. Это намного удобней, чем осваивать гро­моздкую AVR Studio, да еще и в комплекте с какой-нибудь дорогущей отладоч­ной платой. Потому мой совет: сделать себе сразу отладочную плату, содержащую программирующий разъем (см. следующую главу) и преобразо­ватель уровней UART/RS-232 с разъемом для подключения нуль-модемного кабеля (см. главу 21).

О том, как обращаться с UART на практике, рассказывается в главе 21. Кроме UART, почти все МК AVR содержат самый простой из всех последователь­ных портов - SPI (Serial Peripheral Interface, последовательный периферий­ный интерфейс). О принципе устройства SPI упоминалось в главе 16. Его принципиальная простота сыграла отчасти дурную роль: трудно встретить два устройства, где протоколы SPI полностью совпадают, обычно обмен по этому порту сопровождается теми или иными «наворотами». Следует отме­тить, что программирование AVR также осуществляется через SPI, однако в общем случае этот интерфейс и SPI для обмена данными - разные вещи, хотя в большинстве случаев выводы у них одни и те же.

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

Некоторые другие узлы МК семейства AVR (например, АЦП) мы рассмот­рим по ходу изложения конкретных схем - так будет нагляднее. Здесь же мы закончим затянувшееся знакомство с микроконтроллером и перейдем к вопросу о том, как его программировать.

Существует два основных типа микроконтроллеров 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 внешний подтягивающий резистор с рекомендуемым значением сопротивления от 4,7 до 10 кОм.

Для дополнительной защиты линии 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. Еще большую безопасность может обеспечить экранирующий контур на печатной плате вокруг кварцевого резонатора и конденсаторов.

Научимся искать информацию по разным моделям 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 на беспаечной макетной панели.