Одним из самых важных аспектов программирования микроконтроллеров является работа с регистрами и портами. У микроконтроллеров серии AVR несколько регистров ввода/вывода и 32 рабочих регистра общего назначения. Программист не может непосредственно записать число в регистр ввода/вывода. Вместо этого он должен записать число в регистр общего назначения, а затем скопировать значение этого регистра в регистр ввода/вывода. Рабочие регистры обозначаются как R1, R2, … , R31.

Для упрощения написания программ очень удобно давать регистрам имена. Целесообразна давать имена, соответствующие хранимой информации. Например, если регистр R16 используется для хранения временной информации, то его можно назвать temp. Это делается следующим образом:
{codecitation class=»brush: vb; gutter: true;» width=»700px» }
.def   temp   = R16
{/codecitation}
Для того чтобы не «обзывать» регистры ввода/вывода и основные регистры микроконтроллер, достаточно в начале программы подключить заголовочный файл, соответствующий используемому микроконтроллеру. Т.е. не придётся давать имена регистрам портов, таймерам/счетчикам и т.п. Например, если программа предназначена для микроконтроллера AT90s8515:
{codecitation class=»brush: vb; gutter: true;» width=»700px» }
.include    «8515def.inc»
{/codecitation}
Для микроконтроллера AT90s1200 — самый первый микроконтроллер AVR, регистры ввод/вывода имеют номера от $0 до $3F (зависит от модели МК). Отдельно можно выделить регистры ввода/вывода PortB, PinB, PortD, PinD (они имеют буквенные обозначения после подключения 1200def.inc, а так их адреса $18, $16, $12, $10 — согласитесь очень непросто держать в голове цифровые константы, проще буквенные имена). У последних микроконтроллеров AVR портов намного больше, они называются A, B, C, D, E…
Рассмотрим расположение выводов популярного микроконтроллера ATtiny2313. Ножки 2-9, 11 с именами  PD0 — PD7 являются портом D, аналогично с портом B. Обратите внимание на то, что порт B — восьмибитный, а порт D — семибитный.
расположение выводов микроконтрллера ATtiny2313
Порты могут работать как входы и как выходы. Если порт работает как вход, то для того чтобы считать значения, необходимо обратиться к регистру PinB или PinD — смотря с какого порта производим считывание.  Если на некоторых пинах высокие уровни, соответствующие лог. «1», то соответствующие биты в считанных значениях будут установлены в «1». Выводы способны выдерживать ток до 20 mA, но не стои забывать о суммарном токе всех ножек порта т.к. существуют ограничения. Если порт является выходом, то значения на линиях порта устанавливается путём записи соответствующего значения в регистр порта PortB или PortD. Для установления лог. «1» на выходе порта, следует установить соответствующий бит в регистре PortB или PortD.
 
Самый важный момент работы с портом — это работа с регистром защелкой, отвечающей за работу линий порта на вход или на выход. Название этого регистра DDRx, где x — буква порта. Для того чтобы сделать ножки выходами, мы  должны записать в соответствующие биты «1». Например, мы хотим сделать ножку PB7 порта B входом, а остальные ножки выходами, то для этого необходимо записать в регистр DDRB значение 0b01111111. Приставка 0b означает, что число записано в двоичном виде. При запуске регистры DDRx обнулены, т.е. все ножки являются входами. Рекомендуется неиспользуемые ножки в устройстве делать входами.
Рассмотрим простую программку работающую с портом микроконтроллера:
{codecitation class=»brush: vb; gutter: true;» width=»700px» }
.include «8515def.inc»     ; подключим файл с описаниями регистров

.def temp =r16

rjmp RESET                   ; вектор перехода при сбросе

RESET:

ldi temp, 0b00000011    ; определим PC0 и PC1 как выходы

out DDRC, temp

ldi temp, 0b00000001   ; зажигаем светодиод на ножке PC0

out PORTC , temp

in temp, PinC               ; считываем уровни с порта C

LOOP:                         ; основной цикл программы

nop

rjmp LOOP
{/codecitation}

Для побитного обращения к линиям порта, можно использовать команды SBI, CBI,  SBIS, SBIC… Команда SBI устанавливает соответствующий бит порта в «1», а команда CBI делает обратное — очищает соответствующий бит т.е. записывает 0 в этот бит. Например:
{codecitation class=»brush: vb; gutter: true;» width=»700px» }
ldi R16, 0xFF

out DDRB, R16           ; все ножки — выходы

sbi PortB, 5                ; установить на ножке лог. «1»

cbi PortB, 5                ; сбросить, на ножке появится лог. «0»
{/codecitation}

Про основные ассемблерные команды микроконтроллеров AVR можно почитать здесь

Крайне рекомендую почитать книгу Джона Мортона «Микроконтроллеры AVR — Вводный курс», она есть в разделе книги по микроконтроллерам нашего сайта.

 

Просмотров всего: 3 509, сегодня: 1

Напишите комментарий