Lazarus-AVR, №1. Программирование микроконтроллеров AVR в IDE Lazarus
Микроконтроллеры: AVR (ATmega328p); Среда программирования IDE Lazarus (кросс-платформенный 32x) (ОС: Windows 64x).
Вот появилось желание написать небольшой проектик для себя с применением микроконтроллера. В CodeVisionAVR команды не подсвечиваются по Ctrl+Пробел, да и Си что-то начал забывать, вспоминать — лень. Конечно, вспомнить Си — это 10-30 минут, но лень. Поэтому, было решено начать проект в родной IDE Lazarus, она же кросс-компилируемая! Правда, понять, как включить avr в Lazarus, чтоб компилировался hex-файл ушло 3 дня :), поэтому пишу здесь, чтоб другие не мучались, а сразу пользовались.
Использование кросс-компиляции было основано на этой статье, в дальнейшем выкинуто всё лишнее (с моей точки зрения). Показываю как это заработало у меня.
Итак, для программирования микроконтроллеров (avr, arm и др.) на Lazarus необходимо скачать дополнительные ppu-файлы и другие вспомогательные модули. Это можно сделать несколькими способами:
- fpcupdeluxe — скачивает все необходимые файлы и самостоятельно собирает кросс-компилятор: ppcrossavr.exe. Моя статья по настройке fpcupdeluxe: Lazarus-AVR, №2. Как получить компилятор для микроконтроллеров AVR с помощью Fpcupdeluxe;
- Самостоятельно скачать из репозитория и собрать кросс-компилятор (для меня этот путь показался сложным);
- по шагам wiki.freepascal.org.
Настройка целевой платформы в IDE Lazarus
1. Для настройки целевой платформы, для которого будет генериться hex-файл, необходимо указать ОС на которой будет выполняться код — embedded; семейство процессоров — avr и целевой процессор (субархитектура) — avr5, совместимы с теми, которые используются GCC (например, ATmega328p относится к avr5):
2. А так же выбрать конкретный процессор для программирования в «Параметры пользователя»:
3. Для компиляции проекта нужно указать путь к компилятору. Открываем Параметры проекта —> Команды компилятора—> Команда —> C:\fpcupdeluxe\fpc\bin\i386-win32\ppcrossavr.exe:
4. Для того, чтобы Lazarus мог найти компилятор и дополнительные файлы необходимо один раз указать пути. Это можно сделать поправив в блокноте файл Lazarus «c:\lazarus\fpc\3.2.2\bin\i386-win32\fpc.cfg» (в конце файла):
#IFDEF EMBEDDED
#IFDEF CPUAVR
-FDC:\fpcupdeluxe\cross\bin\avr-embedded
-XPavr-embedded-
-FlC:\fpcupdeluxe\cross\lib\avr-embedded$fpcsubarch\
-Fuc:\fpcupdeluxe\fpc\bin\i386-win32
-FuC:\fpcupdeluxe\fpc\units\avr-embedded$fpcsubarch
-FuC:\fpcupdeluxe\fpc\units\avr-embedded$fpcsubarch*
-FuC:\fpcupdeluxe\fpc\units\avr-embedded$fpcsubarch\rtl
-FuC:\fpcupdeluxe\fpcsrc\rtl\units\avr-embedded
-Fic:\fpcupdeluxe\fpcsrc\rtl\inc
#ENDIF CPUAVR
#ENDIF EMBEDDED
Тестирование
program Timers; uses uInterrupts, delay; //=== Entry point ============================================================= begin DDRC := $FF; // настраиваем все линии порта C на вывод //PORTC := $00; // выводим лог. 0 на все линии порта C //=== Main loop ========================================= while True do begin PORTC := $FF; // выводим лог. 1 на все линии порта C delay_ms(1000); // задержка 1000 мс = 1 с PORTC := $00; // выводим лог. 0 на все линии порта C delay_ms(1000); // задержка 1000 мс = 1 с end;//Main loop end.
Процедуру задержки можно взять с ресурса: https://github.com/ccrause/fpc-avr
Компиляция Ctrl+F9 заняла 0,1 сек в результате чего появились 3 файла: hex, bin и elf. Загружаем hex-файл в модель и видим, что прошивка работает:
Осваиваем микроконтроллеры на примере Atmega8
В рамках данной статьи мы не станем сильно погружаться в многообразие внутренних процессов и дебри архитектуры микроконтроллера. А основной нашей задачей будет являться – освоение азов практической работы с микроконтроллером и получение навыков для самостоятельной разработки и изготовления какого-либо интересующего нас электронного устройства.
В качестве подопытного предлагаю выбрать популярный и довольно высокопроизводительный 8-разрядный AVR микроконтроллер Atmega8 в удобном для наших целей 28-выводном DIP корпусе.
Итак, что нам нужно для полного счастья?
1. Простая и, в приоритете, бесплатная среда разработки, в которой можно посредством слов и цифр написать программу, а затем скомпилировать её, т. е. перевести на язык, понятный микроконтроллеру.
Одним из удачных примеров такой среды является Atmel Studio. Скачать эту программу не составит никакого труда, в том числе и на официальном сайте разработчика – https://www.microchip.com/.
2. Отладочная плата для микроконтроллера, желательно с DIP28 панелькой для микросхемы.
Удачным вариантом такой платы я бы посчитал изделие под названием «плата разработки ATmega8 – сделай сам», предлагаемое нашими китайскими друзьями за символические 150 отечественных рублей.
В комплект поставки входят:
– собственно, сама плата;
– Панелька DIP28;
– Кварцевый резонатор на 8 МГц;
– Разъём для подключения программатора;
– Разные деталюшки в виде: конденсаторов, резисторов, кнопок, светодиодов, т. е. всего того, что позволит легко запрограммировать и проверить микропроцессор в работе.
Можно, конечно, обойтись и без отладочной платы и произвести прошивку ATmega8 непосредственно в готовом устройстве, тем более что микропроцессор это сделать позволяет. Однако на практике произвести эти манипуляции заранее, а уже потом устанавливать микросхему по месту прописки оказывается значительно удобнее.
3. Программатор AVR USB, для того чтобы запрограммировать микроконтроллер, то есть перенести в него информацию с компьютера.
Такой программатор оценивается на aliexpress примерно в ту же стоимость, что и предыдущее изделие.
Программатор подсоединяется к USB порту компьютера, а другим своим концом к плате микроконтроллера.
Данное соединение осуществляется через ISP разъём кабеля, который также входит в комплект поставки.
Питание берётся от USB разъёма компьютера.
Работать программатор может под разными операционными системами, в том числе – под Windows.
Если тип приобретённого программатора не будет поддерживаться Atmel Studio, то придётся скачать и бесплатную программу прошивки микроконтроллеров, например, AVRDude.
4. Контактная макетная плата для монтажа без пайки.
Такая макетная плата совместно с набором соединительных проводов (джамперов) будет весьма полезна на начальном этапе освоения микроконтроллера.
Она без какого-либо напряга и паяльника позволит соединить любые электронные элементы обвеса микроконтроллера в единую конструкцию, превращая весь процесс создания схемы в увлекательную игру с конструктором LEGO.
Подобный набор, состоящий из беспаечной макетной платы и комплекта проводов, обойдётся не дороже 200 рублей.
5. Для того чтобы в процессе отладки не перепрошивать ATmega8 бесчисленное количество раз, жизненно необходима программа, позволяющая отладить прошивку без участия микроконтроллера.
Для этой цели как нельзя лучше подходит программа для автоматизированного проектирования электронных схем (в том числе и микроконтроллеров) – Proteus. Она значительно упрощает процесс отладки программы без участия микроконтроллера, ведь любой накопитель имеет конечное число перезаписей, хотя это число и достаточно большое.
6. Если написать и отладить программу для микроконтроллера можно и без его непосредственного участия, то, по-любому, рано или поздно встанет конкретный вопрос: «А на фига мы всё это делали?».
Поэтому хочешь, не хочешь, а приобрести ATmega8 нам также всё ж таки придётся. Стоит она на Али, как и всё остальное, довольно-таки гуманных денег – около 100 рублей за единицу продукции, поэтому кошелёк опорожнит не сильно, но уважительного к себе отношения потребует.
А теперь давайте-ка посмотрим: А что это за штука 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.
А на следующих страницах будем осваивать язык программирования, а также запускать несложные устройства, выполненные на микроконтроллерах.