Регистр управления микроконтроллером
Включение/отключения внешней памяти
Наличие тактов ожидания (см. XMCRA)
Наличие sleep режима
Управление перемещением таблицы векторов прерывания с привязкой/нет к расположению области загрузчика
Определение адресных зон с требуемым числом тактов ожидания (верхняя и нижняя)
Установка числа тактов ожидания для внешней памяти для обеих зон
Режим удержания выхода
Управление портом С при доступе к XRAM
Пример: С – транскрипция:
#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
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
Запись в 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