35
2467S–AVR–07/09
ATmega128
Using all 64KB
Locations of External
Memory
Since the External Memory is mapped after the Internal Memory as shown in
, only
60KB of External Memory is available by default (address space 0x0000 to 0x10FF is reserved
for internal memory). However, it is possible to take advantage of the entire External Memory by
masking the higher address bits to zero. This can be done by using the XMMn bits and control
by software the most significant bits of the address. By setting Port C to output 0x00, and releas-
ing the most significant bits for normal Port Pin operation, the Memory Interface will address
0x0000 - 0x1FFF. See the following code examples.
Note:
1. See “About Code Examples” on page 9.
Care must be exercised using this option as most of the memory is masked away.
Assembly Code Example
; OFFSET is defined to 0x2000 to ensure
; external memory access
; Configure Port C (address high byte) to
; output 0x00 when the pins are released
; for normal Port Pin operation
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
OFFSET, r16
; re-enable PC7:5 for external memory
ldi
r16, (0<<XMM1)|(0<<XMM0)
sts
XMCRB, r16
; store 0x55 to address ( 1) of
; external memory
ldi
r16, 0x55
sts
OFFSET, r16
C Code Example
#define OFFSET 0x2000
void XRAM_example(void)
{
unsigned char *p = (unsigned char *) ( 1);
DDRC = 0xFF;
PORTC = 0x00;
XMCRB = (1<<XMM1) | (1<<XMM0);
*p = 0xaa;
XMCRB = 0x00;
*p = 0x55;
}