Атмега от внутреннего генератора

Про Ардуино и не только

Arduino ATmega328P тактирование от внутреннего RC-генератора

Что нужно знать о тактировании AVR микроконтроллеров

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

Настройка микроконтроллера на работу с тем или иным источником тактового сигнала осуществляется установкой конфигурационных битов (фьюзов) при помощи программатора. Применительно к нашей ситуации установка фьюзов происходит при выполнении команды «Записать загрузчик» из меню IDE Ардуино, значения фьюзов берутся из файла boards.txt. Он же отвечает за добавление новых пунктов в меню Инструменты. Поэтому доработка IDE Ардуино для добавления в нее меню выбора частоты начинается с редактирования файла boards.txt

Редактирование файла boards.txt

Перейдите в каталог Arduino_dirhardwarearduinoavr, где Arduino_dir — это каталог, в который установлена среда разработки Ардуино. У меня этот путь выглядит так: d:Arduinoarduino-1.6.12hardwarearduinoavr. Перед внесением изменений в файл boards.txt я рекомендую сделать его резервную копию. Теперь открываем файл boards.txt в текстовом редакторе (подойдет notepad++ или другой, поддерживающий кодировку UTF-8, чтобы не было проблем с отображением русских букв в IDE Ардуино) и добавляем в него строку menu.clock=Тактирование

Редактирование boards.txt Ардуино

Затем находим секцию для Ардуино Уно (я опишу порядок действий применительно к Ардуино Уно, но таким же образом можно скорректировать секции других плат с поправкой на микроконтроллер):

Редактирование boards.txt Ардуино

  1. скорость загрузки — uno.upload.speed;
  2. значения фьюзов — uno.bootloader.low_fuses, .high_fuses, .extended_fuses;
  3. имя файла загрузчика — uno.bootloader.file;
  4. частоту микроконтроллера — uno.build.f_cpu.

uno.menu.clock.external16=Внешний резонатор 16МГц
uno.menu.clock.external16.upload.speed=115200
uno.menu.clock.external16.bootloader.low_fuses=0xFF
uno.menu.clock.external16.bootloader.high_fuses=0xDE
uno.menu.clock.external16.bootloader.extended_fuses=0xFF
uno.menu.clock.external16.bootloader.file=optiboot/optiboot_atmega328.hex
uno.menu.clock.external16.build.f_cpu=16000000L

uno.menu.clock.internal8=Внутренний RC-генератор 8МГц
uno.menu.clock.internal8.upload.speed=57600
uno.menu.clock.internal8.bootloader.low_fuses=0xE2
uno.menu.clock.internal8.bootloader.high_fuses=0xDE
uno.menu.clock.internal8.bootloader.extended_fuses=0xFF
uno.menu.clock.internal8.bootloader.file=optiboot/optiboot_atmega328_8.hex
uno.menu.clock.internal8.build.f_cpu=8000000L

uno.menu.clock.internal1=Внутренний RC-генератор 1МГц
uno.menu.clock.internal1.upload.speed=4800
uno.menu.clock.internal1.bootloader.low_fuses=0x62
uno.menu.clock.internal1.bootloader.high_fuses=0xDE
uno.menu.clock.internal1.bootloader.extended_fuses=0xFF
uno.menu.clock.internal1.bootloader.file=optiboot/optiboot_atmega328_1.hex
uno.menu.clock.internal1.build.f_cpu=1000000L

Для наглядности я приведу скриншот моего файла boards.txt, каким он был и каким стал после выполнения описанных изменений:

Редактирование boards.txt Ардуино

Таким образом мы описали меню из трех пунктов, для каждого из них указали скорость загрузки скетчей, значения фьюзов, имя файла загрузчика (об этом чуть позже) и частоту микроконтроллера. При помощи онлайн калькулятора вы можете расшифровать приведенные значения фьюзов и увидеть, как происходит выбор источника тактирования. И что для получения тактовой частоты 1МГц при работе от внутреннего RC-генератора используется деление частоты на 8 (фьюз CKDIV8).

Сохраните файл в кодировке UTF-8 без BOM и запустите IDE. Если все сделано правильно, то при выборе платы Arduino Uno вам станет доступно меню Инструменты->Тактирование. Но этих изменений пока еще мало. Если сейчас выбрать в меню, например, Внутренний RC-генератор 8МГц и выполнить запись загрузчика, то новые значения фьюзов, конечно, запишутся в микроконтроллер и он начнет работать с внутренним RC-генератором. Но мы потеряем возможность загружать в Ардуино новые скетчи, потому что записанный в нее загрузчик рассчитан на частоту 16МГц. Выход — скомпилировать загрузчик для работы на частотах 8МГц и 1МГц. Если у вас нет желания заморачиваться с компиляцией загрузчика, то можете скачать уже скомпилированные файлы отсюда, поместить их в каталог Arduino_dirhardwarearduinoavrbootloadersoptiboot и перейти к пункту Изменение частоты и источника тактирования Ардуино. А кому интересно могут скомпилировать их самостоятельно. О том как это сделать описано далее.

Что такое Optiboot

Optiboot — это загрузчик для AVR микроконтроллеров, созданный Питером Найтом (Peter Knight). В его основу легли труды нескольких разработчиков и групп (Jason P. Kyle, Arduino group, Spiff , AVR-Libc group, Ladyada), впоследствии он значительно развился. Загрузчик получился настолько удачным, что компания-разработчик Ардуино стала использовать его в своей плате Ардуино Уно. С недавнего времени Optiboot является официальным загрузчиком и для других плат на базе ATmega328p (Нано, Мини). По сравнению с использовавшимся в них старым загрузчиком Optiboot обладает рядом преимуществ:

Как тактировать AVR

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

Как нам говорит учебник физики, частота — это количество колебаний, произведенных за определенный промежуток времени. Чаще всего этот промежуток времени называют периодом и для удобства измерений его берут равным одной секунде.

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

Как тактировать AVR

и даже круги на воде от камушка, который мы кинули в воду:

Как тактировать AVR

Более подробно про частоту и период можно прочитать в статье Электрические сигналы и их виды.

Так, теперь ближе к делу. Что же такое тактовая частота?

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

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

В МК AVR тактовая частота в основном измеряется в МегаГерцах. Как помните, приставка «Мега» означает один миллион. Если у нашего МК тактовая частота 8 МегаГерц, то это означает, что он может выполнять 8 000 000 тактов в секунду, или, грубо говоря, около 8 000 000 различных операций в секунду ;-). Пусть вас не пугает это число, потому что ваши настольные компьютеры, телефоны и планшеты уже работают на частоте в несколько ГигаГерц. Гига — это уже миллиард! Например, если частота процессора вашего компа 2 ГГц, это означает, что он может произвести 2 миллиарда операций в секунду). Мало? Как оказалось на практике, уже стает мало)).

Вернемся к нашим баранам), а именно, к тактовой частоте. Допустим, мы имеем МК Tiny 2313, сконфигурированный на работу 8 МегаГерц и который может выполнять при этом 8 миллионов тактов в секунду. Каждая операция процессора состоит из тактов. А когда процессор выполняет нашу программу, записанную во Flash память, он тоже производит определенные операции которые указаны в программе. Граничная частота МК Tiny 2313, как говорит нам Datasheet, довольно высокая и составляет аж целых 20 МГц! Это довольно много по меркам МК

Как тактировать AVR

Правда, это только с применением внешнего кварцевого резонатора.

Кварцевый резонатор, называемый часто просто кварц, может выглядеть по-разному:

Как тактировать AVR

На схемах он обозначается так:

На кварце часто указана частота, на которой он работает. Ниже на фото мы видим кварц, который работает на частоте 8 МегаГерц (8.000MHz)

Как тактировать AVR

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

Есть один нюанс, любезно предоставленный нам производителями микроконтроллера. Если нам нужно, чтобы программа выполнялась медленнее в восемь раз, мы можем этого добиться даже не переписывая программу и не выставляя задержки по новой, то есть в 8 раз длиннее. Нам достаточно уменьшить частоту МК в восемь раз и программа будет для нас выполняться медленнее в восемь раз. Забегая вперед, скажу, что сделать это мы можем очень легко, выставив всего одну галочку при программировании фьюз-битов, в бите CKDIV 8. Также легко мы можем отменить все наши изменения.

Как тактировать AVR

Этот способ мы использовали при прошивке МК в прошлой статье.

Существуют 4 варианта, которые применяются для тактирования МК:

— тактирование от внутреннего RC-генератора

— тактирование от внешнего кварца

— тактирование от внешнего генератора

— тактирование от RC-цепочки

Тактирование от внутреннего RC-генератора

На тактирование от внутреннего RC генератора МК настроен сразу с завода и не требует внешних деталей. Это означает, что с помощью МК, питания +5 Вольт и одного светодиода с резистором, мы уже можем заставить наш МК работать и выполнять программу без всяких сложных настроек и дополнительных деталей, задав скорость программно, путем выставления задержки «Delay». Имейте ввиду, что встроенный RC-генератор может работать только на четырех частотах: 1, 2, 4 или 8 МегаГерц, поэтому если вам требуется какая-нибудь эксклюзивная частота, типа 1 638 000 Герц, то такой способ не прокатит.

Тактирование от внешнего кварца

Тактирование от внешнего кварца чуточку сложнее. Как же нам подключить внешний кварц? Для начала нам надо найти цоколевку МК, которую мы собираемся тактировать от внешнего кварца. Пусть в нашем примере это будет Тiny 2313. Чтобы подключить внешний кварц, достаточно найти ножки микросхемы с названием «XTAL1» и «XTAL2».

Как тактировать AVR

Потом подсоединить кварц вот по такой схеме:

Как тактировать AVR

Потом при прошивке надо правильно выставить фьюзы. О них мы с вами поговорим в следующих статьях.

На реальных платах можно увидеть примерно вот такие схемы расположения элементов с тактированием от кварца. Здесь изображен МК AVR в корпусе TQFP , конденсаторы в SMD исполнении, скорее всего в корпусе 0805, и кварц.

Как тактировать AVR

А здесь изображен МК в корпусе DIP , два керамических конденсатора, так называемые “желтые капельки”, и кварц.

Как тактировать AVR

Как видно на схеме подключения кварца к МК, номинал нужных нам конденсаторов должен составлять 15-22 пикофарада. Расшифровать номинал таких конденсаторов, можно с помощью этого рисунка:

Как тактировать AVR

Тактирование от внешнего генератора

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

Как тактировать AVR

Тактирование от RC-цепи

Тактирование от RC-цепочки осуществляется вот по такой схеме:

Как тактировать AVR

Здесь мы берем конденсатор емкостью не менее 22 пФ, а резистор от 10 Ом и до 100 КилоОм. По простой формуле можно с легкостью рассчитать частоту, на которой будет тактироваться наш МК:

R — сопротивление резистора, Ом.

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

Читайте также  Бензиновые генераторы в великом новгороде

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

Итак, как мы помним из предыдущей статьи, некоторые ножки имеют двойное назначение, и помимо того, что могут использоваться как порты ввода-вывода, также используются для обеспечения расширения функций МК. Действительно, если МК сконфигурирован для работы от внутреннего RC-генератора, вам достаточно подать на него питание +5 Вольт и землю, и микроконтроллер включится и начнет выполнять программу. Но если вы выпаяли микроконтроллер из какого-либо устройства и он должен был в нем тактироваться от кварца, или по ошибке выставляя биты конфигурации, вы выставили тактирование от кварца, МК перестанет у вас быть виден в программе оболочке, и не сможет выполнять программу, даже если вы подадите на него +5 Вольт и землю.

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

Arduino без Arduino: работаем с микроконтроллерами напрямую

Если вспомнить историю создания Arduino ( www.drive2.ru/b/2520138/ ), то Arduino стало популярно благодаря трем вещам, составляющим ее основу: Среды программирования Arduino IDE ( на самом деле это среда языка Processing), Языка программирования Wiring (На самом деле такого языка не существует — то что мы видим это самый обычный С, дополненный большим числом библиотек) и Плат Arduino.
Я уже писал ранее, что без каждой из этих трех составляющих можно обойтись и приводил пример того, как можно обойтись без знания С — www.drive2.ru/b/2729013/. Как отказаться от Arduino IDE написано здесь — www.visualmicro.com/page/…what_is_visual_micro.html, а сегодня я хотел бы написать о том, как отказаться от "плат Arduino".
Итак, что же собой представляет плата, получившая такой коммерческий успех?

Как можно увидеть на плате находятся микроконтроллер AtMega 168 или 328, микросхема питания — DA1, контроллер виртуального com порта — DD1 и кварц 16 МГц — Q1. В общем то на первый взгляд ничего лишнего, но это только на первый: Используемая микросхема питания позволяет питать плату от напряжения от 5 до 12В или кратковременно до 30В, т.е. для авто с его 14,5В не пригодна и нужно делать свой источник питания. Контроллер СОМ порта используется в основном только для заливки программ и не является обязательным (в плате Arduino Pro Micro и ей подобных он отсутствует). Кварц, несомненно, позволяет точно работать с временем, но если погрешность в несколько милисикунд для вас не критична, то можно вспомнить о том, что микроконтроллеры фирмы Atmel, к которым относится и Atmega168/328, содержат внутренний кварц и могут отсчитывать такты сами себе.
Так что же эта плата лишняя? В общем то да. В большинстве случаев без нее действительно можно обойтись и сейчас мы поговорим как.

Поддержка средой программирования
Находим где у вас установлена Arduino и открываем папочку hardware
По умолчанию это здесь — C:Program FilesArduinohardwarearduinoavr
В эту папку мы будем распаковывать архивы с библиотеками, которые будем качать отсюда:
1) Для микроконтроллеров
ATmega8, ATmega8A,
ATmega88, ATmega88A, ATmega88P, ATmega88PA, ATmega88PB
ATmega168, ATmega168A, ATmega168P, ATmega168PA, ATmega168PB
ATmega328, ATmega328P, ATmega328PB
ATmega48, ATmega48A, ATmega48P, ATmega48PA, ATmega48PB

качаем ATmega8 Series (8/48/88/168/328) отсюда — github.com/sleemanj/optib…ob/master/dists/README.md
См. отдельную статью О бедном AtMega замолвите слово
Данные библиотеки позволяют запустить МК на 3 частотах: 1MHz, 8MHz или 16MHz (Для работы требуется внешний кварц 16МГц).
Тут необходимо понимать, что внешний кварц увеличивает быстродействие и стабильность работы (1 миллисекунда выполнения программы всегда будет равняться 1 миллисекунде реального времени), но увеличивает, пусть и ненамного, стоимость конструкции и снижает надежность за счет большего числа деталей. Лично мое мнение, что для большинства конструкций, проектируемых для автомобиля, можно смело обойтись и встроенным кварцем. Для схем зажигания, тахометра можно использовать внешний кварц, подключенный по схеме ниже, но дешевле взять готовую платку типа Arduino Pro Micro.
Достаточно ценное замечание от alexfrance
Был печальный опыт при использовании внутреннего генератора МК тини2313. На морозе при -20 контроллеры зависали, глючили. Установка внешнего кварца помогла. Поскольку внутренний генератор представляет из себя RC цепь, то он очень термозависим

2) Микроконтроллеры Attiny13 (А)
Библиотеки и файлы для поддержки "Тинек" можно скачать по ссылочке выше, а можно взять версию от разработчика — sourceforge.net/projects/ard-core13/files/
Скачанный файл также кладем в папку hardware

3) Для микроконтроллеров
ATtiny84, ATtiny44, ATtiny24,
ATtiny85, ATtiny45, ATtiny25,
ATtiny2313, ATtiny4313

ссылка для скачивания -code.google.com/p/arduino-tiny/
После распаковки заходим в папку tiny и переименовываем файл C:Program FilesArduinohardwaretinyavrProspective Boards.txt в C:Program FilesArduinohardwaretinyavrBoards.txt

После всех скачиваний и распаковок получим папку hardware с таким содержимым

А запустив Arduino IDE увидим:

Подключение микроконтроллера
Прошить программы в МК можно 2 различными способами:
1) Классический вариант — прошивка при помощи программатора
Тут все просто: покупаем любой программатор из списка поддерживаемых

и вперед
Наиболее распространенным является USBasp, он производится активно китайцами, его несложно сделать и самому. В Украине могу порекомендовать производителя с таким наборчиком (увы, снят уже с производства, ребята делают только плату адаптора) — fix.org.ua/index.php/%D0%…%D1%80%D0%BE%D0%BC-detail

Прошивать им просто: проставил драйвера, вставил МК в нужный слот, выбрал программатор из списка (СОМ выбирать не нужно), указал микроконтроллер и его частоту и лей программу.
Вторым по популярности является USBtinyISP. В продаже я их не видел, а как его сделать самостоятельно подробно рассказано здесь — robocraft.ru/blog/2948.html
Профессиональные программаторы типа STK500 (Эх была у меня такая плата на предыдущей работе, классная вещь) явно не входят в рамки этой статьи. Поэтому идем дальше.

2) Прошивка при помощи заводской платы Arduino
Следует отметить, что далеко не все платы Arduino подходят для сего действия
Возьмите свою плату и проверьте перед тем как пытаться. Расположение выводов интерфейса SPI должно быть следующим:

Если совпадает, то все ок, если нет, то лучше найти другую плату
Итак, последовательность действий:
а) Готовим плату. Для этого подключаем плату Arduino к компу, выбираем пункт меню Файл->Образцы-> ArduinoISP

и "вгружаем" код на плату. Все мы превратили нашу плату в программатор.
б) Подключаем. Схема подключения простая: нужно подключить выводы интерфейса SPI платы к соответствующим им выводам интерфейса SPI микроконтроллера, а вывод Reset микроконтроллера к 10 пину платы (или 53 для плат на основе mega1280 и 2560). На схеме ниже пример подключения Attiny13 (Attiny85 и Attiny45 аналогично, остальные МК смотрим распиновку) к плате на основе микроконтроллера Atmega 168/328

У меня получилось как то так:

Заливаем загрузчик. А нужно ли?
Итак сначало определимся что такое загрузчик и зачем это нужно.
Установка загрузчика дает возможность напрямую, через последовательный порт прошивать микроконтроллер (только имеющие аппаратный последовательный порт).Например так прошиваются пустые ATMEGA328P, которые потом можно использовать вместо установленной штатно микросхемы на Arduino UNO и устанавливать далее на самодельные платы.
Т.е. на ту же Attiny13 заливать загрузчик просто не имеет смысла — у нее нет аппаратного порта (выводов Тх, Dx), хотя некоторые "умельцы", пишущие обучающие статьи это делают (см UPD ниже). А вот для Atmega8 это можно сделать — она при этом потеряет 1кБайт из 8 своей памяти, но зато залить прошивку уже можно будет не через SPI, а подключив ее к адаптору СОМ порта (как это сделать рассказано здесь — www.drive2.ru/b/2642464/ на примере Arduino Pro Mini, смотрим раздел "Подключаемся").

UPD. Добавка написаная много познее</b>
С прошедшим временем понимаю, что на теме загрузчика стоит остановиться отдельно, заодно рассказать подробно, что такое фьюзы.
Но сейчас вкратце: В каждый микроконтроллер, помимо записи прошивки, необходимо записывать биты конфигурации — так называемые фьюзы и локбиты. С завода они идут записанные среднепотолочно и в реале скорее всего вам не подойдут — от этого и происходит неправильный расчет времени, например.
Но записью загрузчика можно обойти этот момент — как раз при записи загрузчика в микроконтроллере прописываются правильные фьюзы. Поэтому, даже если загрузчик не нужен, его можно прописать, чтобы прописались фьюзы, а потом при записи самой прошивки ("скетча") поставить галочку, что он не нужен и его можно удалить.

Если считаете, что вам это нужно, то устанавливаем микроконтроллер в программатор (подключаем к плате-программатору) и нажимаем "Записать загрузчик"

Прошивка программ
а) Пишем программу. Тут все как обычно, нужно только учесть, что для Attiny поддерживаются не все возможности "языка Arduino", а только
pinMode()
digitalWrite()
digitalRead()
analogRead()
analogReference(INTERNAL) / (EXTERNAL)
shiftOut()
pulseIn()
analogWrite()
millis()
micros()
delay()
delayMicroseconds()

б) Прошиваем.
Если мы используем плату Ардуино, то выбираем в качестве программатора "Arduino as ISP", в разделе "платы" наш микроконтроллер и частоту на которой он будет в дальнейшем работать, в разделе "порт" виртуальный СОМ нашей платы-программатора и нажимаем "вгрузить".
Вариант записи через программатор описан здесь — О бедном AtMega замолвите слово

в) проверяем работоспособность. Тут есть некоторые разногласия что делать с ногой RESET. Кто-то считает, что в процессе работы ее можно оставлять в воздухе, кто-то, что ее нужно подтянуть через резистор 10 кОм к питанию. Работает и так и так, тут больше вопрос религии :)

Осваиваем микроконтроллеры на примере Atmega8

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

В качестве подопытного предлагаю выбрать популярный и довольно высокопроизводительный 8-разрядный AVR микроконтроллер Atmega8 в удобном для наших целей 28-выводном DIP корпусе.

Итак, что нам нужно для полного счастья?

1. Простая и, в приоритете, бесплатная среда разработки, в которой можно посредством слов и цифр написать программу, а затем скомпилировать её, т. е. перевести на язык, понятный микроконтроллеру.
Одним из удачных примеров такой среды является Atmel Studio. Скачать эту программу не составит никакого труда, в том числе и на официальном сайте разработчика – https://www.microchip.com/.

Читайте также  Александр гратовски генератор возможностей введение в ноэтику

2. Отладочная плата для микроконтроллера, желательно с DIP28 панелькой для микросхемы.

Отладочная плата для микроконтроллера

Удачным вариантом такой платы я бы посчитал изделие под названием «плата разработки ATmega8 – сделай сам», предлагаемое нашими китайскими друзьями за символические 150 отечественных рублей.

В комплект поставки входят:
– собственно, сама плата;
– Панелька DIP28;
– Кварцевый резонатор на 8 МГц;
– Разъём для подключения программатора;
– Разные деталюшки в виде: конденсаторов, резисторов, кнопок, светодиодов, т. е. всего того, что позволит легко запрограммировать и проверить микропроцессор в работе.

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

3. Программатор AVR USB, для того чтобы запрограммировать микроконтроллер, то есть перенести в него информацию с компьютера.

Программатор AVR USB

Такой программатор оценивается на aliexpress примерно в ту же стоимость, что и предыдущее изделие.

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

Питание берётся от USB разъёма компьютера.
Работать программатор может под разными операционными системами, в том числе – под Windows.

Если тип приобретённого программатора не будет поддерживаться Atmel Studio, то придётся скачать и бесплатную программу прошивки микроконтроллеров, например, AVRDude.

4. Контактная макетная плата для монтажа без пайки.

Контактная макетная плата для монтажа без пайки

Такая макетная плата совместно с набором соединительных проводов (джамперов) будет весьма полезна на начальном этапе освоения микроконтроллера.

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

Подобный набор, состоящий из беспаечной макетной платы и комплекта проводов, обойдётся не дороже 200 рублей.

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

6. Если написать и отладить программу для микроконтроллера можно и без его непосредственного участия, то, по-любому, рано или поздно встанет конкретный вопрос: «А на фига мы всё это делали?».
Поэтому хочешь, не хочешь, а приобрести ATmega8 нам также всё ж таки придётся. Стоит она на Али, как и всё остальное, довольно-таки гуманных денег – около 100 рублей за единицу продукции, поэтому кошелёк опорожнит не сильно, но уважительного к себе отношения потребует.

А теперь давайте-ка посмотрим: А что это за штука ATMEGA8 попала к нам в руки?
Внешний вид и назначение выводов Atmega8Внешний вид и назначение выводов Atmega8
Рис.1 Внешний вид и назначение выводов Atmega8

У данного типа МК есть два типа питания – цифровое VCC (выв.7) и аналоговое AVCC (выв.20). В стандартном включении, когда на входы/выходы контроллера подаются логические 1 и 0, оба вывода питания соединяют (физически соединяются VCC и AVCC, поскольку GND выводы 8 и 22 уже замкнуты внутри ИМС через сопротивление 0,7 Ом). Однако при подключении нагрузки, эти земляные выводы необходимо замкнуть на плате, т. к. внутри они соединены тонким проводником, который при существенном токе не следует рассматривать как «перемычку».
Если используется встроенный АЦП, или входы/выходы задействованы для работы с аналоговыми сигналами, то для уменьшения помех производитель рекомендует использовать последовательный LC-фильтр по AVCC.
Между выводами питания и землёй (в непосредственной близости от выводов питания микросхемы) всегда следует устанавливать керамические конденсаторы ёмкостью 0,1 Мкф, которые обычно называют блокировочными конденсаторами.

Ещё один непомеченный цветом вывод (Рис.1) – 21 вывод (AREF).
AREF означает Analog Reference и является входом для подачи (при необходимости) опорного напряжения от внешнего источника питания.

Все раскрашенные выводы микроконтроллера (Рис.1) – это порты ввода-вывода, через которые микроконтроллер общается с внешним миром. У ATmega8 их три: PB0. PB7, PC0. PC6, PD0. PD7.
PB0. PB7 и PD0. PD7 – это полные, т. е. 8-разрядные порты, PC0. PC6 – неполный 7-разрядный порт, т. к. для полноты ему тупо не хватило лишнего вывода у микросхемы.

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

1. Порты PB0. РВ7. Два вывода (РВ6 и PB7) используются для подключения кварцевого резонатора. Выводы РВ2. РВ5 зарезервированы для программирования МК. Таким образом, для общего применения остаются порты PB0 и PB1.
2. Порты PC0. РС6. Порты PC0. РС5 есть возможность использовать в качестве аналоговых входов. РС6 обычно используется для общего внешнего сброса настроек, т. е. перезагрузки прошивки МК.
3. Порты PD0. РD7. Эти порты можно использовать для общего применения.

Atmega8 выпускается с уже настроенным для использования встроенным RC-генератором с частотой 1МГц, который позволяет запустить МК без внешних элементов. Посредством конфигурационных манипуляций, значения этой частоты могут принимать также значения: 2, 4 и 8 MHz. Однако для решения многих задач стабильности RC-генератора оказывается явно недостаточно, в связи с чем для тактирования микроконтроллера используется внешний кварцевый резонатор.

Следует запомнить, что МК не является устройством, которое управляет большими мощностями, для этого есть транзисторы, тиристоры и прочие силовые элементы. Максимальный ток линии ввода/вывода составляет 40мА, максимальный суммарный ток по цепям питания и GND – 200мА.
И под занавес:

Основные технические параметры ATmega8:

— Память для программ составляет 8 Кб с возможностью перезаписать 10 000 раз;
— 512 байт флеш-памяти для хранения переменных (100 000 циклов перезаписи);
— 1 Кб ОЗУ и 32 регистра общего назначения;
— Два 8-разрядных Таймера/Счетчика с раздельным прескалером, режим сравнения;
— 16-разрядный Таймер/Счетчик с раздельным прескалером, режим сравнения, режим захвата;
— Таймер реального времени с независимым генератором;
— 3 канала ШИМ;
— 6 каналов 10-разрядного АЦП;
— Двухпроводный последовательный интерфейс;
— Программируемый последовательный USART;
— Интерфейс SPI с режимами Master/Slave;
— Программируемый сторожевой таймер с отдельным независимым генератором;
— Встроенный аналоговый компаратор;
— Сброс при включении питания, программируемая защита от провалов питания;
— Встроенный калиброванный RC-генератор;
— Обработка внутренних и внешних прерываний;
— 5 режимов с пониженным энергопотреблением: Idle, ADC Noise Reduction, Power-save, Power-down и Standby;
— Напряжение питания 4.5 — 5.5В;
— Тактовая частота 0-16 МГц.

Ну, на этом, пожалуй, и всё.
Для желающих посерьёзней углубиться в знания, могу порекомендовать datasheet производителя и русскоязычное описание ATmega8, с которым можно познакомиться по ссылке — ATMEGA8.

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

Программирование микроконтроллеров AVR с помощью Arduino на примере ATmega8

Далеко не во всех проектах целесообразно использовать Ардуинку целиком, иногда достаточно всего нескольких выводов микроконтроллера, да и интегрировать её в схему не всегда удобно. В таких случаях разумно совместить простоту и удобство среды программирования Arduino IDE и дешевизну и малый размер «голого» микроконтроллера, тем более, что прошивать такие МК можно непосредственно с помощью Ардуинки.

В семействе AVR огромное множество микроконтроллеров на любой вкус. Для стандарт tinyAVR (ATtinyxxx) характерны небольшое количество флеш-памяти (до 16 килобайт) и количество линий ввода-вывода в совокупности с низким энергопотреблением, а для стандарта megaAVR (ATmegaxxx) доступно уже до 256 килобайт памяти и до сотни портов ввода-вывода (зависит от модели МК), так же доступна расширенная система команд и периферийных устройств. Сегодня будем прошивать ATmega8, цифра 8 в названии говорит нам о том, что у этого микроконтроллера 8 килобайт встроенной памяти. На картинке ниже расписаны выводы микроконтроллера в DIP корпусе. Кстати у ATmega48/88/168/328 выводы расположены аналогичным образом.

  • Ground (8 и 22 ноги) — земля, минус питания.
  • VCC (7 нога) — + питания.
  • Crystal (9 и 10 ноги) — сюда подключается кварцевый резонатор нужной частоты, в случае если МК настроен на работу от внешнего генератора.
  • AVCC (20 нога) — это + питание для аналоговой части МК, их разделяют с VCC в случаях когда необходимо получать сильно точные значения, питания подают отфильтрованное от помех и т.п. На практике для рядовых задач просто соединяют эту ногу с VCC.
  • AREF (21 нога) — на эту ногу можно подавать опорное напряжение отличное от пяти вольт питания микроконтроллера, например если есть необходимость измерять напряжение в пределах 3 вольт.
  • RESET — сброс настроек, перезагрузка МК. Кратковременная подача логического ноля на этот вывод приведет к перезапуску прошивки, так же необходим для перезаписи.
  • Остальные выводы — это порты ввода вывода такие же как и на плате Ардуино, их можно использовать по своему усмотрению.

Для прошивки нашего микроконтроллера понадобятся его порты последовательного периферийного интерфейса (SPI — Serial Peripheral Interface) — это синхронный протокол последовательной передачи данных, используемый для связи микроконтроллера с одним или несколькими периферийными устройствами. В нашем случае это выводы:

  • 17 выводMOSI(Master Out Slave In) — линия для передачи данных от ведущего устройства (Master) к ведомым (Slave)
  • 18 вывод — MISO(Master In Slave Out) — линия для передачи данных от ведомого устройства (Slave) к ведущему (Master)
  • 19 вывод — SCK(Serial Clock) — тактовые импульсы, генерируемые ведущим устройством (Master) для синхронизации процесса передачи данных

В первую очередь необходимо из ардуинки сделать программатор, в этом нет ничего сложного, нужно просто загрузить в неё код из готового примера «ArduinoISP».

После его загрузки в плату (кстати я буду использовать Arduino UNO для наглядности, но это не принципиально, можно и другую) в меню Инструменты — >>Программатор необходимо выбрать «Arduino as ISP».

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

  • 17 нога микроконтроллера (MOSI) к 11 пину платы Ардуино
  • 18 нога микроконтроллера (MISO) к 12 пину
  • 19 нога микроконтроллера (SCK) к 13 пину
  • 1 нога (RESET) к 10 пину платы Ардуино
  • 8 ногу к GND
  • 7 ногу к +5V
Читайте также  Бензиновые генераторы с двигателем лифан

Дополнительно подключим на нулевой цифровой выход ATmega8 (вторая ножка микросхемы) светодиод через токоограничивающий резистор на 220 Ом, для наглядного подтверждения того, что микроконтроллер работает.

// Put an LED (with resistor) on the following pins:
// 9: Heartbeat — shows the programmer is running
// 8: Error — Lights up if something goes wrong (use red if that makes sense)
// 7: Programming — In communication with the slave

Как видно из описания примера «Arduino ISP» к 7, 8 и 9-му пинам платы Ардуино можно подключить информационные светодиоды (через резисторы) отображающие ход работы программатора, но это по желанию.

Теперь почти всё готово, осталось только сообщить среде программирования, что именно мы собираемся прошивать. Для этого нужно добавить нашу ATmega8 в среду разработки Arduino IDE, тоесть нужно установить так называемое ядро, или как оно называется в самой IDE – плату.

MiniCore – ядро для поддержки микроконтроллеров ATmega328, ATmega168, ATmega88, ATmega48 и ATmega8, для его установки нажимаем Файл —>> Настройки и в открывшемся окне ищем строчку: «Дополнительные ссылки для менеджера плат:», в это поле необходимо ввести ссылку:

Далее заходим в Инструменты —>> Плата —>> Менеджер плат находим и устанавливаем нужное ядро.

После всех манипуляций в менеджере плат должно появиться следующее:

В качестве платы выбираем нашу ATmega8, параметр «Clock:» устанавливаем «Internal 8 MHz», так МК будет работать от внутреннего генератора.

Все готово! Теперь подключаем плату Ардуино к компьютеру и не забыв выбрать нужный COM порт, выбираем в меню «Инструменты» пункт «Записать загрузчик».

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

void setup() <
pinMode(0, OUTPUT);
>

void loop() <
digitalWrite(0, HIGH);
delay(1000);
digitalWrite(0, LOW);
delay(1000);
>

Загружать нужно не кнопкой как обычно, а через меню Скетч —>> Загрузить через программатор, если все сделано правильно, то светодиод начнет мигать.

В Arduino IDE можно прошить ATmega8 и без установки дополнительных плат, выбрав в качестве платы «Arduino NG or older» и в качестве процессора «aTmega8». Но в таком случае не будет возможности выбора от какого генератора (внешнего или внутреннего) и на какой частоте будет работать МК, а работать он будет от внешнего генератора на чистоте 16 MGz, и перезаписать его настройки в дальнейшем без подключения кварцевого резонатора к выводам 9 и 10 будет невозможно, будьте внимательны!

Ну и напоследок приведу ссылки на ядра для работы с микроконтроллерами серии ATtiny, устанавливаются они аналогично MiniCore:

МИКРОКОНТРОЛЛЕРЫ AVR: FUSE-БИТЫ

В данном обзоре рассмотрим, что же такое fuse-биты и для чего они нужны, так как это вызывает много непонимания (да и разработчики прошиващего софта вертят их как хотят). В результате этого контроллеры AVR кучами складываются в коробки до «лучших времен». Для примера рассмотрим fuse-биты на примере МК ATMega8. Для других типов контроллеров AVR назначение уточняются в даташите на конкретный МК (не ленитесь читать документацию). Итак, поехали! Все фьюз-биты МК разделены на 2 байта – старший (Fuse High Byte) и младший (Fuse Low Byte). Разбор конечно же начнем со старшего байта.

старший байт

RSTDISBL – определение режима работы пина RESET. Данный пин может работать в 2-х режимах как вывод внешнего сброса или как порт ввода-вывода.
RSTDISBL=1 – пин настроен на работу как вывод внешнего сброса.
RSTDISBL=0 – пин работает как порт ввода-вывода. Данный режим работы отключит возможность последовательного программирования и поможет только параллельный программатор.
WDTON – включение и отключение сторожевого таймера (Watch Dog Timer), который выполняет защиту от зависания программы, выполняемой МК. В основном применяется в ответственных программах, где зависание нежелательно.
WDTON=1 – сторожевой таймер отключен (можно включить программно через бит WDT регистра WDTCR).
WDTON=0 – сторожевой таймер включен (программно отключить не получится).
SPIEN – разрешение последовательного программирования.
SPIEN=0 – последовательное программирование разрешено.
SPIEN = 1 – последовательное программирование запрещено.
Если отключить режим последовательного программирования, то сможет помочь только параллельный программатор. Во многих программах для прошивки данный бит изменить нельзя (чекбокс недоступен).
CKOPT – бит опций тактового генератора. Его разберем позже, когда доберемся до младшего байта.
EESAVE — бит защиты данных, хранящихся в EEPROM памяти при стирании микросхемы. Если данный бит не установлен, т.е. EESAVE = 1, то при стирании микросхемы затрутся данные, хранящиеся в EEPROM.
BOOTSZ1…0 – биты определяющие объем flash-памяти, отводимой под бутлоадер.
Бутлоадер – это набор команд, даже точнее – это программа, которая болтается в конце flash-памяти МК, способная принимать данные от внешних устройств при наступлении какого-либо события и заносить их во flash-память. Бутлоадер применяется в основном для прошивки МК без использования спецпрограмматора.
BOOTRST – бит, определяющий с какого места начнется загрузка контроллера после сброса.
BOOTRST = 1 – загрузка начнется с нулевого адреса
BOOTRST = 0 – загрузка начнется с адреса начала области flash-памяти, выделенной под бутлоадер.
Вот и добрались до младшего байта.

младший байт

BODLEVEL и BODEN – биты, управляющие схемой мониторинга напряжения питания контроллера (Vcc). Если напряжение опуститься ниже установленного битом BODLEVEL, то МК сброситься и будет держаться в режиме сброса, пока напряжение не превысит установленный порог.

BODLEVEL = 1 – пороговое напряжение равно 2,7В.
BODLEVEL = 0 – Пороговое напряжение равно 4В.
BODEN = 1 – схема мониторинга неактивна.
BODEN = 0 – схема мониторинга напряжения питания активна.
SUT1…0 – биты, определяющие время запуска микроконтроллера (см. режимы работы тактового генератора). После подачи на МК питания, выхода его из режима энергосбережения или после сброса, МК начинает работать не сразу, а по истечении определенного времени. Как раз это время и задают данные биты. Если время старта не важно, то ставим максимум SUT1…0 = 11. Все операции, выполняемые контроллерам, производятся по импульсам, приходящим от тактового генератора. Тактовый генератор может быть встроенным в МК, либо быть внешним.

Внутренний генератор может работать в нескольких режимах:

— с внутренней задающей RC-цепочкой;
— с внешней задающей RC-цепочкой;
— с внешним задающим кварцевым или керамическим резонатором.
При работе контроллера от внешнего тактового генератора на его вход XTAL1 подаются прямоугольные импульсы от какого-либо внешнего генератора:
Все эти режимы работы задаются битами CKSEL3…0.

Внутренний генератор с внутренней задающей RC-цепочкой

Внутренний генератор с внутренней задающей RC-цепочкой

Все МК типа ATMega8 поставляются с завода со значением битов CKSEL3…0=0001, т.е. настроены на работу с тактовой частотой 1 МГц от внутреннего генератора с внутренней задающей RC-цепочкой. Время старта в данном режиме работы определяется по таблице:

Время старта

Внутренний генератор с внешней задающей RC-цепочкой

Согласно даташиту емкость конденсатора должна быть не менее 22 пФ. При условии, что CKOPT=0 между выводом XTAL1 и GND подключается внутренний конденсатор емкостью 36 пФ и внешний конденсатор можно исключить. Частота задающей RC-цепочки определяется соотношением f=1/(3RC). В соответствии с выбором RC-цепочки биты CKSEL3…0 устанавливаются в соответствии с таблицей:

Частота задающей RC-цепочки

Время старта в данном режиме определяется по таблице:

Время старта в данном режиме

Частота тактового генератора будет определяться частотой кварца. При выбранной частоте кварца биты CKSEL3…1 выбираем из таблицы:

При выбранной частоте кварца биты CKSEL3…1 выбираем из таблицы

Комбинация CKSEL3…1 = 101 должна использоваться только с керамическим резонатором (см. примечание под таблицей). Время старта выбирается из таблицы:

Время старта выбирается из таблицы

При работе тактового генератора с внешним резонатором значение бита CKOPT определяет режим работы усилителя тактового генератора для раскачки резонатора. При CKOPT = 0 амплитуда колебаний максимальна, что дает устойчивость к помехам и возможность работать на всем диапазоне частот. При CKOPT = 1 амплитуда колебаний меньше (генератор работает в экономном режиме) и возможны сбои при работе контроллера из-за различных помех. Так что если нет жестких требований к энергосбережению устройства, то CKOPT = 0. Кроме работы с высокочастотными резонаторами, контроллер способен работать также на частотах так называемых часовых кварцев (32768 Гц). Для этого значение CKSEL3…0 = 1001. При CKOPT = 0 между XTAL1 и GND, и XTAL2 и GND подключаются внутренние конденсаторы, а внешние конденсаторы в данном случае можно исключить. Время старта определяется из таблицы:

контроллер способен работать также на частотах часовых кварцев

Для выбора данного режима устанавливаем CKSEL3…0 = 0000. Установка CKOPT = 0 позволяет подключить между XTAL1 и GND, и XTAL2 и GND внутренние конденсаторы 36 пФ (зачем?). Время старта опять же определяется из таблицы:

время старта, fuse-биты

Кроме младшего и старшего fuse-байтов в окне прошивальщика можно увидеть Lock Bit Byte – так называемый байт защиты. С помощью изменения значения битов данного байта можно запрещать и разрешать доступ к памяти программ (flash-памяти), EEPROM и области бутлоадера. Можно сказать, что биты этого байта предназначены для защиты того, что есть в контроллере. В основном это надо разработчику, чтобы защитить свой интеллектуальный труд от кражи и обычному пользователю эти биты особо неинтеесны.

Немного о прошивающем софте

Немало косяков с залочкой контроллеров возникает из-за прошивающего софта. В каких-то программах галка в чекбоксе означает 0, а в каких-то 1. Перечислять значения галки в каждой программе бесполезно, так как этих программ навалом. Поэтому дам совет, как определить who is who. Берем МК и подключаем его к последовательному программатору, заходим в режим программирования fuse-битов и считываем все байты. Смотрим значение бита SPIEN. Т.к. последовательное программирование разрешено, то SPIEN = 0. А теперь смотрим что стоит в чекбоксе напротив данного бита. Если стоит галка, то в данной программе это означает 0, если чекбокс пуст, то галка в данной программе означает 1. При прошивке всегда шейте первым делом прошивку, а fuse-биты в самую последнюю очередь, т.к. fuse-биты могут быть настроены не от работы тактового генератора с внутренней RC-цепочкой или вообще в данной схеме пин RESET используется как обычный порт. Перед прошивкой fuse-битов всегда делайте их считывание, т.к. при выставлении только нужных битов остальные зашьются как есть на экране. Автор статьи: skateman.

Originally posted 2019-08-28 22:41:49. Republished by Blog Post Promoter

Понравилась статья? Поделиться с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: