Компания Atmel производит множество чипов и 2 разновидности микроконтроллеров, которые были признаны радиолюбителями. Один из них — ATmega328P, рассматриваемый в этой статье. Рассмотрим его устройство, варианты программирования и ПО, требующееся для прошивки
ATmega328P — микроконтроллер группы AVR
Устройство atmega328p имеет 28 контактов. Его знает большинство владельцев конструктора Arduino, как главный элемент электронного комплекта. Но на самом деле, функционал устройства намного шире, чем применение в этом конструкторе. И это подтверждается в atmega328p datasheet.
Семейство микроконтроллеров AVR, куда входит atmega328p, сегодня широко применяется при конструировании электроники разного уровня. Среди них не только микроконтроллер ATmega328P, но и схожий по характеристикам 8-контактный ATtiny45, имеющий чуть меньше функций.
Микроконтроллер также является основой Arduino Nano — маленькой отладочной платы, очень распространённой в любительской среде программистов. Это устройство — компактное по размеру, но по характеристикам не уступающее всем известной Arduino Uno. Она запросто включается в проекты, где параметры очень важны.
Распиновка atmega328p
Как правило, программирование указанных устройств ведется с помощью SPI — последовательного периферийного интерфейса. Через шину данных идет ряд сигналов:
- MOSI — вход поступления данных;
- MISO — выход ее распространения;
- SCK — синхронизирующий вход.
Последний — генерирует программатор и обеспечивает синхронное получение между двумя связанными устройствами. Можно сказать, что интерфейс SPI — это синхронная шина коммуникации.
Как выбрать физический программатор под ATmega328P
Для указанного микроконтроллера есть множество подходящий программаторов. Один из них производится той же фирмой, Atmel и разрабатывался профессионалами. Он называется «Atmel-ICE».
По мнению радиолюбителей, это лучший программатор для прошивки AVR и схожих микросхем. Его можно приобрести в интернет-магазинах наподобие AliExpress, по стоимости от 5 тысяч рублей. Устройство выглядит так:
К сожалению, такая версия не по карману простым любителям электроники. Рациональнее — остановить выбор на usb — программаторе AVR Pocket Programmer. Он стоит намного дешевше профессионального Atmel-ICE. На некоторых сайтах его можно приобрести даже за 200 р, правда, без проверки.
При отсутствии возможности купить простой программатор, можно изготовить его собственноручно. Основу такой схемы составляет чип ATtiny2313. Внешними элементами в ней являются:
- Резисторы.
- Светодиоды.
- Стабилитроны.
Конструкция самодельного устройства — проста и доступна. Желательна буферизация сигнальных линий, но она не обязательна. Для нее в схеме должен находиться буфер. К примеру, его роль может сыграть устройство 74AC125. Оно же входит и в фирменную версию. Вместо него можно применить транзистор.
Программатор не функционирует без usb-драйвера. Поэтому, радиолюбители обзаводятся универсальным инсталлятором для Windows (7 и более высоких версий), который помогает устанавливать общие драйвера. Установка драйвера в ОС желательна до того, как физическая схема atmega328p подключится к компьютеру.
Среди часто используемых программаторов — stk500 atmega328p.
Как подключать и программировать микроконтроллер
Устройства группы AVR программируют с помощью интерфейса SPI, сигнальным прохождением сквозь 6 участкоа:
- электропитание;
- «земля»;
- сброс;
- получение данных;
- передача;
- синхронизирование.
Чтобы все перечисленные сигналы перемещались через устройства, нужен 1 из 2 стандартных разъемов, с 6 или 10 контактами. Программаторная atmega328p плата соединяется с ними с помощью шлейфа-кабеля. Ее заводской вариант укомплектован всеми возможными дополнениями.
Для работы вместе с программным инструментом используются 2 вида контактных разъемов SPI.
Фирменная плата оборудована переключателем режимов электропитания. При его помещении в положение Power Target, она получает от usb напряжение 5 В. В противном случае, то есть, режиме No Power на контакте нет питания. Второй вариант применяется, чтобы программировать чипы с невысоким напряжением, от 1,8 до 3,3 В.
В каждый контроллер atmega328p для avrdude встраивается технология bootloader atmega328p. Она считается самым рациональным и правильным вариантом программирования. Так как специализированные программные адаптеры и набор знаний — не обязательны, необходимо подключение классического кабеля от ПК к плате и активацию программы.
При предварительной переконфигурации atmega328p nano или обычной, старт микроконтроллера идёт со специализированого адреса, где, как правило, располагается atmega328p old bootloader. Это является условием запуска, определяемым состоянием перемычки извне, которая подключается к ножке atmega328p для Ардуино.
Использование утилиты AVRDUDE
Рассмотрим инструмент для строки команд в системе Windows. Для его применения нужно нажать всего 2 клавиши: Пуск, а затем, выполнить. После этого выясните уровень готовности утилиты следующей командой:avrdude -c usbtiny -p atmega328p.
Эта комбинация помогает выяснить, подключен ли микроконтроллерный программатор к разъему usb. Чипы из других серий, соответственно, проверяются другими командами.
Если программатор подключен правильно, утилита выведет на экран следующее (см. Рисунок):
Если микроконтроллер изготавливается по стандартам, в нем присутствуют идентификаторы. Он определяется при первом запуске утилиты. AVRDUDE в ходе проверки сканирует идентификатор чипа.
Микросхемные идентификаторы имеют разный вид, согласно типу AVR. В частности, идентификация ATmega328P выглядит как 0x1E950F. Эти символы выводятся в специальное окно. После проверки работоспособности схемы, идет следующий шаг — чтение и запись программного кода посредством утилиты.
Участок памяти чипа, как правило, прошиваемый, является энергозависимой областью, местом для хранения программ (Flash). Прошивка atmega328p производится с помощью комбинации: avrdude c usbtiny p atmega328p U flash:w:test.hex. Имя файла здесь дано только как пример.
Чтобы записать flash-память, потребуется некоторое время, большее, чем для считывания информации atmega328p. Проверка устройства, чтение и запись, в свою очередь, меняют командную строку.
Взгляните на этот рисунок, чтобы увидеть, как читается информация в памяти устройства посредством утилиты. Она помещается в специальное окно.
Символ U в команде AVRDUDE для atmega328р — отвечает за просмотр и запись. Им владелец демонстрирует использование atmega328p памяти flash. Эта же опция применяется, чтобы читать информацию в памяти AVR. Приведем пример: в файле test.hex ее можно считать по команде avrdude c usbtiny p atmega328p U flash:r:test.hex:r.
Добавочный символ w указывает на запись, затем, через знак “:” идет имя и местонахождение документа, который и записывается в память.
Работа инструмента возможна лишь с теми документами, у которых есть расширение hex.
Отличия ATmega328 от ATmega328P и ATmega328PU
Обычному пользователю сложно понять, почему маркировка кристаллов отличается, и какой выбрать. Попробуем разобраться:
- Для использования в обычных сферах между первыми двумя вариантами — разница небольшая, поэтому возможна взаимозаменяемость.
- Энергопотребление ATmega328P — существенно ниже, чем Atmega328. Это описано в параметрических таблицах даташит. О чем это говорит? О том, что при разработке первого варианта применялся более точный технический процесс. Как правило, стоимость этих чипов — выше. У микроконтроллеров категории AVR с низким энергопотреблением, согласно классификации производителя, есть отметка PicoPower. Получается, что для батарейных устройств ATmega328P — выгоднее. В них должны быть использованы контролирующие режимы для уменьшение потребления энергии.
- У рассматриваемых вариантов — разные сигнатуры чипов. Поэтому, при использовании программ для их чтения (по аналогии с утилитой avrdude) можно увидеть сообщения об ошибке atmega328p при неправильном указании типа микроконтроллера.
- Только Atmega328P может быть оснащен корпусом TQFP32, но не TQFP328. Это зависит от большей толщины кристалла, из-за которой он просто не влезает в данный корпус.
- В Atmega328 отсутствует фьюз, блокирующий детектор низкого уровня питания. Во втором варианте данный фьюз присутствует, за счет чего дополнительно снижается потребление энергии и происходит отключение BOD. Наличие такого фьюза возможно только у версий группы picoPower. Их обозначение заканчивается символами 48PA, 88PA, 168 PA, 328 P. То же самое касается фьюзов BODS, BODSE.
- Система команд, которые относятся к инструкциям перехода, тоже пусть незначительно, но отличается. При компиляции чипа программы в обоих вариантах — работоспособны.
- Буквы PU означают вид кристального корпуса. Это -DIP28 из пластика. В него легко помещается ATmega328, вот и дополняется таким суффиксом. Также варианты корпусов обозначаются буквенными сочетаниям AU, MU.
Можно изготовить Ардуино на основе atmega328p mini. Этот вариант — более простой, чем uno, так как там нет участка USB-to-Serial. Как мы знаем, atmega328p pro mini — это, как правило, вариант atmega328p au. Но для некоторых устройств этот вариант — слишком мал, и туда больше подходит PU.
На основе микроконтроллеров создаётся множество устройств, в том числе, atmega328p тестер-транзистор и контроллер atmega328p nano 3.0.
Led-матрица на основе ATmega328p (самодельный Arduino)
Этот прибор может украсить полку любого пользователя и радиолюбителя.
Составляющие элементы
Сначала нужно собрать все необходимые детали. Нам понадобится:
- 7 резисторов с сопротивлением 150 Ом.
- 5 конденсаторов (50 В, 1 мкФ ).
- Резонатор из кварца (16 МГЦ).
- Разъём-гребенка с 18 контактами.
- Регистор сдвига с DIP-корпусом.
- Микросхемная панель 74ch595 с 16 ножками.
- 35 световых диодов (3 В).
- Непосредственно микроконтроллер в корпусе DIP.
- Плата для монтажа 5*7.
Обзаведитесь флюсом, припоем и паяльником, оптимальными проводами, например, МГТФ.
Регистр сдвига
Принцип действия микросхемы 74ch595 — довольно сложен для понимания. Ее основное предназначение — увеличение числа пинов.
В схеме есть несколько основных регулирующих контактов: вывода (DS), определения напряжения на выводе (SH), записи состояния в DC, открытия и закрытия микросхемы путем установки контактов в нужное положение (ST).
Последнее, что нужно узнать, — это код для функционирования микросхемы.
Как подготовить матрицу
Иногда светодиодам не хватает места на плате, и тогда нужна обточка мелкой окантовки. Делайте ее аккуратнее, так как световые диоды — довольно хрупкие элементы.
Не забудьте о конденсаторах! При их отсутствии световые диоды погаснут, что помешает оптимизации устройства.
Резисторов, как уже было указано, в конструкции — 7, но видно только 6, так как 1 расположен напрямую под микросхемой.
Вместо генератора с частотой 16 МГц можно использовать имеющий 24 МГц, для ускорения работы. Но такую корректировку можно сделать только в готовом устройстве. Дело в том, что прошивка ATmega328p на генераторе с большей частотой — невозможна.
Расположение светодиодов таково:»+» к 74ch595, «-» — ATmega328p.
После запайки всех составляющих можно перейти к припаиванию проводов. Соедините все контакты со световыми диодами, элементы питания — с генератором, световые диоды — с микросхемой 74ch595.
Конечно, не прошитое устройство мгновенно не заработает, однако, можно попробовать воспользоваться классическим blink Arduino. При определённых условиях — может сработать. При мигании света в 1-м ряду можно считать, что эксперимент удался.
Для возможности влияния микроконтроллера на контакты, нужна их инициализация. В противном случае, актуально было бы использование массива и цикла для сокращения функционального кода.
В устройстве обязательно должна быть динамическая память, при отсутствии которой оно просто зависнет.
Как выбрать источник электропитания
Этот момент нужно учесть в первую очередь. Например, выбрать в качестве электроисточника ноут или персональный компьютер — не лучшая идея. Конечно, кое-как при таких пульсациях конструкция какое-то время поработает, но стабильности не ждите.
Конечно, слабая работа прибора, созданного на микроконтроллере, может объясняться неправильным прошивочным кодом, проблемой с контактами на плате. Но если вы меняете источник питания, и работа возобновляется, дело в нем.
Не все сетевые варианты здесь подходит, гораздо выгоднее — использование автономного питания. Например, подойдут и литий-ионные аккумуляторы для питания мобильников.
А поскольку, согласно технической инструкции, чтобы контроллер ATmega328p при 16 МГц, нужно напряжение около 5 В, здесь не обойтись без модуля преобразователя, который повышает напряжение.
Выбор руководства
Платформа Arduino Nano выпускается на микроконтроллере Microchip ATmega328 семейства AVR. На текущий момент микроконтроллер Microchip ATmega328 можно встретить в двух модификациях:
- ATmega328P — базовый микроконтроллер на котором выпускалась Arduino Nano с 2010 года по настоящее время.
- ATmega328PB — улучшенный микроконтроллер на котором Arduino Nano стали выходить с 2024 года.
Визуально платформы Arduino Nano ATmega328P и Arduino Nano ATmega328PB полностью идентичны, отличить их можно только по маркировке на микроконтроллере.
Для микроконтроллера ATmega328P данная статья не подходит и вам по ссылке выше! Однако, если вам достался микроконтроллер ATmega328PB и вы хотите раскрыть весь потенциал обновлённого чипа — не переключайтесь. Все подробности про расширенную работу платы на ATmega328PB читайте в текущей статье.
Доступные версии
В нашем магазине мы предлагаем Arduino Nano в нескольких вариантах:
| Модель | Микроконтроллер | USB-UART | Исполнение |
|---|---|---|---|
|
Arduino Nano (USB CH340 / Без ног) |
ATmega328P / ATmega328PB | CH340 | Без ног |
|
Arduino Nano (USB CH340 / С ногами) |
ATmega328P / ATmega328PB | CH340 | С ногами |
|
Arduino Nano (USB FT232R / С ногами) |
ATmega328P / ATmega328PB | FT232R | С ногами |
Режимы микроконтроллера ATmega328PB
Arduino Nano на микроконтроллере ATmega328PB может работать в двух режимах:
- Режим совместимости с ATmega328P: контроллер функционирует аналогично ATmega328P, предоставляя стандартный набор интерфейсов и возможностей.
- Расширенный режим ATmega328PB: контроллер предлагает дополнительные функции, которые улучшает коммуникационные возможности микроконтроллера.
| Параметры | Режим совместимости с ATmega328P | Расширенный режим ATmega328PB |
|---|---|---|
| Контакты с ШИМ | 6 | 9 |
| Интерфейс SPI | 1 | 2 |
| Интерфейс UART | 1 | 2 |
Расширенный режим ATmega328PB
Для активации в Arduino Nano всех плюшек микроконтроллера ATmega328PB необходимо:
- Скачать и установить среду программирования Arduino IDE.
- Добавить в Arduino IDE поддержку микроконтроллера ATmega328PB.
- Записать загрузчик ATmega328PB в контроллер Arduino Nano.
- Настроить Arduino IDE на работу с Arduino Nano на ATmega328PB.
- Выполнить проверку Arduino Nano на базовом примере.
В качестве примера рассмотрим все шаги на платформе Arduino Nano (USB CH340 / С ногами). С другими моделями Nano процесс коммуникации будет аналогичный.
1. Скачивание и установка Arduino IDE
Для старта необходимо скачать и установить среду программирования Arduino IDE. Весь процесс описан в нашем руководстве по Arduino IDE.
2. Добавления в Arduino IDE поддержки ATmega328PB
По умолчанию IDE настроена только на штатные AVR-платы. Для работы с платформой Arduino Nano на микроконтроллере ATmega328PB — добавьте в менеджере плат поддержку платформ на ядре MiniCore.
- Откройте среду программирования Arduino IDE.
- Зайдите в настройки Arduino IDE:
Файл→Настройки -
В окне
Дополнительные ссылки для менеджера платвведите адрес:https://mcudude.github.io/MiniCore/package_MCUdude_MiniCore_index.json
И нажмите на кнопку
OK. - Зайдите в менеджер плат:
Инструменты→Плата→Менеджер плат - Вбейте в поисковое окно строку
MiniCore. Найдите в списке соответствующую платформу и нажмите на кнопкуУстановить. - Начнётся установка дополнений, после которой отобразится надпись
INSTALLED. Это значит установка завершилась успешно и можно нажимать кнопкуЗакрыть. - Теперь вам доступны к программированию платы из ядра
MiniCore, в котором есть семейство микроконтроллеровATmega328.
3. Запись загрузчика ATmega328PB в Arduino Nano
Записать загрузчик в Arduino Nano можно с помощью другой платы Arduino в роли программатора. Для удобства приведем нейминг плат:
- Плата программатор — контроллер Arduino через который будем зашивать загрузчик в плату исполнитель. Для примера в роли программатора будем использовать Arduino Uno. В вашем случае это может быть и другая Arduino.
- Плата исполнитель — контроллер Arduino в который будем зашивать загрузчик. В даном случае будем использовать как раз Arduino Nano.
- Подготовьте плату программатор. Подробности читайте в нашей общей статье по записи загрузчика в Arduino.
- Соедините плату программатор Arduino Uno с платой исполнитель Arduino Nano. Подробности читайте в нашей общей статье по записи загрузчика в Arduino.
- Подключите плату программатор к компьютеру через кабель USB. При успешном подключении должны загореться индикаторные светодиоды питания на плате программаторе и плате исполнителе.
- В Arduino IDE выберите семейство контроллеров ATmega328:
Инструменты→Плата→MiniCore→ATmega328 - В Arduino IDE выберите контроллер ATmega328PB:
Инструменты→Variant→328PB - В Arduino IDE выберите COM-порт платы программатора:
Инструменты→Порт→COMx, гдеx— номер порта платы. - В Arduino IDE выберите тип программатора:
Инструменты→Программатор→Arduino as ISP - Плата программатор и исполнитель настроены — можно записывать загрузчик. В Arduino IDE выберите:
Инструменты→Записать загрузчик - Если все шаги были пройдены правильно, на плате программаторе начнут мигать светодиоды
RXиTX. При завершении процесса — в окне статуса Arduino IDE должна появиться надписьЗапись загрузчика завершена. - Отключите плату программатор от USB. А затем разберите схему между платой программатором Arduino Uno и платой исполнителем Arduino Nano. Плата программатор кстати нам больше не понадобится, все дальнейшие шаги будем совершать с помощью платы исполнителя Arduino Nano.
4. Настройка Arduino IDE на работу с Arduino Nano на ATmega328PB
- Подключите платформу Arduino Nano к компьютеру через кабель USB. При успешном подключении должен загореться индикаторный светодиод
PWR. - Откройте диспетчер устройств Windows.
- В диспетчере устройств раскройте вкладку
Порты (COM и LPT), идентифицируйте среди устройств плату исполнитель Arduino Nano и запомните номер назначенного COM-порта. В нашем случае это USB-SERIAL CH340 с COM-портом номер11. - CH340 для OS Windows 7 или Windows 10
- FT232R для OS Windows 7 или Windows 10
- В Arduino IDE выберите семейство контроллеров ATmega328:
Инструменты→Плата→MiniCore→ATmega328 - В Arduino IDE выберите контроллер ATmega328PB:
Инструменты→Variant→328PB - В Arduino IDE выберите COM-порт платы:
Инструменты→Порт→COMx, гдеx— номер порта платы. - В Arduino IDE выберите тип программатора:
Инструменты→Программатор→USBtinyISP slow - На этом этапе плата Arduino Nano настроена на расширенный режим с микроконтроллером ATmega328PB и можно переходить к примерам работы.
В зависимости от модели платы Arduino Nano, а точнее от типа её USB-UART преобразователя, название устройства может быть разное. Приведём самые часто встречающие варианты: Arduino Nano, CH340, FT232.
Если при подключении контроллера Arduino Nano в Arduino IDE не появляется новый COM-порт, установите драйвер в зависимости от чипа USB-UART преобразователя:
Как узнать номер COM-порта платы Arduino Nano, мы смотрели пару шагов выше в диспетчере устройств.
5. Пример работы Arduino Nano ATmega328PB
Сделаем маячок с нарастающей яркостью. Для этого подключим светодиод к пину 2.
Что понадобится
- 1× Arduino Nano
- 1× Trema Shield Nano
- 1× Светодиод (Trema-модуль)
- 1× Кабель USB Mini
Схема устройства
Исходный код
Прошейте платформу Arduino Nano ATmega328PB кодом ниже.
// Даём пину со светодиодом понятное имя
constexpr int LED_PIN = 2;
void setup() {
// Настраиваем пин со светодиодом в режим выхода
pinMode(LED_PIN, OUTPUT);
Serial1.begin(9600);
}
void loop() {
// Создаём цикл для перебора всех значений от 0 до 255
// Выдаём на светодиод ШИМ-сигнал
for (int brightness = 0; brightness <= 255; brightness++) {
analogWrite(LED_PIN, brightness);
// Ждём 10 мс
delay(10);
}
// Создаём цикл для перебора всех значений от 255 до 0
// Выдаём на светодиод ШИМ-сигнал
for (int brightness = 255; brightness >= 0; brightness--) {
analogWrite(LED_PIN, brightness);
// Ждём 10 мс
delay(10);
}
}
Результат
После прошивки, светодиод начнёт плавно загораться, а затем плавно гаснуть.
На загрузчике ATmega328P на 2 пине ШИМа нет, а на расширенном загрузчике ATmega328PB на 2 пине ШИМ есть. Именно поэтому сейчас есть плавное нарастания яркости.
Режим совместимости с ATmega328P
Для активации в Arduino Nano режиме совместимости с микроконтроллером ATmega328P необходимо:
- Скачать и установить необходимый софт.
- Записать загрузчик ATmega328P в контроллер Arduino Nano.
- Подменить фьюзы от ATmega328P в ATmega328PB.
- Настроить Arduino IDE на работу с Arduino Nano на ATmega328P.
- Выполнить проверку Arduino Nano на базовом примере.
В качестве примера рассмотрим все шаги на платформе Arduino Nano (USB CH340 / С ногами). С другими моделями Nano процесс коммуникации будет аналогичный.
1. Подготовка софта
- Скачайте и установите среду программирования Arduino IDE. Весь процесс описан в нашем руководстве по Arduino IDE.
- Скачайте и установите программу AVRDUDESS для прошивки микроконтроллеров семейства AVR.
- Скачайте и разархивируйте загрузчик ATmega328P. На выходе вы должны получить файл прошивки
optiboot_atmega328.hex, содержащий машинный код для записи в память микроконтроллера.
2. Запись загрузчика ATmega328P в Arduino Nano
Записать загрузчик в Arduino Nano можно с помощью другой платы Arduino в роли программатора. Для удобства приведем нейминг плат:
- Плата программатор — контроллер Arduino через который будем зашивать загрузчик в плату исполнитель. Для примера в роли программатора будем использовать Arduino Uno. В вашем случае это может быть и другая Arduino.
- Плата исполнитель — контроллер Arduino в который будем зашивать загрузчик. В даном случае будем использовать как раз Arduino Nano.
- Подготовьте плату программатор. Подробности читайте в нашей общей статье по записи загрузчика в Arduino.
- Соедините плату программатор Arduino Uno с платой исполнитель Arduino Nano. Подробности читайте в нашей общей статье по записи загрузчика в Arduino.
- Подключите плату программатор к компьютеру через кабель USB. При успешном подключении должны загореться индикаторные светодиоды
PWRна плате программаторе и плате исполнителе. - Откройте программу AVRDUDESS для прошивки микроконтроллеров семейства AVR.
-
В AVRDUDESS выберите следующие настройки:
- Микроконтроллер:
ATmega328PB - Программатор:
Arduino as ISP - COM-порт платы программатора:
COMx, гдеx— номер порта платы.
- Микроконтроллер:
- В AVRDUDESS нажмите на кнопку
Detect. В консольной части программы вы должны увидеть сообщение про успешную инициализацию микроконтроллера ATmega328PB. - В AVRDUDESS скормите файл загрузчика ATmega328P: раздел
Flash→…и выберите заранее скаченный файлoptiboot_atmega328.hex. - В AVRDUDESS укажите, что будете прошивать контролер: раздел
Flashи выберите чекбоксWrite. - Плата программатор и исполнитель настроены — можно записывать загрузчик: раздел
Flashи нажмите на кнопкуGo. - Вы должны увидеть командную строку с последовательностью исполнения инструкций при прошивке. В завершении прошивки, всплывёт окно про успешную запись загрузчика.
3. Подмена фьюзов ATmega328PB к ATmega328P
С виду микроконтроллеры ATmega328P и ATmega328PB идентичны, однако имеют разные сигнатуры и фьюзы.
| Параметры | Микроконтроллер ATmega328P | Микроконтроллер ATmega328PB |
|---|---|---|
| Сигнатура | 1E 95 16 | 1E 95 0F |
| LOW Fuse Byte | FF | FF |
| HIGH Fuse Byte | DA | D7 |
| EXTENDED Fuse Byte | FD | F5 |
- Сигнатура — это идентификатор подписи микроконтроллера. Каждый микроконтроллер AVR имеет свой уникальный трёхбайтовый код подписи, который можно считать для подтверждения правильности типа устройства, подключенного к программатору. Сигнатуру микроконтроллера менять нельзя.
- Фьюз-байты — это идентификаторы параметров микроконтроллеров AVR для хранения параметров при прошивке, например источник тактового сигнала, защита от записи и другие. В штатном загрузчике ATmega328P уже прописаны определённые фьюзы, которые отличаются от фьюзов загрузчика ATmega328PB.
Для активации совместимости, подменим фьюзы от ATmega328P в ATmega328PB.
- В AVRDUDESS считаем текущие фьюзы микроконтроллера ATmega328PB: раздел
Fusesи нажмите кнопкуRead. - В разделе
Fusesвы должны увидеть считанные фьюзы. -
В AVRDUDESS вбейте вручную фьюзы от загрузчика ATmega328P:
L:→FFH:→DAE:→FD
- В AVRDUDESS запищите вписанные фьюзы в микроконтроллер ATmega328PB: раздел
Fusesи нажмите кнопкуWrite. - Вы должны увидеть командную строку с последовательностью исполнения инструкций при смене фьюзов. В завершении, всплывёт окно про успешную запись данных.
- Отключите плату программатор от USB. А затем разберите схему между платой программатором Arduino Uno и платой исполнителем Arduino Nano. Плата программатор кстати нам больше не понадобится, все дальнейшие шаги будем совершать с помощью платы исполнителя Arduino Nano.
Считанные фьюзы могут отличатся от фьюзов на скрине.
4. Настройка Arduino IDE на работу с Arduino Nano на ATmega328P
- Подключите платформу Arduino Nano к компьютеру через кабель USB. При успешном подключении должен загореться индикаторный светодиод
PWR. - Откройте диспетчер устройств Windows.
- В диспетчере устройств раскройте вкладку
Порты (COM и LPT), идентифицируйте среди устройств плату исполнитель Arduino Nano и запомните номер назначенного COM-порта. В нашем случае это USB-SERIAL CH340 с COM-портом номер11. - CH340 для OS Windows 7 или Windows 10
- FT232R для OS Windows 7 или Windows 10
- В Arduino IDE выберите плату Arduino Nano:
Инструменты→Плата→Arduino AVR Boards→Arduino Nano - В Arduino IDE выберите контроллер:
Инструменты→Процессор→ATmega328P - В Arduino IDE выберите COM-порт платы:
Инструменты→Порт→COMx, гдеx— номер порта платы. - В Arduino IDE выберите тип программатора:
Инструменты→Программатор→AVRISP MKII - На этом этапе плата Arduino Nano настроена на режим совместимости с микроконтроллером ATmega328P и можно переходить к примерам работы.
В зависимости от модели платы Arduino Nano, а точнее от типа её USB-UART преобразователя, название устройства может быть разное. Приведём самые часто встречающие варианты: Arduino Nano, CH340, FT232.
Если при подключении контроллера Arduino Nano в Arduino IDE не появляется новый COM-порт, установите драйвер в зависимости от чипа USB-UART преобразователя:
Как узнать номер COM-порта платы Arduino Nano, мы смотрели пару шагов выше в диспетчере устройств.
5. Пример работы Arduino Nano ATmega328P
Сделаем маячок с нарастающей яркостью. Для этого подключим светодиод к пину 2.
Что понадобится
- 1× Arduino Nano
- 1× Trema Shield Nano
- 1× Светодиод (Trema-модуль)
- 1× Кабель USB Mini
Схема устройства
Исходный код
Прошейте платформу Arduino Nano ATmega328PB кодом ниже.
// Даём пину со светодиодом понятное имя
constexpr int LED_PIN = 2;
void setup() {
// Настраиваем пин со светодиодом в режим выхода
pinMode(LED_PIN, OUTPUT);
Serial1.begin(9600);
}
void loop() {
// Создаём цикл для перебора всех значений от 0 до 255
// Выдаём на светодиод ШИМ-сигнал
for (int brightness = 0; brightness <= 255; brightness++) {
analogWrite(LED_PIN, brightness);
// Ждём 10 мс
delay(10);
}
// Создаём цикл для перебора всех значений от 255 до 0
// Выдаём на светодиод ШИМ-сигнал
for (int brightness = 255; brightness >= 0; brightness--) {
analogWrite(LED_PIN, brightness);
// Ждём 10 мс
delay(10);
}
}
Результат
После прошивки, у светодиода будет только два состояния: горит и не горит. Плавного нарастания яркости не будет.
На загрузчике ATmega328P на 2 пине ШИМа нет, а на расширенном загрузчике ATmega328PB на 2 пине ШИМ есть. Именно поэтому плавного нарастания яркости сейчас нет.
Элементы платы
В качестве примера рассмотрим основные компоненты на платформе Arduino Nano (USB CH340 / С ногами). На других моделях Nano, расположение компонентов на плате может немного отличаться, но суть и назначение одинаковое.
Микроконтроллер ATmega328
Все платформы Arduino Nano выполнены на микроконтроллере Microchip ATmega328 семейства AVR с тактовой частотой 16 МГц. Процессор обладает тремя видами памяти:
- 32 КБ Flash-памяти, из которых 0,5 КБ используются загрузчиком, который позволяет прошивать Arduino Nano с обычного компьютера через USB. Flash-память постоянна и её предназначение — хранение программ и сопутствующих статичных ресурсов.
- 2 КБ SRAM-памяти, которые предназначены для хранения временных данных, например переменных программы. По сути, это оперативная память платформы. SRAM-память энергозависимая, при выключении питания все данные сотрутся.
- 1 КБ энергонезависимой EEPROM-памяти для долговременного хранения данных, которые не стираются при выключении контроллера. По своему назначению — это аналог жёсткого диска для Arduino.
На текущий момент микроконтроллер Microchip ATmega328 можно встретить в двух модификациях:
- ATmega328P — базовый микроконтроллер на котором выпускалась Arduino Nano с 2010 года по настоящее время.
- ATmega328PB — улучшенный микроконтроллер на котором Arduino Nano стали выходить с 2024 года.
Визуально платформы Arduino Nano ATmega328P и Arduino Nano ATmega328PB полностью идентичны, отличить их можно только по маркировке на микроконтроллере.
Преобразователь USB-UART
В зависимости от модификации, на плате Arduino Nano можно встретить USB-UART преобразователь на чипе: CH340 или FT232R.
Преобразователь USB-UART обеспечивает связь микроконтроллера ATmega328 с USB-портом компьютера. При подключении к ПК — Arduino Nano определяется как виртуальный COM-порт.
Если при подключении контроллера Arduino Nano в Arduino IDE не появляется новый COM-порт, установите драйвер в зависимости от чипа USB-UART преобразователя:
- CH340 для OS Windows 7 или Windows 10
- FT232R для OS Windows 7 или Windows 10
Микроконтроллер ATmega328 общается с компьютером через USB-UART преобразователь по интерфейсу UART, используя сигналы RX и TX, которые параллельно выведены на контакты 0 и 1 Arduino Nano. Не используйте эти пины в своём проекте во время прошивки и отладки программы.
Индикаторные светодиоды
| Имя | Назначение |
|---|---|
| PWR | Индикатор питания платформы Arduino Nano. |
| L | Пользовательский светодиод на 13 пине Arduino Nano. При задании высокого уровня светодиод загорается, при низком – гаснет. |
| TX | Мигает при прошивки и отправление данных из Arduino Nano в USB, а также при использовании пина 0. |
| RX | Мигает при прошивки и получение данных из USB в Arduino Nano, а также при использовании пина 1. |
Кнопка RESET
Кнопка RESET служит для ручного сброса питания — аналог кнопки RESET обычного компьютера.
Порт USB Mini
Разъём USB Mini предназначен для прошивки и питания платформы Arduino Nano по USB. Для коммуникации понадобится кабель USB Mini.
Преобразователь напряжения 5 В
Понижающий преобразователь AMS1117-5 с выходом 5 вольта, обеспечивает напряжением платформу Arduino Nano при питании через пин Vin. Диапазон входного напряжения — от 7 до 12 вольт, на выходе напряжение 5 В с максимальны током 1 А.
Разъём ICSP
Разъём ICSP выполняет две полезные фитчи:
- Транслирует сигнальные пины интерфейса SPI. Линии ICSP-разъёма также продублированы на цифровых пинах
11,12и13. - Предназначен для загрузки прошивки в микроконтроллер ATmega328PB через внешний программатор для AVR. Одна из таких прошивок — Bootloader для Nano, который позволяет прошивать платформу по USB.
Распиновка
В качестве примера рассмотрим распиновку контактов на платформе Arduino Nano (USB CH340 / С ногами). На других моделях Nano, расположение пинов аналогичное.
На плате Arduino Nano расположены два ряда по 15 контактов и 6 дублирующих контактов на разъёме ICSP для подключения питания, дополнительных модулей и сенсоров.
В зависимости от загрузчика в Arduino Nano, распиновка платформы отличается:
- Всего физических контактов: 36 (15 + 15 + 6)
- Контакты ввода-вывода GPIO: 22
- Контакты с ШИМ: 9 с разрядностью 8 бит
- Контакты с АЦП: 8 с разрядностью до 10 бит
- Аппаратные интерфейсы: 2× UART, 2× SPI, 1× I²C
- Всего физических контактов: 36 (15 + 15 + 6)
- Контакты ввода-вывода GPIO: 20
- Контакты ввода GPI: 2
- Контакты с ШИМ: 6 с разрядностью 8 бит
- Контакты с АЦП: 8 с разрядностью до 10 бит
- Аппаратные интерфейсы: 1× UART, 1× SPI, 1× I²C
Габаритный чертёж
Размеры Arduino Nano (Без ног)
Размеры Arduino Nano (С ногами)
Характеристики
- Модель: Arduino Nano ATmega328PB
- Интерфейс USB-UART: CH340
- Микроконтроллер: ATmega328PB
- Тактовая частота: 16 МГц
- Flash-память: 32 КБ
- SRAM-память: 2 КБ
- EEPROM-память: 1 КБ
-
Входное напряжение питания: 5 В
- Через USB: 5 В
- Через пин Vin: 7–12 В
- Напряжение логических уровней: 5 В
-
Контакты общего назначения в расширенном режиме ATmega328PB:
- Всего физических контактов: 36 (15 + 15 + 6)
- Контакты ввода-вывода GPIO: 22
- Контакты с ШИМ: 9 с разрядностью 8 бит
- Контакты с АЦП: 8 с разрядностью до 10 бит
- Аппаратные интерфейсы: 2× UART, 2× SPI, 1× I²C
-
Контакты общего назначения в режиме совместимости с ATmega328P:
- Всего физических контактов: 36 (15 + 15 + 6)
- Контакты ввода-вывода GPIO: 20
- Контакты ввода GPI: 2
- Контакты с ШИМ: 6 с разрядностью 8 бит
- Контакты с АЦП: 8 с разрядностью до 10 бит
- Аппаратные интерфейсы: 1× UART, 1× SPI, 1× I²C
Ресурсы
Мы также рекомендуем к чтению ссылки на статьи, документации и другие вспомогательные материалы по платформе Arduino Nano.
Магазин
- Arduino Nano (USB CH340 / Без ног)
- Arduino Nano (USB CH340 / С ногами)
- Arduino Nano (USB FT232R / С ногами)
Инструкции
- Установка и настройка среды Arduino IDE
- Базовое руководство по использованию платформы Arduino Nano
- Расширенное руководство по использованию платформы Arduino Nano
- Общее руководство по записи загрузчика в плату Arduino
- Драйвер на USB-UART преобразователь CH340
- Драйвер на USB-UART преобразователь FT232R
- Установка драйвера USB CH340 для Windows 7
- Установка драйвера USB CH340 для Windows 10
- Установка драйвера USB FT232R для Windows 7
- Установка драйвера USB FT232R для Windows 10
Документация
- Datasheet на микроконтроллер ATmega328PB
- Datasheet на USB-UART преобразователь CH340
- Datasheet на USB-UART преобразователь FT232R
- Datasheet на понижающий преобразователь напряжения AMS1117-5 с выходом на 5 В
ATmega328P Высокопроизводительный 8-разрядный микроконтроллер Microchip picoPower® на базе RISC AVR® сочетает в себе 32-килобайтную флэш-память ISP с возможностями чтения во время записи, 1 KB EEPROM, 2 KB SRAM, 23 линии ввода / вывода общего назначения, 32 рабочих регистра общего назначения, три гибких таймера / счетчика с режимами сравнения, внутренние и внешние прерывания, последовательный программируемый USART, байтовый двухпроводной последовательный интерфейс, SPI последовательный порт, 6-канальный 10-разрядный аналого-цифровой преобразователь (8 каналов в пакетах TQFP и QFN / MLF), программируемый сторожевой таймер с внутренним генератором и пять программно выбираемых режимов энергосбережения. Устройство работает в диапазоне 1,8-5,5 V.
| Параметр | Значение |
|---|---|
| Тип памяти | Flash |
| Размер памяти (для записи программ) | 32 KB |
| Скорость CPU | 20 MIPS/DMIPS (20 МГц) |
| SRAM | 2 KB |
| EEPROM | 1 KB |
| ШИМ (PWM) | 6 |
| Таймеры | 2 x 8-bit, 1 x 16-bit |
| Диапазон температур | -40 — 85 °C |
| Диапазон рабочего напряжения | 1.8 — 5.5 V |
| Цифровых контактов | 6 |
| Аналоговых контактов | 6 |
| SPI | 2 |
| I2C | 1 |
| UART | 1 |
MIPS (Millions of Instructions Per Second) — миллион команд в секунду.
Схема микроконтроллера ATmega328P
Прошивка ATmega328P с помощью Arduino
ATmega328P можно прошить с помощью UART или SPI. В данной статье будет рассматриваться прошивка через SPI, при таком подходе можно не использовать загрузчик.
Схема подключения Arduino к ATmega328P (для прошивки)
| Arduino | ATmega328P |
|---|---|
| GND | GND |
| 3.3 V | Vcc |
| 13 | PB5 (SCK) |
| 12 | PB4 (MISO) |
| 11 | PB3 (MOSI) |
| 10 | PC6 (RESET) |
Дополнительно для прошивки ATmega328P нужно добавить конденсатор на 10 мкФ. Более длинный (положительный) контакт конденсатора подключите к выводу RESET микроконтроллера, короткий (отрицательный) контакт конденсатора подключите к выводу GND.
Подготовка Arduino как ISP-программатора
- Подключить Arduino к ПК (далее будет использоваться Arduino Pro Mini);
- Запустить Arduino IDE;
- Загрузить ArduinoISP скетч (Файл -> Примеры -> 11.ArduinoISP -> ArduinoISP);
- Выбрать плату Arduino, ту которую используете (Инструменты -> Плата -> Arduino AVR Boards -> Arduino Pro Mini);
- Выбрать используемый порт (Инструменты -> Порт);
- Нажать в панели управления Arduino IDE кнопку «Загрузка»;
- После успешной загрузки скетча, Arduino может использоваться как ISP-программатор.
Установка загрузчика в ATmega328P
- Добавить поддержку ATmega328P в Arduino IDE:
- Arduino -> Preferences… -> Дополнительные ссылки для менеджера плат -> Вставить
https://mcudude.github.io/MiniCore/package_MCUdude_MiniCore_index.json - Инструменты -> Плата -> Менеджер плат -> Ввести
MiniCore-> Установить
- Выбрать плату ATmega328P (Инструменты -> Плата -> MiniCore -> ATmega328)
- Настроить плату:
- Инструменты -> Clock -> Internal 8 MHz;
- Инструменты -> BOD -> BOD 1.8V;
- Инструменты -> EEPROM -> EEPROM retained;
- Инструменты -> Compiler LTO -> LTO disabled;
- Инструменты -> Bootloader -> No bootloader;
- Выбрать программатор (Инструменты -> Программатор -> Arduino as ISP (MiniCore));
- Записать загрузчик (Инструменты -> Записать загрузчик);
- В нижней части Arduino IDE появиться надпись «Запись загрузчика завершена».
Загрузка скетча в ATmega328P
- Создайте новый скетч и скопируйте в него содержимое ниже;
- Выбрать плату ATmega328 (и если нужно настроить ее);
- Выбрать программатор (Инструменты -> Программатор -> Arduino as ISP (MiniCore));
- Загрузка скетча (Скетч -> Загрузить через программатор).
Минимальная обвязка ATmega328P
- Используйте стабилизатор питания для питания ATmega328P, например на 3.3 V. Положительный вывод подключите к VCC, а отрицательный к GND;
- Соедините выводы VCC и AVCC у микроконтроллера;
- Соедините выводы GND у микроконтроллера.
- (Не обязательно) Добавить два керамических конденсатора на 100 нФ между ножками VCC — GND и AVCC — GND.
- (Не обязательно) Между RESET и VCC установить резистор на 10 кОм (для защиты от непреднамеренного сброса).
Урок 38
Atmega 328p Pro Mini
Сегодня мы познакомимся поближе с интересной отладочной платой, выполненной на базе микроконтроллера Atmega 328p. А наибольший интерес у программистов микроконтроллеров AVR данная плата вызвала тем, что помимо того, что контроллер здесь не слабый, но, самое главное, стоит она сущие копейки. Я, например, приобретал её всего лишь за 2,7 $. В видеоверсии данного урока я описании дам ссылку на распаковку и первоначальное тестирование данной платы, а также и на продавца, у которого я её приобретал.
По данной плате есть немало видеотестов, но почему-то все они практически выполнены с применением в качестве программатора переходника USART, и, самое главное, программирование происходит посредством программы для разработки ПО для плат Arduino.
Мы же пойдём другим путём и применим данную плату уже как полноценную отладочную плату для создания приложений под управлением привычной для нас среды программирования Atmel Studio. Соттветственно, в качестве программатора мы также возьмём привычный нам народный программатор, который мы применяем во всех наших занятиях и подключим его к шине SPI.
Я думаю, будет лишним перечисление всех достоинств контроллера Atmega328p по сравнению с контроллером Atmega 8A. Здесь и оперативной памяти больше и памяти под прошивку больше, и также здесь две шины USART по сравнению с одной в восьмой серии.
Поэтому давайте не будем себя томить и приступим к делу. Начнём с того, что мы закрепим надёжно нашу плату на беспаечной макетной плате
Теперь подключим программатор Для подключения программатора я спаял вот такой переходничок
Распиновка нашей платы совпадает со стандартом Arduino UNO R3. Приводить я её здесь не буду во избежание нарушения прав. Найти данную распиновку не представляет никаких трудностей. Согласно распиновки разъём к плате подключаем следующим образом:
AVR ISP — ATMEGA328
VCC-VCC
GND-GND
RESET-RST
MOSI-11
MISO-12
SCK-13
Получится вот так
Подключим к разъёму программатор и проверим обнаружение платы. Для этого запустим программу avrdude, выберем там контроллер ATmega328P и нажмем кнопку «чтение». Программатор и контроллер должны будут обнаружиться и должны будут считаться калибровочные ячейки
Также считаем фьюзы, чтобы потом установить подобные в протеусе для корректной работы эмуляции, ну и также для того, какие именно фьюзы надо и куда устанавливать, а то ведь фьюзы — это дело такое… Для этого переходим на закладку «Fuses» и жмем там кнопку «Чтение». После этого фьюзы расставятся так, как они уже выставлены в контроллере
Теперь также подключим для тестирования 10 светодиодов. У меня, как вы знаете из моих уроков, есть 10-диодная матрица. Не забываем про токоограничивающие резисторы. Так как я данную матрицу использую ещё в тестах на контроллерах stm32, в которых граничный ток портов ниже, то резисторы там установлены на 680 ом. Менять я их не стал, светодиоды работают и с ними, возможно только светятся не так ярко, но это не страшно. Вот такая вот плата с матрицей
К отладочной плате светодиоды мы подключим следующим образом (нажмите на картинку для увеличения изображения)
Согласно стандарту Arduino соединения получатся следующие
Светодиоды — отладочная плата
GND — GMD
D1 — 2
D2 — 3
D3 — 4
D4 — 5
D5 — 6
D6 — 7
D7 — A0
D8 — A1
D9 — A2
D10 — A3
Теперь создадим проект в Atmel Studio 7 стандартным образом, выбрав в качестве контроллера Atmega 328P, Назовём проект LIGHTS.
Добавим в файл main.c объявление частоты процессора и библиотеки для задержки
#define F_CPU 16000000L
#include <avr/io.h>
#include <util/delay.h>
В функции main() настроим порты
int main(void)
{
DDRD |= 0b11111100;
PORTD &= ~(0b11111100);
DDRC |= 0b00001111;
PORTC &= ~(0b00001111);
while(1)
Также добавим код в бесконечный цикл
while(1)
{
PORTD |= 0b00000100;
_delay_ms(100);
PORTD &= ~(0b00000100);
PORTD |= 0b00001000;
_delay_ms(100);
PORTD &= ~(0b00001000);
PORTD |= 0b00010000;
_delay_ms(100);
PORTD &= ~(0b00010000);
PORTD |= 0b00100000;
_delay_ms(100);
PORTD &= ~(0b00100000);
PORTD |= 0b01000000;
_delay_ms(100);
PORTD &= ~(0b01000000);
PORTD |= 0b10000000;
_delay_ms(100);
PORTD &= ~(0b10000000);
PORTC |= 0b00000001;
_delay_ms(100);
PORTC &= ~(0b00000001);
PORTC |= 0b00000010;
_delay_ms(100);
PORTC &= ~(0b00000010);
PORTC |= 0b00000100;
_delay_ms(100);
PORTC &= ~(0b00000100);
PORTC |= 0b00001000;
_delay_ms(100);
PORTC &= ~(0b00001000);
}
Соберём код, перейдём сначала в протеус. Схему я уже показывал, файл протеуса будет в архиве вместе с проектом для студии. Добавим прошивку в настройики проекта в протеусе и настроим там микроконтроллер следующим образом:
Запустим проект. Огни в матрице должны побежать.
Теперь вернёмся в проект, так как программировать микроконтроллер мы будем опять напрямую из Atmel Studio.
Только для 328-го контроллера мы добавим другую строку в сервис. Зайдём таким же образом, как и на прошлом занятии, в меню в пункт «Сервис -> Новые инструменты». добавим там ещё один пункт, назовем его Atmega 328p, только строчку с параметрами добавим следующую
«-p m328p -c usbasp -P usb -U flash:w:$(ProjectDir)Debug$(TargetName).hex:a»
Добавляем, конечно, без кавычек. Теперь Нажимаем на наш новый пункт Сервис -> Atmega 328p и таким образом контроллер наш должен прошиться, а светодиоды по очереди будут светиться, создавая эффект бегущего огня.
Предыдущий урок Программирование МК AVR Следующий урок
Исходный код
Приобрести плату Atmega 328p Pro Mini можно здесь.
Приобрести программатор USBASP USBISP с адаптером можно здесь USBASP USBISP 3.3 с адаптером
Смотреть ВИДЕОУРОК в RuTube (нажмите на картинку)
Смотреть ВИДЕОУРОК в YouTube (нажмите на картинку)
Post Views:
5 707
Я уже довольно долго использую плату Arduino Uno, в том числе в качестве примеров для многих своих статей. Меня всегда интересовало, что потребуется для того, чтобы заставить ATmega328P (оригинальный чип, используемый на старых платах Uno) работать полностью самостоятельно. Учитывая, что Arduino делает его таким доступным благодаря своему загрузчику, приятному графическому интерфейсу и абстракции C++, интересно, зачем мне вообще хотелось попытаться это сделать. Иногда, чтобы оценить чужие достижения, важно попробовать сделать это самому. Этот проект действительно показал, сколько работы вложили создатели Arduino в этот продукт и как они изменили мир с помощью этого дружелюбного малыша.
В этой статье мы рассмотрим процесс полной настройки чипа с использованием только внешнего источника питания и программатора Atmel-ICE. Мы продемонстрируем, как общаться с чипом через встроенный последовательный интерфейс, а также как заставить мигать один или два светодиода.
Настройка среды
Существует несколько способов настройки ATmega328P. Один из таких способов, о котором, как вы уже поняли из заголовка, не говорится, заключается в том, чтобы вставить ваш чип ATmega328P в Arduino Uno, запрограммировать его, а затем перенести на макетную плату. Основываясь на отзывах на форумах, некоторые люди хотят пропустить процесс с Arduino и использовать более традиционный подход с программаторами, такими как Atmel-ICE от Microchip. Самый простой способ начать работу с микропроцессором Microchip (ранее Atmel) — установить Microchip Studio. На момент написания этой статьи полный комплект Microchip Studio поддерживается только в Windows. Поскольку мне нравится, чтобы все мои среды сборки работали в CI (Continuous Integration), я выбрал альтернативный подход.
GNU Compiler Collection (GCC) — один из самых популярных компиляторов для языка C. Он компилирует определенные платформы и архитектуры, но не для семейства чипов AVR (ATmega). Однако существует набор компиляторов для AVR и других семейств Microchip на их веб-сайте. К счастью, некоторые добрые люди даже упаковали эти компиляторы в приятные пакеты Debian, которые можно легко установить в Debian или Ubuntu следующим образом:
$ apt-get install gcc-avr binutils-avr avr-libc avrdude
С этими инструментами теперь мы можем компилировать и программировать ATmega328P только с помощью программатора Atmel-ICE и внешнего источника питания (установленного на 5В). Мы будем использовать версию GCC для AVR, чтобы скомпилировать код, и AVRDUDE для прошивки чипа ATmega328P.
Проект
Целью этого проекта было продемонстрировать некоторые базовые, но функциональные возможности ATmega328P. Простой внешний мигающий светодиод и некоторые серийные команды туда и обратно были всем, что мне нужно было, чтобы доказать, что этот чип может работать самостоятельно. В репозитории проекта я создал несколько папок в дополнение к исходному коду (названному «src»), которые помогают в разработке этого проекта.
Важным компонентом разработки программного обеспечения (включая программное обеспечение для аппаратных средств) является модульное тестирование. Модульное тестирование подтверждает, что функции или части большей системы работают как ожидается. Если кто-то вносит изменения в часть этой функциональности, модульное тестирование предотвратит регрессии (то есть вы ненамеренно сломали что-то другое, введя новую функцию). В этом примере я написал базовый модульный тест, который имитирует аппаратное обеспечение и проходит через схему инициализации библиотеки последовательной связи (USART).
В дополнение к модульному тестированию (расположенному в папке «tests»), есть также папка под названием «hil», что означает Hardware in the Loop (Аппаратное обеспечение в цикле). Эта папка содержит скрипты, необходимые для тестирования с использованием реального аппаратного обеспечения в цикле (как обсуждалось во многих моих предыдущих статьях). Это гарантирует, что мой код функционирует не только в виртуальном мире (с использованием имитаций), но и в реальном мире, проводя тесты на реальном оборудовании.
Обращение к README.md предоставит вам схему подключения для соединения программатора Atmel-ICE с чипом ATmega328P:
Рисунок 1: Распиновка Atmel ICE
Добавив несколько светодиодов, подключив порт последовательной связи к Raspberry Pi и использовав линию +5V с Raspberry Pi, вы получите полностью готовую сборку:
Рисунок 2: ATmega328P с использованием расширительной платы с Raspberry Pi и программатором Atmel-ICE
Тестирование, компиляция и еще тестирование
Разрабатывая новые функции, используйте Makefile для запуска модульных тестов и компиляции кода. После подтверждения, что ваш желаемый код делает то, что от него ожидается (через проверку модульными тестами), соберите бинарный файл, запрограммируйте его на устройство (также с помощью Makefile) и проведите тестирование Hardware in the Loop (HIL) с использованием порта последовательной связи Raspberry Pi.
Одним из самых важных моментов является правильное программирование битов предохранителей для включения внутреннего 8 МГц тактового генератора. Это документировано в README, но также добавлено в команду прошивки в Makefile:
avrdude -c atmelice_isp -p m328p -B 32 -U lfuse:w:0xe2:m
После этого вы должны быть в состоянии использовать последовательный интерфейс чипа с предположением, что встроенный тактовый генератор работает на частоте 8 МГц (как определено в верхней части main.c). Отсюда вы сможете добавить больше функциональности, такой как поддержка дополнительных последовательных команд, интерфейсы к внешним компонентам и датчикам, и все, что вы можете придумать с этим забавным маленьким микроконтроллером.
Заключение
В этой статье вы узнали, как начать работу с чипом ATmega328P без использования внешних схем, как это обычно бывает с оригинальными Arduino Uno и платами оценки Microchip. Теперь вы знаете концепцию модульного тестирования, сборки бинарных файлов, прошивки чипа и проведения тестирования с оборудованием в цикле. Кроме того, была рассмотрена важная деталь, которую часто упускают из виду, — программирование битов предохранителя для установки внутренних часов на 8 МГц. На этом этапе вы должны быть способны добавить больше функциональности с помощью дополнительных модульных и HIL-тестов и запускать все, используя только программатор Atmel-ICE и внешний источник питания 5В. Для упрощения использование Raspberry Pi в качестве источника питания и средства для серийной коммуникации будет самым простым способом контролировать процесс от начала до конца.
Исходный код проекта можно найти здесь:https://gitlab.com/embedded-designs/atmega328p-serial-led-control.
