Site Loader

Содержание

Первая программа для AVR микроконтроллера на Ассемблере

Приведен и подробно разобран пример простой программы для AVR микроконтроллера на языке Ассемблер (Assembler). Собираем простую схему на микроконтроллере для мигания светодиодами, компилируем программу и прошиваем ее в микроконтроллер под ОС GNU Linux.

Содержание:

  1. Подготовка
  2. Принципиальная схема и макет
  3. Исходный код программы на Ассемблере
  4. Документация по Ассемблеру
  5. Работа с числами в Hex, Bin и Dec
  6. Компиляция и прошивка программы в МК
  7. Заключение

Подготовка

Итак, у нас уже есть настроенный и подключенный к микроконтроллеру программатор, также мы разобрались с программой avrdude, изучили ее настройки и примеры использования. Пришло время разработать свою первую программу, которая будет выполнять какие-то реальные действия с AVR микроконтроллером (МК).

Писать программу мы будем на языке программирования Ассемблер (Assembler, Asm). Основной ее задачей будет заставить поочередно и с установленной задержкой мигать два разноцветных светодиода (красный и синий), имитируя таким образом полицейскую мигалку.

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

Понятное дело что подобную мигалку можно реализовать на основе простого мультивибратора на двух транзисторах с конденсаторами. Микроконтроллер же вам предоставляет намного больше возможностей.

Используя один чип можно оживить полицейскую мигалку + заставить раз в несколько секунд мигать модель авто фарами, добавить различные звуковые эффекты, научить модельку ездить реагируя на препятствия и многое другое.

Первый инструмент, который нам понадобится — редактор исходного кода, здесь можно использовать любой текстовый редактор. В одной из прошлых статей мы рассматривали настройку среды разработки программ Geany для программирования AVR микроконтроллеров с использованием языков Ассемблера и Си.

В принципе там уже все готово, останется написать код программы и поочередным нажатием двух кнопок (Compile-Flash) скомпилировать и прошить программу в микроконтроллер.

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

Принципиальная схема и макет

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

Рис. 1. Принципиальная схема мигалки на светодиодах и микроконтроллере ATmega8.

Примечание: принципиальная схема нарисована за несколько минут в программе Eeschema, которая входит в комплекс программ EDA(Electronic Design Automation) KiCAD (для Linux, FreeBSD, Solaris, Windows). Очень мощный профессиональный инструмент, и что не мало важно — свободный!

Схема устройства состоит из микроконтроллера ATmega8 и двух светодиодов, которые подключены через гасящие резисторы. К микроконтроллеру подключен ISP-коннектор для осуществления программирования через программатор. Также предусмотрены клеммы для подключения внешнего источника питания напряжением 5В.

То как выглядит данная схема в сборе на макетной баспаечной панели (BreadBoard) можно посмотреть на рисунке ниже:

Рис. 2. Конструкция светодиодной мигалки на микроконтроллере ATmega8.

К микроконтроллеру подключен программатор USBAsp, используя ISP интерфейс, от него же и будет питаться наша экспериментальная конструкция. Если нужно запитать конструкцию от внешнего источника питания напряжением 5В то достаточно его подключить к + и — линиям питания панели.

Исходный код программы на Ассемблере

Разработанная нами программа будет попеременно зажигать и гасить два светодиода. Светодиоды подключены к двум пинам PD0 и PD1 микроконтроллера.

Ниже приведен исходный код программы на Ассебмлере(Assembler, Asm) для микроконтроллера ATmega8. Сохраните этот код в файл под названием leds_blinking. asm для последующей работы.

; Светодиодная мигалка на микроконтроллере ATmega8
; https://ph0en1x.net

.INCLUDEPATH "/usr/share/avra/" ; путь для подгрузки INC файлов
.INCLUDE "m8def.inc"            ; загрузка предопределений для ATmega8
.LIST                           ; включить генерацию листинга

.CSEG                           ; начало сегмента кода
.ORG 0x0000                     ; начальное значение для адресации

; -- инициализация стека --
LDI R16, Low(RAMEND)  ; младший байт конечного адреса ОЗУ в R16
OUT SPL, R16          ; установка младшего байта указателя стека
LDI R16, High(RAMEND) ; старший байт конечного адреса ОЗУ в R16
OUT SPH, R16          ; установка старшего байта указателя стека

.equ Delay = 5        ; установка константы времени задержки

; -- устанавливаем пины PD0 и PD1 порта PORTD (PD) на вывод --
LDI R16, 0b00000011   ; поместим в регистр R16 число 3 (0x3)
OUT DDRD, R16         ; загрузим значение из регистра R16 в порт DDRD

; -- основной цикл программы --
Start:
    SBI PORTD, PORTD0 ; подача на пин PD0 высокого уровня
    CBI PORTD, PORTD1 ; подача на пин PD1 низкого уровня
    RCALL Wait        ; вызываем подпрограмму задержки по времени
    SBI PORTD, PORTD1 ; подача на пин PD1 высокого уровня
    CBI PORTD, PORTD0
    RCALL Wait
    RJMP Start        ; возврат к метке Start, повторяем все в цикле

; -- подпрограмма задержки по времени --
Wait:
    LDI  R17, Delay   ; загрузка константы для задержки в регистр R17
WLoop0:  
    LDI  R18, 50      ; загружаем число 50 (0x32) в регистр R18
WLoop1:  
    LDI  R19, 0xC8    ; загружаем число 200 (0xC8, $C8) в регистр R19
WLoop2:  
    DEC  R19          ; уменьшаем значение в регистре R19 на 1
    BRNE WLoop2       ; возврат к WLoop2 если значение в R19 не равно 0 
    DEC  R18          ; уменьшаем значение в регистре R18 на 1
    BRNE WLoop1       ; возврат к WLoop1 если значение в R18 не равно 0
    DEC  R17          ; уменьшаем значение в регистре R17 на 1
    BRNE WLoop0       ; возврат к WLoop0 если значение в R17 не равно 0
RET                   ; возврат из подпрограммы Wait

Program_name: .
DB "Simple LEDs blinking program"

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

Все строки и части строк, которые начинаются с символа «;» — это комментарии. При компиляции и выполнении программы такие строчки игнорируются, они служат для документирования и примечаний.

При помощи директивы «.INCLUDEPATH» мы указываем путь «/usr/share/avra/», по которому компилятору нужно искать файлы для включения их в текущий файл с использованием директив «.INCLUDE«. В нашем примере подключается файл, полный путь к которому будет выглядеть вот так: «/usr/share/avra/m8def.inc».

Директива «.LIST» указывает компилятору о необходимости генерирования листинга с текущего места в коде, отключить генерирование можно директивой «.NOLIST». Листинг представляет собой файл в котором содержится комбинация ассемблерного кода, адресов и кодов операций.

Используется для отладки и других полезных нужд.

Директива «.CSEG» (CodeSEGment) определяет начало программного сегмента (код программы что записан во флешь-память) — сегмента кода. Соответственно все что размещено ниже этой директивы относится к программному коду.

Для определения сегмента данных (RAM, оперативная память) или памяти EEPROM используются директивы «.DSEG» и «.ESEG» соответственно. Таким образом выполняется распределение памяти по сегментам.

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

При помощи директивы «.ORG» компилятору указывается начальный адрес «0x0000» сегмента, в данном случае мы указали начальный адрес сегмента кода. В данной программе эту директиву можно было бы и не использовать, поскольку по умолчанию адрес программного кода всегда 0x0000.

Дальше в коде происходит инициализация стека.

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

При вызове подпрограммы flhtc nt записывается в стек и начинается выполнение кода подпрограммы. По завершению подпрограммы (директива RET)

Стек работает по принципу LIFO (Last In — First Out, последним пришёл — первым вышел). Для адресации вершины стека используется указатель стека — SP (Stack Pointer), это может быть однобайтовое или двухбайтовое значение в зависимости от доступного количества SRAM памяти в МК.

При помощи инструкции «LDI» мы загружаем в регистр R16 значение младшего байта конечного адреса ОЗУ «Low(RAMEND)» (предопределенная константа в файле m8def.inc что содержит адрес последней ячейки SRAM), а потом при помощи инструкции OUT выполняем загрузку данного значения из регистра R16 в порт SPL (Stack Pointer Low). Таким же образом производится инициализация старшего байта адреса в указателе стека

SPH.

Инструкция LDI используется для загрузки старшего и младшего значений из константы в регистр общего назначения. А инструкция OUT позволяет выполнить операцию загрузки с немного иной спецификой — из регистра общего назначения в регистр периферийного устройства МК, порт ввода-вывода и т.п.

Если не произвести инициализацию стека то возврат из подпрограмм станет невозможным, к примеру в приведенном коде после выполнения инструкции перехода к подпрограмме «RCALL Wait» возврат не будет выполнен и программа не будет работать как нужно.

Директива «.equ» выполняет присвоение указанному символьному имени «Delay» числового значения «5», по сути мы объявили константу. Имя константы должно быть уникальным, а присвоенное значение не может быть изменено в процессе работы программы.

Дальше мы устанавливает два канала (пины PD0, PD1) порта DDRD (PortD) на вывод, делается это загрузкой двоичного значения 0b00000011 (0x3, число 3) в регистр R16 с последующим выводом этого значения из него в порт DDRD при помощи команды OUT.

По умолчанию все каналы (пины) порта настроены на ввод. При помощи двоичного числа 0b00000011, где последние биты установлены в 1, мы переводим каналы PD0 и PD1 в режим вывода. 

Начиная с метки «Start:» начинается основной рабочий цикл нашей программы, эта метка послужит нам для обозначения начального адреса основного цикла и позже будет использована для возврата.

При помощи инструкции «SBI» выполняем установку бита PORTD0 (предопределен в файле m8def.inc) в порте PORTD чем установим на пине PD0 высокий уровень. Используя инструкцию «CBI» выполняется очистка указанного (PORTD1) бита в порте PORTD и тем самым устанавливается низкий уровень на пине PD1.

Дальше с помощью инструкции RCALL выполняем относительный вызов подпрограммы

которая начинается с метки «Wait:«. Здесь для запоминания адреса возврата уже используется стек, который мы инициализировали в начале программы.

После завершения подпрограммы (в нашем случае ее функция — задержка по времени) программа вернется к позиции где был выполнен вызов подпрограммы (адрес возврата будет получен из стека) и с этого места продолжится выполнение последующих операторов.

После вызова подпрограммы задержки «Wait» следуют вызовы инструкций SBI и CBI в которых выполняется установка битов порта PORTD таким образом, что теперь на пине PD0 у нас будет низкий уровень, а на пине PD1 — высокий.

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

Таким образом выполняется реализация бесконечного цикла в котором будут «дергаться» пины порта PORTD микроконтроллера и поочередно зажигаться/гаснуть светодиоды которые подключены к каналам данного порта (пины PD0, PD1).

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

При помощи инструкций «BRNE» (условный переход) выполняется анализ нулевого бита статусных флагов процессора (Zero Flag, ZF). Переход на указанную в инструкции метку будет выполнен если после выполнения предыдущей команды нулевой флаг был установлен. В данном случае проверяется значение нулевого флага после выполнения команд «DEC» над значениями которые хранится в регистрах общего назначения (R17, R18, R19). Инструкция «BRNE» требует 1/2 такта процессора.

Таким образом, использовав несколько вложенных циклов, ми заберем у ЦПУ некоторое количество тактов и реализуем нужную задержку по времени, которая будет зависеть от количества итераций в каждом цикле и от установленной частоты микропроцессора.

По умолчанию, без установки фьюзов что задают источник и частоту тактового генератора, в микроконтроллере ATmega8 используется откалиброванный внутренний RC-генератор с частотой 1МГц. Если же мы изменим частоту МК на 4Мгц то наши светодиоды начнут мигать в 4 раза быстрее, поскольку на каждую операцию вычитания и сравнения будет тратиться в 4 раза меньше времени.

Завершается подпрограмма инструкцией «RET«, которая выполняет возврат из подпрограммы и продолжение выполнения инструкций с того места, с которого эта подпрограмма была вызвана (на основе сохраненного адреса возвращения, который сохранился в стеке при вызове инструкции «RCALL»).

При помощи директивы «.DB» в памяти программ (флешь) резервируется цепочка из байтов под строчку данных «Simple LEDs blinking program», эти данные являются статичными и их нельзя изменять в ходе работы программы. Для резервирования слов (Double Word) нужно использовать директиву «.DW».

В данном случае, у нас во FLASH-память вместе с программным кодом будет записана строка «Simple LEDs blinking program«, которая содержит название программы. Данные из этой строчки нигде в программе не используются и приведены в качестве примера.

При каждом резервировании данных с использованием директивы «.DB» или «.DW» должна предшествовать уникальная метка, которая пригодится нам когда нужно будет получить адрес размещаемых данных в памяти для дальнейшего их использования, в нашем случае это «Program_name:«.

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

Эти данные можно разместить и в начале кода, использовав операторы перехода для изоляции этих байтов от выполнения:

RJMP DataEnd
Program_name: .DB "Simple LEDs blinking program"
DataEnd:

Документация по Ассемблеру

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

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

Приведу несколько полезных документов, которые вы можете скачать и использовать для справки при разработке программ на AVR ASM.

Справка по Ассемблеру для Atmel AVR (перевод Руслана Шимкевича): atmel-avr-assembler-quick-doc-ru.zip (16Кб, HTML, RU).

Справка по инструкциям Atmel Assembler: atmel-avr-instruction-set-manual-en.pdf.zip (700Кб, PDF, EN, 2015).

Работа с числами в Hex, Bin и Dec

В коде программы для загрузки значений в регистры используются числа и в скобках приведены их значения в шестнадцатеричной системе счисления, например: «50 (0x32, )». В двоичной системе счисления числа указываются в формате «0b00000011». Для удобной переконвертации чисел из шестнадцатеричной системы счисления в десятичную, двоичную и наоборот отлично подходит программный калькулятор из среды рабочего окружения KDE — KCalc.

Рис. 3. KCalc — простое и эффективное решение для пересчета между разными системами счисления.

В настройках (Settings) нужно выбрать режим (Numeral System Mode), после чего программа приобретет вид что на рисунке выше. Переключаться между системами счисления можно устанавливая флажки в полях «Dec», «Hex», «Bin». Для примера: переключаемся в Hex и набираем «FF», потом переключаемся в Dec и видим число в десятичной системе счисления — 255, просто и удобно.

В операционной системе GNU Linux с рабочей средой GNOME (например Ubuntu) также есть подобный калькулятор, это программа — galculator.

Компиляция и прошивка программы в МК

 Итак, у нас уже есть полный код программы, который мы сохранили в файл с именем «leds_blinking.asm». Теперь самое время скомпилировать его, делается это нажатием кнопки «Compile» в предварительно настроенной среде Geany или же отдельной командой в консоли:

avra --includepath /usr/share/avra/ leds_blinking.asm

Если результат выполнения будет без ошибок то мы получим файл прошивки в формате Intel HEX — «leds_blinking. hex», который уже можно прошивать во флешь-память микроконтроллера.

Примечание: опцию «—includepath /usr/share/avra/» можно и не указывать, поскольку в файле с исходным кодом уже была указана директива «.INCLUDEPATH» для поиска файлов с предопределениями для разных моделей МК.

Осталось прошить микроконтроллер используя полученный файл «leds_blinking.hex». В примере я использую программатор USBAsp и микроконтроллер ATmega8, вот так выглядит команда для записи получившегося файла во флешь-память МК:

avrdude -p m8 -c usbasp -P usb -U flash:w:leds_blinking.hex

Примечание: в команде используется относительный путь к файлу leds_blinking.hex, поэтому для успешного выполнения команды нужно перейти в терминале(консоли) в директорию где находится данный файл.

Сразу же после прошивки флешь-памяти на микроконтроллер поступит команда сброса (RESET) и программа начнет выполняться, об єтом будут свидетельствовать два попеременно мелькающих светодиода.

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

Заключение

Увеличив значение константы «Delay» можно уменьшить частоту мерцания светодиодов, а уменьшив — увеличить частоту. Также можете попробовать добавить несколько светодиодов к свободным каналам порта (PD2-PD7) и модифицировать программу таким образом чтобы получить бегущий огонь из светодиодов.

В заключение приведу краткое видео работы рассмотренной схемы на двух светодиодах:

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

Начало цикла статей: Программирование AVR микроконтроллеров в Linux на языках Asembler и C.

Информатика в 2086

На главную Назад Вперёд

Общая информация

Эта глава (и несколько следующих) посвящены программированию 8-битных микроконтроллеров семейства ATMega328, выпускаемых фирмой Atmel и использующихся повсеместно во всевозможных преобразователях сигналов и системах управления. Архитектура AVR, на которой основаны упомянутые микроконтроллеры, достаточно проста для использования в учебных целях и достаточно репрезентативна для того, чтобы составить представление об устройстве ЭВМ и об их программировании на уровне машинных кодов.

Для начала перечислим основные характеристики микроконтроллера ATMega328 и кратко прокомментируем их смысл.

Тактовая частота: регулируемая, не более 20 МГц. Частота (в герцах) – количество тактов, подаваемых на микросхему за одну секунду. Исполнение одной команды занимает один или несколько тактов (это утверждение, вообще говоря, не верно для более современных архитектур; например, для x86_64, используемой на персональных компьютерах).

Оперативная память: 2048 байт. Используется для хранения промежуточных данных, используемых для нужд решаемой задачи. Хранит данные только пока устройство включено. При выключении или перезагрузке устройства данные из оперативной памяти теряются.

EEPROM: 1024 байта. Хранит данные даже при выключенном питании. Используется в первую очередь для параметризации решаемой устройством задачи.

Память программы: 32768 байт. Хранит программу в виде последовательности команд. Большинство команд занимают 2 байта. Незначительное количество команд занимают 4 байта. Обычно последние 1-2 килобайта заняты программой-загрузчиком, которая позволяет обновлять программу, записанную в устройство, при помощи последовательного входа.

Структура оперативной памяти

Первые 256 байт оперативной памяти ATMega328 имеют специальную роль. Байты с 0го по 31й (нумерация байт традиционно начинается с нуля) называются рабочими регистрами. Рабочие регистры могут являться операндами для команд процессора. Всем командам, использующим рабочие регистры, доступны регистры с 16го по 31й. Некоторым командам доступны и первые 16 рабочих регистров. Рабочие регистры имеют традиционные названия: r0, r1, r2, … r31. Пара регистров r26 и r27 известна под названием X. Пара регистров r28 и r29 называется Y. Последняя пара регистров (r30 и r31) называется Z.

Остальные 224 байта называются регистрами ввода-вывода и используются для общения с периферией.

Ассемблер

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

Для трансляции программ мы будем использовать приложение-ассемблер GNU as. Для Windows это приложение доступно в составе приложения WinAVR. Для POSIX-систем это приложение входит в состав GNU binutils.

Сборка программы происходит в четыре этапа.

  1. Текст программы записывается в текстовый файл (далее – foobar. S).

  2. Текст программы скармливается приложению avr-as командой

    avr-as foobar.S -o foobar.o
  3. Полученный промежуточный файл скармливается приложению avr-ld командой

    avr-ld foobar.o -o foobar.elf
  4. Полученный файл скармливается приложению avr-objcopy командой

    avr-objcopy -O ihex foobar.elf foobar.hex

Итоговый файл foobar.hex содержит машинный код программы в формате Intel Hex. Этот формат де факто является стандартным для приложений, записывающих программу в память микроконтроллера.

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

Пример программы

Приведём пример программы, складывающей числа 12 и 21.

LDI r16, 12
LDI r17, 21
ADD r16, r17
barrier:
RJMP barrier

В ней мы видим 4 команды и метку barrier. Метка не соответствует никакой команде процессора и используется только как аргумент для команд перехода.

Собрав эту программу так, как описано в предыдущем разделе, и выполнив её в эмуляторе, можно наблюдать как сначала в регистр r16 попадает число 12, затем в регистр r17 попадает число 21, затем сумма этих чисел записывается в регистр r16, после чего программа зацикливается на последней инструкции.

Некоторые команды процессоров архитектуры AVR

Здесь перечислены те команды, которые нам понадобятся на первых порах.

Для перемещения данных используются следующие команды:

  • LDI куда, что – перемещение указанного числа в указанный регистр
  • LD куда, откуда – перемещение байта из оперативной памяти в указанный регистр; второй аргумент – либо X, либо Y, либо Z – задаёт пару регистров, в которой записан адрес ячейки памяти
  • MOV куда, откуда – перемещение байта из регистра в регистр
  • ST куда, откуда – перемещение байта из регистра в оперативную память; первый аргумент – X, Y или Z

Арифметические операции (наиболее важные):

  • ADD куда, откуда – прибавление числа из указанного регистра к числу в указанном регистре
  • SUB куда, откуда – вычитание числа из указанного регистра из числа в указанном регистре
  • SUBI куда, что – вычитаение указанного числа из числа в указанном регистре (обратите внимание, что команды ADDI нет; SUBI для большинства целей заменяет ADDI)
  • NEG что – изменение числа в указанном регистре на противоположное
  • AND куда, откуда – поразрядная конъюнкция чисел в указанных регистрах
  • OR куда, откуда – поразрядная дизъюнкция чисел в указанных регистрах
  • EOR куда, откуда – поразрядная исключающая дизъюнкция чисел в указанных регистрах
  • ANDI куда, что – поразрядная конъюнкция указанного числа и числа в указанном регистре
  • ORI куда, что – поразрядная дизъюнкция указанного числа и числа в указанном регистре (обратите внимание, что команды EORI нет)

Сложение и вычитание производятся в арифметике по модулю 256, т. е с «переходом» через 0. Если такой переход произошёл, то этот факт запоминается выставлением 1 в специальный бит переноса (carry flag). Если перехода не было, в бит переноса попадает 0.

  • ADC куда, откуда – прибавление суммы числа из указанного регистра и бита переноса к числу в указанном регистре
  • SBC куда, откуда – вычитание суммы числа из указанного регистра и бита переноса из числа в указанном регистре
  • INC что – увеличение значения в указанном регистре на 1; бит переноса не затрагивается
  • DEC что – уменьшение значения в указанном регистре на 1; бит переноса не затрагивается

Также результат арифметических операций отражается на бите нуля: он выставляется, если результат операции равен нулю.

Эти биты можно исползовать для условных переходов:

  • BREQ метка – переход по метке, если выставлен бит нуля
  • BRNE метка – переход по метке, если не выставлен бит нуля
  • BRCS метка – переход по метке, если выставлен бит переноса
  • BRCC метка – переход по метке, если не выставлен бит переноса

Также есть безусловный переход:

  • RJMP метка – переход по метке

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

Упражнения

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

  1. Напишите программу, которая ставит в регистр r0 единицу, если число, записанное в r16, больше числа, записанного в r17, и 0 – в противном случае.
;; Решение. Здесь и далее считается, что входные данные уже заданы.
start:  ;; часть меток используется просто в качестве комментариев
  SUB r17, r16
  BRCC greater_or_equal
less:
  LDI r16, 1
  MOV r0, r16
  RJMP end
greater_or_equal:
  LDI r16, 0
  MOV r0, r16
end:
  RJMP end
  1. Напишите программу, которая ставит в регистр r0 единицу, если число, записанное в r16, не меньше числа, записанного в r17, и 0 – в противном случае.
start:
  SUB r16, r17
  BRCC greater_or_equal
less:
  LDI r16, 0
  MOV r0, r16
  RJMP end
greater_or_equal:
  LDI r16, 1
  MOV r0, r16
end:
  RJMP end
  1. Напишите программу, которая ставит в пару регистров r0 и r1 сумму чисел, записанных в регистры r16 и r17. Младшие 8 бит суммы должны оказаться в регистре r0.
start:
  LDI r18,0
  MOV r1, r18
  MOV  r0, r16
  ADD  r0, r17
  ADC  r1, r18
end:
  RJMP end
  1. Напишите программу, которая ставит в пару регистров r0 и r1 произведение чисел, записанных в регистры r16 и r17. Младшие 8 бит произведения должны оказаться в регистре r0.
start:
  LDI r18, 0
  MOV r0, r18
  MOV r1, r18
  
  ;; это довольно стандартная проверка на равенство:
  SUB  r17, r18  
  BREQ end
  
loop:
  ADD  r0, r16
  ADC  r1, r18
  DEC  r17
  BRNE loop
end:
  RJMP end
  1. Программа получает на вход два числа (в регистрах r16 и r17). На выходе (в регистре r0) должен оказаться остаток от деления r16 на r17. Если r17=0, то в регистре r1 должен оказаться код ошибки 1. В противном случае код ошибки должен быть равен 0.

  2. Программа получает на вход два числа (в регистрах r16 и r17). На выходе (в регистре r0) должно оказаться неполное частное от деления r16 на r17. Если r17=0, то в регистре r1 должен оказаться код ошибки 1. В противном случае код ошибки должен быть равен 0.

  3. Программа получает на вход число (в регистре r16). На выходе (в регистрах r0 и r1) должна оказаться сумма всех целых чисел от 1 до r16. Разряд r0 – младший.

  4. Программа получает на вход число (в регистре r16). На выходе (в регистрах r0 и r1) должно оказаться произведение всех целых чисел от 1 до r16 (взятое по модулю 65536). Разряд r0 – младший.

  5. Программа получает на вход два числа (в регистрах r16 и r17). На выходе (в регистре r0) должен оказаться их НОД. Считается, что НОД пары нулей равен нулю.

Марка: Программирование AVR [Книга]

Описание книги

Микроконтроллеры AVR от Atmel — это чипы, на которых работает Arduino, и они являются популярными чипами для многих проектов по взлому оборудования и любителей. В этой книге вы отложите в сторону уровни абстракции, предоставляемые средой Arduino, и научитесь напрямую программировать микроконтроллеры AVR. При этом вы приблизитесь к чипу и сможете выжать из него больше мощности и возможностей.

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

Содержание

  1. Предисловие
    1. Почему эта книга?
      1. Тип программного обеспечения или тип оборудования?
      2. Манифест!
    2. Тебе понадобится…
      1. Базовый комплект
      2. Для базовых проектов
      3. Для промежуточных проектов
      4. Для глав Motors и H-Bridge
      5. Делюкс и оборки
    3. Условные обозначения, используемые в этой книге
    4. Использование примеров кода
    5. Safari® Книги онлайн
    6. Как с нами связаться
    7. Благодарности
  2. I. Основы
    1. 1. Введение
      1. Что такое микроконтроллер? Большая картина
        1. Компьютер на чипе…
        2. …Но очень маленький компьютер
        3. Что могут микроконтроллеры?
      2. Аппаратное обеспечение: общая картина
        1. Ядро: процессор, память и ввод-вывод
        2. Периферийные устройства: делаем вашу жизнь проще
    2. 2. Программирование AVR
      1. Программирование AVR
        1. Цепочка инструментов
          1. Обзор цепочки инструментов
      2. Цепочка программных инструментов
        1. Настройка Linux
        2. Установка Windows
        3. Настройка Mac
        4. Настройка Ардуино
        5. Make и файлы Makefile
      3. AVR и Ардуино
        1. Плюсы Ардуино
        2. Минусы Ардуино
        3. Arduino: аппаратное или программное обеспечение? Оба!
        4. Arduino — это AVR
          1. Написание C в Arduino IDE
          2. Прошиваем Arduino как цель
        5. Arduino — программатор AVR
          1. Подключение вашего Arduino в качестве флеш-программатора
          2. Прошивка микросхем AVR с помощью Arduino в качестве программатора
          3. Использование Arduino в качестве аппаратного программатора без Arduino IDE
      4. Другие программисты аппаратного обеспечения
        1. Flash-программисты, которых я знал и любил
      5. Начало работы: мигающие светодиоды
        1. Монтировать
        2. Заголовки интернет-провайдера
        3. АВРДУДЕ
          1. Ошибки AVRDUDE
        4. Настройка вашего Makefile
        5. Вспышка
        6. Поиск неисправностей
    3. 3. Цифровой выход
      1. мерцаниеLED Редукс
        1. Структура кода AVR C
        2. Аппаратные регистры
          1. Аппаратные регистры: итог
          2. Три самых важных аппаратных регистра
          3. Настройка вывода: DDR, PORTs
        3. Сводка по мигающим светодиодам
      2. Игрушка от первого лица
        1. Создание схемы
          1. Мигающие огни
          2. Простейшая игрушка от первого лица
          3. МОП-транзистор обман
        2. Красивые узоры: код игрушек от первого лица
        3. Эксперимент!
    4. 4. Сверление бит
      1. Работа с кодом: глаза Сайлона
      2. Бит Твиддлинг и Глаза Сайлона
        1. Битовый сдвиг
      3. Усовершенствованное вращение бит: выше и дальше глаз Сайлона
        1. Установка битов с помощью ИЛИ
        2. Переключение битов с помощью XOR
        3. Очистка бита с И и НЕ
      4. Хвастаясь
      5. Краткое содержание
    5. 5. Последовательный ввод/вывод
      1. Последовательная связь
      2. Реализация последовательной связи на AVR: Loopback Project
        1. Настройка: настройка AVR
        2. Настройка: ваш компьютер
        3. Настройка: последовательный USB-адаптер
        4. Собираем все вместе: протестируйте свою петлю
        5. Устранение неполадок с последовательными соединениями
      3. Настройка USART: мельчайшие детали
      4. Прямоугольный орган AVR
        1. Создание музыки с помощью вашего Micro
          1. усиление
        2. Органная библиотека
        3. Код
        4. Дополнительные вкусности
      5. Краткое содержание
    6. 6. Цифровой вход
      1. Кнопки, переключатели и т.д.
        1. Настройка ввода: DDR, порты и PIN-коды
        2. Интерпретация нажатий кнопок
          1. Проверка битов с И
          2. Удобные макросы GCC
          3. Демонстрационный код simpleButton
      2. Изменение состояния
      3. устранение дребезга
        1. Пример отказа
      4. Музыкальная шкатулка AVR
        1. Код
      5. Кнопка босса
        1. Сценарии на стороне рабочего стола
        2. Расширения
    7. 7. Аналого-цифровое преобразование I
      1. Обзор аппаратного обеспечения АЦП
      2. Светомер
        1. Цепь
          1. контакты питания АЦП
          2. Альтернатива LDR: потенциометр
        2. Код
        3. Инициализация АЦП
        4. Расширения
      3. Слоускоп
        1. Код AVR
        2. Код рабочего стола
        3. Синергия
      4. AVR Night Light и мультиплексор
        1. Мультиплексирование
        2. Установка битов мультиплексирования
        3. Цепь
        4. Код
      5. Краткое содержание
  3. II. Промежуточный AVR
    1. 8. Аппаратные прерывания
      1. Внешние прерывания 101: Примеры нажатия кнопок в реальном времени
        1. Пример внешнего прерывания 0
        2. Пример прерывания смены контакта
      2. Емкостный датчик
        1. Датчик
        2. Код
        3. Глобальные, изменчивые переменные
          1. Ключевое слово volatile
          2. В сторону: volatile в циклах for
        4. Отладка схемы
    2. 9. Введение в оборудование таймера/счетчика
      1. Таймер/счетчики: почему и как?
      2. Проверьте свое время реакции
      3. Использование таймера 0 для улучшения 8-битного органа
      4. АМ-радио
        1. Цепь
        2. Скорость процессора
          1. Установка фьюз-битов
          2. Установка скорости процессора в коде
        3. AM-радио: Кодекс
      5. Краткое содержание
    3. 10. Широтно-импульсная модуляция
      1. Яркие и тусклые светодиоды: ШИМ
      2. Демонстрация ШИМ грубой силы
      3. Демонстрация ШИМ таймеров
        1. Инициализация таймеров для режима PWM
      4. ШИМ на любом выводе
        1. ШИМ на любом демо выводе
      5. Закрытие: альтернативы PWM и контрольный список таймера
    4. 11. Управление серводвигателями
      1. Сервоприводы
        1. Тайная жизнь сервоприводов
        2. Цепь
        3. Код
      2. Солнечные часы с сервоприводом
        1. Сборка
        2. Готовьте лазеры!
        3. Код
          1. Главный и сервопривод
          2. Заголовок
          3. Часы
          4. Последовательный ввод/вывод
        4. Калибровка сервопривода солнечных часов
    5. 12. Аналого-цифровое преобразование II
      1. Измеритель напряжения
        1. Цепь
          1. Масштабирование напряжения в целом
        2. Код
          1. Режим сна
          2. Передискретизация
      2. Детектор шагов
        1. Цепь
        2. Теория
        3. Экспоненциально взвешенные скользящие средние
        4. Код
      3. Краткое содержание
  4. III. Расширенные темы AVR
    1. 13. Продвинутые трюки с ШИМ
      1. Прямой цифровой синтез
      2. Создание синусоиды
      3. Следующие шаги: микширование и объем
        1. Смешивание
        2. Динамический регулятор громкости
      4. Опрос USART
      5. Конверт ADSR
      6. Вспомогательные файлы
    2. 14. Переключатели
      1. Управление большими нагрузками: переключатели
        1. Транзисторы с биполярным переходом
        2. МОП-транзисторы
        3. Мощные МОП-транзисторы
        4. Реле
        5. Триаки и SSR
        6. Переключатели: Резюме
      2. Двигатели постоянного тока
    3. 15. Усовершенствованные двигатели
      1. Движение в обратном направлении: Н-мосты
      2. Код: проверь свой H-мост
        1. Только для экспертов H-Bridge
      3. ШИМ и H-мост
        1. Режимы привода: знак-величина
        2. Режимы привода: заблокированный противофазный
        3. Режимы привода: сравнение
      4. Шаговые двигатели
      5. Виды шаговых двигателей
      6. Полный шаг и полушаг
      7. Идентификация проводов шагового двигателя
        1. Слишком много проводов!
      8. Двойные микросхемы H-моста: SN754410
      9. Код
      10. Контроль ускорения
      11. Микрошаг
    4. 16. СПИ
      1. Как работает СПИ
        1. Пример торговли битами
        2. Сдвиговые регистры
      2. Внешняя память EEPROM
        1. Внешняя память
      3. Демонстрационное подключение SPI
      4. Демонстрационный код SPI
        1. Заголовок библиотеки SPI EEPROM
        2. Код C библиотеки SPI EEPROM
        3. initSPI
        4. SPI_tradeByte
        5. Удобные функции
      5. Краткое содержание
    5. 17. I2C
      1. Как работает I2C
      2. Демонстрационное подключение I2C
      3. Демонстрационная библиотека I2C
      4. Демонстрация термометра I2C
      5. Регистратор данных SPI и I2C
        1. Указатели в EEPROM
        2. Последовательное меню UART
        3. Цикл событий регистратора
    6. 18. Использование флэш-памяти программ
      1. Использование флэш-памяти программ
        1. Адреса памяти
        2. Адрес оператора: &
      2. указатели
        1. Кратко об указателях
        2. Указатели как аргументы функций
        3. Краткое содержание
        4. Необязательно: указатели разыменования
      3. Говорящий вольтметр
        1. Структуры данных PROGMEM и заголовочный файл
          1. Массивы индексации: массивы указателей в PROGMEM
        2. Воспроизведение звука и чтение напряжения: файл .c
          1. ISR
          2. основной()
      4. Генерация аудиоданных
        1. Дифференциальная импульсно-кодовая модуляция
        2. Кодирование двухбитного DPCM
        3. Кодирование DPCM: wave2DPCM. py
    7. 19. ЭСППЗУ
      1. Использование ЭСППЗУ
        1. Хранение в памяти
          1. AVRDUDE и EEPROM
        2. Чтение из памяти
        3. Сохранение и загрузка EEPROM
        4. Организация данных в EEPROM
          1. Инициализация EEPROM
      2. Проект: Кодировщик/декодер шифра Виженера
    8. 20. Заключение, напутствие и ободрение
      1. Изучение AVR: недостающие главы
        1. Сторожевой таймер
        2. Энергосбережение
        3. Кристаллы и альтернативные источники часов
        4. Загрузчики
        5. Аналоговый компаратор
      2. Отладка
      3. Отложите эту книгу и стройте!
  5. Индекс
  6. Колофон
  7. Авторские права

Pololu AVR Краткое руководство по программированию

Просмотр документа на нескольких страницах.
Вы также можете просмотреть этот документ в формате PDF для печати.

1. Обзор
2. Перед программированием
3. Программирование в Windows с помощью Microchip Studio
3.1. Установка необходимых компонентов
3.2. Настройка вашего программатора
3.3. Компиляция примера программы
3.4. Программирование с помощью AVRDUDE
4. Программирование в Linux
4.1. Настройка вашего программатора в Linux
4.2. Установка необходимых компонентов
4.3. Установка библиотеки Pololu AVR C/C++ в Linux
4.4. Компиляция примера программы в Linux
5. Начало работы с macOS
5.1. Настройка вашего программатора для macOS
5.2. Установка необходимых компонентов
5.3. Установка библиотеки Pololu AVR C/C++ в macOS
5.4. Компиляция примера программы в macOS

1.

Обзор

Это руководство представляет собой набор руководств по началу программирования микроконтроллера AVR на контроллере робота Orangutan или роботе 3pi под Windows, Linux или Mac OS X. Это руководство в основном предназначено для людей. которые хотят использовать программатор Pololu USB AVR Programmer и библиотеку Pololu AVR C/C++.

  • Если вы хотите использовать другой программатор, это руководство все равно будет вам полезно, но некоторые шаги к вам не применимы.
  • Если вы хотите запрограммировать AVR не на Orangutan или роботе 3pi, это руководство все равно будет вам полезно, но обратите внимание, что библиотека Pololu AVR C/C++ работает только на определенных AVR в семействе ATmega.
  • Если вы хотите запрограммировать AVR, который не используется на роботе Orangutan или 3pi, и вам не интересна библиотека Pololu AVR C/C++, мы рекомендуем вместо этого руководства прочитать учебные пособия в Руководстве пользователя программатора Pololu USB AVR.
  • Это руководство делает , а не относятся к Arduino IDE; есть отдельное руководство по программированию орангутанов и робота 3pi из среды Arduino.
  • В этом руководстве , а не рассматривается старая среда разработки AVR Studio 4; есть отдельное руководство по программированию орангутанов и робота 3pi из AVR Studio 4.

2. Перед программированием

Подключение питания

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

Примечание: Если вы приобрели аккумуляторы для своего устройства, вам следует полностью зарядить их перед первым использованием. Вы никогда не должны пытаться программировать свое устройство, если его батареи разряжены или разряжены. Потеря питания во время программирования может привести к необратимому отключению вашего AVR.

Попробуйте предварительно загруженную демонстрационную программу

Робот 3pi, Orangutan SVP, Orangutan SV-xx8 и Orangutan LV-xx8 поставляются с предварительно загруженными демонстрационными программами , которые демонстрируют различные функции. Перед программированием рекомендуем использовать эти демонстрационные программы, чтобы ознакомиться с некоторыми функциями вашего устройства, а также убедиться, что устройство работает.

3. Программирование в Windows с помощью Microchip Studio

Для программирования AVR в Windows мы рекомендуем использовать Microchip Studio для AVR и SAM Devices , интегрированную среду разработки (IDE) от Microchip.

Примечание: Orangutan X2 не работает со встроенным ПО для программирования AVR ISP в Microchip Studio. Эти инструкции покажут вам, как с помощью Microchip Studio скомпилировать файл .hex, а затем загрузить его в X2 с помощью AVRDUDE, входящего в состав WinAVR.

3.1. Установка необходимых компонентов

В качестве первого шага для программирования AVR в Windows мы рекомендуем загрузить и установить соответствующую версию Microchip Studio, интегрированной среды разработки (IDE) от Microchip.

Если вы используете Windows 7 или более позднюю версию, мы рекомендуем Microchip Studio 7.0 , поскольку это последняя версия, поддерживаемая установщиками библиотеки Pololu AVR C/C++.

Если вы используете Windows Vista, мы рекомендуем Atmel Studio 6.2 (доступно здесь), поскольку Microchip Studio 7.0 не поддерживает Windows Vista.

После установки и работы Microchip Studio загрузите и установите пакет разработки Pololu AVR (~ 11 МБ exe) . Пакет разработки Pololu AVR содержит следующие компоненты:

  • Библиотека Pololu AVR C/C++, которая предоставляет функции для взаимодействия с оборудованием вашего робота Orangutan или 3pi.
  • Драйверы и программное обеспечение
  • Pololu USB AVR Programmer.
  • Драйверы Orangutan SVP.

Когда вы запускаете программу установки Pololu AVR Development Bundle, она спросит вас, какие компоненты установить. Если вы не уверены, какие из них вам понадобятся, можно установить их все.

Программа установки Pololu AVR C/C++ Library спросит вас, в какие наборы инструментов AVR вы хотите установить библиотеку: .

Если флажок для вашей версии Atmel Studio или версии Microchip Studio неактивен, значит программе установки не удалось найти эту IDE, и вам следует попробовать переустановить или восстановить ее. Вы должны оставить этот флажок установленным, чтобы библиотека могла установить свои файлы в набор инструментов AVR.

Обратите внимание, что Microchip Studio 7.0 отображается в этом установщике как Atmel Studio 7.0. Если вы хотите использовать Microchip Studio 7.0, убедитесь, что установлен флажок Atmel Studio 7.0.

Во время установки Windows спросит, хотите ли вы установить драйверы. Нажмите «Установить».

Если у вас есть Orangutan X2 , вам также необходимо установить наши драйверы CP2102.

3.2. Настройка вашего программатора

Этот раздел не относится к Орангутанг X2 .

Теперь, когда вы установили драйверы, пришло время подключить программатор Pololu USB AVR Programmer или Orangutan SVP к USB-порту вашего компьютера, убедиться, что драйверы работают, и настроить Microchip Studio для использования программатора. Для краткости мы будем просто говорить «программатор» в этом разделе для обозначения либо программатора Pololu USB AVR, либо вспомогательного процессора Orangutan SVP, который служит программатором.

Если вы используете Windows Vista, Windows 7 или более позднюю версию Windows , ваш компьютер должен автоматически установить необходимые драйвера при подключении программатора.

Если вы используете Windows XP , вам нужно будет выполнить следующие шаги всякий раз, когда вы подключаете новый программатор:

  1. Подключите программатор к USB-порту вашего компьютера. Программатор на самом деле представляет собой три устройства в одном, поэтому ваш компьютер XP обнаружит все эти три новых устройства и трижды отобразит «Мастер нового оборудования». Каждый раз, когда появляется окно «Мастер нового оборудования», выполните шаги 2–5.
  2. При отображении «Мастера нового оборудования» выберите «Нет, не в этот раз» и нажмите «Далее».
  1. На втором экране «Мастера поиска нового оборудования» выберите «Установить программное обеспечение автоматически» и нажмите «Далее».
  1. Windows XP снова предупредит вас о том, что драйвер не тестировался Microsoft, и порекомендует остановить установку. Нажмите «Все равно продолжить».
  1. После завершения работы «Мастера установки нового оборудования» нажмите «Готово». После этого появится еще один мастер. Вы увидите в общей сложности три мастера при подключении программатора. Выполните шаги 4–7 для каждого мастера.

Если вы используете Windows XP и у вас возникают проблемы с установкой драйверов последовательного порта, убедитесь, что вы выполнили обновление до Service Pack 3.

После установки драйверов перейдите в Диспетчер устройств вашего компьютера и разверните список «Порты (COM и LPT)». Если вы используете программатор Pololu USB AVR Programmer, вы должны увидеть два COM-порта: «Порт программирования программатора USB AVR Pololu» и «Последовательный порт TTL программатора USB AVR Pololu». Если вы используете Orangutan SVP, вы должны увидеть три COM-порта: «Pololu Orangutan SVP Programmer», «Pololu Orangutan SVP USB Communication Port» и «Pololu Orangutan SVP TTL Serial Port». В скобках после этих имен вы увидите имя порта (например, «COM3» или «COM4»).

Кроме того, если вы используете программатор Pololu USB AVR, должен быть список «USB-устройства Pololu» с записью для программатора.

Windows 8 Device Manager, показывающий Pololu USB AVR Programmer

9089. SELESAN.

COM-порты в Диспетчере устройств могут называться «USB Serial Device» вместо описательного имени, как показано на снимках экрана выше. Это может произойти, если вы используете Windows 10 или более позднюю версию и подключили программатор к компьютеру перед установкой для него наших драйверов. В этом случае Windows настроит ваш программатор с помощью usbser.inf, драйвера от Microsoft, поставляемого с Windows 10 и более поздними версиями, и в качестве имени для каждого порта будет отображаться «USB Serial Device». Порты можно будет использовать, но их будет трудно отличить друг от друга из-за общего имени, отображаемого в диспетчере устройств. Мы рекомендуем исправить имена в диспетчере устройств, щелкнув правой кнопкой мыши каждую запись «Последовательное USB-устройство», выбрав «Обновить программное обеспечение драйвера…», а затем выбрав «Автоматический поиск обновленного программного обеспечения драйвера». Windows должна найти уже установленные драйверы, которые содержат правильное имя порта.

Далее вам необходимо настроить Microchip Studio для использования программатора. Откройте Microchip Studio, убедитесь, что ваш программатор подключен к компьютеру через USB, а затем выберите Add target… в меню Tools . В качестве инструмента выберите «STK500». В качестве последовательного порта выберите COM-порт, назначенный программному порту программатора. Наконец, нажмите Применить .

3.3. Компиляция программы-примера

Следующим шагом является компиляция программы-примера в Microchip Studio и загрузка ее на вашего робота Orangutan или 3pi. Откройте Microchip Studio и создайте новый проект, выбрав New > Project… в меню File .

В диалоговом окне «Новый проект» выберите Установлено , чтобы просмотреть установленные шаблоны. Разверните категорию C/C++ и выберите Pololu , чтобы увидеть список шаблонов, которые были установлены установщиком библиотеки Pololu AVR C/C++. Если категории Pololu нет, убедитесь, что у вас установлена ​​библиотека Pololu AVR C/C++, и попробуйте перезапустить Microchip Studio. Выберите шаблон, соответствующий вашему устройству. Будьте осторожны, чтобы выбрать правильный; если вы не уверены, какая модель микроконтроллера AVR установлена ​​на вашем устройстве, вы можете узнать это, проверив свой счет, проверив историю заказов Pololu или прочитав надпись на самом AVR.

  • Все роботы 3pi, поставляемые Pololu с июня 2009 г., начиная с серийного номера 0J5840, имеют ATmega328P.
  • Все Orangutan X2, поставляемые Pololu с 25 октября 2010 г., имеют ATmega1284P.

Также рекомендуется снять флажок Создать каталог для решения , чтобы немного упростить структуру каталогов.

После того, как вы нажмете OK , Microchip Studio создаст новый проект из шаблона и откроет его:

Проект будет содержать простой пример кода, демонстрирующий основные функции платы, такие как мигание светодиода, воспроизведение некоторых нот на зуммере и отображение чисел на ЖК-дисплее. Вызываемые функции определены в библиотеке Pololu AVR C/C++. Вы можете найти дополнительную информацию о них в Руководстве пользователя библиотеки Pololu AVR C/C++ и прочитать их исходный код, заглянув в каталог, в котором вы установили библиотеку.

Вы можете построить/скомпилировать проект, выбрав Build > Build Solution или нажав F7 . Если на этом этапе вы получаете сообщение об ошибке, и вы вообще не изменяли пример программы или конфигурацию проекта, то, вероятно, библиотека Pololu AVR C/C++ была установлена ​​неправильно, и вам следует попробовать установить ее еще раз. Если сборка прошла успешно, то вывод сборки, показанный на вкладке «Вывод» внизу, должен заканчиваться так:

...
Построить удалось.
========== Сборка: 1 выполнена успешно или обновлена, 0 неудачно, 0 пропущено ========== 

Если ваш вывод выглядит именно так, значит, вы успешно скомпилировали свой проект в HEX-файл, который можно найти в каталоге проекта. Пришло время запрограммировать этот HEX-файл на ваш AVR, используя программатор Pololu USB AVR Programmer или встроенный программатор на Orangutan SVP или Orangutan X2.

Перед программированием убедитесь, что ваше устройство включено и ваш программатор подключен к компьютеру через USB. Если вы используете программатор Pololu USB AVR, вам необходимо подключить программатор к устройству с помощью прилагаемого 6-контактного кабеля ISP. Если вы программируете устройство, такое как Baby Orangutan B, которое не имеет защитного штекерного разъема, обеспечивающего правильную ориентацию кабеля, будьте осторожны, чтобы совместить стрелку, указывающую на контакт 1 на кабеле, со стрелкой на устройстве.

Пользователи Orangutan X2: Программное обеспечение для программирования AVR в Microchip Studio несовместимо с Orangutan X2, поэтому мы рекомендуем использовать AVRDUDE, как описано в разделе 3.4, вместо того, чтобы пытаться следовать приведенным ниже инструкциям.

Для программирования просто зайдите в Microchip Studio и нажмите клавишу F5 . В качестве альтернативы вы можете запрограммировать, выбрав либо Продолжить , либо Запустить без отладки в меню Отладка .

Если программирование не удалось: Если вы получили сообщение об ошибке после попытки программирования, нажмите View > Available Microchip Tools , чтобы открыть окно «Доступные инструменты». Убедитесь, что в списке есть один и только один STK500 и убедитесь, что номер COM-порта совпадает с номером COM-порта вашего программатора, который отображается в Диспетчере устройств. Если вы используете программатор Pololu USB AVR Programmer, см. раздел «Устранение неполадок» в руководстве пользователя программатора. Если вы используете Orangutan SVP, убедитесь, что у вас установлена ​​прошивка версии 1.03 или выше (см. раздел «Обновление прошивки» в руководстве пользователя). Если вы используете Orangutan X2, см. примечание выше.

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

Если вы хотите получить доступ к расширенным функциям программатора или вам нужен интерфейс, обеспечивающий дополнительную обратную связь при успешном программировании, вы можете использовать диалоговое окно Device Programming в Microchip Studio.

Совет: Если вы используете несколько программаторов, но никогда не подключаете к компьютеру более одного за раз, вы можете настроить их все на один и тот же COM-порт, чтобы программирование с помощью клавиши F5 в Microchip Studio не выполнялось. всегда работать. Вы можете изменить номер COM-порта, назначенный устройству, перейдя в Диспетчер устройств, дважды щелкнув COM-порт, а затем нажав кнопку «Дополнительно…» на вкладке «Настройки порта».

3.4. Программирование с помощью AVRDUDE

После того, как вы скомпилировали HEX-файл, вы можете загрузить его на свой AVR с помощью Microchip Studio, как описано в разделе 3.3, или с помощью отдельной утилиты командной строки с именем AVRDUDE. Эта утилита бесплатна и входит в пакет WinAVR.

Сначала вам нужно найти HEX-файл. Если вы скомпилировали его с помощью Microchip Studio, он должен иметь расширение «.hex» и находиться в папке вашего проекта Microchip Studio в подпапке с именем Debug или Release. Откройте командную строку и перейдите в эту папку. Затем, чтобы запрограммировать ваш AVR, вы должны ввести что-то вроде этого:

 avrdude -p m328p -P COM6 -c avrispv2 -U flash:w:test.hex 
  • Аргумент, следующий за -p , представляет собой номер детали AVR. Для орангутана или робота 3pi номер детали должен быть m328p, m1284p, m324p, m644p, m168 или m48.
  • Аргумент, следующий за -P , является именем порта. Вы можете определить имя порта программирования вашего устройства, заглянув в список «Порты (COM и LPT)» диспетчера устройств.
  • Аргумент после -c — это протокол программиста, который должен быть avrispv2 .
  • Опция -U используется для записи, чтения или проверки флэш-памяти, EEPROM, предохранителей или битов блокировки. В этом примере мы используем -U для записи test.hex во флэш-память.

Более подробную информацию см. в документации AVRDUDE.

Примечание для пользователей Orangutan SVP и X2: AVRDUDE имеет неверные настройки задержки стирания микросхемы для ATmega324P, ATmega644P, ATmega1284P. Это означает, что когда вы пытаетесь запрограммировать, операция стирания займет больше времени, чем ожидает AVRDUDE, и AVRDUDE интерпретирует это как ошибку. Обходной путь — найти файл конфигурации AVRDUDE, avrdude.conf и увеличьте задержку стирания чипа для m324p/m644p/m1284p до 55000. Файл находится в папке C:\WinAVR-20100110\bin по умолчанию в Windows.

4. Программирование в Linux

4.1. Настройка программатора в Linux

Для использования программатора Pololu USB AVR Programmer или Orangutan SVP в Linux установка драйверов не требуется.

Когда вы подключаете свой программатор или Orangutan SVP к компьютеру с Linux, драйвер cdc_acm ядра Linux должен автоматически обнаружить его и создать два или три устройства с последовательным портом. Если у вас нет других подключенных устройств, использующих тот же драйвер, имя порта программирования должно быть /dev/ttyACM0 . Вы можете увидеть, какие виртуальные COM-порты у вас есть, набрав ls /dev/ttyACM* в терминале.

4.2. Установка необходимых компонентов

Для программирования AVR в Linux вам потребуются бесплатный компилятор avr-gcc, avr-libc, AVRDUDE и другие сопутствующие инструменты. Пользователи Ubuntu могут получить необходимое программное обеспечение, выполнив:

 sudo apt-get install gcc-avr avr-libc avrdude 

Пользователи других дистрибутивов Linux должны установить все соответствующие пакеты, связанные с AVR, доступные в диспетчере пакетов их дистрибутива.

4.3. Установка библиотеки Pololu AVR C/C++ в Linux

Библиотеку Pololu AVR C/C++ можно загрузить в виде файла .zip из раздела «Инструкции по загрузке» руководства пользователя библиотеки. В командной строке Linux введите команду

unzip libpololu-avr-yymmdd.zip

, где yymmdd заменяется версией загруженной библиотеки. Он будет распакован в папку с именем libpololu-avr .

Чтобы установить библиотеку, откройте командную строку Linux, перейдите к libpololu-avr и введите sudo make install . Это скопирует файлы объектов библиотеки (.a) и файлы заголовков (.h) в соответствующие подкаталоги avr. Чтобы увидеть, куда именно они будут скопированы, вы можете набрать make show_prefix .

4.4. Компиляция примера программы в Linux

Простая демонстрационная программа находится в каталоге libpololu-avr/examples/atmegaXXX/simple-test/ , где atmegaXXX — процессор на вашей плате.

Откройте окно терминала и перейдите в этот каталог. Вы должны иметь возможность скомпилировать пример с предоставленным Makefile, набрав make в командной строке. Это создаст файл с именем test.hex , который готов к прошивке на ваш AVR, и вывод на ваш терминал должен выглядеть примерно так:

Компиляция тестовой программы под Linux.

Если make завершен успешно, подключите программатор (или Orangutan SVP) к компьютеру и целевому устройству и включите питание целевого устройства. Если вы используете программатор Pololu USB AVR, зеленый светодиод USB должен гореть, красный светодиод должен быть выключен, а желтый светодиод должен мигать, показывая, что программатор готов. Тип создайте программу для загрузки программы на Orangutan или 3pi. Если ваш программатор установлен на порт, отличный от /dev/ttyACM0 , вам придется отредактировать Makefile и ввести правильный порт.

Программирование орангутана с помощью avrdude под Linux.

Если ваш контроллер был успешно запрограммирован и вы не используете детеныша орангутанга, вы должны услышать короткую мелодию, увидеть сообщение «Привет!» на ЖКИ (если он есть и контрастность выставлена ​​правильно), а светодиоды на плате должны мигать. Если вы используете Baby Orangutan, вы просто увидите мигание красного светодиода пользователя.

Примечание для пользователей Orangutan SVP и X2: AVRDUDE имеет неверные настройки задержки стирания микросхемы для ATmega324P, ATmega644P, ATmega1284P. Это означает, что когда вы пытаетесь запрограммировать, операция стирания займет больше времени, чем ожидает AVRDUDE, и AVRDUDE интерпретирует это как ошибку. Обходной путь заключается в том, чтобы найти файл конфигурации AVRDUDE, avrdude.conf и увеличить задержку стирания микросхемы для m324p/m644p/m1284p до 55000. Файл находится в /etc/ в Linux.

5. Начало работы с macOS

5.1. Настройка вашего программатора для macOS

Если вы используете Pololu USB AVR Programmer , вам может потребоваться обновить прошивку вашего программатора, чтобы он работал с macOS. Инструкции см. в разделе «Поддержка встроенного ПО для Mac OS X» руководства пользователя Pololu USB AVR Programmer User’s Guide.

Совместимость с Mac OS X: мы подтвердили, что программист и старший вице-президент Orangutan работают с Mac OS X 10.7, и мы можем помочь в сложных технических вопросах, но большая часть нашего персонала технической поддержки не использует Mac, поэтому базовая поддержка для Mac ОС Х ограничена.

Чтобы проверить настройки, подключите программатор или Orangutan SVP к USB-порту вашего Mac. Нажмите «Отмена», если появится следующее диалоговое окно:

В окне терминала введите ls /dev/tty.usb* и нажмите Enter. Вы должны увидеть 1–3 новых записи вида tty. usbmodem<номер> (например, /dev/tty.usbmodem00022331 ). Эти записи представляют собой виртуальные последовательные порты, созданные программистом или старшим вице-президентом Orangutan.

Запись с наименьшим номером является портом программирования, и позже вам нужно будет передать его имя в качестве параметра в AVRDUDE.

5.2. Установка необходимых компонентов

Для программирования AVR в macOS вам потребуется бесплатный компилятор avr-gcc, avr-libc, AVRDUDE и другие сопутствующие инструменты.

Чтобы получить эти инструменты, мы рекомендуем сначала установить Homebrew. Затем выполните следующие команды для установки AVRDUDE и homebrew-avr:

варить установить avrdude
xcode-выбрать --установить
кран для заваривания osx-cross/avr
варить установить avr-gcc 

5.3. Установка библиотеки Pololu AVR C/C++ в macOS

Библиотеку Pololu AVR C/C++ можно загрузить в виде ZIP-файла из раздела «Инструкции по загрузке» руководства пользователя библиотеки. Используйте утилиту архивации Mac, чтобы извлечь файл .zip на рабочий стол или в любое другое удобное место. Он будет распакован в папку с именем libpololu-avr .

Чтобы установить библиотеку, откройте сеанс терминала, перейдите к libpololu-avr и введите sudo make install . Это скопирует файлы объектов библиотеки (.a) и файлов заголовков (.h) в соответствующие подкаталоги вашей цепочки инструментов AVR. Чтобы увидеть, куда именно они будут скопированы, вы можете набрать make show_prefix .

5.4. Компиляция примера программы в macOS

Простая демонстрационная программа находится в каталоге libpololu-avr/examples/atmegaXXX/simple-test/ , где atmegaXXX — процессор на вашей плате.

Откройте окно терминала и перейдите в этот каталог. Вы должны иметь возможность скомпилировать пример с предоставленным Makefile, набрав make в командной строке. Это создаст файл с именем test. hex , который готов к прошивке на ваш AVR.

Теперь подключите программатор к вашему Mac и роботу Orangutan или 3pi и включите питание устройства. Если вы используете программатор Pololu USB AVR, зеленый светодиод USB должен гореть, а желтый светодиод должен мигать, показывая, что программатор готов.

Откройте Makefile в текстовом редакторе. Вам нужно будет изменить переменную PORT, чтобы она ссылалась на порт программирования вашего программатора, как указано в Разделе 5.1 (например, /dev/tty.usbmodem00022331 ).

Чтобы загрузить пример программы на ваше устройство, введите make program . Через несколько секунд вы должны увидеть вывод AVRDUDE, который выглядит примерно так:

 avrdude: устройство AVR инициализировано и готово к принятию инструкций.
Чтение | ################################################### | 100% 0,01 с
avrdude: Подпись устройства = 0x1e950ф
avrdude: ВНИМАНИЕ: была указана флэш-память, будет выполнен цикл стирания
         Чтобы отключить эту функцию, укажите параметр -D. 
avrdude: стирание чипа
avrdude: чтение входного файла "test.hex"
avrdude: входной файл test.hex автоматически определяется как Intel Hex
avrdude: запись flash (3392 байта):
Написание | ################################################### | 100% 0,88 с
avrdude: записано 3392 байта флэш-памяти
avrdude: проверка флэш-памяти на test.hex:
avrdude: загрузить данные флэш-памяти из входного файла test.hex:
avrdude: входной файл test.hex автоматически определяется как Intel Hex
avrdude: входной файл test.hex содержит 3392 байта
avrdude: чтение данных встроенной флэш-памяти:
Чтение | ################################################### | 100% 0,72 с
avrdude: проверка...
avrdude: проверено 3392 байта флэш-памяти
avrdude: safemode: Предохранители в порядке
avrdude сделано. Спасибо. 

Если ваш контроллер был успешно запрограммирован и вы не используете детеныша орангутанга, вы должны услышать короткую мелодию, см. сообщение «Привет!» на ЖКИ (если он есть и контрастность выставлена ​​правильно), а светодиоды на плате должны мигать.

alexxlab

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *