Для работы с 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 (общий список команд) и приступай к написанию своей программы.
И запомни, не бойся экспериментировать с симулятором, он от этого не сломается!
Сия строка “RGMP RESET” имеет ошибку.
У вас неточность
“С этим все ясно. дальше сложнее. Каждая команда, имеет размер 1, 2 или 3 байта.
MOV R16, R17 ; три байта
INC R16 ; два байта
SEI ; один байт”
команда MOV R16, R17 ; два байта 2F 01
команда INC R16 ; два байта 95 03
команда SEI = BSET I ; два байта 94 78
спасибо за поправку. чуть позже постараюсь внести коррективы