2011년6월16일_ATmega128 Datasheet page.23까지(칩의 스펙, Block Diagram, AVR CPU core, Memory(Flash + SRAM + EEPROM))
ATmega128 spec (Features) |
● 외부와 내부에 인터럽트 발생원이 있다. (어느 MCU에나 다 있는 것)
● 6개의 대기모드 :
● 소프트웨어적으로 클록주파수 선택.
● ATmega103호환모드를 하려면 Fuse비트를 건들여야함.
● 전체 풀업 저항 비활성이 가능.
풀업이 되어 있으면 평상시 1인 상태를 유지한다.
풀업저항이 없다면 평상시 1과 0인 어떤 상태로 될 지 알 수 없다. 이를 floating이라고 한다.
pachage란 IC의 외형이 어떻게 생겼는가를 나타내고,
총 64개의 핀 중에 53개의 핀을 I/O로 사용이 가능하다.
나머지 11개의 핀은 디지털전원, 아날로그전원, 리셋, 크리스탈(클록입력), 프로그램활성핀이다.
TQFP패키지는 왼쪽 그림과 같이 검은 정사각형 플라스틱 패키지에 다리가 삐져나와 있고,
MLF패키지는 오른쪽 그림과 같이 검은 정사각형 플라스틱 패키지에 다리가 나와 있지 않고 박혀있다.
MLF패키지가 TQFP보다 작아 양산시엔 좋으나 1개 납땜시엔 매우 불편하다.
ATmega128L의 동작전압 범위가 더 넓고 더 낮은 전압에서 동작하므로 저전력이고 ATmega128에 비해 조금 비싸다.
ATmega128 Block Diagram |
ALU위에 범용레지스터 16bit확장가능하고 C에서 접근 불가한 영역(주소가 없음)
여러 장치들을 가로 지르는 버스(Bus) 주변장치 제어명령 및 데이터 이동 통로
프로그램카운터는 다음 수행될 명령어가 들어있는 주소를 기억하고 있고,
프로그램 FLASH메모리는 ATmega128의 경우 128KB이고 여기에 실행코드가 들어 있다.
프로그램 카운터가 가리키는 주소의 명령이 선택되어,
명령레지스터에 들어간다.
명령해독기는 명령레지스터에 있는 Code를 해독하여 여러 장치로 제어신호를 보낸다.
제어선이 어디에 연결되어 있는지 확실히 알 수 없으나 거의 모든 장치와 연결되어 있어,
그 장치가 프로그래머의 의도대로 동작하도록 할 것이다.
스택포인터는 SRAM을 가리키고 있으니 C언어에서 작성한 지역변수들은 SRAM에 저장이 될 것이다.
JTAG핀은 JTAG TAP에 연결된 선을 따라가면 PORTF레지스터와 연결되어 있음을 알 수 있고,
이 JTAG핀과 디버거라는 장비를 연결하여 FLASH메모리에 프로그램을 다운로드할 수 있고,
외부핀의 상태와 내부 레지스터의 상태등 CPU에 대한 정보를 알 수 있다.
또한 JTAG를 통해 임의의 레지스터에 데이터를 기록하여 CPU를 제어할 수도 있다.
ADC는 아날로그신호를 디지털값으로 바꾸어 주는 장치로,
외부에서 아날로그값을 받는 핀은 블록다이어그램에는 표시되어 있지 않으나 2page의 핀설정도를 보면 PORTF와 연결이 되어 있다.
그 외에 아날로그전원이 따로 필요하니 AVCC, AGND핀에서 받고,
아날로그신호를 디지털값으로 바꿀 때 기준으로 사용할 전압은 AREF핀으로 받는다.
또한 ADC장치는 변환이 완료되었다는 것을 알려주기 위해 CPU쪽으로 인터럽트를 발생시키는데 오른쪽 아래에 있는 인터럽트 유닛에 연결이 되어 있다. 인터럽트를 사용하면 좋은 점은 ADC가 열심히 변환을 하는 동안 ALU는 다른 일을 할 수 있다는 것이다.
(AREF핀에 대한 설명과 도식은 나중에 붙여넣기)
(공통GND와 관련된 내용은 추가)
(ADC의 동작원리에 관한 설명도 추가)
상태레지스터는 ALU나 다른 제어회로의 상태를 나타는 레지스터이다.
WatchDog Timer는 프로그래머가 원치 않는 곳으로 프로그램흐름이 바뀌거나,
하드웨어적인 오류가 발생하였을 때 CPU를 리셋시켜주는 기능을 가지고 있다.
ex) 모터를 돌리는 함수의 경우 원하는 추종치까지 모터가 돌지 못 하면 함수가 종료되지 않는다고 할 때,
모터를 무언가가 붙잡고 있으면 함수가 종료되지 않아 WDT가 설정된 시간까지 동작하여 리셋이 될 것이다.
MCU컨트롤레지스터는 외부RAM을 연결할 것인지와 느린RAM과 연결시 wait(시간지연)을 얼마나 줄것인지?
PEN위에 바는 논리가 반대라는 뜻으로,
PEN핀에 0이 입력되면 FLASH에 쓸 준비와 EEPROM에 데이터를 넣고,
PEN핀에 1이 입력되면 통상모드로 내장된 프로그램을 실행하게 된다.
CALIB. OSC는 캘리브레션 발진기로 RC발진선택시 발진주파수를 미세조정하고,
아래의 발진기는 XTAL1과 XTAL2핀에 연결되어 외부 크리스탈이나 오실레이터와 연결이 된다.
XTAL1과 XTAL2핀에 있는 점선은 ATmega128 chip내부와 외부의 경계를 나타내고,
수정발진자 양단에 달린 콘덴서는 세라믹콘덴서이다.
Timing and Control장치는 외부RESET핀에 연결이 되어 있고,
PEN핀과 같이 위에 바가 그어져 있으므로,
0이면 AVR core로 클록공급이 차단되게 하고,
1이면 AVR core로 클록공급이 이루어져 모든 장치들이 동작할 수 있게 된다.
(풀업저항과 그에 관한 이야기를 추가할 자리)
(애자(전기절연체)와 전기안전에 관한 이야기를 추가할 자리)
상기(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에 대한 설명이 시작된다.
8개의 비트 중 우리가 직접 사용할 비트는 7번비트인,
전체인터럽트활성 비트밖에 없고 1이면 모든 인터럽트 발생을 처리하고 0이면 인터럽트발생을 무시한다.
page.12 범용레지스터 파일(모아놓은 것)
R0 ~ R31 레지스터는 범용레지스터로 데이터를 기억만 하고 따로 기능은 없다.
(ARM은 범용레지스터가 기능을 가진다.)
R26부터 R31까진 아래와 같이 2Bytes씩 묶어 사용할 수 있다.
CM선생님께선 범용레지스터에 주소가 없어 C언어에선 사용할 수 없다고 하셨는데,
괄호안에 주소값이 있다. 혹시 사용할 수 있는 것이 아닌지…
스택포인터는 64KBytes의 SRAM공간을 가리키기 위해 16bit의 크기를 갖는다.
(2 ^ 16 = 65536개의 공간 (0 ~ 65535) )
intel CPU EBP와 같이 베이스 포인터는 따로 없는 것 같다.
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)
Normal Mode는 ATmega128의 기능을 모두 사용하는 모드로 4096Bytes의 내부SRAM을 모두 사용할 수 있다.
ATmega103호환모드에선 기능을 모두 사용할 수 없고 내부SRAM도 4000Bytes로 모두 사용하지 못 한다.
메모리설정A는 ATmega128 Normal Mode일 때 메모리의 지도를 보여주고,
메모리설정B는 ATmega103 호환모드일 때 메모리의 지도로,
Normal시엔 160개의 확장I/O레지스터를 사용할 수 있으나 호환모드에선 불가능하고 내부SRAM의 크기도 작다.
내부SRAM에 표시된 4096 * 8에서 8은 8개 있다는 뜻이 아니라 4096 * 8bit로 4096Bytes(4KBytes)라는 뜻이다.
EEAR은 EEARH, EEARL 두 개의 레지스터로 구성되어 있고,
4KBytes(4096Bytes)의 EEPROM을 엑세스하려면 주소를 저장하는 레지스터는 최소12bit가 필요하다.
8bit레지스터 두 개는 16bit이니 최상위 4bit는 쓰지 않는다.
호텔100호실 | 100만 |
위치 | 값 |
Address | Data |
상기의 EEAR이 EEPROM의 주소(공간)를 가리키면 EEDR은 그 공간에 데이터를 기록하거나 읽을 때,
데이터가 들어가는 공간이다.
MSB (Most Significant Bit) : 최상위비트
LSB (Least Significant Bit) : 최하위비트
CPU에 따라 MSB와 LSB의 위치가 다를 수 있다.
Reserved : don’t care로 1또는 0 어떤 값을 써도 아무 일도 일어나지 않는다.
(H/W의 결함으로 사용하지 않는 비트라도 값을 기록하면 오류가 발생할 가능성이 있다. 거의 없을 듯 하다.)
EERIE : EEPROM에 기록할 준비가 되었을 때 인터럽트를 걸어라 (활성화 비트)
EEMWE : 잘 안씀.
EEWE : 기록할 때 사용.
EERE : 읽을 때. 인터럽트 아님.
EECR에 00000101을 기록하려면, (EEMWE와 EERE비트를 세트하려면)
EECR = 0x05; //이렇게 사용하라.
EECR = 0x5; //0x05와 같으나 1Byte크기이니 더 보기 좋고 상위 니블에 0이 들어간다는 것이 확실하다(?)
'내장형하드웨어 > 일일보고서' 카테고리의 다른 글
2011년6월17일_const(상수, 읽기전용), 어떤 메모리영역에 위치해 있나? (0) | 2011.06.20 |
---|---|
2011년6월17일_문자열에서 토큰(token, 어휘)뽑는 함수 strtok( )를 사용해 보자. (6) | 2011.06.17 |
2011년6월16일_문장을 어휘단위로 분해하기(문자열을 token단위로 잘라내기) (0) | 2011.06.17 |
2011년6월15일_어셈블리어로 작성된 코드(함수, 프로시저)를 C코드에서 호출 (0) | 2011.06.16 |
2011년6월15일_달팽이 배열 (0) | 2011.06.15 |