Микроконтроллеры (далее МК) прочно вошли в нашу жизнь, на просторах интернета можно встретить очень много интересных схем, которые исполнены на МК. Чего только нельзя собрать на МК: различные индикаторы, вольтметры, приборы для дома (устройства защиты, коммутации, термометры…), металлоискатели, разные игрушки, роботы и т.д. перечислять можно очень долго. Первую схему на микроконтроллере я увидел лет 5-6 назад в журнале радио, и практически сразу же перелистнул страницу, подумав про себя "все равно не смогу собрать". Действительно, в то время МК для меня были чем то очень сложным и непонятым устройством, я не представлял как они работают, как их прошивать, и что делать с ними в случае неправильной прошивки. Но около года назад, я впервые собрал свою первую схему на МК, это была схема цифрового вольтметра на 7 сегментных индикаторах, и микроконтроллере ATmega8. Так получилось, что микроконтроллер я купил случайно, когда стоял в отделе радиодеталей, парень передо мной покупал МК, и я тоже решил купить, и попробовать собрать что-нибудь. В своих статьях я расскажу вам про микроконтроллеры AVR , научу вас работать с ними, рассмотрим программы для прошивки, изготовим простой и надежный программатор, рассмотрим процесс прошивки и самое главное проблемы, которые могут возникнуть и не только у новичков.

Основные параметры некоторых микроконтроллеров семейства AVR:

Микроконтроллер

Память FLASH

Память ОЗУ

Память EEPROM

Порты ввода/вывода

U питания

Дополнительные параметры МК AVR mega:

Рабочая температура: -55…+125*С
Температура хранения: -65…+150*С
Напряжение на выводе RESET относительно GND: max 13В
Максимальное напряжение питания: 6.0В
Максимальный ток линии ввода/вывода: 40мА
Максимальный ток по линии питания VCC и GND: 200мА

Расположение выводов моделей ATmega 8X

Расположение выводов моделей ATmega48x, 88x, 168x

Расположение выводов у моделей ATmega8515x

Расположение выводов у моделей ATmega8535x

Расположение выводов у моделей ATmega16, 32x

Расположение выводов у моделей ATtiny2313

В конце статьи прикреплён архив с даташитами на некоторые микроконтроллеры

Установочные FUSE биты MK AVR

Запомните, запрограммированный фьюз – это 0, не запрограммированный – 1. Осторожно стоит относиться к выставлению фьюзов, ошибочно запрограммированный фьюз может заблокировать микроконтроллер. Если вы не уверены какой именно фьюз нужно запрограммировать, лучше на первый раз прошейте МК без фьюзов.

Самыми популярными микроконтроллерами у радиолюбителей являются ATmega8, затем идут ATmega48, 16, 32, ATtiny2313 и другие. Микроконтроллеры продаются в TQFP корпусах и DIP, новичкам рекомендую покупать в DIP. Если купите TQFP, будет проблематичнее их прошить, придется купить или и паять плату т.к. у них ножки располагаются очень близко друг от друга. Советую микроконтроллеры в DIP корпусах, ставить на специальные панельки, это удобно и практично, не придется выпаивать МК если приспичит перепрошить, или использовать его для другой конструкции.

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

Для программирования используется 6 выводов:
RESET - Вход МК
VCC - Плюс питания, 3-5В, зависит от МК
GND - Общий провод, минус питания.
MOSI - Вход МК (информационный сигнал в МК)
MISO - Выход МК (информационный сигнал из МК)
SCK - Вход МК (тактовый сигнал в МК)

Иногда еще используют вывода XTAL 1 и XTAL2, на эти вывода цепляется кварц, если МК будет работать от внешнего генератора, в ATmega 64 и 128 вывода MOSI и MISO не применяются для ISP программирования, вместо них вывода MOSI подключают к ножке PE0, a MISO к PE1. При соединении микроконтроллера с программатором, соединяющие провода должны быть как можно короче, а кабель идущий от программатора на порт LPT так-же не должен быть слишком длинным.

В маркировке микроконтроллера могут присутствовать непонятные буквы с цифрами, например Atmega 8L 16PU, 8 16AU, 8A PU и пр. Буква L означает, что МК работает от более низкого напряжения, чем МК без буквы L, обычно это 2.7В. Цифры после дефиса или пробела 16PU или 8AU говорят о внутренней частоте генератора, который есть в МК. Если фьюзы выставлены на работу от внешнего кварца, кварц должен быть установлен на частоту, не превышающей максимальную по даташиту, это 20МГц для ATmega48/88/168, и 16МГц для остальных атмег.

Киселев Роман, Май 2007 Статья обновлена 26 Мая 2014

Итак, что вообще такое микроконтроллер (далее МК)? Это, условно говоря, маленький компьютер, размещенный в одной интегральной микросхеме. У него есть процессор (арифметическо-логическое устройство, или АЛУ), flash-память, EEPROM-память, множество регистров, порты ввода-вывода, а также дополнительные «навороты», такие как таймеры, счетчики, компараторы, USARTы и т. п. Микроконтроллер после подачи питания загружается и начинает выполнять программу, записанную в его flash-памяти. При этом он может через порты ввода/вывода управлять самыми разнообразными внешними устройствами.

Что же это означает? Это значит, что в МК можно реализовать любую логическую схему, которая будет выполнять определенные функции. Это значит, что МК – микросхема, внутреннее содержимое которой, фактически, мы создаем сами. Что позволяет, купив несколько совершенно одинаковых МК, собрать на них совершенно разные схемы и устройства. Если вам захочется внести какие-либо изменения в работу электронного устройства, то не нужно будет использовать паяльник, достаточно будет лишь перепрограммировать МК. При этом не нужно даже вынимать его из вашего дивайса, если вы используете AVR, т. к. эти МК поддерживают внутрисхемное программирование. Таким образом, микроконтроллеры ликвидируют разрыв между программированием и электроникой.

AVR – это 8-битные микроконтроллеры, т. е. их АЛУ может за один такт выполнять простейшие операции только с 8-ми битными числами. Теперь пора поговорить о том, какой МК мы будем использовать. Я работаю с МК ATMega16. Он очень распространенный и приобрести его можно практически в любом магазине радиодеталей где-то за 100 руб. Если вы его не найдете – тогда можно купить любой другой МК серии MEGA, но в этом случае придется искать к нему документацию, т. к. одни и те же «ножки» разных МК могут выполнять разные функции, и, подключив, казалось бы, правильно все выводы, вы, может быть, получите рабочее устройство, а, может быть, лишь облако вонючего дыма. При покупке ATMega16 проверьте, чтобы он был в большом 40-ножечном DIP-корпусе, а также купите к нему панельку, в которую его можно будет вставить. Для работы с ним потребуются также дополнительные устройства: светодиоды, кнопки, разъемы и т. п..

ATMega16 обладает очень большим количеством самых разнообразных функций. Вот некоторые его характеристики:

  • Максимальная тактовая частота – 16 МГц (8 МГц для ATMega16L)
  • Большинство команд выполняются за один такт
  • 32 8-битных рабочих регистра
  • 4 полноценных 8-битных порта ввода/вывода
  • два 8-битных таймера/счетчика и один 16-битный
  • 10-разрядный аналогово-цифровой преобразователь (АЦП)
  • внутренний тактовый генератор на 1 МГц
  • аналоговый компаратор
  • интерфейсы SPI, I2C, TWI, RS-232, JTAG
  • внутрисхемное программирование и самопрограммирование
  • модуль широтно-импульсной модуляции (ШИМ)

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

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

Что для этого понадобится?

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

Для соединения элементов схемы очень удобно использовать шлейфы, на концах которых установлены разъемы. Эти разъемы надеваются на «ножки», торчащие рядом с каждым портом МК. Микроконтроллер следует устанавливать в панельку, а не припаивать к плате, иначе его очень трудно будет вынуть в случае, если вы его случайно сожжете. Ниже приведена цоколевка МК ATMEGA16:

Поясним, какие ножки нас сейчас интересуют.

  • VCC – сюда подается питание (4,5 – 5,5 В) от стабилизированного источника
  • GND – земля
  • RESET – сброс (при низком уровне напряжения)
  • XTAL1, XTAL2 – сюда подключается кварцевый резонатор
  • PA, PB, PC, PD – порты ввода/вывода (A, B, C и D соответственно).

В качестве источника питания можно использовать все, что выдает 7-11 В постоянного тока. Для стабильной работы МК нужно стабилизированное питание. В качестве стабилизатора можно использовать микросхемы серии 7805. Это линейные интегральные стабилизаторы, на вход которых подают 7-11 В постоянного нестабилизированного тока, а на выходе получают 5 В стабилизированного. Перед 7805 и после него нужно поставить фильтрующие конденсаторы (электролитические для фильтрации помех низких частот и керамические для высоких). Если не удается найти стабилизатор, то можно в качестве источника питания использовать батарейку на 4,5 В. От нее МК нужно питать напрямую.

Ниже приведу схему подключения МК:

Давайте теперь разберемся, что здесь для чего.

BQ1 – это кварцевый резонатор, задающий рабочую частоту МК. Можно поставить любой до 16 МГц, но, поскольку мы планируем работать в будущем и с COM-портом, то рекомендую использовать резонаторы на следующие частоты: 14,7456 МГц, 11,0592 МГц, 7,3725 МГц, 3,6864 МГц или 1,8432 МГц (позже станет ясно, почему). Я использовал 11,0592 МГц. Понятное дело, что чем больше частота, тем выше и скорость работы устройства.

R1 – подтягивающий резистор, который поддерживает напряжение 5 В на входе RESET. Низкий уровень напряжения на этом входе означает сброс. После сброса МК загружается (10 – 15 мс) и начинает выполнять программу заново. Поскольку это высокоомный вход, то нельзя оставлять его «болтающимся в воздухе» - небольшая наводка на нем приведет к непредвиденному сбросу МК. Именно для этого и нужен R1. Для надежности рекомендую также установить конденсатор С6 (не более 20 мкФ).

SB1 – кнопка сброса.

Кварцевый резонатор и фильтрующий конденсатор C3 должны располагаться как можно ближе к МК (не далее 5-7 см), т. к. иначе могут возникать наводки в проводах, приводящие к сбоям в работе МК.

Синим прямоугольником на схеме обведен собственно программатор. Его удобно выполнить в виде провода, один конец которого втыкается в LPT порт, а другой – в некий разъем рядом с МК. Провод не должен быть чрезмерно длинным. Если возникнут проблемы с этим кабелем (обычно не возникают, но всякое бывает) то придется спаять адаптер Altera ByteBlaster. О том, как это сделать, написано в описании к программатору AVReal.

Теперь, когда разобрались с железом, пора перейти к программному обеспечению.

Для программирования AVR есть несколько сред разработки. Во-первых, это AVR Studio – официальная система программирования от Atmel. Она позволяет писать на ассемблере и отлаживать программы, написанные на ассемблере, С и С++. IAR – это коммерческая система программирования на C, С++ и ассемблере. WinAVR – компилятор с открытыми исходниками. AtmanAVR – система программирования для AVR с интерфейсом, почти «один в один» таким же, как у Visual C++ 6. AtmanAVR также позволяет отлаживать программы и содержит множество вспомогательных функций, облегчающих написание кода. Эта система программирования коммерческая, но, согласно лицензии, ее можно в течение месяца использовать «нахаляву».

Я предлагаю начать работу с IAR как с наиболее «прозрачной» средой разработки. В IAR проект целиком создается «ручками», соответственно, сделав несколько проектов, вы уже будете четко знать, что означает каждая строчка кода и что будет, если ее изменить. При работе же с AtmanAVR придется либо пользоваться предварительно созданным шаблоном, который очень громоздкий и трудный для понимания для человека, не имеющего опыта, либо иметь множество проблем с заголовочными файлами при сборке проекта «с нуля». Разобравшись с IAR, мы впоследствии рассмотрим другие компиляторы.

Итак, для начала раздобудьте IAR. Он очень распространен и его нахождение не должно быть проблемой. Скачав где-либо IAR 3.20, устанавливаем компилятор / рабочую среду, и запускаем его. После этого можно начинать работу.

Запустив IAR, выбираем file / new / workspace , выбираем путь к нашему проекту и создаем для него папку и даем имя, например, «Prog1». Теперь создаем проект: Project / Create new project… Назовем его также – «Prog1». Щелкаем правой кнопкой мыши на заголовке проекта в дереве проектов и выбираем «Options»

Здесь будем настраивать компилятор под конкретный МК. Во-первых, нужно выбрать на вкладке Target тип процессора ATMega16, на вкладке Library Configuration установить галочку Enable bit definitions in I/O-include files (чтобы можно было использовать в коде программы имена битов различных регистров МК), там же выбрать тип библиотеки С/ЕС++. В категории ICCAVR нужно на вкладке Language установить галочку Enable multibyte support, а на вкладке Optimization выключить оптимизацию (иначе она испортит нашу первую программу).

Далее выбираем категорию XLINK. Здесь нужно определить формат откомпилированного файла. Поскольку сейчас мы задаем опции для режима отладки (Debug), о чем написано в заголовке, то на выходе нужно получить отладочный файл. Позже мы его откроем в AVR Studio. Для этого нужно выбрать расширение.cof, а тип файла – ubrof 7.

Теперь нажимаем ОК, после чего меняем Debug на Release.

Снова заходим в Options, где все параметры, кроме XLINK, выставляем те же. В XLINK меняем расширение на.hex, а формат файла на intel-standart.

Вот и все. Теперь можно приступать к написанию первой программы. Создаем новый Source/text и набираем в нем следующий код:

#include "iom16.h" short unsigned int i; void main (void ) { DDRB = 255; PORTB = 0; while (1) { if (PORTB == 255) PORTB = 0; else PORTB++; for (i=0; i

Файл «iom16.h» находится в папке (C:\Program Files)\IAR Systems\Embedded Workbench 3.2\avr\inc . Если вы используете другой МК, например, ATMega64, то выбирайте файл «iom64.h». В этих заголовочных файлах хранится информация о МК: имена регистров, битов в регистрах, определены имена прерываний. Каждая отдельная «ножка» порта A, B, C или D может работать либо как вход, либо как выход. Это определяется регистрами Data Direction Register (DDR). 1 делает «ножку» выходом, 0 – входом. Таким образом, выставив, например, DDRA = 13, мы делаем выходами «ножки» PB0, PB2, PB3, остальные – входы, т.к. 13 в двоичном коде будет 00001101.

PORTB – это регистр, в котором определяется состояние «ножек» порта. Записав туда 0, мы выставляем на всех выходах напряжение 0 В. Далее идет бесконечный цикл. При программировании МК всегда делают бесконечный цикл, в котором МК выполняет какое-либо действие, пока его не сбросят или пока не произойдет прерывание. В этом цикле пишут как бы «фоновый код», который МК выполняет в самую последнюю очередь. Это может быть, например, вывод информации на дисплей. В нашем же случае увеличивается содержимое регистра PORTB до тех пор, пока он не заполнится. После этого все начинается сначала. Наконец, цикл for на десять тысяч тактов. Он нужен для формирования видимой задержки в переключении состояния порта В.



Теперь сохраняем этот файл в папке с проектом как Prog1.c, копируем в папку с проектом файл iom16.h, выбираем Project/Add Files и добавляем «iom16.h» и «Prog1.c». Выбираем Release, нажимаем F7, программа компилируется и должно появиться сообщение:


Total number of errors: 0
Total number of warnings: 0

Приведу фотографию своего программатора:

Скачиваем программатор AVReal. Копируем его (AVReal32.exe) в папку Release/exe, где должен лежать файл Prog1.hex. Подаем питание на МК, подключаем кабель-программатор. Открываем Far Manager (в нем наиболее удобно прошивать МК), заходим в эту папку, нажимаем Ctrl+O. Поскольку у нас совершенно новый МК, то набиваем

avreal32.exe +MEGA16 -o11.0592MHZ -p1 -fblev=0,jtagen=1,cksel=F,sut=1 –w

Не забудьте правильно указать частоту, если используете не 11059200 Гц! При этом в МК прошиваются т.н. fuses – регистры, управляющие его работой (использование внутреннего генератора, Jtag и т.п.). После этого он готов к приему первой программы. Программатору в качестве параметров передают используемый LPT-порт, частоту, имя файла и другие (все они перечислены в описании к AVReal). Набираем:

Avreal32.exe +Mega16 -o11.0592MHz -p1 -e -w -az -% Prog1.hex

В случае правильного подключения программатор сообщит об успешном программировании. Нет гарантии, что это получится с первого раза (при первом вызове программы). У меня самого бывает программируется со второго раза. Возможно, LPT-порт глючный или возникают наводки в кабеле. При возникновении проблем тщательно проверьте свой кабель. По своему опыту знаю, что 60% неисправностей связаны с отсутствием контакта в нужном месте, 20% - с наличием в ненужном и еще 15% - с ошибочной пайкой не того не к тому. Если ничего не получится, читайте описание к программатору, попробуйте собрать Byte Blaster.

Предположим, у вас все работает. Если теперь подключить к порту В МК восемь светодиодов (делайте это в выключенном состоянии МК, и желательно последовательно со светодиодами включить резисторы в 300-400 Ом) и подать питание, то произойдет маленькое чудо – по ним побежит «волна»!

© Киселев Роман
Май 2007

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

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

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

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

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

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

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

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

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

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

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

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

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

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

01000110
10010011
01010010

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

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

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

Арифметико-логическое устройство и организация памяти – память программ, память данных, энергонезависимая память



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

Если вы читаете эту статью, вероятно у вас возникло желание понять, как работают микроконтроллеры, и скорее всего появились вопросы:

4. Какую литературу изучать?

Попробуем ответить на эти вопросы.

1. Какой микроконтроллер выбрать для работы?

Большой популярностью у радиолюбителей пользуются 8-битные микроконтроллеры PIC фирмы Microchip Technology и AVR фирмы Atmel, 16-битные MSP430 фирмы TI, а также 32-битные микроконтроллеры, архитектуры ARM .

В промышленности, несколько иначе, первое место с большим отрывом занимает Renesas Electronics на втором Freescale , на третьем Samsung , затем идут Microchip и TI , далее все остальные.
Популярность определяется ценой и доступностью, немалую роль играют наличие технической информации и стоимость программного сопровождения.

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

2. Какую среду разработки использовать для программирования выбранного микроконтроллера?

Для AVR созданы разные интегрированные среды разработки (IDE, Integrated development environment).
IDE – это система программных средств, используемая программистами для разработки программного обеспечения (ПО), в состав которой входят:
текстовый редактор,
компилятор и/или интерпретатор,
средства автоматизации сборки,
отладчик.

Наиболее распространенные из них AVRStudio, ATmelStudio, WINAVR, CodeVision, IAR Embedded Workbench .
Для того, чтобы писать программы, мы воспользуемся бесплатной IDE ATmelStudio версии 6 и выше.
Скачать Atmel Studio можно с официального сайта после регистрации (регистрация абсолютно бесплатная и ни к чему не обязывает!)

ATmelStudio позволяет создавать проекты, и писать программы как в ассемблере, так и на СИ.

Изначально всегда стоит вопрос: какой язык программирования выбрать, чтобы писать эффективные программы?

Отвечу просто: нужно уметь писать как минимум на двух языках ассемблере и СИ. Ассемблер просто необходим, когда нужно написать быстрые и компактные подпрограммы и макросы, различные драйверы устройств. Но, когда требуется создать объемный проект, построенный на сложных алгоритмах, без знания СИ может быть потрачено очень много времени, особенно в процессе отладки, а если возникнет желание перенести на другую платформу, например PIC18, или STM, может стать неразрешимой проблемой.
Кроме этого, сейчас появились аппаратные вычислительные платформы Arduino , работа с которыми требует знаний языка СИ++.
Поэтому будем писать программы как в ассемблере, так и на СИ.

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

3. Как прошивать контроллер, и какие дополнительные приборы и акссесуары нужны для удобной работы с ними?

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

4. Какую литературу изучать?

А вот, например:
Практическое программирование AVR на ассемблере. Ревич, 2011
1000 и одна микроконтроллерная схема Вып. 1-2. Рюмик, 2010-2011
10 практических устройств на МК AVR Книга 1-2. Кравченко, 2008-2009
Самоучитель разработчика устройств на МК AVR. Белов, 2008
МК AVR семейств Tiny и Atmega. Ефстифеев, 2008
CodeVisionAVR. Пособие для начинающих. Лебедев, 2008
Микропроцессорное управление устройствами, тиристоры, реле. Белов, 2008
Аналоговые интерфейсы МК. Стюард, Болл, 2007
Создаем устройства на МК AVR. Белов, 2007
МК AVR в радиолюбительской практике. Полный разбор ATTINY2313. Белов, 2007
Сетевой и межсетевой обмен данными с МК. Иди, 2007
МК AVR. практикум для начинающих. Хартов, 2007
Применение AVR Схемы, алгоритмы, программы. Баранов, 2006
Микроконтроллеры AVR. Вводный курс. Мортон, 2006
Измерение, управление и регулирование с помощью AVR. Трамперт, 2006
Программирование на языке С для AVR и PIC МК. Шпак, 2006
Конструирование устройств на МК. Белов, 2005
МK - это же просто, тома 1-3. Фрунзе, 2002-2003
Язык программирования Си, 2-е издание. Керниган, Ритчи, 2009
Программирование микроконтроллеров ATMEL на языке С. Прокопенко, 2012

5. Где в интернете можно задавать вопросы и получать конкретные ответы?

Задавать вопросы вы можете на нашем или любом другом форуме, где так или иначе затронуты темы по микроконтроллерам. Главное на форумах правильно формулировать вопросы, чтобы четко получать ответы. Абстрактные вопросы не приветствуются, и скорее всего вместо ответа вы получите жесткую критику, или ваш вопрос останется без внимания!

Теперь рассмотрим поближе нашего фаворита, микроконтроллер ATMEGA 8

8-разрядный высокопроизводительный AVR микроконтроллер с малым потреблением
Прогрессивная RISC архитектура
130 высокопроизводительных команд, большинство команд выполняется за один тактовый цикл
32 8-разрядных рабочих регистра общего назначения
Полностью статическая работа
Приближающаяся к 16 MIPS (при тактовой частоте 16 МГц) производительность
Встроенный 2-цикловый перемножитель

Энергонезависимая память программ и данных
8 Кбайт внутрисистемно программируемой Flash памяти (In-System Self-Programmable Flash)
Обеспечивает 1000 циклов стирания/записи
Дополнительный сектор загрузочных кодов с независимыми битами блокировки
Обеспечен режим одновременного чтения/записи (Read-While-Write)
512 байт EEPROM
Обеспечивает 100000 циклов стирания/записи
1 Кбайт встроенной SRAM
Программируемая блокировка, обеспечивающая защиту программных средств пользователя

Встроенная периферия
Два 8-разрядных таймера/счетчика с отдельным предварительным делителем, один с режимом сравнения
Один 16-разрядный таймер/счетчик с отдельным предварительным делителем и режимами захвата и сравнения
Счетчик реального времени с отдельным генератором
Три канала PWM
8-канальный аналого-цифровой преобразователь (в корпусах TQFP и MLF)
6 каналов с 10-разрядной точностью
6-канальный аналого-цифровой преобразователь (в корпусе PDIP)
4 канала с 10-разрядной точностью
2 канала с 8-разрядной точностью
Байт-ориентированный 2-проводный последовательный интерфейс
Программируемый последовательный USART
Последовательный интерфейс SPI (ведущий/ведомый)
Программируемый сторожевой таймер с отдельным встроенным генератором
Встроенный аналоговый компаратор

Специальные микроконтроллерные функции
Сброс по подаче питания и программируемый детектор кратковременного снижения напряжения питания
Встроенный калиброванный RC-генератор
Внутренние и внешние источники прерываний
Пять режимов пониженного потребления: Idle, Power-save, Power-down, Standby и снижения шумов ADC

Выводы I/O и корпуса
23 программируемые линии ввода/вывода
28-выводной корпус PDIP, 32-выводной корпус TQFP и 32-выводной корпус MLF

Рабочие напряжения
2,7 - 5,5 В (ATmega8L)
4,5 - 5,5 В (ATmega8)

Рабочая частота
0 - 8 МГц (ATmega8L)
0 - 16 МГц (ATmega8)

отличия ATMEGA16 от 8
16 Кбайт внутрисистемно программируемой Flash памяти (In-System Self-Programmable Flash)

Интерфейс JTAG (совместимый с IEEE 1149.1)
Возможность сканирования периферии, соответствующая стандарту JTAG
Расширенная поддержка встроенной отладки
Программирование через JTAG интерфейс: Flash, EEPROM памяти, перемычек и битов блокировки

Четыре канала PWM / ШИМ

8-канальный 10-разрядный аналого-цифровой преобразователь
8 несимметричных каналов
7 дифференциальных каналов (только в корпусе TQFP)
2 дифференциальных канала с программируемым усилением в 1, 10 или 200 крат (только в корпусе TQFP)

Шесть режимов пониженного потребления: Idle, Power-save, Power-down, Standby, Extended Standby и снижения шумов ADC

32 программируемые линии ввода/вывода

40-выводной корпус PDIP и 44-выводной корпус TQFP

AtmelStudio

Если Вы только начинаете, то нужно скачать и установить программу AtmelStudio с официальной страницы atmel.com
После установки программы AtmelStudio можно приступить к созданию проекта.
Проект – это ваша программа, которую вы будете писать, отлаживать и прошивать, после компиляции, в память микроконтроллера.

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

и откроется страница создания проекта

Чтобы создать новый проект, нужно кликнуть по «New Project…»
В этом случае откроется новое окно, где можно выбрать язык программирования, название проекта, его месторасположение, название пакета с файлами проекта и возможность создания каталога для дальнейшего использования в других перекрестных проектах. Чтобы создать проект, где мы будем программировать в ассемблере, нужно выбрать - Assembler , после этого поменяем название проекта, его расположение, и выбираем ОК.

Появится следующее окно

Выбираем “megaAVR, 8-bit” и находим нужный нам микроконтроллер, мы выбрали ATmega8. В правой части заставки появляется список устройств, работающих с этим микроконтроллером, один из которых мы можем подключить. Выбираем ОК.

Появляется страница редактора текста, которая позволяет редактировать и отлаживать программу. Пока страница чистая, указано время и дата создания и название файла проекта, имя пользователя. Есть дополнительные окно устройств ввода-вывода, окно отчетов компиляции программы. Теперь мы


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

Урок 1

Здравствуйте уважаемые читатели!

Сегодня мы вплотную подберемся к программированию микроконтроллеров AVR собрав всё необходимое для начала работы. Итак, приступим.

Существует два пути освоения AVR. Рассмотрим каждый из них.

1.Arduino

Arduino - это электронный конструктор и удобная платформа быстрой разработки электронных устройств. То есть, плата Arduino включает в себя всё необходимое для быстрой разработки технических устройств. Она имеет в своем составе микроконтроллер AVR, его обвязку(необходимые компоненты для работы микроконтроллера), программатор(устройство для «прошивки» микроконтроллера).

Рассмотрим плюсы данного подхода :

  1. Быстрота начала разработки. Купив данный продукт, Вы можете сразу перейти к началу работы с микроконтроллером, без дополнительной подготовки.
  2. Низкий порог вхождения. Вам не нужны какие либо специальные умения и навыки чтобы начать разрабатывать технические устройства.
  3. Широкий спектр подключаемых «шилдов»(то есть плат расширения, включающих в себя готовые к использованию,легко подключаемые внешние устройства.).
  4. Поддержка сообщества. В интернете Вы найдете множество уроков и задач основывающихся на применении платформы Arduino.

Однако существуют минусы, которые перевешивают положительные стороны платформы Arduino :

  1. Купив Arduino, Вы лишаетесь возможности глубже окунутся в мир AVR, узнать что такое программатор, необходимая обвязка и многое другое.
  2. Узкая линейка моделей. Очень часто необходимо выбирать конкретный микроконтроллер для конкретной задачи. К сожалению, Arduino не сможет предоставить Вам спектр моделей под все мыслимые и немыслимые задачи. И рано или поздно Вы столкнетесь с необходимостью использования микроконтроллера которого нет в линейке плат Arduino.
  3. Другой язык программирования. Язык программирования платформ Arduino, значительно отличается от стандартных AVR C, AVR ASM.То есть,возникает необходимость перехода на Arduino IDE и изучения языка Arduino.

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

2.Самостоятельная сборка.

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

Плюсы данного подхода:

  1. Глубина погружения.Вы узнаете намного больше, собрав всё необходимое самостоятельно, получите множество полезных знаний и умений.
  2. Возможность самостоятельного выбора комплектующих для решения поставленной задачи.
  3. Стандартные языки AVR C/AVR ASM.Возможность выбора удобной Вам среды программирования.Огромная база знаний и уроков по данным языкам.
  4. Дешевизна.Зачастую(но не всегда), бывает достаточно выгодно отказаться от готового решения, и собрать всё самостоятельно.

Минусы данного подхода:

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

Но нас не пугают сложности, потому что пройдя их мы узнаем много нового и полезного!

Итак,приступим к сбору необходимых вещей для начала работы.

1.Микроконтроллер.

2.Программатор.

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