Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции.doc
Скачиваний:
295
Добавлен:
20.06.2014
Размер:
1.06 Mб
Скачать
        1. Ввод-вывод

          1. Регистры и команды ввода-вывода

Все устройства ввода-вывода AVR доступны через пространство ввода-вывода посредством команд IN и OUT, которые передают данные между регистрами ввода-вывода и общего назначения.

Кроме регистров устройств ввода-вывода: таймеров, портов и т. п. — к множеству регистров ввода-вывода относятся также регистры управления и состояния CPU и MCU: регистр флагов SREG, регистр MCUCR и др.

Регистры ввода-вывода с адресами 0x00-0x1F доступны напрямую для команд SBI и CBI, SBIS и SBIC. С использованием команд IN и OUT доступны все регистры ввода-вывода, при этом их адреса отсчитываются от нуля: 0x00-0x3F. При адресации регистров ввода-вывода в памяти данных в командах LD и ST к их адресам надо прибавить 0x20.

          1. Порты ввода-вывода

Порты ввода-вывода имеют нагрузочную способность, достаточную для прямого подключения LED-дисплея. Многие выводы портов мультиплексированы с альтернативными функциями различных периферийных устройств микроконтроллера. Разрешение альтернативной функции какого-либо вывода не влияет на остальные выводы, которые по-прежнему могут быть использованы для общих целей ввода-вывода.

Каждый порт ввода-вывода имеет три регистра:

  1. DDRx — определяет направление — ввод или вывод;

  2. PORTx — выходной регистр порта;

  3. PINx — входной регистр порта.

Направление ввода-вывода задается для каждого порта побитно.

Вне зависимости от значения DDRx информация на выводах порта может быть прочитана через регистр PINx. Кроме того, выведенная информация через PORTx может быть прочитана через PINx (рис.):

.include "m8535def.inc"

.cseg

.org 0

start: ldi r16, 0xFF

out DDRC, r16

main: ldi r16, 0xEE

out PORTC, r16

nop

in r17, PINC

rjmp main

Рис. Временная диаграмма чтения порта после записи

Команда OUT устанавливает сигнал SYNC LATCH. Между командами OUT и IN должна быть вставлена команда NOP. В этом случае задержка синхронизатора tpd равна одному такту.

В следующем примере показывается, как влияет на ввод после вывода установка направления работы порта с помощью регистра DDRx:

.include "m8535def.inc"

.cseg

.org 0

; Define pull-ups and set outputs high

; Define directions for port pins

ldi r16,(1<<PB7)|(1<<PB6)|(1<<PB1)|(1<<PB0) ;r16=0xC3

ldi r17,(1<<DDB3)|(1<<DDB2)|(1<<DDB1)|(1<<DDB0) ;r17=0x0F

out PORTB,r16 ;PORTB=0xC3

out DDRB,r17 ;DDRB=0x0F

; Insert nop for synchronization

nop ; PINB=0x03

; Read port pins

in r16,PINB ; r16=0x03

        1. Прерывания

          1. Источники и таблица векторов прерываний

Архитектура AVR предоставляет несколько источников прерываний. Обработчики прерываний располагаются в программной памяти. Векторы (адреса) прерываний занимают младшую часть адресного пространства программной памяти. Чем меньше адрес, тем больше приоритет прерывания. Нулевому адресу соответствует Reset-вектор. Соответственно, он имеет самый высокий приоритет. Прерывания в целом могут быть разрешены или запрещены с помощью флага Global Interrupt Enable (I). Когда происходит переход к обработке прерывания, флаг I сбрасывается. Он может быть установлен обработчиком прерывания для разрешения вложенных прерываний. I устанавливается командой возврата из прерывания IRET.

Регистр IP помещается в стек перед входом в прерывание и извлекается из стека командой IRET.

Существует два типа прерываний. Прерывания первого типа имеют локальные флаги разрешения прерываний. Они могут быть установлены, когда I сброшен, и обработаны позднее, после его установки. Прерывания второго типа не имеют локальных флагов и могут быть обработаны, только когда выполняются условия прерываний. Если в этот момент I сброшен, то после его установки прерывания не будут обработаны.

Таблица

Таблица векторов прерываний и сброса

Адрес

Источник

Описание

1

0x000

RESET

External Pin, Power-on Reset, Brown-out Reset and Watchdog Reset

2

0x001

INT0

External Interrupt Request 0

3

0x002

INT1

External Interrupt Request 1

4

0x003

TIMER2

COMP Timer/Counter2 Compare Match

5

0x004

TIMER2

OVF Timer/Counter2 Overflow

6

0x005

TIMER1

CAPT Timer/Counter1 Capture Event

7

0x006

TIMER1

COMPA Timer/Counter1 Compare Match A

8

0x007

TIMER1

COMPB Timer/Counter1 Compare Match B

9

0x008

TIMER1

OVF Timer/Counter1 Overflow

10

0x009

TIMER0

OVF Timer/Counter0 Overflow

11

0x00A

SPI, STC

Serial Transfer Complete

12

0x00B

USART, RXC

USART, Rx Complete

13

0x00C

USART, UDRE

USART Data Register Empty

14

0x00D

USART, TXC

USART, Tx Complete

15

0x00E

ADC

ADC Conversion Complete

16

0x00F

EE_RDY

EEPROM Ready

17

0x010

ANA_COMP

Analog Comparator

18

0x011

TWI

Two-wire Serial Interface

19

0x012

INT2

External Interrupt Request 2

20

0x013

TIMER0

COMP Timer/Counter0 Compare Match

21

0x014

SPM_RDY

Store Program Memory Ready

Когда запрограммирована перемычка BOOTRST, MCU перейдет при сбросе на адрес загрузчика.

Когда установлен бит IVSEL в регистре GICR, вектора прерываний перемещаются в начало загрузочной секции. В этом случае к адресам прерываний прибавляется адрес начала загрузочной секции.

Если программа не разрешает прерывания и не использует таблицу векторов прерываний, то она может быть помещена на ее месте в памяти.

Таблица

Размещение векторов прерываний и сброса в зависимости от BOOTRST и IVSEL

BOOTRST

IVSEL

Reset Address

Interrupt Vectors Start Address

1

0

0x0000

0x0001

1

1

0x0000

Boot Reset Address + 0x0001

0

0

Boot Reset Address

0x0001

0

1

Boot Reset Address

Boot Reset Address + 0x0001

Значение "1" перемычки соответствует тому, что она не запрограммирована, "0" — запрограммирована.

Наиболее типичное и общее содержание векторов прерываний и сброса для ATmega8535 таково:

0x000 rjmp RESET ;Reset Handler

0x001 rjmp EXT_INT0 ;IRQ0 Handler

0x002 rjmp EXT_INT1 ;IRQ1 Handler

0x003 rjmp TIM2_COMP ;Timer2 Compare Handler

0x004 rjmp TIM2_OVF ;Timer2 Overflow Handler

0x005 rjmp TIM1_CAPT ;Timer1 Capture Handler

0x006 rjmp TIM1_COMPA ;Timer1 Compare A Handler

0x007 rjmp TIM1_COMPB ;Timer1 Compare B Handler

0x008 rjmp TIM1_OVF ;Timer1 Overflow Handler

0x009 rjmp TIM0_OVF ;Timer0 Overflow Handler

0x00A rjmp SPI_STC ;SPI Transfer Complete Handler

0x00B rjmp USART_RXC ;USART RX Complete Handler

0x00C rjmp USART_UDRE ;UDR Empty Handler

0x00D rjmp USART_TXC ;USART TX Complete Handler

0x00E rjmp ADC ;ADC Conversion Complete Handler

0x00F rjmp EE_RDY ;EEPROM Ready Handler

0x010 rjmp ANA_COMP ;Analog Comparator Handler

0x011 rjmp TWSI ;Two-wire Serial Interface Handler

0x012 rjmp EXT_INT2 ;IRQ2 Handler

0x013 rjmp TIM0_COMP ;Timer0 Compare Handler

0x014 jmp SPM_RDY ;Store Program Memory Ready

;Handler

;

0x015 RESET: ldi r16,high(RAMEND) ;Main program start

0x016 out SPH,r16 ;Set Stack Pointer to top of RAM

0x017 ldi r16,low(RAMEND)

0x018 out SPL,r16

0x019 sei ;Enable interrupts

0x020 <instr> xxx

... ... ...