
- •Микроконтроллеры
- •Базовая информация о микроконтроллерах
- •Сущность и назначение микроконтроллера. Семейства микроконтроллеров
- •Состав микроконтроллера
- •Назначение микроконтроллера
- •Cемейства микроконтроллеров
- •Отправная точка. Микроконтроллерi8051
- •Основные характеристики микроконтроллераi8051
- •Назначение выводовi8051
- •Структурная схемаi8051
- •Микроконтроллеры семействаavrкомпанииatmel
- •Общая характеристика архитектуры, системы команд и ассемблераAvr
- •Состав семейства и основные характеристики микроконтроллеровAvr
- •Структура ассемблерного кодаAvr
- •Группы команд микроконтроллеров avr
- •Директивы ассемблераAvr
- •Список директив ассемблераAvr
- •Директива byte
- •Директива cseg
- •Директива db
- •Директива def
- •Директива device
- •Директива dseg
- •Директива dw
- •Директивы macro иEndmacro
- •Директива equ
- •Директива set
- •Микроконтроллер atmega8535
- •Характеристики, назначение выводов и структура микроконтроллера aTmega8535
- •Характеристики микроконтроллера aTmega8535
- •Назначение выводов микроконтроллера aTmega8535
- •Структура микроконтроллера aTmega8535
- •Сброс микроконтроллера aTmega8535. Режимы пониженного энергопотребления. Сигналы запроса внешних прерываний. Регистры управления
- •Сброс микроконтроллера aTmega8535
- •Регистр mcucsr (mcu Control and Status Register)
- •Регистр mcucr (mcu Control Register)
- •Режимы пониженного энергопотребления
- •Форма сигналов запроса внешних прерываний
- •Регистры общего назначения, регистр состояния и указатель стека микроконтроллера aTmega8535
- •Регистры общего назначения
- •Регистр состояния (sreg)
- •Указатель стека
- •Ввод-вывод
- •Регистры и команды ввода-вывода
- •Порты ввода-вывода
- •Прерывания
- •Источники и таблица векторов прерываний
- •Регистр gicr (General Interrupt Control Register)
- •Внешние прерывания
- •Регистр gifr (General Interrupt Flag Register)
- •Таймеры микроконтроллера aTmega8535
- •Общая информация о таймерах микроконтроллера aTmega8535
- •Множество таймеров aTmega8535
- •Регистр timsk (Timer/Counter Interrupt Mask Register)
- •Регистр tifr (Timer/Counter Interrupt Flag Register)
- •Примеры программ работы с таймером
- •Таймер t0
- •Назначение и свойства таймера t0
- •Структура таймера t0
- •Регистры таймера t0
- •Регистр tccr0 (Timer/Counter Control Register)
- •Устройство сравнения таймера t0
- •Режимы работы таймера t0
- •Режим Normal
- •Режим ctc
- •Режим быстрой шим (fastPwMmode)
- •Режим шим с корректировкой фазы (Phase Correct pwm Mode)
- •Таймер t1
- •Назначение и свойства таймера t1
- •Структура таймера t1
- •Регистры таймера t1
- •Регистр tccr1a (Timer/Counter1 Control Register a)
- •Регистр tccr1b (Timer/Counter1 Control Register b)
- •Задание режима генерации сигнала битами wgm13:0
- •Устройство захвата (Input Capture Unit)
- •Режимы работы таймера t1
- •Список режимов работы таймера t1
- •Режим быстрой шим (fast pwm mode) таймера t1
- •Режим шим с корректировкой фазы (Phase Correct pwm Mode) таймера t1
- •Режим шим с корректировкой фазы и частоты (Phase and Frequency Correct pwm Mode) таймера t1
- •Таймер t2
- •Назначение и свойства таймера t2
- •Структура таймера t2
- •Регистры таймера t2
- •Регистр tccr2 (Timer/Counter Control Register)
- •Устройство сравнения таймера t2
- •Режимы работы таймера t2
- •Режим Normal
- •Режим ctc
- •Режим быстрой шим (fast pwm mode)
- •Режим шим с корректировкой фазы (Phase Correct pwm Mode)
- •Асинхронный режим работы таймера t2. Регистр assr (Asynchronous Status Register)
Ввод-вывод
Регистры и команды ввода-вывода
Все устройства ввода-вывода AVR доступны через пространство ввода-вывода посредством команд IN и OUT, которые передают данные между регистрами ввода-вывода и общего назначения.
Кроме регистров устройств ввода-вывода: таймеров, портов и т. п. — к множеству регистров ввода-вывода относятся также регистры управления и состояния CPU и MCU: регистр флагов SREG, регистр MCUCR и др.
Регистры ввода-вывода с адресами 0x00-0x1F доступны напрямую для команд SBI и CBI, SBIS и SBIC. С использованием команд IN и OUT доступны все регистры ввода-вывода, при этом их адреса отсчитываются от нуля: 0x00-0x3F. При адресации регистров ввода-вывода в памяти данных в командах LD и ST к их адресам надо прибавить 0x20.
Порты ввода-вывода
Порты ввода-вывода имеют нагрузочную способность, достаточную для прямого подключения LED-дисплея. Многие выводы портов мультиплексированы с альтернативными функциями различных периферийных устройств микроконтроллера. Разрешение альтернативной функции какого-либо вывода не влияет на остальные выводы, которые по-прежнему могут быть использованы для общих целей ввода-вывода.
Каждый порт ввода-вывода имеет три регистра:
DDRx — определяет направление — ввод или вывод;
PORTx — выходной регистр порта;
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
Прерывания
Источники и таблица векторов прерываний
Архитектура 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
... ... ...