'Small Devices/AVR and ETC'에 해당되는 글 19건

  1. 2012.07.27 뇌를자극하는하드웨어입문 - 8장 외부 메모리 실험 1
반응형

이번 실험은 ATmega162에 외부 메모리를 붙여보는 실험이다. 이번 실험에는 74HC573 이라는 래치와 6264 SRAM을 이용한다. 7장에서의 실험(http://alnova2.tistory.com/545) 을 참고하면 도움이 된다.


1. 주요 IC의 Pin Layout 및 설명

다음은 주요 IC(Atmega162, 6264, 74HC573)의 Out-pin layout 이다.



 - 6264 : 6464는 64Kbit(8 KB) 저장 공간을 가지는 static RAM 이다. I/O 핀은 8개로 한번에 8bit 씩 입/출력이 가능하다. Address 핀은 13개로 A0-A12로 약 2의 13승 즉 0-8192 주소를 접근할 수 있다. CS1과 CS2는 칩 선택 핀으로 CS1와 (실제 핀은 CS1 Invert임을 주의) CS2에 각각 1이 인가 되어야 이 칩을 이용 가능하다. OE 핀은 Output Enable로 이 값에 1이 (핀에는 0) 입력되어야 출력이 활성화 된다. WE핀은 A0-A12로 선택된 메모리 공간에 I/O 에서 입력된 값을 쓸지 결졍하는 것으로 WE에 1(핀에는0)이 입력하면 활성화 된다.

- 74HC573 : 74HC573은 입력값을 저장하는 래치로 LE에 1을 입력하면 D0-D7(상기는 D1-D8) 입력한 값을 플립플롭에 기억한다. OE에 1을 입력하면 플립플롭에 기록한 값을 Q0-Q7(상기는 Q1-Q8)에 출력해 준다.


2. 회로도

다음은 본 실험의 회로도 이다.

- Atmega162의 Address Pin 0-7번은 Data I/O Pin과 공유된다. 이는 제조사가 Pin 수를 줄이기 위한 방법이다. 즉 AD0-AD7은 ALE가 1일 경우에 A0-A7 (즉 Address 설정 핀) 로 동작하고 ALE가 0일 경우 D0-D7 으로 Data I/O 핀으로 설정된다. Data의 입력/출력은 WR 값에 따라서 달라진다.

- 74HC573의 OE에 1을 항상 인가하여 내부 플립플롭의 값의 변화가 그대로 Q0-Q7으로 출력되도록 하였다. LE는 PE1(ALE)에 입력한다. 하기는 Atmega162의 External Data Memory Cycle이다

- 6264 메모리의 A8-A12는 Atmega162의 A8-A12에 연결하고 A13-A15는 무시한다.


 상기 그림의 Write 부분을 보면 ALE가 1로 바뀌면서 AD0-AD7(상기 그림의 DA7:0)과  A8-A15 부분에 Address가 출력된다. 그리고 ALE가 0으로 바뀌면서 AD0-AD7에 데이터가 출력된다. 따라서 ALE가 1로 바뀌면서 출력되는 Address의 상위 8비트를 74HC573에 기억 시키고 데이터가 출력될때 ALE가 0으로 바뀌면서 74HC573의 LE가 0으로 바뀌게 되어 데이터의 출력이 74HC573의 플립플롭에는 영향을 주지 않는다. 즉 6264의 A0-A7은 ALE가 1이였을때 출력했던 AD0-AD7의 Address 설정값을 유지하는 것이다. 이때 WR값이 1로 되면서 AD0-AD7에 DAta가 출력된다.

 Atmega162가 데이터를 읽어야 한다면 RD를 1로 인가하고 AD0-AD7에 8비트 데이터를 입력하면 된다. 상기의 Memory Cycle은 SRWn1과 SRWn0 의 설정 값에 따라소 조금씩 달라질 수 있다. 이 값은 MCUCR 레지스터로 설정 가능하다.

- Atmega162의 메모리 맵은 다음과 같다.


일반적으로 외부 메모리는 0x500(10진수 1280) 부터 시작된다. (0x470 부터 시작되는 것은 Atmega162 Compatibility Fuse 설정으로 변경된다.) 내부 메모리중 0x000-0x0100 까지는 레지스터등이 저장되며 실제 사용 가능한 내부 메모리는 0x0100-0x04FF 까지이다. 본 회로에서는 A13이 6264의 CS2에 인가된다. 따라서 A13이 1인 경우에만 6264 메모리를 이용 가능하다. 즉 A13이 1로 세팅되고 A12:0 까지의 Address 공간을 메모리로 이용 가능한 것이다. A14, A15 pin이 연결되지 않았기 때문에 Address 공간은 회로상으로 0x2000(0b0010 -), 0x6000(0b0110 -), 0xA000(0b1110 -) 부터 2의 13승 즉 8*1024(8K) 개의 Address를 이용 가능하다. 

 Address중 Internal Memory 영역을 설정하게 되면 RD, WR 에 0이 출력되어 외부 메모리를 이용 불가능하게 만든다. 따라서 CS2를 연결하지 않고 CS2에 무조건 1을 인가할 경우 사용 가능한 address는 0x0500 - 0x1FFF까지만 이용 가능하게 된다. 


3. 프로그램

#include <avr/io.h>

#include <avr/interrupt.h>

#include <avr/signal.h>

char rx=0;

int timer_count=0;

int count=0;

unsigned int addr=0x2000;

char *ExternRam;

void Putch(char data)

{

while(!(UCSR0A & 0x20));

UDR0=data;

}

SIGNAL(SIG_USART0_RECV)

{

char string[]="\r\n메세지 잘 받았습니다\r\n";

char *pStr;

rx=UDR0;

pStr=string;

while(*pStr) Putch(*pStr++);

}

SIGNAL(SIG_OUTPUT_COMPARE0)

{

ExternRam=(char*)(addr);

if(timer_count==60)

{

Putch(*(ExternRam+count)+48);

PORTB=*(ExternRam+count);

timer_count=0;

count++;

if(count==0xFF) count=0;

}

timer_count++;

}

int main(void)

{

char string[]="\r\n안녕하세요\r\n";

char *pStr;

int i;

int number_count=0;

DDRB=0xFF;

PORTB=0x00;

cli();

UCSR0A=0x00;

UCSR0B=0b10011000;

UCSR0C=0b10000110; 1)

UBRR0L=103;

UBRR0H=0;

timer_count=0;

TCCR0=0b00001101;

OCR0=125;

TCNT0=0x00;

TIMSK=0x01; 2)

MCUCR=0x80;

EMCUCR=0x02;

SFIOR=0x00; 3)

ExternRam=(char*)(addr);

for(i=0;i<100;i++)

{

*(ExternRam+i)=number_count;

number_count++;

if(number_count==3) number_count=0;

}

sei();

pStr=string;

while(*pStr) Putch(*pStr++);

while(1);

} 

 1) 시리얼 포트 설정

  - UCSR0A를 0으로 설정하여 U2X0 (송신 속도 2배 설정), MPCM0 (멀티 프로세서 통신 모드)를 해제하였다.
  - UCSR0B를 0b10011000 으로 설정하여 RXCIE0(수신 완료 인터럽트 인에이블), RXEN0/TXEN0(송/수신기 인에이블) 로 설정하였다.
  - UCSR0C를 0b10000110 으로 설정하여 URSEL0(레지스터 설택 비트), UCSZ01/UCSZ00(전송 데이터 비트 수 설정)을 1로 설정하였다.
2) 타이머 설정
 - 타이머 설정은 http://alnova2.tistory.com/552 를 참고
3) 외부 메모리 설정 (XMEM  Register )
 - MCUCR 레지스터 설정 (MCU Control Register)

이중 외부 메모리에 관련된 비트는 7번과 6번이다. SRE를 1로 설정하면 AD0-AD7, A8-A15, ALE, WR, RD를 사용한다는 의미로 여기에 해당하는 핀들은 포트로 사용되지 않는다. DDRD, DDRB등의 포트의 입출력 방향 설정은 무효가 되며 SRE 비트를 0으로 하게 되면 포트 방향 설정이 유효가 된다.SRW10 비트는 웨이트 사이클 설정 비트로 다음의 EMCUCR 의 비트들과 함께 사용된다. 본 프로그램에서는 0x80 (0b10000000)으로 SRE만 1로 설정한다.

 - EMCUCR 레지스터 설정 (Extended MCU Control Register)

SRL 비트는 메모리 섹터 분할에 이용된다. 다음은 SRL 비트에 따른 메모리 섹터 영역이다. 

SRW 비트는 MCUCR의 SRW10 비트와 함께 웨이트 사이클을 설정할때 사용 된다. 

EMCUCR은 0x02(0b00000010)으로 설정하여  read/write 에 대한 웨이트 사이클은 2개를 가져갈 것이다. 

- SFIOR 레지스터 설정 (Special Function IO Register)

 XMBK 비트는 외부 메모리 버스 키퍼 인에이블 비트로 본 프로그램에서 사용하지 않는다. XMM 비트는 8비트 이후의 어디르세 핀에서 어느 것을 어드레스 핀으로 설정하는 것으로 PORTC의 일부 핀을 Release한다.

SFIOR 레지스터는 0x00 으로 설정한다.


4. 실험

본 실험은 breadboard에 진행하였다.

실험 결과

외부 메모리에 100개의 1,2를 연속으로 채워 넣은 다음에 외부 메모리를 특정 타이머 값이 되면 Address를 증가시키면서 출력한다. Address가 100이상 증가할 경우 이상한 값들이 출력되는데 이는 초기화되지 않은 쓰레기 값이 된다.



반응형
Posted by alias
,