AVR ATmega128은 AVR RISC 구조를 바탕으로 만들어진 8비트의 CMOS형 마이크로컨트롤러입니다. AVR ATmega128 마이크로 컨트롤러는 Harvard Architecture로 설계되었기 때문에 내부 버스인 프로그램 버스와 데이터 버스가 2가지로 분리되어 있습니다. AVR ATmega128의 프로그램 메모리는 64k워드 플래시 롬으로 이루어져 있으며 이를 위한 버스도 내부에만 존재하게 됩니다. 내부 SRAM은 4k바이트이고, 내부 EEPROM 메모리는 4k바이트로 구성되어 있습니다. [그림1]에 내부 구조를 나타내었습니다.
그림1. AVR ATmega128의 내부구조
[그림1]에서 CPU 코아만 다시 나타내면 [그림2]가 됩니다. 이 CPU 코아는 AVR ATmega128의 중요 부분으로서 PC(프로그램 카운터)가 지시하는 플래시 메모리 번지에서 명령을 인출(fetch)하고 해독(decode) 하는 부분과 ALU(Arithmetic & Logic Unit, 산술 논리 장치), 32개의 범용 레지스터, 상태 레지스터(SREG), SP(스택 포인터)등의 명령처리 관련 부분과 데이터 메모리 및 인터럽트 처리기 등으로 이루어져 있습니다.
그림2. AVR ATmega128의 CPU CORE
1. 상태 레지스터(Status Register)
상태 레지스터(Status Register, SREG)는 ALU가 가장 최근에 실행한 산술연산 명령의 결과의 상태를 표시하는 레지스터입니다. 여기에 나타난 상태 비트는 조건부 처리명령에 의하여 프로그램의 흐름을 변경하는 데 사용될 수 있으며, 인터럽트를 실행할 때 자동으로 PUSH되거나 POP되지 않으므로 사용자가 이를 소프트웨어로 처리하여야 합니다.
● BIT 7 : I(Global Interrupt Enable)
전체 인터럽트를 허룡하도록 설정하는 비트로, SEI 및 CLI 명령으로 이 비트를 각각 세트 또는 리셋시킬 수 있습니다. 인터럽트 처리가 시작되면 이 비트는 자동적드로 클리어되며, 나중에 RETI 명령을 만나면 다시 원래 상태로 복구됩니다. 각 인터럽트를 개별적으로 허용하는 것은 인터럽트 마스크 레지스터에 의하여 설정됩니다.
● BIT 6 : T(Bit Copy Storage)
BLD(Bit Load) 및 BST(Bit Store) 명령을 사용하여 이 비트와 어느 레지스터의 한 비트 사이에 비트 복사가 가능하다
● BIT 5 : H(Half Carry Flag)
산술연산의 가산에서 Half carry가 발생하거나 감산에서 Half borrow가 발생하였음을 나타내며 BCD 연산에서 자주 사용된다.
● BIT 4 : S(Sign Bit, S = N+V)
플래그 N과 플래그 V의 exclusive-OR로 결정되는 값을 저장하며, 이는 부호없는 정수 및 부호있는 정수들의 크기를 판단할 때 자주 사용된다.
● BIT 3 : V(Two's Complement Overflow Flag)
2의 보수 연산에서 overflow가 발생하였음을 표시한다.
● BIT 2 : N(Negative Flag)
산술연산 및 논리연산 결과 최상위 비트가 1로 되었으므로 2의 보수 표현법을 사용하는 경우 연산 결과가 음수라는 것을 표시한다.
● BIT 1 : Z(Zero Flag)
산술연산 및 논리연산 결과 0이 되었음을 표시한다.
● BIT 0 : C(Carry Flag)
산술연산의 가산 및 논리연산 결과 자리올림(Carry)이 발생하였음을 나타낸다. 감산에서 이 비트가 자리내림(Borrow)을 표시한다.
2. 범용 레지스터 파일
AVR ATmega128은 "Register to Register" 구조로 되어있으며 RISC를 실현시킨 CPU이므로 누산기(Accumulator)가 없으며 [그림3]에 나타냈듯이 32개의 8비트 범용 레지스터 R0~R13을 가지고 있다. 이들 32개의 레지스터는 기본적인 사칙연산을 수행할 수 있으며, 즉치 데이터(immediate data)를 사용하는 일부의 연산명령은 R16~R31에서만 수행됩니다.
그림3. AVR CPU의 범묭 레지스터
3. X, Y, Z 레지스터
32개의 범용 레지스터중에서 R26~R31은 각각 2개씩 합해져서 3개의 16비트 레지스터 X레지스터, Y레지스터, Z레지스터로 사용될 수 있습니다. 이 16비트 레지스터들은 주로 데이터 메모리의 16비트 어드레스를 간접 지정하는 어드레스 포인터로 사용되며, 또한 Z레지스터는 LPM,ELPM,SPM 명령에서 프로그램 메모리 영역의 상수를 액세스하는 데 사용되기도 합니다. [그림4]에 나타내었습니다.
그림4. X, Y, Z 레지스터
4. 스택 포인터
스택(Stack)은 서부루틴 호출이나 인터럽트가 발행하였을 때 복귀주소를 저장하며, C언어의 지역변수(local variable) 및 어셈블리의 임시 데이터를 저장하는 용도로 사용됩니다.
스택포인터(Stack Pointer, SP)는 항상 스택의 상단(TOP)을 가리키는 16비트 레지스터로서, 이는 데이터 저장이 가능한 스택의 번지를 의미합니다. Push 명령을 사용하면 1바이트의 데이터를 SP가 가리키는 스택 메모리 번지에 저장하고 나서 SP값을 1만큼 감소시키며, POP 명령을 사용하면 먼저 SP값을 1만큼 증가시킨 후에 SP가 가리키는 스택 메모리 번지에서 1바이트의 데이터를 꺼냅니다. 그러나 서브루틴을 호출하거나 인터럽트 발생시에는 16 비트의 복귀주소를 저장해야 하므로 SP 레지스터의 값이 2만큼 감소하며, RET 또는 RETI 명령을 수행하면 SP 레지스터의 값이 2만큼 증가합니다.
AVR ATmega128에서 SP 레지스터의 초기값은 적어도 $60 번지 이상의 값으로 설정하여야 합니다.
4. RAM Page Z Select Register(RAMPZ)
RAMPZ 레지스터는 Z 포인터에 의해 접근 가능한 64k RAM Page를 선택할 때 사용됩니다. ATmega128은 64k바이트 이상의 외부 메모리를 지원하지 않기 때문에 ELPM/SPM 명령어가 사용될 때, 프로그램 메모리의 어느 페이지에 접근할지를 선택할 때 사용됩니다.
● BIT 7..1 : 예약 비트
● BIT 0 : RAMPZ0(Extended RAM Page Z-pinter)
*RAMPZ0 = 0 : ELPM/SPM 명령어에 의해서 접근 가능한 프로그램 영역은 하 위 64k바이트($0000-$7FFF)입니다.
*RAMPZ0 = 1 : ELPM/SPM 명령어에 의해서 접근 가능한 프로그램 영역은 상 위 64k바이트($8000-$FFFF)입니다.
'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) 기초지식(3)_AVR ATmega128의 메모리(1) (1) | 2018.03.09 |
AVR(ATmaga128) 기초지식(1)_AVR ATmega128이란? (1) | 2018.03.08 |