Работа с avr studio 4

Работа с avr studio 4

Для работы с AVR Studio 4 необходимо само собой её установить. Если она уже установлена, то можете пропустить этот шаг.

Установка:
создаешь каталог c:/avr/ – тут будут лежать рабочие программы.
создаешь каталог например c:/works/ – тут будут лежать твои работы.
надо что бы были короткие пути, что бы не было проблем с ними.

Дальше, качаешь и устанавливаешь в каталог c:/avr/
WinVR
AVRStudio4_SP3

Есть вообще AVRStudio5 но и AVRStudio4 пока вполне хватает.

Вся работа будет проходить в AVRStudio4, WinAVR нужна только из-за библиотеки AVR-GCC (Для того, что бы можно было писать на Си)
НО! первым надо установить именно WinAVR , иначе библиотека AVR-GCC не подцепится.

Дальше запускаешь AVRStudio4 и создаешь проект.

Тут думаю разберешься.
AVR-GCC для того, что бы писать на Си
Atmel Avr Assembler соответственно для ассемблера.

Начинать разбираться с МК лучше с нуля. А это значит с Ассемблера, значит создаешь тот, который Atmel AVR Assembler.

Потом выбирай микроконтроллер Atmega8.

дальше нужно выбрать симулятор. выбирай: AVR Simulator -> Amega8

ну теперь нажимай финишь.

когда создастся проект, будет большой, белый, чистый лист. тут будет код.

немного про содержимое этого листа

“комментарии” – это текст, пропускаемый компилятором, при компиляции.
перед началом комментария должен стоять спец символ, пользуюсь символом ; “точка с запятой”, есть еще “дабл сшеш” (//),
вот примеры комментариев

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

С этим все ясно. дальше сложнее. Каждая команда, имеет размер 1, 2 или 3 байта.

Видите связь размера команды с параметрами?

У каждого микроконтроллера свой ассемблер, хотя мнимоника у них похожа, т.е. команда MOV у мк одной серии будет выглядеть в машинном коде допустим 0x12 а у другого 0x55.
что бы при компиляции, скомпилировалось в нужном нам коде мы должны сказать компилятору, для какого мк у нас пишется программа.
это вообще выбирается при создании проекта.
По этому мы выбрали микроконтроллер Atmega8.

Но и тут не все. для облегчения нашей жизни, в AVRStudio4 есть набор констант, которые именуются вроде как “Макроассемблер”.

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

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

После этого идет уже сам код

Но тут есть одна (точнее не одна, а много) особенностей.

Для удобства написания кода, для его понятности и для облегчения относительных переходов, нам подарили маркеры, как они выглядят? “RESET:” и “MAIN:” это маркеры, в их именах могут содержаться почти любые символы латинского алфавита и цифры. Маркеры не могут иметь имена функций и команд, допустим “NOP”.
Как к ним переходит? Допустим командой RJMP.

Так же, из Маркеров, можно сделать подпрограмму(процедуру), по завершению которой, мы вернемся туда, от куда её вызывали. Для вызова её, используем команду “RCALL (подпрограмма)”, а что бы вернуться из Подпрограммы(процедуры), нужно закончить её командой “RET”. У нас должен получиться такой код:

Как работает команда “RCALL”, при её вызове, адрес из какого места её вызвали, помещается в СТЕК, а по вызове команды “RET”, извлекается из регистра “стек”. СТЕК нужно инициализировать.

Что бы нам работать с нашим мк, нужно его инициализировать. т.к. мк, это устройство универсальное, в нем есть много портов ввода/вывода, и периферийных устройств. таких как УСАПП, ШИМ, ЦАП, АЦП и т.д. Первым делом в инициализации мк нужно указать начало “стека”. Инициализацию мы проводим после маркера “RESET:”.

Если бы мы не вводили команду .include “m8def.inc” в начале кода, то нам пришлось бы писать так:

Читайте также:  Как почистить системную память на андроиде самсунг

Разница существенная, на мой взгляд.

СТЕК, это память магазинного типа: (последний вошедший, выходит первым).
Магазинного типа – это не супермаркет, а рожок от автомата. надеюсь все представили как в него заряжаются патроны и как они потом от туда извлекаются.
Нужно уделять очень большое внимание памяти СТЕК, т.к. любая незначительная ошибка в работе с ним, может привести к срыву стека. Это на столько важная тема, что я решил посветить ей целую тему и напишу её в отдельной заметке.

Таким образом у нас получился такой код:

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

Для правильного процесса отладки, необходимо задать эмулятору частоту, с которой будет работать МК, это делается только после компиляции и запуска отладки,
значит находим в панели меню “Build”, раскрываем её и видим “Build and Run”, после чего, мы увидим желтую стрелочку на против первой команды в нашем листинге кода. Теперь мы ищем в панели меню “Debug” и нажимаем “AVR Simulator Options”, открывается такое окно:

В котором мы можем поменять МК и его частоту, так же, на панели с права, мы видим некоторую информацию о нашем МК: его максимальную частоту, объемы памяти(EEPROM, RAM, FLASH). Теперь открываем даташит на Atmega8, на странице 203 (общий список регистров) и 205 (общий список команд) и приступай к написанию своей программы.
И запомни, не бойся экспериментировать с симулятором, он от этого не сломается!

Страницы работы

Фрагмент текста работы

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

В нашей первой программе для AVR Studio 4 мы покажем, как можно формировать интервал времени без использования таймеров и отслеживать события без привязки к внешним прерываниям. Программа будет считать в двоичном коде и демонстрировать на светодиодах (LED). После нажатия на кнопку счет остановиться. Для примера мы ограничимся тремя светодиодами, т.е. будем считать до 8.

Сначала собираем экспериментальную установку в программе Proteus 7 Professional (рисунок 1).

Рисунок 1 – Схема в программе Proteus

Далее формируем временной интервал. Нам нужно сформировать задержку долей секунды. Метод без таймера основан на том, что каждая команда в МК выполняется за строго определенное время. В AVR считать время очень просто большинство команд выполняется за один такт, и по этому, например, для формирования интервала в одну секунду при тактовой частоте 4МГц, нам потребуется выполнить какую-нибудь последовательность из четырех миллионов команд. Обычно программисты используют декрементирование какой-либо величины. Предположим, что необходимое число займет три регистра-разряда (это даст максимальную величину 16777215). Схема действия такая последовательно уменьшаем самый младший разряд (назовем его Razr0) на единицу, когда его величина достигнет нуля, уменьшаем на единицу следующий (Razr1) и переходим опять к уменьшению младшего, начиная со значения 255 (это значение загружать не требуется так как при вычитание единицы из нуля результат получается равным 255 автоматом). Кода в свою очередь, величина Razr1 достигнет нуля, уменьшаем на единицу самый старший разряд (Razr2) и так до тех пор, пока все разряды не станут нулями.

Значительно более компактно и предсказуемо будет реализовать алгоритм на основе команды вычитание с учетом переноса. Пример задержки с вычитанием с учетом переноса:

Команда suci вычитает сразу две величины – то, что записано в самой команде, плюс флаг переноса «с». Если результат предыдущего вычитания устанавливает флаг переноса (что происходит при переходе через ноль, когда из нуля вычитается единица), то команда suci вычтет его значение, равное единице, если нет, то не вычтет ничего.

Читайте также:  Том круз петля времени

Итак для того чтобы получить ровно 4 000 000 тактов, нам нужно записать в регистры Razr2-Razr0 число 4 000 000/5 = 800 000 или $0C3500. Это даст интервал в 1с при тактовой частоте 4МГц. В общем случае число N, соответствующее нужному интервалу времени T(c) при тактовой частоте F (Гц), можно получить по формуле:

Отслеживание состояние вывода (кнопки) удобно командами sbic или sbis (Skip if in I/O register Clear/Set – пропустить следующую команду, если бит в РВВ очищен/установлен) применительно ко второму биту массива PIND. Приведем листинг слежения за состоянием кнопки:

Pincykle: ; цикл отслеживания кнопки

Sbic PIND,2 ; пропустить, если нажата

rjmp Pincykle; вернуться обратно, если не нажата

Таким образом текст нашей программы можно представить как:

; Программа счета нажатия в двоичном коде

.def temp = r16 ; рабочая переменная

.def Razr0 = r17 ; разряды задержки

.def Counter = r20; счетчик

ldi temp, 0b00000100 ; для вторго разряда порта D

out PORTD, temp ; подтягивающий резистор

ldi temp,0b00000111; порт B на выход

clr Counter ; очищаемсчетчик

Pincykle: ; цикл отслеживания кнопки

sbic PIND,2; пропустить если нажата

rjmp Pincykle ; вернуться обратно если не нажата

; кнопака нажата пауза 0,2с, N = $027100

Pin_release: ; отслеживаем отпускание

sbis PIND,2 ; пропускаем если отпущена

rjmp Pincykle ; вернуться обратно если нажата

inc Counter; если отпущена увеличиваем счетчик

out PORTB, Counter ; выводим счетчик в порт B

rjmp Pincykle ; вернуться обратно к отслеживанию

ret ; возврат из процедуры

Далее набираем код программы в AVR Studio 4 (рисунок 2).

Рисунок 2 – Текст программы в AVR Studio 4

По окончанию ввода программы компилируем ее нажатием клавиши F7. Видим, что никаких ошибок в коде нет, и программа готова к выполнению. Выполняем программу нажатием клавиш Ctrl+F7. Для прогона программы нажимаем клавиши Alt+F5

Для проверки работоспособности программы проверим ее на собранном стенде в Proteus 7 Professional (рисунок 3).

Рисунок 3 – Загрузка программы в МК

Демонстрация работы программы представлена на рисунках 4-5.

Рисунок 4 — Демонстрация работы программы

Рисунок 5 — Демонстрация работы программы

Счетчик Counter будет считать в «круговую» — при переполнении он опять

Для работы с AVR Studio 4 необходимо само собой её установить. Если она уже установлена, то можете пропустить этот шаг.

Установка:
создаешь каталог c:/avr/ – тут будут лежать рабочие программы.
создаешь каталог например c:/works/ – тут будут лежать твои работы.
надо что бы были короткие пути, что бы не было проблем с ними.

Дальше, качаешь и устанавливаешь в каталог c:/avr/
WinVR
AVRStudio4_SP3

Есть вообще AVRStudio5 но и AVRStudio4 пока вполне хватает.

Вся работа будет проходить в AVRStudio4, WinAVR нужна только из-за библиотеки AVR-GCC (Для того, что бы можно было писать на Си)
НО! первым надо установить именно WinAVR , иначе библиотека AVR-GCC не подцепится.

Дальше запускаешь AVRStudio4 и создаешь проект.

Тут думаю разберешься.
AVR-GCC для того, что бы писать на Си
Atmel Avr Assembler соответственно для ассемблера.

Начинать разбираться с МК лучше с нуля. А это значит с Ассемблера, значит создаешь тот, который Atmel AVR Assembler.

Потом выбирай микроконтроллер Atmega8.

дальше нужно выбрать симулятор. выбирай: AVR Simulator -> Amega8

ну теперь нажимай финишь.

когда создастся проект, будет большой, белый, чистый лист. тут будет код.

немного про содержимое этого листа

“комментарии” – это текст, пропускаемый компилятором, при компиляции.
перед началом комментария должен стоять спец символ, пользуюсь символом ; “точка с запятой”, есть еще “дабл сшеш” (//),
вот примеры комментариев

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

С этим все ясно. дальше сложнее. Каждая команда, имеет размер 1, 2 или 3 байта.

Видите связь размера команды с параметрами?

Читайте также:  Как прошить телефон dexp через компьютер

У каждого микроконтроллера свой ассемблер, хотя мнимоника у них похожа, т.е. команда MOV у мк одной серии будет выглядеть в машинном коде допустим 0x12 а у другого 0x55.
что бы при компиляции, скомпилировалось в нужном нам коде мы должны сказать компилятору, для какого мк у нас пишется программа.
это вообще выбирается при создании проекта.
По этому мы выбрали микроконтроллер Atmega8.

Но и тут не все. для облегчения нашей жизни, в AVRStudio4 есть набор констант, которые именуются вроде как “Макроассемблер”.

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

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

После этого идет уже сам код

Но тут есть одна (точнее не одна, а много) особенностей.

Для удобства написания кода, для его понятности и для облегчения относительных переходов, нам подарили маркеры, как они выглядят? “RESET:” и “MAIN:” это маркеры, в их именах могут содержаться почти любые символы латинского алфавита и цифры. Маркеры не могут иметь имена функций и команд, допустим “NOP”.
Как к ним переходит? Допустим командой RJMP.

Так же, из Маркеров, можно сделать подпрограмму(процедуру), по завершению которой, мы вернемся туда, от куда её вызывали. Для вызова её, используем команду “RCALL (подпрограмма)”, а что бы вернуться из Подпрограммы(процедуры), нужно закончить её командой “RET”. У нас должен получиться такой код:

Как работает команда “RCALL”, при её вызове, адрес из какого места её вызвали, помещается в СТЕК, а по вызове команды “RET”, извлекается из регистра “стек”. СТЕК нужно инициализировать.

Что бы нам работать с нашим мк, нужно его инициализировать. т.к. мк, это устройство универсальное, в нем есть много портов ввода/вывода, и периферийных устройств. таких как УСАПП, ШИМ, ЦАП, АЦП и т.д. Первым делом в инициализации мк нужно указать начало “стека”. Инициализацию мы проводим после маркера “RESET:”.

Если бы мы не вводили команду .include “m8def.inc” в начале кода, то нам пришлось бы писать так:

Разница существенная, на мой взгляд.

СТЕК, это память магазинного типа: (последний вошедший, выходит первым).
Магазинного типа – это не супермаркет, а рожок от автомата. надеюсь все представили как в него заряжаются патроны и как они потом от туда извлекаются.
Нужно уделять очень большое внимание памяти СТЕК, т.к. любая незначительная ошибка в работе с ним, может привести к срыву стека. Это на столько важная тема, что я решил посветить ей целую тему и напишу её в отдельной заметке.

Таким образом у нас получился такой код:

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

Для правильного процесса отладки, необходимо задать эмулятору частоту, с которой будет работать МК, это делается только после компиляции и запуска отладки,
значит находим в панели меню “Build”, раскрываем её и видим “Build and Run”, после чего, мы увидим желтую стрелочку на против первой команды в нашем листинге кода. Теперь мы ищем в панели меню “Debug” и нажимаем “AVR Simulator Options”, открывается такое окно:

В котором мы можем поменять МК и его частоту, так же, на панели с права, мы видим некоторую информацию о нашем МК: его максимальную частоту, объемы памяти(EEPROM, RAM, FLASH). Теперь открываем даташит на Atmega8, на странице 203 (общий список регистров) и 205 (общий список команд) и приступай к написанию своей программы.
И запомни, не бойся экспериментировать с симулятором, он от этого не сломается!

Ссылка на основную публикацию
Программы для поиска транспорта
Грузы Широкие возможности фильтров позволяют найти точно подходящую для вашего транспорта загрузку. Несколько тысяч свежих предложений. Каждый сможет найти себе...
Программа для отформатировать флешку
Процесс форматирования флешки мало отличается от форматирования HDD или SSD-дисков. Далее мы рассмотрим лучшие программы для форматирования флешек (такие как...
Программа для оцифровки винила
Каталог продаваемых пластинок (49230) Минимальные аппаратные требования, или что надо иметь для оцифровки Компьютер со звуковой картой. Проигрыватель винила Корректор...
Программы для полной очистки жесткого диска
Подборка программ, которые помогут очистить жёсткий диск Windows компьютера и его съёмные устройства от ненужных файлов. Эти инструменты помогут найти...
Adblock detector