The words you are searching are inside this book. To get more targeted content, please make full-text search by clicking here.

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

Discover the best professional documents and content resources in AnyFlip Document Base.
Search
Published by BHV.RU Publishing House, 2021-01-15 15:21:28

Занимательная электроника, 6-е изд.

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

Keywords: Arduino,схемотехника

602 Часть IV. Микроконтроллеры

По умолчанию все контроллеры AVR всегда начинают выполнение программы
с адреса $00001. Если в программе не используются прерывания, то с этого адреса
может начинаться прикладная программа. В противном случае по этому адресу
располагается так называемая таблица векторов прерываний, подробнее о которой
мы будем говорить в разд. «Применение прерываний» далее.

Память данных (ОЗУ, SRAM)

В отличие от памяти программ, адресное пространство памяти данных адресуется
побайтно (а не пословно). Адресация полностью линейная, без какого-либо деления
на страницы, сегменты или банки, как это принято в ряде других систем. Исключая
некоторые младшие модели Tiny, объем встроенной SRAM колеблется от 128 бай-
тов (например, у ATtiny2313) до 4–8 Кбайт у старших моделей Mega.

Адресное пространство статической памяти данных (SRAM) условно делится на
несколько областей, показанных на рис. 22.1. К собственно встроенной SRAM от-
носится лишь затемненная часть, до нее по порядку адресов расположено адресное
пространство регистров, где первые 32 байта занимает массив регистров общего
назначения (РОН), еще 64 — регистров ввода/вывода (РВВ).

Для некоторых моделей Mega (ATmega8515, ATmega162, ATmega128, ATmega2560
и др.) предусмотрена возможность подключения внешней памяти объемом до
64 Кбайт. Отметим, что адресные пространства РОН и РВВ не отнимают простран-
ство у ОЗУ данных, — так, если в конкретной модели МК имеется 512 байтов
SRAM, а пространство регистров занимает первые 96 байтов (до адреса $5F), то ад-
реса SRAM займут адресное пространство от $0060 до $025F (т. е. от 96 до 607 ячей-
ки включительно). Конец встроенной памяти данных обозначается константой
RAMEND. Следует учесть, что последние адреса SRAM как минимум на четыре-шесть
ячеек от конца (в зависимости от количества вложенных вызовов процедур — для
надежности лучше принять это число равным десяти или даже более) занимать
данными не следует, т. к. они при использовании подпрограмм и прерываний заня-
ты под стек.

Операции чтения/записи в память одинаково работают с любыми адресами из дос-
тупного пространства, и потому при работе с памятью SRAM нужно быть внима-
тельным, — вместо записи в память вы легко можете «попасть» в какой-нибудь
регистр. Для обращения к РОН как к ячейкам памяти, можно в качестве адреса под-
ставлять номер регистра, а вот при обращении к РВВ таким же способом к номеру
последнего нужно прибавлять $20. Следует также помнить, что по умолчанию при
включении питания все РВВ устанавливаются в нулевое состояние во всех
битах (единичные исключения все же имеются, поэтому в критичных случаях надо
смотреть документацию), а вот РОН и ячейки SRAM могут принимать произволь-
ные значения.

1 Напомним, что в ассемблере AVR можно обозначать шестнадцатеричные числа в «паскалевском»
стиле, предваряя их знаком $, при этом стиль языка С (0x00) тоже действителен, а вот интеловский
способ (00h) не работает (подробнее об обозначениях чисел различных систем счисления говорилось
в главе 14).

Глава 22. Персональный компьютер вместо паяльника 603

Рис. 22.1. Адресное
пространство статической

памяти данных (SRAM)
микроконтроллеров AVR

Энергонезависимая память данных (EEPROM)

Все модели МК AVR (кроме снятого с производства ATtiny11) имеют встроенную
EEPROM для хранения констант и данных при отключении питания. В разных мо-
делях объем ее варьируется от 64 байтов (ATtiny1х) до 4 Кбайт (старшие модели
Mega). Число циклов перепрограммирования EEPROM может достигать 100 тысяч.

Напомним, что EEPROM отличается от flash-памяти возможностью выборочного
программирования побайтно (вообще-то, даже побитно, но эта возможность скрыта
от пользователя). Чтение из EEPROM осуществляется с такой же скоростью, как и
чтение из РОН, — в течение одного машинного цикла (правда, на практике оно
растягивается на 4 цикла, но программисту следить за этим специально не требует-
ся). А вот запись в EEPROM протекает значительно медленнее, и к тому же с неоп-
ределенной скоростью, — цикл записи одного байта может занимать от 2 до 4
и более миллисекунд. Процесс записи регулируется встроенным RC-генератором,
частота которого нестабильна (при низком напряжении питания можно ожидать,
что время записи будет больше). За такое время при обычных тактовых частотах
МК успевает выполнить несколько тысяч команд, поэтому программирование про-

604 Часть IV. Микроконтроллеры

цедуры записи требует аккуратности — например, нужно следить, чтобы в момент
записи не «вклинилось» прерывание (подробнее об этом далее).

Главная же сложность при использовании EEPROM — то, что при недостаточно
быстром снижении напряжения питания в момент выключения содержимое ее мо-
жет быть испорчено. Обусловлено это тем, что при снижении напряжения питания
ниже некоторого порога (ниже порога стабильной работы, но недостаточного для
полного выключения) и вследствие дребезга МК начинает выполнять произволь-
ные команды, в том числе может выполнить и процедуру записи в EEPROM, если
она имеется в программе. Если учесть, что типовая команда МК AVR выполняется
за десятые доли микросекунды, то ясно, что никакой реальный источник питания
не может обеспечить снижение напряжения до нуля за нужное время. По опыту
автора при питании МК семейства Classic от обычного стабилизатора типа LM7805
с рекомендованными значениями емкости конденсаторов на входе и на выходе со-
держимое EEPROM будет испорчено примерно в половине случаев. В более совре-
менных моделях ситуация несколько лучше, но от порчи EEPROM вы и там не за-
страхованы.

Этой проблемы не должно существовать, если запись констант в EEPROM произ-
водится при программировании МК, а процедура записи в программе отсутствует.
Во всех же остальных случаях (а их, очевидно, абсолютное большинство —
EEPROM чаще всего используется для хранения пользовательских установок и те-
кущей конфигурации при выключении питания) приходится принимать специаль-
ные меры. Встроенный детектор падения напряжения (Brown-Out Detection, BOD),
имеющийся практически во всех моделях Tiny и Mega, с этим справляется, но тоже
не полностью. Наиболее кардинальной из таких мер является установка внешнего
монитора питания, удерживающего МК при снижении напряжения питания ниже
пороговой величины в состоянии сброса (подробности см. [20]).

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

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

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

Глава 22. Персональный компьютер вместо паяльника 605

аб в

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

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

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

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

Наконец, можно обойтись вообще без каких-либо внешних компонентов — исполь-
зовать встроенный RC-генератор, который может работать на четырех частотах,
приблизительно равных 1, 2, 4 и 8 МГц. К этой возможности наиболее целесооб-
разно обратиться в младших моделях Tiny, выпускающихся в 8-контактном корпу-
се, — тогда выводы, предназначенные для подключения резонатора или внешнего
генератора, можно задействовать для других целей, как обычные порты вво-
да/вывода. Но и в семействе Mega пренебрегать этой возможностью не следует —
при отключенном кварце упрощается схема подключения, на сниженных частотах
резко падает потребление. Стоит запомнить только, что нельзя использовать неста-
бильный источник тактирования в случае, когда требуются временны´ е функции:
с RC-генератором, например, будет плохо работать UART, для которого придется
снижать частоту обмена до 1200 бит/с и менее. Заметим, что семейство Classic
встроенного RC-генератора не имело.

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

606 Часть IV. Микроконтроллеры

ячейки CKSEL (табл. 22.1). Рекомендуемое значение этих ячеек для обычных резона-
торов от 1 МГц и более: все единицы в ячейках CKSEL, и ноль в CKPOT.

ПОДРОБНОСТИ
При установке ячеек следует учитывать, что состояние CKSEL = 0000 (зеркальное по
отношению к наиболее часто употребляемому значению для кварцевого резонатора
1111) переводит МК в режим тактирования от внешнего генератора, и в этом состоя-
нии его нельзя даже запрограммировать без подачи внешней частоты. Также если вы
попытаетесь установить режим с низкочастотным резонатором, то от высокочастотно-
го МК уже не запустится, а далеко не все программаторы могут работать при таких
низких частотах тактирования. Поэтому при манипуляциях с ячейками, и не только
CKSEL, нужно быть крайне осторожным и хорошо представлять, что именно вы уста-
навливаете.

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

CKSEL3...0 CKPOT Источник тактирования Частота
0000 1 Внешняя частота 0... 16 МГц
0001 1 Встроенный RC-генератор
0010 1 Встроенный RC-генератор 1 МГц
0011 1 Встроенный RC-генератор 2 МГц
0100 1 Встроенный RC-генератор 4 МГц
0101 х Внешняя RC-цепочка 8 МГц
0110 х Внешняя RC-цепочка < 0,9 МГц
0111 х Внешняя RC-цепочка 0,9–3,0 МГц
1000 х Внешняя RC-цепочка 3,0–8,0 МГц
1001 х Низкочастотный резонатор 8,0–12 МГц
101х 1 Керамический резонатор 32 768 кГц
110x 1 Керамический резонатор 0,4–0,9 МГц
111x 1 Кварцевый резонатор 0,9–3,0 МГц
1ххх 0 Кварцевый резонатор 3,0–8,0 МГц
≥1,0 МГц

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

Как мы уже говорили, портов ввода/вывода (повторим, что их не следует путать ни
с регистрами ввода/вывода, ни с последовательными портами МК для обмена ин-
формацией с внешними устройствами) в разных моделях может быть от 1 до 7. Но-
минально порты 8-разрядные, в некоторых случаях разрядность ограничена числом
выводов корпуса и может быть меньше восьми. Порты обозначаются буквами A, B,
C, D и т. д., причем необязательно по порядку, — в младших моделях могут нали-
чествовать, например, только порты B и D (как в ATtiny2313) или вообще только
один порт B (как в ATtiny1х).

Глава 22. Персональный компьютер вместо паяльника 607

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

Типичным примером многообразия функций портов может служить базовый для
Arduino ATmega168/328. В нем три порта (В, С и D), но все восемь линий доступны
только для порта D, порты B и C — лишь частично, так что программисту доступ-
ны максимум 20 цифровых линий. Шесть из них могут быть также использованы
как аналоговые входы встроенного АЦП (на платах Arduino помечены буквой A),
а некоторая часть остальных также задействована под различные альтернативные
функции (последовательные порты, прерывания), применяемые по мере надоб-
ности.

Выводы портов в достаточной степени автономны, и их режим может устанавли-
ваться независимо друг от друга. По умолчанию при включении питания все до-
полнительные устройства отключены, а порты работают на вход, причем находятся
в третьем состоянии с высоким импедансом (т. е. с высоким входным сопротивле-
нием). Работа на выход требует специального указания, для чего в программе нуж-
но установить соответствующий нужному выводу бит в регистре направления дан-
ных (этот регистр обозначается DDRх, где х — буква, обозначающая конкретный
порт, например для порта А это будет DDRA). Если бит сброшен (т. е. равен логиче-
скому нулю), то вывод работает на вход (как по умолчанию), если установлен (т. е.
равен логической единице) — то на выход. В Arduino эту установку выполняет
функция pinMode(<номер вывода>, INPUT) или pinMode(<номер вывода>, OUTPUT).

Для установки выхода в состояние единицы нужно отдельно установить соответст-
вующий бит в регистре данных порта (обозначается PORTх), а для установки в 0 —
сбросить этот бит. В Arduino эту установку выполняет функция digitalWrite(<номер
вывода>,HIGH) или digitalWrite(<номер вывода>,LOW). Направление работы вывода
(вход/выход, регистр DDRх) и его состояние (0–1, PORTх) путать не следует.

Регистр данных PORTх фактически есть просто выходной буфер — все, что в него
записывается, тут же оказывается на выходе. Но если установить вывод порта на
вход (т. е. записать в регистр направления DDRх логический ноль), как это сделано
по умолчанию, то регистр данных PORTх будет играть несколько иную роль — уста-
новка его разрядов в ноль означает, что вход находится в третьем состоянии с вы-
соким сопротивлением, а установка в единицу подключит к выводу «подтягиваю-
щий» (pull-up) резистор сопротивлением 20–50 кОм (в семействе Classic оно

608 Часть IV. Микроконтроллеры

составляло 35–120 кОм). В Arduino это состояние устанавливается функцией
pinMode(<номер вывода>, INPUT_PULLUP).

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

Процедура чтения уровня на выводе порта, если он находится в состоянии работы
на вход, не совсем тривиальна. Возникает искушение прочесть данные из регистра
данных PORTх, но это ничего не даст — вы прочтете только то, что там записано ва-
ми же ранее. А для чтения того, что действительно имеется на входе (непосредст-
венно на выводе микросхемы), предусмотрена другая возможность. Для этого нуж-
но обратиться к некоторому битовому массиву, который обозначается PINх. Обра-
щение осуществляется так же, как и к отдельным битам обычных РВВ (подробнее
см. [20]), но PINх не есть регистр — это просто некий диапазон адресов, чтение по
которым предоставляет доступ к информации из буферных элементов на входе
порта. В Arduino эта операция выполняется функцией digitalRead(). Записывать
что-либо по адресам PINx, естественно, нельзя.

Прерывания

Напомним, что в МК все прерывания — аппаратные и делятся на внутренние и
внешние. Любое прерывание отдельно, а также вообще возможность их возникно-
вения требуют предварительного специального разрешения.

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

ПОДРОБНОСТИ
Заметим, что в Arduino прерывания по умолчанию разрешены, так как с момента за-
грузки начинает работать системный таймер, а также часто оказывается включен-
ным последовательный порт Serial, — а они работают по прерываниям. В Arduino
есть две возможности общего выключения/включения прерываний: это пара функций
noInterrupts()/interrupts(), а также низкоуровневые cli()/sei(). В ассемблере
эти команды записываются как просто cli и sei (что можно расшифровать как clear
interupts/set interrupts). В «голом» AVR-контроллере прерывания по умолчанию запре-
щены, потому для использования прерываний в ассемблере команда sei обязательно
должна стоять где-то в начале программы.

Глава 22. Персональный компьютер вместо паяльника 609

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

Внешних прерываний у МК AVR как минимум два: INT0 и INT1 (у большинства
Mega есть еще третье — INT2, а у основы Arduino Mega, контроллера ATmega2560,
их целых семь). Кроме основных внешних прерываний, в ряде моделей (включая и
применяющиеся в Arduino ATmega328/2560) есть еще внешние прерывания типа
PCINT, на которых мы здесь не будем останавливаться. Внешнее прерывание — со-
бытие, которое возникает при появлении сигнала на одном из входов, специально
предназначенных для этого. Различаются три вида событий, вызывающих преры-
вание, и их можно устанавливать в программе: это может быть низкий уровень на-
пряжения, а также положительный или отрицательный фронт на соответствующем
выводе. Любопытно, что прерывания по всем этим событиям выполняются, даже
если соответствующий вывод порта сконфигурирован на выход.

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

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

ПОДРОБНОСТИ
У внимательного читателя возникает законный вопрос: а зачем вообще нужен режим
внешнего прерывания по уровню? Дело в том, что оно во всех моделях выполняется
асинхронно — в тот момент, когда низкий уровень появился на выводе МК. Конечно,
обнаружение прерывания может произойти только по окончании текущей команды, так

610 Часть IV. Микроконтроллеры

что очень короткие импульсы могут и пропасть. Но прерывания INT0 и INT1 в режиме
управления по фронту у большинства моделей определяются наоборот, только син-
хронно — в момент перепада уровней тактового сигнала контроллера, поэтому дли-
тельность импульса не должна быть короче одного периода тактового сигнала. Одна-
ко это не самое главное — по большому счету разницы в этих режимах никакой бы не
было, если бы не то обстоятельство, что синхронный режим требует непременно на-
личия этого самого тактового сигнала. Потому асинхронное внешнее прерывание, со-
ответственно, может «разбудить» контроллер, находящийся в одном из режимов глу-
бокого энергосбережения, когда тактовый генератор не работает, а синхронное — нет.
И старые МК, вроде AT90S8515 семейства Classic (но не его mega-аналога!), могли
выводиться из глубокого «сна» только внешним прерыванием по уровню, которое не
всегда удобно использовать. У большинства же моделей семейства Mega (из млад-
ших моделей — кроме ATmega8 и, кстати, «ардуиновских» 168/328) имеется еще одно
прерывание INT2, которое происходит только по фронтам (по уровню не может), но, в
отличие от INT0 и INT1, асинхронно. В ATtiny2313 (но не в его «классическом» анало-
ге!) подобное асинхронное прерывание может также происходить по сигналу с любого
из 8 выводов порта B и носит наименование PCINT. Прерывания типа PCINT (подробнее
о них см. [20]) имеются во многих моделях, более поздних, чем Mega8. Это значитель-
но повышает удобство пользования контроллером в режиме энергосбережения.

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

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

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

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

Это довольно сильные ограничения, поэтому, например, использовать МК в каче-
стве универсального частотомера не очень удобно — быстродействующие схемы

Глава 22. Персональный компьютер вместо паяльника 611

лучше проектировать на соответствующей комбинационной логике или на ПЛИС
(программируемых логических интегральных схемах).

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

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

Как мы уже знаем, многие счетчики-таймеры (но не все и не во всех моделях)
могут работать в так называемых режимах PWM, т. е. в качестве 8-, 9-, 10- или
16-битных широтно-импульсных модуляторов (ШИМ), причем независимо друг от
друга, что позволяет реализовать многоканальный ШИМ. В технической докумен-
тации режимам PWM, в силу их сложности, многовариантности и громоздкости,
посвящено много страниц. В главе 21 мы рассматривали применение этого режима
в Arduino, где реализован простейший вариант, а в конце этой главы (см. разд.
«Мощный инвертор на микроконтроллере») рассмотрим его реализацию на ас-
семблере, что гораздо сложнее, зато предоставляет несравненно более высокие
возможности.

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

Железо

Раз уж мы начали главу с потребного «железа», то закончим эту тему, а потом
перейдем к собственно программированию. Программатор, о котором идет речь,
называется ISP-программатором (In System Programming, т. е. программирование

612 Часть IV. Микроконтроллеры

осуществляется прямо в устройстве пользователя). Программатор можно соорудить
и самостоятельно на основе любого AVR-контроллера — на сайте Atmel есть реко-
мендованная схема, но она уже очень устарела. Это не проблема, т. к. в Интернете
можно найти множество предложений самодельных программаторов такого рода
(ибо интерфейс программирования AVR не составляет секрета), но их функцио-
нальность, надежность и удобство пользования часто оставляют желать лучшего1.
Учтите, что ISP-программатор, особенно совместимый с официальным протоколом
Atmel (т. е. со средами программирования для AVR, включая и Arduino), предпола-
гает в своей основе контроллер с программой загрузки (bootloader), т. е. для его из-
готовления, в свою очередь, тоже нужен хоть какой-нибудь программатор (см. так-
же описание проблемы и рекомендации в статье «Программаторы для AVR-микро-
контроллеров» на сайте ph0en1x.net2).

Чтобы со всем этим не возиться и не разгребать проблемы, связанные с самодея-
тельными конструкциями, стоит сразу купить фирменный программатор, хотя он
может быть и дороже. Прежде чем покупать программатор, следует внимательно
разобраться, с каким именно софтом он работает, потому что это определяет ком-
фортность его использования, — есть, например, программаторы, ориентированные
на программу AVRReal, которая не имеет графического интерфейса и запускается
из командной строки. Неплохой программатор под названием AVR-ISP500, совмес-
тимый с официальным протоколом, продается в «Чипе и Дипе» — он довольно до-
рогой, но зато «умеет» исправлять ошибки в установке fuse-битов (см. далее).
Очень удобные программаторы — и тоже не очень дешевые — выпускает фирма
Argussoft (AS-2/3/4), в настоящее время можно приобрести версию AS2M, рабо-
тающую через COM-порт и AS3E/AS4E, работающие через USB.

Для того чтобы работать с ISP-программатором, естественно, его надо куда-то под-
ключить. Для этого на программируемой плате специально устанавливают про-
граммирующий разъем. ISP-программаторы используют один и тот же тип разъе-
ма — игольчатый PLD (PL double, т. е. двухрядный), который хорошо знаком всем,
кто когда-нибудь подсоединял жесткий диск с IDE-интерфейсом к материнской
плате. Естественно, для ISP-программаторов требуется гораздо меньше контактов,
чем для жесткого диска. Минимальное их количество равно 6 (именно столько их
у программатора, рекомендуемого самой фирмой Atmel, такой же разъем преду-
смотрен на всех платах Arduino) — это выводы SPI-интерфейса программирования:
MOSI, MISO и SLK, а также Reset и два вывода питания +5 В и «земля» (ISP-
программаторы обычно питаются от программируемой схемы).

Указанные выводы SPI-интерфейса присоединяются к одноименным выводам кри-
сталла, которые есть у всех МК AVR, имеющих возможность SPI-программиро-
вания. У программаторов Argussoft традиционно 10-контактный разъем для ISP-
программирования, но комплект для изготовления адаптера к обычному 6-кон-
тактному разъему прилагается к программатору (вот его, кстати, совсем нетрудно

1 Конструкции различных самодельных программаторов можно найти, например, на сайте
http://avr.ru/ready/tools/prog.
2 См. https://ph0en1x.net/73-avr-microcontroller-programmers-usbasp-isp-com-lpt.html.

Глава 22. Персональный компьютер вместо паяльника 613

соорудить самостоятельно). Есть и другие программаторы, использующие этот вид
ISP-разъема. Нумерация контактов того и другого разъема приведена на рис. 22.3,
серыми линиями там показаны соединения для создания переходника от одного
вида разъема к другому.

Рис. 22.3. Нумерация контактов разъемов для ISP-программирования:
слева — стандартный 6-контактный; справа — 10-контактный

ПОДРОБНОСТИ
На 10-контактном ISP-разъеме имеется вывод 3, который в обычном режиме никуда
не подключается. Но некоторые программаторы (например, упомянутый AVR-ISP500)
имеют возможность управлять через этот вывод тактовой частотой микроконтроллера,
если его подключить к выводу Xtal1 внешней частоты (см. разд. «Способы тактиро-
вания» ранее). Это позволяет не зависеть от установленного режима тактирования,
в том числе исправить неверно установленный режим с помощью fuse-битов (см. да-
лее). Некоторые подробности о разъемах типа PLD и IDC приведены в разд. «Макет-
ные платы» главы 3.

Вопрос, который при этом немедленно возникает: не жирно ли занимать как мини-
мум три вывода портов альтернативными функциями? Отвечаю: в большинстве
случаев такие выводы можно использовать как обычные порты, программатору это
не помешает. Единственная ситуация, в которой возникает конфликт между про-
грамматором и схемой, это если выводы MOSI, MISO и SLK задействованы как
входные линии и подсоединены к активным выходам других микросхем, к коллек-
тору открытого транзистора или к конденсатору большой емкости. Поэтому в схе-
ме эти контакты лучше использовать в качестве выходных линий, а если хватает
других портов — вообще оставить их только для программирования. На платах
Arduino, где контакты штатного SPI-порта совпадают с портом программирования,
они выведены как обычные линии (выводы D11, D12 и D13), и в случае их исполь-
зования для программирования к ним тоже не рекомендуется подключать низкоом-
ную нагрузку. Естественно, при работе схемы программатор лучше отключать во-
все, только учтите, что по окончании цикла программирования в любом случае
схема заработает сразу с начала, как после включения питания.

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

614 Часть IV. Микроконтроллеры

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

Софт

Если мы имеем какой-то программатор с прилагающимся к нему софтом, то,
в сущности, нам нужна еще только одна специальная программа — ассемблер
(assembler значит «сборщик»). Его можно бесплатно скачать с сайта Atmel в соста-
ве AVR Studio (папка avrassembler), файл носит название avrasm2.exe. Практически
все существующие ассемблеры запускаются из командной строки (хотя могут быть
и упакованы в оболочку с графическим интерфейсом). В качестве параметров для
компилятора Avrasm2 указывается имя файла с исходным текстом программы и
имена выходных файлов, главным из которых является файл с расширением .hex.
Чтобы каждый раз не вводить длинную командную строку, пишется соответст-
вующий BAT-файл.

ПОДРОБНОСТИ
Предположим, у вас файл avrasm2.exe находится в созданной вами папке c:\avrtools. За-
пустите Блокнот и введите следующий текст (соответственно измените путь, если пап-
ка другая):

c:\avrtools\avrasm2 -fI %1.asm

Строка эта может выглядеть и несколько иначе:
c:\avrtools\avrasm2 –e %1.eep -fI %1.asm

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

Сохраните созданный файл под названием, например, avrasm.bat. Пусть текст соз-
данной вами программы находится в файле programm.asm, тогда достаточно в ко-
мандной строке запустить avrasm.bat с параметром programm (если надо, то с путем
к нему, а расширение добавится автоматически), и в той же папке, где находится по-
следний, создастся файл programm.hex. При этом откроется DOS-окно, в котором бу-
дут проанализированы ошибки, если они есть (тогда выходной файл не создастся),
а если все в порядке — указан объем полученной программы в двухбайтных словах
(учтите, что размер HEX-файла ни о чем не говорит).

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

Глава 22. Персональный компьютер вместо паяльника 615

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

Исходные тексты ассемблерных программ можно создавать в любом текстовом ре-
дакторе (разве что к результатам деятельности Microsoft Word следует относиться
с осторожностью). Но, несмотря на широкий выбор, есть по крайней мере две при-
чины, по которым лучше все же использовать редакторы специализированные.
Первая причина — это так называемый highlighting, или подсветка синтаксиса. Те,
кто пользовался любыми средами высокоуровневого программирования (от Turbo
Pascal до Visual Studio или хотя бы просто Delphi), хорошо знают, что это такое, —
служебные слова, комментарии, разные типы выражений выделяются каждый сво-
им цветом или шрифтом, что сильно облегчает чтение текста и служит заодно не-
плохим средством проверки правильности написания. Но если эту опцию предлага-
ет множество фирменных и не очень редакторов, то вторая желательная функция
есть лишь у считаных единиц. Я имею в виду возможность прямо из редактора
с помощью горячих клавиш запускать процесс ассемблирования. В этом случае вы
можете «не отходя от кассы», т. е. не покидая редактор, одним нажатием горячих
клавиш сразу же ассемблировать написанный текст и ознакомиться с сообщениями
об ошибках.

Еще одна причина для использования специализированных редакторов — они ав-
томатически нумеруют строки. Причем пустые строки также входят в нумера-
цию — так проще считать. Если у вас есть ошибки в программе, то ассемблер ука-
жет номер строки с ошибкой, так что нумерация строк принципиально важна. Один
из рекомендуемых вариантов редакторов для AVR-ассемблера — «самопальный»
редактор ASM Editor (не путать с Asmedit!), который сделан на удивление профес-
сионально, хотя и не без некоторых досадных огрехов, особенно сказывающихся
при его запуске в современных версиях Windows.

Все сказанное относится к программированию на языке ассемблера, потому что
программы для AVR-контроллеров, кроме общеизвестных С и C++, а также осно-
ванном на них языке Arduino, можно писать и на многих других, включая даже
специальные версии Pascal (mikroPascal for AVR1). Почему-то весьма популярен
Bascom AVR, использующий Basic-подобный язык2. (Уж на что я не люблю
С-подобные языки, и к тому же немало в свое время соорудил программ на самых

1 Информацию о mikroPascal for AVR можно найти по ссылке: http://we.easyelectronics.ru/AVR
/mikropascal-for-avr-osobennosti-yazyka.html. Белградская компания MikroElektronika за вполне вме-
няемые деньги (порядка 150–200 долларов) предлагает среды программирования для разных типов
микроконтроллеров на разных языках. Среди них и есть и реализация microPascal для AVR:
http://www.mikroe.com/mikropascal/avr/. Есть короткий курс по этой среде и на русском языке:
http://cxem.net/mc/mc261.php. Отметим, что mikroPascal — не единственная реализация Pascal для
контроллеров Atmel AVR, подробнее об этом см. по адресу: http://en.wikibooks.org/wiki/Embedded_
Systems/Atmel_AVR#Pascal.

2 См. http://decada.org.ru/project/lessons/bascom_avr/.

616 Часть IV. Микроконтроллеры

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

Для тех, кто уже владеет программированием на языках высокого уровня, их при-
менение может показаться более удобным способом, и это действительно так во
многих случаях. Только следует четко понимать, что, как и в «большом» програм-
мировании, каждый язык и даже каждая среда программирования — это своя от-
дельная экосистема. И применительно к AVR хорошо развиты только две из них, во
многом совместимые, потому что ориентированы на близкородственные языки на
основе С: это профессиональная среда, группирующаяся вокруг AVR Studio (под-
держивающей несколько разных компиляторов с языка C), и любительская Arduino,
также основанная на языке С/С++, поэтому пройти мимо языка С вы не сможете.

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

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

Все, что сказано в этой главе далее, относится только к программированию МК
AVR «в чистом виде», т. е. на ассемблере без дополнительных инструментов-
посредников.

О конфигурационных битах

Эта напасть свалилась на нас с появлением семейств Tiny и Mega, в «классических»
AVR ничего такого не было (точнее, было, но специально заботиться об установке
этих битов не требовалось). В англоязычной инструкции конфигурационные биты

Глава 22. Персональный компьютер вместо паяльника 617

называют fuse-bits. Их появление привело к многочисленным проклятиям на голову
фирмы Atmel со стороны армии любителей, которые стали один за другим «запа-
рывать» кристаллы при программировании. Положение усугублялось тем, что
в описании этих сущностей используется извращенная логика, — как мы знаем,
ячейки любой чистой EEPROM (по принципу ее устройства) содержат единицы, и
слово «запрограммированный» по отношению к такой ячейке означает, что в нее
записали логический ноль. Термины запрограммированный и незапрограммирован-
ный как раз и применяются в фирменных описаниях AVR, и оттуда перекочевали
в ряд самодельных программаторов — готовьтесь к тому, что в некоторых про-
грамматорах отмеченный галочкой в меню программы бит означает его равенство
логической единице, а в других — «запрограммированное» состояние, т. е. логиче-
ский ноль. Поэтому разработчики программаторов AS из фирмы Argussoft даже
специально предусмотрели в окне программирования конфигурационных ячеек па-
мятку на этот счет (рис. 22.4).

Рис. 22.4. Окно типового состояния конфигурационных ячеек
в нормальном режиме работы ATmega8535

В этом окне сейчас приведено безопасное рабочее состояние конфигурационных
ячеек для ATmega8535, причем выпуклая кнопка означает единичное состояние
ячейки, а нажатая — нулевое (и не путайтесь с этим самым «запрограммирован-
ным» состоянием!). Для разных моделей набор fuse-битов различный, но означают
они одно и то же, потому мы рассмотрим типовое их состояние на этом примере.
Перед первым программированием нового кристалла просто один раз установите
эти ячейки в нужное состояние, дальше их уже менять не потребуется. Излишне

Литература и источники

1. Элементарный учебник физики, тома II, III. / под ред. Г. С. Ландсберга. —
М.: Наука, 1971.

2. Физические величины: справочник. / под ред. И. С. Григорьева,
Е. З. Мейлихова. — М.: Энергоатомиздат, 1991.

3. Ан Пей. Сопряжение ПК с внешними устройствами. Пер. с англ. —
М.: ДМК Пресс, 2003.

4. Титце У., Шенк К. Полупроводниковая схемотехника: Справочное
руководство. — М.: Мир, 1982 (широко доступна в Интернете в формате Djvu).

5. Хоровиц П., Хилл У. Искусство схемотехники, в 3 т. Пер. с англ. — М.: Мир,
изд. 1983, 2001, 2003.

6. Крылов Г. Пример расчета усилителя мощности
(http://geokrilov.com/design.html).

7. Крылов Г. Схемотехника транзисторных усилителей мощности
(http://geokrilov.com/powersch.html).

8. Крылов Г. Мой взгляд на субъективизм (http://geokrilov.com/notes.html).
9. Ежков Ю. С. Справочник по схемотехнике усилителей.— 2-е изд. —

М.: РадиоСофт, 2002. — 272 с.
10. Куликов Г. В. Бытовая аудиотехника (устройство и регулировка). —

М.: ПрофОбрИздат, 2001.
11. Гутников В. С. Интегральная электроника в измерительных устройствах. —

2-е изд. — Л.: Энергоатомиздат. Ленингр. отд., 1988.
12. Гнеденко Б. В., Хинчин А. Я. Элементарное введение в теорию

вероятностей. — М.: Едиториал УРСС, 2003.
13. Вентцель Е. С. Теория вероятностей. — 7-е изд., стереотипное. —

М.: Высшая школа, 2001.
14. Вентцель Е. С., Овчаров Л. А. Теория вероятностей и ее инженерные

приложения. — 2-е изд. — М.: Высшая школа, 2000.

Литература и источники 681

15. Горелова Г. В., Кацко И. А. Теория вероятностей и математическая статистика
в примерах и задачах с применением Excel. Учебное пособие для вузов. —
2-е изд., исп. и доп. — «Феникс», 2005.

16. Петцольд Ч. Код. — М.: ИТД «Русская редакция», 2001.

17. Андреева Е., Фалина И. Информатика. Системы счисления и компьютерная
арифметика. // серия: Информатика — М.: Лаборатория Базовых Знаний, 1999.

18. Шило В. Л. Популярные цифровые микросхемы: Справочник. — М.:
Радио и связь, 1987, 1988, 1989.

19. Евстифеев А. В. Микроконтроллеры AVR семейств Tiny и Mega фирмы
ATMEL. — М.: Издательский дом «Додэка-XXI», 2008.

20. Ревич Ю. В. Программирование микроконтроллеров AVR: от Arduino к ассемб-
леру. — Издательство "БХВ", 2020 — 448 с.

21. Зубарев А. А. Ассемблер для микроконтроллеров AVR: Учебное пособие. —
Омск: Изд-во СибАДИ, 2007. — 112 с.
(http://bek.sibadi.org/fulltext/ED1519.pdf).

22. Шилдт Г. Полный справочник по С. — 4-е изд. — М.: Вильямс, 2004.
(http://cpp.com.ru/shildt_spr_po_c/index.html, раздел
по элементарным операциям: http://cpp.com.ru/shildt_spr_po_c/02/0210.html).

23. Соммер У. Программирование микроконтроллерных плат Arduino/Freeduino. —
СПб: БХВ-Петербург, 2012. — 256 с.

24. Монк С. Программируем Arduino. Профессиональная работа со скетчами. —
СПб.: Питер, 2017. — 272 с.

25. Ревич Ю. О книге Саймона Монка «Программируем Arduino. Профессиональ-
ная работа со скетчами». Портал Geektimes (https://geektimes.ru/post/285780/).

26. Ревич Ю. Азбука электроники. Изучаем Arduino. — М.: Изд-во АСТ: Кладезь,
2017. — 224 с.

27. Ревич Ю. Станция для измерения скорости и направления ветра.
Портал Geektimes (https://geektimes.ru/post/289835/).

28. Брюс Трамп. Диапазоны входных и выходных рабочих напряжений ОУ.
Что нужно знать о входах rail-to-rail. (Перевод: Вячеслав Гавриков) —
Портал Terraelectronica (https://www.terraelectronica.ru/news/5858).

29. Справочник по AVR-ассемблеру (русский язык).
(http://s-engineer.ru/DOWNOLOAD/Asm_AVR_rus.pdf)

30. Официальный справочник по AVR-ассемблеру (английский язык). (Онлайновая
версия: https://www.microchip.com/webdoc/avrassembler/index.html;
PDF-версия: http://ww1.microchip.com/downloads/en/DeviceDoc/40001917A.pdf).

31. 8-bit AVR Instruction Set Manual (английский язык). (Онлайновая версия:
https://www.microchip.com/webdoc/avrassembler/avrassembler.wb_instruction
_list.html; PDF-версия: http://ww1.microchip.com/downloads/en/devicedoc/
atmel-0856-avr-instruction-set-manual.pdf).

Предметный указатель

A I

Alkaline 179, 180, 658 I2C См. TWI
Arduino 465, 466–472, 595
◊ матричные индикаторы 523 P
◊ программирование 477, 484
◊ среда программирования 472 PWM 461, 569, 611, 643
◊ ШИМ 571
ASM Editor 615 R
AVR
◊ прерывание 461 RAM 453
◊ процедуры деления 638 ROM 450
◊ процедуры умножения 637 RS-232 484
◊ семейства 600 RTC 512, 540

B S

BOD 604, 618 SD-карта 577
SRAM 596, 602
C
T
CMOS См. Микросхема:КМОП
TTL См. Микросхема:ТТЛ
E TWI 501

EEPROM 456, 591, 603 U
EPROM 454
UART 462, 484
F
W
Flash-память 456, 596
Fuse-биты 616 Watchdog 562

Предметный указатель 683

А Демонтаж 64
Децибел 87
Аккумулятор 77, 183, 659 Диод 113
Алгебра Буля 317 ◊ вольтамперная характеристика 114
АЛУ 443 ◊ германиевый 114
Ампер 23 ◊ защитный 246
Амперметр 29, 35 ◊ кремниевый 114
Амплитуда 78 ◊ характеристики 115
Анод 114 ◊ Шоттки 114
Антидребезг 364, 384, 392 Дисперсия 308
Аппроксимация 310 Дисплей 514
Ассемблер 599, 614 ◊ I2C-интерфейс 549
АЦП 414 ◊ LCD 530
◊ двойного интегрирования 425 ◊ OLED 535
◊ интегрирующие 416 ◊ графический 544
◊ однократного интегрирования 416 ◊ жидкокристаллический 534
◊ параллельного действия 414 ◊ кириллица 533, 538
◊ последовательного приближения 415 ◊ строчный 535–40
◊ с двойным интегрированием 419 ◊ текстовый режим 533
◊ с уравновешиванием заряда 424 ◊ цифровой 515
Доверительная вероятность 309
Б Доверительный интервал 309
Дрейф 304
База 116 Дроссель 236
Бит 329, 333
Бокорезы 50 Е

В Елочная гирлянда 627
Емкость
Ватт 81 ◊ определение 98
Величина: переменная 78 ◊ распределенная 101
Вольт 23
Вольтметр 29, 36 З
Выпрямитель: двухполупериодный 192
Заземление 218, 236
Г Закон
◊ Джоуля — Ленца 81
Гальванический элемент 77 ◊ Мэрфи 47
Генератор 33 ◊ Ома 24
◊ аналоговый 272 ◊ трансформатора 189
◊ кварцевый 377 Заряд 23
◊ прямоугольных импульсов 369 «Земля» 218
◊ релаксационный 227 ЗУПВ 453
◊ цифровой лабораторный 402
Герц 78 И
Гистерезис 282
ИК-пульт 588
Д Импульс: управляющий 225
Индикаторы
Датчик ◊ жидкокристаллические 154
◊ атмосферного давления 508 ◊ семисегментные 153
◊ ветра 509 Индуктивность 110, 236
◊ дождя 509 Интегратор 271
◊ температуры 278, 280, 291, 301, 431, 519 Источник
◊ температуры и влажности 504 ◊ тока 30, 271
◊ трехпроводная схема включения 431 ◊ напряжения 30

684 Предметный указатель

Источник (прод.) Л
◊ питания 38, 187
Лейденская банка 97
бестрансформаторный 187, 221 Литиевый элемент 180
вторичный 187 Логика 315
двуполярный 194, 196 Логические
импульсный 211 ◊ микросхемы 347, 355
нестабилизированный 191 ◊ переменные 317, 318
простейший 191 ◊ схемы на транзисторах 324
регулируемый 199 Логическое
стабилизированный 194 ◊ отрицание 317
трансформаторный 187 ◊ сложение 317
◊ умножение 317
К
М
Калибровка 511
Каскад: дифференциальный 127 Магнитопровод 190
Катод 114 Математическая статистика 303
Кварц 376 Математическое ожидание 308
Класс точности 312 Меандр 85
Колебания Метеостанция 499
◊ амплитуда 78 Метод: наименьших квадратов 311
◊ суммирование 80 Мигалка
Коллектор 116 ◊ на Arduino 495
Компаратор 278, 285 ◊ на таймере 631
Комплементарный 135 ◊ простейшая 625
Конденсатор 97 Микроконтроллер 442, 458
◊ в цепи переменного тока 106 ◊ прерывания 628
◊ емкость 97 ◊ программирование 600
◊ заряд и разряд 98 ◊ таймеры-счетчики 631
◊ неполярный 103 Микропроцессор 442
◊ номинальные значения 91 Микросхема
◊ параллельное и последовательное соединение ◊ КМОП 347, 350
◊ корпуса 247
106 ◊ с открытым коллектором (истоком) 357
◊ развязывающий 167, 218 ◊ ТТЛ 347, 348
◊ фильтрующий 192, 195 ◊ цифровая 347
◊ электролитический 102 Микросхемы 239
Конденсаторы: номинальные значения 657 ◊ защита от статики 245
Конфигурационные биты 616 ◊ схемотехника 243
Корпус ◊ эксплуатация 245
◊ изготовление в домашних условиях 67 Монтаж 63
◊ нанесение надписей 68 Мост
Коэффициент ◊ выпрямительный 192, 230, 232
◊ диэлектрической проницаемости 101 ◊ Уитстона 296
◊ мощности 112 Мощность 81
◊ ослабления синфазного сигнала (КООС) 88 ◊ звукового усилителя 167
◊ передачи 166 ◊ регулирование 224, 227
◊ передачи в системе с обратной связью 261 ◊ резисторов номинальная 92
◊ сопротивления температурный, ТКС 27 ◊ управление 224
◊ температурный резисторов 92 Мультивибратор 372
◊ удельного сопротивления 27 Мультиметр 34
◊ усиления 165 Мультиплексор 367
◊ усиления ОУ 261

Предметный указатель 685

Н Погрешность 304
◊ абсолютная 312
Напряжение 23, 24 ◊ относительная 312
◊ действующее значение 83, 225 ◊ относительная приведенная 312
◊ измерение 225 Полупроводники 113
◊ несинусоидальное 83 Помехи 235
◊ определение 23 Порт ввода/вывода 606
◊ переменное 78 Постоянная времени
◊ постоянное 78 ◊ RC цепи 100
◊ прямое падение 114 ◊ тепловая 277
◊ сетевое 44, 86, 187, 221 Правила де Моргана 319
◊ синусоидальное 79 Преобразование
◊ среднеамплитудное значение 83 ◊ напряжения в ток 94
◊ среднее значение 83 ◊ тока в напряжение 94
◊ фазное 219 Преобразователь
◊ эммитерного перехода 116 ◊ аналого-цифровой, АЦП 414
Нормальное распределение вероятностей 307 ◊ дельта-сигма 424
◊ характеристики 308 ◊ инвертор 436
◊ напряжение-время 423
О ◊ цифроаналоговый, ЦАП 410
Прерывание 461
Обратная связь 165, 256 ◊ Reset 630
◊ отрицательная 124, 199, 256, 260 ◊ таймера 1 631
◊ отрицательная, принцип действия 257 Прерывания 608, 628
◊ положительная 258, 282 ◊ внешние 609
Одновибратор 382 ◊ внутренние 609
Олигархи 33 Провода 65
Ом 26 ◊ обмоточные 66
Оптопара 148, 227 Программатор 611
Оптрон 148, 230 Программирование 600, 619
◊ диодный 230 Программная задержка 624
Осокин Ю. В. 240
Осциллограф 41 Р
Отсчет 407
Оцифровка 407 Радиатор 252
Ошибки измерения Радиаторы 204
◊ систематические 305 ◊ методика расчета 204
◊ случайные 305 ◊ монтаж 206
◊ случайные, оценка 305 Разбаланс 112
Разводка питания 217
П Разработка схем 70
◊ раскладка печатных плат 70, 74
Память Разрешающая способность 304
◊ данных (SRAM) 602 РВВ (регистр ввода/вывода) 602
◊ программ 601 Регистр 395
Паяльник 51 ◊ защелка 395
Перерегулирование 277 ◊ последовательный 395
Период 78 ◊ сдвиговый 396
◊ измерение 579 Регрессия 310
ПЗУ 450 ◊ уравнение 311
Пинцет 50 Резистор 27, 89
Пироэлектрический датчик 585 ◊ допустимое напряжение 92
Питание сетевое 86 ◊ маркировка 90
Платы печатные 61 ◊ МЛТ 90
Плотность вероятностей 306 ◊ мощность 92
◊ номинальные значения 90

686 Предметный указатель

Резистор (прод.) ◊ включения интегрального стабилизатора 198
◊ параллельное соединение 95 ◊ включения светодиода 152
◊ переменный 28, 94 ◊ включения тиристора 223
◊ подстроечный 94 ◊ выделения фронтов 381
◊ последовательное соединение 95 ◊ генератора аналогового 272
◊ прецизионный 92 ◊ генератора релаксационного 370
◊ С1-4 90 ◊ генератора цифрового 403
◊ самодельный 37 ◊ двоичного полусумматора 362
Резисторы 656 ◊ двуполярного нестабилизированного
◊ номинальные значения 657
Реле 139, 222 источника 194
◊ герконовые 140 ◊ дешифратора семисегментного 450
◊ напряжение срабатывания 143 ◊ дифференциального каскада 127
◊ с самоблокировкой 144 ◊ дифференциального усилителя 267
◊ ток срабатывания 144 ◊ задержки импульса 382
◊ электромагнитное 139 ◊ защиты входа микрофонного усилителя 146
◊ электронные 149, 227, 281 ◊ защиты выводов микросхем 246
РОН (регистр общего назначения) 602 ◊ звонка 144
◊ звуковой сигнализации 374
С ◊ идеального источника тока 271
◊ измерения сопротивления 297
Светодиод 147, 150 ◊ измерения тока 37
◊ особенности включения 152 ◊ инвертирующего усилителя с высоким
◊ падение напряжение 153
Сигнал 85 коэффициентом усиления 265
Симистор 224, 232 ◊ инвертора напряжения 436
Синхронизация: луча осциллографа 43 ◊ интегратора 271
Система счисления 326 ◊ исключающее ИЛИ 361
◊ двоичная 329 ◊ кварцевого генератора 377
◊ перевод 330 ◊ компаратора с гистерезисом 282
◊ позиционная 327 ◊ лабораторного источника питания 199
◊ шестнадцатеричная 329 ◊ логическая диодно-транзисторная 324
Скважность 85 ◊ логическая на выключателях 320
СОМ-порт 484 ◊ логическая на реле 321
Сопротивление 24 ◊ микропроцессора 444
◊ внутреннее 30 ◊ мостика Уитстона 296
◊ определение 26 ◊ мультивибратора 372
◊ реактивное 107, 110 ◊ мультивибратора с управлением 373
◊ резисторов 91 ◊ одновибратора 383
◊ удельное 27 ◊ плавного включения ламп 234
Среднеквадратическое отклонение 309 ◊ повторителя 262
Стабилизатор 194 ◊ повторителя/инвертора 271
◊ интегральный 197 ◊ подключения переменного резистора 94
Стабилитрон 145 ◊ портов ввода/вывода 447
◊ вольтамперная характеристика 146 ◊ предустановки счетчика 401
◊ двусторонний 146 ◊ проверка закона Ома 24
Сумматор 359 ◊ простейшего источника питания 191
◊ аналоговый 269 ◊ разводки питания 217
◊ двоичный 359 ◊ расщепителя напряжения 435
◊ одноразрядный 362 ◊ реле с самоблокировкой 144
◊ полный 362 ◊ ручного регулятора мощности 227, 231
Схема ◊ с общим коллектором 123
◊ антидребезга 364, 384, 392 ◊ с общим эмиттером 121
◊ АЦП с двойным интегрированием 420 ◊ сетевого фильтра 236
◊ АЦП с однократным интегрированием 416 ◊ системы с отрицательной обратной связью
◊ АЦП типа 424
260
◊ стабилизатора двуполярного 196

Предметный указатель 687

◊ стабилизатора на стабилитроне 194 ◊ ртутный 295
◊ стабилизатора на транзисторе 195 ◊ сопротивления 294
◊ стабилизатора параметрического 195 ◊ цифровой 425, 430
◊ структурная термостата 274
◊ сумматора аналогового 269 калибровка 434
◊ сумматора двоичного 362 ◊ электронный 300, 410
◊ счетчика асинхронного 396 Терморегулятор 278, 284
◊ счетчика реверсивного 399 Термостат 274
◊ счетчика синхронного 398 ◊ на Arduino 488
◊ терморегулятора 278 Тестер 34
◊ термостата для нагревания воды 284 Тетрада 332
◊ термостата на Arduino 489 Тиристор 222
◊ токового зеркала 244 Ток 23, 24
◊ транзистора в ключевом режиме 118 ◊ зависимость от напряжения (закон Ома) 24
◊ транзистора Дарлингтона 120 ◊ измерение 35
◊ транзисторного УМЗЧ 164 ◊ измерение вольтметром 37
◊ триггера RS 391 ◊ определение 23
◊ триггера динамического типа D 394 Токовое зеркало 244
◊ триггера статического типа D 394 Точность 304
◊ триггера счетного 395 Транзистор 115, 135
◊ УМЗЧ на микросхемах 250, 252, 253 ◊ MOSFET 129, 214, 572, 574, 650
◊ управления реле 144 ◊ биполярный 115
◊ усилительного каскада 124 ◊ включение с общим коллектором 123
◊ усилителя инвертирующего 263 ◊ включение с общим эмиттером 119
◊ усилителя неинвертирующего 262 ◊ Дарлингтона 118, 120
◊ фазового компаратора 366 ◊ дифференциальное включение 127
◊ фильтра высоких частот 108 ◊ ключевой режим 117, 118
◊ фильтра низких частот 109 ◊ комплементарный 135, 168
◊ формирователя 380 ◊ коэффициент усиления по току 118, 121
◊ ЦАП 411, 413 ◊ критерии выбора 133, 135
◊ цепи с двумя резисторами 28 ◊ маломощный 135
◊ цепочки R—2R 413 ◊ мощность 134
◊ электромагнитного реле 140 ◊ мощный 136
◊ электронного термометра 300, 431 ◊ полевой 128
◊ элемента КМОП 348 ◊ полевой с p-n переходом 128
◊ элемента ТТЛ 348 ◊ типа n-p-n 116
◊ эмиттерного повторителя 123 ◊ типа p-n-p 116
Счетчик 396 ◊ усилительный режим 121
◊ двоичный 398 ◊ характеристики 134
◊ реверсивный 399 Трансформатор 179, 188, 192
◊ импульсный 232
Т ◊ определение количества витков 190
◊ расчет 189
Таймеры-счетчики 461, 610 Трансформаторы 81
Тактирование 604 Триак 224, 232
Температура 290 Триггер 381, 390
Теорема Котельникова 408 ◊ динамический типа D 394
Теория вероятностей 303 ◊ статический типа D 393
Термистор 490 ◊ счетный 395
Термометр ◊ типа RS 390
◊ медный 294, 431 Трубка: кембриковая термоусадочная 67
◊ металлический 291
◊ платиновый 294 У
◊ полупроводниковый 294
УМЗЧ 164, 250
◊ маломощный 253

688 Предметный указатель

Усилитель 172 Ч
◊ дифференциальный 267
◊ звуковой 163 Частота
◊ звуковой на микросхемах 249 ◊ измерение 579
◊ инвертирующий 263 ◊ определение 78
◊ инструментальный 268 Чип 239
◊ мощность 167, 170, 176
◊ неинвертирующий 262 Ш
◊ операционный 199, 204
ШИМ 569, 643
использование 255
определение 255 Щ
◊ переменного тока 126
◊ режим АВ 170 Щелочной элемент 180, 658

Ф Э

Фаза 79, 225 Электронно-лучевая трубка 42
Фарада 98 Электрохимический элемент 77, 179, 658
Фильтр Электроэнергия 86
◊ высоких частот 108 Элемент
◊ нижних частот 109 ◊ литиевый 180
◊ развязывающий 219, 236 ◊ солевой 182
Флюс ◊ щелочной 180
◊ активный 54 Эмиттер 116
◊ спирто-канифольный 53 Эмиттерный повторитель 123, 165, 166
Энергобережение 561, 566
Ц ЭСЛ 347

ЦАП 410
Цепь
◊ дифференцирующая 108
◊ интегрирующая 109
Цифровой звук 409


Click to View FlipBook Version