외부 메모리 인터페이스는 데이터 메모리 추가 뿐만 아니라, 메모리 맵 I/O방식을 이용하여 외부 디바이스를 추가할 수 있다.
Atmega128의 ALE, RD, WR, 포트A와 C를 이용하여 외부에 데이터 메모리를 추가하는 방법에 대해 알아보자. MCU 제어 레지스터(MCUCR)의 SRE비트와 SRW비트의 제어에 따라 외부 메모리 인터페이스가 가능하다.
어드레스 라인/데이터 라인을 공통으로 연결하고 디코딩 회로를 구성하여 디바이스를 추가하면 부족한 I/O의 수를 늘릴 수 있다.
프로그램 예제
외부메모리를 사용하기 위한 예제 (레지스터 설정과 함수를 보도록 합니다.)
#include <iom128.h>
#include <ina90.h>
#include <sig-avr.h>
#include <interrupt.h>
#define SYSTEM_CLOCK 16000000 // CLOCK (X-tal frequency)
typedef unsigned char BYTE;
typedef unsigned int WORD;
void Port_Init(void)
{ //Port_A setting up output
outp(0xFF, DDRA);
}
void Init_ExtIF(void)
{ outp(0x80, MCUCR); //SRW10
outp(0x02, XMCRA); //SRW11
outp(0x80, XMCRB); // bus keeper
}
// R / W BYTE
void RAM_ReadData(WORD adr)
{ BYTE val;
char *io;
io = (char *) (adr);
val = *io;
return(val);
}
void RAM_WriteData(WORD adr, BYTE data)
{
char *io;
io = (char *) (adr);
*io = data;
}
void USART_Transmit(BYTE data)
{ while (!(inp(UCSR0A) & (1<<UDRE)));
outp(data, UDR0);
}
void USART_Transmit_String(char* aString)
{
while(*aString != '\0')
{
USART_Transmit(*aString);
aString++;
}
}
void RAM_TEST(void)
{
WORD test_add = 0x5432;
BYTE test_data = 0x22;
USART_Transmit_String("RAM Test ............... ");
RAM_WriteData(test_add, test_data);
if (RAM_ReadData(test_add) == test_data)
{
USART_Transmit_String("Success!\r\n");
}
else
{
USART_Transmit_String("Failure!\r\n");
}
}
int main(void)
{
Port_Init();
Init_ExtIF();
sei();
RAM_TEST();
while(1)
{
}
return 0;
}