Свежие обсуждения
Микроконтроллеры

Ликбез по программированию AVR

1 10

Ликбез по порграммированию PIC у нас уже есть , теперь поработаем с AVR. Предпосылки к созданию этой темы здесь.
Для разогрева предлагаю сделать такое же устройство, как мы сделали в своё время на PIC.

Техзадание (учебное):
Разработать устройство управления четырьмя светодиодами с управлением от четырех кнопок. В устройстве применить микроконтроллер AVR. Обеспечить: при нажатии на кнопку 1 зажигание светодиода №1, при нажатии на кнопку 2 зажигание светодиодов №1 и №2 одновременно, на кнопку 3 - №1, №2 и № 3, на кнопку 4 - всех четырех. Кнопки однополюсные без фиксации. При всех отпущенных кнопках светодиоды гореть не должны. При двух (и более) одновременно нажатых кнопках также не должны. Тактовый генератор внутренний. Кнопки подключить к "общему" проводу, светодиоды к шине питания.

На первом этапе нам предстоит выбрать конкретный МК и среду для программирования и отладки, где и будем работать. Для PIC это был MPLAB, а в дальнейшем связка MPLAB + CCS PICC + PROTEUS. Нечто подобное созреет и здесь.
В первом проекте программный код будет играть, очевидно, второстепенную роль. Главное для начала - получение и закрепление навыков работы с выбранной средой. Научимся создавать проект, создадим начальный код для выбранного МК. Затем напишем программу и отладим её. Для первого проекта неплохо бы написать программы как на асме, так и на Си. В дальнейшем, видимо, будем отдавать предпочтение Си. Впрочем, не буду забегать вперёд.
Итак, первый шаг. Выбор МК. Я бы, наверно, выбрал ATMega16. Выбор среды для программирования и отладки. Тут хотелось бы узнать мнения опытных АВРщиков.

 

Непло было бы для начала пару ссылочек с коментариями чтобы, так сказать, теорию чайнику освоить. Ну, на подобе самоучителя Карабейника для ПИКов, он мне очень понравился. К сожалению для АВРор такого не нашел. Может кто знает?
Если в ПИКах/Асме еще кое что..., то в AVR/Си - чайник без ручки.

 

Для написания проги на асме достаточно будет AVRStudio,имхо.НЕобходимый инструментарий она содержит.

 

А для отладки?

Полезная литература
http://lord-n.narod.ru/walla.html#razdelMCU
Для начала полезно почитать книгу В.Н. Баранова
И книгу А.В. Евстифеева, она должна быть в файлообменнике, ссылки тут

 

в качестве среды для написания кода предлогаю для начала вин авр
он имеет простой редактор мейкфайлов и простой текстовой редактор

для отладки протеус самое то
в вмлаб надо руками писать все соединения
в авр студии нет наглядности и все дело представлено квадратиками

в дальнейшем можно уже будет использовать связку гцц и студию или вмлаб

в качестве мк надо брать мега8
ее цена 1.60, а мега16 стоит почти 4 евры
мега8 имеет всю периферию 16, только памяти поменьше

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

 

Господа, пусть каждый описывает то, что считает нужным. Начинаю:

Блиц-введение в инструментарий. Представим, что у нас на компе установлен AVRStudio 4

1. Начинаем работу, т.е. запускаем AVRStudio. Обычно при запуске он спрашивает, будем ли мы работать с новым проектом, либо загрузим ранее созданный. В окне, которое он вываливает на экран, нажимаем кнопку "New project". Если при запуске такого окна не появилось, заходим в меню Project->New project.

2. Выбираем в появившемся окне тип проекта. В данном случае "ATMEL AVR Assembler". После выбора становятся доступными поля "Project name" и "initial file". Задаем имя проекта, например "example1" (это имя автоматически дублируется в поле Initial file). После этого обязательно нажимаем кнопку с тремя точками "..." и указываем в появившемся окне папку, где будет храниться проект. Как это сделать, думаю, разобраться несложно, единственный совет - ни сама папка, ни папки, в которые она вложена, не должны содержать в названиях русских букв (если не хотите получить геморрой на этапе компиляции).

3. После описанных действий нажимаем кнопку "Next>>", при этом на экране появляется список отладчиков, с помощью которых можно вести отладку программы. Выберем для определенности AVR Simulator, поскольку он не требует никакого дополнительного железа, при этом во второй половине окна появится список моделей микроконтроллеров, с которыми он работает. В данном случае выбираем в списке "ATMega16" (как просили), после чего нажимаем кнопку "Finish".

4. С этого момента на левой половине экрана у нас появляется окно-навигатор в обычном для Windows стиле, а на правой - окно с открытым файлом "example1.asm". В нем и будем писать нашу программу. Для начала напишем следующее:

.include "m16def.inc"
ldi r16,0x0F
out DDRB,r16
xxx: rjmp xxx

В смысловом плане код абсолютно бессмысленный, но нам нужно просто пройти все этапы работы.

5. Компиляция написанной программы выполняется клавишей F7 или через меню Build->Build. Будем надеяться, что она прошла успешно.

6. Запуск программы в режиме отладки выполняется комбинацией клавиш Сtrl+Shift+Alt+F5 (во как!) либо через меню Debug->Start Debugging. при успешном запуске на левой половине экрана вместо навигатора появится дерево аппаратных компонент ATMega16 (регистры, стек, порты ввода-вывода). Обычно этого вполне достатно для отладки, но, если какой-то информации будет не хватать, через меню "View" можно открыть дополнительные окна отладчика. Я обычно открываю окно с регистрами (View->Register).

7. Откроем в дереве метку "registers 16-31" и нажмем клавишу F10 (выполнение одной инструкции). Регистр r16 должен подсветиться красным(изменилось содержимое) и стать равным 0x0F. То же самой произойдет и в окне с регистрами, если оно открыто.

8. Откроем в дереве метку I/O ATMEGA16->PORTB. В ней содержатся три строки, соответствущие трем регистрам порта B. Нажимаем клавишу F10. Регистр DDRB (регистр направления передачи) должен подсветиться красным и в нем должно появиться 0x0F.

9. Дальнейшая отладка производится в том же ключе. Для завершения отладки нажимаем комбинацию Ctrl+Shift+F5.

10. Для завершения работы с AvrStudio4 вначале нажимаем кнопку с кучей дискет (сохранение всех файлов), затем Alt+F4.

Работа с инструментом очень несложная. Попробуйте проделать все вышеописанное. Потом будем двигаться дальше.

ЗЫ. Спорить о том, что лучше, а что хуже, смысла не вижу. Не критикуйте мой выбор, а описывайте работу в другой среде.

 

описываю работу в картинках в двух средах
вин авр и дев с++ для обычного пк
http://slil.ru/24958845

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

 

Итак, начинаем писать программу. Понятно, что программа будет состоять из двух этапов - первоначальной инициализации контроллера, и, собственно, алгоритма обработки. Выберем для определенности, что кнопки подключены к линиям порта С[0]..C[3], а светодиоды - к линиям порта C[4]..C[7] соответственно (так будет интереснее работать со вводом/выводом ).

Одна из наиболее простых реализаций данной задачи - табличный способ программирования. Он - наименее экономен по памяти, но наиболее быстрый по скорости работы. Лично я всегда стараюсь применять при работе с AVR именно его - на мой взгляд, все без исключения AVR-ки сильно несбалансированы по соотношению объемов памяти программ/памяти данных: ОЗУ и регистры в них заканчиваются заведомо быстрее, чем память программ (это, разумеется, IMHO), так что ее можно особо не экономить. Вот как, в данном случае, выглядит табличный способ:

Поскольку кнопки подсоединены между общим проводом и линями порта, при всех отпущенных кнопках на младших линиях порта С будет код 0x0F, при нажатии первой кнопки - код 0x0E, при нажатии второй кнопки - код 0x0D, при нажатии третьей кнопки - код 0x0B, четвертой - 0x07. Поскольку светодиоды подсоединены между шиной питания и линиями порта, при выводе в порт С кода 0xFF все они будут погашены. Для зажигания одного светодиода надо вывести в порт код 0xEF, для зажигания двух светодиодов - код 0xCF, для зажигания трех светодиодов - код 0x8F, для зажигания четырех светодиодов - код 0x0F. Вот как будет выглядеть наша таблица соответствия комбинаций кнопок и комбинаций светодиодов:

0x0F - 0xFF
0x0E - 0xEF (кн.1 - 1-й светодиод)
0x0D - 0xCF (кн.2 - 1-й и 2-й светодиод)
0x0C - 0xEF (при нескольких нажатых кнопках светодиоды гореть не должны)
0x0B - 0x8F (кн.3 - 1-й, 2-й и 3-й светодиод)
0x0A - 0xFF (при нескольких нажатых кнопках светодиоды гореть не должны)
0x09 - 0xFF (- " -)
0x08 - 0xFF (- " -)
0x07 - 0x0F (кн.4 - 1-й--4-й светодиоды)
0x06 - 0xFF (при нескольких нажатых кнопках светодиоды гореть не должны)
0x05 - 0xFF (- " -)
0x04 - 0xFF (- " -)
0x03 - 0xFF (- " -)
0x02 - 0xFF (- " -)
0x01 - 0xFF (- " -)
0x00 - 0xFF (- " -)

Теперь осталась самая малость - подготовить к работе порт C, считывать с него в цикле комбинацию состояний кнопок, найти им соответствие комбинаций светодиодов в таблице, и вывести их на порт. Дребезг кнопок пока не обрабатываем - полагаю, это будет второй частью задания Текст программы с комментариями - в прикрепленном файле. Создаем проект с именем example2, копируем через буфер обмена в окно с файлом example2.asm то, что прикреплено к топику, компилируем (клавиша F7) и запускаем в режиме отладки (Ctrl+Shift+Alt+F5) программу. Нажимая F10, доходим до команды "in", открываем в навигаторе слева ветку I/O ATMega16-->PORTC, щелкая мышкой, устанавливаем в регистре PINC все "кубики" черным (это соответствует всем отпущенным кнопкам), и, нажимая F10, проходим один цикл работы программы. Перед следующим выполнением команды "in" изменяем мышкой "младшие" кубики в регистре PINC (это будет соответствовать нажатию тех или иных кнопок) и убеждаемся, что программа реагирует на это в соответствии с заданием.

Теперь - немного дифирамбов табличному методу. Какие бы хитрые комбинации условий на кнопки ни были заданы, они будут однозначно соответствовать одному из элементов таблицы. При изменении в задании комбинаций кнопок (например, при нажатии первой и второй кнопки одновременно должен загореться первый и четвертый светодиод) я просто исправлю соответствующий элемент в таблице table, не трогая саму программу. Для программы это - серьезный плюс, поскольку не требуется изменять логику ее работы. Кстати, и размер ее при этом не изменится!

112251.asm

 

Неплохо бы нам нарисовать схему девайса с применением AVR, а также сделать "шапку" - начальную часть кода, как было сделано нами тут.

 

Завтра обязательно будет, сегодня уже не смогу