2011년6월16일_ATmega128 Datasheet page.23까지(칩의 스펙, Block Diagram, AVR CPU core, Memory(Flash + SRAM + EEPROM))

 

 

 

ATmega128 spec (Features)

 

image

● 외부와 내부에 인터럽트 발생원이 있다. (어느 MCU에나 다 있는 것)
● 6개의 대기모드 :
● 소프트웨어적으로 클록주파수 선택.
● ATmega103호환모드를 하려면 Fuse비트를 건들여야함.
● 전체 풀업 저항 비활성이 가능.

풀업이 되어 있으면 평상시 1인 상태를 유지한다.
풀업저항이 없다면 평상시 1과 0인 어떤 상태로 될 지 알 수 없다. 이를 floating이라고 한다.



image

pachage란 IC의 외형이 어떻게 생겼는가를 나타내고,
총 64개의 핀 중에 53개의 핀을 I/O로 사용이 가능하다.
나머지 11개의 핀은 디지털전원, 아날로그전원, 리셋, 크리스탈(클록입력), 프로그램활성핀이다.

 

image image

TQFP패키지는 왼쪽 그림과 같이 검은 정사각형 플라스틱 패키지에 다리가 삐져나와 있고,
MLF패키지는 오른쪽 그림과 같이 검은 정사각형 플라스틱 패키지에 다리가 나와 있지 않고 박혀있다.
MLF패키지가 TQFP보다 작아 양산시엔 좋으나 1개 납땜시엔 매우 불편하다.

 

image

ATmega128L의 동작전압 범위가 더 넓고 더 낮은 전압에서 동작하므로 저전력이고 ATmega128에 비해 조금 비싸다.

 

 

ATmega128 Block Diagram

 

image

 

image ALU위에 범용레지스터 16bit확장가능하고 C에서 접근 불가한 영역(주소가 없음)

 

image 여러 장치들을 가로 지르는 버스(Bus) 주변장치 제어명령 및 데이터 이동 통로

image


프로그램카운터는 다음 수행될 명령어가 들어있는 주소를 기억하고 있고,

프로그램 FLASH메모리는 ATmega128의 경우 128KB이고 여기에 실행코드가 들어 있다.
프로그램 카운터가 가리키는 주소의 명령이 선택되어,

명령레지스터에 들어간다.

명령해독기는 명령레지스터에 있는 Code를 해독하여 여러 장치로 제어신호를 보낸다.

제어선이 어디에 연결되어 있는지 확실히 알 수 없으나 거의 모든 장치와 연결되어 있어,
그 장치가 프로그래머의 의도대로 동작하도록 할 것이다.

 

image 스택포인터는 SRAM을 가리키고 있으니 C언어에서 작성한 지역변수들은 SRAM에 저장이 될 것이다.

 

image














JTAG핀은 JTAG TAP에 연결된 선을 따라가면 PORTF레지스터와 연결되어 있음을 알 수 있고,
이 JTAG핀과 디버거라는 장비를 연결하여 FLASH메모리에 프로그램을 다운로드할 수 있고,
외부핀의 상태와 내부 레지스터의 상태등 CPU에 대한 정보를 알 수 있다.
또한 JTAG를 통해 임의의 레지스터에 데이터를 기록하여 CPU를 제어할 수도 있다.

 

image

ADC는 아날로그신호를 디지털값으로 바꾸어 주는 장치로,
외부에서 아날로그값을 받는 핀은 블록다이어그램에는 표시되어 있지 않으나 2page의 핀설정도를 보면 PORTF와 연결이 되어 있다.
그 외에 아날로그전원이 따로 필요하니 AVCC, AGND핀에서 받고,
아날로그신호를 디지털값으로 바꿀 때 기준으로 사용할 전압은 AREF핀으로 받는다.
또한 ADC장치는 변환이 완료되었다는 것을 알려주기 위해 CPU쪽으로 인터럽트를 발생시키는데 오른쪽 아래에 있는 인터럽트 유닛에 연결이 되어 있다. 인터럽트를 사용하면 좋은 점은 ADC가 열심히 변환을 하는 동안 ALU는 다른 일을 할 수 있다는 것이다.

(AREF핀에 대한 설명과 도식은 나중에 붙여넣기)
(공통GND와 관련된 내용은 추가)
(ADC의 동작원리에 관한 설명도 추가)

image 상태레지스터는 ALU나 다른 제어회로의 상태를 나타는 레지스터이다.


image WatchDog Timer는 프로그래머가 원치 않는 곳으로 프로그램흐름이 바뀌거나,
하드웨어적인 오류가 발생하였을 때 CPU를 리셋시켜주는 기능을 가지고 있다.
ex) 모터를 돌리는 함수의 경우 원하는 추종치까지 모터가 돌지 못 하면 함수가 종료되지 않는다고 할 때,
    모터를 무언가가 붙잡고 있으면 함수가 종료되지 않아 WDT가 설정된 시간까지 동작하여 리셋이 될 것이다.

 

image MCU컨트롤레지스터는 외부RAM을 연결할 것인지와 느린RAM과 연결시 wait(시간지연)을 얼마나 줄것인지?


image PEN위에 바는 논리가 반대라는 뜻으로,
PEN핀에 0이 입력되면 FLASH에 쓸 준비와 EEPROM에 데이터를 넣고,
PEN핀에 1이 입력되면 통상모드로 내장된 프로그램을 실행하게 된다.

 

image








CALIB. OSC는 캘리브레션 발진기로 RC발진선택시 발진주파수를 미세조정하고,
아래의 발진기는 XTAL1과 XTAL2핀에 연결되어 외부 크리스탈이나 오실레이터와 연결이 된다.

XTAL1과 XTAL2핀에 있는 점선은 ATmega128 chip내부와 외부의 경계를 나타내고,
수정발진자 양단에 달린 콘덴서는 세라믹콘덴서이다.




image 









Timing and Control장치는 외부RESET핀에 연결이 되어 있고,
PEN핀과 같이 위에 바가 그어져 있으므로,
0이면 AVR core로 클록공급이 차단되게 하고,
1이면 AVR core로 클록공급이 이루어져 모든 장치들이 동작할 수 있게 된다.


(풀업저항과 그에 관한 이야기를 추가할 자리)
(애자(전기절연체)와 전기안전에 관한 이야기를 추가할 자리)

image image 

상기(JTAG)에서 설명한대로 PORTF에 JTAG장치가 연결되어 있어,
디버거를 PORTF에 연결에 연결해야 한다.

PORTE에는 아날로그비교기와 USART0(이하 UART0)가 달려있어 범용 입출력핀으로 사용외에,
특수기능인 아날로그전압을 받아 +단자전압이 –단자전압 보다 크면 디지털값 1이 되어 인터럽트를 발생시키거나,
타이머/카운터1의 캡쳐트리거 MUX(멀티플렉서)로 들어가게 된다.

PORTB에는 SPI라는 고속 동기식 4선식 직렬 통신모듈의 4개의 신호선이 아래와 같이 결선되어 있다.
SS – PB0 (10번 핀)
SCK – PB1 (11번 핀)
MOSI – PB2 (12번 핀)
MISO – PB3 (13번 핀)

● ATmega128 Datasheet page.4에는 ATmega103과 ATmega128의 호환에 대해 설명되어 있다.

 

 

AVR CPU Core


● ATmega128 Datasheet page.10에는 AVR CPU Core에 대한 설명이 시작된다.


 image

8개의 비트 중 우리가 직접 사용할 비트는 7번비트인,
전체인터럽트활성 비트밖에 없고 1이면 모든 인터럽트 발생을 처리하고 0이면 인터럽트발생을 무시한다.

 

image 

page.12 범용레지스터 파일(모아놓은 것)

R0 ~ R31 레지스터는 범용레지스터로 데이터를 기억만 하고 따로 기능은 없다.
(ARM은 범용레지스터가 기능을 가진다.)

R26부터 R31까진 아래와 같이 2Bytes씩 묶어 사용할 수 있다.


image

CM선생님께선 범용레지스터에 주소가 없어 C언어에선 사용할 수 없다고 하셨는데,
괄호안에 주소값이 있다. 혹시 사용할 수 있는 것이 아닌지…

 

image


스택포인터는 64KBytes의 SRAM공간을 가리키기 위해 16bit의 크기를 갖는다.
(2 ^ 16 = 65536개의 공간 (0 ~ 65535) )
intel CPU EBP와 같이 베이스 포인터는 따로 없는 것 같다.

 

image

T1, T2 ,T3, T4를 각 cycle이라 부르고,   (클럭 = 1 / 주기,  주기 = cycle)

T1 cycle에선 최초수행으로 이전 명령이 Fetch(불러옴)되지 않았으니 실행하지 않고 첫 명령을 Fetch하고,
T2 cycle에선 이전에 Fetch한 첫 명령을 실행하고 두 번째 명령을 Fetch하고,
T3 cycle에선 이전에 Fetch한 두 번째 명령을 실행하고 세 번째 명령을 Fetch한다.

이렇게 한 cycle에 두 가지의 일을 할 수 있는 것은 ARM CPU와 같이 내부에 명령어 파이프라인이 있기 때문이다.
AVR의 경우 2단계 파이프라인을 가지고 있고 ARM7의 경우엔 3단계 파이프라인을 가지고 있다.
파이프라인을 늘린다고 해서 성능이 배로 증가하는게 아니라 몇 십%정도 증가하는데 그친다.
예) 과제를 2~5명이 같이 한다고 빨리 끝낼 수 있게 아니다.

● page.16 C Code와 어셈블리어
● page.18 ATmega128 memories (수명과 PC가 16bit(폭) * 64K(높이) = 128KBytes)



image

Normal Mode는 ATmega128의 기능을 모두 사용하는 모드로 4096Bytes의 내부SRAM을 모두 사용할 수 있다.
ATmega103호환모드에선 기능을 모두 사용할 수 없고 내부SRAM도 4000Bytes로 모두 사용하지 못 한다.

 

image

메모리설정A는 ATmega128 Normal Mode일 때 메모리의 지도를 보여주고,
메모리설정B는 ATmega103 호환모드일 때 메모리의 지도로,
Normal시엔 160개의 확장I/O레지스터를 사용할 수 있으나 호환모드에선 불가능하고 내부SRAM의 크기도 작다.

내부SRAM에 표시된 4096 * 8에서 8은 8개 있다는 뜻이 아니라 4096 * 8bit로 4096Bytes(4KBytes)라는 뜻이다.

 

image 

EEAR은 EEARH, EEARL 두 개의 레지스터로 구성되어 있고,

 

image


4KBytes(4096Bytes)의 EEPROM을 엑세스하려면 주소를 저장하는 레지스터는 최소12bit가 필요하다.
8bit레지스터 두 개는 16bit이니 최상위 4bit는 쓰지 않는다.

호텔100호실 100만
위치
Address Data


image

상기의 EEAR이 EEPROM의 주소(공간)를 가리키면 EEDR은 그 공간에 데이터를 기록하거나 읽을 때,
데이터가 들어가는 공간이다.

MSB (Most Significant Bit) : 최상위비트
LSB (Least Significant Bit) : 최하위비트

CPU에 따라 MSB와 LSB의 위치가 다를 수 있다.

 

image

Reserved : don’t care로 1또는 0 어떤 값을 써도 아무 일도 일어나지 않는다.
             (H/W의 결함으로 사용하지 않는 비트라도 값을 기록하면 오류가 발생할 가능성이 있다. 거의 없을 듯 하다.)

EERIE : EEPROM에 기록할 준비가 되었을 때 인터럽트를 걸어라 (활성화 비트)
EEMWE : 잘 안씀.
EEWE : 기록할 때 사용.
EERE : 읽을 때.  인터럽트 아님.

EECR에 00000101을 기록하려면,  (EEMWE와 EERE비트를 세트하려면)
EECR = 0x05;    //이렇게 사용하라.
EECR = 0x5;      //0x05와 같으나 1Byte크기이니 더 보기 좋고 상위 니블에 0이 들어간다는 것이 확실하다(?)