AVR ATmga128은 Harvard architecture로 되어 있기 때문에 프로그램 메모리와 데이터 메모리 2개로 구성되어 있으며 EEPROM 메모리는 데이터 메모리에 속합니다.
1. 프로그램 메모리
AVR ATmega128은 내부에 프로그램 메모리로 사용하는 128k의 플래시 메모리를 가지고 있으며, 8비트 마이크로컨트롤러이지만 이 프로그램 메모리는 각 번지가 16비트 구조로 되어 있어서 64k X 16비트의 용량을 갖습니다. 따라서, 모든 명령이 16비트 또는 32비트 구조로 되어 있으므로 각 명령은 프로그램 메모리에서 1~2개의 번지를 차지하게 됩니다. 프로그램 메모리는 부트 프로그램 섹션(또는 부트로더 섹션)과 응용 프로그램 섹션으로 나뉘어 사용됩니다. 이 플래시 메모리는 SPI 통신방식을 이용한 ISP(In-System Programming)기능을 가지고 있어서 사용자가 작성한 프로그램을 쉽게 라이팅 할 수 있으며, 사용자 프로그램은 플래시 메모리에 10,000번까지 재기입이 가능합니다. 플래시 메모리에 프로그램을 기입하는 방법은 SPI 이외에도 JTAG 에뮬레이터를 사용하는 방법과 병렬 프로그래밍(Parallel Programming) 모드를 이용하는 방법이 있습니다. [그림1]에 프로그램 메모리 맵을 나타내었습니다.
[그림 1] AVR ATmega128의 프로그램 메모리
2. 데이터 메모리
(1)내부 SRAM 메모리
AVR ATmega128의 데이터 메모리는 32바이트의 레지스터 파일, 64바이트의 IO 메모리, 확장된 160바이트의 IO 메모리, 4096바이트의 내부 SRAM 등으로 이루어져 있습니다. 여기서 64바이트의 IO 메모리는 IN/OUT 명령어로 접근이 가능하며, 확장된 160바이트의 IO 메모리는 ST/STS/STD와 LD/LDS/LDD 명령어로 접근이 가능합니다. 이 구조를 그림[2]에 나타내었습니다.
[그림 2] AVR ATmega128의 데이터 메모리
(2)내부 EEPROM 메모리
AVR ATmega128에는 비휘발성 데이터 메모리인 EEPROM이 4K가 내장되어 있는데, 여기에는 플래시 메모리보다 훨씬 많은 100,000번까지 반복적으로 데이터를 기입할 수 있습니다. 이것은 다른 데이터 메모리 어드레스 영역과는 별개의 영역에 해당되어 있으며, EEPROM 어드레스 레지스터, EEPROM 데이터 레지스터 및 EEPROM 제어 레지스터 등을 사용하여 1바이트씩 에세스 할 수 있습니다.
● BIT15..12 : 예약비트
● BIT 11..0 : EEAR11..0(EEPROM Address)
내부 EEPROM 4k바이트를 나타내는 어드레스입니다.
● BIT 7..0 : EEDR7..0(EEPROM Data)
내부 EEPROM에 데이터를 쓰고 읽을 경우에 사용하는 8비트 데이터 레지스터 입니다.
● BIT 3 : EERIE(EEPROM Ready Interrupt Enable)
1로 설정되면 EEWE 비트가 0이 될때 EEPROM Ready 인터럽트를 발생하는 기능을 가진다.
● BIT 2 : EEMWE(EEPROM Master Write Enable)
EEWE를 1로 설정할때 EEPROM에 쓰기가 가능하도록 허용할지 여부를 결정합니다.
● BIT 1 : EEWE(EEPROM Write Enable)
EEMWE가 1로 설정되면 EEWE가 1로 되고 나서 4클록 사이클 이 내에 EEDR의 데이터를 EEAR이 가리키는 EEPROM의 주소에 쓴다. 쓰기가 완료되면 EEMWE는 자동적으로 0이 됩니다.
● BIT 0(EERE : EEPROM Read Enable)
EEPROM의 읽기 스트로브로서 EEAR 레지스터에 적절한 주소값이 부여된 경우 EERE를 1로 해야 EEPROM 읽기가 시작될 수 있다.
※ EEPROM 쓰기과정
다음의 과정을 거쳐 쓰기가 이루어지는데 쓰기가 수행되고 나면 CPU는 다음 명령을 실행하기 전에 2클럭 동 안 멈추고 EEPROM 쓰기는 CPU가 플래시메모리에 쓰기를 할 때는 불가능하다.
①EEWE가 0일 될 때까지 기다린다.
②SPMCSR 레지스터의 SPMEN비트가 0이 될 때까지 기다린다.
③쓰기할 EEPROM주소를 EEAR레지스터에 저장한다.
④쓰기할 EEPROM 데이터를 EEDR레지스터에 저장한다.
⑤EECR레지스터의 EEMWE는 1로 EEWE는 0으로 설정한다.
⑥4클럭 사이클 이내에 EEWE를 1로 설정한다. 그리고 쓰기가 수행된다.
◆ 위의 쓰기 과정에서 ③,④는 순서가 바뀌어도 상관없다. ⑤, ⑥ 과정중에 인터럽 트가 발생되면 EEMWE의 동작 제한시간이 초과되어 쓰기 동작이 실패하게 되므로 이를 방지하기 위해 ③-⑥ 과정동안에는 상태레지스터 SREG의 I비트를 0으로 설정하여 인터럽트 발생을 금지시켜야 한다.
◆ EEPROM 쓰기 과정 중에 파워다운 슬립모드에 진입하면 파원다운 슬립모드에 제대로 진입하지 못하게 되므로 파워다운 모드에 진입하려면 EEPROM 쓰기가 완료되었는지를 확인해야 한다.
◆ 전원 전압이 낮은 동안에는 EEPROM 데이터가 손상될 수 있다. 이를 방지하기 위해 내부 Brown-out 감지기를 작동하게 하고 전원전압이 낮아지면 리셋되도록 하드웨어를 구성하는 것도 괜찮다.
※ EEPROM 읽기과정
①EEWE가 0일 될 때까지 기다린다.
②읽기할 EEPROM주소를 EEAR레지스터에 저장한다.
③EECR레지스터의 EERE를 1로 설정한다.
④EEPROM 데이터를 EEDR레지스터로부터 읽는다.
C Code Example |
void EEPROM_write(unsigned int uiAddress, unsigned char ucData) { /* Wait for completion of previous write */ while(EECR & (1<<EEWE)); /* Set up address and data registers */ EEAR = uiAddress; EEDR = ucData; /* Write logical one to EEMWE */ EECR |= (1<<EEMWE); /* Start eeprom write by setting EEWE */ EECR |= (1<<EEWE); } |
3. 데이터 메모리 : IO 레지스터
[그림 2]과 [그림 3]에서처럼 64바이트로 구성되며 내장된 각종 I/O 장치를 제어하기 위한 레지스터로 IN, OUT 명령을 사용하여 입출력 장치에 접근합니다. 이들은 그림 6의 괄호에 표시한 것처럼 0x20번지에서 0x5F번지까지 존재하지만 IN, OUT 명령을 사용할 때는 그림 6에 표시한 것처럼 0x00에서 0x3F로 지칭해야 합니다. 0x00(0x20)번지에서0x1F(0x3F)번지에 위치하는 32개의 레지스터는 CBI, SBI, SBIC, SBIS 명령을 사용하여 비트 어드레싱이 가능합니다.
[그림 3] ATmega128의 I/O레지스터
'AVR(ATmega128)로 장난하기' 카테고리의 다른 글
AVR(ATmaga128) 기초지식(6)_시스템 클록과 슬립 모드 (0) | 2018.03.17 |
---|---|
AVR(ATmaga128) 기초지식(5)_AVR ATmega128의 메모리(3) (0) | 2018.03.17 |
AVR(ATmaga128) 기초지식(4)_AVR ATmega128의 메모리(2) (1) | 2018.03.17 |
AVR(ATmaga128) 기초지식(2)_AVR ATmega128의 내부구조 (2) | 2018.03.09 |
AVR(ATmaga128) 기초지식(1)_AVR ATmega128이란? (1) | 2018.03.08 |