Atmel Studio 6. Создание HEX-файла

29.10.2015 18:49

В одной из прошлых статей мы с вами разобрали, как работать в программе CodeVisionAVR. У этой программы есть много плюсов, но на мой взгляд программировать в ней несколько проще, чем в редакторе кода WinAVR и в программе отладчике AVR Studio 4. В КодВижне используется не чистый СИ, а модифицированный, что не есть гуд. Поэтому, следуя пожеланиям читателей, мы будем вести разработку в более современной и удобной программе: Atmel Studio 6.

 

У нее есть один существенный недостаток, который не позволяет воспользоваться этой программой на относительно слабых машинах. Это программа очень ресурсоемкая и она будет сильно тормозить на слабых компьютерах с двухъядерным процессором младших моделей и 2 гигабайтами ОЗУ. Сразу скажу, владельцы старых моделей компьютеров не будут забыты и для них будут выпущены обзоры по программам WinAVR и AVR Studio 4, чтобы они не чувствовали себя в чем-то ущемленными. Эти программы очень слабо нагружают процессор и требуют намного меньше памяти для работы.

 

Итак, перейдем к делу. Данная программа является полностью бесплатной и скачать её можно как с официального сайта Atmel, так и с торрент трекера, например Rutracker.org. После установки и запуска программы открывается окно приветствия и мастера создания проектов. Окно приветствия и мастер создания проектов мы закрываем. В работе эта функция совершенно бесполезна.

В результате остается одна рабочая область (кликните для увеличения картинки):

 

 

 

Для того, чтобы создать прошивку, то есть тот самый HEX файл, мы должны написать код, скомпилировать его и “собрать” проект. После этого у нас в папке с проектом, появится нужный нам файл с расширением *.HEX. Давайте разберем, как это делается на практике. Погнали!

 

Для создания проекта мы нажимаем в левом верхнем углу кнопки File => New => Project:

 

 

И видим следующее окно:

 

 

Здесь нам нужно выбрать С\С++ и GCC C Executable Project:

 

Не спешите нажимать "ОК" и закрывать окно. В графе "Name" мы видим, что программа подставила нам имя проекта автоматом. В данном случае это GccApplication1. Также мы можем выбрать папку, в которую мы сохраняем проект:

 

 

Так как имя файла мне не нравится, то меняем его на Studio_6_Lesson_1. Путь для сохранения проекта я оставил по умолчанию. В данном случае в папке 6.2 у нас создастся папка с названием Studio_6_Lesson_1. В ней и будут находиться все необходимые нам файлы, имеющие отношение к нашему проекту:

 

 

Ну а теперь  жмем ОК. Что мы видим дальше? А дальше открывается следующее окно:

 

Так как мы с вами договорились использовать МК Tiny 2313, то нам нужно выбрать именно эту модель. Для этого выбираем семейство Tiny, 8-bit.

 

 

Ну а потом  выбираем наш МК Attiny 2313:

Здесь же можно вкратце ознакомиться с характеристиками на данную модель МК, узнать объем Flash памяти, ОЗУ, и EEPROM памяти. Также здесь можно скачать Даташит на данную модель МК и ознакомиться со всеми характеристиками этого микроконтроллера.

 

После того как выбрали, жмем ОК. Перед нами открывается рабочее окно программы (для увеличения кликните мышкой)

 

 

А вот и самое главное окно:

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

 

Что же мы видим здесь?

Строки 1...6 -  это у нас комментарии. Все комментарии бывают выделены зеленым цветом в отличие от кода программы, переменных, функций, и т. д. В комментариях мы видим название исходника на СИ нашего проекта: файл Studio_6_Lesson_1.с. В нем хранится наш код и его мы можем, если хотим, посмотреть и уточниться, чтобы не открывать каждый раз тяжелую для запуска студию. Открывать в том же блокноте Wordpad.

 

 

Итак, давайте разберем, что же обозначают все остальные строчки. Читаем комментарий, идущий после кода в каждой строчке. Комментарии у нас отделяются от кода, двумя символами знака деления(//). Правильно же это называется прямой двойной слэш.

 

Идем дальше.

Что же мы видим? Смотрим строку под номером 9. С нее начинается сама программа:

#include //Подключаем библиотеку аппаратных описаний МК

Эту строчка должна присутствовать абсолютно в любом проекте на любом МК AVR Mega и Tiny. Смысл этих команд я написал в комментариях, идущих после команды.

 

Здесь я хочу сделать небольшое отступление и разобрать отличия Atmel Studio 6.2 от той же WinAVR. В шестой студии есть очень удобная функция. Называется она автоподставления команд. Проявляется это в том, что как только мы начали набирать команду известную Студии, она сама предложит нам все возможные варианты команд на выбор, какие только есть в её памяти по нескольким первым буквам.

Нам достаточно нажать лишь клавиши ТАВ или ENTER и команда у нас подставится автоматически.

 

Разбираем строчку №10

Этой строчкой мы объявлем библиотеку задержек

#define F_CPU 8000000UL //Устанавливаем частоту для компилятора

 

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

 

Идем дальше. Смотрим строчку №11:

#include //Подключаем библиотеку задержек

Этой командой мы “говорим” МК, что у нас в программе будет использоваться функция задержек работы микроконтроллера, или иначе говоря, режима холостой работы. В это время не будут выполняться никакие другие действия. На какое-то заданное время, МК, условно говоря, для нас как-бы зависнет.

 

Идем дальше. Мы видим строчку int main(void) //Основное тело программы под строкой №13:

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

Также можно увидеть и фигурные скобки для while. Открывающая скобка находится в строке 16, а закрывающая в строке 18.

 

 

Давайте напишем программу для мигания одним светодиодом. Для этого добавляем строчки:

 

PORTB=0b00000000; //Притягиваем все 8 выводов порта В к 0

Восемь цифр означают, что у нас 8 выводов порта В. Крайний правый - это В0, крайний левый - В7. Это обозначение означает 8 нулей после 0b, что по умолчанию у нас на всех выводах-ножках порта В установлен логический ноль, или говоря по-другому, они притянуты к нулю. Если говорить очень упрощенно, то это все равно, что они внутри МК соединены с землей устройства.

 

DDRB=0b11111111; // Конфигурируем все выводы порта В на выход

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

 

Далее идет собственно программа (кликните для увеличения):

 

PORTB=0b00000001; //Подаем на порт В0 логическую единицу (зажигаем светодиод)

Итак мы видим, что крайняя справа у нас стоит единичка. Как мы помним из выше сказанного, это значит что мы на порт В0 вывели 1, или по другому говоря, на этом выводе у нас сейчас +5 вольт.

 

_delay_ms(500); //Ждем 500 миллисекунд (0.5 секунды)

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

Что означают ниже приведенные две строчки кода, вы наверное уже догадались сами:

PORTB=0b00000000; //Подаем на порт В0 логический ноль (гасим светодиод)

_delay_ms(500); //Ждем 500 миллисекунд (0.5 секунды) Мы подаем ноль на ножку В0 и затем ждем пол секунды.

 

 

Но такая программа у нас длилась бы всего секунду, а что потом? А потом нам нужно вернуться к началу нашего бесконечного цикла, который мы объявляем командой While:

 

while(1) //Начинаем бесконечный цикл

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

И наконец, в конце нашей программы мы видим две фигурные скобки, по одной на каждый цикл программы, основной и бесконечный через While, читаем комментарий к последней скобке:

} //Возвращаемся к началу выполняемого тела программы, к строке 13

 

 

Уфф))… программа вроде бы написана, но как скормить этот код микроконтроллеру? Он же не понимает код, написанный в понятных нам словах и командах? А для этого нам нужно сначала скомпилировать прошивку. Делается это следующим образом.
Кликаем Build=>Compile и прошивка у нас будет скомпилирована.

 

 

Жмем Build=>Build Studio_6_Lesson_1 и считаем количество ошибок)), а они при самостоятельном написании первой программы скорее всего будут у начинающих кодеров.

 

 

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

Она означает, что в нашем проекте Студия ошибок не сумела найти. Но это не означает, что ваша прошивка автоматом будет работать, как вы рассчитывали, Студия просто проверила код на соответствие основным правилам написания кода и чем смогла - помогла.

 

 

Итак где же - где же наш долгожданный HEX файл, который нам уже не терпится прошить в наш микроконтроллер)? Проще всего открыть папку с нашим проектом, в которой и будет находиться наша прошивка. Жмем File=>Open=>File и попадаем в папку с нашим проектом.

 

 

В той папке, где лежит проект,  у нас находится исходник на СИ

Все, теперь этот файл можно скармливать как любому программатору для МК AVR, так и программе Proteus, если вы вдруг захотите перед сборкой конкретного устройства посмотреть, как это будет выглядеть в эмуляторе. Работу в эмуляторе Proteus можно прочитать в этой статье.

Прикпреляю к проекту файл Студии, HEX-файл, а также схему в Протеусе. Скачать можно здесь.

 

Для тех, кому лень читать, мы сделали небольшой видос ;-)

 

Читайте также:

Работа в CodeVisionAVR. Написание первой программы

 

Эмуляция проекта на МК AVR в программе Proteus

 

Особенности выбора МК для проектов