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

Стек используется для хранения временных данных, локальных переменных подпрограмм и адресов возврата из подпрограмм и обработчиков прерываний.

Указатель стека (SP, Stack Pointer) указывает на верхушку стека, которая понимается здесь как очередная свободная ячейка стека, в которую будут помещены данные ближайшей соответствующей командой.

SP должен быть установлен в значение, большее 0x60.

SP реализован как два 8-битных регистра в пространстве ввода-вывода: SPH и SPL.

      1. ПАМЯТЬ, ВВОД-ВЫВОД И ПРЕРЫВАНИЯ МИКРОКОНТРОЛЛЕРА ATmega8535

        1. Память микроконтроллера ATmega8535

          1. Виды памяти AVR

Микроконтроллеры ATmega8535 имеют три линейных регулярных области памяти:

  • постоянная память программ (Flash), 8 Кбайт;

  • оперативная память данных (SRAM), 512 байт;

  • постоянная память данных (EEPROM), 512 байт.

          1. Flash-память программ

Поскольку команды AVR 16- или 32-битные, память программ имеет организацию 4К х 16.

Для обеспечения безопасности Flash-память разделена на две секции: загрузочную и прикладную.

          1. Память данных

Адресное пространство памяти данных (рис.) включает 608 байтов:

  • 32 — регистровый файл регистров общего назначения R0-R31;

  • 64 — регистры ввода-вывода (I/O Registers);

  • 512 — SRAM.

Рис. Адресное пространство памяти данных

Имеются пять способов адресации памяти данных:

  • прямая;

  • косвенная — по значению регистров-указателей X, Y, Z;

  • косвенная со смещением 0-63 байта от значения регистров-указателей Y и Z;

  • косвенная с предекрементом — регистры-указатели декрементируются перед обращением к памяти;

  • косвенная с постинкрементом — регистры-указатели инкрементируются после обращения к памяти.

          1. EEPROM

Для работы с EEPROM используются три регистра:

  1. Регистр адреса EEPROM (EEPROM Address Register, EEAR). Состоит из двух 8-битных регистров EEARH и EEARL. Биты 8-0 этого регистра адресуют одну из 512 ячеек EEPROM.

  2. Регистр данных EEPROM (EEPROM Data Register, EEDR). Используется для чтения-записи EEPROM по адресу, содержащемуся в EEAR.

  3. Регистр управления 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 должна быть выполнена следующая последовательность действий:

  1. Подождать пока EEWE не станет равным нулю.

  2. Если загрузчик (Boot Loader) разрешает CPU программировать Flash-память, подождать пока SPMEN в SPMCR не станет равным нулю.

  3. Записать адрес в EEAR.

  4. Записать данные в EEDR.

  5. Установить бит EEMWE в EECR.

  6. В течение четырех тактов после установки 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;

}