Программы для микроконтроллеров
PCB CAD Черчение схем Аудио-софт Микроконтроллеры Измерения Генераторы Расчеты Android Разное
Atmel Studio
Интегрированная среда разработки (IDE) от компании Atmel для разработки приложений под микроконтроллеры ARM Cortex-M и AVR. Freeware
Подробнее
AVRDUDE
Консольная программа для считывания, изменения и записи содержимого памяти микроконтроллеров архитектуры AVR, применяющая технологию внутрисхемного программирования. Есть русифицированные графические оболочки. Freeware
Подробнее
WinAVR
Мощная среда разработки с открытым исходным кодом, созданная с целью написания программ для микроконтроллеров серии AVR от компании Atmel. Freeware
Подробнее
BASCOM-AVR
Среда разработки программного кода для микроконтроллеров серии AVR компании Atmel на языке, подобном стандартному Бейсику. Freeware (бесплатная с ограничением на код 4 кБ) и Shareware
CodeVisionAVR
IDE для AVR микроконтроллеров. Из основных достоинств CodeVisionAVR можно отметить то, что он не слишком сложен для самостоятельного освоения, поддерживает все многочисленное семейство микроконтроллеров AVR, формирует емкий и результативный программный код. Платная, есть бесплатная Evaluation-версия с ограничением на код 4 кБ.
Подробнее
VMLAB
Инструмент для разработки и отладки программного кода, а также моделирования работы радиотехнических устройств на базе AVR микроконтроллеров. Freeware
Подробнее
MPLAB
Единая бесплатная интегрированная среда разработки для контроллеров производства Microchip
Подробнее
MPIDE
Среда разработки, выполненная на базе открытой системы Arduino IDE и предназначенная специально для контроллеров PIC32 от компании Microchip Technology.
Подробнее
WinPic800
Небольшой, но весьма эффективный бесплатный программный пакет для прошивки PIC-микроконтроллеров различных серий. Есть русский язык.
Подробнее
PICPgm
Простое программное обеспечение для прошивки PIC-микроконтроллеров, отличающееся стабильностью, качеством и скоростью программирования. Freeware
Подробнее
CooCox CoIDE
Бесплатная высокоинтегрированная программная среда, предназначенная для разработки кода микроконтроллеров архитектуры ARM и др.
Подробнее
Keil uVision
Среда разработки, представляющая собой набор утилит для выполнения полного комплекса мероприятий по написанию программного обеспечения для микроконтроллеров различных семейств. Платная, но есть демоверсия с рядом ограничений, в т.ч. на размер кода — не более 32 КБ.
Подробнее
IAR Embedded Workbench
Многофункциональная среда разработки приложений на языках C, C++ и ассемблере для целого ряда микроконтроллеров от различных производителей. Среда разработки платная, но бесплатная версия с ограничениями на размер кода в зависимости от микроконтроллера.
Подробнее
Flowcode
Один из передовых графических языков программирования для микроконтроллеров. Поддержка русского языка. Платная, но есть бесплатная версия с ограничениями и только для микроконтроллеров PIC.
Подробнее
Algorithm Builder
Бесплатная графическая среда программирования для разработки приложений под микроконтроллеры с архитектурой AVR от отечественных разработчиков.
Подробнее
MikroC
Мощнейшая среда разработки программ для микроконтроллерных устройств, включающая редактор кода, компилятор, отладчик, программные и аппаратные библиотеки, использующие готовые функции. Программа платная. Есть бесплатная версия с ограничениями.
Подробнее
mikroPascal
Мощная среда разработки приложений на языке Паскаль для различных архитектур микроконтроллеров. Программа платная. Есть бесплатная версия с ограничениями на размер кода (до 4096 байт).
Подробнее
mikroBasic
Среда разработки программ на языке Бейсик для микроконтроллеров различных производителей. Программа платная от 199$. Есть бесплатная версия с ограничениями на размер кода (до 4096 байт).
Подробнее
MicroCode Studio Plus
Программа для создания и отладки кода, написанного на языке программирования BASIC, под PIC-микроконтроллеры. Программа платная 50$. MicroCode Studio – облегченный, бесплатный вариант с ограничением на кол-во строк кода.
Подробнее
IC Prog
Одна из самых популярных бесплатных оболочек для программирования, поддерживающая огромное число микроконтроллеров, ППЗУ и адаптеров различной конструкции. На русском языке.
Подробнее
Pony Prog 2000
Нетребовательная и многофункциональная программа — программатор, предназначенная для работы с микроконтроллерами и постоянными запоминающими устройствами с последовательным доступом различных производителей. На русском языке.Freeware.
Подробнее
SinaProg
Графическая оболочка для программы AVRdude, включающая в себя простой и функциональный AVR fuse-калькулятор. Freeware.
Подробнее
AVR8 Burn-O-Mat
Графическая оболочка для популярной программы AVRDUDE, использующейся при прошивке микроконтроллеров компании Atmel. Freeware.
Подробнее
Khazama AVR Programmer
Небольшая программа, созданная с целью быстрой прошивки микроконтроллеров Atmel AVR.
Подробнее
UniProf
Простой, бесплатный, универсальный программатор для микроконтроллеров семейства AVR.
Подробнее
eXtreme Burner — AVR
Бесплатное программное обеспечение, предназначенное для прошивки AVR-микроконтроллеров.
Подробнее
Code Composer Studio
Интегральная среда проектирования, предназначенная для создания программного обеспечения, использующегося в процессорах и микроконтроллерах компании Texas Instruments Incorporated. Программа платная, бесплатная версия CCS-FREE с рядом ограничений.
Подробнее
TivaWare
Набор высококачественных, полноценных библиотек для контроллеров семейства TIVA от Texas Instruments. Freeware.
Подробнее
FastAVR
Один из лучших компиляторов Basic-подобного языка для серии восьмибитных микроконтроллеров AVR.
Подробнее
Atollic TrueSTUDIO
Интегрированная среда разработки программ для ARM-процессоров, включающая в себя GNU компилятор и отладчик. Среда разработки платная, но есть бесплатная версия TrueSTUDIO Lite с рядом ограничений.
Подробнее
Sourcery CodeBench
Самодостаточная интегрированная среда разработки, предназначенная для создания приложений на C/C++ для IA32, ColdFire, Power, MIPS, ARM и некоторых других архитектур микроконтроллерных устройств. Платная 400$ (есть 30-дневная ознакомительная версия)
Подробнее
CODESYS
Программно-инструментальный комплекс, основанный на стандарте IEC 61131-3 и предназначенный для программирования промышленных контроллеров и компьютеров. На русском языке. Freeware.
Подробнее
Flash Magic
Бесплатное приложение для программирования микроконтроллеров компании NXP Semiconductors
Подробнее
STEP 7-Micro/WIN
Простое и удобное программное обеспечение, созданное для работы с программируемыми контроллерами серии SIMATIC S7-200 компании Siemens AG. Платная.
Подробнее
многофункциональное и высокопроизводительное программное обеспечение, предназначенное в первую очередь для симуляции в реальном времени цифровых и аналого-цифровых схем, ядром которых выступает микроконтроллер PIC micro. Бесплатное
Подробнее
PIC Simulator IDE
Программа, предназначенная для отладки кода контроллеров microPIC компании Microchip Technology. Платная от 39 евро (есть ознакомительная версия с ограничениями)
Подробнее
4D Workshop IDE
Специализированная программная среда, предназначенная для работы с микропроцессорами в графических контроллерах и готовых дисплейных модулях компании 4D Systems. Freeware.
Подробнее
Программаторы AVR. Как прошить микроконтроллер
- Подробности
- Категория: Микроконтроллеры
- Опубликовано 13.08.2015 14:53
- Автор: Admin
- Просмотров: 7746
Прошивка микроконтроллера — это запись (копирование) в его память определенной программы. Программа представляет собой специальный код в шеснадцатеричном формате (файл с расширением hex).
Прошивка осуществляется при помощи специального устройства или программатора. Программаторы для каждых типов микроконтроллера свои. Также программаторы отличаются по способу подключения к компьютеру, могут подключатся через USB, LTP,COM. Существует целое множество разнообразных программаторов под микроконтроллеры AVR.
Наиболее простым на мой взгляд и простым в освоении программатором для AVR является USB-asp программатор. Мой первый проект и использованием такого программатора имел 2 детали, самого контроллера atmega8 и светодиода. После подключения и прошивки контроллера светодиод радостно начал мне подмигивать.
Программаторы под микроконтроллеры AVR
AVR-Doper. Этот программатор поддерживает протокол STK500 ( то есть, может совмещаться со многими утилитами, предназначенными для программирования), поддержка последовательного ISP- программирования и даже высоковольтного HVSP программирования. Прошивка практически всех известных чипов AVR. Возможно сделать самостоятельно, схемы не очень сложные, существует большое количество готовых прошивок, полностью открытый исходный код. Для качественной работы совместно с Windows требуется установка драйвера, который поставляется вместе с исходным кодом.
AVRISP-Mk. Такое название у клона Atmel с поддержкой протокола STK500. Не поддерживается HVSP, но в свободном доступе ISP, TPI и PDI, что позволяет прошить более современные микроконтроллеры типа XMEGA. Поддерживаются многие популярные программы. Его схема невероятно простая, поэтому программатор именно этого типа часто самостоятельно изготавливают. Исходный код открыт, возможна компиляция на другие чипы AVR, имеющие аппаратный интерфейс USB. Для Windows необходим драйвер, он идет в комплекте с исходным кодом. Наиболее подходящая данному программатору утилита AVR Studio 4.19.
AVR Dragon. Не слишком дорогой программатор, который пользуется популярностью с внутрисхемным отладчиком Atmel, его аналоги продаются на eBay за 40-50 американских долларов. Поддержка AVR Studio, IAR Embedded Workbench и многих других сред программирования. Самостоятельно изготовить его нельзя, так как нет ни доступных схем, ни кодов доступа, открытым остался исключительно STK500. Если вы обладаете достаточным количеством средств и хотите развиваться, как программист — стоит приобрести этот программатор. Для работы с Windows требуется драйвер, его можно установить вместе с AVR Studio.
Atmel AVR JTAGICE mk. Его еще называют «тяжелой артиллерией» в программировании и отладке AVR, так как это программатор- ISP со внутрисхемным эмулятором (JTAG, debugWIRE) в одной прошивке. Работа осуществляется с помощью COM-порта и по USB. Доступен для понимания даже avrdude. Хороший во всем, только не радует его стоимость. Может работать с AVR Studio, консольной штатной прогой. Поддержка интерфейсов отладки debugWire и JTAG, всего ассортимента AVR, но не поддерживается высоковольтное программирование HVSP. Очень дорогое удовольствие, которое трудно рекомендовать. Сделать самостоятельно невозможно. Для Windows нужна установка драйвера, идущего в комплекте с AVR Studio.
USBasp. Программатор, успевший получить статус «народного». Его дешево изготовить, схемы достаточно просты, большое количество исходников со свободным доступом дают возможности сделать проект собственными руками. Поддержка большого количества утилит для программирования. Его изготовляют многие компании в том числе и китайские. На ebay цена одной копии USBasp стартует от 4 долларов. Но будьте внимательны — дешевая продукция, как правило, обладает низким качеством. Поддержка исключительно ISP. Не забудьте об установке драйвера для Windows. Применение в USB-бутлоадерах (этому способствуют открытость и простота).
USBtinyISP. Этот проект находится в открытом доступе, есть все исходники. В состав входят 2 ISP-коннектора (6 pin и 10 pin). Использование чипа ATtiny2313-20P. Схема отличается своей простотой.
USB AVR programmer. Не считается официальным аналогом AVR910, но характеристики очень похожие. Схемы и исходники находятся в свободном доступе.
Vusbtiny. Отличается своей необычной простотой и маленькими размерами. USB интерфейс и поддержка ISP.
- < Назад
- Вперёд >
Добавить комментарий
История версий программы ASISP | AS-kit hardware
* Март 2020 г. Версия ASISP 11.70beta.
— Добавлена функция измерения напряжения питания, которое приходит на программатор.
Текущее значение напряжения отображается в окне «Информация о программаторе».
* Февраль 2019. Версия 11.69.
— Откорректирован алгоритм программирования микроконтроллера AT89S2051.
* Апрель 2018. Версия 11.68.
— Добавлена поддержка микроконтроллеров AT645P, AT6450P, AT649P, AT6490P.
* Октябрь 2017. Версия 11.67.
— Увеличено до двух секунд максимальное значение длины импульса сброса для обеспечения работы с мониторами питания типа ADM705 — ADM708 и ADM632x, формирующими импульс сброса длительностью до 1,6 секунды.
— Добавлена опция запрета пропуска программирования байтов со значением FF. Эта опция позволяет программировать микроконтроллеры 1887ВЕ4У и 1887BE7T, являющиеся функциональными аналогами AVR-микроконтроллеров компании Atmel.
Для работы с микроконтроллерами 1887ВЕ4У нужно в программе ASISP выбрать тип микросхемы ATmega8535 и активировать опцию запрета пропуска программирования байтов FF.
— Для работы с программой ASISP 11.67 рекомендуется обновить firmware программатора до версии 10.15.
* Март 2017. Версия 11.66.
— Увеличено быстродействие программатора за счет повышения скорости обмена с компьютером в 2 раза (режим Turbo 1) и в 4 раза (режим Turbo 2).
— Для работы в режимах Turbo нужно произвести обновление firmware программатора до версии 10.14.
* Август 2016. Версия 11.65.
— Добавлена поддержка контроллеров ATmega324PB и ATmega328PB.
— Добавлена возможность обновления версии firmware для программаторов, выпущенных в прошлые годы.
* Август 2015. Версия 11.64.
Для повышения комфорта работы с программой проведены изменения в интерфейсе пользователя:
— сделана замена шрифта в окнах Flash и EEPROM, где отображается содержимое буферов памяти.
Теперь раскладка символов соответствует кодировке Windows 1251.
— переработано окно «Lock/Fuse Bits».
— модифицировано окно «Настройки интерфейса».
— изменен состав сообщений в окне «Предупреждение».
В версии ASISP 11.64 исключены микросхемы памяти серии AT25.
Функционирует с версией прошивки программатора от 10.12.
* Апрель 2015. Версия 11.63.
Добавлена поддержка микросхем ATmega48PB, ATmega88PB, ATmega168PB.
Функционирует с версией прошивки программатора от 10.12.
* Июль 2014. Версия 11.62.
Добавлена поддержка микросхем ATtiny441, ATtiny841, ATtiny828.
Исключены микросхемы ATmega устаревших версий и добавлены микросхемы ATmega новых версий. Посмотреть
Также исключены микросхемы памяти серии AT25DF.
Функционирует с версией прошивки программатора от 10. 12.
* Декабрь 2013. Версия 11.61.
Добавлена поддержка микросхем ATtiny87, ATtiny167
Функционирует с версией прошивки программатора от 10.12.
* Июль 2013. Версия 11.60.
Добавлена поддержка микросхем ATtiny1634, ATmega64RFR2/644RFR2, ATmega128RFR2/1284RFR2,
ATmega256RFR2/2564RFR2. Внесены незначительные изменения в названия окон и строк меню.
Функционирует с версией прошивки программатора от 10.12.
* Ноябрь 2012. Версия 11.59.
Добавлена поддержка микросхем ATtiny2313A, ATtiny4313, ATtiny461A, ATtiny861A и ATtiny84A.
Исключены микросхемы памяти серии AT45.
Восстановлена функция загрузки файлов Flash и EEPROM для последнего сохраненного проекта.
Функционирует с версией прошивки программатора от 10.12.
* Март 2012. Версия 11.58.
Добавлена функция формирования лог-файла при программировании микросхемы из командной строки.
Исправлена ошибка в наименовании fuse-битов для микросхемы ATmega328P.
Исключены микросхемы памяти следующих серий: AT25DF; AT26.
Функционирует с версией прошивки программатора от 10.12.
* Октябрь 2011. Версия 11.57.
Добавлена возможность изменения размеров главного окна для улучшения отображения текста.
Программа перекомпилирована и теперь работает под версиями Windows XP и Windows 7.
Функционирует с версией прошивки программатора от 10.12.
* Октябрь 2010. Версия 11.56.
Исправлена ошибка в программировании extended fuse byte микросхем ATMega64С1/ATMega64M1.
Функционирует с версией прошивки программатора от 10.12.
* Август 2010. Версия 11.55.
Добавлена поддержка микросхем ATmega324A.
Исключена поддержка микросхемы ATmega324P.
Функционирует с версией прошивки программатора от 10.12.
* Июнь 2010. Версия 11.54.
Добавлена поддержка микросхем ATtiny261A.
Функционирует с версией прошивки программатора от 10.12.
* Апрель 2010. Версия 11.53.
Исправлена ошибка в окне «Настройки lock/fuse-битов» для микросхемы AT90USB128x.
Функционирует с версией прошивки программатора от 10. 12.
* Февраль 2010. Версия 11.52.
Добавлена поддержка микросхем ATmega128RFA1.
Функционирует с версией прошивки программатора от 10.12.
* Январь 2010. Версия 11.51.
Добавлена поддержка микросхем AT90PWM81.
Функционирует с версией прошивки программатора от 10.12.
* Декабрь 2009. Версия 11.50.
Добавлена поддержка микросхем AT25DF041.
Функционирует с версией прошивки программатора от 10.12.
* Ноябрь 2009. Версия 11.49.
Добавлена поддержка микросхем AT25DF041.
Функционирует с версией прошивки программатора от 10.12.
* Октябрь 2009. Версия 11.48.
Добавлена поддержка микросхем AT25DF021.
Функционирует с версией прошивки программатора от 10.12.
* Сентябрь 2009. Версия 11.47.
Добавлена поддержка микросхем ATmega16M1 ATmega32M1 ATmega64M1.
Функционирует с версией прошивки программатора от 10.12.
* Август 2009. Версия 11.46.
Добавлена поддержка микросхем ATmega8HVA, ATmega16HVA, ATmega16HVB, ATmega32HVB.
Функционирует с версией прошивки программатора от 10.12.
* Июль 2009. Версия 11.45.
Добавлена поддержка микросхем ATmega8U2, ATmega16U2, ATmega32U2.
Функционирует с версией прошивки программатора от 10.12.
* Июнь 2009. Версия 11.44.
Добавлена поддержка микросхем ATtiny24A/44A, ATmega48A/8A/88A, ATmega164PA/324PA, ATmega644PA/64A/128A.
Функционирует с версией прошивки программатора от 10.12.
* Май 2009. Версия 11.43.
Добавлена поддержка микросхемы ATtiny43U.
Функционирует с версией прошивки программатора от 10.12.
* Апрель 2009. Версия 11.42.
Добавлена поддержка микросхем ATtiny48 и ATtiny88.
Функционирует с версией прошивки программатора от 10.12.
* Март 2009. Версия 11.41.
Добавлена поддержка микросхем ATA6612 и ATA6613.
Функционирует с версией прошивки программатора от 10.12.
* Февраль 2009. Версия 11.40.
Добавлена поддержка микросхемы ATMega32U6.
Функционирует с версией прошивки программатора от 10. 12.
* Январь 2009. Версия 11.39.
Добавлена поддержка микросхем ATmega168V и ATmega32U4.
Функционирует с версией прошивки программатора 10.12.
* Декабрь 2008. Версия 11.38.
Добавлена поддержка микросхемы ATmega16U4.
Функционирует с версией прошивки программатора 10.12.
* Ноябрь 2008. Версия 11.37.
Исправлена инициализация ножки сброса у программатора.
Функционирует с версией прошивки программатора 10.12.
* Октябрь 2008 Версия 11.36.
Добавлена поддержка микросхем AT26F021 и AT26F041A
Функционирует с версией прошивки программатора 10.12.
* Сентябрь 2008 Версия 11.35.
Добавлена поддержка микросхемы AT25128
Функционирует с версией прошивки программатора 10.12.
* Август 2008 Версия 11.34.
В работе из командной строки добавлен режим quietautoprogram. Использование
аналогично режиму autoprogram, но программа не ждет от пользователя действий
при нормальной работе и некоторых типах ошибок. Вывод направляется в файл log.txt
Добавлена поддержка микросхем tiny13A mega16A, mega32A
Функционирует с версией прошивки программатора 10.12.
* Июль 2008 Версия 11.33.
Добавлена поддержка микросхем ATA6602 и ATA6603
Функционирует с версией прошивки программатора 10.12.
* Июнь 2008 Версия 11.32.
Исправлена работа с микросхемой AT90PWM2/2B/3/3B
Функционирует с версией прошивки программатора 10.12.
* Май 2008 Версия 11.31.
Добавлена поддержка микросхем: ATMega32С1/32M1, ATMega1284P, AT25512
Функционирует с версией прошивки программатора 10.12.
* Апрель 2008 Версия 11.30.
Добавлена поддержка микросхем: ATMega48P/88P/168P/328P.
Функционирует с версией прошивки программатора 10.12.
* Март 2008 Версия 11.29.
Добавлена поддержка микросхемы AT45DB011D.
Добавлена поддержка программирования «power of 2» бита для микросхем серии AT45.
Функционирует с версией прошивки программатора 10.12.
* Февраль 2008 Версия 11. 28.
Исправлены чтение и верификация flash памяти микросхем ATmega256*.
Функционирует с версией прошивки программатора 10.11.
* Январь 2008 Версия 11.27.
Добавлена поддержка микросхемы AT45DB021D.
Функционирует с версией прошивки программатора 10.09.
* Декабрь 2007 Версия 11.26.
Добавлена поддержка микросхем AT26F004,AT26DF161,AT26DF321.
Функционирует с версией прошивки программатора 10.09.
* Ноябрь 2007 Версия 11.25.
Добавлена поддержка микросхемы AT45DB161D.
Функционирует с версией прошивки программатора 10.09.
* Октябрь 2007 Версия 11.24.
Добавлена поддержка микросхем AT90PWM216/316.
Изменен порядок программирования памяти при использовании
режима «Автопрограммирование». Теперь вначале программируется
EEPROM, а затем Flash.
Функционирует с версией прошивки программатора 10.09.
* Сентябрь 2007 Версия 11.23.
Увеличено число COM-портов, с которыми может работать программа ASISP.
Номер COM-порта теперь можно ввести вручную.
Функционирует с версией прошивки программатора 10.09.
* Август 2007 Версия 11.22.
Добавлена поддержка микросхем ATmega164P/324P/644P.
Добавлена поддержка Flash памяти AT26DF081A.
Функционирует с версией прошивки программатора 10.09.
* Июль 2007 Версия 11.21.
Добавлена поддержка микросхем ATmega329P и ATmega3290P.
Функционирует с версией прошивки программатора 10.09.
* Июнь 2007 Версия 11.20.
Добавлена поддержка микросхем AT90USB82 и AT90USB162.
Ускорена процедура записи/чтения микросхем серии AT45.
Функционирует с версией прошивки программатора 10.09.
* Май 2007 Версия 11.19.
Добавлена поддержка микросхем ATtiny261/461/861.
* Апрель 2007 Версия 11.18.
Исправлена ошибка в определении сигнатуры микросхемы ATmega640.
Исключены микросхемы серий AT89S AT45DB, которые сняты с производства.
Функционирует с версией прошивки программатора 10.09.
* Февраль 2007 Версия 11.17.
Исправлена ошибка размера памяти EEPROM в микросхеме ATmega256х.
Функционирует с версией прошивки программатора 10.09.
* Декабрь 2006 Версия 11.16.
Исправлена ошибка в автоопределении микросхемы ATmega644.
Функционирует с версией прошивки программатора 10.09.
* Ноябрь 2006 Версия 11.15.
Добавлена поддержка портов COM9 … COM12
Функционирует с версией прошивки программатора 10.09.
* Октябрь 2006 Версия 11.14.
Исключены следующие микросхемы: AT90S2313, AT90S8515, ATmega161
Функционирует с версией прошивки программатора 10.09.
* Август 2006 Версия 11.13.
Добавлена поддержка микросхемы AT45DB041D. Функционирует с версией прошивки программатора 10.09.
* Июль 2006 Версия 11.12. Увеличена скорость работы с микросхемой AT89S8253.
Добавлена поддержка микросхемы AT90PWM1. Функционирует с версией прошивки программатора от 10.08.
* Июнь 2006 Версия 11.11. Добавлена возможность работы с fuse-битами для микросхемы
AT89S8253. Функционирует с версией прошивки программатора от 10. 07.
* Май 2006 Версия 11.10. Откорректирован алгоритм записи на низкой скорости программирования (7 кГц).
Функционирует с версией прошивки программатора от 10.06.
* Апрель 2006 г. Версия 11.09. Добавлена поддержка микросхем ATtiny25/45/85.
Откорректирован алгоритм записи для микросхем AVR с объемом ПЗУ 256 кБайт.
* Март 2006 г. Версия 11.08. Добавлена поддержка микросхем ATtiny24/44/84.
* Февраль 2006 г. Версия 11.07. Добавлена поддержка микросхем ATmega329 и ATmega3290.
* Январь 2006 г. Версия 11.06. Увеличена скорость записи EEPROM в AVR-микроконтроллерах.
Работает с программаторами AS2M, As3 и AS3M.
Функционирует с версией прошивки программатора от 10.04.
* Декабрь 2005 г. Версия 11.05. Откорректирован алгоритм прошивки микросхем ATtiny.
Функционирует с версией прошивки программатора от 10.03.
* Ноябрь 2005 г. Версия 11.04. Добавлена поддержка микросхемы AT90USB1286.
* Октябрь 2005 г. Версия 11.03. Добавлена поддержка микросхем AT90CAN32, AT90CAN64,
AT45DB321C. Функционирует с версией прошивки программатора от 10.02.
* Сентябрь 2005 г. Версия 11.02. Добавлена поддержка микросхемы ATmega640.
* Август 2005 г. Версия 11.01. Модифицирована процедура синхронизации
для AVR-контроллеров. Функционирует с версией прошивки программатора от 10.01.
* Август 2005 г. Версия 11.00. Начальная версия программы ASISP для программаторов AS2M и AS3.
Функционирует с версией прошивки программатора от 10.00.
* Июль 2005 г. Завершена поддержка программы AS2ISP, в связи с началом производства нового
поколения программаторов, с модифицированной прошивкой микроконтроллера.
описание, назначение Что такое программатор для прошивки телефона
Мастерскую по обслуживанию смартфонов и планшетов, как и любую другую мастерскую, сложно себе представить без паяльного или измерительного оборудования. Но главное место тут всегда занимают инструменты для программного ремонта: разблокировки, восстановления и прошивки. Именно они помогают мастеру разблокировать, прошить или оживить нерабочее устройство.
Давайте познакомимся с ними поближе.
БОКС
Что такое бокс?
Как выбрать?
Донглы также можно разделить на более универсальные, поддерживающие максимальное количество моделей популярных производителей и самые востребованные операции, и донглы, предназначенные для определенных устройств и операций.
Универсальные решения:
Специализированные решения:
Сброс FRP
Samsung и LG
СМАРТ-КАРТА
Что такое смарт-карта?
Смарт-карта используется для аутентификации вашей покупки и идентификации вашего устройства на сервере разработчика. Фактически она выглядит как обычная SIM-карта для мобильных телефонов. Смарт-карта рассчитана на хранение данных о версии прошивки, самой прошивки и другой специальной информации.
Структура чипа смарт-карты
Важно! Смарт-карта имеет ограниченное количество циклов записи информации. Обычно ПО предупреждает пользователя о необходимости обновления. Поэтому не обновляйте смарт-карту, если нет такой необходимости . Она может просто заблокироваться, и в результате вы больше не сможете использовать эту смарт-карту или даже бокс (всё зависит от разработчика бокс). Если не удается обновить смарт-карту, когда это требуется, лучше всего обратитесь в службу технической поддержки .
Что же выбрать: бокс или донгл?
Бокс подойдет, если:
- необходимо подключение через COM-порт;
- восстановление телефона возможно только при помощи JTAG или eMMC-интерфейса.
Донгл подойдет, если:
- вы собираетесь работать с телефоном в рабочем состоянии;
- вам необходимо провести разблокировку, прошивку, восстановление IMEI, удаление FRP;
- ПК распознает телефон;
- вы не собираетесь работать с аппаратной частью устройства.
В продолжении этой статьи вы узнаете о возможных ошибках и проблемах, возникающих при работе с донглами и боксами, и о том, как и обнаружить и устранить их причину.
Мастерскую по обслуживанию смартфонов и планшетов, как и любую другую мастерскую, сложно себе представить без паяльного или измерительного оборудования. Но главное место тут всегда занимают инструменты для программного ремонта: разблокировки, восстановления и прошивки. Именно они помогают мастеру разблокировать, прошить или оживить нерабочее устройство.
Давайте познакомимся с ними поближе.
БОКС
Что такое бокс?
Как выбрать?
Донглы также можно разделить на более универсальные, поддерживающие максимальное количество моделей популярных производителей и самые востребованные операции, и донглы, предназначенные для определенных устройств и операций.
Универсальные решения:
Специализированные решения:
Сброс FRP
Samsung и LG
СМАРТ-КАРТА
Что такое смарт-карта?
Смарт-карта используется для аутентификации вашей покупки и идентификации вашего устройства на сервере разработчика. Фактически она выглядит как обычная SIM-карта для мобильных телефонов. Смарт-карта рассчитана на хранение данных о версии прошивки, самой прошивки и другой специальной информации.
Структура чипа смарт-карты
Важно! Смарт-карта имеет ограниченное количество циклов записи информации. Обычно ПО предупреждает пользователя о необходимости обновления. Поэтому не обновляйте смарт-карту, если нет такой необходимости . Она может просто заблокироваться, и в результате вы больше не сможете использовать эту смарт-карту или даже бокс (всё зависит от разработчика бокс). Если не удается обновить смарт-карту, когда это требуется, лучше всего обратитесь в службу технической поддержки .
Что же выбрать: бокс или донгл?
Бокс подойдет, если:
- необходимо подключение через COM-порт;
- восстановление телефона возможно только при помощи JTAG или eMMC-интерфейса.
Донгл подойдет, если:
- вы собираетесь работать с телефоном в рабочем состоянии;
- вам необходимо провести разблокировку, прошивку, восстановление IMEI, удаление FRP;
- ПК распознает телефон;
- вы не собираетесь работать с аппаратной частью устройства.
В продолжении этой статьи вы узнаете о возможных ошибках и проблемах, возникающих при работе с донглами и боксами, и о том, как и обнаружить и устранить их причину.
Удобство работы с современными мобильными устройствами во многом объясняется наличием предустановленных микропрограмм, без которых функционирование электроники попросту является невозможным. Эти микропрограммы в среде электронщиков и специалистов по ремонту мобильных устройств принято называть прошивками. Во многих устройствах эти прошивки часто повреждаются, говоря современным языком «слетают», делая невозможной работу с установленными приложениями. Чтобы восстановить прошивку, используется программатор. Это аппаратно-программное устройство для считывания и записи данных в постоянно запоминающее устройство или внутреннюю память микроконтроллеров.
Наиболее популярным устройством среди пользователей является смартфон. Рассмотрим более подробно, что нужно для того, чтобы «оживить» мобильный, у которого слетела прошивка. Кроме того, большой объём электроники поставляется из Китая и США, и при покупке такого мобильного телефона возникает проблема в разнице прошивок. Именно в таких ситуациях без программатора для телефонов не обойтись.
Программаторы для восстановления программного обеспечения на телефонах необходимы для загрузки микропрограммы на устройство. Сам программатор подключается через соответствующий порт смартфона и подвергается перепрограммированию. Универсальных программаторов, поддерживающих работу с различными типами устройств, не существует, однако, есть модели, совместимые с наиболее популярными смартфонами.
Типы программаторов
Кроме того, что программаторы могут отличаться по типу микросхем, сложности, подключению к компьютеру, а также по перечню дополнительных функций, существуют две принципиальные разницы между построением этих устройств:
- На базе массива аппаратных драйверов универсального типа. Универсальность таких программаторов заключается в способности к считыванию и подаче логических уровней, а также в возможности подачи сложных таковых алгоритмов. На принципе действия этих универсальных программаторов работают, как правило, дорогостоящие универсальные модели.
- Модели, оптимизирующиеся под заданный перечень микросхем. Эти программаторы зачастую по стоимости значительно уступают моделям первого типа, и имеющийся перечень функций может расширяться посредством добавления новых типов микросхем.
Наш интернет-магазин специализируется на запчастях для мобильных телефонов и планшетов, предлагает большой ассортимент программаторов для восстановления программного обеспечения на телефонах различных моделей. Мы гарантируем своевременность доставки вашего заказа и лояльные цены.
Поломка мобильной техники не всегда связано с физическими неисправностями элементов или узлов. Иногда причиной неисправности становятся сбои внутренних программ. Вы можете купить программатор для телефонов в интернет-магазине «Магазин Деталей.РУ» и быстро восстановить свой гаджет.
Заказать программатор для мобильных телефонов у нас
На нашем сайте вы сможете заказать и приобрести широкий выбор аксессуаров для перепрошивки и восстановления мобильных устройств. Здесь представлены:
устройства для прошивки;
дата кабели для китайских телефонов;
дата кабели для оригинальной техники и пр.
Отдельно можно выделить устройства для обновления или обнуления контроллеров аккумуляторов. Обычно устройство необходимо после установки новых элементов питания в старый корпус. На контроллере при этом остаются данные от старого аккумулятора, что мешает полноценной работе. На нашем сайте вы можете купить программатор для батареи ноутбука и решить эту проблему.
Мы предлагаем качественные устройства от ведущих производителей, которые при правильной эксплуатации и использовании оригинального программного обеспечения не навредят восстанавливаемой технике.
Узнать цену на программатор для смартфонов можно через наш сайт. К вашим услугам простой и удобный каталог с актуальной информацией по стоимости и остаткам. При отсутствии необходимого оборудования, свяжитесь с нашим менеджером. Он поможет подобрать аналогичное устройство или подскажет время ближайшей поставки.
Мы производим доставку по всей территории России независимо от объемов заказа. Мы одинаково серьезно относимся к крупным оптовым клиентам и розничным покупателям. Все покупки отслеживаются до момента получения.
Программатор – это аппаратно-программное устройство, которое служит для считывания или записи информации в запоминающее устройство (внутреннюю микроконтроллеров). В случае если радиолюбителю нужно один раз запрограммировать микроконтроллерное устройство, можно воспользоваться обычным программатором, который подключается к COM- или LPT- порту. Например, самым простым программатором AVR является кабель из 6 и 4 резисторов (программатор PonyProg).
С помощью обычного программатора можно загружать программы в формате hex во многие микроконтроллеры AVR, не тратя лишнего времени и средств. Кроме того, программатор можно использовать как внутрисхемный, благодаря чему можно программировать микроконтроллер AVR не извлекая его из устройства.
Подключаются такие программаторы к компьютеру с помощью специальной программы (которая тоже называется программатором). Она передает с , а устройство только записывает ее в память микросхемы. Программаторы могут подключаться через последовательный или параллельный порт, через USB-разъем и т.д. Современные программаторы подключаются, как правило, через USB.
USB-программатор предназначен для программирования микропроцессорных устройств определенной компании (зависит от марки программатора) в собранном виде. С помощью него заметно упрощается процесс настройки ПО.
Как подключить USB-программатор?
Для использования устройства необходимо подключить его к одному из USB-портов компьютера. После этого на компьютере появится сообщение о подключении нового USB-устройства USBasp, а на самом программаторе загорится светодиод, который означает, что устройство успешно подключено.
Затем нужно установить драйвера, чтобы ОС могла корректно работать с данным устройством. После этого можно будет подключать микропроцессорное устройство к ISP интерфейсу. При программировании будет светиться второй светодиод.
Как правило, программатор имеет два интерфейса – один для подключения микроконтроллера, второй для подключения к компьютеру. Для того чтобы подключить микроконтроллер, можно воспользоваться режимом последовательного программирования ISP. А к компьютеру данное устройство подключается через стандартный USB-разъем.
Для управления программатором нужно устанавливать специальные программы. Лучше всего пользоваться оконными приложениями. Например, для работы с устройством можно использовать программы ExtremeBurner, Khazama, avrguge и другие.
Компиляция и прошивка. WinAVR + Khazama AVR Programmer. » R13-PROJECT
Содержание
- 1 Технические характеристики
- 2 ATmega серия
- 3 Tiny серия
- 4 Серия Classic
- 5 CAN серия
- 6 PWM серия
- 7 Внешний вид
- 8 Органы управления на плате
- 9 Установка драйверов
- 10 Прошивка собрата
- 11 Связь с платой Pro Mini (Atmega 168, 3.3V/8MHz)
- 12 Связь с контроллером ATtiny13A в корпусе SOIC8
- 13 Интеграция программатора в Atmel Studio 7
- 14 Дополнение по фьюзам программатора
- 15 Выводы
- 16 Программатор USBASP
- 17 Программирование микроконтроллеров AVR фирмы Atmel
- Цена: 3$ (2шт. )
В моём случае это абсолютный рекордсмен по скорости доставки — около 5 месяцев беспечного блуждания непонятно где. Несмотря на чудовищную задержку по времени, пакет я всё-таки получил, чему несказанно рад, не взирая на недочёты, о коих поведаю ниже. Поскольку у меня весьма плохая память, то нужно было объединить найденную полезную информацию где-то в одном месте в виде памятки, собирать её по крупицам в разных закоулках сети оказалось делом нетривиальным, поэтому оформлю всё это отдельным постом. USB ISP — самый дешёвый программатор контроллеров AVR, что можно найти в продаже, брался для расширения кругозора и более углубленного изучения AVR. Обзор в себя включает: описание программатора, как его подключить к чипу, настройку его работы в программах AvrDude Prog, Khazama, Atmel Studio 7, и не только это. Конечно вместо него можно использовать Arduino UNO с прошитым в него скетчем ArduinoISP, но это не удобно, возня с проводами, особенно если UNO всего одна, отбивает энтузиазм. Проще было заиметь отдельно такой программатор, точнее два. По двум причинам:1) Ещё перед покупкой уже из отзывов было понятно, что качество пайки этих устройств страдает, а некоторым ещё и с расколотыми стабилитронами они приходили. Решено было подстраховаться, заказав два.2) Один программатор к тому же можно шить другим, переставив перемычку на ведомом устройстве.
Технические характеристикиПоддерживаемые ОС: Windows, MacOS, LinuxПроцессор: Atmega8AИнтерфейс подключения к ПК: USBИнтерфейс программирования: ISP (внутрисхемное)Напряжение программирования: 5В или 3.3В (в зависимости от положения перемычки JP2)Частота программирования: 375кГц (по умолчанию) и 8кГц (при замкнутой перемычке JP3)Поддерживаемые контроллеры: все AVR с интерфейсом SPIОписание:ссылкаСписок поддерживаемых микроконтроллеров
ATmega серияATmega8 ATmega48 ATmega88 ATmega168 ATmega328 ATmega103 ATmega128 ATmega1280 ATmega1281 ATmega16 ATmega161 ATmega162 ATmega163 ATmega164 ATmega169 ATmega2560 ATmega2561 ATmega32 ATmega324 ATmega329 ATmega3290 ATmega640 ATmega644 ATMEGA64 ATmega649 ATmega6490 ATmega8515 ATmega8535
Tiny серияATtiny12 ATtiny13 ATtiny15 ATtiny26 ATTINY25 ATtiny45 Attiny85 ATtiny2313
Серия ClassicAT90S1200 AT90S2313 AT90S2333 AT90S2343 AT90S4414 AT90S4433 AT90S4434 AT90S8515 AT90S8535
CAN серияAT90CAN128
PWM серияAT90PWM2 AT90PWM3
Внешний видКомплект поставки минимальный — программатор + шлейф без резинки. В моём случае в удвоенном количестве. Культура исполнения и вправду хромает, мне в глаза сразу бросились криво припаянные гребёнки. Везде где только можно — имеются следы флюса, причём с окислами, по всей видимости, программаторы давно валялись на складе, а сборка их производилась с присущей китайцам быстротой.
Некоторые отверстия не целиком заполнены припоем
SMD-элементы тоже криво припаяны
Гребёнку чуть позже выровнял, уж больно неприятно на такую раскосую смотреть, элементы пропаял, а плату затем отмыл
Размеры платы несколько больше USB-TTL-конвертера на CP2102
Длина шлейфа около 30см, бытует мнение, что чем короче шлейф, тем лучше. Некоторые его специально укорачивают. Если заказать оригинальный USBASP — там комплектный шлейф уже 50см.
Органы управления на платеНа плате имеются три перемычки, задающие разные режимы работы программатора:
JP1 — замыкается в случае обновления прошивки самого программатораJP2 — тройная перемычка, здесь выбирается, какое напряжение будет подаваться на прошиваемый микроконтроллер, либо 5В (левое положение) и 3. 3В (правое положение)JP3 — если её замкнуть, то программирование контроллера будет происходить с пониженной частотой, однако китайцы не стали сюда впаивать гребёнку, т.к. на данной прошивке она не требуется
Программатор, как можно заметить, построен на базе Atmega8 с кварцем на 12МГц. Самый правый верхний элемент, подписанный F1, с перевёрнутой цифрой 4 — самовосстанавливающийся предохранитель, защищает USB-порт ПК/ноутбука, если на прошиваемой плате вдруг произошло короткое замыкание. Под перемычкой JP2 находится LDO-стабилизатор 662К, понижающий напряжение с 5В до 3.3В, если перемычка установлена в правое положение.
Установка драйверовЧтобы начать пользоваться программатором, необходимо сперва поставить на него драйвера. Вставляю любой программатор в USB-порт ПК, звучит сигнал о новом оборудовании, на самом девайсе горит светодиод, но автоматического поиска драйверов не происходит.
примечание. перед установкой драйвера необходимо отключить проверку цифровой подписи в Windows
1) Скачать драйвера, распаковать в удобное место. 2) Зайти в «Диспетчер устройств», например навести курсор на главную кнопку (Win10), нажать ПКМ и выбрать пункт «Диспетчер устройств».3) В ветке «Другие устройства» можно увидеть неопознанное устройство USBASP с оранжевым треугольничком — > навести на него курсор, нажать ПКМ -> «Обновить драйверы…»4) Указать путь до раннее распакованной папки с драйверами — «libusb_1.2.4.0», нажать «ОК»5) «Всё равно установить этот драйвер»6) Готово, теперь оранжевый треугольничек пропал, драйвера поставлены
Прошивка собратаМне уже было известно до этого, что китайцы продают эти программаторы с не самой свежей прошивкой. Решил сперва обновить прошивку на одном из них, а затем ради интереса сравнить оба программатора в работе. Для этого соединяю шлейфом оба устройства, на ведущем (который вставляю в USB-порт) никакие перемычки не трогаются, а на ведомом программаторе (на котором будем обновлять прошивку) я переставил перемычку с JP2 на JP1:
Захожу в программу Khazama AVR Programmer, выбираю из выпадающего списка ATmega8 и сперва считаю Flash-память через пункт меню «Command» -> «Read FLASH to Buffer», чтобы cохранить китайскую заводскую прошивку у себя. На всякий случай. При этом периодически будет выпадать такая ошибка, закрыв окно, программа продолжит работу. Идёт считывание, которое завершается всплывающим окном об успешном считывании FLASH-памяти в буфер
Теперь нужно сохранить содержимое буфера: «File» -> «Save FLASH Buffer As…». Выбрать удобное место, куда старая прошивка сохранится, дать имя (я например её назвал firmware_1) и дописать расширение *.hex — если его не писать, то она сохранится как просто файл без расширения.
Скачиваю прошивку для программатора с этой странички, архив
usbasp.2011-05-28.tar.gz(в этом же архиве есть драйвера для Windows, распаковываю содержимое в удобное место. Тем временем в Khazama загружу скачанную прошивку в буфер. «File» -> «Load FLASH File to Buffer». Выбираю прошивку, где в названии написано atmega8, поскольку прошиваемый программатор на этом чипе. Как видно, здесь три прошивки — для Atmega8, 48 и 88. В нашем случае Atmega 8 — её и выбираю. Прошиваю. «Command» -> «Write FLASH File to Buffer». Снова возникает ошибка, но после идёт процесс, завершающийся успехом.
Поскольку в обычном понимании «запрограммировать» означает выставить 1, то при работе со фьюзами всё ровно наоборот, от чего возникает путаница и в этом случае можно по неосторожности заблокировать контроллер и прошить потом его будет уже нельзя. Программа Khazama AVR Programmer удобна просмотром фьюз-битов — там наглядно видно и
расписано, какие из них установлены, а какие нет. Находятся они по пути «Command» -> «Fuses and Lock Bits…», откроется окно: Где по нажатии кнопки «Read All» считаются фьюз- и лок-биты, а пресловутая ошибка успеет вылезти аж 5 раз подряд. Ошибки сыпятся именно на заводской китайской прошивке. Но если вставить в USB-порт недавно прошитый программатор, прошивкой скаченной по ссылке выше, то этих ошибок вылазить уже не будет, однако баги вылезут в другом месте, но о них позже.
Связь с платой Pro Mini (Atmega 168, 3.3V/8MHz)В этом случае выводы программатора соединяются с выводами платы Pro Mini, как проиллюстрировано на схематичном рисунке ниже. Перемычки не переставляются, т.е. остаётся в положении 5В. Несмотря на то, что плата Pro Mini подписана как 3.3В, на 168-ю Атмегу можно подавать и 5В. Стабилизатор AMS1117 на 3.3В кстати вообще выпаян из платы.
AVRDUDE PROG 3.3 Консольная программа для прошивки микросхем, своего графического интерфейса не имеет, в стоке работает из командной строки, но энтузиастами было написано немало оболочек на неё, для удобства работы с ней. Одна из таких оболочек называется AVRDUDE PROG, созданная русскоязычными разработчиками. Эта оболочка, на мой взгляд удобна как раз для Flash-перепрошивки МК. После её запуска выбирается контроллер, в данном случае Atmega168 и тип программатора — USBasp. После чего можно заниматься записью/считыванием памяти. Что на заводской прошивке, что на новой — в обоих случаях никаких проблем с общением с Atmega168 не возникло. Прошил ради интереса ардуиновский стандартный blink-скетч, экспортированный в бинарный HEX-файл. Всё гладко.
Khazama AVR Programmer Здесь достаточно выбрать микроконтроллер из выпадающего списка и можно уже работать с памятью/битами. Однако если на самом программаторе установлена заводская прошивка, периодически будут сыпаться ошибки, о чём выше уже было упомянуто, на новой прошивке — данных ошибок уже нет.
Связь с контроллером ATtiny13A в корпусе SOIC8Соединение согласно схеме ниже. Но тут всё немного интереснее. Поскольку голый чип в SMD-корпусе SOIC8, в данном случае я поместил его в переходник SOIC8-DIP8 для удобства соединения с программатором в дальнейшем. Обзор на этот переходник можно почитать здесь.AVRDUDE PROG 3.3 Тут выбирается из списка одноимённый контроллер, программатор USBasp и, если программатор прошит заводской китайской прошивкой, то все операции проходят ровно и гладко. Однако стоит заменить программатор на другой, с обновлённой прошивкой, то при любой операции возникает ошибка. Появляется она из-за того, что ни программа, ни программатор не могут автоматически перейти в режим медленного программирования, необходимый для ATtiny13. Но есть как минимум два выхода:1) Железный: замкнуть перемычку JP32) Программный: отредактировать файл «programm.ini» в папке с программой AVRDUDE PROG 3.3 Внести туда четыре строчки кода и сохранить. (взято отсюда)
Примечание. Здесь применён ключ «-B», который и занимается переводом программатора на пониженную частоту программирования. Значение «3» — время в микросекундах
После этого снова запустить AVRDUDE PROG 3.3 и в выпадающем списке программаторов выбрать UsbaspSpeed. Теперь работа с ATtiny13 на программаторе с новой прошивкой будет уже без ошибок, а перемычку JP3 замыкать больше не потребуется в этом случае.
Khazama AVR Programmer Выбирается контроллер из списка и почти та же ситуация. Программатор с заводской прошивкой нормально работает с ATtiny13, если не считать постоянно появляющихся окон с ошибкой, о чём раннее уже рассказывал. Но с программатором на новой прошивке уже появляется иная ошибка с невозможностью прочесть сигнатуру (цифровую подпись) контроллера. Но стоит замкнуть перемычку JP3, и можно спокойно работать
Или просто задать частоту работы из выпадающего списка по пути «Command» -> «Programm Options», я выставил частоту 187.5кГц.
Примечание. Частота программирования должна быть меньше тактовой частоты прошиваемой микросхемы не менее, чем в 4 раза. Но если посмотреть на считанные с ATtiny13 фьюзы, то на последней строчке Int.Rc.Osc. указано 9.6МГц. Как минимум, у новичка возникнет вопрос — почему на выставленных в KHazame 1.5МГц — появляется та же ошибка? А также почему, если в AtmelStudio написать например код мигания светодиода с частотой раз в секунду и в макросе прописать: то загрузив код на Attiny13, светодиод будет мигать очень медленно? — посмотрим на предпоследнюю строчку, где Divide Clock by 8 Internally [CKDIV8=0] — это включенный предделитель частоты, который делит эти 9. 6МГц на 8, и поэтому реальная частота чипа здесь — 1.2МГц. Поэтому при выборе частоты 187.5кГц или меньше, ошибки исчезают и можно работать нормально с контроллером.
Интеграция программатора в Atmel Studio 7Примечание 2. Способ с выбором частоты в KHazame по скорости работы в несколько раз выигрывает у метода с физическим замыканием перемычки JP3, потому как в последнем случае частота понижается до 8кГц.
Atmel Studio — среда разработки от фирмы Atmel, но напрямую работать с USBASP, тем более китайским, она не может. Однако благодаря той же программе AVRDUDE, входящий в состав пакета AVRDUDE PROG 3.3, которая будет играть здесь роль посредника, можно соорудить «костыль», а уже в самой среде затем добавить возможность прошивать МК, подключенный через USBASP. Сперва нужно запустить среду, предполагается, что некий код у нас уже написан и собран. В моём примере это простая мигалка светодиодом — Blink. На верхней панели инструментов выбрать «Tools» — «External Tools…» Откроется небольшое окно, нажать «Add» В самом верхнем поле «Title:» ввести любое удобное название, я написал «Atmega168», т. к. та конфигурация, что приведу чуть ниже относится конкретно к этому контроллеру, и для любого другого контроллера она настраивается индивидуально. В большом поле наверху, название инструмента будет автоматически продублировано. Вторая строка, поле «Command:» — здесь нужно указать путь до файла «avrdude.exe», который находится в папке с вышерассмотренной программой Третья строка, поле «Arguments:» необходимо ввести собственно саму конфигурациюКонфигурация для Atmega168 -p — наименование контроллера -с — какой программатор -P — порт, через который будет заливаться прошивка -U — какая операция с какой памятью будет производится (в данном случае запись во Flash) Если нужно настроить для другого МК, то параметр «m168» нужно изменить на соответствующий контроллер, который будет прошиваться. Например «m8» для Atmega8 или «m328p», если Atmega328p. Параметры для других МК смотрите здесь — также там найдёте описания ключей AVRDUDE.Конфигурация для ATtiny13 Здесь можно заметить уже два изменения: помимо «t13», добавился уже знакомый ключ «-B» со значением «3» для снижения скорости программирования После заполнения полей нажать «Apply» и «ОК». Окно закроется Теперь, если снова кликнуть по «Tools», там появится только что созданный инструмент. И по нажатии по нему откомпилированный код будет автоматически прошит в контроллер. Но эта операция происходит в два клика, что не очень удобно. Надо вынести этот инструмент на главную панель инструментов, чтобы он был всегда на виду. Для этого нужно снова зайти в «Tools», затем кликнуть по пункту «Customize…» Откроется следующее окно: Перейти во вкладку «Commands» — нажать кнопку «Add Command…» Ещё одно окно появится. В нём — в левой колонке выбрать «Tools», а в правой колонке выделить «External Command 1». Нажать «OK» «External Command 1» окажется наверху списка, и, обратите внимание на саму панель инструментов — в интерфейсе появился пункт «Atmega168». Но как мне кажется, место ему отведено не совсем удачное, желательно его сдвинуть вправо, для этого нажимается кнопка «Move Down» (одно нажатие = сдвиг на одну позицию вправо). После этого можно закрывать окно по кнопке «Close» и шить чип прямо из студии в один клик через обозреваемый программатор. При перепрошивке чипа таким методом, на секунду появляется консольное окно AVRDUDE. Но может возникнуть необходимость как-то сохранить этот лог для дальнейшего его просмотра — тогда в окне «External tools» нужно поставить галку на «Use Output window». И теперь лог будет отображаться в окне вывода, что внизу программы ATmel Studio 7. Данная галка может задаваться отдельно для каждого добавленного в «External tools» контроллера.
Дополнение по фьюзам программатораИз документа READMI, идущего в комплекте с драйверами и прошивкой для USBASP, позже выяснилось, что разработчик рекомендует выставить определённую конфигурацию фьюз-битов, определяющих работу внешнего резонатора. Минусом khazam’ы является то, что в окне со фьюзами не отображаются HEX-значения выставленных битов. Это уже можно посмотреть в AVRDUDE PROG. Заводские фьюзы, выставленные китайцами, выглядят так (обязательно поставить точку «инверсные» — выделил синим прямоугольником): Как рекомендует выставить разработчик: Это нужно снять две галки с «BODEN» и «SUT1» (выделено красным овалом), поставить две галки на «CKOPT» и «SUT0» (выделено зелёным прямоугольником), справа в колонке при этом будут отображаться HEX-значения изменённых битов (выделено жирным красным прямоугольником): Lock Byte: 3F, Fuse High Byte: C9, Fuse Low Byte: EF. Если всё сходится, можно нажимать «программирование»
ВНИМАНИЕ. Злой фьюз-бит RSTDISBL — не трогать ни в коем случае, иначе его установка заблокирует контроллер и прошить потом через USBASP его уже будет нельзя.
_____________________________________
ВыводыОпробовано, работает. Если khazam не планируется использовать, то в обновлении прошивки для программатора — смысла нет, благо и так прекрасно работает, причём в случае с ATtiny13 никаких правок и перемычек вносить не требуется. Последняя прошивка — почему-то оказалась более капризна в этом плане. Единственное, после получения, плату надо пропаять и отмыть.Список ссылок1)Описание USBASP2)AVRDUDE PROG 3.3 (форум)3)Khazama AVR Programmer 1.74) Китайская стоковая прошивка (10кб)5)Архив с прошивками для USBASP и драйверами для Windows — сайт создателя проекта
Что бы не отвечать на вопросы — как собрать и прошить прошивки из моих проектов написана эта статья. В ней я рассмотрю вопрос компиляции и прошивки, а так же софта и используемого оборудования. Для прошивки я пользуюсь программатором USB ASP Стоит он 60-70р (практически по цене микроконтроллера ATMEGA8, на котором и собран). Даю несколько ссылок, так как лоты у продавцов иногда исчезают, а следить за их наличием и каждый раз менять статью мне лениво, поэтому вот ссылки. http://ali.pub/43slcvhttp://ali.pub/43slnyhttp://ali.pub/43sm25http://ali.pub/43sm3phttp://ali.pub/43sm77 Можете купить по ссылке или поискать у других продавцов, так как цены так же со временем меняются и не всегда в меньшую сторону.
Для компиляции прошивки понадобится avr-gcc. Компилятор avr-gcc для виндовс включен в пакет WinAVR. Весит пакет этот не много (около 30 мегабайт), ставится быстро и нет привязки к какому то конкретному компилятору. К своим проектам я буду прикладывать BAT файл, запустив который вы соберете прошивку. Скачать его можно с офсайта по данной ссылке : http://winavr.sourceforge.net/download. html Переходим по ссылке и попадаем сюда:
WINAVR downloadДалее нужно нажать на зеленую кнопку, далее вы должны попасть вот сюда https://sourceforge.net/projects/winavr/, но ссылка может измениться, поэтому я описываю полный путь как найти. Там загрузка начнется автоматически через5-10 секунд, более ничего нажимать не нужно (следите за таймером).
WINAVR СкачатьПосле скачивания просто установите данный пакет WinAVR. Система как обычно ругнется о том, что файл из неизвестного источника — просто игнорируем. Появится окошко с выбором языка, и начнется установка.
WinAVR 20100110Все обычно и расписывать в картинках детально я не буду. Папку для установки можно не менять, оставив C:WinAVR-20100110. Установщик еще предложит поставить и Programmers notepad (входит в состав) — даже если пользуетесь notepad++ лучше поставить — один раз notepad++ сыграл злую шутку — при работе с графическим дисплеем были проблемы с выводом нескольких русских букв, и я не мог понять — почему, убил 2 вечера, выясняя, оказалось дело в кодировке и например буква «Я» кодировалась notepad++ не верно, в исходнике, а компилятору пофигу, для него это не буква а просто байт. Когда открыл в блокноте идущем с WinAVR я увидел, что проблемные буквы превратились в абракадабру. Заменил и все заработало. Если прошивка не обрабатывает кириллицу, то править исходники можно в чем угодно.
WinAVR компонентыПосле установки рекомендую перезагрузить компьютер, либо выйти из системы и войти вновь. Чтобы изменения для переменной Path вступили в силу для окружения пользователя. Теперь вы можете компилировать прошивки из моих проектов. Для этого в состав моих проектов приложен батник и make файл, где все настроено. Что бы скомпилировать, достаточно запустить RUN.bat из папки проекта. После компиляции вы должны увидеть что то вроде этого.
WinAVR компиляция AVR gccЕсли так, то все хорошо и прошивка собралась. Сам файл прошивки появится в этой же папке под именем main.hex.
Makefile я не настраиваю для работы с программатором заранее, так как программаторы у всех разные. Пользуюсь я программатором USB ASP, про него я писал выше, и продублирую ссылки в конце статьи, там же по мере редактирования статью будут появляться и другие ссылки… возможно… если будет, что добавить…. наверное…
Стоит дешево, шьет быстро. Для прошивки я использую программу KhazamaAVRProgrammer. По сути это графическая оболочка над AVRDUDE, но из всех, что я видел, эта понравилась больше всего. Раньше я писал батники под AVRDUDE, но потом надоело, особенно для фьюз под каждый проект. Подробнее о данной программе можно почитать вот здесь:https://cxem.net/software/khazama_AVR_programmer.php
Для прошивки нужно выбрать процессор.
KhazamaAVRProgrammer выбор микроконтроллераKhazamaAVRProgrammer загрузка файла прошивкиили нажать кнопку
KhazamaAVRProgrammer загрузка файла прошивкиДля запуска процесса прошивки необходимо выбрать «Command» а в нем пункт «Write FLASH buffer to chip».
KhazamaAVRProgrammer запуск прошивкиМожет выскочить ошибка.
Просто игнорируем ее и прошивка запустится. После удачной прошивки программа выкинет окошко с надписью «OK».
KhazamaAVRProgrammer чтение Chip SignatureПеред правкой рекомендую нажать кнопку Default или загрузить из контроллера выбрав Read All . Какие биты устанавливать я буду указывать на странице проекта, если их требуется менять.
Ссылки: Для прошивки я пользуюсь программатором USB ASP Это несколько ссылок, так как лоты у продавцов иногда исчезают, а следить за их наличием и каждый раз менять статью мне лениво, поэтому вот ссылки на одно и то же. http://ali.pub/43slcvhttp://ali.pub/43slnyhttp://ali.pub/43sm25http://ali.pub/43sm3phttp://ali.pub/43sm77 Можете купить по ссылке или поискать дешевле у других продавцов (на момент написания статьи это самые дешевые лоты у проверенных продавцов).
Если возникнут вопросы пишите в комментарии или в группе в контакте. https://vk.com/public179183134
Программатор USBASP — устройство, распиновка, подключение, прошивка
Программатор USBASPСегодня мы рассмотрим как, без особых затрат и быстро, запрограммировать любой микроконтроллер AVR поддерживающий режим последовательного программирования (интерфейс ISP) через USB-порт компьютера. В качестве программатора мы будем использовать очень простой и популярный программатор USBASP, а в качестве программы — AVRdude_Prog V3. 3, которая предназначена для программирования МК AVR.
Для того, чтобы запрограммировать микроконтроллер необходимо иметь две вещи: — программатор — соответствующее программное обеспечение для записи данных в МК Одним из наиболее простых, популярных и миниатюрных программаторов для AVR является USBASP программатор, созданный немцем Томасом Фишлем. Имеется много разных схемотехнических решений этого программатора, программатор можно собрать самому или купить (стоимость — 2-3 доллара). При самостоятельной сборке следует учитывать, что собранный программатор необходимо будет прошить сторонним программатором.
Мы рассмотрим наиболее «навороченную» версию программатора:
Характеристики программатора: — работает с различными операционными системами — Linux, Mac OC, Windows (для операционной системы Windows, для работы программатора, необходимо установить драйвера — архив в конце статьи) — скорость программирования до (скорость программирования можно устанавливать самому, к примеру в AVRDUDE_PROG) 375 (5) кб/сек — имеет 10-контактный интерфейс ISP (соответствует стандарту ICSP с 10-контактной распиновкой) — поддерживает два напряжения питания программатора — 5В и 3,3В (не все USB порты ПК работают при 5 Вольтах) — питается от порта USB компьютера, имеет встроенную защиту по току (самовосстанавливающийся предохранитель на 500 мА)
Назначение джамперов: — разъем JP1 — предназначен для перепрошивки микроконтроллера программатора (для перепрошивки — необходимо замкнуть контакты) — разъем JP2 — напряжение питания программатора — 5 Вольт или 3,3 Вольта (по умолчанию — 5 Вольт, как на фотографии). Программируемый микроконтроллер, или конструкцию, в которой он установлен, при токе потребления 300-400 мА можно запитать с программатора, для этого на разъеме есть выход +5В (VCC). — разъем JP3 — определяет частоту тактирования данных SCK: разомкнутый — высокая частота (375 кГц), замкнутый — низкая частота (8 кГц)Подробнее о разъеме JP3 Джампер JP3 предназначен для уменьшения скорости записи данных в микроконтроллер. Если у микроконтроллера установлена частота тактирования более 1,5 мГц — джампер может быть разомкнут, при этом скорость программирования высокая. Если тактовая частота менее 1,5 мГц — необходимо закоротить выводы джампера — снизить скорость программирования, иначе запрограммировать микроконтроллер не получится. К примеру, если мы будем программировать микроконтроллер ATmega8 (в принципе, практически все МК AVR настроены на тактовую частоту 1 мГц по умолчанию), у которого частота тактирования по умолчанию 1 мГц, необходимо будет замкнуть выводы джампера (как на фотографии). Лучше, наверное, держать этот джампер постоянно замкнутым, чтобы, забыв о его существовании, не мучиться вопросом — почему микроконтроллер не прошивается.
Если вы будете пользоваться программой AVRDUDE_PROG, выложенной на сайте, то о перемычке можно забыть
Программатор поддерживается следующим программным обеспечением: — AVRdude — AVRdude_Prog — Bascom-AVR — Khazama AVR Prog — eXtreme Burner AVR
Работать с таким программатором очень просто — соединить соответствующие выводы программатора с микроконтроллером, подключить к USB-порту компьютера — программатор готов к работе.Распиновка 10-контактного кабеля программатора USBASP:
1 — MOSI — выход данных для последовательного программирования 2 — VCC — выход +5 (+3,3) Вольт для питания программируемого микроконтроллера или программируемой платы от порта USB компьютера (максимальный ток 200 мА — чтобы не сжечь порт USB) 3 — NC — не используется 4 — GND — общий провод (минус питания) 5 — RST — подключается к выводу RESET микроконтроллера 6 — GND 7 — SCK — выход тактирования данных 8 — GND 9 — MISO — вход данных для последовательного программирования 10 — GND
Установка драйверов для программатора USBASP
FUSE-биты при программировании USBASP AVR:
Архив «usbasp. 2011-05-28» содержит папки: = BIN: — win-driver — драйвера для программатора — firmware — прошивка для микроконтроллеров Mega8, Mega88, Mega48 = circuit — схема простого программатора в PDF и Cadsoft Eagle
При перепрошивке китайского программатора рекомендую установить FUSE-бит CKOPT. CKOPT взаимосвязан с предельной тактовой частотой. По умолчанию CKOPT сброшен и стабильная работа микроконтроллера программатора при применение кварцевого резонатора возможна только до частоты 8 МГц ( а МК программатора работает на частоте 12 МГц). Установка FUSE-бита CKOPT увеличивает максимальную частоту до 16 МГц. Китайцы не трогают этот FUSE-бит, что довольно часто приводит к отказу программатора (обычно система не определяет программатор).
Архив «USBasp-win-driver-x86-x64-ia64-v3.0.7» предназначен для установки драйверов, как указано в статье
usbasp.2011-05-28 (518,9 KiB, 14 656 hits)
Скачать «USBasp-win-driver-x86-x64-ia64-v3. 0.7» (10,9 MiB, 27 572 hits)
</p>
Скачать с ЯндексДиска
Описанный в статье USBASP программатор, прошитый последней версией программы, проверенный в работе, с установленными джамперами и перемычками, вы можете приобрести в интернет-магазине «МирМК-SHOP»Перейти на страницу магазина
Программирование микроконтроллеров AVR фирмы Atmel1. Микроконтроллеры — первый шаг2. Системы счисления: десятичная, двоичная и шестнадцатиричная3. Логические операции, логические выражения, логические элементы4. Битовые операции5. Прямой, обратный и дополнительный коды двоичного числа6. Программа AVRDUDE_PROG: программирование микроконтроллеров AVR ATmega и ATtiny
USBASP -USB программатор для программирования микроконтроллеров AVRUSBASP ISP программатор и AVRdude prog: программирование микроконтроллеров AVR ATmega, ATtiny. Как прошить микроконтроллер.Published by: Мир микроконтроллеровИспользуемые источники:
- https://mysku.ru/blog/aliexpress/52686.html
- http://r13-project.ru/2019/11/20/%d0%ba%d0%be%d0%bc%d0%bf%d0%b8%d0%bb%d0%bb%d1%8f%d1%86%d0%b8%d1%8f-%d0%b8-%d0%bf%d1%80%d0%be%d1%88%d0%b8%d0%b2%d0%ba%d0%b0-winavr-khazama-avr-programmer/
- https://microkontroller.ru/programmirovanie-mikrokontrollerov-avr/usbasp-usb-avr-programmator/
Простой программатор для прошивки AVR микроконтроллеров через СОМ порт (RS232)
Схема и описание простого программатора для прошивки AVR микроконтроллеров, используя СОМ порт (RS232) компьютера.
На сегодня существует множество программаторов AVR микроконтроллеров подобного типа, но что мне не нравится — это слишком много рассыпухи (дискретных элементов), в то время как существуют специализированные микросхемы, у которых все уже есть внутри.
Принципиальная схема
Вариаций применения моего программатора в качестве базового модуля очень много — это и программирование микросхем типа 24Схх-93Схх, а так же для программирования PIC контроллеров.
Мой выбор пал на микросхему GD75232 (рис. 1), часть элементов которой, при соответствующем включении, я задействовал для данного программатора (рис. 2).
Рис. 1. Схема микросхемы GD75232.
Рис. 2. Схема программатора для AVR микроконтроллеров через RS-232 на микросхеме GD75232.
Обязательно 10-й и 11-й выводы микросхемы должны соединяться с землей (общим проводом). Микросхема GD75232 установлена на материнских платах, ее роль — как раз согласование сигналов внешних устройств с СОМ портом. На рис. 1 из даташита [1] видно, какие элементы как подсоединены.
Микросхему специально не покупал, а снял с “убитой” материнской платы. Использовать программатор можно с известной программой Pony Prog, в установках выбрать интерфейс (Serial, СОМ1) для СОМ-порта и любой из 3-х видов интерфейсов, которые в программе перечисляются, без разницы, работает со всеми (JDM API, Si Prog API, SI Prog I/O), картинки это поясняют (рис. 3-5 соответственно). Остальные установки в настройке порта остаются в программе по умолчанию.
Рис. 3. JDM API.
Рис. 4. Si Prog API.
Рис. 5. SI Prog I/O.
Печатную плату не привожу, так как отрезал ножницами по металлу кусок платы вместе с микросхемой, в итоге размеры платы получились 20×30 мм, проводники припаял к 3-м разъемам:
- 1 — питание +5 В;
- 2 — разъем СОМ порта;
- 3 — разъем ISP для программирования.
Программатор настолько прост, что не содержит ни резисторов, ни конденсаторов — только одна — единственная микросхема. Цепляете питание +5 В, подключаете к панельке, в которую вставлен микроконтроллер AVR, приготовленный для программирования, и программируете, как обычно, в ISP режиме.
Схема проверена и испытана. На рис. 6 проиллюстрировано, как сделать монтаж без печатной платы: разместить устройство можно прямо в разъеме, зафиксировав термоклеем.
Рис. 6. Как сделать монтаж AVR-программатора без печатной платы.
Буфферизация
Простые программаторы эффективны, пока речь идет о программировании микроконтроллеров либо в DIP корпусе (удобно, когда можно микросхему вынуть из панельки на рабочей плате и воткнуть в панельку на программаторе, а потом, запрограммировав, поставить на место), либо когда на рабочей плате выводы микроконтроллеров не сильно нагружены внешними элементами схемы.
Есть отработанные хорошие схемы простых программаторов с буфферизированными шинами типа STK200/300, собранные на микросхемах серии 244, 245, но они предназначены для подключения к LPT порту, который в последнее время уже редкость на современных материнских платах.
Теперь чаще встречаются лишь USB и СОМ порты, а программаторы USB более сложны для начинающих радиолюбителей в повторении.
У большинства известных простых программаторов, работающих с СОМ портом, имеется общий недостаток: не у всех достаточная нагрузочная способность.
В последнее время все чаще применяются SMD компоненты, и микроконтроллеры применяют уже в корпусах типа SOIC и впаивает непосредственно в плату, без панелек.
В этом случае для повторного перепрограммирования надо уже либо программировать его прямо на плате, либо выпаивать чип, а в некоторых случаях приходится предварительно отключать нагрузку на его выводах в схеме, если получается, что внешние элементы “сажают” импульсы программатора, если только его шины не были буфферизированы (умощнены по току для работы с повышенной нагрузкой).
Из личного опыта скажу, что этими недостатками страдают многие широко известные простые программаторы, например, на 5-ти резисторах, или известная схема на транзисторе, резисторах и стабилитронах: при повышенной нагрузке на шинах программатора начинаются проблемы.
Для того, чтобы не делать новый программатор, есть простой путь улучшить нагрузочные характеристики программатора — это буфферизиро-вать уже имеющиеся шины для сигналов, всего лишь добавив еще одну микросхему. В данном случае я взял, что у меня было под руками — микросхему 561ПУ4 [2] (или можно ее западный аналог CD4050 [3], см. рис. 7).
В составе этой микросхемы содержится шесть буфферных неинвертирующих элементов, которые повторяют входной сигнал на выходе, не внося в него изменений.
Каждый такой элемент обладает определенной нагрузочной способностью; из иллюстрации (рис. 8), взятой в даташите, видно структуру тех дискретных элементов, содержащихся внутри буффера.
Рис. 7. Структура микросхемы 561ПУ4 (CD4050).
Рис. 8. Схема элементов микросхемы 561ПУ4 (CD4050).
Рис. 9. Программатор для AVR с повышенной нагрузочной способностью.
Подсоединив к нашему программатору такое дополнение между выводами программатора и разъемом для программирования, мы получим устройство с повышенной нагрузочной способностью (рис. 9).
У нас три сигнала с СОМ порта работают на прием, и один сигнал (MISO) работает на передачу. Припаяв к уже имеющейся схеме посредством коротких проводков еще одну микросхему буффера, я протестировал работу новой схемы и, сравнив с тем, что было прежде, убедился, что эффект есть.
На тех платах, где я прежде сталкивался с подобной проблемой при программировании, мне приходилось отсоединять нагрузку на время программирования, а теперь с новой схемой этого делать уже не потребовалось.
Рекомендую всем обладателям простых программаторов доработать имеющуюся у вас схему таким же образом. Если при программировании вы сталкивались с подобными проблемами, добавив микросхему буффера, не обязательно эту, можно использовать и другие подобные по функциональным свойствам микросхемы типа 74НС125, 74НС126 [4].
На базе этих микросхем, можно переводить выходы программатора вообще в высокоимпедансное состояние, что позволит не отключать разъем ICSP от платы: особенно это удобно при работе с макетной платой.
Z-состояние шин на выходе
Все вроде работает, но стоит добавить в схему что-либо еще, как она из маленькой превращается в “монстра”, а что делать? Иногда в процес се отладки приходится идти на это ради комфорта в работе, ведь порой по нескольку десятков раз надо втыкать разъем ICSP, повторно перепрограммируй микроконтроллер.
Это занятие так порой надоедает, а если оставить программатор постоянно подключенным к схеме, то схема программатора будет влиять на работу устройства.
Но есть решение, о котором я упоминал выше — это перевести состояние шин в высокоимпедансное Z-состояние, тогда схема программатора может быть подключена сколь угодно долго и теперь не будет шунтировать шины микроконтроллера. Ради такого случая применил микросхему 74HC125 и использовал ее в качестве буффера (рис. 10).
Рис. 10. Структурная схема ир подключение микросхемы 74HC125.
Осуществлять эту процедуру мы будем посредством кнопки S1, которая при замыкании будет переводить выходы программатора в рабочий режим программирования, подсоединяя его сигналы к схеме.
На момент программирования надо удерживать кнопку в нажатом состоянии, а после того, как процедура программирования пройдет успешно, отпустить. При разомкнутом состоянии кнопки выходы программатора переводятся в состояние Z.
Рис. 11. Струткутрная схема микросхемы 74HC125.
Рис. 12. Состояния входов и выходов микросхемы 74HC125.
Из даташита микросхемы 74НС125, по схеме (рис. 11) и таблице истинности (рис. 12) видно, что если подать на выводы А “единицу”, схема переводит выходы в высокоимпедансное состояние (фактически вообще отключается от нагрузки), и вдобавок у этой микросхемы еще большая нагрузочная способность, чем у микросхемы, которую я выбрал в качестве буффера в схеме рис. 9.
В. Науменко. г. Калининград. РМ-04-17, 05-17.
Ресурсы:
- GD75232 — www.datasheetcatalog.org/datasheet/texasinstruments/ad75232.pdf
- 561ПУ4 — www.voshod-krlz.ru/files/datasheets/561pu4.pdf
- CD4050 — www.datasheetcataloa.Org/datasheets/70/109093DS.pdf
- 74НС125, 74НС126 — www.datasheetcatalog.org/datasheet/SGSThomsonMicroelectronics/mXrytxt.pdf
AVR Tutorials — Загрузка данных из памяти программ
Память программ, также известная как флэш-память, может быть загружена константами, такими как массивы и строки, при программировании вашего чипа. Доступ к памяти программ во время выполнения можно осуществить всего двумя инструкциями, показанными в таблице ниже.
Мнемоника | Описание |
---|---|
л/мин | загрузить память программ |
спм | сохранить программную память |
Сохранение данных в памяти программ во время выполнения требует отдельного руководства и на самом деле используется только для программ загрузчика. Здесь мы рассмотрим гораздо более простую и часто используемую концепцию загрузки данных из памяти программ.
Определение констант в памяти программ
Как мы видели в учебнике по SRAM, в памяти программ может быть выделено место для хранения значений. Однако, в отличие от SRAM, значения могут быть записаны непосредственно во флэш-память вашим программистом, к которому вы можете получить немедленный доступ. Есть несколько директив, используемых для выделения пространства, показанных в таблице ниже.
Директива | Описание |
---|---|
.дб | определить постоянный байт(ы) |
.дв | определить постоянное слово (слова) |
.дд | определить постоянное двойное слово(а) |
.dq | определить постоянное четверное слово (слова) |
Определение последовательности байтов может быть выполнено как
myBytes: .db 0x00,0x01,0x02,0x03,0x04,0x05 myNums: . db 0,1,2,3,4,5 myChars: .db 'H','e','l','l','o','!' myString: .db "Привет!"
То же самое можно сделать со словами (16 бит), используя .dw
myWords: .dw 0x0000,0x0001,0x0002,0x0003
Двойные слова (32 бита) с использованием .dd
myDword: .dd 0xDEADBEEF
И четверные слова (64 бита) с использованием .dq
myQword: .dq 0x0123456789ABCDEF
Пространство, выделенное в памяти программ, должно быть четным числом байтов. Если это не так, ассемблер автоматически добавит нулевой байт в качестве заполнения. Ассемблер сгенерирует предупреждение, чтобы уведомить вас, но все равно будет компилироваться. Например, это выдаст предупреждение
myBytes: .db 0,1,2 ; байт заполнения будет добавлен
Загрузка данных из памяти программ
Загрузка данных из памяти программ может быть выполнена только косвенно с помощью указателя Z. Это показано ниже
ldi ZL,LOW(2*var) ; нагрузка 2*вар ldi ZH,HIGH(2*var) ; в указатель Z л/мин r4,Z ; загрузить переменную pmem в r4 переменная: . db 3
Обратите внимание, что в указатель Z загружается адрес 2*var, а не var. Причина этого в том, что память программ равна слово адресовано. Таким образом, каждый адрес в памяти программ содержит два байта. Однако указатель Z имеет адрес байт . Как показано ниже, для каждого адреса слова есть два байтовых адреса.
Адрес слова 0x0000 содержит адреса байтов 0x00 и 0x01, адрес слова 0x0001 содержит адреса байтов 0x02 и 0x03 и так далее. Таким образом, адрес слова можно преобразовать в адреса байтов, умножив его на два для младшего байта, умножив его на два и добавив единицу для старшего байта.
Например, старший и младший байты слова, хранящегося в метке myWord, будут доступны как
ldi ZL,LOW(2*myWord) ; загрузить 2*моё слово ldi ZH,HIGH(2*myWord) ; в указатель Z л/мин r4,Z ; загрузить младший байт var в r4 (0x34) ldi ZL,LOW(2*myWord)+1 ; приращение Z низкий л/мин r5,Z ; загрузить старший байт var в r5 (0x12) мое слово: .db 0x1234
Приращение поста
Указатель Z можно увеличивать после каждого л/мин, помещая после него +, например.
л/мин r16,Z+ ; загрузить из памяти программ и увеличить Z
Используя это, приведенный выше пример загрузки слова может быть упрощен как
ldi ZL,LOW(2*myWord) ; загрузить 2*моё слово ldi ZH,HIGH(2*myWord) ; в указатель Z л/мин r4,Z+ ; загрузить младший байт var в r4 (0x34) л/мин r5,Z ; загрузить старший байт var в r5 (0x12) myWord: .db 0x1234
Краткий пример
Предположим, у вас есть массив, определенный в памяти программ, и вы хотите передать его в SRAM. Следующая программа показывает пример того, как это можно сделать.
.include "m328pdef.inc" .equ числоB = 20 ; количество байтов в массиве .def tmp = r16 ; определить временный регистр .def loopCt = r17 ; определить регистр счетчика циклов .dseg .org SRAM_START sArr: .BYTE numB ; выделить байты в SRAM для массива .cseg .org 0x00 ldi XL, LOW (sArr) ; инициализировать указатель X ldi XH,HIGH(sArr) ; к адресу массива SRAM ldi ZL,LOW(2*pArr) ; инициализировать указатель Z ldi ZH,HIGH(2*pArr) ; на адрес массива pmem ldi петляCt,numB ; инициализировать количество циклов до количества байтов arrLp: lpm tmp,Z+ ; загрузить значение из массива pmem ст Х+,тмп ; сохранить значение в массив SRAM уб петляCt ; уменьшить количество циклов brne arrLp ; повторить цикл для всех байтов в массиве петля: rjmp петля ; бесконечная петля pArr: . db 0,1,2,3,4,5,6,7,8,9,\ 10,11,12,13,14,15,16,\ 17,18,19; массив программной памяти
Указатель X используется для доступа к расположению нашего массива в SRAM, поэтому он загружается с адресом памяти данных
ldi XL,LOW(sArr) ; инициализировать указатель X ldi XH,HIGH(sArr) ; к адресу массива SRAM
Указатель Z используется для доступа к расположению нашего массива в памяти программ, поэтому он загружается с удвоенным адресом памяти программ
ldi ZL,LOW(2*pArr) ; инициализировать указатель Z ldi ZH,HIGH(2*pArr) ; на адрес массива pmem
Затем мы настраиваем простой цикл для перебора количества байтов в нашем массиве (которое мы знаем заранее). Мы загружаем отдельные байты из памяти программ в регистр tmp, а затем сохраняем их в SRAM. Вы можете видеть, как увеличение указателя значительно упрощает код
ldi loopCt,numB ; инициализировать количество циклов до количества байтов arrLp: lpm tmp,Z+ ; загрузить значение из массива pmem ст Х+,тмп ; сохранить значение в массив SRAM уб петляCt ; уменьшить количество циклов brne arrLp ; повторить цикл для всех байтов в массиве
Обратите внимание на \ в определении массива памяти программ. Это используется как продолжение строки, чтобы наш код не стал слишком широким.
pArr: .db 0,1,2,3,4,5,6,7,8,9,\ 10,11,12,13,14,15,16,\ 17,18,19; массив памяти программ
<< Предыдущая
Следующая >>
9. Встроенное программирование — Fab Academy Manu Mohan S
Задание-1 Чтение описания микроконтроллера
Введение
Целью этой недели было понять работу микроконтроллера и научиться программировать его для выполнения нужных нам функций.
Что такое микроконтроллер?
Все началось здесь. Микроконтроллер — это одна микросхема, содержащая как минимум ЦП, энергонезависимую память, энергозависимую память, таймер и блок управления вводом-выводом. Отличие микроконтроллера от обычного ПК в том, что ПК компьютер общего назначения, а микроконтроллер — это компьютер, предназначенный для одной или нескольких задач. Он также имеет возможности последовательной связи, управление прерываниями и возможности аналогового ввода/вывода.
1) Процессор. Под процессором понимается центральный процессор (ЦП) микроконтроллера. Он содержит арифметико-логическое устройство (ALU), блок управления, декодер инструкций и некоторые специальные регистры (указатель стека, регистр состояния, счетчик программ и т. д.).
2) Энергонезависимая память. Это память, используемая микроконтроллером для временного хранения данных, настройки системы и конфигурации периферийных устройств. Память в этой категории включает SRAM и DRAM. Микроконтроллеры AVR используют SRAM.
3) Энергонезависимая память. Это память, используемая микроконтроллером для хранения программ. Данные также могут храниться в этой памяти, но время доступа намного меньше, чем у ОЗУ. Память в этой категории включает ROM, PROM, EPROM, EEPROM и FLASH. Микроконтроллеры AVR используют флэш-память для хранения программ, некоторые контроллеры AVR также содержат немного EEPROM.
4) Модуль таймера. Большинство микроконтроллеров имеют как минимум один периферийный таймер/счетчик. Модули таймера/счетчика используются для выполнения операций синхронизации или подсчета в контроллере. К ним относятся отметка времени, интервалы измерения, подсчет событий и т. д.
5) Модуль прерываний. Прерывания позволяют микроконтроллеру отслеживать определенные события в фоновом режиме во время выполнения прикладной программы и реагировать на событие, при необходимости приостанавливая исходную программу. Все это координируется модулем прерывания.
6) Модуль цифрового ввода/вывода. Этот модуль обеспечивает цифровую/логическую связь с микроконтроллером и внешним миром. Коммуникационные сигналы имеют логику TTL или CMOS.
7) Аналоговые модули ввода/вывода. Эти модули используются для ввода/вывода аналоговой информации из/во внешний мир. Аналоговые модули включают в себя аналоговые компараторы и аналого-цифровые преобразователи.
8) Последовательные модули — Эти модули используются для последовательной связи с внешним миром.
АТтини44
На приведенном выше рисунке показана схема микроконтроллера ATtiny 44, 8-разрядного микроконтроллера Atmel, работающего на модифицированной гарвардской архитектуре AVR RISC (Reduced Instruction Set Computing). Чтение таблицы данных выявило следующие вещи. Это означает, что микроконтроллер может одновременно получать и отправлять 8 бит данных за раз. Получившаяся в результате архитектура более эффективна в коде, обеспечивая при этом пропускную способность в десять раз выше, чем у обычных микроконтроллеров CISC.
Воспоминания и карта памяти
Карта памяти микроконтроллера — это диаграмма, которая показывает размер, тип и расположение памяти, доступной в микроконтроллере. Информация, используемая для построения карты памяти, извлекается из таблицы данных микроконтроллера.
Типы воспоминаний
- Внутрисистемная перепрограммируемая флэш-память:
Atmel ATtiny24/44/84 содержит 2/4/8 Кбайт встроенной внутрисистемной перепрограммируемой флэш-памяти для хранения программ. Поскольку все инструкции AVR имеют ширину 16 или 32 бита, флэш-память организована как 1024/2048/409.6 x 16. Флэш-память имеет срок службы не менее 10 000 циклов записи/стирания. Счетчик программ Atmel ATtiny24/44/84 (ПК) имеет разрядность 10/11/12 бит, что позволяет адресовать 1024/2048/4096 ячеек памяти программ.
![Карта памяти программ](../images/week09.12.jpg)
Память данных SRAM:
Нижние 160 ячеек памяти данных относятся к регистровому файлу, памяти ввода-вывода и внутренней SRAM данных. Первые 32 ячейки относятся к регистровому файлу, следующие 64 ячейки относятся к стандартной памяти ввода-вывода, а последние 128/256/512 ячеек относятся к внутренней SRAM данных 9.0003Память данных EEPROM
Atmel® ATtiny24/44/84 содержит 128/256/512 байт памяти данных EEPROM. Он организован как отдельное пространство данных, в котором можно читать и записывать отдельные байты. EEPROM выдерживает не менее 100 000 циклов записи/стирания.
Источник: http://www.avr-tutorials.com
Стек AVR и указатель стека
Что такое стек?
Стек — это последовательный блок памяти данных, выделенный программистом. Этот блок памяти может использоваться как внутренним управлением микроконтроллера, так и программистом для временного хранения данных. Стек работает по принципу «последним пришел – первым вышел» (LIFO), т. е. последний элемент, хранящийся в стеке, извлекается из стека первым.
Что такое указатель стека?
Указатель стека в основном представляет собой регистр или регистры, которые содержат либо «адрес памяти последнего места в этом стеке, где были сохранены данные», либо «адрес памяти следующего доступного места в стеке для хранения данных». Определение указателя стека зависит от конструкции микроконтроллера.
Указатель стека AVR
8-битный указатель стека микроконтроллера AVR может состоять либо из одного регистра ввода-вывода SPL (указатель стека, низкий уровень), либо из двух (2) регистров ввода-вывода SPL и SPH (указатель стека, высокий уровень). В ATtiny 44 используется последний. Размер указателя стека зависит от объема памяти данных, которую содержит микротроллер. Если вся память данных может быть адресована с помощью 8-битной адресации, то указатель стека имеет ширину 8 бит, то есть только SPL, в противном случае указатель стека состоит из SPL и SPH.
ALU – арифметико-логическое устройство
Высокопроизводительное ALU Atmel AVR работает в прямом соединении со всеми 32 рабочими регистрами общего назначения. За один такт выполняются арифметические операции между регистрами общего назначения или между регистром и непосредственным. Операции АЛУ делятся на три основные категории — арифметические, логические и битовые функции. Некоторые реализации архитектуры также предоставляют мощный множитель, поддерживающий как знаковое/беззнаковое умножение, так и дробный формат.
Регистр состояния
Регистр состояния содержит информацию о результате последней выполненной арифметической инструкции. Эта информация может использоваться для изменения потока программы для выполнения условных операций. Обратите внимание, что регистр состояния обновляется после всех операций АЛУ, как указано в сводке набора инструкций. Это во многих случаях устраняет необходимость использования специальных инструкций сравнения, что приводит к более быстрому и компактному коду.
Описание различных битов в регистре SREG
Цифровой ввод/вывод AVR
Связанные регистры ввода/вывода
Регистр AVR?
Вся информация в микроконтроллере, от памяти программ, информации таймера, до состояния любого из входных или выходных контактов, хранится в регистрах. Регистры подобны полкам в книжной полке процессорной памяти. В 8-битном процессоре, таком как используемый нами AVR ATMega 16, полка может содержать 8 книг, где каждая книга представляет собой однобитное двоичное число, 0 или 1. Каждая полка имеет адрес в памяти, так что контроллер знает где найти.
Источник: https://ccrma.stanford.edu/workshops/pid2004/lectures/programming/programming/AVR_Registers.html
Каждый цифровой порт ввода-вывода AVR связан с тремя (3) регистрами ввода-вывода. Регистр направления данных (DDRx), регистр контактов (PINx) и регистр порта (PORTx). Где x — порт A, B, C и т. д.
- DDRx — регистр направления данных порта X
DDRx — это 8-битный регистр, в котором хранится информация о конфигурации контактов Portx. Запись 1 в расположении контакта в DDRx делает физический вывод этого порта выходным выводом, а запись 0 делает этот вывод входным выводом.
Примечание. Каждый физический контакт порта настраивается независимо, поэтому порт может иметь некоторые из своих контактов, настроенные как входные, а другие — как выходные.
- PINx — регистр входных контактов порта X
PINx — это 8-битный регистр, в котором хранится логическое значение, текущее состояние физических контактов на Portx. Таким образом, чтобы прочитать значения на контактах Portx, вы должны прочитать значения, которые находятся в его регистре PIN.
- PORTx — регистр данных порта X
PORTx — это 8-битный регистр, в котором хранятся логические значения, которые в настоящее время выводятся на физические контакты Portx, если контакты сконфигурированы как выходные контакты. Таким образом, чтобы записать значения в порт, вы записываете значения в регистр PORT этого порта. Регистры в AT tiny 44
Регистр DDRx используется для настройки контактов порта x как входных или выходных. Каждый контакт на порту является независимым, поэтому весь порт не нужно полностью настраивать как порт ввода или вывода. Запись 1 в позиции контакта в DDRx настроит этот контакт как выходной контакт, а запись 0 настроит контакт как входной контакт.
Логические значения, записанные в регистр PORTx, выводятся на контакты Portx, настроенные как выходные контакты.
Логические значения, считанные из регистра PINx, эквивалентны значениям, которые в настоящее время находятся на выводах Portx, сконфигурированных как входные выводы.
Прерывания микроконтроллера AVR
Что такое прерывания?
Прерывания — это в основном события, требующие немедленного внимания со стороны микроконтроллера. Когда происходит событие прерывания, микроконтроллер приостанавливает свою текущую задачу и реагирует на прерывание, выполняя процедуру обслуживания прерывания (ISR). В конце ISR микроконтроллер возвращается к задаче, в которой он был приостановлен, и продолжает свою нормальную работу. Процедура обслуживания прерывания (ISR) или обработчик прерываний — это фрагмент кода, который должен выполняться при срабатывании прерывания. Обычно каждое разрешенное прерывание имеет свой собственный ISR.
Чтобы микроконтроллер реагировал на событие прерывания, функция прерывания микроконтроллера должна быть включена вместе с конкретным прерыванием. Это делается установкой бита Global Interrupt Enabled и бита Interrupt Enable конкретного прерывания.
Флаги прерывания и разрешенные биты
Каждое прерывание связано с двумя (2) битами: битом флага прерывания и битом разрешения прерывания. Эти биты расположены в регистрах ввода-вывода, связанных с конкретным прерыванием:
Бит флага прерывания устанавливается всякий раз, когда происходит событие прерывания, независимо от того, разрешено прерывание или нет.
Бит разрешения прерывания используется для включения или отключения определенного прерывания. По сути, он сообщает микроконтроллеру, должен ли он реагировать на прерывание, если оно срабатывает.
Таким образом, как флаг прерывания, так и прерывание разрешено необходимы для генерации запроса на прерывание, как показано на рисунке ниже.
Бит разрешения глобального прерывания
Помимо разрешенных битов для определенных прерываний, глобальный бит разрешения прерывания ДОЛЖЕН быть включен, чтобы прерывания активировались в микроконтроллере.
Для 8-битного микроконтроллера AVR этот бит находится в регистре ввода-вывода состояния (SREG). Разрешенное глобальное прерывание — это бит 7, бит I, в SREG. 7-й бит I
Источники прерываний, поставляемые с микроконтроллером AVR
8-битный микроконтроллер AVR обеспечивает как внутренние, так и внешние источники прерываний. Внутренние прерывания связаны с периферийными устройствами микроконтроллера. Это таймер/счетчик, аналоговый компаратор и т. д. Внешние прерывания запускаются через внешние контакты. На рисунке ниже показаны контакты, по которым могут запускаться внешние прерывания, для 8-битного микроконтроллера AVR ATtiny 44. На этом микроконтроллере имеется 12 внешних прерываний PA0…11.
Вектор прерывания — это адрес памяти обработчика прерывания. Вектор прерывания для каждого прерывания, предоставляемого микроконтроллерами AVR, можно найти в его техническом описании.
Микроконтроллер AVR Аналоговый ввод/вывод
Ряд 8-разрядных микроконтроллеров Atmel AVR обеспечивают возможности аналогового ввода/вывода (I/O) через свои «аналоговый компаратор» и «аналого-цифровой преобразователь (АЦП)».
Что такое аналоговый компаратор?
Аналоговый компаратор — это устройство, которое сравнивает два (2) аналоговых значения и указывает, какое из них больше. В электронике это в основном усилитель без обратной связи и, следовательно, с очень высоким коэффициентом усиления, как показано ниже. Когда положительный вход (+) больше, выходное напряжение насыщается до его положительного питания (логическая 1), в противном случае выход насыщается до отрицательного питания (логический 0).
То есть: «Vout = логическая 1», когда «Vin0 > Vin1», и «Vout = логический 0», когда «Vin0 < Vin1».
ATtiny24A/44A/84A обладает следующими функциями: 2K/4K/8K байт внутрисистемно программируемой флэш-памяти, 128/256/512 байт EEPROM, 128/256/512 байт SRAM, 12 линий ввода/вывода общего назначения , 32 рабочих регистра общего назначения, 8-битный таймер/счетчик с двумя каналами ШИМ, 16-битный таймер/счетчик с двумя каналами ШИМ, внутренними и внешними прерываниями, 8-канальный 10-битный АЦП, программируемый каскад усиления (1x, 20x ) для 12 дифференциальных пар каналов АЦП, программируемый сторожевой таймер с внутренним генератором, внутренний калиброванный генератор и четыре программно выбираемых режима энергосбережения. В режиме ожидания ЦП останавливается, в то время как SRAM, таймер/счетчик, АЦП, аналоговый компаратор и система прерываний продолжают функционировать. Режим шумоподавления АЦП минимизирует шум переключения во время преобразования АЦП, останавливая ЦП и все модули ввода-вывода, кроме АЦП. В режиме Power-down регистры сохраняют свое содержимое и все функции микросхемы отключаются до следующего прерывания или аппаратного сброса. В режиме ожидания кварцевый/резонаторный генератор работает, в то время как остальная часть устройства находится в спящем режиме, что обеспечивает очень быстрый запуск в сочетании с низким энергопотреблением. Гарвардская архитектура
Счетчик программ
Счетчик программ (ПК) — это регистр, который является частью всего центрального процессора (ЦП) или микропроцессора. Все микроконтроллеры содержат микропроцессор и, следовательно, имеют программный счетчик. Назначение счетчика программ состоит в том, чтобы удерживать/запоминать адрес следующей команды, которая должна быть выполнена микропроцессором микроконтроллера. Размер (ширина) счетчика программ микроконтроллера измеряется в битах и напрямую связан с размером программная память микроконтроллера. 9n = размер программной памяти n = log(размер памяти программы)/(log2)
Программирование микроконтроллера
Использование C
Основы программирования на C были изучены на http://www. avr-tutorials.com/digital/digital-input-output-c-programming-atmel-avr-8-bits-microcontrollers
Была использована простая программа, чтобы светодиод мигал
Первая часть заключалась в установке компилятора GCC для использования языка C, введя следующую команду в терминале sudo apt установить gcc
1) Написал программу на C, чтобы светодиод мигал. Было отмечено, что мой светодиод подключен к PB2.
Будучи новичком в C, это была моя первая попытка. Наш лаборант Йеду действительно помог почти всем с этой программой. Я собираюсь попробовать себя в импровизации и построить новый!.
2) Сделал Makefile, который обязательно включал следующие команды
`имя_файла = основной устройство = attiny44 объект: avr-gcc -g -Os -mmcu=$(устройство) -c $(имя_файла).c ссылка на сайт: avr-gcc -g -mmcu=$(устройство) -o $(имя_файла).elf $(имя_файла).o шестнадцатеричный файл: avr-objcopy -j . text -j .data -O ihex $(имя_файла).elf $(имя_файла).hex hex: шестнадцатеричный файл ссылки на объект`
Я понял, что make-файл — это что-то вроде ярлыка для выполнения такого количества команд. В конце мы видим, что команда hex
запустит все команды, последовательно указанные объектом
, ссылкой
и шестнадцатеричным файлом
. Цель состоит в том, чтобы создать шестнадцатеричный файл, который инструктирует MCU выполнить желаемую операцию, упомянутую в программе.
3) Первым делом нужно сделать шестнадцатеричный файл. Введите , сделайте шестнадцатеричный код
. Был создан hex-файл.
4) Прошивка MCU шестнадцатеричным файлом, сделанным с помощью команды avrdude -p t44 -c usbtiny -U flash:w:main.hex
в терминале, где находится папка, содержащая шестнадцатеричный файл.
Это не сработало, к сожалению, оно продолжало возвращать ошибку соединения rc-1!. Я так увлекся, что забыл сделать скрин. Соединения проверял мультиметром, все работает.
Мне потребовалось некоторое время с помощью нашего инструктора, чтобы неисправность заключалась в том, что мой вывод подключен к тому же порту, что и к одному выводу внешнего генератора.
Решение заключалось в том, что свободный контакт PA2 использовался для подключения порта светодиода! Посмотрим, получится ли
См. красный провод, используемый для обхода соединения. Спасибо Suhail P за своевременную помощь. Кажется, я потратил на это около 2 часов!
Видео здесь
Попытка -2 с использованием переключателя
Открытый Атом, лучший текстовый редактор
Сделал программирование, чтобы сделать переключатель, чтобы при нажатии он какое-то время моргал и выключался при следующем нажатии.
Сработало!
Видео здесь
Использование Aurdino IDE
Интегрированная среда разработки (IDE) Arduino — это кроссплатформенное приложение (для Windows, macOS, Linux), написанное на языке программирования Java. Он используется для записи и загрузки программ на плату Arduino.
Настройка Аурдуино 1) Установите Aurduino IDE для 64-битной версии Linux.
2) Перейдите в «Файл», «Настройки» и добавьте дополнительный URL-адрес менеджера доски, например https://raw.githubusercontent.com/damellis/attiny/ide-1.6.x-boards-manager/package_damellis_attiny_index.json.
3) В Инструменты выберите следующее
1) Выберите следующие параметры
Плата к ATtiny44
Процессор к ATtiny44
Часы к внешнему 20 МГц
Программатор к USB крошечному ISP
2) После написания кода используйте вкладку Verify/Compile в меню Sketch и в случае успеха используйте Upload для прошивки программы на микроконтроллер.
Видео здесь
По сравнению с языком C Aurduino IDE оказалась более простой в освоении и использовании. Но я так понял, что С — это базовая. Для выполнения сложных программ нам придется полагаться на программирование на C.
Далее
Следующим пунктом было то, как я могу использовать его для программирования своей платы для окончательного проекта. Я бы использовал как минимум два датчика одновременно с возможным ЖК-дисплеем снаружи.
Узнал, что библиотеки Аурдино стоят дорого, когда мы сжигаем MCU, потому что они занимают больше флэш-памяти в MCU.
Выше мы видели микроконтроллер, основанный на модифицированной гарвардской архитектуре. Нам дали сравнительную экскурсию по другой другой архитектуре, которая была архитектурой фон Неймана. Ниже вы найдете основные изменения производительности и функциональности новой Гарвардской архитектуры. На рисунке ниже показана разница в производительности между двумя архитектурами. Источник изображения: Youtube.com
Сравнение на основе работы
Сравнение на основе рабочего процесса разработки
Источник: https://www.refreshnotes.com/2016/02/von-neumann-vs-harvard-architecture.html
Микробит и малиновый пирог
Источник https://www.amazon.co.uk/BBC-MB80-micro-bit/dp/B01G8WUGWU)
Источник (https://thepihut. com/products/raspberry-pi-3) -модель-б)
Оба являются встроенными системами на базе ARM с открытым исходным кодом, предназначенными для образовательных целей.
Архитектура ARM
ARM, ранее Advanced RISC Machine, первоначально Acorn RISC Machine, представляет собой семейство архитектур вычислений с сокращенным набором команд (RISC) для компьютерных процессоров, сконфигурированных для различных сред. Arm Holdings разрабатывает архитектуру и передает ее по лицензии другим компаниям, которые разрабатывают свои собственные продукты, реализующие одну из этих архитектур, включая системы-на-чипе (SoC) и системы-на-модулях (SoM), которые включают память, интерфейсы, радиомодули, и т. д. Он также разрабатывает ядра, которые реализуют этот набор инструкций, и лицензирует эти разработки ряду компаний, которые включают эти разработки ядер в свои собственные продукты. Процессоры с архитектурой RISC обычно требуют меньше транзисторов, чем процессоры со сложной архитектурой вычислений с набором команд (CISC) (например, процессоры x86, используемые в большинстве персональных компьютеров), что снижает стоимость, энергопотребление и рассеивание тепла. Эти характеристики желательны для легких, портативных устройств с батарейным питанием, включая смартфоны, ноутбуки и планшетные компьютеры, а также другие встроенные системы 9.0003
Что такое RISC-архитектура?
Компьютер с сокращенным набором инструкций (RISC) — это тип или категория процессора или Архитектура набора инструкций (ISA). В широком смысле ISA — это среда, посредством которой процессор взаимодействует с человеком-программистом (хотя между процессором и программистом есть несколько других формально определенных слоев). Инструкция — это команда, данная процессору для выполнения действия. Набор инструкций — это весь набор инструкций для данного процессора, а термин «архитектура» подразумевает определенный способ построения системы, из которой состоит процессор.
RISC обычно относится к упрощенной версии своего предшественника, компьютера с комплексным набором инструкций (CISC). На заре процессоров не было формальной идентификации, известной как CISC, но с тех пор этот термин был придуман для обозначения их отличия от архитектуры RISC. Некоторые примеры архитектур набора команд микропроцессора CISC (ISA) включают Motorola 68000 (68K), DEC VAX, PDP-11, несколько поколений Intel x86 и 8051.
Примеры процессоров с архитектурой RISC включают MIPS, PowerPC, Atmel AVR, процессоры Microchip PIC, процессоры Arm, RISC-V, и все современные микропроцессоры имеют по крайней мере некоторые элементы RISC. Переход от 8- и 16-разрядных к 32-разрядным архитектурам, по сути, вызвал потребность в RISC-архитектурах. Тем не менее, потребовалось десятилетие, прежде чем RISC-архитектуры начали завоевывать популярность, в основном из-за отсутствия программного обеспечения, которое могло бы работать на RISC-архитектурах. Intel также оказала влияние, поскольку у нее были средства для продолжения использования архитектуры CISC, и она не обнаружила необходимости перепроектировать с нуля. Архитектура MIPS была одной из первых ISA RISC и широко использовалась для обучения архитектуре RISC.
В таблице ниже показано сравнение архитектуры RISC и CISC. Источник: https://www.microcontrollertips.com/risc-vs-cisc-architectures-one-better/
Каталожные номера
1.http://www.avr-tutorials.com/general/microcontrollers-basics
2.https://en.wikipedia.org/wiki/AVR_microcontrollers
3.http://ww1.microchip.com/downloads /en/devicedoc/Atmel-7701_Automotive-Microcontrollers-ATtiny24-44-84_Datasheet.pdf
Адресация ячеек флэш-памяти AVR
Адресация ячеек флэш-памяти AVR Пфад: Главная => AVR-RU => Введение для начинающих => флэш-доступ ( Diese Seite на немецком языке: )- доступ к ячейкам SRAM,
- доступ к регистрам портов,
- доступ к ячейкам EEPROM,
- доступ к ячейкам флэш-памяти
- Флэш-память
- .CSEG директива
- л/мин
- Расширенный л/мин
- Примеры использования
Размер флэш-памяти может быть от 512 до 393 216 слов.
слова. Таким образом, адреса находятся между 0x01FF и 0x05FFFF. В большинстве случаев
константа FlashEnd из файла def.inc предоставляет последний или самый высокий
адрес.
Адрес 0x00000 особенный, потому что это начальный адрес: после
при включении питания, сбросе или сторожевом сбросе командное слово по адресу 0x000000
первое, что выполняется.
При сборке исходного кода все исполняемые инструкции и таблицы записываются в код
сегмент CSEG по умолчанию. При переключении ассемблера либо на сегмент SRAM с
директивой .DSEG или в сегмент EEPROM с директивой .ESEG ,
возврат назад к сегменту кода можно выполнить с помощью директивы .CSEG .
Весь собранный код записывается ассемблером в файл .hex. Его содержимое может быть записано во флэш-память с помощью программного и аппаратного программатора.
Инструкции, такие как NOP , записывают 16-битные слова в файл .hex. Слова с 16 бит могут быть записаны директивой .DW 16-битное значение в любом месте внутри Вспышка.
байта могут быть собраны и записаны в файл .hex с 8-битным значением .DB . При записи одного единственного 8-битного значения всегда используется старший значащий байт MSB. записано в ноль. При записи двух 8-битных констант в одном .DB 8-битном значении-1, директива 8-bit-value_2 , первое значение записывается в LSB, второе значение к MSB в текущем местоположении.
Исходный код ассемблера слева собран, результаты сборки можно посмотреть в листинге ассемблера справа.
- NOP в строке 20 исходного кода, который является действительной инструкцией, был переведен на адрес 0x000000 и исполняемый шестнадцатеричный код 0x0000. Этот шестнадцатеричный код будет записан в шестнадцатеричный файл.
- ADD R16,R16 в строке 21 преобразован в исполняемый шестнадцатеричный код 0x0F00 по адресу 0x000001.
- Следующая строка не переведена, так как это только метка и имеет значение только для ассемблера.
- Цикл RJMP был преобразован в 0xCFFF по адресу 0x000002, т.е. исполняемый файл, который возвращается туда, откуда он только что пришел (неопределенный цикл.
- Первый .DB 1 был преобразован в 0x0001 по адресу 0x000003, но ассемблер выдает предупреждение, что количество байтов в .DB строка нечетная, и что он добавил 0x00 в качестве MSB по адресу 0x000003.
- Второй .DB 1,2 был преобразован в 0x0201 по адресу 0x000004. Обратите внимание, что первый байт 0x01 теперь является младшим битом результирующего слова во флэш-памяти. в то время как второй байт 0x02 является старшим битом этого слова.
- Третий .DB 1,2,3 был разбит на два слова: 1 и 2 идут к первое слово, 3 переходит ко второму слову, и ассемблер снова предупреждает.
- Строка .DB «Текстовая строка» переведена в семь слов подряд: как видно из второго символа в строке, пробел или 0x20, каждый второй символ идет в MSB, а каждый первый символ в LSB. Опять же, ассемблер жалуется, что количество байтов в строке странный.
- Нет таких жалоб во всех строках с .DW : все слова умещаются в 16 биты флэш-памяти. Последняя запись, .DW Loop вставляет адрес метки Цикл: во флэш-память по этому адресу 0x000014. Мы позже прочитает этот адрес, чтобы перейти к такой метке.
Инструкция LPM или Загрузить из памяти программ считывает один байт из вспышка. Он берет адрес флэш-памяти из пары регистров Z (ZH:ZL = R31:R30). и передает результат в регистр R0.
Но: каждый адрес во флэш-памяти состоит из двух байтов, LSB и MSB. Какой из два байта должны быть прочитаны, и как получить второй байт в то же самое адрес?
Хитрость заключается в том, чтобы сдвинуть адрес флэш-памяти влево на одно место и добавить ноль или единицу справа от адреса в бите 0 Z. Нуль к право обращается к младшему биту, а один к старшему биту.
У трюка есть один недостаток: 15-й бит адреса флэш-памяти не может быть использовал. Так что лучше поместите свои длинные таблицы с тысячами значений в нижняя половина ваших 64k слов вспышка.
Следующие формулировки на ассемблере одинаковы и устанавливают Z для доступа LSB и MSB таблицы байтов ниже:
.equ FlashAddr = ByteTable ; Установите адрес флэш-памяти ; Формула 1 ldi ZH,Высокий(FlashAddr+FlashAddr+0) ; Доступ к LSB, MSB Z ldi ZL,Low(FlashAddr+FlashAddr+0) ; dto., младший бит Z л/мин ldi ZH,Высокий(FlashAddr+FlashAddr+1) ; Доступ к MSB, MSB Z ldi ZL,Low(FlashAddr+FlashAddr+1) ; dto., младший бит Z л/мин ; ; Формула 2 ldi ZH,Высокий(2*FlashAddr+0) ; Доступ к LSB, MSB Z ldi ZL,Низкий(2*FlashAddr+0) ; dto., младший бит Z л/мин ldi ZH,Высокий(2*FlashAddr+1) ; Доступ к MSB, MSB Z ldi ZL,Low(2*FlashAddr+1) ; dto., младший бит Z л/мин ; ; Формула 3 ldi ZH,High((FlashAddr<<1)|0) ; Доступ к LSB, MSB Z ldi ZL,Low((FlashAddr<<1)|0) ; dto., младший бит Z л/мин ldi ZH,High((FlashAddr<<1)|1) ; Доступ к MSB, MSB Z ldi ZL,Low((FlashAddr<<1)|1) ; dto. , младший бит Z л/мин Петля: цикл rjmp ; Байтовая таблица: .дб 1 .дб 1,2 .дб 1,2,3 .db "Это текстовая строка"Конечно, вам не нужно определять дополнительную константу с именем FlashAddr , но вы можете напрямую использовать метку ByteTable: как адрес в инструкциях LDI. И все +0 и |0 в составы также излишни, потому что они не имеют никакого эффекта.
Так что как хотите, все равно. Результат всегда в R0, как показывает смоделированная инструкция. Что за симуляция также показывает, что один доступ к флэш-памяти стоит три циклы (LDI — один цикл каждый). Таким образом, флэш-память немного медленнее, чем SRAM, и намного медленнее, чем регистры.
Позже ATMEL добавила возможность использовать любой регистр в качестве цели. формулировка этих инструкций: регистр л/мин,Z , где регистр может быть любым из 32 регистров.Также чуть позже был реализован автоинкремент. Этот увеличивает адрес в Z после выполнения загрузки. Эффект заключается в том, что две инструкции lpm и adiw ZL,1 заменяются инструкцией lpm register,Z+ . Обратите внимание, что этот дополнительный шаг не увеличивает время доступа.
Наоборот, автоуменьшение читать таблицы с конца вниз к началу, также был реализован. Как и в случае с SRAM автодекремент, декремент делается до загрузки доступ. Формула л/мин регистр,-Z и заменяет sbiw ZL,1 и л/мин . Это дополнительное уменьшение не меняет время доступа.
В первом примере LPM используется для копирования текста с завершающим нулем из флэш-память в SRAM.; Подготовьте метки сегментов данных .dseg sТекст: ; .cseg ; Точка Z для вспышки в памяти ldi ZH, высокий (2 * текст) ldi ZL, низкий (2 * текст) ; Укажите X на целевое местоположение SRAM ldi XH, High (sText) LDI XL, Низкий (sText) Копировать текст: л/мин R16,Z+ ; Загрузка из памяти программ ст Х+,R16; Хранить в SRAM тст R16 ; Нулевое завершение? brne CopyText ; Нет, продолжай ; Не врезаться в стол Петля: цикл rjmp ; Подготовьте текст во флэш-памяти Текст: .db "Этот текст для копирования в SRAM. ", 0x00Вся операция длится 259 мкс.
Второй пример немного академичен. Угадайте, что ваша программа должен реагировать на событие с помощью 10 различных подпрограмм, которые неодинаковой длины: одни короткие, другие длинные. Это может быть случае, если пользователь нажимает одну из десяти клавиш. Теперь вы можете проверить было ли начальное событие нулем, единицей, двумя и т. д. и до девяти и вы можете вызвать десять различных подпрограмм.
Быстрее и элегантнее
- поместите эти десять адресов подпрограмм в таблицу,
- для вычисления адреса таблицы из заданного числа,
- для чтения записи таблицы с LPM и
- для вызова подпрограммы с помощью ICALL.
Это исходный код.
; Подготовьте метки сегментов данных .dseg sТекст: ; .cseg ; Точка Z для вспышки в памяти ldi ZH, высокий (2 * текст) ldi ZL, низкий (2 * текст) ldi XH, High (sText) LDI XL, Низкий (sText) Копировать текст: л/мин R16,Z+ ст Х+,R16 тст R16 брне CopyText ; Icall часть . equ выбрать = 0 LDI R16, Низкий (RAMEND) из SPL, R16 .ifdef SPH ldi R16, высокий (RAMEND) из SPH, R16 .endif ldi R16,выбрать ; Загрузить выбранный номер программы здесь лсл R16 ; Умножить на два ldi ZH, High (2 * JmpTable) ; Укажите Z на стол ldi ZL, Низкий (2*JmpTable) добавить ZL,R16 ; Добавьте удвоенный номер выбора лди R16,0 ; Добавить перенос, если есть прибавка ZH,R16 л/мин R16,Z+ ; Читать младший бит л/мин ZH,Z ; Читать старший бит мов ZL,R16 ; Скопировать LSB в ZL Я звоню ; Вызов подпрограммы в Z Петля: цикл rjmp ; ; Обычный 0 Обычный0: нет рет Обычный1: нет нет рет Рутина2: нет нет нет рет Подпрограмма3: нет нет нет нет рет Рутина4: нет нет нет нет нет рет Рутина5: нет нет нет нет нет нет рет ; ; Таблица прыжков JmpТаблица: .dw Подпрограмма0, Подпрограмма1, Подпрограмма2 .dw Подпрограмма3, Подпрограмма4, Подпрограмма5 ; Добавьте дополнительные процедуры здесьМоделирование было запущено с select=0, адрес таблицы этот выбор был рассчитан в Z путем добавления сдвинутого влево выберите начальный адрес таблицы. Адрес в Z указывает на младший бит первой записи таблицы.
0x0033 — первая запись.
Теперь адрес перехода считан из таблицы и подготовлен для ИКАЛ в З.
ICALL вызвала Routine0.
Со всеми возможными вариантами выбора выполняется переход к правильной процедуре.
Заключение: LPM и его более современные варианты предлагают широкий спектр возможностей. обрабатывать тексты и получать доступ к меньшим или большим таблицам в большой флэш-памяти. Память. Эффективное программирование очень часто предполагает такие нагрузки из программы вспышка.
В начало страницы
© 2021 г. http://avr-asm-tutorial.net
Программирование микроконтроллеров Arduino и AVR с использованием языка ассемблера — DumbleBots
В этом блоге я объясню, как начать программирование на языке ассемблера на чистом железе для микроконтроллеров AVR, а также приведу пример для ATmega328P. Мы увидим, как программа хранится и выполняется аппаратным обеспечением микроконтроллера; синтаксис языка ассемблера, а также как собрать и загрузить вашу программу, используя цепочку инструментов, предоставленную Atmel/Microchip. Мы соберем все это вместе с примером программы, которая мигает светодиодом.
Это длинный блог, потому что, в отличие от нескольких других руководств, которые охватывают тот или иной аспект (и делают это хорошо), в этом делается попытка провести вас через весь путь от самых основ языка ассемблера до написания рабочий пример, создайте его и посмотрите, как он работает на вашей установке. Блог был разделен на разделы, чтобы облегчить выборочное чтение.
Вы получите максимальную отдачу от этого блога, если знакомы с программированием микроконтроллеров C/C++ либо в рамках экосистемы Arduino (Arduino IDE), либо с помощью цепочки инструментов, предоставляемой Atmel/Microchip (Atmel Studio).
Начнем!
Хранение и выполнение программ в архитектуре AVR
Языки высокого уровня (такие как C/C++) предоставляют вам конструкции, которые ваш микроконтроллер изначально не понимает. Однако при написании ассемблера вы должны иметь дело с аппаратным обеспечением гораздо более прямым образом. По этой причине полезно знать об аппаратных компонентах внутри микроконтроллера AVR и о той роли, которую некоторые из них играют в хранении, выполнении и управлении вашей программой. Ниже показана блок-схема микроконтроллеров AVR.
Блок-схема микроконтроллеров AVRДля целей этого блога мы более подробно рассмотрим Flash и SRAM в отношении роли, которую они играют в выполнении вашей программы. Если вы хотите узнать больше об архитектуре AVR и ее аппаратных компонентах, нажмите здесь .
Флэш-память (хранение программ)
Флэш-память вашего микроконтроллера — это место, где хранится ваша программа. Он персистентный, т. е. его содержимое сохраняется даже при выключении питания микроконтроллера. Каждое место во флеше имеет адрес (обычно записывается в шестнадцатеричной системе счисления), который используется при чтении или записи во флэш-память.
Поскольку инструкции в архитектуре AVR закодированы либо в 2, либо в 4 байта, флэш-память «выгружается» в 2-байтовые страницы, когда к ней обращается любое внешнее оборудование или при выполнении операций перехода/ветвления. Это означает, что при загрузке программ в/чтении программы из флэш-памяти микроконтроллера наименьшая единица, к которой можно получить доступ, — это страница 9009.0 и отдельные байт не могут быть доступны таким образом. Это означает, что любые строковые литералы/массивы, хранящиеся во флэш-памяти, должны иметь четную длину (в байтах). Если они имеют нечетную длину, ассемблер добавляет в конец лишний байт (обычно 0/NULL).
Например, если мы хотим записать строку «Hello» во флэш-память, нам сначала нужно изменить строку, чтобы сделать ее длину четной, т. е. добавить дополнительный символ в конце. В большинстве случаев достаточно NULL («Hello» становится «Hello\x00»). Не путайте это с байтом NULL, добавляемым в конец строк C/C++. Затем мы получаем значения ASCII для каждого из символов: 0x48, 0x65, 0x6C, 0x6C, 0x6F и 0x00 соответственно. После этого каждая пара символов будет взята и записана в первое доступное место следующим образом.
Location | Low Byte | High Byte |
---|---|---|
0x00 | 0x48 (H) | 0x65 (E) |
0x01 | 0x6C (L) | 0x6C (L) |
0x02 | 0x6F (O) | 0x00 (NULL) |
Подобным образом инструкции, из которых состоит ваша программа, записываются во флэш-память в смежных адресах, начиная с соседних адресов. местоположение 0x00. Здесь ваш микроконтроллер начинает читать и выполнять инструкции, когда он включен.
В любой момент времени адрес выполняемой команды сохраняется в регистре счетчика программ (ПК). Регистр — это аппаратный блок, который хранит число фиксированной длины, пока на него подается питание. Счетчик программ в AVR в большинстве случаев имеет ширину 16 бит и 22 бита на некоторых микроконтроллерах с большими размерами флэш-памяти. Счетчик программ также называется указателем инструкций в некоторых других архитектурах, и оба они означают одно и то же. Обратите внимание, что счетчик программ также хранит адрес «страницы» вместо байта.
Обычно значение в регистре ПК увеличивается после выполнения инструкции, на которую оно в данный момент указывает, что обычно происходит один раз за каждый такт. Исключения составляют случаи, когда текущая инструкция имеет длину 4 байта (2 страницы) или выполняется более одного такта. В зависимости от случая, он либо увеличивается более одного раза, либо не увеличивается вообще для этого тактового цикла. Кроме того, если выполняется переход/ветвь, значение в регистре ПК соответственно обновляется. прыжок/ветвь возобновляет выполнение программы с указанного адреса/местоположения. Инструкция, которая выполняет переход/ветвь, также должна использовать адреса страниц, а не адреса байтов.
Однако работающая программа при попытке чтения/записи во флэш-память не использует адресацию страниц, а вместо этого использует байтовые адреса. Например, если программа, работающая на микроконтроллере, должна прочитать строку «Hello» (тот, который мы предварительно записали во флэш-память), она будет обращаться к отдельным байтам следующим образом.
Location | Value |
---|---|
0x00 | 0x48 (H) |
0x01 | 0x65 (E) |
0x02 | 0x6C (L) |
0x03 | 0x6c (L) |
0x04 | 0x6f (O) |
0x05 | 0x00 (NULL) |
. Поначалу две схемы адресации могут показаться запутанными, но подумайте, почему это было сделано. При подкачке флэш-памяти (для счетчика программ и любого внешнего оборудования, пытающегося получить к ней доступ) количество операций чтения/записи, которые необходимо выполнить на ней, сокращается вдвое, следовательно, скорость доступа увеличивается вдвое. Счетчик программ также может иметь доступ к удвоенному количеству мест без необходимости удваивать его размер. Однако программе при попытке чтения строковых литералов лучше работать с одним байтом за раз (из-за ограниченных ресурсов на маленьком чипе).
Как уже говорилось, флэш-память — это место, где хранится ваша программа и откуда осуществляется доступ к ней. Мы объясним, как программа попадает во флэш-память, позже, когда будем говорить об этапах сборки и наборе инструментов для сборки.
ОЗУ (память программ)
Переходя от флэш-памяти, у нас есть ОЗУ, где хранятся все ваши рабочие данные во время выполнения программы. Это не является постоянным, т. е. его содержимое стирается при отключении питания микроконтроллера. Он имеет отдельное от флэш-памяти адресное пространство и не выгружается, т. е. каждый байт в ОЗУ может быть отдельно прочитан и записан.
Обычно он делится на три секции: регистров общего назначения , регистров специальных функций и памяти общего назначения (SRAM) .
ОЗУ и регистры в AVRКаждый из этих разделов работает в одном и том же адресном пространстве и может быть доступен с использованием одних и тех же инструкций. Например, к регистру общего назначения можно получить доступ так же, как к любому другому месту в ОЗУ. Однако на практике это обычно не наблюдается, поскольку для каждого из этих разделов существуют оптимизированные инструкции. Давайте рассмотрим их поближе.
Регистры общего назначения
Первая часть ОЗУ — это регистры общего назначения, занимающие первые 32 адреса (от 0x0000 до 0x001F). Как указывалось ранее, регистры — это единицы хранения фиксированной длины, напрямую связанные с ЦП. Регистры общего назначения имеют ширину 8 бит. Для CPU типов данных и структур данных не существует. Все данные хранятся в ОЗУ в виде байтов, и для выполнения каких-либо операций с этими данными их необходимо скопировать (переместить) в регистр(ы), обработать, а затем переместить обратно.
В программах на ассемблере на эти регистры можно ссылаться по их мнемоникам от R0 до R31. Все 32 регистра общего назначения не могут выполнять все типы операций, т. е. определенные операции могут выполняться только с некоторыми конкретными регистрами.
Для тех, кто интересуется далее,
- Постоянные значения могут быть загружены/перемещены только в последние 16 регистров (от R16 до R31 включительно).
- Пары регистров R27:R26, R29:R28 и R31:R30 имеют зарезервированные имена (X, Y и Z), которые используются для хранения 16-битных адресов, указывающих на ОЗУ. Они также называются регистрами указателей и имеют специальные инструкции для работы с ними.
- Пара регистров Z также имеет специальные инструкции для увеличения/уменьшения ее после загрузки значения, на которое она указывает.
Для выполнения любой арифметической или логической операции над любым типом данных или для перемещения данных из одного места в ОЗУ в другое их необходимо сначала переместить в один или несколько из этих регистров. Только после этого данные можно обрабатывать и/или перемещать в другое место.
Доступ к этим регистрам и работа с ними очень быстрые, поэтому, если ваши данные могут полностью уместиться в регистрах, рекомендуется вообще не использовать оставшуюся оперативную память.
Регистры специальных функций
После регистров общего назначения регистры специальных функций занимают следующие 64 адреса (от 0x0020 до 0x005f). Регистры специальных функций также иногда упоминаются по их относительным адресам (от 0x0000 до 0x003F).
Как и регистры общего назначения, регистры специальных функций также имеют размер 8 бит, но вместо этого используются для управления/проверки состояния микроконтроллера и программы. Изменение значений в специальных регистрах каким-то образом повлияет на поведение оборудования/работающей программы, например, включение/отключение прерываний, включение/отключение таймеров, изменение режима ожидания, сброс сторожевого таймера и т. д. Значения некоторых специальных регистров также косвенно обновляются программой, например флаги отрицания и нуля, которые устанавливаются, когда результат арифметической операции был отрицательным или равным нулю соответственно. Значения в этих регистрах могут быть прочитаны программой, чтобы узнать состояние микроконтроллера.
Подмножеством регистров специальных функций являются регистры ввода-вывода . Регистры ввода-вывода также называются портами ввода-вывода , и оба они будут использоваться в этом блоге взаимозаменяемо. Изменение значения порта ввода-вывода вызывает физическое изменение состояния физических контактов микроконтроллера.
Каждому физическому контакту требуется 3 бита для полного управления его состоянием. Один бит определяет, является ли контакт входным или выходным, другой бит определяет, установлен ли контакт на высокий или низкий уровень, а последний бит требуется для хранения состояния контакта, когда он является входом. Таким образом, набор из 8 контактов требует 24 бита (или 3 байта) для управления. Поэтому порты ввода-вывода делятся на три типа в зависимости от их функции.
- Порты направления данных (помечены как DDRA, DDRB и т. д.)
- Порты цифрового вывода (помечены как PORTA, PORTB и т. д.)
- Порты цифрового ввода (помечены как PINA, PINB и т. д.)
Каждый бит каждого порта влияет на один контакт (некоторые биты некоторых портов могут не использоваться). Установка бита в порте направления данных переводит соответствующий вывод в режим вывода, а его очистка переводит вывод в режим ввода. Установка бита в порту цифрового вывода установит для соответствующего вывода высокое значение, а очистка бита установит для вывода низкое значение, если вывод находится в режиме вывода. Если контакт находится в режиме ввода, установка/сброс того же бита включает/отключает встроенный подтягивающий резистор на контакте. Когда контакт находится в режиме ввода, соответствующий бит цифрового входа может быть прочитан, чтобы получить состояние контакта.
Ниже показана таблица, в которой обобщается это поведение, т. е. состояние данного контакта и состояние соответствующих ему битов в портах направления данных и цифровых выходов.
Pin State | Corresponding DDR bit | Corresponding PORT bit |
---|---|---|
Floating Input | 0 (cleared) | 0 (cleared) |
Input Pullup | 0 (cleared) | 1 (комплект) |
Низкая выходная мощность | 1 (SET) | 0 (очищен) |
Высокая выходная мощность | 1 (SET) | 1 (SET) |
Эти регистрации не должны использоваться программой для придерживающихся программ для придерживающихся программ
. / работа со значениями.
Память общего назначения (SRAM)
После регистров общего назначения и специальных функций находится память общего назначения микроконтроллера AVR. Он используется программой для хранения своих переменных, массивов, объектов и т. д., как правило, в форме стек . Стек в реальном мире — это коллекция, в которую новые элементы добавляются, а старые удаляются только спереди. Стек программы аналогичен этому. Всякий раз, когда вызывается функция, она создает новый кадр стека, размер которого равен объединенному размеру всех его переменных и объектов. Если эта функция, в свою очередь, вызывает другую функцию, новая функция устанавливает свой собственный кадр стека поверх текущего, и это может повторяться до тех пор, пока имеется достаточно доступной памяти. Когда функция завершает выполнение, ее кадр стека освобождается, чтобы его могла использовать другая функция (обычно вызывающая).
Программный стекВ микроконтроллерах AVR стек начинается с RAMEND (самого старшего адреса) и растет в направлении младших адресов (к регистрам специальных функций).
Существуют два специальных регистра, которые отслеживают кадр стека текущей функции, а именно регистры «SPL» (нижний указатель стека) и «SPH» (высокий указатель стека). Все вместе они называются указателем стека и указывают на конец текущего фрейма стека. Необходимо использовать два регистра, поскольку адреса ОЗУ на микроконтроллерах AVR имеют длину 2 байта, а младший и старший байты необходимо хранить в отдельных регистрах. Например, на ATmega328P значение RAMEND равно 0x08FF (2303 в десятичном виде, что соответствует 2 Кбайтам SRAM, указанным в техническом описании). В этом случае начальное значение регистра SPL должно быть 0xFF, а значение регистра SPH должно быть 0x08.
Предохранители (биты конфигурации)
О предохранителях полезно знать (особенно при отладке), но они не обязательны для работы ваших программ, поэтому вы можете пока пропустить этот раздел и вернуться к нему позже.
Каждый микроконтроллер AVR включает так называемые фьюзы/фьюз-биты/конфигурационные биты. Это не те предохранители, к которым вы привыкли (которые используются для предотвращения протекания слишком большого тока через систему), а скорее их можно рассматривать как специальный набор регистров (даже более особенный, чем все другие регистры, о которых мы уже говорили). о). На них не может повлиять программа, и их можно изменить только с помощью внешнего программатора. Обратите внимание, что слово «программист», используемое здесь, относится не к человеку, который пишет программу, а скорее к устройству, которое передает программу с вашего ПК на флэш-память микроконтроллера . Мы поговорим об этом более подробно в следующих разделах.
Фьюз-биты хранят информацию о микроконтроллере, такую как его тактовая частота, предварительный делитель тактовой частоты, отладка и т. д. Обычно фьюз-биты не нужно изменять для правильной работы, но иногда они могут вызывать очень надоедливые ошибки, которые трудно отладить , Например, ваши подпрограммы задержки могут быть написаны, предполагая, что тактовая частота составляет 16 МГц (что является значением по умолчанию для Arduino UNO), но если в фьюз-битах установлен бит «CKDIV8», то тактовая частота делится на 8 и все ваши подпрограммы задержки будут производить задержку в 8 раз больше ожидаемой. Если ваша программа, казалось бы, не имеет ошибок, но все же ведет себя не так, как ожидалось, может быть полезно прочитать и проверить значения в фьюз-битах микроконтроллера.
Чтение и декодирование информации в фьюз-битах не так просто. Вот калькулятор фьюз-битов для микроконтроллеров AVR. Вы можете ввести текущую конфигурацию предохранителей вашего микроконтроллера (полученную с помощью такого инструмента, как Avrdude) в калькулятор, чтобы получить их значение.
Теперь, когда мы рассмотрели некоторые важные аппаратные компоненты микроконтроллера AVR, давайте начнем с написания программы на ассемблере, а затем перейдем к ее сборке и прошивке.
Начало работы с языком ассемблера
В этом разделе мы сначала увидим небольшой учебник/обзор языка ассемблера и постепенно углубимся в него. Затем мы напишем популярную программу-пример мерцания для ATmega328P. Вы также можете использовать любой другой микроконтроллер AVR, если вы используете правильные контакты и порты.
Введение в сборку и инструкции
Начнем с рассмотрения процессора внутри вашего микроконтроллера. Это выполняет код, который вы пишете на любом языке высокого уровня. Микроконтроллер всегда имеет фиксированный набор инструкций, для которых он предназначен. Следовательно, весь код должен быть каким-то образом переведен в эти инструкции.
Вообще говоря, программа представляет собой последовательность этих инструкций, которые выполняются при запуске (обычно по одной). Каждая из этих инструкций является элементарной по своей природе и выполняет очень специфическую задачу, такую как перемещение байта из одного места в памяти в другое или добавление двух байтов и сохранение результата. Каждая инструкция имеет свой собственный код операции , число фиксированной длины (обычно записывается в двоичном или шестнадцатеричном формате), которое представляет/кодирует инструкцию вместе с любыми операндами, которые она может принять.
Хотя теоретически можно использовать только эти инструкции (их коды операций) для создания программы, в реальной жизни это отнимает много времени и чревато ошибками, не говоря уже о кропотливой работе по запоминанию кодов операций каждого варианта каждой инструкции!
Язык ассемблера — это мнемоника или набор символов, которые используются для представления этих инструкций на понятном человеку языке вместе с директивами для самого процесса ассемблера (подробнее об этом в следующем разделе). Поскольку инструкции на языке ассемблера имеют соответствие 1-1 с инструкциями вашего процессора (есть очень мало исключений, но они не будут рассматриваться в этом блоге), любая программа, составленная на нем, зависит от микроконтроллера. Это означает, что программа, написанная для ATmega328P, не будет нормально работать на другом микроконтроллере, таком как ATtiny85.
В языке ассемблера также отсутствуют программные конструкции, к которым вы, вероятно, привыкли, такие как типы данных, переменные, функции, классы и управляющие структуры (такие как циклы, if-else и switch-case и многие другие), потому что ваш процессор тоже не понимает их по существу. Вместо этого вы должны взаимодействовать с вашей памятью и оборудованием более прямым образом и добиваться управления потоком программы, используя логические сравнения, метки и переходы (объяснено в следующем разделе). Давайте посмотрим, что это такое, а также подробный синтаксис языка ассемблера.
Синтаксис ассемблера и составные части
Программа ассемблера записывается как последовательность инструкций в отдельных строках, как показано ниже.
Этот файл содержит двунаправленный текст Unicode, который может быть интерпретирован или скомпилирован не так, как показано ниже. Для просмотра откройте файл в редакторе, который показывает скрытые символы Unicode. Узнайте больше о двунаправленных символах Unicode
Показать скрытые символы
инструкция операнд1, операнд2… ; замечания |
просмотреть необработанный .txt размещено с помощью ❤ на GitHub
Каждая строка содержит одну инструкцию, за которой следуют ее операнды, разделенные запятыми (если есть), за которыми следует необязательное примечание/комментарий. Перед подробным описанием инструкций полезно взглянуть на то, что позволяет делать любой язык программирования . Вообще говоря, любой полный по Тьюрингу язык программирования должен предоставлять вам конструкции для выполнения следующих действий.
- Выполнение арифметических (+, -, *, /, MOD и т. д.) и логических операций (сравнений) над данными. ( Тип I )
- Переход и переход к различным частям программы (будь то условный или безусловный). ( Тип II )
- Перемещение данных в памяти. ( Тип III )
- Управление другими периферийными устройствами (например, портами, таймерами и т. д.) ( Тип IV )
В качестве примера рассмотрим программу, которая должна складывать числа 2 и 3 и выводить результат нечетный или четный, на консоль. Примерный алгоритм, описывающий эту программу (вместе с типом каждого шага), показан ниже.
- Пусть A = 2 ( Тип III )
- Пусть B = 3 ( Тип III )
- Пусть C = A + B ( Типы I и III )
- Если C нечетно шаг 5, иначе перейдите к шагу 6 ( Типы I и II )
- Выведите «нечетное» в консоль, затем Конец ( Тип IV )
- Выведите «четное» в консоль, затем Конец ( Тип IV )
Поскольку все языки высокого уровня позволят вам реализовать описанный выше алгоритм, и все они в конечном итоге будут переведены в инструкции машинного языка, язык ассемблера также предоставляет вам инструкции для выполнения вышеуказанных операций.
Ниже приведена реализация приведенного выше фрагмента алгоритма на языке ассемблера. Добавляются числа 2 и 3, а затем устанавливается пин 1 на порте B, если результат нечетный. Обратите внимание, что приведенный ниже код является лишь фрагментом, и для полной программы сборки требуется больше, чем просто инструкции ЦП. Возможно, вы пока сможете понять фрагмент только частично (посмотрев на примечания и названия инструкций).
Этот файл содержит двунаправленный текст Unicode, который может быть интерпретирован или скомпилирован не так, как показано ниже. Для просмотра откройте файл в редакторе, который показывает скрытые символы Unicode. Узнайте больше о двунаправленных символах Unicode
Показать скрытые символы
ЛДИ R16, 2 ; загрузить константу 2 в регистр 16 | |
ЛДИ R17, 3 ; загрузить константу 3 в регистр 17 | |
ДОБАВИТЬ R16, R17 ; сложите значения и сохраните сумму в регистре 16 | |
АНДИ R16, 1 ; выполнить логическое и с константой 1 (сохраняется только бит 0) | |
ДОБАВИТЬ R16, R16 ; сдвиг значения влево один раз (бит 0 перемещается в бит 1) | |
SBI _SFR_IO_ADDR (DDRB), 1 ; перевести контакт 1 порта B в режим вывода | |
OUT_SFR_IO_ADDR (PORTB), R16 ; записать значение R16 в порт B |
просмотреть необработанный b. txt размещено с ❤ на GitHub
После инструкций программы сборки содержат меток , которые представляют собой определяемые пользователем символы, за которыми следует двоеточие (:). Они чувствительны к регистру. Метки используются для обозначения адреса строки, которой они предшествуют. Их можно использовать для определения длины конкретной последовательности инструкций/байтов (принимая разницу между двумя метками/адресами) или для перехода к разным частям кода. Ниже показан пример фрагмента цикла, который выполняется 5 раз и реализуется с помощью меток.
Этот файл содержит двунаправленный текст Unicode, который может быть интерпретирован или скомпилирован не так, как показано ниже. Для просмотра откройте файл в редакторе, который показывает скрытые символы Unicode. Узнайте больше о двунаправленных символах Unicode
Показать скрытые символы
просмотреть необработанный c. txt размещено с помощью ❤ от GitHub
Обратите внимание, что подчеркивание перед именами меток ставится просто как соглашение, чтобы указать, что они не являются подпрограммами, а являются обычными метками. Кроме того, метка _loopend
используется только для обозначения конца цикла и не используется программой. Приведенный выше код можно было бы также написать следующим образом.
Этот файл содержит двунаправленный текст Unicode, который может быть интерпретирован или скомпилирован не так, как показано ниже. Для просмотра откройте файл в редакторе, который показывает скрытые символы Unicode. Узнайте больше о двунаправленных символах Unicode
Показать скрытые символы
; какой-то код перед циклом | |
ЛДИ R16, 5 ; загрузить константу 5 в регистр 16 | |
_loopstart: ; какой-то код внутри цикла | |
ДЕКАБРЬ R16 ; уменьшить значение в регистре 16 | |
BRNE _loopstart ; перейти к _loopstart, если предыдущий результат не был 0 | |
_loopend: | |
; какой-то код после цикла |
просмотреть необработанный д. текст размещено с помощью ❤ от GitHub
Хотя два предыдущих фрагмента абсолютно одинаковы, второй отформатирован по-другому для удобства чтения с метками в своем собственном столбце. В случае нескольких файлов метку можно сделать видимой извне, написав .global <имя-метки>
. Ниже приведен тот же фрагмент с метками _loopstart
и _loopend
, объявленными глобальными.
Этот файл содержит двунаправленный текст Unicode, который может быть интерпретирован или скомпилирован не так, как показано ниже. Для просмотра откройте файл в редакторе, который показывает скрытые символы Unicode. Узнайте больше о двунаправленных символах Unicode
Показать скрытые символы
.глобальный _loopstart | |
. global _loopend | |
; какой-то код перед циклом | |
ЛДИ R16, 5 ; загрузить константу 5 в регистр 16 | |
_loopstart: ; какой-то код внутри цикла | |
ДЕКАБРЬ R16 ; уменьшить значение в регистре 16 | |
BRNE _loopstart ; перейти к _loopstart, если предыдущий результат не был 0 | |
_loopend: | |
; какой-то код после цикла |
просмотреть необработанный e. txt размещено с помощью ❤ by GitHub
Помимо машинных инструкций, программы на ассемблере также могут содержать псевдоинструкции. Это не настоящие инструкции ЦП, а только указания ассемблеру в процессе сборки. Они также известны как Директивы ассемблера . Директива .global
является одной из таких директив ассемблера (которую мы уже использовали).
Ниже показан еще один пример использования меток и директив ассемблера, который помещает строку «Hello World» во флэш-память и сохраняет ее длину в символической константе. Каждая пара символов размещается постранично. Поскольку длина строки нечетная, в конце добавляется дополнительный байт NULL (0).
Этот файл содержит двунаправленный текст Unicode, который может быть интерпретирован или скомпилирован не так, как показано ниже. Для просмотра откройте файл в редакторе, который показывает скрытые символы Unicode. Узнайте больше о двунаправленных символах Unicode
Показать скрытые символы
просмотреть необработанный f.txt размещено с помощью ❤ на GitHub
В приведенном выше фрагменте .ASCII
не является реальной инструкцией ЦП, а вместо этого является директивой ассемблера, которая сообщает ассемблеру поместить указанную строку ASCII в это место. Любые инструкции, которые следуют за ней или предшествуют ей, сохраняются, а 12-байтовая (11 байт округляется) длинная строка сохраняется между ними. Чтобы обратиться к строке, метка 9Можно использовать 0332 MSG .
Длина строки также вычисляется и хранится в символической константе MSGLEN
. Обратите внимание, что в отличие от MSG
, MSGLEN
не является меткой. Отныне везде, где в программе появляется символ MSGLEN
, Ассемблер будет выполнять слепую замену значением 12. Выражение (MSGEND - MSG)
используется для вычисления длины строки между двумя метками.
Наконец, все программы сборки делятся на разделов (также называемых сегментами ). Раздел — это перемещаемая единица кода. Это означает, что ассемблер решает, где будет размещаться каждый раздел в ОЗУ. Все программы должны содержать три основных раздела: .text
, .bss
и .data
. Ниже показана завершенная программа для добавления двух чисел и включения контакта 1 порта B, если результат нечетный.
Этот файл содержит двунаправленный текст Unicode, который может быть интерпретирован или скомпилирован не так, как показано ниже. Для просмотра откройте файл в редакторе, который показывает скрытые символы Unicode. Узнайте больше о двунаправленных символах Unicode
Показать скрытые символы
просмотреть необработанный g. txt размещено на ❤ на GitHub
Раздел .text
содержит исполняемую программу. Раздел .bss
содержит все неинициализированные глобальные переменные/массивы и статические переменные. Секция .data
содержит все константы и инициализированные переменные. Ваши программы также могут содержать разделы .bootloader
и .noinit
, а также любое количество разделов, определяемых приложением, обсуждение которых выходит за рамки этого блога.
Также обратите внимание, что разные ассемблеры могут давать этим разделам разные имена (наряду с немного отличающимся синтаксисом и именами директив ассемблера). Для этого блога мы будем использовать avr-as, и пока вам не нужно беспокоиться о разных ассемблерах.
Подводя итог, ассемблерная программа содержит –
Инструкции | Отдельные операции, напрямую связанные с ЦП для выполнения арифметических, логических операций, переходов и т. д. программа для управления потоком, расчета длины и т. д. |
Директивы ассемблера | Директивы для указания ассемблеру процесса сборки, например, сделать символ/метку глобальным. |
Константы | Буквенные значения, встроенные в программу |
Символические константы | Однократное вычисление выражения и замена его значения на соответствующий символ везде в программе программы, которую можно переместить внутрь флеша (содержит все вышеперечисленное). |
В этом разделе мы увидим руководство по написанию популярного примера мигания для ATmega328P, где мигает светодиод, подключенный к микроконтроллеру. На платах Arduino, использующих ATmega328P (например, UNO), встроенный светодиод управляется контактом 13. Обратите внимание, что соответствующий физический контакт микроконтроллера — контакт 19..
Вы можете использовать любой текстовый редактор для написания программы, и для этого не требуется IDE (например, Atmel Studio или Visual Studio). Вы можете назвать файл main.S
. Если вы предпочитаете любое другое имя, обязательно замените его во всех командах сборки. Однако расширение .S
должно сохраняться с учетом регистра.
Сначала мы включаем заголовочный файл avr/io.h , который содержит макросы препроцессора и псевдонимы для всех выводов, портов, специальных регистров и т. д. Без включения этого файла нам пришлось бы помнить точные адреса всех вышеперечисленные аппаратные блоки. Мы можем использовать в программе директивы препроцессора C/C++ (такие как #include, #define и т. д.). После включения файла вы можете ввести шаблон, чтобы определить три основных раздела. Ваш код должен выглядеть следующим образом.
Этот файл содержит двунаправленный текст Unicode, который может быть интерпретирован или скомпилирован не так, как показано ниже. Для просмотра откройте файл в редакторе, который показывает скрытые символы Unicode. Узнайте больше о двунаправленных символах Unicode
Показать скрытые символы
#include | |
.секция .данные | |
.секция .bss | |
.раздел .текст | |
.org 0x00 |
просмотреть необработанный h.txt размещено на ❤ на GitHub
The . org Директива
сообщает ассемблеру, с какого адреса начинать размещение инструкций.
Установка режима контакта
Теперь мы можем установить физический контакт 19 микроконтроллера в качестве выхода. Напомним, что это контакт 5 на порту B, и мы должны установить пятый бит в регистре DDRB. Есть несколько способов добиться этого. Один из способов — загрузить битовую маску 0b00100000
в регистр общего назначения, а затем переместить ее в регистр DDRB. Введите следующий код после директивы .org
.
Этот файл содержит двунаправленный текст Unicode, который может быть интерпретирован или скомпилирован не так, как показано ниже. Для просмотра откройте файл в редакторе, который показывает скрытые символы Unicode. Узнайте больше о двунаправленных символах Unicode
Показать скрытые символы
ЛДИ Р16, (1<<ПБ5) | |
ЛДИ Р17, (1<<ПБ5) | |
ВЫХОД _SFR_IO_ADDR (DDRB), R16 |
просмотреть необработанный l. txt размещено с ❤ на GitHub
Инструкция LDI (LoaD Immediate) загружает постоянное/немедленное значение в регистр. Работает только для регистров с 16 по 31 . PB5 — это макрос, который оценивается как 5. Выражение (1<
0b00100000
(или 1<<5), что дало бы точно такой же машинный код. Однако использование первого подхода более четко отображает назначение программы. Причина двойной загрузки в отдельные регистры станет ясна чуть позже.
Команда OUT копирует значение из регистра общего назначения в порт ввода-вывода или SFR. DDRB — это макрос, который вычисляет абсолютный адрес регистра DDRB (в зависимости от того, какой микроконтроллер вы используете). макрос функции _SFR_IO_ADDR
обернут вокруг него, чтобы преобразовать абсолютный адрес DDRB в его относительный адрес среди SFR. Это сделано потому, что инструкция OUT оптимизирована для доступа к SFR и принимает только относительные адреса. Вместо этого мы могли бы написать приведенный ниже код, и он был бы оценен как тот же машинный код, но, как упоминалось ранее, цель программы более ясна в предыдущем фрагменте.
Этот файл содержит двунаправленный текст Unicode, который может быть интерпретирован или скомпилирован не так, как показано ниже. Для просмотра откройте файл в редакторе, который показывает скрытые символы Unicode. Узнайте больше о двунаправленных символах Unicode
Показать скрытые символы
ЛДИ Р16, 0b00100000 | |
ЛДИ Р17, 0b00100000 | |
ВЫХОД 0x04, R16 |
просмотреть необработанный k. txt размещено с ❤ на GitHub
Если бы мы не использовали макрос _SFR_IO_ADDR, то он был бы эквивалентен приведенному ниже фрагменту.
Этот файл содержит двунаправленный текст Unicode, который может быть интерпретирован или скомпилирован не так, как показано ниже. Для просмотра откройте файл в редакторе, который показывает скрытые символы Unicode. Узнайте больше о двунаправленных символах Unicode
Показать скрытые символы
ЛДИ Р16, 0b00100000 | |
ЛДИ Р17, 0b00100000 | |
ВЫХОД 0x24, R16 |
просмотреть необработанный j.txt размещено с ❤ на GitHub
Создание цикла, который обновляет состояние светодиода
Далее нам нужно создать цикл, в котором состояние светодиода переключается на каждой итерации. Цикл может быть достигнут путем создания метки и возврата к ней. Вот где дополнительная ценность в R17 пригодится. В начале каждой итерации значение R16 копируется в порт. Затем мы выполняем операцию XOR для регистров 16 и 17, которая переключает пятый бит, оставляя остальные как есть. Результат в R16. Это используется в следующей итерации, при этом цикл повторяется вечно.
Этот файл содержит двунаправленный текст Unicode, который может быть интерпретирован или скомпилирован не так, как показано ниже. Для просмотра откройте файл в редакторе, который показывает скрытые символы Unicode. Узнайте больше о двунаправленных символах Unicode
Показать скрытые символы
КОНТУР: ВЫХОД _SFR_IO_ADDR (PORTB), R16 | |
МУН R16, R17 | |
КОНТУР РДЖМП |
просмотреть необработанный m. txt размещено с ❤ на GitHub
Инструкция EOR выполняет операцию исключающего ИЛИ для двух предоставленных регистров и сохраняет результат в первом. Инструкция RJMP выполняет относительный переход, т. е. берет смещение пункта назначения от текущего адреса, а не абсолютный адрес пункта назначения. При написании программы мы можем просто использовать метку назначения, поскольку ассемблер автоматически заменяет ее на разницу. Мы могли бы также использовать Инструкция JMP , которая принимает абсолютные адреса, но она в два раза медленнее, занимает вдвое больше места и требуется только тогда, когда смещение перехода больше 2К.
Этого кода уже должно быть достаточно, чтобы светодиод мигал бесконечно, но это будет слишком быстро, чтобы можно было наблюдать невооруженным глазом. Поэтому нам нужно добавлять задержку в конце каждой итерации. Поскольку не существует инструкции (на момент написания этого блога) для создания задержек, мы напишем для этого собственную подпрограмму.
Написание подпрограммы задержки
Подпрограмма на ассемблере похожа на функцию в языках более высокого уровня. Это последовательность инструкций, которые выполняются вместе. Подпрограмма начинается с метки, идентифицирующей ее, и заканчивается инструкцией RET . Он вызывается с помощью инструкции CALL , которая принимает его метку/адрес. Инструкция CALL выполняет особый тип перехода, при котором текущая позиция программы помещается в стек перед переходом. Инструкция RET отменяет это, т. е. извлекает ячейку из стека и возвращается к ней.
Вот как будет выглядеть шаблон подпрограммы.
Этот файл содержит двунаправленный текст Unicode, который может быть интерпретирован или скомпилирован не так, как показано ниже. Для просмотра откройте файл в редакторе, который показывает скрытые символы Unicode. Узнайте больше о двунаправленных символах Unicode
Показать скрытые символы
просмотреть необработанный n.txt hosted with ❤ by GitHub
Что касается создания самой задержки, то есть несколько способов сделать это. Одним из простых способов является вращение ЦП, т. е. выполнение пустого цикла в течение фиксированного числа итераций. Цикл может сам по себе не содержать никакого полезного кода, но все равно требуется время для увеличения/уменьшения/изменения переменной цикла и проверки условия цикла. Мы можем использовать это вместе с NOP (No OPeration) инструкция, которая занимает один цикл, ничего не делая. Например, рассмотрим следующий фрагмент кода, реализующий базовый цикл обратного отсчета от 255 до 0 с использованием регистра R20.
Этот файл содержит двунаправленный текст Unicode, который может быть интерпретирован или скомпилирован не так, как показано ниже. Для просмотра откройте файл в редакторе, который показывает скрытые символы Unicode. Узнайте больше о двунаправленных символах Unicode
Показать скрытые символы
ЛДИ R20, 255 ; 1 цикл (ИГНОРИРУЕТСЯ) | |
ЦИКЛ: ДЕК R20 ; 1 цикл * 255 = 255 циклов | |
НЕТ ; 1 цикл * 255 = 255 циклов | |
ПЕТЛЯ BRNE ; 2 цикла * 255 = 510 циклов | |
; -1 цикл на последней итерации (ИГНОРИРУЕТСЯ) |
просмотреть необработанный о. txt размещено с ❤ на GitHub
Сначала значение 255 загружается в регистр R20. В начале каждой итерации мы используем инструкцию NOP, за которой следует инструкция DEC , которая уменьшает значение в R20. Наконец, инструкция BRNE (BRanch Not Equal) выполняет возврат к началу цикла, если результат уменьшения не равен нулю.
Каждая инструкция занимает один такт ЦП, за исключением инструкции BRNE, выполнение которой занимает 2 такта. Один цикл, потребляемый инструкцией LDI, первоначально игнорируется. На последней итерации цикла инструкция BRNE занимает всего 1 такт процессора (переход не выполняется), который также игнорируется.
Общее количество использованных циклов равно 1020. Поскольку частота часов составляет 16 МГц, каждый цикл занимает 1/16 000 000 секунд или 62,5 наносекунды. Следовательно, 1020 циклов потребляют в общей сложности 1020*62,5=63750 наносекунд или 63,75 микросекунд. Это все еще слишком быстро, чтобы быть общенаблюдаемым.
Один из способов увеличить продолжительность задержки — просто выполнить больше итераций цикла. Однако это невозможно, так как наибольшее значение, которое мы можем хранить в регистре, равно 255, которое мы уже использовали. Другой способ сделать это — увеличить время, затрачиваемое на каждую итерацию, путем добавления дополнительных инструкций NOP. Это также неосуществимо, поскольку задержка всего в 1 секунду (1000 миллисекунд) требует более 62 500 инструкций NOP на итерацию, что, скорее всего, не уместится во флэш-памяти.
Мы можем обойти эту проблему, используя вложенных циклов . Ниже показан пример использования трех уровней вложенности для создания задержки в 1 секунду на тактовой частоте 16 МГц.
Этот файл содержит двунаправленный текст Unicode, который может быть интерпретирован или скомпилирован не так, как показано ниже. Для просмотра откройте файл в редакторе, который показывает скрытые символы Unicode. Узнайте больше о двунаправленных символах Unicode
Показать скрытые символы
ЗАДЕРЖКА_1С: | |
ЛДИ R20, 64 ; 1 цикл * 1 = 1 цикл (ИГНОРИРУЕТСЯ) | |
ЗАДЕРЖКА1: LDI R21, 250 ; 1 цикл * 64 = 64 цикла | |
ЗАДЕРЖКА2: LDI R22, 250 ; 1 цикл * 16 000 = 16 000 циклов | |
ЗАДЕРЖКА3: ДЕК R22 ; 1 цикл * 4e6 = 4e6 циклов | |
НЕТ ; 1 цикл * 4e6 = 4e6 циклов | |
ЗАДЕРЖКА БРНЕ3 ; 2 цикла * 4e6 = 8e6 циклов | |
; -1 цикл * 16 000 = -16 000 циклов | |
ДЕК r21 ; 1 цикл * 16 000 = 16 000 циклов | |
ЗАДЕРЖКА БРНЕ2 ; 2 цикла * 16 000 = 32 000 циклов | |
; -1 цикл * 64 = -64 цикла | |
ДЕК р20 ; 1 цикл * 64 = 64 цикла | |
ЗАДЕРЖКА БРНЕ1 ; 2 цикла * 64 = 128 циклов | |
; -1 цикл * 64 = -64 цикла | |
РЕТ |
просмотреть необработанный p. txt размещено с ❤ на GitHub
Внутренний цикл (DELAY3) занимает 4 цикла на итерацию (за исключением последней итерации, когда он занимает только 3 цикла). Следующий внешний цикл (DELAY2) повторяет это 250 раз и также использует дополнительные 3 цикла. Самый внешний цикл (DELAY1) повторяется еще 250 раз (всего 16 000 раз!), и еще раз потребляет дополнительные 3 цикла. В результате задержка составляет 1 секунду.
Приведенная выше подпрограмма вместе с инструкцией RET занимает примерно 4 миллисекунды дополнительно. В зависимости от цели это может быть в допустимом диапазоне. На самом деле почти невозможно получить точную задержку, используя этот подход, так как вы почти всегда будете отставать на несколько циклов. Для более точной синхронизации можно использовать таймеры и прерывания . Вы можете прочитать о них здесь. (ХОРОШО ССЫЛКА НА ВЕБ-АРХИВ).
Теперь мы можем вызвать нашу процедуру DELAY_1S следующим образом.
Этот файл содержит двунаправленный текст Unicode, который может быть интерпретирован или скомпилирован не так, как показано ниже. Для просмотра откройте файл в редакторе, который показывает скрытые символы Unicode. Узнайте больше о двунаправленных символах Unicode
Показать скрытые символы
КОНТУР: ВЫХОД _SFR_IO_ADDR (PORTB), R16 | |
МУН R16, R17 | |
ЗАДЕРЖКА ВЫЗОВА_1С | |
КОНТУР РДЖМП |
просмотреть необработанный q.txt размещено с помощью ❤ by GitHub
Инструкция RCALL относится к инструкции CALL, как инструкция RJMP к инструкции JMP, т. е. принимает смещение подпрограммы от текущего местоположения в виде абсолютного адреса. Опять же, нам не нужно указывать смещение вручную, так как Ассемблер делает это автоматически.
Завершенная программа Blink
Теперь завершенная программа должна выглядеть так (без комментариев).
Этот файл содержит двунаправленный текст Unicode, который может быть интерпретирован или скомпилирован не так, как показано ниже. Для просмотра откройте файл в редакторе, который показывает скрытые символы Unicode. Узнайте больше о двунаправленных символах Unicode
Показать скрытые символы
#include | |
.секция .данные | |
.секция .bss | |
. раздел .текст | |
.org 0x00 | |
ЛДИ Р16, (1<<ПБ5) | |
ЛДИ Р17, (1<<ПБ5) | |
ВЫХОД _SFR_IO_ADDR (DDRB), R16 | |
КОНТУР: ВЫХОД _SFR_IO_ADDR (PORTB), R16 | |
ЗАДЕРЖКА ВЫЗОВА_1С | |
МУОР R16, R17 | |
КОНТУР РДЖМП | |
ЗАДЕРЖКА_1С: | |
ЛДИ Р20, 64 | |
ЗАДЕРЖКА1: LDI R21, 250 | |
ЗАДЕРЖКА2: LDI R22, 250 | |
ЗАДЕРЖКА3: ДЕК Р22 | |
НОП | |
БРНЕ ЗАДЕРЖКА3 | |
декабрь r21 | |
БРНЕ ЗАДЕРЖКА2 | |
ДЕК Р20 | |
ЗАДЕРЖКА БРНЕ1 | |
РЕТ |
просмотреть необработанный r. txt размещено на ❤ на GitHub
Что интересно в этой программе, так это то, что после сборки она занимает всего 36 байт!
Мы проверим это в следующих разделах, где будем собирать и запускать программу.
Сборка и прошивка программы
В этом разделе мы расскажем, как создаются программы на ассемблере и прошивают их в микроконтроллер, а также о шагах и инструментах, задействованных в этом процессе. Мы также настроим цепочку инструментов, предоставленную Atmel/Microchip, и посмотрим, как ее использовать шаг за шагом.
Процесс сборки для языка ассемблера
Ниже представлена диаграмма, иллюстрирующая процесс сборки файлов C/C++ и ассемблера на микроконтроллерах AVR. Их обычно показывают вместе, потому что у них много общих шагов и инструментов, следовательно, это помогает лучше понять их.
Процесс сборки для C/C++ и программ на ассемблереНиже приведены этапы сборки программ на ассемблере.
- Исходный файл сборки берется и проходит через Препроцессор , который оценивает все макросы и удаляет комментарии в стиле C (начинающиеся с //).
- Предварительно обработанный файл сборки берется и передается через Ассемблер в Сборка . На этом шаге создается файл object/elf . Объектный файл содержит код (т. е. коды операций для целевой аппаратной архитектуры) и данные (т. е. константы, строки и т. д.) вместе с некоторыми метаданными.
- Объектный/эльф-файл (или несколько объектных файлов) и любые библиотеки берутся и связываются вместе компоновщиком. На этом шаге создается один объектный файл (или полная программа) со всеми разрешенными ссылками и правильной точкой входа.
- Этот объектный файл берется и преобразуется в шестнадцатеричный файл диспетчером объектных файлов. Hex-файл предназначен для точного отражения данных, которые будут загружены во флэш-память. Хотя это наша программа и, следовательно, двоичные коды операций, формат шестнадцатеричного файла — ASCII. Другими словами, двоичное содержимое представлено в шестнадцатеричном формате ASCII.
Для этого блога мы будем использовать avr-gcc , ответвление коллекции компиляторов GNU для компиляции для архитектуры AVR. Помимо компиляторов C и C++, включены следующие инструменты.
- Ассемблер: AVR-AS
- Linker: AVR-LD
- Раздел и программные размеры: AVR-Size
- Управление объектом Файлы: AVR-OB-SIZE
- .
Чтобы узнать больше о проекте GNU и коллекции компиляторов, нажмите здесь или чтобы узнать больше о самом процессе компиляции, нажмите здесь.
Процесс флэш-памяти для языка ассемблера
Ниже представлена диаграмма, иллюстрирующая процесс загрузки программ во флэш-память микроконтроллера AVR.
Процесс прошивки для AVRПрограмма будет записана во флеш микроконтроллера с помощью инструмента под названием Avrdud e. Вместе с Avrdude нам также потребуется либо внешний программатор, либо загрузчик. Как упоминалось ранее, программист здесь относится не к человеку, пишущему код, а к внешнему устройству, которое записывает программу во флэш-память микроконтроллера. Мы поговорим об этом подробнее в следующих разделах.
Настройка цепочки инструментов AVR
Windows — avr-gcc
Сначала мы настроим avr-gcc. Если вы работаете в Windows, перейдите на официальный веб-сайт Microchip, где доступен набор инструментов для 8-битных устройств AVR. Прокрутите до раздела
Downloads
и щелкните ссылку рядом с AVR 8-BIT Toolchain (Windows) , чтобы начать загрузку. На момент написания этого блога последней версией была 3.7.0.Извлеките загруженный zip-файл в любое удобное место и перейдите в каталог
bin
внутри, чтобы увидеть все исполняемые инструменты командной строки. Эти инструменты могут быть вызваны только из этого каталога, если только 9Каталог 0332 bin добавляется в системную переменную пути.Вы можете проверить свою установку, выполнив следующую команду, которая распечатает информацию о версии компилятора.
Этот файл содержит двунаправленный текст Unicode, который может быть интерпретирован или скомпилирован не так, как показано ниже. Для просмотра откройте файл в редакторе, который показывает скрытые символы Unicode. Узнайте больше о двунаправленных символах Unicode
Показать скрытые символы
avr-gcc — версия просмотреть необработанный avr_gcc_version.sh размещено с помощью ❤ by GitHub
Информация о версии avr-gccWindows — avrdude
Теперь мы настроим Avrdude. В Windows перейдите на страницу
релизов
Avrdude. Прокрутите вниз до последней версии Avrdude для mingw32 и нажмите на нее, чтобы начать загрузку. На момент написания этого блога последняя версия — 6.4.Создайте каталог с именем
avrdude-mingw32
в любом удобном месте. Перейдите к загруженному zip-файлу и извлеките его содержимое в этот каталог. Он должен иметь исполняемый файлavrdude.exe
вместе с некоторыми файлами конфигурации (.conf). Еще раз, чтобы иметь возможность вызывать это из-за пределов этого каталога, его нужно добавить в системную переменную пути.Установку можно протестировать, выполнив следующую команду, которая распечатает инструкции по использованию Avrdude.
просмотреть необработанный avrdude_info.sh размещено с ❤ на GitHub
Инструкции по использованию для avrdudeLinux (Ubuntu) — avr-gcc
Сначала мы настроим avr-gcc. В Linux вы можете просто использовать предпочитаемый менеджер пакетов, чтобы установить цепочку инструментов и автоматически добавить ее в путь. Например, вы можете использовать диспетчер пакетов
apt
в Ubuntu, как показано ниже.Этот файл содержит двунаправленный текст Unicode, который может быть интерпретирован или скомпилирован не так, как показано ниже. Для просмотра откройте файл в редакторе, который показывает скрытые символы Unicode. Узнайте больше о двунаправленных символах Unicode
Показать скрытые символы
apt-get установить gcc-avr просмотреть необработанный avr_gcc_install.sh размещено с помощью ❤ от GitHub
Точное имя пакета может отличаться на разных платформах. Обязательно дайте ему разрешение на установку всех зависимостей. Вы можете проверить свою установку, выполнив следующую команду, которая распечатает информацию о версии компилятора.
Этот файл содержит двунаправленный текст Unicode, который может быть интерпретирован или скомпилирован не так, как показано ниже. Для просмотра откройте файл в редакторе, который показывает скрытые символы Unicode. Узнайте больше о двунаправленных символах Unicode
Показать скрытые символы
avr-gcc — версия просмотреть необработанный avr_gcc_version.sh размещено на ❤ на GitHub
Информация о версии avr-gccLinux (Ubuntu) — avrdude
Теперь мы настроим Avrdude. Опять же, вы можете просто использовать предпочитаемый менеджер пакетов, чтобы установить его и автоматически добавить в путь. Например, вы можете использовать диспетчер пакетов
apt
в Ubuntu, как показано ниже.Этот файл содержит двунаправленный текст Unicode, который может быть интерпретирован или скомпилирован не так, как показано ниже. Для просмотра откройте файл в редакторе, который показывает скрытые символы Unicode. Узнайте больше о двунаправленных символах Unicode
Показать скрытые символы
apt-get установить avrdude просмотреть необработанный avrdude_install.sh размещено с ❤ от GitHub
Установку можно протестировать, выполнив следующую команду, которая распечатает инструкции по использованию Avrdude.
просмотреть в исходном виде avrdude_info.sh размещено на ❤ by GitHub
Инструкции по использованию avrdudeВыбор между программатором и загрузчиком
Если вы знакомы с программаторами и загрузчиками и/или ваш программатор уже настроен и подготовлен, вы можете перейти к следующему разделу.
Читая этот блог, вы могли пару раз встречать слова Programmer и bootloader . Оба они являются инструментами, используемыми для переноса программы во флэш-память микроконтроллера.
Поскольку вы не можете напрямую подключиться с вашего USB к флэш-памяти на микроконтроллере, вы должны использовать специальное устройство, называемое Внешний программатор . Внешний программатор может подключаться к вашему ПК на одном конце (обычно через USB-порт) и флэш-памяти микроконтроллера на другом конце.
Теперь программа, работающая на вашем ПК, такая как Avrdude (также называемая программатором ), может передавать шестнадцатеричный файл внешнему программатору, который может записать его во флэш-память. Можно сказать, что программное и аппаратное обеспечение вместе называются программатором.
Например, ниже показаны Arduino UNO и ATmega328P, подключенные к популярному программатору STK500. Поскольку программисты бывают разных форм и размеров, показаны только связи.
Arduino UNO подключен к STK500ATmega328P подключен к STK500Из приведенных выше диаграмм видно, что внешний программатор подключается к обычным контактам на микроконтроллере. Когда вывод сброса микроконтроллера удерживается в высоком состоянии, микроконтроллер работает нормально, т. е. программа, которая в данный момент находится во флэш-памяти, выполняется, и выводы ведут себя в соответствии с программой. Но когда вывод сброса удерживается в низком состоянии, микросхема переводится в режим флэш-памяти, т. е. обычное выполнение программы останавливается. Это когда чип готов к программированию/прошивке, для чего программатор использует контакты, показанные выше.
Пока это происходит, микроконтроллер не нужно удалять из схемы, в которой он находится. Поэтому внешних программаторов также иногда называют ICSP / ISP , где ICSP означает внутрисхемное последовательное программирование, а ISP означает внутрисхемное последовательное программирование. Иногда названия могут немного сбивать с толку, но все они по существу относятся к внешним программистам. Вы даже можете использовать Arduino (подойдет большинство плат) в качестве внешнего программатора. Нажмите здесь, чтобы узнать больше.
Во время работы с платами Arduino вам, возможно, вообще не приходилось иметь дело с программистами. Это потому, что они используют нечто, называемое загрузчиком . Загрузчик — это специальная программа, которая находится во флэш-памяти перед вашей программой, если таковая имеется. Его цель — дождаться и принять входящую программу во флэш-память микроконтроллера.
При подаче питания на чип загрузчик запускается первым и ждет, пока ему отправят программу. Разные загрузчики ожидают, что программа будет отправлена по-разному. Обычный способ — через интерфейс Serial/UART на микроконтроллере. Между прочим, именно так работают загрузчики на большинстве плат Arduino (таких как UNO, MEGA и т. д.). Если загрузчик вовремя не получает указания на новую программу, он возобновляет выполнение программы, хранящейся в данный момент во флэш-памяти.
Если вы решите использовать загрузчик, вам все равно потребуется внешний чип, способный эмулировать UART через USB. Например, на Arduino UNO присутствует дополнительный чип, как показано ниже, который делает это. С этой эмуляцией и загрузчиком Avrdude теперь может передавать программу с вашего ПК, как если бы общался с интерфейсом UART.
Arduino UNO с конвертером USB-UARTUSB TTL конвертер от RadioshackЗагрузчик в первую очередь используется для экономии времени при разработке, так как устраняет необходимость многократного подключения/отключения внешнего программатора от схемы. Связанная с этим стоимость загрузчика заключается в том, что он требует дополнительного места на вашей флэш-памяти. Они также делают ваши продукты уязвимыми в производстве, упрощая пользователю перепрошивку микроконтроллера.
И программаторы, и загрузчики бывают разных форм и размеров. Вы можете выбрать любой и начать прямо сейчас, если он совместим с Avrdude. Чтобы получить полный список поддерживаемых целей для Avrdude, выполните следующую команду.
Этот файл содержит двунаправленный текст Unicode, который может быть интерпретирован или скомпилирован не так, как показано ниже. Для просмотра откройте файл в редакторе, который показывает скрытые символы Unicode. Узнайте больше о двунаправленных символах Unicode
Показать скрытые символы
аврдуде -с -ч просмотреть необработанный avrdude_targets.sh размещено с помощью ❤ от GitHub
Цели включают поддерживаемые загрузчики и программисты. Каждая цель будет иметь свой собственный набор нюансов и флагов, необходимых для ее использования. В этом блоге мы будем использовать только серийный загрузчик Arduino или STK500/Arduino в качестве программатора ISP.
Создание программы
Создайте каталог
сборки
в том же каталоге, что и ваша программа. Он будет содержать окончательный шестнадцатеричный файл, а также промежуточные файлы.Начнем с предварительной обработки исходного файла программы, для чего необходимо выполнить следующую команду. Все команды должны вызываться из исходного каталога.
Этот файл содержит двунаправленный текст Unicode, который может быть интерпретирован или скомпилирован не так, как показано ниже. Для просмотра откройте файл в редакторе, который показывает скрытые символы Unicode. Узнайте больше о двунаправленных символах Unicode
Показать скрытые символы
avr-gcc -DF_CPU=16000000UL -mmcu=atmega328P -E main.S -o build/main.s просмотреть необработанный avr_gcc_preprocess.sh размещено с помощью ❤ от GitHub
Давайте посмотрим, что делает каждый из флагов.
Флаг -DF_CPU=16000000UL добавляет дополнительный макрос препроцессора с именем
F_CPU
, который вычисляет частоту процессора в герцах. Он не используется в программах на ассемблере, но был добавлен выше в качестве хорошей практики.Добавлен суффикс UL
, чтобы число интерпретировалось как беззнаковое длинное (беззнаковое 32-разрядное) целое число.Флаг -mmcu используется для указания целевого микроконтроллера, который мы используем. Если вы используете что-то отличное от ATmega328P, то это нужно указать здесь. Если вы хотите увидеть полный список имен поддерживаемых микроконтроллеров, выполните следующую команду.
Этот файл содержит двунаправленный текст Unicode, который может быть интерпретирован или скомпилирован не так, как показано ниже. Для просмотра откройте файл в редакторе, который показывает скрытые символы Unicode. Узнайте больше о двунаправленных символах Unicode
Показать скрытые символы
sh»>
avr-gcc – цель-помощь просмотреть необработанный avr_gcc_target_help.sh размещено с ❤ на GitHub
Приведенная выше команда также печатает много дополнительной информации, и вы можете найти список имен, прокрутив до раздела Известные имена MCU .
Флаг -E используется для указания avr-gcc вызывать только препроцессор и ничего больше. 9Флаг 0089 -o используется для установки имени выходного файла.
После запуска команды вы должны увидеть файл с именем
main.s
в каталоге сборки, который содержит предварительно обработанный исходный файл. Теперь мы можем собрать это в объектный файл, для которого вы можете запустить следующую команду.Этот файл содержит двунаправленный текст Unicode, который может быть интерпретирован или скомпилирован не так, как показано ниже. Для просмотра откройте файл в редакторе, который показывает скрытые символы Unicode. Узнайте больше о двунаправленных символах Unicode
Показать скрытые символы
avr-gcc -mmcu=atmega328P -nostdlib -g build/main.s -o build/main.o просмотреть необработанный avr_gcc_assemble.sh hosted with ❤ by GitHub
Флаг -nostdlib указывает avr-gcc не связывать программу со стандартными библиотеками языка AVR C. Это включает в себя множество дополнительных функций, которые полезны при написании C/C++, но потенциально могут значительно увеличить размер вашей программы. Поскольку мы не используем ни одну из его функций, нам не нужно ссылаться на него.
Флаг -g указывает avr-gcc вызывать только ассемблер и ничего больше. Остальные флаги одинаковые.
После выполнения команды вы должны увидеть файл с именем
main.o
в каталоге сборки. Так как это бинарный файл, его нельзя открыть в обычном текстовом редакторе. Он содержит точки входа для всех ваших функций, а также некоторые другие метаданные. Теперь мы можем выполнить шаг ссылки, чтобы создать полную программу. Для этого выполните следующую команду.просмотреть необработанный avr_gcc_link.sh hosted with ❤ by GitHub
Как и в случае с avr-gcc, флаг -o сообщает компоновщику имя выходного файла. После запуска команды вы должны увидеть файл с именем
main.elf
в каталоге сборки. Иногда люди предпочитают вообще не использовать расширение.elf
и оставлять расширение файла меньше. Чтобы преобразовать этот файл в шестнадцатеричный файл, выполните следующую команду.Этот файл содержит двунаправленный текст Unicode, который может быть интерпретирован или скомпилирован не так, как показано ниже. Для просмотра откройте файл в редакторе, который показывает скрытые символы Unicode. Узнайте больше о двунаправленных символах Unicode
Показать скрытые символы
avr-objcopy build/main.elf build/main.hex -O ihex просмотреть необработанный avr_gcc_objcopy.sh размещено с ❤ на GitHub
Флаг -O сообщает avr-objcopy о формате выходного файла. В этом случае мы используем шестнадцатеричный формат Intel, который совместим с Avrdude и создает небольшие файлы. После запуска этой команды вы должны увидеть файл с именем
main.hex
в вашем каталоге сборки. Теперь мы можем запустить Avrdude, чтобы прошить это на микроконтроллер.Прежде чем мы загрузим программу, интересно проверить размер окончательной программы, а также разбивку по разделам. Для этого выполните следующую команду.
Этот файл содержит двунаправленный текст Unicode, который может быть интерпретирован или скомпилирован не так, как показано ниже. Для просмотра откройте файл в редакторе, который показывает скрытые символы Unicode. Узнайте больше о двунаправленных символах Unicode
Показать скрытые символы
размер avr –format=avr –mcu=atmega328p build/main.elf просмотреть необработанный avr_size.sh размещено с помощью ❤ от GitHub
Вывод приведенной выше команды должен выглядеть следующим образом.
Полная программа имеет длину всего 36 байт!
При написании обычных программ нередко можно увидеть размеры порядка мегабайт или даже гигабайт. Иногда удивительно, насколько маленькой может быть функционирующая программа в мире встраиваемых систем, особенно при использовании языка ассемблера.
Загрузка программы в микроконтроллер
Во-первых, вы должны найти последовательный порт, к которому подключен ваш Arduino/внешний программатор. В Windows это можно сделать, зайдя в диспетчер устройств и развернув раздел Порты (COM и LPT) . Одна из записей в списке должна быть вашим микроконтроллером. Порты должны иметь префикс
COM
, за которым следует номер порта (например, COM1, COM2 и т. д.). Если имеется несколько записей, просто отключите и снова подключите Arduino/программатор. Запись, которая исчезает и появляется снова, является правильной.В операционных системах на базе Unix выполните следующую команду.
Этот файл содержит двунаправленный текст Unicode, который может быть интерпретирован или скомпилирован не так, как показано ниже. Для просмотра откройте файл в редакторе, который показывает скрытые символы Unicode. Узнайте больше о двунаправленных символах Unicode
Показать скрытые символы
лс /dev/tty* просмотреть необработанный serial_ports_unix.sh размещено на ❤ на GitHub
Здесь перечислены все используемые в данный момент последовательные порты. Чтобы узнать, какой именно, запустите команду один раз после отключения Arduino/программатора и еще раз после его подключения. Запись, которая появляется только во втором списке, является правильной.
Предполагая, что имя порта — COM1, а программатор — STK500/Arduino в качестве интернет-провайдера, выполните следующую команду из исходного каталога.
Этот файл содержит двунаправленный текст Unicode, который может быть интерпретирован или скомпилирован не так, как показано ниже. Для просмотра откройте файл в редакторе, который показывает скрытые символы Unicode. Узнайте больше о двунаправленных символах Unicode
Показать скрытые символы
avrdude -v -p atmega328p -c stk500 -P COM1 -b 19200 -U flash:w:build/main.hex:i просмотреть необработанный avrdude_upload_stk500.sh размещено с ❤ на GitHub
Если вместо этого вы используете загрузчик Arduino, выполните следующую команду.
Этот файл содержит двунаправленный текст Unicode, который может быть интерпретирован или скомпилирован не так, как показано ниже. Для просмотра откройте файл в редакторе, который показывает скрытые символы Unicode. Узнайте больше о двунаправленных символах Unicode
Показать скрытые символы
sh»>
avrdude -v -p atmega328p -c arduino -P COM1 -b 19200 -U flash:w:build/main.hex:i просмотреть необработанный avrdude_upload_arduino.sh размещено с помощью ❤ от GitHub
Давайте посмотрим, что делает каждый из этих флагов.
Флаг -v указывает Avrdude напечатать подробную (подробную) информацию. Использовать не обязательно, но помогает в отладке, если что-то пойдет не так.
Флаг -p используется для указания цели для программирования, в данном случае мы использовали цель
atmega328P
. Если вы используете что-то другое, укажите это здесь.Флаг -c используется для указания внешнего программатора/загрузчика, который мы хотим использовать.
Флаг -P используется для указания порта, к которому подключен Arduino/программатор.
Флаг -b используется для указания скорости передачи данных, которую мы хотим использовать. Вы можете экспериментировать с более быстрыми и более медленными темпами, но 19200 — безопасное число для использования и достаточно быстрое в большинстве случаев.
Наконец, флаг -U используется для указания файла, который мы хотим использовать, а также типа памяти, операции и формата файла. Это написано следующим образом.
memtype:op:filename:format
memtype — это тип памяти (eeprom, flash, предохранители, расширенные предохранители и т. д.), который мы хотим использовать. Указываем
flash
, так как хотим писать во флеш.op — тип операции (чтение, запись или проверка), которую мы хотим выполнить. Указываем
w
, так как мы хотим выполнить операцию записи.имя файла — это путь к файлу, который мы хотим использовать.
Наконец, формат — это тип шестнадцатеричного файла, который мы используем. Мы указываем
i
, так как мы хотим использовать формат Intel Hex.Чтобы увидеть полный список опций, которые вы можете использовать с Avrdude, посетите руководство.
После загрузки программы вы можете подключить светодиод к соответствующему контакту микроконтроллера (контакт 13 на платах Arduino, физический контакт 19).на ATmega328P) и увидите, как он мигает. Вот и все!
Вы только что написали, построили и запустили полную программу на языке ассемблера для вашего микроконтроллера AVR.
Заключение
Хорошее понимание языка ассемблера и его выполнения на микроконтроллере помогает увидеть более тонкие детали того, как ваш код обрабатывается процессором. Кроме того, выполнение этого без IDE раскрывает необходимые инструменты и шаги. Это в значительной степени перенесено и в более обычную разработку более высокого уровня, а также обеспечивает более компактное и оптимизированное программирование. Он также может выступать в качестве удобного инструмента, когда оптимизация компилятора иногда приводит к неопределенному поведению.
Чтобы увидеть больше примеров языка ассемблера для микроконтроллеров AVR, вы можете перейти в этот репозиторий Github. Если у вас есть интересные примеры, которыми вы можете поделиться, не стесняйтесь вносить свой вклад!
Надеюсь, вы нашли этот блог интересным и узнали что-то новое. Если у вас есть какие-либо мысли или вопросы, оставьте их в комментариях ниже, я хотел бы их узнать! Удачи!
Дополнительные ресурсы
Набор инструкций AVR
Техническое описание ATmega328P
Примеры сборки AVR на Github
Нравится:
Нравится Загрузка…
Список Alexandria Content Store
[MCU8APPS-456] Миграция с ATmega48/88/168 на ATmega48PB/88PB/168PB — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
[MCU8APPS-456] Миграция с ATmega48A/88A/168A на ATmega48PB/88PB/168PB — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
[MCU8APPS-456] Миграция с ATmega48P/88P/168P на ATmega48PB/88PB/168PB — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
[MCU8APPS-456] Миграция с ATmega48PA/88PA/168PA на ATmega48PB/88PB/168PB — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
АЦП и оптимизация энергопотребления с tinyAVR серии 0 и 1 и megaAVR серии 0 — 2 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Основы АЦП с tinyAVR серии 0 и 1 и megaAVR серии 0 — 3 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Передискретизация АЦП с использованием tinyAVR серий 0 и 1 и megaAVR серии 0 — 4 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
AN1983 Запись во флэш-память и EEPROM на tinyAVR 1-й серии — 2 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
AN2801: АЦП и шумоподавление — 3 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
AN2805: Надежное устранение дребезга с помощью независимых от ядра периферийных устройств — 2 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Отладчик файла сборки с аннотациями — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
ASF-1-en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Справочное руководство по API ASF4 — 3 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
ASF — стек USB-устройств — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Приложение языка ассемблера на ATtiny104 — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
AT03242: Драйвер аналогового компаратора SAM (AC) — 3 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
AT03245: Драйвер системы событий SAM (EVENTS) — 2 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
AT03716: SAM L21 Configurable Custom Logic (CCL) с примером кодирования IR — 3 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
AT03975: Начало работы с SAM L21 — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
AT03976: Операционный усилитель SAM L21 в качестве усилителя усиления АЦП — 2 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
AT04022 — подчиненное устройство DALI с аппаратным приложением XMEGA E.
Примечание — 1 — en-USВеб-справка фрагмента CAB F1
Ошибка: Нет описания!
AT04296: Общие сведения об уровнях производительности и доменах мощности — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
AT06549: Технологии сверхнизкого энергопотребления — 2 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
AT06863: Драйвер периферийного контроллера событий SAM4L (PEVC) — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
AT06864: Драйвер контроллера сброса SAM3/4C/4CM/4CP/4E/4N/4S/G (RSTC) — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
AT07892: Драйвер контроллера прямого доступа к памяти SAM3A/3U/3X/4E (DMAC) — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
AT07898: SAM3/4S/4L/4E/4N/4CM/4C/G Драйвер таймера-счетчика (TC) — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
AT07899: Драйвер контроллера аналогового компаратора SAM3S/4E/4S (ACC) — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
AT07901: Драйвер внешнего контроллера прерываний (EIC) SAM4L — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
AT07903: драйвер ввода-вывода общего назначения SAM4L (GPIO) — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
AT07910: драйвер жидкокристаллического дисплея SAM4L (LCDCA) — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
AT07942: Драйвер асинхронного таймера SAM4L (AST) — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
AT08642: SAM3A/3N/3S/3U/3X/4E/4N/4S/G Драйвер периферийного контроллера прямого доступа к памяти (PDC) — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
AT09192: Контроллер SAM L22 Segment Liquid Crystal Display (SLCD) — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
AT09253: Драйвер контроллера интерфейса аналогового компаратора SAM4L (ACIFC) — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
AT09886: Руководство по началу работы с SAM L22 — 2 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
AT10458: Обнаружение несанкционированного доступа SAM L22 с использованием модуля RTC — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
AT10732: драйвер SAM True Random Number Generator (TRNG) — 2 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
AT10747: Драйвер SAM Advanced Encryption Standard (AES) — 2 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
AT10799: Драйвер контроллера операционного усилителя SAM (OPAMP) — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
AT10931: служба эмулятора чтения и записи EEPROM SAM (RWW EEPROM) — 2 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
AT11378: Драйвер системы SAM (SYSTEM) — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
AT11379: Драйвер цифро-аналогового преобразователя (ЦАП) SAM — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
AT11380: Драйвер аналого-цифрового преобразователя (АЦП) SAM — 5 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
AT11389: Драйвер управления системными часами SAM (SYSTEM CLOCK) — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
AT11512: драйвер SAM Brown Out Detector (BOD) — 2 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
AT11513: Руководство по ASF (SAM L21) — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
AT11805: емкостный сенсорный длинный слайдер с PTC — 2 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
AT12705: Выборка АЦП SAM L21 с использованием функций с низким энергопотреблением — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
AT13382: переход с варианта A SAM L21 на вариант B — 2 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
AT13481: Драйвер SAM Frequency Meter (FREQM) — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
AT13519: Драйвер светодиодов ATSAMR21 с прошивкой ZigBee Light Link.
Руководство пользователя — 2 — ru-RUВеб-справка фрагмента CAB F1
Ошибка: Нет описания!
AT13520: Драйвер светодиодов ATSAMR21 с ZigBee Light Link Краткое руководство — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
ATmega168PB Xplained Mini — 3 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
ATmega256RFR2 Xplained Pro — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
ATmega3208/3209 Спецификация — 6 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
ATmega3208/3209 Silicon Errata и пояснение к техническому описанию — 3 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
ATmega324PB-6-en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
ATmega324PB Xplained Pro — 3 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
ATmega328PB — 12.
1.1 — en-USВеб-справка фрагмента CAB F1
Ошибка: Нет описания!
ATmega328PB Xplained Mini — 5 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
ATmega328PB Xplained Mini Demo — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
ATmega328P Xplained Mini — 3 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
ATmega48/V / 88/V / 168/V — 3 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
ATmega4808/4809 Спецификация — 7 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
ATmega4808/4809 Silicon Errata и пояснение к техническому описанию — 6 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
ATmega4809 Curiosity Nano Руководство пользователя по оборудованию — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
ATmega4809 Xplained Pro — 3 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
ATmega48PB/88PB/168PB — 3 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
ATmega808/809/1608/1609 Спецификация — 5 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
ATmega808/809/1608/1609 Silicon Errata и уточнение технических данных — 4 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
ATmega8A-4-en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Atmel-ICE — 2 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Atmel Start — 3 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Atmel Start Release Notes — 18 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Atmel Studio — 5 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Atmel Studio Release Note — 14 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
ATtiny102/ATtiny104 — 7 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
ATtiny102/ATtiny104 — 3 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
ATtiny104 Xplained Nano — 2 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Руководство пользователя оборудования ATtiny1607 Curiosity Nano — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
ATtiny1614/1616/1617 Automotive Silicon Errata и уточнение технических данных — 7 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
ATtiny1614 / ATtiny1616 / ATtiny1617 — 3 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
ATtiny1614 Спецификация — 2 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
ATtiny1614 Silicon Errata и пояснение к техническому описанию — 5 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
ATtiny1616/3216 Спецификация — 4 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
ATtiny1616/3216 Silicon Errata и пояснение к техническому описанию — 5 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
ATtiny1617/3217 Спецификация — 3 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
ATtiny1617/3217 Silicon Errata и пояснение к техническому описанию — 4 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
ATtiny202/402 Спецификация — 3 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
ATtiny202/402 Silicon Errata и пояснение к техническому описанию — 3 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
ATtiny204/404 Спецификация — 3 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
ATtiny204/404 Silicon Errata и пояснение к техническому описанию — 3 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
ATtiny212/412 Спецификация — 6 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
ATtiny212/412 Silicon Errata и уточнение технических данных — 5 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
ATtiny214/414/814 Спецификация — 6 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
ATtiny214/414/814 Silicon Errata и пояснение к техническому описанию — 7 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
ATtiny3217 Xplained Pro — 3 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
ATtiny406 Спецификация — 3 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
ATtiny406 Silicon Errata и пояснение к техническому описанию — 3 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
ATtiny416/417/814/816/817 Automotive Silicon Errata и пояснение к техническому описанию — 5 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
ATtiny416/816 Спецификация — 5 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
ATtiny416/816 Silicon Errata и пояснение к техническому описанию — 6 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
ATtiny416 Xplained Nano — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
ATtiny417/817 Спецификация — 11 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
ATtiny417/817 Silicon Errata и пояснение к техническому описанию — 5 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
ATtiny4 ATtiny5 ATtiny9 ATtiny10 — 3 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
ATtiny804/1604 Спецификация — 2 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
ATtiny804/1604 Silicon Errata и пояснение к техническому описанию — 3 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
ATtiny806/1606 Спецификация — 2 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
ATtiny806/1606 Silicon Errata и уточнение технических данных — 3 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
ATtiny807/1607 Спецификация — 2 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
ATtiny807/1607 Silicon Errata и уточнение технических данных — 3 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
ATtiny817 Xplained Mini — 3 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
ATtiny817 Xplained Pro — 3 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
AVR125: АЦП tinyAVR® в несимметричном режиме — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
AVR126: АЦП megaAVR в одностороннем режиме — 2 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
AVR1300: Использование АЦП AVR XMEGA — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
AVR231: загрузчик AES — 2 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
AVR315: Использование модуля TWI в качестве ведущего устройства I2C — 3 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
AVR32919: оценочный комплект UC3C — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
AVR42777: Цифровой звукозаписывающий аппарат, использующий ЦАП с tinyAVR® 1-й серии — 3 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
AVR Assembler — 2 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
AVR Butterfly — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
AVR Dragon — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
AVR для IoT — использование megaAVR с модулем сетевого контроллера Wi-Fi ATWINC1500 802.
11 b/g/n — 1 — en-USВеб-справка фрагмента CAB F1
Ошибка: Нет описания!
AVR Instruction Set Manual — 1 — ru-RU
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Руководство пользователя оборудования AVR-IoT Wx — 3 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
AVRISPmkII-1-en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
AVR Libc — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Технологии малой мощности AVR — 4 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Рекомендации по проектированию аппаратного обеспечения микроконтроллера AVR — 5 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
АВРОНЕ! — 2 — ан-США
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Руководство пользователя программного обеспечения AVR — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Калькулятор срока службы батареи для конечного устройства ZigBee — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
BC100 — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Рекомендации по компоновке печатных плат генераторов — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Загрузчик для tinyAVR серий 0 и 1 и megaAVR серии 0 — 3 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Калибровка внутреннего эталона температуры AVR — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
C Функции чтения и записи во флэш-память — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Характеристика и калибровка АЦП на АРН — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Размер кода — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Сравнительная таблица — 11 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Независимое от ядра бесщеточное управление вентилятором постоянного тока с помощью микроконтроллеров CCL AVR — 6 — ru-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Core Independent Nightlight с использованием настраиваемой пользовательской логики на ATtiny1617 — 2 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Независимое ультразвуковое измерение расстояния от ядра с помощью tinyAVR 1-й серии — 5 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
CRCSCAN на tinyAVR серии 0 и 1 и megaAVR серии 0 — 3 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Ведомый стек DALI 2.
0 для микроконтроллеров tinyAVR серии 1 — 2 — ru-RUВеб-справка фрагмента CAB F1
Ошибка: Нет описания!
Dallas 1-Wire Master на tinyAVR и megaAVR — 3 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Демонстрационное приложение регистратора данных на XMEGA A1U Xplained Pro — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Визуализатор данных — 10 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Различия между ATmega324 и ATmega324PB — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Различия между ATmega328/P и ATmega328PB — 3 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Различия между ATtiny4/5/9/10 и ATtiny102/104 — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Производительность цифровой обработки сигналов 8-битного ядра AVR — 2 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Дискретный ПИД-регулятор на устройствах tinyAVR и megaAVR — 2 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Интегратор Doxygen — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
EDBG-3-en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Embedded Debugger-Based Tools Protocols Руководство пользователя — 2 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Рекомендации по проектированию ЭМС — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
EVK1100 — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
EVK1101 — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
EVK1104 — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
EVK1105 — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Foundation Services Reference Manual MCC — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
FreeRTOS с использованием трассировки Percepio на ATmega4809 — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Средство просмотра FreeRTOS — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Демонстратор функциональной безопасности с использованием ATtiny3217 — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Начало работы с экранами конфигурации Atmel START — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Начало работы с Atmel Studio 7 — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Начало работы с независимыми от ядра периферийными устройствами на микроконтроллерах AVR — 3 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Начало работы с FreeRTOS на megaAVR серии 0 — 3 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Начало работы с megaAVR серии 0 — 2 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Начало работы с MPLAB® X IDE — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Начало работы с tinyAVR® серии 0? — 3 — ан-США
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Начало работы с tinyAVR 1-Series — 3 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Руководство по соответствию IEC 60730 Class B с tinyAVR 1-Series — 9- ан-США
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Руководство пользователя оборудования DALI 2.
0 Slave на ATtiny817 — 1 — en-USВеб-справка фрагмента CAB F1
Ошибка: Нет описания!
I/O1 Xplained Pro — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Введение в мультиплексирование ввода/вывода с помощью ATmega328PB — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Внутрисистемное программирование — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Интерфейс микроконтроллеров AVR с последовательной памятью — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Взаимодействие квадратурного энкодера с использованием CCL с TCA и TCB — 4 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Калибровка внутреннего RC-генератора для устройств tinyAVR и megaAVR — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Система прерываний в tinyAVR серий 0 и 1 и megaAVR серии 0 — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
JTAGICE3-3-en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
JTAGICEmkII-1-en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Библиотека драйверов светодиодов для 8-разрядных микроконтроллеров AVR — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
LiveWatch — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Многоканальное программное обеспечение PWM с низким джиттером — 2 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Manchester Encoder с использованием USART и CCL на ATtiny817 — 2 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
maXTouch Xplained Pro — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
MC303 — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Измерение напряжения VCC/батареи без использования контакта ввода/вывода на tinyAVR и megaAVR — 3 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
MEGA-1284P Xplained — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Миграция между tinyAVR 1-Series и tinyAVR 0-Series — 3 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
mikroBUS Xplained Pro — 2 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Примечания к выпуску библиотеки CryptoAuth для конфигуратора кода MPLAB — 3 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Покрытие кода MPLAB — 2 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Руководство пользователя внутрисхемного отладчика MPLAB PICkit 4 — 2 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Справочное руководство по библиотекам MPLAB XC16 — 2 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Руководство пользователя MPLAB X IDE — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
mxt143E Xplained — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Противошумовые меры для приложений АЦП — 4 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
OLED1 Xplained Pro — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Parrot (диктофон) с ATtiny817.
Руководство пользователя оборудования — 1 — ruВеб-справка фрагмента CAB F1
Ошибка: Нет описания!
PIC18(L)F26/45/46K40 Спецификация — 2 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
PIC18(L)F27/47K40 Спецификация — 2 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
PIC18(L)F65/66K40 Спецификация — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
PIC18(L)F67K40 Спецификация — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
PIC18F24/25Q10 Спецификация — 3 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
PIC18F25/45/55Q43 Лист данных — 4 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
PIC18F26/45/46Q10 Лист данных — 6 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
PIC18F26/46/56Q43 Лист данных — 4 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
PIC18F27/47/57Q43 Лист данных — 7 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
PIC18F27/47Q10 Спецификация — 5 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Руководство пользователя оборудования PIC-IoT Wx — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Приложение Pillbox Alarm для AVR P4 FEB — 3 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Power Debugger — 4 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Точная синхронизация со сверхнизким энергопотреблением с использованием периодического включения внешнего кварцевого генератора с частотой 32,768 кГц для повторной калибровки внутреннего генератора ULP — 3 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Планирование процессов на 8-битном микроконтроллере — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Производственное программирование микроконтроллеров Microchip AVR и SAM — 7 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
PROTO1 Xplained Pro — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
QT1 Xplained Pro — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
QT2 Xplained Pro — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
QT3 Xplained Pro — 2 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Руководство пользователя QT5 Xplained Pro — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
QT600 — 1 — EN-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Композитор QTouch — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Модульная библиотека QTouch.
Руководство пользователя периферийного сенсорного контроллера — 6 — en-USВеб-справка фрагмента CAB F1
Ошибка: Нет описания!
Библиотека программного обеспечения QTouch — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
ИК-приемник дистанционного управления RC5 на устройствах tinyAVR и megaAVR — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
ИК-передатчик дистанционного управления RC5 на tinyAVR и megaAVR — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Часы реального времени (RTC) с использованием асинхронного таймера — 3 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Калибровка и компенсация часов реального времени на микроконтроллерах AVR — 2 — ru-RU
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Надежность на tinyAVR серии 0 и 1 и megaAVR серии 0 — 7 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
RZ600 — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
RZ Raven — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
SAM4E Xplained Pro — 3 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
SAM4L8 Xplained Pro — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
SAM4L Xplained Pro — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
SAM4N Xplained Pro — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
SAM4S Xplained Pro — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
SAM B11 Xplained Pro — 4 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
SAM C20E / SAM C20G /SAM C20J — 12 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
SAM C21E / SAM C21G / SAM C21J — 12 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
SAM C21N Xplained Pro — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
SAM C21 Xplained Pro — 8 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
SAM D09 — 2 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
SAM D10 — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
SAM D11 — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
SAM D11 Xplained Pro — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
SAM D20 Xplained Pro — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
SAM D21E / SAM D21G / SAM D21J — 9 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
SAM D21 Xplained Pro — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
SAM E54 Xplained Pro — 2 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
SAM G53 Xplained Pro — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
SAM G55 Xplained Pro — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
SAM-ICE — 2 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
SAM L21E / SAM L21G / SAM L21J — 10 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
SAM L21 Xplained Pro — 3 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
SAM L22G / L22J / L22N — 8 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
SAM L22G / L22J / L22N Краткое описание — 10 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
SAM L22 Xplained Pro — 2 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
SAM R21 Xplained Pro — 2 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
SAM V71 Xplained Ultra — 3 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Загрузчик SD-карты для XMEGA A1U — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Сегмент LCD1 Xplained Pro — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Выбор и тестирование кварцевых генераторов с частотой 32 кГц для микроконтроллеров AVR — 2 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Настройка и использование таймеров AVR — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Настройка и использование аналогового компаратора AVR — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Настройка и использование SPI — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Симулятор — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Интеллектуальная батарея 200 — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Smart Battery 201 — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Smart Battery 202-1-en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
SMARTCARD Xlapined Pro — 3 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Smart IoT Wireless Sensor Node с использованием XMEGA® AU MCU и технологии LoRa — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Программная библиотека для шифрования и дешифрования AES-128 на megaAVR — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
STK500 — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
STK501-1-en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
STK502-1-en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
STK503-1-en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
STK504-1-en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
STK505-1-en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
STK600 AVR Flash MCU Starter Kit Руководство пользователя — 10 — ru-RU
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
STK600 RC064SAM-72 — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
TB2076 — поддержка протокола LIN в модулях UART — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
TB2669 — Ведомый режим I²C — 2 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
TB3164 — Прямой доступ к памяти на 8-разрядных микроконтроллерах PIC — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
TB3191 — Мастер-режим I²C — 2 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
TB3192 — Использование модуля SPI на 8-разрядных микроконтроллерах PIC — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
TB3193 — Активная настройка часов для семейства PIC16(L)F191XX — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
TB3194 — PIC16/PIC18 ADC² Техническое описание — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
TB3198 — Работа емкостного делителя напряжения (CVD) на 8-битном микроконтроллере PIC — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
TB3200 — UART с техническим описанием протокола DALI — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
TB3201 — Как внедрить приемопередатчик DALI-2 с использованием основных независимых периферийных устройств — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
TB3202 — автоматическое определение скорости передачи данных в 8-битном модуле CAN/ECAN микроконтроллера PIC — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
TB3203 — Часы реального времени и календарь (RTCC) с резервным аккумулятором для устройств семейства PIC16(L)F19197 — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
TB3204 — DMX-512 с использованием UART с поддержкой протокола — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
TB3205 — PIC16(L)F19197 Генерация смещения ЖК-дисплея и регулировка контрастности с помощью встроенного зарядного насоса ЖК-дисплея — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
TB3208 — Основные операции UART с поддержкой протокола — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
TB3209 — Начало работы с АЦП — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
TB3210 — Начало работы с ЦАП — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
TB3211 — Начало работы с AC — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
TB3212 — Начало работы с TCD — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
TB3213 — Начало работы с RTC — 3 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
TB3214 — Начало работы с TCB — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
TB3215 — Начало работы с SPI — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
TB3216 — Начало работы с USART — 2 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
TB3217 — Начало работы с TCA — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
TB3218 — Начало работы с CCL — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Регистратор температуры с ATtiny817 и SD-картой — 4 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Touch SLCD1 Xplained Pro — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
UC3-A3 Xplained — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
UC3-C2 Xplained — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
UC3-L0 Xplained — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Оценочный комплект UC3L — 2 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Ультразвуковой дальномер с ATtiny817.
Руководство пользователя аппаратного обеспечения — 1 — ru-RUВеб-справка фрагмента CAB F1
Ошибка: Нет описания!
Понимание параметров АЦП — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
USART в однопроводном режиме — 5 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Использование Atmel-ICE для программирования AVR в массовом производстве — 3 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Использование CFD для ATmega328PB — 2 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Использование системы событий на ATtiny817 — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Использование внешних прерываний для устройств megaAVR — 3 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Использование внешних прерываний для устройств tinyAVR — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Использование библиотеки GFX на XMEGA A1U Xplained Pro — 1 — ru-RU
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Использование аналогового внешнего интерфейса в микроконтроллерах SAM V7/E7/S7 — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Использование аппаратного множителя AVR — 2 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Использование AVR USART на устройствах tinyAVR и megaAVR — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Использование высокоскоростного ШИМ AVR — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Использование модуля файловой системы Petit FAT с микроконтроллерами AVR — 2 — ru-RU
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Использование модуля TWI в качестве ведомого устройства I2C — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Использование модуля USI в качестве ведомого устройства I2C — 2 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Использование модуля USI в качестве мастера TWI — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Использование модуля USI для связи SPI на устройствах tinyAVR и megaAVR — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Использование системы часов XMEGA — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Использование сторожевого таймера XMEGA — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Использование захвата таймера для измерения рабочего цикла ШИМ — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Использование USART для вывода ATmega328PB из спящего режима — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Wireless Composer — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
XDK-1-en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
XMEGA A1U Xplained Pro — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
XMEGA-A1 Xplained — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
XMEGA-A3BU Xplained — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
XMEGA-B1 Xplained — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Руководство пользователя оборудования XMEGA-E5 Xplained — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Калибровка внутреннего RC-генератора XMEGA — 2 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Xplained Pro Hardware Development Kit (HDK) — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Детектор перехода через ноль — 1 — en-US
Веб-справка фрагмента CAB F1
Ошибка: Нет описания!
Последовательное программирование микроконтроллеров AVR
Содержание
В этом блоге мы попробуем демистифицировать процесс прошивки 8-битного микроконтроллера AVR ATmega328P с использованием алгоритма последовательного программирования.
Зачем вам знать о последовательном программировании?
Наш интерес к какой-либо области возникает, когда у нас возникает какой-либо вопрос, касающийся этой области. Ребенок, сидящий на вершине крыши и смотрящий в небо, может заинтересоваться классификацией различных звезд, когда задаст вопрос 9.0089 «Почему у одних звезд синий цвет, а у других — оранжевый?» . Малыш будет узнавать об этом из разных источников и может стать следующей Джоселин Белл.
Большинство проектировщиков и программистов встраиваемых систем заинтересовались этой областью, когда задали такие вопросы:
«Как я могу сделать свои собственные цифровые часы? »
«Как я могу запрограммировать микроконтроллер и что-то построить? »
«Как я могу взаимодействовать между различными устройствами? ”
и так далее.В основе ответов на каждый из этих и других подобных вопросов лежит утверждение «Вы можете сделать это с помощью программирования». . Многие люди умеют писать код, однако то, как на самом деле программируется система, или как она хранит в памяти различные байты, которые несут в себе суть нашего кода, некоторым до сих пор неизвестно. Важно, чтобы любители и другие люди, работающие в области встроенных систем, хотя бы имели представление о том, что на самом деле делает чувак по имени «avrdude» или загрузчик, когда они программируют свою плату Arduino. Эти знания помогут им узнать, как программируются их платы Arduino, или в чем может быть ошибка, когда avrdude выдает ошибку «Период SCK не определен».
Что происходит, когда вы нажимаете кнопку «Проверить» в Arduino IDE?
Когда вы нажимаете кнопку «Проверить», ту, что с символом «галочка», в Arduino IDE выполняется ряд шагов, которые проверяют вашу программу на наличие ошибок, связывают ее с необходимыми библиотечными файлами и, наконец, выдают результат. шестнадцатеричный файл с расширением .hex. Эта серия шагов в совокупности называется «Компиляция». Компиляция выполняется компиляторами, и конечным результатом успешной компиляции является файл, содержащий шестнадцатеричные эквиваленты 1 и 0, который называется «Машинный код» или «Исполняемый код». Это файл, который процессор наших компьютеров может понять и выполнить.
Компиляция скетча мигания перед его прошивкой в Arduino Uno
Итак, когда вы пишете простой код для мигания светодиодом на Arduino Uno, не думайте, что микроконтроллер на Uno, ATmega328p, хранит ваш код со всеми его операторами вроде предложения в книге. Он сохраняет машинный код, эквивалентный вашему коду, в своей памяти.
Исходный код (справа) мигающего встроенного светодиода на Arduino Uno и соответствующий ему шестнадцатеричный файл (слева), полученный после компиляции
Вы можете связать это с тем, что вы делаете заметки на страницах, пока ваш инструктор учит вас чему-то. Ваши заметки понятны только вам, но это не значит, что их интерпретация отличается от того, чему научил вас ваш преподаватель (Ну, иногда это может быть, но это то, что делают и компиляторы. Они добавляют или удаляют несколько сегментов, поэтому как оптимизировать код для конкретного процессора.)
Аналогия с лекцией, прочитанной учителем, и заметками, которые мы пишем: среда (язык, устная речь, доска и т. д.), с помощью которой учитель преподает, аналогична язык высокого уровня, который мы пишем своими словами в наших заметках. Эти заметки легко понятны ведущему и аналогичны машинному языку.
ПРИМЕЧАНИЕ 1: В целях единообразия с этого момента мы ограничим наше обсуждение только микроконтроллером ATmega328P. Это микроконтроллер, подключенный к DIP-разъему Arduino Uno или припаянный к плате Arduino Nano. Даже с этим ограничением на наш выбор микроконтроллера обсуждение, которое мы будем здесь вести, будет относиться к большинству микроконтроллеров семейства 8-разрядных микроконтроллеров AVR, и читатель обнаружит, что большинство микроконтроллеров, поддерживающих последовательное программирование, имеют аналогичный алгоритм программирования.
ПРИМЕЧАНИЕ 2: Поскольку мы будем снова и снова обращаться к техническому описанию ATmega328P, вот ссылка для загрузки последнего технического описания:
https://ww1.microchip.com/downloads/en/DeviceDoc/ATmega48A- PA-88A-PA-168A-PA-328-P-DS-DS40002061B.pdfПРИМЕЧАНИЕ 3: Скобки, содержащие номер с префиксом «Pg», относятся к страницам в техническом описании ATmega328P, которые следует читать по детально разобраться в конкретной теме.
Структура памяти ATmega328P
ATmega328P имеет три разных типа встроенной памяти. Это:
- Флэш-память/память программ: Это память, в которой находится машинный код, эквивалентный нашему исходному коду. Его следует использовать только для целей программирования, а не для хранения переменных (стр. 26).
- SRAM: Оперативная память — это память, в которой мы храним наши переменные. Будь то массивы или символы для последовательной отправки на наш ноутбук, все они хранятся здесь (стр. 28).
- EEPROM: Электрически стираемая программируемая постоянная память или сокращенно EEPROM — это пространство памяти, в котором мы храним постоянные переменные (стр. 29).
Если мы отключим питание от нашего микроконтроллера, содержимое флэш-памяти и EEPROM сохранится, но содержимое SRAM будет стерто.
Сначала рассмотрим структуру SRAM (стр. 28). Ее также называют памятью данных.
Карта памяти данных. В ATmega328P доступно 2 КБ SRAM
Как видно из карты памяти, SRAM разделена на 4 места:
- 32 Регистры: Используются процессором в микроконтроллере для хранения значений операндов.
- 64 регистра ввода-вывода: Это регистры, с помощью которых микроконтроллер считывает ввод и отправляет вывод. Эти регистры также управляют различными другими свойствами микроконтроллера, такими как его таймеры и счетчики.
- 160 доб. Регистры ввода-вывода: Эти регистры соответствуют 160 ячейкам расширенной памяти ввода-вывода.
- SRAM: Следующие 2048 ячеек составляют наши 2 КБ SRAM для хранения переменных.
Теперь поговорим о структуре flash и EEPROM. Именно здесь мы можем продолжить нашу аналогию с заметками, нацарапанными на листе бумаги. Штрихи пера составляют одну букву или символ. Осмысленная комбинация этих символов составляет слово. Набор слов составляет предложения, которые объединяются в абзац, и именно набор абзацев составляет наши заметки, которые несут информацию, которую мы узнали. В компьютерном программировании 0 и 1, известные как биты, являются нашими «росчерками пера». Набор из восьми таких битов составляет байт (который также отображается в ASCII). Два байта, объединенные вместе, образуют последовательность из 16 битов, которую мы называем словом. Слово состоит из старшего байта и младшего байта. В памяти каждый байт хранится в ячейке памяти. Эти байты можно рассматривать группами по два, т. е. как слова. Эти слова составляют страницу памяти.
Соотношение между байтами и словом
Флэш-память ATmega328P имеет общий размер 32 Кбайт или 16 К слов. Эта память разделена на 256 страниц, каждая из которых может содержать 64 слова (стр. 294).
Характеристики флэш-памяти ATmega328P
Аналогично, EEPROM этого микроконтроллера имеет общий размер 1Кбайт. Он разделен на 256 страниц, каждая из которых может содержать 4 байта (стр. 294).
Характеристики EEPROM ATmega328P
Очевидно, что флэш-память упорядочивается и обрабатывается в терминах слов, тогда как EEPROM упорядочивается и обрабатывается в терминах байтов. На приведенной ниже диаграмме показана организация страниц и слов во флэш-памяти ATmega328P.
Организация страниц и слов во флэш-памяти ATmega328P
Теперь возникает вопрос, как мы можем получить доступ к ячейкам памяти во флэш-памяти и EEPROM? Для этого вернемся к таблице данных. В таблице 28-11 под PCWORD написано PC[5:0], а под PCPAGE написано PC[13:6]. Это означает, что в одном 16-битном адресе слова биты [5:0] составляют адрес слова на одной странице, а биты [13:6] составляют адрес страницы в памяти. . Таким образом, мы имеем следующий шаблон для записи адреса слова в память.
Здесь все биты с пометкой w составляют адрес слова на странице, а все биты с пометкой p составляют адрес страницы.
Например, полный адрес слова, хранящегося в 34-м месте на странице 78, задается как0001 0011 1010 0010
В качестве упражнения читатель может просмотреть таблицу 28-12 и определить шаблон для адресации. байт в EEPROM ATmega328P.
Настройка нашего микроконтроллера для последовательного программирования
Теперь мы подошли к основной теме этого блога, а именно к последовательному программированию ATmega328P. Здесь под словом «последовательный» мы подразумеваем, что данные будут отправляться синхронно с тактовым сигналом. ATmega328P — микроконтроллер, который нужно запрограммировать. Это наше целевое устройство. В терминологии встроенных систем это называется slave . Система, которая будет программировать этот микроконтроллер, называется master .
При последовательном программировании ATmega328P (и вообще других микроконтроллеров AVR) нам потребуется 6 строк для соединения ведущего и ведомого. Эти строки (стр. 304):
- Master In Slave Out (MISO)(PB4): Данные передаются по этой линии последовательно от ведомого к ведущему.
- Master Out Slave In (MOSI)(PB3): Данные последовательно передаются по этой линии от ведущего к ведомому.
- SCK(PB5): Это линия тактового импульса. Когда тактовый импульс отправляется по этой линии, один бит отправляется или считывается либо ведущим, либо ведомым устройством.
- СБРОС: Это однонаправленная линия с активным низким уровнем, которая используется ведущим для сброса ведомого. Когда RESET = 0, ведомое устройство готово к приему и отправке инструкций и данных по упомянутым выше последовательным каналам.
- Vcc: Это наша общая шина питания. Для ATmega328P должно быть 5В.
- GND: Это наша земля или шина 0V. Рекомендуется установить конденсатор между шиной питания и шиной заземления, чтобы отфильтровать любые пульсации питания.
Мы подключим ведомое устройство к этим шести линиям, как показано на рис. 28-7 (стр. 303).
Настройка ведомого микроконтроллера для последовательного программирования
Теперь вопрос: кто главный? Кто находится на другом конце этих линий? Что ж, в данном случае мы являемся мастером и будем посылать импульсы по линиям MOSI и SCK через какие-то идеальные тактильные переключатели, у которых нет дребезга переключателей. Конечно, таких переключателей не существует в реальном мире. В реальном мире мы будем использовать обычный тактильный переключатель. Однако мы можем устранить дребезг переключателя, используя триггеры Шмитта. Тактильный переключатель будет подключен к Vcc с помощью подтягивающих резисторов 1k, откуда провод соединит выход нашего тактильного переключателя с шестигранным инверторным триггером Шмитта. Итак, когда мы нажмем переключатель, выход триггера Шмитта станет высоким, в противном случае он останется низким. Это сделает наш «идеальный переключатель».
Мы можем прикрепить тумблер к контакту RESET микроконтроллера. Это позволит нам переводить микроконтроллер в состояние RESET или нормальное состояние по мере необходимости.
Еще одна вещь, которую мы можем сделать, это подключить светодиоды к нашим линиям MOSI, MISO и SCK. Это даст визуальную индикацию того, какой бит передается по определенной линии. Мы подключим синий светодиод к нашей линии SCK, а красный и зеленый к нашим линиям MOSI и MISO соответственно.
После всего сказанного и сделанного мы получаем установку, показанную ниже.
Установка для последовательного программирования ATmega328P
Теперь пришло время для последовательного программирования нашего микроконтроллера.
Алгоритм последовательного программирования
Это алгоритм, которому мы должны следовать для связи с нашим микроконтроллером и его последовательного программирования (стр. 304).
- Шаг 1: Последовательность включения питания
Питание подается между Vcc и GND. Выход SCK и MOSI низкий. СБРОС дается одиночным импульсом. - Шаг 2: Подождите 20 мс.
- Шаг 3: Команда включения программы: Отправьте команду «включение программы» ведомому устройству. Обратите внимание, что строка MOSI будет прочитана по переднему фронту SCK, а MISO будет отправлена по заднему фронту SCK. Итак, процедура отправки бита ведомому должна быть такой:
Шаг а: Если бит = 0, не нажимайте MOSI. Если бит = 1, нажмите MOSI.
Шаг b: Нажмите SCK.
Шаг c: Освободите SCK.
Шаг d: Если кнопка MOSI была нажата, отпустите ее.- Шаг 4: Если связь между ведущим и ведомым синхронизирована, 0x53 будет возвращено или, скажем, повторено ведомым устройством при отправке третьего байта инструкции разрешения программы. Отправьте все четыре байта инструкции. Если эхо-сигнал неправильный, вернитесь к шагу 1 и начните заново.
- Шаг 5: Выполнить стирание чипа: Если вы хотите стереть содержимое флэш-памяти и EEPROM (что вам следует сделать, если ваша программа не работала правильно в последний раз), отправьте команду стирания чипа последовательно подчиненному устройству. .
- Шаг 6: Программирование флэш-памяти: Флэш-память программируется постранично. Машинный код для одной страницы сначала загружается в буфер страницы. Когда мы будем загружать наши слова в буфер страницы, мы предоставим вместе с командой загрузки страницы памяти программы старший/младший байт машинного кода, эквивалентный этой инструкции, и адрес, по которому эта инструкция должна быть сохранена. Каждая инструкция имеет ширину 16 или 32 бита. Соответственно, мы можем решить, сколько инструкций можно разместить на одной странице. Обратите внимание, что младший байт инструкции должен быть загружен первым перед загрузкой старшего байта инструкции в буфер. Как только буфер загружен, вы можете записать его, используя инструкцию «записать страницу памяти программы», приведенную в таблице 28.8.3, снабдив ее 7 старшими битами (MSB) адреса страницы. Затем машинный код следующей страницы загружается в буфер страницы. Аналогичным образом можно запрограммировать EEPROM.
Это становится слишком сложно, да? Что ж, в этой таблице данных есть красивая диаграмма, рисунок 28-8, которая наглядно поясняет, как программируются флэш-память и EEPROM ведомого устройства (стр. 306).
Это показано ниже:
Последовательное программирование памяти программ/памяти EEPROM
Небольшой пример последовательного программирования
Алгоритм последовательного программирования станет понятен с помощью примера. В этом примере мы запрограммируем наш микроконтроллер ATmega328P с помощью довольно простого кода, который переводит контакт 0 порта D в высокий уровень. Если есть светодиод, анод которого подключен к контакту 0, а катод к земле через резистор, он будет светиться. Мы напишем этот код на ассемблере, соберем его вручную, а затем последовательно запрограммируем с его помощью микроконтроллер.
Теперь, прежде чем мы начнем, мы введем слабую подсветку синтаксиса для битов, которая облегчит понимание и следование рассуждениям в этом примере.
Цвет бита Описание 0 или 1 8 Таких BITS. 8 таких битов составляют старший байт слова 0 или 1 6 Такие биты составляют адрес слова на странице 0 или 1 8 Такого. флэш-память Мы должны сделать вывод 0 порта D высоким. Для этого нам сначала нужно установить бит 0 регистра DDRD. Это настроит контакт 0 как входной контакт. Затем мы установим бит 0 регистра PORTD, чтобы установить вывод 0 нашего микроконтроллера в высокий уровень. Вот ассемблерный код для этого:
LDI R1, 0x01 ;сохранить 0x01 в регистре 1 OUT 0x0A, R1 ;сохранить значение регистра 1 в регистре DDRD (номер регистра ввода/вывода 0x0A) OUT 0x0B, R1 ;сохранить значение регистра 1 в регистре PORTD (номер регистра ввода-вывода 0x0B)
Часть 2: Сборка кода вручную
Сборка — это процедура преобразования кода на языке ассемблера в код машинного языка. Каждая ассемблерная инструкция транслируется в последовательность битов (которая может быть записана в виде шестнадцатеричного числа), и это единственное, что понимает машина. Для сборки мы рассмотрим руководство по набору инструкций AVR (ссылка для скачивания: http://ww1.microchip.com/downloads/en/devicedoc/atmel-0856-avr-instruction-set-manual.pdf) для получения наших инструкций и преобразовать их в соответствующий 16-битный код операции.
Преобразуем LDI R1, 0x01 в его 16-битный код операции. Шаблон для того же приведен ниже (стр. 115 руководства по набору инструкций):
Регистр R1 — это регистр 0x01. SO, DDDD = 0001.
Непосредственное число 0x01 = 0000 0001. Итак, KKKK KKKK = 0000 0001.
Затем необходимый 16-битный OPCOD
Аналогичным образом мы собираем инструкции OUT, используя шаблон ниже (стр. 134 руководства по набору инструкций):
OUT 0x0A, R1
→ 1011 1000 0001 1010OUT 0x0B, R1
→ 1011 1000 0001 1011Our complete assembled code will become
1110 0000 0001 0001
1011 1000 0001 1010
1011 1000 0001 1011Часть 3. Включение нашего чипа для последовательного программирования мы обсудили.
Мы подадим питание на Vcc и GND, оставим SCK и MOSI на низком уровне и подадим импульс на контакт RESET через наш тумблер и установим его обратно в 0 (будет полезно отметить, какое направление высокое, а какое низкое на Переключить переключатель). Подождав не менее 20 мс, мы отправим микроконтроллеру команду включения программы, которая в основном сообщает ему 9.0089 «Эй! Сейчас мы будем последовательно программировать вас» .Эта инструкция приведена ниже (стр. 305):
Двоичная версия этих шестнадцатеричных кодов приведена ниже (поищите в Google, как преобразовать шестнадцатеричные числа в двоичные числа и наоборот. Это довольно просто):
1010 1100 0101 0011 0000 0000 0000 0000
Как мы упоминали ранее, состояние вывода MOSI считывается по переднему фронту тактового импульса. Если вы хотите, чтобы микроконтроллер считывал 0, просто нажмите тактильный переключатель SCK. Если вы хотите, чтобы микроконтроллер считывал 1, сначала нажмите переключатель MOSI, а затем нажмите SCK. Отпустите MOSI, а затем отпустите SCK. Если MISO имеет высокий уровень, светодиод на линии MISO будет светиться, когда SCK будет отпущен. Это становится запутанным, верно? Что ж, следующие временные диаграммы прояснят ситуацию. Первый показывает, как отправляются первые два байта инструкции разрешения программы.
Отправка байта 1 и 2 инструкции включения программы
Следующая показывает, как передаются последние два байта инструкции. На этот раз 0x53 возвращается обратно на спадающем фронте тактового сигнала.
Отправка байтов 3 и 4 инструкции разрешения программы. 0x53 возвращается обратно на MISO по заднему фронту тактового сигнала
Если 0x53 не возвращается обратно, это означает, что наш ведущий и подчиненный не синхронизированы друг с другом. В этом случае подайте импульс на контакт RESET и снова отправьте команду. Вот несколько возможных причин несинхронизации ведущего и ведомого:
- Пульсация питания
Решение: Подключите конденсатор между шинами Vcc и GND - Неправильное нажатие переключателей SCK и MOSI.
Решение: следуйте приведенному алгоритму. Нажмите MOSI, а затем нажмите SCK. - Ваша кожа касается проводов цепи.
Решение: Убедитесь, что вы не касаетесь проводов.
После того, как 0x53 будет отражено в третьем байте инструкции включения программы, отправьте четвертый байт. Наш ведомый теперь готов к последовательному программированию.
Часть 4: Стирание микросхемы
Сотрите содержимое флэш-памяти и EEPROM, отправив команду «стереть микросхему». Он приведен ниже:
Его двоичный эквивалент 1010 1100 1000 0000 0000 0000 0000 0000 . Это то, что мы должны отправить через MOSI.
Часть 5: Загрузка инструкций в буфер страниц
Теперь нам нужно загрузить нашу собранную программу в буфер страниц. Сначала загружается младший байт инструкции, а затем загружается ее старший байт.
Ниже приведена собранная нами программа.
1110 0000 0001 0001
1011 1000 0001 1010
1011 1000 0001 1011Сначала загрузим первую линию, затем на следующую линию, а затем на третью линию сборной.
Для загрузки первой строки используется команда инструкции загрузки. Шаблон для этой инструкции приведен ниже:
В соответствии с этим, если мы последовательно отправим следующие биты,
0100 0000 0000 0000 0000 0000 0001 0001
0100 1000 0000 0000 0000 0000 1110 00002 будет загружена первая страница буфера.
Чтобы загрузить вторую инструкцию, нам необходимо обновить LSB адреса на 1 и отправить следующие биты по секунду на MOSI,
0100 0000 0000 0000 0000 0001 0001 1010
0100 1000 0000 0010 001011195 0100 1000 0000 000000 0010111195 0100 1000 0000 0010 0010111195 .Чтобы загрузить третью инструкцию, мы снова увеличим младший бит адреса на 1 и отправим следующие биты последовательно,
0100 0000 0000 0000 0000 0010 0001 1011
0100 1000 0000 0000 0000 0010 1011 1000Это загружает нашу программу в буферный буфер atmega328P.
Часть 5: Запись страницы памяти программ
Наконец, нам нужно записать содержимое буфера страниц на определенную страницу, в данном случае на страницу 0. Для этого у нас есть следующая инструкция последовательного программирования:
В соответствии с этим отправка следующих битов по MOSI запишет содержимое страничного буфера в первую страницу флэш-памяти:
0100 1100 0000 0000 0000 0000 0000 0000
Если бы мы писали страницу 1 памяти, мы бы использовали:
0100 1100 0000 0000 0100 0000 0000 0000
. память, которую мы бы использовали:0100 1100 0000 1111 1100 0000 0000 0000
шпилька высокая. Это заставит микроконтроллер запустить нашу программу. Если к контакту 0 порта D подключен светодиод, как описано выше, он будет светиться.
Заключение
Вот что делают avrdude и разные программисты типа USBasp, когда программируют 8-битный микроконтроллер семейства AVR.