Итак, Вы только что сделали свой первый «классный» программатор, вспомнили как работает микропроцессор. И у вас возник вопрос: как написать программу, откомпилировать ее, отладить? Не в блокноте же? Для этого корпорация ATMEL предоставила своим потребителям программную среду AVRstudio. Этот продукт совершенно бесплатный, и всегда можно приобрести новую версию на официальном сайте ATMEL atmel.com или atmel.ru. Вспомним из курсов программирования, что прежде чем программу включить в работу, ее нужно откомпилировать, отладить. Компилятор – это такой узел в программном обеспечении, который проверяет программу на наличие ошибок синтаксиса, какие-то некорректности и делает из исходного текста программы HEX- код (переводит текст программы в шестнадцатеричную систему кодирования). Более грамотно – это программа, которая транслирует понятный нам язык нашего проекта, в язык понятный для машины. Или проще - это трансляция исходного кода в HEX-код. Этот HEX- код и является тем самым кодом, который потом будет зашит в память программ МК. Отладка – это процесс проверки нашей программы на наличия не корректностей. В AVRstudio этот процесс представлен внутрисхемной симуляцией работы данной программы в МК. Очень удобная вещь! Здесь мы видим все, что творит наша программа с периферией МК. И если все идет ни так, значит смотрим внимательно программу и ищем эти подводные камни. Ну что ж перейдем к установки AVRstudio. Установка этой программы ничем не отличается от установки стандартных программ, которые Вы привыкли устанавливать на свой ПК. Установка идет по принципу «далее- далее- далее- готово». Одно стоит уточнить, для корректной работы AVRstudio, устанавливать программу стоит как можно ближе к корневой папке и путь к установленной программе не должен содержать кириллицу (русские буквы). Например, так это должно выгладить D:\Program Files\Atmel. Все программные проекты также должны иметь названия, состоящее из английских букв и путь к ним не должен встречать русские буквы. Что-то типа такого: D:\Program Files\Atmel\My_programm_1. Теперь Вы готовы к созданию первой программы. 1. Запустите программу AVRstudio. Первое, что Вы увидите после запуска, это окно приветствия (Рис 1). Тут вы можете выбрать проект, если он был ранее создан (кнопка Open), либо создать новый (нажатием кнопки New Project ). Наша задача научится создавать программы, поэтому кликнем по кнопке New Project.
Рисунок 1 Окно приветствия AVRstudio
2. После нажатия кнопки New Project появилось другое окно (Рис 2), в котором осуществляется присваивание названия нашему будущему проекту. Для этого мышкой выберем тип проекта (Project type), а именно строку Atmel AVR Assembler , как это показано на рисунке 2. После чего окна Project name и Initial file станут активными и в них можно вписать названия своего проекта (Рис 3). Имя проекта также не должен содержать буквы и символы кирилицы, пробелов и некоторых других символов.
Рисунок 2 Окно AVRstudio «Названия проекта»
Галочки Create initial file и Create folder я обычно ставлю. По их установки Ваш проект будит розмещен в отдельной папке с таким же названим. Так удобнее. Нажимаем далее (Next). 3. После того, как Вы придумали имя своему проекту и нажали далее, появится последнее окно для инициализации рабочей области проекта. Это окно рисунок 4 выбора микроконтроллера, который вы собираетесь программировать. В левой области выбираем AVR simulator, а в правом окне нужный микроконтроллер. Для начало предлагаю выбрать МК ATtiny2313. Это самая популярная микросхема AVR из семейства Tiny. Но если вы выбрали другую например ATmega8535, то от этого набор команд не поменяется. Attiny2313 - это МК, который хорошо зарекомендовал себя. Его достоинства в нашем случае в том, что он не дорогой около 2-4 $ , не перегружен периферией, удобный в эксплуатации.
Рисунок 3 Тут мы даем имя своему проекту
Рисунок 4 Окно выбора микрочипа
И так выбрали. Кликнем Finish и вот что у нас появиться (Рис 5). Рассмотрим рабочее окно детальнее, после чего приступим непосредственно к написанию программы. Поговорим немного о структуре окна (Рис. 5): 1- Окно проекта. Включает в себя все файлы задействованные в текущем проекте. Для нас это окно побольшей мере бесполезное на всем протяжении написания и отладки программы. Позже, после создания текста программы, это окно сменится на более интересное и информативное. Но а пока вот такое вот окно. 2- Наиболее важное окно на мой взгляд. Оно нам пригодиться на этапе отладки программы. Здесь приведен весь набор периферии и самого процессора. Во время отладки мы пошагово будем наблюдать в этом окне реакцию всех узлов МК на текущую команду. Другими словами это эмуляция работы вашей программы. Якобы, будет работать программа в здесь, значит будет работать и в реале. 3- Просто окно. Я туда засунул окно, в котором можно просматривать состояния ОЗУ, ПЗУ, РОН и РВВ; все их ячейки на наличия данных в них. Оно (окно ) появится, также на этапе отладке. Поэтому наберемся терпения. 4 – Еще одно важное окно-сообщение. Снизу него Вы заметите 4 вкладки Build, Massage, Find and Files, Breakpoints and Tracepoints. Для нас наиболее важные сейчас первые две вкладки. Build – предназначена для вывода статистики о программе (сколько наша программа затратила ресурсов МК, в частности той или иной памяти). Massage – эта вкладка окна используется для вывода информации, которая показывает нам наши ошибки в программе после компиляции. 5- Тут Вы пишите программу. 6- Панель управления. О ней позже. 7- Обратите внимания, тут выводиться названия того МК, который мы выбрали. Вот и все пока, что касается структуры. А теперь программа.
Рисунок 5 Рабочая область для программирования МК
Поставим задачу. Написать программу, которая управляла выводами МК. Например, пусть на выводах порта В (8 пинов) нам нужно установить код 10101010. То есть наша программа должна заставить микроконтроллер вывести на лини порта В такие значения, как показаны на рисунке 6. Ни секрет, что логическая «1» согласно TTL логике это 3,5 - 5В (высокий уровень), а логический «0» - 0 - 1В. Если программа правильно работает, вы можете с легкостью измерить на выходах порта вольтметром состояния его пинов (выводов). Программа будет состоять из служебных команд и комментариев, которые, как правило, пишут после символа «;». Служебные коанды в программе имеют цвет ярко-синего, коментарии - бледно-зеленого, все остальные слова (метки, имена регистров) не выделенны цветом. Поэтому не удивляйтесь, если ваша команда,например, add имеет стандартный не окрашеный цвет, а ищите ошибку. Вероятнее всего такую команду вы написали с русской буквой "а".
Рисунок 6 Внешний вид микросхемы МК Tiny2313 с назначением ее выводов
Теперь наша программа. Ее исходный код приведен ниже. Исходный код- это то что мы написали, это весь алгоритм работы нашего МК написанный на языке программирования. HEX-код - это тот код, который образовался в результате ассемблирования исходного кода и используется для прошивки памяти МК. То есть это та же программа только в 16-ричном коде. Из этого следует , что разобраться в исходном коде можно, а в HEX - невозможно. Наша программа написана на языке низкого уровня Ассемблер. Достоинства и недостатки данного языка рассмотрены в разделе "С чего начать?". Вы можете скопировать приведенный программный код и вставить себе в рабочее окно AVRstudio или честно набрать код вручную. А теперь читаем следующие абзацы и поглядываем на текст программы. Все программы в ассемблере начинаются с директив .include (! Заметьте, все директивы начинаются с точки в начале). Компилятор поддерживает ряд директив. Директивы не транслируются непосредственно в код. Вместо этого они используются для указания положения в программной памяти, определения макросов, инициализации памяти и т.д. Директива include подключает необходимый файл (в данном случае tn2313def), в котором приведены все регистровые имена, таблицы прерываний и их адреса. Этот файл необходим компилятору. Соответственно если мы собираемся прошивать Atmega8535, то эта деректива будет выглядить так .include "m8535def.inc" Встретив директиву include компилятор открывает указанный в ней файл, компилирует его пока файл не закончится или не встретится директива EXIT, после этого продолжает компиляцию начального файла со строки следующей за директивой include. Вложенный файл может также содержать директивы include. Если вам интересно что находится в этом файле, который подключает эта деректива, вы можете зайти в папку Atmel с установленным AVRstudio и найти данный файл в папке AVRAssembler. Директива .list включает генерацию листинга. Директива list указывает компилятору на необходимость создания листинга. Листинг представляет из себя комбинацию ассемблерного кода, адресов и кодов операций. По умолчанию генерация листинга включена, однако данная директива используется совместно с директивой nolist для получения листингов отдельных частей исходных файлов. Директива .def присвоения символического имени регистру. Тут можно обозвать регистр как вам удобно и потом уже обращаться к этому регистру по новому имени. В программе я обозвал регистр R16 как Peremen_1. И всякий раз, когда я обращаюсь к этому имени, процессор знает, что я имею ввиду регистр R16. Близкий друг директивы .def, является директива .equ - присвоения имени константе. Директива .cseg - программный сегмент. Директива cseg определяет начало программного сегмента постоянной памяти. Ее соседи .dseg, .eseg определяют сегмент в ОЗУ и ЕЕПРОМе. И так этой директивой в нашей программе мы указали расположить всю программу в сегменте постоянной памяти программ. Директивой .org мы указываем с какой ячейки памяти начинать располагать нашу программу. Директива org устанавливает счётчик положения равным заданной величине, которая передаётся как параметр. Для сегмента данных она устанавливает счётчик положения в SRAM (ОЗУ), для сегмента программ это программный счётчик, а для сегмента EEPROM это положение в EEPROM. Если директиве предшествует метка (в той же строке) то метка размещается по адресу указанному в параметре директивы. Дальше в программе идет перечень векторов прерываний, которые имеются в этой микросхеме. На память их знать не нужно, а где их можно достать знать полезно. В том же файле def tn2313.inc в самом низу текста имеется перечень векторов прерываний (Interrupt Vectors ). У меня этот файл находится вот под таким адресом D:\Program Files\Atmel\AVR Tools\AvrAssembler\Appnotes , у вас приблизительно тоже. !!! О том что было описано выше (о директивах и прерываниях) глубоко не нужно вникать, его достаточно при каждом новом проекте, для начала, просто копировать и вставлять. Потом со временем понимание всех этих моментов придет. А сейчас главное понять, это команды и алгоритмы. Теперь перейдем к работе c AVRstudio. Перед вами открыто приложение и набран текст программы, как показан на рисунке 7. Для начинающих совсем не обязательно использовать таблицу прерываний в первом проекте. Ее можно опустить. Но лучше привыкаете сразу к верным написаниям программы.
Рисунок 7 Так у нас выглядит программа в AVRstudio Полюбовались? Теперь нажмем кнопку F7 (компиляция). В нижнем окне сообщений появится сведения о компиляции (рисунок 8). Тут указано сколько програма написаная вами, занимает место в памяти МК. Однако, появится это окно в том случае если в программе отсутствуют ошибки. Если таковы имеются, то выводится сообщение об ошибке (какая ошибка допущена и где ее искать). Мы видим, что наша программа занимает 50 байт в памяти програм из 2048байт то есть 2,4%. Теперь переходим к отладке. Для этого необходимо нажать кнопку на понеле задач Start Debagging или Ctrl+Shift+Alt+F5. Скорее всего, произашло много изменений в ваших окнах. Теперь ваше главное окно, с которым вы активно работаете и получете информацию о корректности вашей программы, это окно I/O Viev. У меня на рисунке 7 это окно находится слева.
Рисунок 8 Окно сообщения после компиляции
Мы буде отлаживать программу пошагово. Если все правильно, возле команды rjmp появилась желтая стрелочка, которая показывает , что исходно после запуска МК будет читать процессор. Нажмем кнопку F11 (шаг ). Процессор перешел к обработки следующей команды. Проследите, чтобы все выполнялось как задумано нами. Если это команда rjmp RESET, то соответственно процессор должен перебросится на метку RESET. Кратко поясним алгоритм работы программы. После перехода на метку RESET первым делом инициализируем стековую область, затем инициализируем наш порт, чтоб он работал на выход (запись лог «1» в регистр DDRB). После того на порт можно посылать константы , которые он будет отображать в качестве 0 и 1 на своем выходе. А дальше идет тупой цикл, в котором процессор просто зацикливается. А что делать, работы ж больше для него нет. В окне Processor можно отследить много интересного, например, количество времени затраченного на ту или иную команду или на программу в целом, количество тактов, текущее состояния указателя адреса программ и тд. В окне I/O Viev представлена вся периферия МК и ее текущее состояние. Делаем еще шаг за шагом и наблюдаем как изменяются состояния порта В, как это показано у меня на рисунке 9.
Рисунок 9 Тут мы видим что в наш порт загрузились данные 10101010. Тут закрашеные биты регистров означают лог."1", а незакрашеные лог."0".
Теперь, если у вас все вышло точно так как показано на рисунке 9, значит я вас могу поздравить с первым удачным проектом в AVRstudio. Смело можете брать ваш программатор и через специальную программу (об этом поговорим в разделе "Программатор") заливать программу в микроконтроллер. Тогда вы можете убедится в работоспособности программы уже не в симуляторе, а при помощи вольтметра, светодиодов, осцилографа, щупов и тд. Что касается пояснения программы, с этим мы подробно разберемся в курсе, данной тематике. Если есть какие-то предложения или исправления, коментируем. Кстати, по поводу приобретения свежей версии AVRstudio вы всегда можете скачать ее бесплатно на фирменном сайте корпорации ATMEL http://atmel.com/dyn/Products/tools_card.asp?tool_id=2725 или на этом сайте.
rjmp RESET .org INT0addr ;External Interrupt0 reti .org INT1addr ;External Interrupt1 reti .org ICP1addr ;Input capture interrupt 1 reti .org OC1Aaddr ;Timer/Counter1 Compare Match A reti .org OVF1addr ;Overflow1 Interrupt reti .org OVF0addr ;Overflow0 Interrupt reti .org URXC0addr ;USART0 RX Complete Interrupt reti .org UDRE0addr ;USART0 Data Register Empty Interrupt reti .org UTXC0addr ;USART0 TX Complete Interrupt reti .org ACIaddr ;Analog Comparator Interrupt reti .org OC1Baddr ;Timer/Counter1 Compare Match B reti .org OC0Aaddr ;Timer/Counter0 Compare Match A reti .org OC0Baddr ;Timer/Counter0 Compare Match B reti .org USI_STARTaddr ;USI start interrupt reti .org USI_OVFaddr ;USI overflow interrupt reti .org ERDYaddr ;EEPROM write complete reti .org WDTaddr ;Watchdog Timer Interrupt reti
RESET: ldi R20,RAMEND ; инициализация стека out SPL,R20 ; ------------------- ldi Peremen_1,0b11111111;инициализация порта В на выход out DDRB, Peremen_1 ; -------------------
ldi Peremen_2,0b10101010;вывод данного на ножки порта out PORTB,Peremen_2 ; -------------------