
- •Микроконтроллеры
- •Базовая информация о микроконтроллерах
- •Сущность и назначение микроконтроллера. Семейства микроконтроллеров
- •Состав микроконтроллера
- •Назначение микроконтроллера
- •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)
Указатель стека
Стек используется для хранения временных данных, локальных переменных подпрограмм и адресов возврата из подпрограмм и обработчиков прерываний.
Указатель стека (SP, Stack Pointer) указывает на верхушку стека, которая понимается здесь как очередная свободная ячейка стека, в которую будут помещены данные ближайшей соответствующей командой.
SP должен быть установлен в значение, большее 0x60.
SP реализован как два 8-битных регистра в пространстве ввода-вывода: SPH и SPL.
ПАМЯТЬ, ВВОД-ВЫВОД И ПРЕРЫВАНИЯ МИКРОКОНТРОЛЛЕРА ATmega8535
Память микроконтроллера ATmega8535
Виды памяти AVR
Микроконтроллеры ATmega8535 имеют три линейных регулярных области памяти:
постоянная память программ (Flash), 8 Кбайт;
оперативная память данных (SRAM), 512 байт;
постоянная память данных (EEPROM), 512 байт.
Flash-память программ
Поскольку команды AVR 16- или 32-битные, память программ имеет организацию 4К х 16.
Для обеспечения безопасности Flash-память разделена на две секции: загрузочную и прикладную.
Память данных
Адресное пространство памяти данных (рис.) включает 608 байтов:
32 — регистровый файл регистров общего назначения R0-R31;
64 — регистры ввода-вывода (I/O Registers);
512 — SRAM.
Рис. Адресное пространство памяти данных
Имеются пять способов адресации памяти данных:
прямая;
косвенная — по значению регистров-указателей X, Y, Z;
косвенная со смещением 0-63 байта от значения регистров-указателей Y и Z;
косвенная с предекрементом — регистры-указатели декрементируются перед обращением к памяти;
косвенная с постинкрементом — регистры-указатели инкрементируются после обращения к памяти.
EEPROM
Для работы с EEPROM используются три регистра:
Регистр адреса EEPROM (EEPROM Address Register, EEAR). Состоит из двух 8-битных регистров EEARH и EEARL. Биты 8-0 этого регистра адресуют одну из 512 ячеек EEPROM.
Регистр данных EEPROM (EEPROM Data Register, EEDR). Используется для чтения-записи EEPROM по адресу, содержащемуся в EEAR.
Регистр управления EEPROM (EEPROM Control Register) — EECR.
Формат EECR:
биты 7-4 не используются и равны нулю;
бит 3 — EERIE (EEPROM Ready Interrupt Enable), разрешает соответствующее прерывание, которое происходит при очистке EEWE;
бит 2 — EEMWE (EEPROM Master Write Enable), если этот бит установлен, то установка EEWE приведет к записи EEPROM по указанному адресу;
бит 1 — EEWE (EEPROM Write Enable), представляет собой стробирущий сигнал записи EEPROM;
бит 0 — EERE (EEPROM Read Enable), представляет собой стробирущий сигнал чтения EEPROM.
Для записи EEPROM должна быть выполнена следующая последовательность действий:
Подождать пока EEWE не станет равным нулю.
Если загрузчик (Boot Loader) разрешает CPU программировать Flash-память, подождать пока SPMEN в SPMCR не станет равным нулю.
Записать адрес в EEAR.
Записать данные в EEDR.
Установить бит EEMWE в EECR.
В течение четырех тактов после установки EEMWE установить бит EEWE.
Запись EEPROM не может осуществляться одновременно с Flash-памятью.
Для корректной записи EEPROM прерывания должны быть запрещены в течение указанной последовательности действий.
По истечении отведенного времени записи EEPROM бит EEWE сбрасывается аппаратно. Когда EEWE устанавливается, CPU останавливается на два такта перед тем, как следующая команда может быть выполнена.
Когда происходит чтение EEPROM, CPU останавливается на четыре такта перед тем, как следующая команда может быть выполнена.
Пример. Подпрограмма записи EEPROM на ассемблере
EEPROM_write:
; Wait for completion of previous write
sbic EECR,EEWE
rjmp EEPROM_write
; Set up address (r18:r17) in address register
out EEARH, r18
out EEARL, r17
; Write data (r16) to Data Register
out EEDR,r16
; Write logical one to EEMWE
sbi EECR,EEMWE
; Start EEPROM write by setting EEWE
sbi EECR,EEWE
ret
Пример. Функция записи EEPROM на C
void EEPROM_write(unsigned int uiAddress, unsigned char ucData)
{
/* Wait for completion of previous write */
while(EECR & (1<<EEWE))
;
/* Set up Address and Data Registers */
EEAR = uiAddress;
EEDR = ucData;
/* Write logical one to EEMWE */
EECR |= (1<<EEMWE);
/* Start EEPROM write by setting EEWE */
EECR |= (1<<EEWE);
}
Пример. Подпрограмма чтения EEPROM на ассемблере
EEPROM_read:
; Wait for completion of previous write
sbic EECR,EEWE
rjmp EEPROM_read
; Set up address (r18:r17) in Address Register
out EEARH, r18
out EEARL, r17
; Start EEPROM read by writing EERE
sbi EECR,EERE
; Read data from Data Register
in r16,EEDR
ret
Пример. Функция чтения EEPROM на C
unsigned char EEPROM_read(unsigned int uiAddress)
{
/* Wait for completion of previous write */
while(EECR & (1<<EEWE))
;
/* Set up Address Register */
EEAR = uiAddress;
/* Start EEPROM read by writing EERE */
EECR |= (1<<EERE);
/* Return data from Data Register */
return EEDR;
}