Программы на avr: Страница не найдена

Программа для программирования микроконтроллеров avr

AVR — это новое семейство 8-разрядных микроконтроллеров фирмы Atmel. Эти микроконтроллеры позволяют решать множество задач встроенных систем. Они отличаются от других распространенных в настоящее время микроконтроллеров большей скоростью работы, большей универсальностью. Быстродействие данных микроконтроллеров позволяет в ряде случаев применять их в устройствах, для реализации которых ранее можно было применять только разрядные микроконтроллеры, что позволяет ощутимо удешевить готовую систему.


Поиск данных по Вашему запросу:

Схемы, справочники, даташиты:

Прайс-листы, цены:

Обсуждения, статьи, мануалы:

Дождитесь окончания поиска во всех базах.

По завершению появится ссылка для доступа к найденным материалам.
ПОСМОТРИТЕ ВИДЕО ПО ТЕМЕ: Программирование микроконтроллеров avr для начинающих

Atmel Studio


Возможность самостоятельного добавления программаторов, настройки скорости программирования и т. Возможность самостоятельного добавления МК; 3. Редактирование и настройка отображения Fuses битов; 4. Выбор инверсных или прямых Fuses битов; 5. Окна вывода значений Fuses битов в HEX формате; 6.

Сохранение настроек программирования при закрытии программы, то есть при последующем открытии все настройки восстановятся. В той же статье я указал какие программы поддерживают данный программатор. О ней мы сегодня и поговорим. Программа очень проста в использовании, имеет приятный интуитивно понятный интерфейс на русском языке, поддерживает очень много различных программаторов и практически все микроконтроллеры ATmega и ATtiny.

Немаловажно и то, что в программу можно самому вносить изменения — добавлять программаторы, микроконтроллеры, изменять некоторые настройки все подробно расписано на сайте разработчика. Программа не требует установки на компьютер, необходимо только разархивировать скачанный файл и можно сразу приступать к работе, поддерживаются все разновидности Windows — от ХР до В данном примере показаны четыре калибровочные ячейки микроконтроллера ATmega8 для внутреннего RC генератора: ВВ — для частоты 1 МГц частота по умолчанию BD — для частоты 2 МГц В2 — для частоты 4 МГц В2 — для частоты 8 МГц При тактировании микроконтроллера ATmega8 частотой 1 МГц от внутреннего RC генератора по умолчанию содержимое первой калибровочной ячейки автоматически учитывается микроконтроллером для подстройки внутреннего генератора.

При других частотах — содержимое соответствующей калибровочной ячейки необходимо вручную вводить в регистр микроконтроллера для получения более стабильной частоты если такое нужно. Для прошивки нового МК, у которого по умолчанию тактовая частота 1 МГц, необходимо устанавливать в программаторе перемычку на разъем J3, а сама скорость — 5 кГц, в некоторых случаях начинает нервировать.

Тут все просто — расставляем в нужном виде галочки или убираем их и программируем FUSE биты. Очень внимательно устанавливайте FUSE биты — ошибка может привести к отказу микроконтроллера. Хочу обратить ваше внимание на самую распространенную ошибку при установки FUSE битов. Нам, допустим, нужно установить тактовую частоту 8 МГц от внутреннего генератора — сбросить бит CKSEL2 поставить галочку , что мы и делаем. В результате, программируя FUSE биты, мы получаем совершенно иной результат — программа не работает, а МК не реагирует на программатор.

Отчаиваться не надо, главное разобраться в том, что вы получили в результате. В нашем примере — внешний RC, смотрим даташит, подсоединяем к соответствующим входам МК сопротивление и конденсатор по схеме из даташита и с нужными номиналами и восстанавливаем контроль над МК.

Скачать с ЯндексДиска. Микроконтроллеры — первый шаг 2. Системы счисления: десятичная, двоичная и шестнадцатиричная 3. Логические операции, логические выражения, логические элементы 4. Битовые операции 5. Прямой, обратный и дополнительный коды двоичного числа 6.

Добрый День! Спасибо за информацию! Скачал файл с проекта для прошивки Атмега8, но он с расширением. Подскажите, можно ли прошивать файлом. Файл с расширением. В сети мно программ для перекодировки, в том числе бесплатные.

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

Отличная программа! Есть баг на Win10, окно типа Alert то что всплывает после разных действий не показывает ничего, кроме кнопки OK. Однако на другом компьютере там текст есть, про верификацию и чтение. Как пофиксить? Верификация — проверка правильности записанных данных Чтение — чтение программы из МК. Ничего не понял с чтением. Программа что-то делает, пишет что Чтение ОК, и всё! Что ок? А как посмотреть что в контроллере? Что вообще происходит? Перед чтением укажите путь программе куда считать память МК на первой странице, как и в обычных других программах.

Потом в папке просматриваете считанный файл — для этого поищите специальные программы для перевода файлов в. Хотя смысла смотреть в МК — малопривлекательная задача. Чтение нужно для записи считанных данных в другой МК. Он ещё спросил что то про savemode, я нажал Y. Пока шил 1M, всё было нормально. Кварц на аттину не подключен. Попробуйте переустановить программу. Как это лечится? Такой файл кидал в папку Win32, но ошибка осталась.

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

Пользуюсь уже несколько лет, пока все ОК! Виндоуз ХР. Такая проблема. Подключаю arduino pro mini Горит индикация на ардуине и мигает второй светодиод. Напряжение в норме. Но при попытке прошит, тоже самое не видит программатора. Когда я прошивал данной программой без программирования Fuse, все прошивалось. Однако, когда я решил залить и фьюзы в программе отображалось F7 — то ATMega перестала отвечать.

Появилось сообщение: avrdude. Дело во внешней RC-цепочке, как описано в вашей статье? Если да, то какие номиналы резистора и конденсатор выбрать и куда их подключать? В даташите нашел раздел External Clock, но тем про номиналы ничего не сказано. Здравствуйте Николай. Возможно Вы установили другой способ тактирования МК, что и приводит к ошибке, а может что-то заблокировали. Необходимо точно знать какие установки были при программировании FUSE, тогда можно думать дальше, как исправить проблему.

Проверьте программатор на любом другом МК. На этой картинке указаны инверсные фьюзы Ponyprog. Уточнил необходимые фьюзы именно для Atmega p. Значит фьюзы были выставлены правильно и становится непонятным, почему же он перестал откликаться? Здравствуйте Михаил! Простите старого человека. Но выскажу своё мнение. Не вижу разницы между Khazama, SinaProg и прочими оболочками.

Конечно, С. Боднар молодец! Нет возможности из оболочки редактировать командную строку, нужно лезть в ini или config. Конечно, моё субъективное мнение вообще о программировании АВР негативное. Не зря Атмел был поглощён Майкрочипом.

Не выдержал конкуренции. Практические примеры: не считывается сигнатура, малейшая ошибка во фьюзах камень превращается в кирпич. Запускай фьюзбитдоктор! С точки зрения потребителя сплошные неудобства. Потребительские качества ПИКов на порядок выше. Ошибся — стёр, переписал. Вот, если бы С. Боднар, слава ему за проделанную работу! Как Вы додумались настроить скорость программирования в настройках программатора?

Понятно, что командой -В задается в avrdude, но как в самом programm.


Что нужно для программирования микроконтроллеров?

Рассмотрим процесс преобразования исходного кода в машинный код, пригодный для записи в память микроконтроллера. Узнаем какие есть программные инструменты в операционной системе Linux для компиляции и прошивки программ в микроконтроллеры используя языки программирования Си и Ассемблер. Давайте разберемся как происходит компиляция, подготовка и запись программы в микроконтроллер AVR. Допустим что мы будем писать программу на языке Си для AVR микроконтроллера, вот что будет происходить в процессе работы:. Intel HEX — это специальный формат файлов, который служит для представления двоичных данных в текстовом виде. Данный формат позволяет указывать с точностью до байта в какие адреса нужно поместить те или иные данные в памяти микроконтроллера.

WinAVR — Мощная среда разработки с открытым исходным кодом, созданная с целью написания программ для микроконтроллеров серии AVR от.

ПРОГРАММИРОВАНИЕ МИКРОКОНТРОЛЛЕРОВ AVR

Что такое микроконтроллер? Микроконтроллер это по сути микрокомпьютер с процессором, оперативной и постоянной памятью, портами ввода-вывода, во многих микроконтроллерах имеется аналого цифровой преобразователь. Пожалуйста, переустановите приложение. Выбираем GCC C Executable Project на изображении под цифрой 1 , В низу, в поле Name 2 указываем имя нашего проекта, в поле Location 3 можем выбрать местоположение проекта или оставить путь по умолчанию, нажимаем OK. В окне появится среда разработки написания кода, где уже будет стандартный код на Си и несколько закомментированных строк с указанием авторства и даты:. Под цифрой 1 находится окно написания кода, под цифрой 2 файлы с исходным кодом, библиотеки и все файлы, связанные с исходным кодом, в файле main. В итоге скомпилированная прошивка будет в формате. HEX и будет лежать по адресу опять же, если вы не изменили стандартное месторасположение :. Если выбрать вариант сборки Release, то прошивка будет лежать в соответствующей папке то есть не в папке Debug, а в папке Rele ase. Код , который ничего не делает это не очень интересно, напишем программу, которая мигает 2 раза в секунду светодиодом:.

Как написать код для AVR, программирование микроконтроллеров Atmel AVR на Си

Re: пассики для проигрывателей винила Re: Динамическая индикация на LCD дисплее Re: Пассик на пленочный магнитофон Re: Продам набор SMD конденсаторов в корпусе

Программа распространяется бесплатно.

Среда разработки AVR Studio (Windows) ATMega128

Соловьева совместно с предприятием НПП САТЭК плюс уже несколько лет разрабатывается новая интегрированная среда разработки программ для встраиваемых систем на базе микроконтроллеров. В этой статье я, Большаков Олег, руководитель разработки, хотел бы рассказать об этом проекте. Среда, о которой пойдет речь, предназначена для радиолюбителей, робототехников, ардуинистов и всех тех, кто хотел бы разрабатывать программы для микроконтроллеров быстрее и проще, а исходный код программы был понятнее и прозрачнее. Микроконтроллеры используются почти в любой встраиваемой системе, особенно в носимой электронике, робототехнике, где необходим энергоэффективный вычислитель с малыми габаритами, весом и позволяющий считывать и выдавать определенные сигналы. Известно множество инструментов для разработки программ управления микроконтроллерами.

026-Программы для прожига AVR микроконтроллеров.

Как загрузить программу в микроконтроллер. Как запрограммировать микроконтроллер AVR. Можно через простейший адаптер — буквально «пять проводков» схема ниже соединяющих принтерный порт ПК с прошиваемым микроконтроллером AVR. Скачать весь курс по AVR одним архивом на заглавной странице курса. Результат написания и компиляции программы — файл-прошивку с расширением. МК AVR можно пере- программировать не менее раз, при чем это можно делать прямо в устройстве в котором они будут работать — такое программирование называют «в системе» — «ин систем программин» или ISP.

WinAVR — Мощная среда разработки с открытым исходным кодом, созданная с целью написания программ для микроконтроллеров серии AVR от.

Простая программа для AVR микроконтроллера на языке Си

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

1.4 Устройство микроконтроллеров avr

Импульсные блоки питания Линейные блоки питания Радиолюбителю конструктору Светодиоды, ламы и свет 3D печать и 3D модели Если вы, как и я, используете в своих конструкциях как микроконтроллеры PIC, так и чипы AVR, было бы удобно для программирования обеих линеек микросхем использовать один и тот же программатор. Посему можно предположить окончание многолетнего холивара на тему что же лучше. Оба типа контроллеров имеют свои недостатки и преимущества, но это тема для другой статьи или видеоролика.

Войдите , пожалуйста. Хабр Geektimes Тостер Мой круг Фрилансим.

Программы для микроконтроллеров

Руководство по установки новой версии ATmega находится здесь. В ниже приведенном руководстве описывается установка среды разработки AVR для операционной системы Windows, используя платформу разработки AVR Studio-t. Перед установкой программного обеспечения необходимо добыть нижеследующее программное обеспечение, с сайта производителя или сайта Домашней Лаборатории или с диска находящегося в чемодане Домашней Лаборатории. AVR Studio 4 IDE inglise keeles Integrated Development Environment — это программа, которая предназначена для написания программного кода и загрузки его в микроконтроллер. Это свободное программное обеспечение, которое можно найти на сайте Sourceforge. При инсталляции WinAVR предлагает имя каталога, которое также содержит номер версии, но директория должна быть изменена вручную:.

Программа распространяется бесплатно. Скачать программу вы можете с официального сайта Atmel Studio. В программе применяется технология программирования непосредственно в самой схеме.


Программы на ассемблере для avr

Здесь представлены примеры различных программ на языке Ассемблера для микроконтроллеров Atmel AVR. Примеры выложены в виде проектов для AVR Studio под микроконтроллер ATmega16, поэтому при переносе на другие МК семейства AVR это нужно учитывать. Тактовая частота микроконтроллера во всех примерах 8 МГц (используется тактирование от внутреннего генератора). Код примеров разбит на блоки и снабжен комментариями. При обнаружении ошибок просьба сообщить на почту.

Краткое описание команд Ассемблера AVR представлено здесь.

Подробное описание каждой команды представлено в AVR 8bit Instruction Set.

Для более глубокого изучения ассемблера AVR советую к прочтению книгу Юрия Ревича «Практическое программирование микроконтроллеров Atmel AVR на языке ассемблера» . С беcплатным фрагментом книги можно ознакомиться здесь. Также можно изучить различные методические пособия ВУЗов, например, вот.

Start – Заготовка стартовой инициализации микроконтроллера, в которую входят инициализация стека, очистка ОЗУ (SRAM) и регистров общего назначения (R0 – R31), а также глобальный запрет прерываний. Пример кода приведён ниже. При использовании следует помнить, что регистры ввода-вывода (порты, периферия и т.д.) не очищаются, поэтому их НЕОБХОДИМО инициализировать отдельно.

Delays – Библиотека с подпрограммами задержки. Все задержки рассчитаны на тактовую частоту МК 8 МГц. Библиотека включает следующие процедуры:

  • Delay1us – Задержка повышенной точности в 1 мкс c учетом длительности RCALL и RET.
  • Delay5us – Задержка повышенной точности в 5 мкс c учетом длительности RCALL и RET.
  • Delay10us – Задержка повышенной точности в 10 мкс c учетом длительности RCALL и RET.
  • Delayus – Задержка высокой точности в несколько десятков микросекунд.
  • Delayms – Задержка высокой точности в несколько миллисекунд.

Math – Библиотека с подпрограммами математических операций, включает следующие процедуры:

  • SUB16X16 – Вычитание 16-разрядных чисел.
  • ADD16X16 – Сложение 16-разрядных чисел.
  • MUL16X16s – Знаковое умножение 16-разрядных чисел.
  • MUL16X16u – Беззнаковое умножение 16-разрядных чисел.
  • DIV16X16s – Знаковое деление 16-разрядных чисел.
  • DIV16X16u – Беззнаковое деление 16-разрядных чисел.
  • DIV16POWER2s – Знаковое деление 16-разрядного числа на степень 2.
  • DIV16POWER2u – Беззнаковое деление 16-разрядного числа на степень 2.
  • SIGN16 – Смена знака 16-разрядного числа.
  • DEC2BCD – Перевол 8-разрядного десятичного числа в двоично-десятичное (BCD).
  • BCD2DEC – Перевол 8-разрядного двоично-десятичного (BCD) числа в десятичное.
  • CP16X16 – Сравнение 16-разрядных чисел.
  • DIGITS8 – Вычисление цифр 8-разрядного числа.
  • DIGITS16 – Вычисление цифр 16-разрядного числа.

IO Ports – В данном примере рассматривается работа с портами ввода-вывода. К порту А подключены 8 светодиодов (линии 0-7). К линии 0 порта С подключена кнопка, с подтяжкой на землю. При нажатии кнопка выдает на линию 0 порта С уровень логической единицы. Цикл программы организован следующим образом: при запуске включается бегущий огонь, сначала загорается светодиод на линии 0 порта А, затем на линии 1 и т.д. По достижении линии 7 направление бегущего огня меняется (от 7 к 0). При нажатии на кнопку бегущий огонь останавливается и загораются одновременно все светодиоды. После повторного нажатия на кнопку бегущий огонь продолжает перемещаться с места остановки.

Dynamic Indication – В данном примере рассматривается работа с 7-сегментным индикатором. В моём случае он имеет 4 разряда (цифры). Поскольку у меня на плате установлены транзисторы для управления разрядами, то управление осуществляется выводом логической единицы и на разряды и на сегменты. Схема подключения следующая: к линиям 0-7 порта C подключены сегменты индикатора, а к линиям 0-3 порта В разряды индикатора. При запуске на индикатор выводятся цифры 1 2 3 4.

UART – В данном примере рассматривается периферийного модуля UART (универсальный асинхронный приёмопередатчик). Модуль UART можно настроить как на работу с прерываниями, так и без них (вручную, путём работы с флагами). Пример работает следующим образом: при получении байта, МК переходит в обработчик прерывания (используется только прерывание по приёму данных) и разбирает численное значение байта (0-255) на цифры, которые и выводятся на 7-сегментный индикатор. Схема подключения аналогична предыдущему примеру. Передача осуществляется по двум линиям UART (порт D линии 0-1), к которым необходимо подключить линии RX и TX преобразователя USB-UART. Для настройкки без прерываний необходимо обнулить бит RXCIE в регистре UCSRB и вручную опрашивать интерфейс в основном цикле программы.

Clock – В данном примере рассматривается реализация простых часов с 7-сегментым индикатором и парой кнопок. Только здесь уже требуется 6 разрядов, хотя секунды можно опустить. Кнопки с подтяжкой на землю. При нажатии кнопка выдает на линию высокий логический уровень. Индикатор подключается как и в предыдущих примерах (сегменты к порту C, разряды к порту B), а кнопки к линиям 2-3 порта D. Кнопка PD2 используется для установки минут, а PD3 для установки часов. По нажатию каждой из кнопок увеличивается значение соответствующего разряда (минуты или часы).

DS18B20 – В данном примере рассматривается работа с цифровым датчиком температуры DS18B20. Показания температуры выводятся на 7-сегментый индикатор. Вывод DQ датчика поключен к линии PC7. Линия должна быть подтянута к плюсу питания резистором на 4.7-10 кОм (согласно документации). Датчик опрашивается каждую секунду. Температура выводится на 4-разрядный индикатор: знак, два разряда на целуюю часть и один на вещественную. Документация к датчику здесь.

ADC Indication – Данный пример аналогичен примеру с UART. Отличие в том, что байт берется с линии 0 порта А (линия 0 АЦП, ADC0). Микроконтроллер по таймеру производит аналого-цифровое преобразование напряжения на линии 0 порта А, (младшие 2 бита отбрасываются как шум). При измерении используется внутренняя опора 5 В. К линии PD2 порта D подключена кнопка, которая определяет режим вывода показаний. При нажатии на кнопку выводится результат измерений в виде числа от 0 до 255. Если кнопка не нажата, то результат измерений переводится в вольты и выводится на индикатор (с точностью до десятых).

Fast PWM – В данном примере показана настройка аппаратного ШИМ (широтно-импульсная модуляция, англ. PWM). К линиям 4 и 5 порта D подключены светодиоды, а к линиям 0-3 порта С – кнопки. Кнопки с подтяжкой на землю (при нажатии кнопка выдает на линию порта уровень логической единицы) подключены к линиям 2-5 порта C. Кнопки на линях 2 и 3 соответственно увеличивают и уменьшают коэффициент заполнения ШИМ (меняется яркость светодиода) канала А. Кнопки на линях 4 и 5 соответственно увеличивают и уменьшают коэффициент заполнения ШИМ канала B. Число сравнения для каждого из каналов меняется в диапазоне от 0 до 255. Для канала А шаг изменения равен 10, для канала В шаг равен 5.

HCSR04 – В данном примере рассматривается работа с ультразвуковым датчиком расстояния HCSR04. К линии PD6 подключен вывод Trigger датчика, а к линии PD7 вывод Echo. Поключение 7-сегментного индикатора аналогично предыдущим примерам. По таймеру микроконтроллер раз в секунду опрашивает датчик и определяет расстояние до препятсвия в миллиметрах. После этого число разбивается на цифры и выводится на дисплей. Документация к датчику здесь.

Matrix Keyboard – В данном примере показана работа с матричной клавиатурой. Микроконтроллер динамически опрашивает клавиатуру, а затем определяет номер нажатой клавиатуры. Размер поля 3 на 3 – получаем 9 кнопок. Нажатие первых 8-ми приводит к зажиганию светодиода на соответствующей линии порта А, нажатие 9-ой кнопки зажигает все светодиоды порта А. Матричная клавиатура подключается к линиям 0-5 порта С (три столбца и три строки). В архиве схема и печатная плата матричной клавиатуры (Diptrace).

Shift Register – В данном примере рассматривается работа с модулем SPI на примере сдвигового регистра 74HC595. К регистру подключены светодиоды, в качестве линии CS используется линия 4 порта B (вывод not SS). Линия DS (14 нога) регистра идет к MOSI (PB5), линия SHCP (11 нога) к линии SCK (PB7), линия STCP (12 нога) к линии SS (PB4). Линии MR (10 нога) и OE (13 нога) должны быть подтянуты к высокому и низкому логическим уровням соответственно. По таймеру микроконтроллер меняет состояние светодиодов: поочерёдно горят то чётные светодиоды, то нечётные. Если при этом передать байт по UART’у, то он будет выведен в порт на светодиоды. Чтобы обратно переключиться в режим мигания необходимо послать по UART’у 0x00 (ноль). Документация к микросхеме 74HC595 здесь.

SG-90 Servo – В данном примере рассматривается работа с сервоприводом SG-90. Используется аппаратный ШИМ. Линия ШИМ сервпопривода подключена к каналу А аппаратного ШИМ. Кнопки поворота подключены к линиям PD2 и PD3. Кнопка на линии PD2 увеличивает длительность импульса, кнопка на линии PD3 уменьшает длительность импульса. Длительность импульса меняется от 1 до 2 мс. Описание сервомотора здесь.

RGB Lamp – В данном примере рассматривается работа с трехцветным RGB-светодиодом. Реализовано плавное переливание цветов с использованием программного ШИМ. Линии красного, зеленого и синего цветов подключаются соответственно к линиям 2, 3 и 4 порта D.

Здесь представлены примеры различных программ на языке Ассемблера для микроконтроллеров Atmel AVR. Примеры выложены в виде проектов для AVR Studio под микроконтроллер ATmega16, поэтому при переносе на другие МК семейства AVR это нужно учитывать. Тактовая частота микроконтроллера во всех примерах 8 МГц (используется тактирование от внутреннего генератора). Код примеров разбит на блоки и снабжен комментариями. При обнаружении ошибок просьба сообщить на почту.

Краткое описание команд Ассемблера AVR представлено здесь.

Подробное описание каждой команды представлено в AVR 8bit Instruction Set.

Для более глубокого изучения ассемблера AVR советую к прочтению книгу Юрия Ревича «Практическое программирование микроконтроллеров Atmel AVR на языке ассемблера» . С беcплатным фрагментом книги можно ознакомиться здесь. Также можно изучить различные методические пособия ВУЗов, например, вот.

Start – Заготовка стартовой инициализации микроконтроллера, в которую входят инициализация стека, очистка ОЗУ (SRAM) и регистров общего назначения (R0 – R31), а также глобальный запрет прерываний. Пример кода приведён ниже. При использовании следует помнить, что регистры ввода-вывода (порты, периферия и т.д.) не очищаются, поэтому их НЕОБХОДИМО инициализировать отдельно.

Delays – Библиотека с подпрограммами задержки. Все задержки рассчитаны на тактовую частоту МК 8 МГц. Библиотека включает следующие процедуры:

  • Delay1us – Задержка повышенной точности в 1 мкс c учетом длительности RCALL и RET.
  • Delay5us – Задержка повышенной точности в 5 мкс c учетом длительности RCALL и RET.
  • Delay10us – Задержка повышенной точности в 10 мкс c учетом длительности RCALL и RET.
  • Delayus – Задержка высокой точности в несколько десятков микросекунд.
  • Delayms – Задержка высокой точности в несколько миллисекунд.

Math – Библиотека с подпрограммами математических операций, включает следующие процедуры:

  • SUB16X16 – Вычитание 16-разрядных чисел.
  • ADD16X16 – Сложение 16-разрядных чисел.
  • MUL16X16s – Знаковое умножение 16-разрядных чисел.
  • MUL16X16u – Беззнаковое умножение 16-разрядных чисел.
  • DIV16X16s – Знаковое деление 16-разрядных чисел.
  • DIV16X16u – Беззнаковое деление 16-разрядных чисел.
  • DIV16POWER2s – Знаковое деление 16-разрядного числа на степень 2.
  • DIV16POWER2u – Беззнаковое деление 16-разрядного числа на степень 2.
  • SIGN16 – Смена знака 16-разрядного числа.
  • DEC2BCD – Перевол 8-разрядного десятичного числа в двоично-десятичное (BCD).
  • BCD2DEC – Перевол 8-разрядного двоично-десятичного (BCD) числа в десятичное.
  • CP16X16 – Сравнение 16-разрядных чисел.
  • DIGITS8 – Вычисление цифр 8-разрядного числа.
  • DIGITS16 – Вычисление цифр 16-разрядного числа.

IO Ports – В данном примере рассматривается работа с портами ввода-вывода. К порту А подключены 8 светодиодов (линии 0-7). К линии 0 порта С подключена кнопка, с подтяжкой на землю. При нажатии кнопка выдает на линию 0 порта С уровень логической единицы. Цикл программы организован следующим образом: при запуске включается бегущий огонь, сначала загорается светодиод на линии 0 порта А, затем на линии 1 и т.д. По достижении линии 7 направление бегущего огня меняется (от 7 к 0). При нажатии на кнопку бегущий огонь останавливается и загораются одновременно все светодиоды. После повторного нажатия на кнопку бегущий огонь продолжает перемещаться с места остановки.

Dynamic Indication – В данном примере рассматривается работа с 7-сегментным индикатором. В моём случае он имеет 4 разряда (цифры). Поскольку у меня на плате установлены транзисторы для управления разрядами, то управление осуществляется выводом логической единицы и на разряды и на сегменты. Схема подключения следующая: к линиям 0-7 порта C подключены сегменты индикатора, а к линиям 0-3 порта В разряды индикатора. При запуске на индикатор выводятся цифры 1 2 3 4.

UART – В данном примере рассматривается периферийного модуля UART (универсальный асинхронный приёмопередатчик). Модуль UART можно настроить как на работу с прерываниями, так и без них (вручную, путём работы с флагами). Пример работает следующим образом: при получении байта, МК переходит в обработчик прерывания (используется только прерывание по приёму данных) и разбирает численное значение байта (0-255) на цифры, которые и выводятся на 7-сегментный индикатор. Схема подключения аналогична предыдущему примеру. Передача осуществляется по двум линиям UART (порт D линии 0-1), к которым необходимо подключить линии RX и TX преобразователя USB-UART. Для настройкки без прерываний необходимо обнулить бит RXCIE в регистре UCSRB и вручную опрашивать интерфейс в основном цикле программы.

Clock – В данном примере рассматривается реализация простых часов с 7-сегментым индикатором и парой кнопок. Только здесь уже требуется 6 разрядов, хотя секунды можно опустить. Кнопки с подтяжкой на землю. При нажатии кнопка выдает на линию высокий логический уровень. Индикатор подключается как и в предыдущих примерах (сегменты к порту C, разряды к порту B), а кнопки к линиям 2-3 порта D. Кнопка PD2 используется для установки минут, а PD3 для установки часов. По нажатию каждой из кнопок увеличивается значение соответствующего разряда (минуты или часы).

DS18B20 – В данном примере рассматривается работа с цифровым датчиком температуры DS18B20. Показания температуры выводятся на 7-сегментый индикатор. Вывод DQ датчика поключен к линии PC7. Линия должна быть подтянута к плюсу питания резистором на 4.7-10 кОм (согласно документации). Датчик опрашивается каждую секунду. Температура выводится на 4-разрядный индикатор: знак, два разряда на целуюю часть и один на вещественную. Документация к датчику здесь.

ADC Indication – Данный пример аналогичен примеру с UART. Отличие в том, что байт берется с линии 0 порта А (линия 0 АЦП, ADC0). Микроконтроллер по таймеру производит аналого-цифровое преобразование напряжения на линии 0 порта А, (младшие 2 бита отбрасываются как шум). При измерении используется внутренняя опора 5 В. К линии PD2 порта D подключена кнопка, которая определяет режим вывода показаний. При нажатии на кнопку выводится результат измерений в виде числа от 0 до 255. Если кнопка не нажата, то результат измерений переводится в вольты и выводится на индикатор (с точностью до десятых).

Fast PWM – В данном примере показана настройка аппаратного ШИМ (широтно-импульсная модуляция, англ. PWM). К линиям 4 и 5 порта D подключены светодиоды, а к линиям 0-3 порта С – кнопки. Кнопки с подтяжкой на землю (при нажатии кнопка выдает на линию порта уровень логической единицы) подключены к линиям 2-5 порта C. Кнопки на линях 2 и 3 соответственно увеличивают и уменьшают коэффициент заполнения ШИМ (меняется яркость светодиода) канала А. Кнопки на линях 4 и 5 соответственно увеличивают и уменьшают коэффициент заполнения ШИМ канала B. Число сравнения для каждого из каналов меняется в диапазоне от 0 до 255. Для канала А шаг изменения равен 10, для канала В шаг равен 5.

HCSR04 – В данном примере рассматривается работа с ультразвуковым датчиком расстояния HCSR04. К линии PD6 подключен вывод Trigger датчика, а к линии PD7 вывод Echo. Поключение 7-сегментного индикатора аналогично предыдущим примерам. По таймеру микроконтроллер раз в секунду опрашивает датчик и определяет расстояние до препятсвия в миллиметрах. После этого число разбивается на цифры и выводится на дисплей. Документация к датчику здесь.

Matrix Keyboard – В данном примере показана работа с матричной клавиатурой. Микроконтроллер динамически опрашивает клавиатуру, а затем определяет номер нажатой клавиатуры. Размер поля 3 на 3 – получаем 9 кнопок. Нажатие первых 8-ми приводит к зажиганию светодиода на соответствующей линии порта А, нажатие 9-ой кнопки зажигает все светодиоды порта А. Матричная клавиатура подключается к линиям 0-5 порта С (три столбца и три строки). В архиве схема и печатная плата матричной клавиатуры (Diptrace).

Shift Register – В данном примере рассматривается работа с модулем SPI на примере сдвигового регистра 74HC595. К регистру подключены светодиоды, в качестве линии CS используется линия 4 порта B (вывод not SS). Линия DS (14 нога) регистра идет к MOSI (PB5), линия SHCP (11 нога) к линии SCK (PB7), линия STCP (12 нога) к линии SS (PB4). Линии MR (10 нога) и OE (13 нога) должны быть подтянуты к высокому и низкому логическим уровням соответственно. По таймеру микроконтроллер меняет состояние светодиодов: поочерёдно горят то чётные светодиоды, то нечётные. Если при этом передать байт по UART’у, то он будет выведен в порт на светодиоды. Чтобы обратно переключиться в режим мигания необходимо послать по UART’у 0x00 (ноль). Документация к микросхеме 74HC595 здесь.

SG-90 Servo – В данном примере рассматривается работа с сервоприводом SG-90. Используется аппаратный ШИМ. Линия ШИМ сервпопривода подключена к каналу А аппаратного ШИМ. Кнопки поворота подключены к линиям PD2 и PD3. Кнопка на линии PD2 увеличивает длительность импульса, кнопка на линии PD3 уменьшает длительность импульса. Длительность импульса меняется от 1 до 2 мс. Описание сервомотора здесь.

RGB Lamp – В данном примере рассматривается работа с трехцветным RGB-светодиодом. Реализовано плавное переливание цветов с использованием программного ШИМ. Линии красного, зеленого и синего цветов подключаются соответственно к линиям 2, 3 и 4 порта D.

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

Подготовка

Итак, у нас уже есть настроенный и подключенный к микроконтроллеру программатор, также мы разобрались с программой 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 для последующей работы.

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

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

При помощи директивы «.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:«.

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

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

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

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

Процесс дальнейшего изучения Ассемблера для 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 или же отдельной командой в консоли:

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

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

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

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

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

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

Заключение

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

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

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

AVRDUDE_PROG


По умолчанию поддерживаемые МК (список МК постоянно расширяется, см. форум):

AT90CAN128, AT90CAN32, AT90CAN64, ATmega128, ATmega1280, ATmega1281, ATmega1284p, ATmega128RFA1, ATmega16, ATmega162, ATmega164p, ATmega168, ATmega169, ATmega2560, ATmega2561, ATmega32, ATmega324p, ATmega325, ATmega3250, ATmega328p, ATmega329, ATmega3290, ATmega329p, ATmega3290p, ATmega32U4, ATmega48, ATmega8, ATmega8515, ATmega8535, ATmega88, ATtiny13, ATtiny2313, ATtiny261.

 


По умолчанию поддерживаемые программаторы (список программаторов можно самостоятельно расширить, либо скачать с форума):

USBasp, USBtiny, AVR ISP mkII,SI-Prog, AVR910, AVR910, STK200, STK500, STK500 2.X, JTAG ICE mkII, JTAG ICE mkII ISP, JTAG ICE mkII PDI.

 

Основные отличия от аналогичных программ :

1. Возможность самостоятельного добавления программаторов, настройки скорости программирования и т.п;
2. Возможность самостоятельного добавления МК;
3. Редактирования и настройка отображения Fuses битов;
4. Выбор инверсных или прямых Fuses битов;
5. Окна вывода значений Fuses битов в HEX формате;
6. Сохранение настроек программирования при закрытии программы, т.е. при последующем открытии все настройки восстановятся;
7. «дублирование кнопки» — данная функция выводит на экран кнопку «Программировать», которая является полным функциональным аналогом кнопки «Программировать всё» и всегда будет находиться по верх всех окон. Кнопку можно переместить в удобную для вас зону монитора, свернув AVRDUDE_PROG. Удобна при многочисленном перепрограммировании МК.

 

 

Установка.

Разархивируйте файл usbprog.rar в любую удобную папку. Поместите ярлык программы «AVRDUDE_PROG» на рабочий стол. Установка завершена. Можно работать.

 

Возможности программы.

Настройки оболочки «AVRDUDE_PROG» реализованы в «ini» файлах. Что такое «ini» файлы можно посмотреть тут.
Теперь возможно самостоятельно добавлять и редактировать список микроконтроллеров, программаторов, портов, Fuses бит, добавить различные языки и пр.
Список контроллеров и состояний Fuses бит, редактируется в файле «atmel.ini», список программаторов и портов в файле «programm.ini», список поддерживаемых языков в файле «language.ini».

В файле «atmel.ini», все значения введены по умолчанию в соответствии с datasheet на МК, можете изменить по Вашему усмотрению. Никаких инверсий не требуется, значение по умолчанию вводиться в соответствии с datasheet на МК. В том случае, если МК нет в списке, или при выборе МК во вкладке Fuses везде «error», то Вам необходимо самостоятельно ввести значения в файл «atmel.ini» в соответствии с datasheet и приведённым ниже примером. Либо посмотреть на форуме. Файл «atmel.ini» находится в корневой папке программы.

В файле «programm.ini», введены значения программаторов для командной строки avrdude. В том случае, если используемый Вами программатор отсутствует в списке, либо необходимо изменить какие-либо параметры установленные по умолчанию, то необходимо ввести/редактировать его значения самостоятельно в соответствии с приведённым ниже примером. Либо посмотреть на форуме. Файл «programm.ini» находится в корневой папке программы.

В файле «language.ini», возможно отредактировать на «свой вкус» текстовую информацию оболочки, либо добавить язык программы AVRDUDE_PROG. Тут расписывать ничего не буду, думаю в файле «language.ini» всё понятно.

 

Добавление/редактирование списка МК. Работа с файлом «atmel.ini».

Окройте в любом текстовом редакторе (рекомендую Notepad++) файл «atmel.ini». Посмотрите как реализован ввод параметров МК, фузе битов и пр. Ниже привожу пример и описание парметров.

Пример на мк AT90CAN128

Заголовок раздела
[AT90CAN128] — имя МК которое появиться в выпадающем списке, «[» и «]» обязательны. В данном случае «AT90CAN128».

Параметр для типа МК
mcuavrdude=c128 // тип мк в avrdude


Значение и описание параметров раздела для Fuse битов

Lock байт
lockbytebit*enabled=0 // «*» — номер бита в Lock байте, «**enabled=0» — невозможно изменение состояния бита, «**enabled=1» — возможно изменение состояния бита. В данном случае изменение бита невозможно. Изменение бита будет недоступно.
lockbytebit*name=NOT USED // «*» — номер бита в Lock байте, «**name = NOT USED» — бит не используется. Если бит используется, вводиться его имя в соответствии с datasheet.
lockbytebit*def=1 // «*» — номер бита в Lock байте, «**def=» — если имя бит бита = «NOT USED», то значение вводится в соответствии с datasheet. В данном случае «1».

High байт
highbytebit*enabled=1 // «*» — номер бита в High байте, «**enabled=0» — невозможно изменение состояния бита, «**enabled=1» — возможно изменение состояния бита. В данном случае изменение бита возможно. Изменение бита будет доступно.
highbytebit*name=OCDEN // «*» — номер бита в High байте, «**name = OCDEN» — имя бита в соответствии с datasheet.
highbytebit*def=1 // «*» — номер бита в High байте, «**def=1» — значение бита по умолчанию, вводиться в соответствии с datasheet. В данном случае значение по умолчанию «1».

Low байт
lowbytebit*enabled=1 // «*» — номер бита в Low байте, «**enabled=0» — невозможно изменение состояния бита, «**enabled=1» — возможно изменение состояния бита. В данном случае изменение бита возможно. Изменение бита будет доступно.
lowbytebit*name=CKDIV8 // «*» — номер бита в Low байте, «**name = CKDIV8» — имя бита в соответствии с datasheet.
lowbytebit*def=0 //»*» — номер бита в Low байте, «**def=0» — значение бита по умолчанию, вводиться в соответствии с datasheet. В данном случае значение по умолчанию «0».

Extended/Fuse/Fuse байт
extendedbytebit*enabled=0 // «*» — номер бита в Extended/Fuse/Fuse байте, «enabled=0» — невозможно изменение состояния бита, «enabled=1» — возможно изменение состояния бита. В данном случае изменение бита невозможно. Изменение бита будет недоступно.
extendedbytebit*name=NOT USED //»*» — номер бита в Extended/Fuse/Fuse байте, «name = NOT USED» — бит не используется. Если бит используется, вводиться его имя в соответствии с datasheet.
extendedbytebit*def=1 // «*» — номер бита в Lock байте, «**def=» — если имя бит бита = «NOT USED», то значение вводится в соответствии с datasheet. В данном случае «1».

 

Добавление/редактирование списка программаторов. Работа с файлом «programm.ini».

Откройте в любом текстовом редакторе (рекомендую Notepad++) файл «programm.ini». Посмотрите как реализован ввод параметров программаторов. Ниже привожу пример и описание парметров.

Описание переменных файла.

[Name programmator] – имя программатора а выпадающем списке
progisp – программатор для командной строки avrdude
portprog – порт программатора для командной строки avrdude (Usb, com, lpt и пр.)
portenabled – окно изменение порта «1»-доступно, «0» — недоступно

 

Программатор AVR STK200 с поддержкой LPT.

Для добавления программатора AVR STK200 с поддержкой LPT в файл «programm.ini» можно добавить следующее:

[STK200LPT]
progisp=stk200
portprog=lpt1
portenabled=0

Сохраните файл «programm.ini»

В выпадающем списке «Настройки» -> «Программатор» появиться программатор « STK200LPT » с работой от lpt1 порта.
Всё работает аналогично для других параметров и программаторов, поддерживаемых avrdude.

 

AVRDUDE_PROG 3.3 (24.02.2014)

ВНИМАНИЕ!!! Обновлена версия avrdude 6.3 (22.01.2021)

Основные отличия от предыдущей версии:
— добавлено куча контроллеров, исправлены ошибки файлов «atmel.ini»,»avrdude.conf» — огромное спасибо модератору форума dmibr за проделанную работу!
— исправлены мелкие ошибки.
Если у Вас установлена программа версии 3.1 и выше, то достаточно заменить файл — «AVRDUDEPROG.exe»,»avrdude.exe»,»avrdude.conf»,»atmel.ini» . В этом случае все ранее сохранённые настройки в файлах «ini» не изменяться.

Размер файла: 690КБ
Статус программы: бесплатная
ОС: Windows NT/2000/XP/VISTA/WINDOWS 7
Интерфейс: русский, english
Разработчик: yourdevice
Версия: 3.3 (22.01.2021)

 

AVRDUDE_PROG 3.2

ВНИМАНИЕ!!! Актуально для версии 3.2 — ссылка на форум

Основные отличия от предыдущей версии:
— исправлено зависание программы в некоторых случая;
— исправлена ширина выпадающего списка программаторов;
— в диалоговом окне программы состояние avrdude выводиться в режиме онлайн, а не в конце программирования;
— исправлены мелкие ошибки.
Если у Вас установлена программа версии 3.1, то достаточно заменить только «exe» файл. В этом случае все ранее сохранённые настройки в файлах «ini» не изменяться.

Размер файла: 558КБ
Статус программы: бесплатная
ОС: Windows NT/2000/XP/VISTA/WINDOWS 7
Интерфейс: русский, english
Разработчик: yourdevice
Версия: 3.2 (03.08.2013)

Скачать.

 

AVRDUDE_PROG 3.1

Размер файла: 558КБ
Статус программы: бесплатная
ОС: Windows NT/2000/XP/VISTA/WINDOWS 7
Интерфейс: русский, english
Разработчик: yourdevice
Версия: 3.1 (18.10.2012)

Скачать.

 

AVRDUDE_PROG 3.0

Размер файла: 558КБ
Статус программы: бесплатная
ОС: Windows NT/2000/XP/VISTA/WINDOWS 7
Интерфейс: русский
Разработчик: yourdevice
Версия: 3.0

Скачать.

программирование в среде avr Studio – тема научной статьи по компьютерным и информационным наукам читайте бесплатно текст научно-исследовательской работы в электронной библиотеке КиберЛенинка

Компоненты и технологии, № 3’2004

AVR: программирование

в среде AVR Studio

Для программирования AVR-микроконтроллеров существует немало средств разработки, но наиболее популярным, несомненно, следует признать пакет AVR Studio. Есть ряд причин, объясняющих такую популярность. Это бесплатный пакет, разработанный фирмой Atmel, который объединяет в себе текстовый редактор, ассемблер и симулятор. Пакет AVR Studio также используется совместно с аппаратными средствами отладки. В предлагаемой статье на примерах рассматриваются приемы работы с пакетом, что поможет начинающим программистам быстрее понять взаимодействие отдельных компонентов AVR Studio.

Николай Королев

[email protected] Дмитрий Королев

[email protected]

Пакет AVR Studio имеет солидную историю развития, что отражается в количестве существующих версий. В конце 2003 года была выпущена версия 4.08, которая имеет ряд полезных дополнений, а в начале 2004-го вышло обновление (Service Pack 1), добавляющее поддержку AVR-контроллеров третьего поколения семейства ATmega48. Производство микросхем этого семейства намечено на вторую половину 2004 года.

Дистрибутив пакета и Service Pack можно найти на сайте www.atmel.com или получить компакт-диск с этим дистрибутивом у российского дистрибьютора фирмы Atmel.

Работу пакета AVR Studio удобно рассматривать на примере какой-либо конкретной программы. В качестве иллюстрации рассмотрим создание проекта для простейшей программы, которая будет по очереди зажигать два светодиода. Для определенности возьмем микросхему ATmega128 и подключим два светодиода к выводам 31 и 32 (это биты 6 и 7 порта D микросхемы ATmega128). AVR-контроллеры имеют мощные выходные каскады, типовой ток каждого вывода составляет 20 мА, максимальный ток — 40 мА, причем это относится как к втекающему, так и к вытекающему току. В нашем примере светодиоды подключены анодами к выво-

дам контроллера, а катоды через гасящие резисторы соединены с землей. Это означает, что светодиод зажигается подачей «1» на соответствующий вывод порта. Принципиальная схема приведена на рис. 1. На схеме также показаны две кнопки, которые будут использованы в одной из программ.

Здесь уместно сделать небольшое отступление о выборе типа микросхемы для простейшего примера. Действительно, с первого взгляда может показаться странным, зачем нужен такой мощный кристалл в 64-выводном корпусе там, где хватит и 8-вы-водной микросхемы ATtiny12? Однако в таком подходе есть логика. Известно, что в основе практически любого AVR-контроллера лежит одно и то же ядро. По большому счету, контроллеры различаются объемом памяти, количеством портов ввода-вывода и набором периферийных модулей. Особенности каждого конкретного контроллера — привязка логических имен регистров ввода-вывода к физическим адресам, адреса векторов прерываний, определения битов портов и т. д. описаны в файлах с расширением .inc, которые входят в состав пакета AVR Studio. Следовательно, используя конкретный тип кристалла, можно отлаживать программу как собственно для него, так и для любого младшего кристалла. Далее, если использовать в качестве отладочного самый старший кристалл — на сегодня это ATmega128, то можно отлаживать программу практически для любого AVR-контроллера; просто не надо использовать аппаратные ресурсы, которые отсутствуют у целевого микроконтроллера. Таким образом, например, можно отлаживать на ATmega128 программу, которая будет выполняться на ATtiny13. При этом исходный код останется практически тем же, изменится лишь имя подключаемого файла с 128def.inc на tn13def.inc. У такого подхода также есть свои преимущества. Например, «лишние» порты ввода-вывода можно использовать для подключения ЖК-индикатора, накото-рый можно выводить отладочную информацию. Или воспользоваться внутрисхемным эмулятором, который подключается к JTAG-порту микросхемы

Компоненты и технологии, № 3’2004

і — [C:\Shuples\S&uplel\Sbiiplel.ÎCPIg

■Ç1 SI і |Тглс* Мй*ы

їда

И*1р

4* * % Я 4 iS —

ІЗ V X J) 4.Т ов ж •

— в X

! Si II о + г*) (р

Yorkspac*

— It Saxplcl

J Accoablor

!-?1 ShttpUl.ftdi

jjp Projcct| ІД 1/0 Qbto

Рис. 5

. Припер -Sanplel* — моргание свеподиодами Без использования паймера • .и PD6 и PD7

. подключение файла описания ввоза-бибопа микросхемы АТьеда128 .include *itl28def.inc*

; начало программы begin

; первая операция — инициализация схека *

если эяоео не сделахь по первый же вызов подпрограммы или прерыван не верхеп управления оБра&но ; ухазааельна конец схеха усханавливаепся ка последний адрес вкцпренн Ida г16.lov(RAMEHD)

out spl.rlb

ldi г16.hîgh(ЯAMEND)

out sph,rl6

; для лого. члоБы упровляпъ свеподиодоми. подключенными к выводам PD6 необходимо объявunь эпи ко*ки выходными

для эхого нудно в соопвопсжвуюцио Бипы peeucapa DDRD (Data DxRcctio ldi rl&.(l<<6) I (1<<7)

Г*Г»©Г> с

liLJ

GÜ C:\Saapl«i\Sa&pl«l\S*Bpltl. я

ATmega128 (у контроллера ATtiny13 такой порт отсутствует). Таким образом, можно использовать единственную отладочную плату, на которой установлен «старший» AVR-контроллер, для отладки любых вновь разрабатываемых систем, естественно, базирующихся также на AVR-микроконтроллерах. Одна из таких плат называется AS-megaM. Именно она использовалась для создания примеров программ, приводимых в статье. Это универсальный одноплатный контроллер на базе микросхемы ATmega128, который содержит внешнее ОЗУ, два порта RS-232, порт для подключения ЖК-индикатора, внутрисхемного программатора и эмулятора AT JTAGICE. На плате также есть место для распайки микросхемы Flash-ПЗУ серии АТ45 в корпусах TSOP32/40/48 и двухканального ЦАП серии AD5302/12/22. Теперь, после объяснения причин использования AVR-монстра для зажигания пары светодиодов, можно идти дальше.

При программировании в среде AVR Studio надо выполнить стандартную последовательность действий:

• создание проекта;

• загрузка файла;

• компиляция;

• симуляция;

• загрузка hex-кода в микроконтроллер.

Создание проекта начинается с выбора строки меню Project/New Project (рис. 2). В открывшемся окне «Create new Project» надо указать имя проекта, (в нашем случае — sample 1) и имя файла инициализации (рис. 3). После нажатия кнопки Next открывается окно «Select debug platform and device» (рис. 4), где выбирается отладочная платформа (симулятор или эмулятор) и тип микроконтроллера. Можно выбрать один из предлагаемых внутрисхемных эмуляторов (заметим, что у каждого эмулятора свой список поддерживаемых микросхем). Для рассматриваемого примера мы выбираем в качестве отладочной платформы AVR Simulator и микросхему ATmega128. После нажатия кнопки Finish нашему взору предстают собственно рабочие окна пакета AVR Studio, пока пустые. Следует в правое окно поместить исходный текст программы. Это можно сделать двумя способами, либо набрать весь текст непосредственно в окне редактора, либо загрузить уже существующий файл. Ниже приведен полный текст простейшей программы с комментариями.

Пример «Управление светодиодами» написан для отладочной платы AS-MegaM Частота задающего генератора 7,37 МГц

светодиоды подключены к выводам PD6 и PD7 и через резисторы — на общий провод.

; подключение файла описания ввода-вывода микросхемы ATmega128

.include «m128def.inc»

; начало программы begin:

; первая операция — инициализация стека

; если этого не сделать, то вызов подпрограммы или прерывания ; не вернет управление обратно

; указатель на конец стека устанавливается на последний адрес внутреннего ОЗУ — RAMEND ldi r16,low(RAMEND)

out spl,r16

ldi r16,high(RAMEND)

out sph,r16

; для того чтобы управлять светодиодами, подключенными к выводам PD6 и PD7,

; необходимо объявить эти выводы выходными.

; для этого нужно записать «1» в соответствующие биты регистра DDRD (Data DiRection)

ldi r16,(1<<6) I (1<<7)

out DDRD,r16

; основной цикл программы

loop:

ldi r16,(1<<6) ; светится один светодиод

out PORTD,r16

rcall delay ; задержка

ldi r16,(1<<7) ; светится второй светодиод

out РОЯТБ,г16

rcall delay ; задержка

rjmp loop ; повторение цикла

; процедура задержки

; примерно полсекунды при частоте 7,37 МГц

; три пустых вложенных цикла соответственно

delay:

ldi r16,30 ; 30

delay1:

ldi r17,200 ; 200

delay2:

ldi r18,200 ; и еще 200 итераций

delay3:

dec r18

brne delay3

dec r17

brne delay2

dec r16

brne delay1

ret ; возврат в главную программу

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

Компиляция проекта производится командой /Project /Build или нажатием кнопки F7. Процесс компиляции отображается в окне «Output». Это окно можно «вытащить» командой /View /Output (рис. 6).

В принципе, мы уже получили выходной файл в формате .hex, который уже можно загружать в микросхему и наблюдать перемигивание светодиодов. Однако цель статьи — показать полный цикл работы в среде AVR Studio, поэтому мы переходим к стадии отладки. Это делается командой /Debug /Start Debugging (рис. 7). Теперь устанавливаем

О words 0 words 23 words

• Assembly coupletе wich no errors.

Deleting *C: \Sftfcples\Sai»plel\saBiplel. eep 1

Constants (dw/db)

Unused

Total

44 4 ► » \Build Д Messages / Find in Files /

Рис. 6

Компоненты и технологии, № 3’2004

. AVRStudio — [С:\Sa*ples\Saaplel\Sa*plel.asa]

[Pi File £roject Edit Vie« Tools

. □ Ы ÛP О

! 0 HU Ç] CH [ ¡Trace Disabled

Vorkfpact

В Ы Saaplel

В Assembler

*1 Samplel.asa

? Project

JÇ3i/o О1

; При ; мап ; све

. nog . incl

; иач begin

«. пер

; ec/i ; ив ; дка 1

для

нео

для

1

iiL

Ш С : \Said

Constant* (dw/db)

Unused

Total

0 word* 0 words 23 words

Debug ^ Window Help

[Г Start debugging li t

■ Stop Debugging Ctrl+Alt+F$ 1 t Mil

II £un gr«ttk FS Ctrl+FS L ogem >M (.

0 Shi<t*FS u PI

ft Step Into Fll ioga

ÏÏ1 Step fiver F10

ft Step Oyt Shift+Fll

*0 Run to £ursor Ctrl+F10 ca

S3 ¿uto Step Alt+F5 выэ<

¡{ext Breakpoint Ctrl*F9 гася

-3 Toggle Breakpoint

4b Remove Breakpoints

Trace ► Simu.

Stack Monitor ными л ты ]

♦ Show Next Statement

«V Quickwatch

Select ¿latforu and Device…

1

Ур/Download Me&ories…

Рис. 7

Èi ► ■ *1 и & <> H <P <ÎM> SB « «й

[stfp Into <h2)|

Рис. 9

в окне «Simulator Options» частоту кварца 7,3728 МГц для точного измерения времени выполнения программы (рис. 8). Остальные опции следует оставить без изменения. Теперь можно выполнять программу в пошаговом режиме при помощи мыши или кнопки F11 (рис. 9).

Пакет AVR Studio содержит мощные средства для просмотра и редактирования состояния внутренних регистров и портов ввода-вывода отлаживаемого микроконтроллера, а также время выполнения программы. Доступ к ним осуществляется через окно «I/O» (рис. 10). На самом деле, количество информации, доступное через окна просмотра пакета AVR Studio настолько велико, что для получения максимального комфорта нужно использовать компьютер с двумя мониторами.

Для отладки нашего примера, чтобы получить доступ к битам порта D, надо раскрыть строку I/O ATMEGA128 и затем строку PORTD. Теперь видны все три регистра этого порта, PORTD, DDRD и PIND. Чтобы уви-

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

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

Пример «Управление светодиодами от кнопок» написан для отладочной платы ЛБ-МедаМ

светодиоды подключены к выводам РБ6 и РБ7 и через резисторы — на общий провод.

; кнопки — на РЕ4 и РЕ5

.include «m128def.inc»

; основная программа begin:

; инициализация стека

ldi r16,low(RAMEND)

out spl,r16

ldi r16,high(RAMEND)

out sph,r16

; инициализация светодиодов ldi r16,(1<<6) I (1<<7)

out DDRD,r16

; инициализация выводов, к которым подключены кнопки (на вход) ; внутренние подтягивающие резисторы подключены ; для этого в PORTE нужно установить соответствующие биты в единицы

ldi r16,(1<<4) I (1<<5)

out PORTE,r16

; а в DDRE — в нули ldi r16,0

out DDRE,r16

; бесконечный цикл forever:

in r16,PINE ; теперь в r16 находится текущее «состоя-

ние» кнопок

com r16 ; кнопка «нажимается» нулем, поэтому

инвертируем регистр

lsl r16 ; переносим биты 4,5 в позиции 6,7

lsl r16 ; и обновляем «показания» светодиодов

andi r16,(1<<6) I (1<<7) out PORTD,r16

rjmp forever ; цикл выполняется бесконечно

Компоненты и технологии, № 3’2004

Таким образом, на примере простейших программ показаны некоторые возможности пакета AVR Studio. Надо понимать, что это лишь первое знакомство, позволяющее быстрее освоиться с базовыми командами пакета. Между тем, возможности рассматриваемого пакета намного шире. Например, здесь можно отлаживать программы, написанные на языках высокого уровня. В частности, С-компилятор фирмы ImageCraft пользуется отладчиком AVR Studio как «родным». Для этого при компиляции исходного кода надо установить опцию генерации выходного файла в формате, совместимом с AVR Studio. При этом появляется возможность производить отладку в исходных кодах.

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

• В меню Tools главного окна AVR Studio надо выбрать пункт Customize.

• В окне Customize выбрать пункт Tools.

• Двойным нажатием кнопки мыши или нажав Insert на клавиатуре, добавить новую команду в список и назвать ее «Программатор AS2».

• Указать путь к исполняемому файлу программатора, введя его непосредственно в поле Command, или нажав на кнопку «…» справа от этого поля.

Теперь в меню Tools появился пункт «Программатор AS2» (рис. 12).

Средства пакета AVR Studio 4.08 позволяют подключать вспомогательные программы — plugins. Первый plugin для AVR Studio — это программа графического редактора, упрощающая процесс инициализации ЖК-индикато-ра, которым может непосредственно управлять AVR-контроллер ATmega169. Максимальный логический размер ЖК-индикатора составляет 100 сегментов, каждому элементу индикатора ставится в соответствие бит в специальном регистре контроллера. Чтобы упростить рутинную процедуру привязки определенных битов к каждому сегменту, можно использовать вышеупомянутую программу.

Во время посещения «родины AVR», норвежского офиса фирмы Atmel, один из авторов статьи беседовал с Ларсом Квенилдом, руководителем группы программистов, которая создала и поддерживает пакет AVR Studio. Ларс Квенилд рассказал о перспективах развития пакета. В следующую версию (4.09) будет включен интерфейс для нового внутрисхемного эмулятора — JTAGICE mkII (он называется также AT JTAGICE2), который во второй половине года придет на смену AT JTAGICE. У этого эмулятора есть два существенных отличия. С одной стороны, добавлена

AVRStudio — (OAAfchive*\_AS-tods 10134ASmegaM\Fxamples a*m\

a Fie Pioiect E<* Vie«

QlüUeo % t

®l II 0 ❖ (*) {p (1И

1И E3 ПЙ I ~

Wo»k space

looh I Qebog Window Help

□ [14(4 Stecfc Bottom ^□ Data Stack Size

□ Used Piogwm Stac».

□ U »ed Data Stack О I/O ATMEGA128

♦ £> AD_CONVERTER

♦ О ANAL0G_C0MPARAT0R >, ® B00TJ.0AD

♦ И ГР! I

ÔVRProg

IC£50]ipgrad»

iS AS2 ptogrammei

Customize..

Qpbons..

Show Key assignments Plugr Manage«

STK500/AVRISP/JTAG IŒ

zi

IProject Ol/o Olnli.

первая о если ме верна икячдпр

S) D:\AicrtMs\_AS

Рис. 12

поддержка нового однопроводного отладочного интерфейса для младших AVR-контроллеров, debugWIRE. Этот интерфейс интересен тем, что он не занимает для своей работы дополнительные выводы микроконтроллера, так как использует для обмена вывод Reset микроконтроллера! С другой стороны (можно понимать это выражение буквально), у эмулятора AT JTAGICE2 появится, наконец, интерфейс USB для связи с компьютером.

Исходные коды этих и других примеров программ можно найти на сайте официального дистрибьютора фирмы Atmel в России (http:\\atmel.argussoft.ru).

В следующей части статьи будет рассказано об отладке в среде AVR Studio программ, написанных на языке С. МИ

Продолжение следует

Литература

1. Материалы технического семинара AVR Technical Training. Atmel. Norway. December 2003.

2. Н. Королев, Д. Королев. AVR-микроконтроллеры второго поколения: средства разработчика // Компоненты и Технологии. 2003. № 7.

3. Н. Королев, Д. Королев. AVR-микроконтроллеры второго поколения: новые аппаратные возможности // Компоненты и Технологии. 2003. № 4.

4. Н. Королев, Д. Королев. AVR-микроконтроллеры: большое в малом // Схемотехника. 2001. № 5.

5. Н. Королев, Д. Королев. AVR-микроконтроллеры: программные средства // Компоненты и Технологии. 2000. № 4.

6. Н. Королев. AVR: аппаратные средства разработчика // Компоненты и Технологии. 1999. № 1.

7. Н. Королев. RISC-микроконтроллеры фирмы Atmel // Chip-News. 1998. № 2.

8. Н. Королев, Д. Королев. AVR: новые 8-разрядные RISC-микроконтроллеры фирмы Atmel // Микропроцессор Ревю. 1998. № 1.

Устройство и программирование микроконтроллеров AVR. Микроконтроллер и как его победить.

Доброго дня уважаемые радиолюбители!
Приветствую вас на сайте “Радиолюбитель“

Что такое микроконтроллер, и для чего он нужен. Давайте обратимся к его определению:

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

То есть, по сути, микроконтроллер – это устройство, позволяющее воплотить в жизнь наши идеи (даже бредовые), но, естественно, в пределах своих возможностей. И самое главное, воплощение идеи в жизнь достигается не созданием навороченных электронных конструкций, а лишь только, в основном, силой нашей мысли (желаете стать волшебником?).
Наибольшей популярностью у радиолюбителей пользуются два вида микроконтроллеров:
PIC  – фирмы Microchip Technology
AVR – фирмы Atmel

Сразу хочу сделать небольшое отступление и пояснить одну свою позицию. Я не собираюсь ни сейчас, ни потом, рассуждать о достоинствах того или иного вида микроконтроллеров, того или иного программного обеспечения, и вообще всего, что связано с микроконтроллерами, что-то советовать, но а тем более – навязывать читателям. Все это дело вкуса, личных предпочтений и поставленных конечных целей в изучении микроконтроллеров. Ну а так как “необъятное – не объять”, все свое дальнейшее повествование я буду вести применительно к микроконтроллерам AVR и, не очень распространенной, но мной любимой, программы “Algorithm Builder”. У разных типов микроконтроллеров, программ, есть, конечно, различия, но многое у них и общее. А познавать мир микроконтроллеров мы будем так, чтобы потом, полученные знания можно было бы без проблем применить и к PICам, и к любому программному обеспечению. И еще раз напомню, данная серия статей – моя попытка помочь тем, кто впервые услышал о существовании микроконтроллеров и желает постичь работу с ними.

Что нужно для того, чтобы научиться работать с микроконтроллерами? Я бы выделил несколько, на мой взгляд, главных условий:
1. Желание и настойчивость.
Тут все очень просто: есть желание – все получится. А желание с настойчивостью – вообще, вещь суперская.
2. Знание устройства микроконтроллера.
Здесь не важны глубокие знания (да может и вообще не нужны), но знать, что имеется “на борту” микроконтроллера необходимо. Только зная из чего состоит микроконтроллер, какие устройства в нем есть, их возможности, как они работают – только тогда мы сможем использовать возможности микроконтроллера на полную катушку.
3. Знание языка программирования и команд управления микроконтроллером.
Как будет работать микроконтроллер, какие задачи вы на него возлагаете и как он будет их выполнять, определяется заложенной в него программой – программой которую для микроконтроллера составляете вы сами. И на этом пункте мы остановимся несколько подробней, чтобы рассмотреть вопросы, которые могут появиться в будущем.

Программа (в переводе это слово означает – “предписание”) – предварительное описание предстоящих событий или действий.

К примеру, мы хотим, чтобы микроконтроллер мигал светодиодом. Простенькая задача, но тем не менее, для того, чтобы микроконтроллер выполнил эту задачу, мы предварительно должны, шаг за шагом, описать все действия микроконтроллера, написать программу, которую он должен выполнить для получения нужного нам результата – мигающий светодиод. Нечто, вроде такого:
♦ Зажечь светодиод:
— настроить вывод к которому подключен светодиод для работы на вывод информации
— подать на этот вывод логический уровень, который позволит зажечь светодиод
♦ Подождать некоторое время:
— перейти к подпрограмме формирующей паузу (которую тоже нужно “разжевать”)
— по выполнению подпрограммы паузы вернуться в основную программу
♦ Погасить светодиод:
— подать на вывод логический уровень, гасящий светодиод
и так далее.
С термином Программа неразрывно связан другой термин – Алгоритм  (как Волк и Заяц, Том и Джерри).

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

Если в программе мы подробнейшим образом прописываем действия микроконтроллера, то в алгоритме мы определяем порядок действий микроконтроллера, на основе которых мы потом создадим программу. По аналогии с вышеприведенном примером:
♦ Зажечь светодиод
♦ Подождать некоторое время
♦ Погасить светодиод
и так далее.
Таким образом, алгоритм – это предшественник программы. И чем тщательно и продумано будет создан алгоритм, тем проще будет создавать программу.

Итого, программа для микроконтроллера – это последовательность действий микроконтроллера в виде набора команд и инструкций, которые он должен выполнить для достижения поставленных нами целей.

Команды для микроконтроллера имеют вид набора единичек и нулей:
00110101 011000100
так называемые – коды команд, а коды команд – это язык который понимает микроконтроллер.  А для того, чтобы перевести наш алгоритм с русского языка на язык микроконтроллера – в эти самые наборы нулей и единичек, существуют специальные программы.
Эти программы позволяют описать порядок работы для микроконтроллера на более-менее понятном для нас языке, а затем перевести этот порядок на язык понятный микроконтроллеру, в результате чего получается так называемый машинный код – последовательность команд и инструкций (те самые нули и единички) которые только и понимает микроконтроллер. Текст программы, написанный программистом, называется исходным кодом. Перевод программы с языка программирования (исходного кода) на язык микроконтроллера (машинный код) производится  трансляторами. Транслятор превращает текст программы в машинные коды, которые потом записываются в память микроконтроллера.
В таких программах порядок работы микроконтроллера описывается специальным языком – языком программирования. Язык программирования отличается от нашего, человеческого языка. Если наш язык общения служит в основном для того, чтобы обмениваться информацией, то:

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

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

01000110
10010011
01010010

Вряд-ли кто сможет разобраться в таком наборе комбинаций из двух цифр, а труд первых программистов был очень трудоемкий. Для облегчения своей жизни, программисты и стали создавать первые языки программирования. Так вот, чем ближе язык программирования к такому набору нулей и единиц тем больше он “низкого уровня”, а чем дальше от них – тем больше “высокого уровня”.
Самые распространенные языки программирования для микроконтроллеров:
— язык низкого уровня – Ассемблер
– язык высокого уровня – С (Си)
Давайте посмотрим на примере их различия (эти примеры абстрактные).
Допустим нам надо сложить два числа: 25 и 35.
В машинных кодах эта команда может выглядеть так:
00000101 1101001
На языке низкого уровня:
ADD Rd, Rr
На языке высокого уровня:
25+35
Различие языков низкого и высокого уровня видны невооруженным глазом, комментарии, как говорится, излишни.
Но давайте копнемся в этих примерах поглубже. Пример машинного кода разбирать не будем, так как он идентичен примеру на Ассемблере. По своей сути, Ассемблерные команды это те же машинные коды (команды) которым просто, чтобы не заблудиться в нулях и единицах, присвоены буквенные аббревиатуры. Ассемблерной командой ADD Rd, Rr мы ставим микроконтроллеру задачу сложить два числа, которые находятся (а для этого мы должны их туда предварительно записать) – первое в Rd, второе в Rr, а результат сложения поместить в Rd. Как видите мы ставим очень конкретную задачу микроконтроллеру: где взять, что с этим сделать и куда поместить результат. В этом случае мы работаем напрямую с микроконтроллером.
Команда на языке высокого уровня: 25+35, привычная для нас математическая запись, радующая наш глаз. Но в этом случае мы не работаем напрямую с микроконтроллером, мы просто ставим ему задачу сложить два числа. Результат и последовательность действий в данном случае будет тот-же, что и при выполнении ассемблерной команды: сначала эти два числа будут куда-то записаны, затем сложены а результат куда-то помещен.
И вот тут кроется главное отличие языков высокого уровня и низкого уровня. Если в Ассемблере мы контролируем весь процесс (хотим мы того, или нет): мы знаем где записаны эти два числа, и мы знаем где будет находиться результат, то в языке высокого уровня мы процесс не контролируем. Программа сама решает куда предварительно записать числа и куда поместить результат. В большинстве случаев нам это и не надо знать, ведь для нас главное итог – число 60 на выходе. Как результат, программы на языках высокого уровня более читаемы, приятны для глаза и меньше по размеру – ведь нам не приходится “лезть во все дыры” и расписывать каждый шаг микроконтроллера, программа это делает потом за нас, когда компилирует ее – переводит в машинные коды. Но тут есть и минус. Два одинаковых алгоритма написанных на Ассемблере и на Си, после преобразования их в машинные коды будут иметь разный размер: программа написанная на Ассемблере будет на 20-40% короче программы написанной на Си – черт его знает, каким путем идет Си для достижения нужного нам результата. И бывают случаи, когда нет доверия к языку высокого уровня и в программе на Си делают вставки кода, написанные на Ассемблере.
Профессиональные программисты, как правило, знают несколько языков программирования (или работают в команде, в которой есть специалисты по разным языкам), творчески соединяя их возможности и преимущества в одной программе. Ну а нам, любителям, надо знать хотя бы один язык (для начала), и начинать надо (а я в этом твердо уверен, и никто меня не переубедит) с языка низкого уровня – Ассемблера.

Ну что, я думаю и тут нам все понятно, – язык программирования изучать надо, по-другому – никак.

Команды и инструкции для управления микроконтроллером.
У микроконтроллеров AVR более 130 различных команд, которые позволяют ему реализовать все заложенные в нем возможности. Но сразу скажу – мало кто из любителей знает их все и тем более пользуется всеми. Обычно, в любительской практике хватает знания и половины команд, а то и меньше. Но изучать команды надо. Чем больше команд вы будете знать, тем изощреннее (в хорошем смысле слова) и элегантнее программы будут получаться.

Итого, будем считать, что желание у нас есть, настойчивость проявим, язык изучим, команды освоим, и, как итог, – одержим победу!

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


Следующие статьи:
♦ Микроконтроллер и системы счисления
♦ Микроконтроллер и логические операции
♦ Общее устройство микроконтроллера
♦ Арифметико-логическое устройство и организация памяти – память программ, память данных, энергонезависимая память
♦ Регистры общего назначения, регистры ввода/вывода, стек, счетчик команд
♦ Регистр состояния SREG
♦ Порты ввода/вывода микроконтроллера



Начало работы с микроконтроллерами AVR®

Это серия видео- и практических занятий, посвященных основам разработки микроконтроллеров AVR ® . Проекты разрабатываются с нуля с использованием таблицы данных, AVR LibC и более поздних заметок о приложении в качестве основных ссылок на программирование (START не используется).
В серии видеороликов представлены несколько периферийных устройств AVR, включая GPIO, таймер/счетчик, USART и АЦП.В процессе обучение развивается в направлении создания примерного приложения, которое замеряет аналоговый датчик освещенности с помощью АЦП, а затем пропорционально обновляет рабочий цикл ШИМ на основе показаний датчика АЦП. Затем усредненное значение датчика отправляется через USART на терминал ПК.

Автономное обучение можно загрузить как «Примечание по применению AN17644 — Начало работы с микроконтроллером AVR» , которое содержит следующие проекты:

  1. Переключение светодиода на кнопку
  2. Уменьшение яркости светодиода с помощью ШИМ, с помощью TC1
  3. Канал АЦП считывается каждые 500 мс, а LED0 переключается
  4. Оптимизация энергопотребления и спящий режим

Вы также можете получить доступ к этому обучению из базы данных Atmel START.
Проект Atmel Start — Начало работы с микроконтроллером AVR

Этот тренинг представляет собой комбинированное решение упомянутых выше проектов. В этом комбинированном решении добавляется код оптимизации энергопотребления, спящий режим выбирается как POWERDOWN, считывается канал 0 АЦП и генерируется ШИМ на PB1 с использованием TC1.

После инициализации периферийных устройств устройство переходит в спящий режим и выходит из спящего режима по прерыванию PB7 по смене контакта. При нажатии SW0 (PB7) на ATmega328PB устройство просыпается, затем считывает канал ADC0 и ждет 10 секунд.В это время наблюдается затемнение светодиода на PB1 (подключите PB1 к PB5 на ATmega328PB Xplained Mini). Через 10 секунд устройство снова переходит в спящий режим.

ПОДДЕРЖИВАЕМЫЙ НАБОР ДЛЯ ОЦЕНКИ

  • ATmega328PB Xplained Mini

ЗАПУСК ДЕМО ПРОЕКТА START

  1. Нажмите «Загрузить пакет» и сохраните файл .atzip.
  2. Импорт файла .atzip в Atmel Studio 7, Файл > Импорт > Atmel Start Project .
  3. Сборка и прошивка в поддерживаемую оценочную плату.
  4. На ATmega328PB Xplained Mini подключите PB1 к PB5, так как LED0 подключен к PB5. Затем подключите PC0 к 3V3, так как PC0 является каналом 0 АЦП.
  5. Устройство переходит в спящий режим.
  6. Нажмите «SW0» на ATmega328PB Xplained Mini, чтобы вывести устройство из спящего режима. Канал АЦП считывается, затем подождите 10 секунд. Наблюдайте затемнение светодиода в течение 10 секунд.
  7. Через 10 секунд устройство снова переходит в спящий режим. В спящем режиме диммирование светодиода не наблюдается, так как в спящем режиме POWERDOWN TC1 также останавливается.

Ресурсы для ваших первых шагов с AVR C++ и написания крутого C

В мире встраиваемых устройств доминирует C и его производные, прежде всего C++. В наши дни очень немногие люди изучают C как свой первый язык. В большинстве случаев новый производитель Arduino изучил BASIC или Python в школе или университете.

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

В этом коротком посте я хотел бы поделиться несколькими ресурсами, которые вы можете использовать, чтобы вывести свои навыки C/C++ на «следующий уровень».

Если вы новичок в C, начните с книги MIT How to Write Awesome C. Это краткое руководство, написанное в помощь участникам конкурса MIT Autonomous Robot Design.

Как только вы хорошо разберетесь в C, вы можете перейти на C++. Если вы хотите изучать C++ специально для использования с микроконтроллерами AVR, вам необходимо выполнить двухэтапный процесс. Сначала ознакомьтесь с основами C++ (вам не нужно становиться экспертом), а затем ознакомьтесь со спецификой C++ AVR.

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

Прочтите эту статью для получения информации о том, какие части C++ доступны в AVR.

Тогда вы будете более подготовлены к изучению AVR C++, задокументированного Atmel.Вот исходная документация. Этот документ требует большого терпения, чтобы прочитать его, но помните о нем как о справочном источнике. Отличный учебник, который поможет вам начать программировать микроконтроллер AVR вне среды Arduino, — это учебник от Hackaday (перейдите сразу к части 4).

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

Приятного творчества!

Какой язык вы рекомендуете для программирования микроконтроллеров AVR?

Мой планшет Lilly умер Мне удалось отломить USB-разъем, я смог напрямую подключить USB-кабель к плате, но не могу найти много данных об этой конкретной плате. (Плата Duinotech Lilypad https://www.jaycar.com.au/arduino-совместимая-duinotech-lilypad-board/p/XC4620) Нетрудно заставить устройство мигать встроенным светодиодом. Я попытался немного углубиться в чип, используя указатели (я все еще изучаю их.) Задача состояла в том, чтобы прочитать значение регистра порта, когда оно переходит в высокий/низкий уровень встроенного светодиода ATMega 32U4, но веб-редактор Arduino, похоже, не работает с ними (* &) или я просто использую их Неправильный путь. Не поможет, если сломаешь разъем USB. Я использовал последовательный монитор для просмотра внутренней части чипа. Собираюсь взломать свой квадрокоптер и вытащить AutoPilotMega, который по сути представляет собой ATmeg256 с кучей крутых датчиков, подключенных к нему, будет позором удалить программу автопилота и заменить ее на BLINK, но во имя открытия и обучения … Надеюсь, я смогу перезагрузить программу автопилота обратно в APM. Да, это должен быть ArduPilotMega, а не AutoPilotMega.

Процесс записи флэш-памяти AVR и описание программы

Сегодня, после многих дней ожидания (спасибо за терпение) у вас появилась возможность запрограммировать микроконтроллер AVR atmega8. Как было сказано ранее, для этой задачи вам понадобится один программатор USBASP. Просто подключите выход программатора (6 линий VCC, GND, RESET, SCK, MOSI, MISO) к соответствующим контактам без питания мишени atmega8 (которую вы разместили на макетной плате).Последнее, что вам нужно, это программа (инструмент для записи) для записи флешки! Чтобы записать программу, вы можете использовать это простое и удобное программное обеспечение для записи, которое на самом деле представляет собой графический интерфейс для AVRDUDE (инструмент командной строки). Программу «AVRLoader» можно скачать с моего Google Диска по этой ссылке http://goo.gl/cfIcIV. (Вы также можете попробовать это: http://extremeelectronics.co.in/avr-tutorials/guisoftware-for-usbasp-based-usb-avr-programmers/)

Процесс записи флэш-памяти

  1. Запустить AVRLoader
  2. Выберите микроконтроллер (Atmega8)
  3. Укажите файл .hex-файл (ваш .hex-файл в папке «по умолчанию» внутри папки проекта)
  4. Нажмите WriteButton (в опции «Flash»)

Когда закончите, отсоедините USBASP программатор от макетной платы. Теперь возьмите один светодиод и подключите анод светодиода к контакту 28 Atmega8 на макетной плате, а катод светодиода подключите к шине 0 В (GND) через резистор 1 кОм. Наконец, подключите блок питания макетной платы 5 В и следите за своим первым проектом AVR.

Записанная программа включает и выключает контакт 28 порта PORTC ATMega 8, поочередно, с заданной задержкой (светодиод должен мигать с частотой 1 сек).Обратите внимание, что до тех пор, пока вы не запишете фьюз-биты для внешнего генератора (обсудим это позже), по умолчанию Atmega8 работает на откалиброванном внутреннем RC-генераторе с частотой 1 МГц. Вот почему в нашем первом проекте внешний Xstal не используется.

Описание программы

#define F_CPU 1000000UL //определение тактовой частоты
#include //включить заголовочный файл ввода/вывода
#include //включает заголовочный файл задержки
интервал основной (пустой) {
   //Установить регистр направления данных для вывода
   ДДРК |= (1
 

В этом фрагменте кода мы определили макрос F_CPU в первой строке для указания тактовой частоты микроконтроллера.Этот макрос будет использоваться функцией задержки. Во второй строке мы включили заголовочный файл для использования некоторых готовых функций и ключевых слов. В третьей строке подключается еще один файл для создания задержки. Эта функция существует в папке «util» в каталоге включения по умолчанию. После запуска основной функции наша первая строка устанавливает регистр направления данных (DDR) на вывод. DDRC указывает PORTC (аналогично, PORTB может обозначаться DDRB).

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

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

.
  • Изменить частоту мигания светодиода
  • Замените выходной контакт светодиода (с контакта 28) Atmega8
  • Увеличьте количество контактов светодиода с одного (только контакт 28) до большего количества контактов PORTC
  • .

Источник часов!

Как указывалось ранее, ATMega8 поставляется с источником тактовой частоты, настроенным на внутренний RC-генератор с частотой 1 МГц по умолчанию.Эта конфигурация хорошо работает для многих простых проектов, где время не имеет решающего значения, а также удобна, поскольку уменьшает количество внешних компонентов. Однако вы можете столкнуться с ситуациями, когда вам нужен более точный источник тактовой частоты, а для этого необходимо добавить внешний кварцевый генератор. Кварцевый генератор подключен к микроконтроллеру, как показано ниже. Чтобы настроить микроконтроллер на использование внешнего кварцевого генератора, необходимо изменить «биты предохранителя». Для новичка биты предохранителей AVR кажутся очень суетливыми, но это не так!

→ Часть 5: Источник тактового сигнала и биты предохранителей
← Часть 3: Программатор USB ASP и программирование Atmega

Учебники по сборке AVR

Дом / Учебники AVR ASM /

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


Начало работы

  • Зачем изучать сборку?
  • Сложно ли собрать AVR?
  • Сборщики
  • Пример программы №1: светодиод
  • Структура программы на языке ассемблера
  • Типы памяти AVR

Немного более продвинутый

  • Пример программы №2: добавление 16-битных чисел
  • Использование рабочих регистров общего назначения
  • Пример программы №3: Мигание
  • Регистр статуса
  • Управление потоком программы

Подпрограммы

  • Пример программы №4: подпрограмма задержки
  • Вызовы функций и указатель стека
  • Макросы Ассемблера

Регистры ввода/вывода и память

  • Работа с регистрами ввода/вывода
  • Использование расширенного ввода-вывода и SRAM
  • Загрузка данных из памяти программ
  • Пример программы № 5: максимальное, минимальное и среднее значение массива

Связь по UART

  • Запись подпрограмм UART
  • Создание макросов UART

Математика

  • Двоичный раздел
  • 8-битные подпрограммы деления Atmel
  • 16-битные подпрограммы деления Atmel

avr-libc: avr-libc и программы на ассемблере

Может быть несколько причин для написания кода для микроконтроллеров AVR с использованием исходного кода на чистом ассемблере.Среди них:

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

Обычно все, кроме первого, можно легко сделать с помощью встроенного ассемблера компилятора.

Хотя avr-libc в первую очередь предназначена для поддержки программирования микроконтроллеров AVR с использованием языка C (и C++), существует также ограниченная поддержка прямого использования ассемблера.Преимущества:

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

Для целей, описанных в этом документе, ассемблер и компоновщик обычно вызываются не вручную, а с помощью внешнего интерфейса компилятора C ( avr-gcc ), который, в свою очередь, вызывает ассемблер и компоновщик по мере необходимости.

Этот подход имеет следующие преимущества:

  • Существует только одна программа, которую можно вызвать напрямую, avr-gcc , независимо от фактического используемого исходного языка.
  • Вызов препроцессора C будет автоматическим и будет включать соответствующие параметры для поиска необходимых включаемых файлов в файловой системе.
  • Вызов компоновщика будет автоматическим и будет включать соответствующие параметры для поиска дополнительных библиотек, а также код запуска приложения ( crt ​​ XXX .o ) и скрипт компоновщика.

Обратите внимание, что вызов препроцессора C будет автоматическим, когда имя файла, указанное для файла ассемблера, заканчивается на .S (заглавная буква «s»). Это применимо даже к операционным системам, которые используют файловые системы без учета регистра, поскольку фактическое решение принимается на основе регистра суффикса имени файла, указанного в командной строке, а не на основе фактического имени файла из файловой системы.

В качестве альтернативы использованию .S для этой цели распознается суффикс .sx (начиная с GCC 4.3.0). Это в первую очередь предназначено для совместимости с другими средами компилятора, которые ранее предоставляли этот вариант, чтобы справиться с операционными системами, в которых имена файлов нечувствительны к регистру (и с некоторыми версиями сделать , которые не могли различать .s и .S на таких системах).

Кроме того, язык можно явно указать с помощью параметра -x assembler-with-cpp .

В следующем аннотированном примере используется простой генератор прямоугольных сигналов с частотой 100 кГц, использующий AT90S1200 с тактовой частотой 10,7 МГц. Контакт PD6 будет использоваться для вывода прямоугольной волны.

работа = 16; Примечание [2]

tmp = 17

inttmp = 19

intsav = 0

КВАДРАТ = PD6 ; Примечание [3]

; Примечание [4]: ​​

tmconst= 10700000 / 200000 ; 100 кГц => 200000 фронтов/с

fuzz= 8 ; # часы в ISR до тех пор, пока TCNT0 не будет установлен в

.section .text

.global main ; Примечание [5]

main:

rcall ioinit

1:

rjmp 1b ; Примечание [6]

.global TIMER0_OVF_vect ; Примечание [7]

TIMER0_OVF_vect:

ldi inttmp, 256 — tmconst + fuzz

out _SFR_IO_ADDR(TCNT0), inttmp ; Примечание [8]

в intsav, _SFR_IO_ADDR(SREG) ; Примечание [9]

SBIC _SFR_IO_ADDR (PORTD), Square

RJMP 1F

SBI _SFR_IO_ADDR (PORTD), квадратный

RJMP 2F

1: CBI _SFR_IO_ADDR (PORTD), Square

2:

OUT _SFR_IO_ADDR (SREG), INTSAV

ioinit:

sbi _SFR_IO_ADDR(DDRD), SQUARE

out _SFR_IO_ADDR(TIMSK), работа

ldi работа, _BV(CS00) ; tmr0: CK/1

out _SFR_IO_ADDR(TCCR0), work

ldi work, 256 — tmconst

out _SFR_IO_ADDR(TCNT0), work

ret

.глобальный __vector_default ; Примечание [10]

__vector_default:

.end

Примечание [1]

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

Примечание [2]

Назначение регистров символическим именам, используемым локально. Другой вариант — использовать вместо этого макрос препроцессора C:

Примечание [3]

Номер бита для выходного сигнала прямоугольной формы.Обратите внимание, что правая часть состоит из макроса CPP, который будет заменен своим значением (в данном случае 6) перед фактической передачей ассемблеру.

Примечание [4]

При вычислении выражений ассемблер использует целочисленные операции с заданным хостом целочисленным размером (32 бита или больше). Это отличается от компилятора C, который по умолчанию использует тип C int для вычисления константных целочисленных выражений.
Чтобы получить на выходе 100 кГц, нам нужно переключать линию PD6 200000 раз в секунду.Поскольку мы используем таймер 0 без каких-либо опций предварительного масштабирования, чтобы получить желаемую частоту и точность, мы уже упираемся в серьезные соображения по времени: при приеме и обработке прерывания переполнения таймер уже продолжает считать. Таким образом, при предварительной загрузке регистра TCCNT0 мы должны учитывать количество тактов, необходимых для подтверждения прерывания, и инструкции для перезагрузки TCCNT0 (4 такта для подтверждения прерывания, 2 такта для перехода от прерывания). вектор, 2 цикла для 2 инструкций, перезагружающих TCCNT0 ).Вот для чего нужна константа fuzz .

Примечание [5]

Внешние функции должны быть объявлены как .global. main — это точка входа приложения, к которой будет выполнен переход из процедуры инициализации в crts1200.o .

Примечание [6]

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

Примечание [7]

Функции прерывания могут получать обычные имена, которые также доступны программам на C. Затем компоновщик поместит их в соответствующие слоты вектора прерывания. Обратите внимание, что они должны быть объявлены .global, чтобы быть приемлемыми для этой цели.Это будет работать, только если был включен. Обратите внимание, что ассемблер или компоновщик не имеют возможности проверить правильность написания функции прерывания, поэтому ее следует перепроверить. (При анализе результирующего объектного файла с использованием avr-objdump или avr-nm должно появиться имя типа __vector_ N , где N — небольшое целое число.)

Примечание [8]

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

Примечание [9]

Процедуры прерывания не должны затирать глобальное состояние ЦП.Таким образом, обычно необходимо сохранить хотя бы состояние флаговых битов в SREG . (Обратите внимание, что это служит здесь только в качестве примера, так как на самом деле все следующие инструкции также не изменяют SREG , но обычно это не так.)
Кроме того, необходимо убедиться, что регистры, используемые внутри процедуры обработки прерывания, не конфликт с теми, которые используются снаружи. В случае устройства без ОЗУ, такого как AT90S1200, это можно сделать только путем согласования набора регистров, которые будут использоваться исключительно внутри процедуры прерывания; другого шанса «сохранить» реестр не было бы.
Если процедура прерывания должна быть связана с модулями C, необходимо соблюдать правила использования регистров, установленные компилятором C. Кроме того, любой регистр, измененный внутри службы прерывания, необходимо сохранить, обычно в стеке.

Примечание [10]

Как объяснено в разделе Прерывания, глобальный «универсальный» обработчик прерывания, который получает все неназначенные векторы прерывания, может быть установлен с использованием имени __vector_default . Это должно быть .global и, очевидно, должен заканчиваться инструкцией reti . (По умолчанию вместо этого подразумевается переход к ячейке 0.)

Доступные псевдооперации в ассемблере описаны в руководстве по ассемблеру GNU (gas). Руководство можно найти в Интернете как часть текущей версии binutils по адресу http://sources.redhat.com/binutils/.

Поскольку gas исходит из Unix, его псевдооперационный и общий синтаксис ассемблера немного отличается от того, который используется другими ассемблерами.Числовые константы следуют нотации C (префикс 0x для шестнадцатеричных констант), выражения используют синтаксис, подобный C.

Некоторые распространенные псевдооперации включают:

  • .byte размещает однобайтовые константы
  • .ascii размещает незавершенную строку символов
  • .asciz выделяет строку символов, заканчивающуюся \0 (строка C)
  • .data переключается в раздел .data (инициализированные переменные RAM)
  • .текст переключается на раздел .text (код и константы ПЗУ)
  • .set объявляет символ как постоянное выражение (идентично .equ)
  • .global (или .globl) объявляет общедоступный символ, который виден компоновщику (например, точка входа в функцию, глобальная переменная)
  • .extern объявляет символ, определяемый извне; это фактически только комментарий, так как газ в любом случае обрабатывает все неопределенные символы, с которыми он сталкивается, как глобально неопределенные

Обратите внимание, что .org также доступен в газе, но это довольно бессмысленная псевдооперация в среде ассемблера, использующая перемещаемые объектные файлы, поскольку именно компоновщик определяет конечное положение некоторого объекта в ПЗУ или ОЗУ.

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

  • lo8 Берет младшие 8 битов 16-битного целого числа
  • hi8 Берет старшие 8 битов 16-битного целого числа
  • pm Берет адрес памяти программ (ПЗУ) и преобразует его в адрес ОЗУ.Это подразумевает деление на 2, поскольку AVR обрабатывает адреса ПЗУ как 16-битные слова (например, в инструкции IJMP или ICALL ), а также может обрабатывать перемещаемые символы с правой стороны.

Пример:

 ldi r24, lo8(pm(somefunc))
ldi r25, hi8 (pm (somefunc))
назови что-нибудь
 

Это передает адрес функции somefunc в качестве первого параметра функции something .

.

0 comments on “Программы на avr: Страница не найдена

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

Ваш адрес email не будет опубликован.