Подключение микроконтроллера. Ликбез. Подключение светодиодов к микроконтроллеру AVR Чтение PDF документов в Linux
Способы тактирования
Каноническим способом тактирования МК является подключение кварцевого резонатора к соответствующим выводам (рис. 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 микроконтроллеров, разберемся 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 на беспаечной макетной панели.
Микроконтроллеры Atmega8 являются самыми популярными представителями своего семейства. Во многом они этим обязаны, с одной стороны, простоте работы и понятной структуре, с другой - довольно широким функциональным возможностям. В статье будет рассмотрено программирование Atmega8 для начинающих.
Общая информация
Микроконтроллеры встречаются везде. Их можно найти в холодильниках, стиральных машинках, телефонах, заводских станках и большом количестве других технических устройств. Микроконтроллеры бывают как простыми, так и чрезвычайно сложными. Последние предлагают значительно больше возможностей и функционала. Но разбираться сразу в сложной технике не выйдет. Первоначально необходимо освоить что-то простое. И в качестве образца будет взят Atmega8. Программирование на нём не является сложным благодаря грамотной архитектуре и дружелюбному интерфейсу. К тому же он является обладателем достаточной производительности, чтобы использовать в большинстве Более того, они применяются даже в промышленности. В случае с Atmega8 программирование предусматривает знание таких языков как AVR (C/Assembler). С чего же начать? Освоение этой технологии возможно тремя путями. И каждый выбирает сам, с чего начать работу с Atmega8:
- Программирование через Arduino.
- Покупка готового устройства.
- Самостоятельная сборка микроконтроллера.
Нами будет рассмотрен первый и третий пункт.
Arduino
Это удобная платформа, выполненная в виде что подходит для быстрого создания различных устройств. В плате уже есть всё необходимое в виде самого микроконтроллера, его обвязки и программатора. Пойдя по этому пути, человек получит следующие преимущества:
- Низкий порог требований. Не нужно обладать специальными навыками и умениями для разработки технических устройств.
- Широкий спектр элементов будет доступен для подключения без дополнительной подготовки.
- Быстрое начало разработки. С Arduino можно сразу переходить к созданию устройств.
- Наличие большого количества учебных материалов и примеров реализаций различных конструкций.
Но есть и определённые минусы. Так, Arduino программирование Atmega8 не позволяет глубже окунуться в мир микроконтроллера и разобраться во многих полезных аспектах. Кроме этого, придётся изучить язык программирования, что отличается от применяемых AVR (C/Assembler). И ещё: Arduino имеет довольно узкую линейку моделей. Поэтому рано или поздно возникнет необходимость использовать микроконтроллер, что не используется в платах. А в целом это неплохой вариант работы с Atmega8. Программирование через Arduino позволит получить уверенный старт в мире электроники. И у человека вряд ли опустятся руки из-за неудач и проблем.
Самостоятельная сборка
Благодаря дружелюбности конструкции их можно сделать самими. Ведь для этого нужны дешевые, доступные и простые комплектующие. Это позволит хорошо изучить устройство микроконтроллера Atmega8, программирование которого после сборки будет казаться более лёгким. Также при необходимости можно самостоятельно подобрать иные комплектующие под конкретную задачу. Правда, здесь есть и определённый минус - сложность. Самостоятельно собрать микроконтроллер, когда нет нужных знаний и навыков, нелегко. Этот вариант мы и рассмотрим.
Что же нужно для сборки?
Первоначально необходимо заполучить сам Atmega8. Программирование микроконтроллера без него самого, знаете ли, невозможно. Он обойдётся в несколько сотен рублей - обеспечивая при этом достойный функционал. Также стоит вопрос о том, как будет осуществляться программирование Atmega8. USBAsp - это довольно хорошее устройство, что себя зарекомендовало с лучшей стороны. Но можно использовать и какой-то другой программатор. Или же собрать его самостоятельно. Но в таком случае существует риск, что при некачественном создании он превратит микроконтроллер в неработающий кусочек пластика и железа. Также не помешает наличие макетной платы и перемычек. Они не обязательны, но позволят сэкономить нервы и время. И напоследок - нужен источник питания на 5В.
Программирование Atmega8 для начинающих на примере
Давайте рассмотрим, как в общих чертах осуществляется создание какого-то устройства. Итак, допустим, что у нас есть микроконтроллер, светодиод, резистор, программатор, соединительные провода, и источник питания. Первый шаг - это написание прошивки. Под нею понимают набор команд для микроконтроллера, что представлен в качестве конечного файла, имеющего специальный формат. В нём необходимо прописать подключение всех элементов, а также взаимодействие с ними. После этого можно приступать к сборке схемы. На ножку VCC следует подать питание. К любой другой, предназначенной для работы с устройствами и элементами,подключается сначала резистор, а потом светодиод. При этом мощность первого зависит от потребностей в питании второго. Можно ориентироваться по такой формуле: R=(Up-Ups)/Is. Здесь p - это питание, а s - светодиод. Давайте представим, что у нас есть светодиод, потребляющий 2В и требующий ток питания на уровне 10 мА, переводим в более удобный для математических операций вид и получаем 0.01А. Тогда формула будет выглядеть следующим образом: R=(5В-2В)/0.01А=3В/0.01А=300 Ом. Но на практике часто оказывается невозможным подобрать идеальный элемент. Поэтому берётся наиболее подходящий. Но нужно использовать резистор с сопротивлением выше значения, полученного математическим путём. Благодаря такому подходу мы продлим срок его службы.
А что же дальше?
Итак, у нас есть небольшая схема. Теперь осталось подключить к микроконтроллеру программатор и записать в его память прошивку, что была создана. Здесь есть один момент! Выстраивая схему, необходимо её создавать таким образом, чтобы микроконтроллер можно было прошивать без распайки. Это позволит сберечь время, нервы и продлит срок службы элементов. В том числе и Atmega8. Внутрисхемное программирование, нужно отметить, требует знаний и умений. Но оно же позволяет создавать более совершенные конструкции. Ведь часто бывает, что во время распайки элементы повреждаются. После этого схема готова. Можно подавать напряжение.
Важные моменты
Хочется дать новичкам полезные советы про программирование Atmega8. Встроенные переменные и функции не менять! Прошивать устройство созданной программой желательно после её проверки на отсутствие «вечных циклов», что заблокируют любое иное вмешательство, и с использованием хорошего передатчика. В случае использования самоделки для этих целей следует быть морально готовым к выходу микроконтроллера из строя. Когда будете прошивать устройство с помощью программатора, то следует соединять соответствующие выходы VCC, GND, SCK, MOSI, RESET, MISO. И не нарушайте технику безопасности! Если техническими характеристиками предусмотрено, что должно быть питание в 5В, то нужно придерживаться именно такого напряжения. Даже использование элементов на 6В может негативно сказать на работоспособности микроконтроллера и сократить срок его службы. Конечно, батареи на 5В имеют определённые расхождения, но, как правило, там всё в разумных рамках. К примеру, максимальное напряжение будет держаться на уровне 5,3В.
Обучение и совершенствование навыков
На счастье, Atmega8 является очень популярным микроконтроллером. Поэтому найти единомышленников или же просто знающих и умеющих людей не составит труда. Если нет желания изобретать заново велосипед, а просто хочется решить определённую задачу, то можно поискать требуемую схему на просторах мировой сети. Кстати, небольшая подсказка: хотя в русскоязычном сегменте робототехника довольно популярна, но, если нет ответа, то следует его поискать в англоязычном - он содержит на порядок большее количество информации. Если есть определённые сомнения в качестве имеющихся рекомендаций, то можно поискать книги, где рассматривается Atmega8. Благо, компания-производитель берёт во внимание популярность своих разработок и снабжает их специализированной литературой, где опытные люди рассказывают, что и как, а также приводят примеры работы устройства.
Сложно ли начать создавать что-то своё?
Достаточно иметь 500-2000 рублей и несколько свободных вечеров. Этого времени с лихвой хватит, чтобы ознакомиться с архитектурой Atmega8. После небольшой практики можно будет спокойно создавать свои собственные проекты, выполняющие определённые задачи. К примеру, роботизированную руку. Одного Atmega8 должно с лихвой хватить, чтобы передать основные моторные функции пальцев и кисти. Конечно, это довольно сложная задача, но вполне посильная. В последующем вообще можно будет создавать сложные вещи, для которых понадобятся десятки микроконтроллеров. Но это всё впереди, перед этим необходимо получить хорошую школу практики на чем-то простом.
Мы провели эмуляцию схемы в программе Proteus, помигали светодиодом и научились прошивать наш виртуальный микроконтроллер. Наверняка многим из читателей пришла в голову мысль: “А можно ли помигать светодиодом, использую кнопку, подключенную к МК?
Да, разумеется, это возможно. Реализуется довольно легко. Причем можно сэмулировать кнопку как с фиксацией так и без фиксации. Причем в программе Proteus применить оба типа кнопок можно с помощью одного и того же одинакового макроса кнопки. В каких случаях это может быть полезно? Например, нам требуется осуществить выбор режимов работы устройства. Давайте разберем подробнее, как это реализовать с помощью микроконтроллера, и проведем эмуляцию в программе Proteus.
Для того, чтобы иметь наглядное представление, что у нас действительно выбор из двух режимов, мы соберем простенькую схемку на 4 светодиодах с управлением одной кнопкой. При первом варианте у нас поочередно загораются с первого по четвертый светодиоды. При втором варианте то же самое, но в обратной последовательнос ти, то есть с четвертого по первый. Единственное, что хочу уточнить, кнопка у нас опрашивается на нажатие или отжатие только перед началом эффекта. До тех пор, пока эффект не закончит свою работу, программа не реагирует на нажатие или отжатие кнопки.
Итак к делу. Так выглядит у нас наша схема в программе Proteus (кликните для увеличения):
В этой схеме мы уже видим отличия от той, которую собирали еще в прошлой статье. В левой части схемы мы видим обозначения кнопки и источника питания +5 вольт.
Как мы уже разобрали, питание и землю мы берем во вкладке “Терминал”. Обозначаются они у нас соответственно Power и Ground.
Обозначается у нас питание схемы треугольником с чертой, делящей его по высоте. Рядом, на рисунке, изображено обозначение кнопки. Справа от кнопки мы видим закрашенный красный круг с двухнаправленной стрелочкой. Если во время эмуляции нажать на него, то кнопка у нас зафиксируется и будет постоянно нажата. После повторного нажатия на него фиксация снимается.
Перед использованием нам нужно выбрать кнопку в библиотеке аналогично остальным деталям. Для этого нужно набрать в поле “Маска” слово “but”. Затем в поле “Результаты” слово “BUTTON”:
После этого кнопка появиться у нас в списке, вместе с выбранными деталями, применяемыми в проекте.
Какие порты у нас используются в проекте. Ниже на рисунке мы видим отходящие линии от портов РA0, РВ0, РВ1, РВ2 и РВ3. К порту В у нас подключены светодиоды, а к порту А – кнопка.
Итак, при нажатии, мы замыкаем цепь соединяющую +5 вольт с портом РА0 и верхним выводом резистора. Для чего у нас здесь вообще установлен резистор? Дело в том, что цепь кнопки должна быть замкнутой. После того как мы установили резистор, ток у нас течет от плюса питания через кнопку, резистор и дальше на землю.
Номинал резистора достаточно взять равным 200 Ом. Итак, когда мы нажимаем кнопку, мы соединяем порт РА0 с +5 вольт питания, и если мы опросим ножку РА0 на наличие напряжения или его отсутствие, мы сможем влиять на выполнение нашей программы.
Скрины с текстом нашей программы я привел ниже:
Итак отличия от прошлого проекта заключаются в том, что все 8 выводов порта РА мы конфигурируем на вход, выводы порта РВ0 – РВ3 мы конфигурируем на выход, а РВ4 – РВ7 на вход.
Затем мы используем в нашей программе проверку условия “ if”
Итак, мы видим в строчке после “if”, в скобках, условие выполнения. Код ниже выполняется, если на порту PA0 у нас присутствует логический ноль, или ноль вольт. Этот текст в скобках – сдвиг бита порта. Мы разберем в одной из следующих статей, а пока достаточно принять на веру, что этим мы опрашиваем кнопку на отжатие . Затем в фигурных скобках идет текст программы, который выполняется, если условие верно. Если условие не верно, программа продолжает выполняться дальше, пропустив текст в фигурных скобках.
Аналогично, с помощью условия “if” мы опрашиваем кнопку на нажатие . Обратите внимание, текст у нас в скобках изменился. Это означает что если на ножке РА0 у нас логическая единица, мы выполняем условие, то есть текст в фигурных скобках. То есть другими словами, у нас при отжатой кнопке, поочередно загораются и тухнут светодиоды с первого по четвертый, а при нажатии и удерживании, загораются и тухнут с четвертого по первый. Таким образом, мы можем влиять на выполнение программы, с помощью нажатия кнопки, опрашивая наличие на ней логического нуля, или логической единицы
Также , в котором находятся файл “сишник”, HEX и файл Протеуса.
А вот и видео