Начало работы с AVR Studio 4 (урок 1)

Для работы с 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

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

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

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

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


/*
* Комментарий такого види(многострочный), 
* обычно используется для 
* сопроводительной информции 
* об исходном коде, т.е.
* название, разработчик и т.д.
*/

NOP  // Такой комментарий в основном используется для пояснения назначения команды, или куска кода
SLEEP ; такой комментарий тоже как и предыдущий, можно использовать для пояснения (для заметок) в коде

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


MOV R16, R17 ; два параметра
INC R16      ; один параметр
SEI          ; без параметров

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


MOV R16, R17 ; три байта
INC R16      ; два байта
SEI          ; один байт

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

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

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

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


.include "m8def.inc"
// командой .include, мы подгрузили файл m8def.inc
;и теперь нам станет легче ;)

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


RJMP RESET		 ; Reset Handler
		RETI;	RJMP EXT_INT0	 ; IRQ0 Handler
		RETI;	RJMP EXT_INT1	 ; IRQ1 Handler
		RETI;	RJMP TIM2_COMP	 ; Timer2 Compare Handler
		RETI;	RJMP TIM2_OVF	 ; Timer2 Overflow Handler
		RETI;	RJMP TIM1_CAPT	 ; Timer1 Capture Handler
		RETI;	RJMP TIM1_COMPA	 ; Timer1 CompareA Handler
		RETI;	RJMP TIM1_COMPB	 ; Timer1 CompareB Handler
		RETI;	RJMP TIM1_OVF	 ; Timer1 Overflow Handler
		RETI;	RJMP TIM0_OVF	 ; Timer0 Overflow Handler
		RETI;	RJMP SPI_STC	 ; SPI Transfer Complete Handler
		RETI;	RJMP USART_RXC	 ; USART RX Complete Handler
		RETI;	RJMP USART_UDRE	 ; UDR Empty Handler
		RETI;	RJMP USART_TXC	 ; USART TX Complete Handler
		RETI;	RJMP ADC		 ; ADC Conversion Complete Handler
		RETI;	RJMP EE_RDY		 ; EEPROM Ready Handler
		RETI;	RJMP ANA_COMP	 ; Analog Comparator Handler
		RETI;	RJMP TWSI		 ; Two-wire Serial Interface Handler
		RETI;	RJMP SPM_RDY	 ; Store Program Memory Ready Handler

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


RESTART: ; маркер инициализации
MAIN: NOP  ; маркер главного цикла
RJMP MAIN

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

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

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


RESTART: 
MAIN: NOP
RCALL PPP1 ; вызываем подпрограмму
RJMP MAIN

PPP1: NOP
RET  ; выходим из подпрограммы

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

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


LDI R16,HIGH(RAMEND)
OUT SPH,R16
LDI R16,LOW(RAMEND)
OUT SPL,R16

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


LDI R16,0x04
OUT SPH,R16
LDI R16,0x5f
OUT SPL,R16

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

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

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


.include "m8def.inc"

		RJMP RESET		 ; Reset Handler
		RETI;	RJMP EXT_INT0	 ; IRQ0 Handler
		RETI;	RJMP EXT_INT1	 ; IRQ1 Handler
		RETI;	RJMP TIM2_COMP	 ; Timer2 Compare Handler
		RETI;	RJMP TIM2_OVF	 ; Timer2 Overflow Handler
		RETI;	RJMP TIM1_CAPT	 ; Timer1 Capture Handler
		RETI;	RJMP TIM1_COMPA	 ; Timer1 CompareA Handler
		RETI;	RJMP TIM1_COMPB	 ; Timer1 CompareB Handler
		RETI;	RJMP TIM1_OVF	 ; Timer1 Overflow Handler
		RETI;	RJMP TIM0_OVF	 ; Timer0 Overflow Handler
		RETI;	RJMP SPI_STC	 ; SPI Transfer Complete Handler
		RETI;	RJMP USART_RXC	 ; USART RX Complete Handler
		RETI;	RJMP USART_UDRE	 ; UDR Empty Handler
		RETI;	RJMP USART_TXC	 ; USART TX Complete Handler
		RETI;	RJMP ADC		 ; ADC Conversion Complete Handler
		RETI;	RJMP EE_RDY		 ; EEPROM Ready Handler
		RETI;	RJMP ANA_COMP	 ; Analog Comparator Handler
		RETI;	RJMP TWSI		 ; Two-wire Serial Interface Handler
		RETI;	RJMP SPM_RDY	 ; Store Program Memory Ready Handler

RESET:	LDI R16,HIGH(RAMEND)
		OUT SPH,R16
		LDI R16,LOW(RAMEND)
		OUT SPL,R16
		RGMP RESET

MAIN: NOP  ; маркер главного цикла
RJMP MAIN

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

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

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

Запись опубликована в рубрике AVR Studio 4 с метками , . Добавьте в закладки постоянную ссылку.

Оставить комментарий

Ваш email не будет опубликован. Обязательные поля отмечены *

Вы можете использовать это HTMLтеги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>