2007. 2. 27. 18:30

외부 메모리 인터페이스는 데이터 메모리 추가 뿐만 아니라, 메모리 맵 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;
}

Posted by Paul Hwang