Микроконтроллеры AVR

Для ознакомления с AVR стоит посетить соответствующий раздел ATMEL Russian Home - AVR микроконтроллеры

Архитектура

Блок регистров быстрого доступа состоит из 32-х 8-битных регистров общего назначения. Операции с регистрами выполняются за один цикл. В течение цикла два операнда читаются из блока регистров, выполняется инструкция, результат сохраняется в блок регистров.

АЛУ поддерживает арифметические и логические операции между регистрами или между константой и регистром. Также существуют инструкции с одним операндом. AVR использует Гарвардскую архитектуру: у программы и данных раздельные шины и память. Выборка инструкции из памяти программ осуществляется двуступенчатым конвейером. Пока одна инструкция выполняется, следующая инструкция выбирается из памяти программ. Такая концепция позволяет выполнять инструкцию за один цикл. Программная память является памятью типа Flash.

Инструкции относительного перехода и относительного вызова имеют доступ к адресному пространству размером, зависящим от типа процессора (512...8К адресов). Каждый адрес программной памяти содержит одну 16- или 32-битную инструкцию.

Во время прерываний и вызовов процедур, адрес возврата сохраняется в стеке. В процессорах AT90S1200, ATtiny10/11/12, ATtiny28L стек реализован аппаратно, имеет глубину 3 уровня и предназначен для процедур и прерываний. Указатель стека недоступен. В остальных моделях, стек использует память SRAM, и поэтому ограничен только размером SRAM и использованием ячеек SRAM программой. Программы должны инициализировать указатель стека при сбросе. Указатель стека SP доступен для чтения-записи в пространстве ввода-вывода.

Многие модели микроконтроллеров имеют память данных SRAM, которая доступна пятью режимами адресации, поддерживаемыми архитектурой AVR.

Пространство ввода-вывода содержит 64 адреса для периферии: регистры управления, таймеры, счетчики, аналого-цифровые преобразователи, другие функции ввода-вывода.

Гибкий модуль прерываний имеет свои регистры управления в пространстве ввода-вывода с дополнительным битом глобального разрешения прерываний в регистре состояния. Каждый источник прерывания имеет собственный вектор прерывания в таблице векторов, которая расположена в начале программной памяти. Прерывания имеют приоритет в соответствии с позицией вектора в таблице. Вектор с младшим адресом имеет наивысший приоритет.

Блок регистров общего назначения

Регистры общего назначения R0
R1
R2
...
...
R28
R29
R30 (Z-Register)
R31

Все инструкции работы с регистрами имеют прямой доступ ко всем регистрам. Исключением являются пять арифметических и логических инструкций SBCI, SUBI, CPI, ANDI, ORI, работающих с константой и регистром, и инструкция LDI для загрузки константы в регистр. Эти инструкции работают только с регистрами второй половины блока - R16..R31. Обычные SBC, SUB, CP, AND, OR и все другие операции между двумя регистрами или с одним регистром работают с любыми регистрами блока.

Регистры 26...31 в зависимости от модели процессора могут служить также в качестве указателей для косвенной адресации блока регистров.

АЛУ - арифметико-логическое устройство

Высокоэффективное AVR АЛУ работает напрямую с блоком регистров общего назначения. Операции между регистрами блока выполняются за один цикл. Операции разделены на три главных категории: арифметические, логические и побитовые.

Набор инструкций AVR

Пример подключения ATtiny

Пример программы:
;***********************************************
;* Пример программы для ATtiny.
;* Версия от 11 марта 2002г.
;***********************************************
; Все, что правее точки с запятой - это комментарии.

; Подключаем файл с определениями "tn12def.inc".

.include "tn12def.inc"
; Для удобства даем регистрам имена.
.def fTEMP =r16
.def fCOUNTER =r17
.def fCOUNTER2 =r18
.cseg ; Сегмент CODE.
.org 0 ; Адрес выполнения первой команды
        rjmp    start ; Переход на команду по адресу 'start'
; Метка 'start' - это адрес следующей за меткой команды.

start:
; Назначаем лапы на вход (0) или выход (1).
        ldi     fTEMP,0b00111110; PB0 - вход, остальные - выход.
        out     DDRB,fTEMP
Loop:
        cbi     PORTB,0 ; Гасим вывод PB0
        ldi     fTEMP,0
        rcall   Big_delay ; Задержка около 200 мс.
        sbi     PORTB,0 ; Устанавливаем в единицу PB0
        ldi     fTEMP,0
        rcall   Big_delay
        rjmp    Loop
;--------------------------------------------------------------------------
Big_delay:
        mov     fCOUNTER2,fTEMP
        clr     fCOUNTER
BD_loop:
        dec     fCOUNTER
        brne    BD_loop
        dec     fCOUNTER2
        brne    BD_loop
        ret
;--------------------------------------------------------------------------

В данной схеме подключения программа заставит светодиод мигать с периодом около 400 миллисекунд.

Продолжение следует...

Hosted by uCoz