외부 메모리 인터페이스는 데이터 메모리 추가 뿐만 아니라, 메모리 맵 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;
}
'전기, 전자 > Microprocessor' 카테고리의 다른 글
AVR 퓨즈비트가 잘못 설정된 칩 살리기 (0) | 2007.02.27 |
---|---|
ATmega128 A/D 컨버터 사용법 (1) | 2007.02.27 |
ATmega128 USART(시리얼 통신) 사용법 (2) | 2007.02.27 |
ATmega128 타이머/카운터 사용법 (1) | 2007.02.27 |
ATmega128 포트제어(포트제어 레지스터 사용법) (1) | 2007.02.27 |