Регистр управления микроконтроллером

Включение/отключения внешней памяти

Наличие тактов ожидания (см. XMCRA)

Наличие sleep режима

Управление перемещением таблицы векторов прерывания с привязкой/нет к расположению области загрузчика

Регистр управления микроконтроллером - student2.ru

Определение адресных зон с требуемым числом тактов ожидания (верхняя и нижняя)

Установка числа тактов ожидания для внешней памяти для обеих зон

Регистр управления микроконтроллером - student2.ru

Режим удержания выхода

Управление портом С при доступе к XRAM

Регистр управления микроконтроллером - student2.ru

Регистр управления микроконтроллером - student2.ru

Пример: С – транскрипция:

#define OFFSET 0x2100

Void XRAM_example(void)

{

unsigned char *p = (unsigned char *) (OFFSET + 1);

DDRC = 0xFF;

PORTC = 0x00;

XMCRB = (1<<XMM1) | (1<<XMM0);

*p = 0xaa; // запись по адресу 0х101

XMCRB = 0x00;

*p = 0x55; // запись по адресу 0х2101

}

Asm – транскрипция:

; OFFSET определить как 0x2100

; Configure Port C (address high byte)

Ldi r16, 0xFF

Out DDRC, r16

Ldi r16, 0x00

Out PORTC, r16

; release PC7:5

ldi r16, (1<<XMM1)|(1<<XMM0)

Sts XMCRB, r16

; write 0xAA to address 0x0001 of external memory

Ldi r16, 0xaa

sts 0x0001+OFFSET, r16

; re-enable PC7:5 for external memory

ldi r16, (0<<XMM1)|(0<<XMM0)

Sts XMCRB, r16

; store 0x55 to address (OFFSET + 1) of external memory

Ldi r16, 0x55

sts 0x0001+OFFSET, r16

FLASH

Регистр управления микроконтроллером - student2.ru

RAMPZ0 = 0 Инструкции ELPM/SPM осуществляют доступ к памяти программ в диапазоне адресов $0000 - $7FFF (младшие 64 кбайт)
RAMPZ0 = 1 Инструкции ELPM/SPM выполняют доступ к памяти программ в диапазоне адресов $8000 - $FFFF (старшие 64 кбайт)

; только для ATmega103+

Clr r16

Ldi ZL, 0x23

Ldi ZH, 0x11

Lpm ; адрес байта 0x01123

Mov r17,r0

Inc r16

Sts RAMPZ, r16

Elpm ; адрес байта 0x11123

Mov r18,r0

МАКРОСЫ

.MACROмакроимя

Пример:
.MACRO SUBI16 ; Начало макроопределения
subi @1,low(@0) ; Вычесть младший байт параметра 0 из параметра 1
sbci @2,high(@0) ; Вычесть старший байт параметра 0 из параметра 2
.ENDMACRO ; Конец макроопределения

.CSEG ; Начало программного сегмента
SUBI16 0x1234,r16,r17 ; Вычесть 0x1234 из r17:r16

EEPROM

Регистр управления микроконтроллером - student2.ru

Регистр управления микроконтроллером - student2.ru

Регистр управления микроконтроллером - student2.ru

Регистр управления микроконтроллером - student2.ru Запись в EEPROM

Assembly Code Example

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

C Code Example

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

Assembly Code Example

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

C Code Example

Наши рекомендации