본문 바로가기

배움의 즐거움/하드웨어

ATmega128로 배우는 마이크로컨트롤러 프로그래밍(2) - ATmega128 소개

반응형

앞에서는 마이크로컨트롤러란 무엇인지 컴퓨터와 비교해가며 알아보았다. 이번 글에서는 마이크로컨트롤러, 그중에서 ATmega128에 대해서 정리해 볼 것이다. 사실 책의 내용을 간략하게 요약해서 나중에 참고로 읽으려고 했는데, 쓰다 보니 중요하거나 흥미로운 내용이 너무 많아서 글이 좀 길어지고 있다. 

 

ATmega128로 배우는 마이크로컨트롤러 프로그래밍(1) - 마이크로 컨트롤러란?

지난주부터 팹 아카데미에서 Electronics에 관한 수업이 시작되었다. 그런데 수업시간에 모르는 개념들이 많이 나왔고, 인터넷에 용어의 정의를 찾아봐도 잘 이해가 되지 않았다. (9) 네덜란드에서 살아남기 - Fab..

bricoler.tistory.com

 

2.1 AVR 마이크로 컨트롤러

아트멜은 1984년 창립한 반도체 제조 회사로 주력 상품은 플래시 메모리를 내장한 마이크로컨트롤러이다. 마이크로컨트롤러는 크게  8051, AVR, ARM 등으로 나눠진다. 8051은 인텔에서 1980년에 만든 8비트짜리, CISC 구조의 마이크로컨트롤러이고, AVR과 ARM(스마트폰에 포함)은 아트멜에서 제작되고 있는 마이크로컨트롤러로 RISC 구조이다. 

AVR은 그중 변형된 하버드 구조를 사용하는 8비트 RISC 구조로, 8비트에서 출발하였지만 2006년 이후에는 32비트도 생산되고 있다. 8비트 AVR 시리즈는 타이니(tiny), 메가(mega) 그리고 x-메가(x-mega) 시리즈로 크게 나눠진다.

출처: ATmega128로 배우는 마이크로컨트롤러 프로그래밍

왜 이 책에서는 AVR 시리즈, 그중 ATmega128을 다룰까?
하드웨어 성능만 보면 8비트 AVR 컨트롤러보다 32비트 ARM 컨트롤러가 뛰어나다. 하지만 8비트 AVR 컨트롤러가 지니는 장점 중 하나는 구조가 간단하다는 것이다. 그러므로 초보자가 하드웨어의 구조를 보다 쉽게 이해할 수 있고, AVR 시리즈에 익숙해진다면 다른 마이크로컨트롤러를 사용하는 것도 그리 어렵지 않다. 

또한 처음 배우는 학생들과 메이커들이 AVR 시리즈를 가장 많이 사용하기 때문에 예제 프로그램을 찾기 쉽다는 장점도 있다. 그중 ATmega128은 64개의 적당한 개수의 핀을 제공하고 가격과 내부 구조의 복잡한 정도도 적당하기에 이 책에서는 해당 마이크로컨트롤러를 사용하고 있다고 한다. 아래는 ATmega128의 특징들인데, 혹시 이해하지 못하더라도 걱정할 필요는 없다. 이 책을 읽고 난 후에는 특징들을 이해할 수 있을 거라고 저자는 말한다.(믿습니다!😛)

나도 나중에 참고할 겸 일단 내가 이해하고 있는 것에는 파란색, 무슨 말인지 대략적으로 이해하는 것에는 초록색, 거의 이해하지 못한 것에는 빨간색으로 하이라이트를 주었다. 책을 다 읽고 난 후 내가 얼마나 배웠는지 참고할 예정이다.

1) 개선된 RICS 구조 사용
- ATmega128는 고성능, 저전력의 8비트 마이크로컨트롤러다.
- 다양한 어셈블리 명령어를 가지고 있다.
- 파이프라인을 통해 대부분 1 클록에 실행된다.
- 하드웨어로 구현되어 있는 곱셈 기는 2 클록에 동작하므로 16 MHz 클록에서 최대 16 MIPS(Mega Instructions Per Second) 성능을 보여 줄 수 있다.
- 32개의 8비트 범용 레지스터와 주변장치 제어를 위한 전용 레지스터를 가지고 있다.
- 완전한 정적 동작(static operation)을 지원한다. 정적 동작이란 메모리가 DRAM이 아 닌 SRAM으로 구성되어 있다는 것을 의미한다. 클록 주파수가 변하면 DRAM의 경우 리프레시 오류로 잘못된 동작을 보여 줄 수 있는 것과 달리 SRAM의 경우는 리프레시가 필요하지 않으므로 안정적인 동작을 유지한다.

2) 다양한 메모리
- 128KB의 비휘발성 플래시 프로그램 메모리를 가지고 있으며 10,000회 쓰기를 보장한다.
- 4KB의 비휘발성 EEPROM을 가지고 있으며 100,000회 쓰기를 보장한다.
- 4KB의 휘발성 SRAM을 가지고 있다.
- 부트로더를 통해 셀프 프로그래밍(self programming) 기능을 지원한다. 셀프 프로그래밍이란 부트로더 프로그램을 통해 전달된 코드를 플래시에 기록하는 것으로 프로그램 업데이트에 흔히 사용된다.
- 최대 64KB의 외부 메모리를 연결할 수 있다.
- 잠금 비트(lock bit)를 통해 플래시 메모리 내의 데이터 보안이 가능하다.
-  SPI(Serial Peripheral Interface)를 통한 프로그래밍이 가능하며 이를 ISP 또는 ICSP라 고 한다.

3) JTAG 지원
- JTAG(Joint Test Action Group) 표준을 지원한다. 
- (JTAG을 사용한) 하드웨어 테스트를 통해 프로그램을 마이크로컨트롤러에서 실행 시 실행 시 키면서 디버깅이 가능한데, 이를 온-칩 디버깅(on-chip debugging)이라고 한다. 실제로 마이크로컨트롤러에서 실행시키지 않고 디버깅을 수행할 수 있도록 해 주는 도를 에뮬레이터(emulator)라고 한다. 에뮬레이터의 경우에는 실제 마이크로컨트롤러상에서 실행되는 환경과 완전히 동일하게 구성하기에는 어려움이 있다.
- JTAG을 통해 플래시, EEPROM, 퓨즈 비트, 잠금 비트 등의 내용을 변경할 수 있다.

4) 주변장치
- 2개의 8비트 타이머/카운터와 2개의 16비트 타이머/카운터를 가지고 있다.
- 독립된 오실레이터로 동작시킬 수 있는 실시간 카운터(Real Time Counter, RTC)를 가 지고 있다.
- 2개의 8비트 PWM 채널과 2~16비트로 설정할 수 있는 6개의 PWM 채널을 가지고 있다.
- 8 채널의 10비트 ADC를 가지고 있다. 8개 채널 중 7개는 차동 입력이 가능하며, 8 개 채널 중 2개는 최대 200배의 이득(gain)을 설정할 수 있다.
- 바이트 기반의 TWI(Two Wire Interface)를 지원한다. TWI는 칩 제조사에서 사용하는 I2C(Inter Integrated Circuit)의 다른 이름이다.
- 2개의 USART(Universal Synchronous/Asynchronous Receiver Transmitter)를 지원한다.
- SPI를 지원한다.
- 별도의 오실레이터로 동작하는 워치도그(watchdog) 타이머를 가지고 있다.
- 하드웨어로 구현한 아날로그 비교기를 가지고 있다.

5) 기타 특징
- 충분한 전력이 공급되고 있는지를 감지하는 브라운아웃 감지 기능을 제공한다.
- 내부 오실레이터를 가지고 있어 외부 클록의 공급 없이도 동작 가능하다.
- 다양한 인터럽트를 지원한다.
- 사용 전력 제어가 가능하도록 여섯 가지의 슬립 모드를 지원한다.
- 프로그램으로 클록 주파수 제어가 가능하다.
- 각 핀의 풀업 저항 사용 여부는 개별적으로 제어 가능하다. 더불어 모든 핀의 풀업 저항 사용을 한꺼번에 금지시킬 수도 있다.

6) 입출력 포트 수 및 패키지
- ATmega128 칩은 64개의 핀을 가지고 있다.
- 64개의 핀 중 53개의 핀은 포트 A에서 포트 G까지 7개 포트에 할당하여 입출력 핀으로 사용할 수 있다.
- TQFP(Thin Quad Flat Pack) 패키지를 흔히 볼 수 있으며, QFN/MLF(Quad Flat No- leads/Micro Lead Frame) 패키지 역시 판매되고 있다.

7) 동작 전압
- 2.7~5.5V

8) 동작 속도
- 0~16MHz

책을 다 읽을 때 즈음에 얼마나 많이 배웠는지 다시 한번 이 리스트를 통해 점검해봐야겠다.

 

2.2 ATmega128의 외형적 특징

출처: ATmega128로 배우는 마이크로컨트롤러 프로그래밍

흔히 볼 수 있는 ATmega128은 TQFN 패키지와 QFN/MLF 패키지인데 둘의 차이는 단지 핀이 외부로 노출되어 있는지의 여부이다. DIP의 경우는 브레드보드에 꽂아 사용할 수 있는데, 64개의 핀을 가지고 있는 ATmega128은 이 타입으로는 제작하지 않는다.

출처: ATmega128로 배우는 마이크로컨트롤러 프로그래밍

위의 2-2 그림에서 볼 수 있듯이 전원, 크리스털, 리셋, 프로그래밍 가능 핀을 제외한 대부분의 핀은 2개 이상의 기능을 수행하는 것이 일반적이다. 핀의 이름이 PXn(X는 A~G, n은 정수)인 경우, P는 Port의 약자로 데이터 입출력을 위한 통로를 의미한다. 마이크로컨트롤러는 핀을 통해 비트 단위로 주변장치와 데이터를 교환할 수 있지만, 실제 CPU 내부에서는 비트 단위로 데이터를 처리할 수 없고, 8비트 단위로 데이터를 처리하여 입출력 핀으로 전달한다. 그러므로 핀을 8개씩 묶어서 A부터 G까지 포트 이름을 붙여 관리한다.

하지만 입출력 가능 핀은 53개 이므로, A~F까지는 8개의 핀을 갖지만 G 포트는 5개의 핀만을 갖게 된다. F의 경우는 아날로그 입력을 받을 수 있는 포트이다.

 

2.3 레지스터

마이크로프로세서에서 레지스터는 실행할 명령어, 피연산자, 계산 결과 등을 임시로 저장하는 곳이다. 마이크로컨트롤러에도 레지스터는 현재 실행되는 명령어가 무엇인지, 계산과가 무엇인지를 저장하는 데 이 레지스터는 중요하지 않다. 마이크로컨트롤러에서 데이터 입출력을 위한 전용 하드웨어를 거쳐 주변장치와 데이터를 교환할 때 사용되는 임시 저장 공간도 레지스터라고 불리는데 이 것이 중요한 레지스터이다.

마이크로컨트롤러는 주변 장치와 데이터를 교환하는 것이 주된 작업이다. 즉, 마이크로컨트롤러에는 마이크로프로세서에서 사용되는 레지스터 외에도 주변장치와 데이터 교환을 위한 레지스터가 존재하는데, 이를 입출력 레지스터라고 한다.

출처: ATmega128로 배우는 마이크로컨트롤러 프로그래밍

위의 C 코드에서 보면 키보드로 입력된 값을 반환하는 함수로, 입력장치인 키보드와 getchar 함수의 데이터 교환은 USB 제어장치와 운영체제가 알아서 해주지만, 마이크로컨트롤러는 이렇게 친절한 운영체제가 없다.

마이크로컨트롤러에서는 키가 눌러졌다면 이를 읽어서 중앙처리장치로 전달해 주는 역할까지 프로그램에서 처리해야 하는데, 이때 필요한 것이 입출력 레지스터이다.

예를 들어, 포트 B에 키보드를 연결하여 눌러진 키의 8비트 값이 전달되면, 이 전달된 8비트의 값은 직접 마이크로컨트롤러로 전달되는 것이 아니라 입출력 레지스터인 PINB에 저장된다.

또한 포트 D에 한 문자를 전송할 수 있는 LCD가 연결되어 있다고 보자. 프로그램에서 직접 핀으로 데이터를 출력할 수 없고, 데이터 출력을 위한 전용 레지스터인 PORTD로 데이터를 출력한다. 이처럼 입출력 핀/포트를 통한 데이터 입출력은 항상 전용 레지스터를 거쳐 이루어지고, 즉 소프트웨어(프로그램)와 하드웨어(실제 출력이 이루어지는 마이크로컨트롤러의 핀) 사이에서 중개자 역할을 한다.

입출력 레지스터는 번지수로 구분되는데, 이는 io.h 파일에 정의되어 있다. ATmega128의 경우 레지스터의 이름은 iom128.h 파일에 정의되어 있다.

출처: ATmega128로 배우는 마이크로컨트롤러 프로그래밍

위에서 보면 PORTB라는 레지스터의 이름은 실제 0x18 번지의 입출력 메모리 주소이다. PORTB는 실제로 마이크로컨트롤러 내부에서 계산된 값이 출력되는 8비트 레지스터를 가리키는 메모리이며 8개의 핀이 연결되어 있고, 각 핀을 개별적으로 제어하는 것이 가능하다. 

추가적으로, ATmega128의 핀은 두 가지 이상의 목적으로 사용되는 경우가 대부분이다. 예를 들어 13번 핀의 이름은 PB3으로 포트 B의 네 번째 비트에 해당하며, 데이터 출력을 위해 PORTB 레지스터와 연관이 있다. 이 외에도 이 핀은 SPI 직렬 통신을 위해 사용되는 MISO(Master Input Slave Output)을 부가적으로 담당하므로 13번 핀을 사용하는 경우 PORTB 레지스터뿐만 아니라 SPI 관련 레지스터도 영향을 받게 된다.

레지스터는 1바이트의 크기를 갖는 메모리로, 레지스터의 메모리 번지를 지정하기 위해서는 8비트의 주소를 사용한다. 따라서 ATmega128에서 정의할 수 있는 레지스터의 개수는 2의 8승, 즉 256개이다. 이 중 실제로 사용되는 레지스터는 137개이고, 나머지 119개는 추후 사용을 위해 남겨져있다. 137개나 되는 레지스터의 이름과 1000개의 비트 이름을 모두 기억할 수는 없으므로 데이터 시트를 곁에 두고 필요할 때마다 찾아봐야 한다.

(0x00) ~ (0x1 F) 사이의 32개 레지스터는 CPU 내부의 연산을 위해 사용되는 범용 레지스터(general purpose register)이고, 나머지 (0x20)~(0x5 F) 사이의 64개 레지스터는 입출력 레지스터에 속한다. 나머지 (0x60)~(0 xFF) 사이의 160개의 레지스터는 확장 입출력 레지스터로 뒤에서 더 자세히 알아볼 것이다.

입출력 레지스터는 AVR 시리즈 마이크로컨트롤러 프로그래밍에서 굉장히 중요하므로 이를 잘 이해해야 된다.

 

2.4 ATmega128의 내부구조

출처: ATmega128로 배우는 마이크로컨트롤러 프로그래밍

1) 컴퓨터와 마이크로컨트롤러의 메모리

AVR 시리즈 마이크로컨트롤러는 하버드 구조를 사용하므로 명령어와 데이터를 위한 별도의 메모리를 가지고 있다. 프로그램 메모리(플래시 메모리)와 데이터 메모리(SRAM)에 각각 명령어와 데이터가 저장된다. 이 외에도 특수한 용도로 사용되는 EEPROM이 있다.

출처: ATmega128로 배우는 마이크로컨트롤러 프로그래밍

컴퓨터에서 프로그램을 설치하면 해당 프로그램은 하드웨어에 설치된다. 그리고 이 프로그램을 실행하면 이 프로그램은 메인 메모리로 읽히고, 다시 CPU로 이동하여 화면에 사용자 인터페이스를 보여주며 프로그램 입력을 기다린다.

하지만 마이크로컨트롤러는 하드 디스크가 없기에 프로그램은 비 휘발성 메모리인 플래시 메모리 또는 프로그램 메모리에 설치되게 된다. 프로그램을 실행할 때 컴퓨터의 경우 메인 메모리로 옮겨와 실행되는 반면, 마이크로컨트롤러는 이미 프로그램이 메모리에 있기 때문에 바로 실행이 가능하다. 프로그램이 실행되는 동안 생성되는 변수는 컴퓨터의 경우 메인 메모리에 저장되지만 마이크로 컨트롤러는 데이터 메모리, 즉 SRAM에 저장한다. SRAM은 메인 메모리와 동일하게 휘발성 메모리이다.

하지만 우리가 컴퓨터에서 보면 문서 작성 기를 사용할 때 종종 지난 문서가 저장되어 있는 것을 볼 것이다. 이처럼 컴퓨터는 하드 디스크 어딘가에 이전 사용 목록을 저장한다. 이처럼 마이크로프로세서도 현재 상태를 영구적으로 기록하여 놓는데 SRAM은 휘발성 디스크 이므로 여기서 기록할 수는 없다. 이럴 때 사용되는 메모리가 EEPROM이다. EEPROM은 비휘발성이면서 프로그램 실행 중에도 자유롭게 읽고 쓸 수 있다. 그러나 EEPROM은 쓰는 속도가 느려서 데이터를 기억하기엔 적합하지 않고, 반드시 기록해야 되는 작은 크기의 정보를 기록하는 용도로만 사용될 수 있다.

출처: ATmega128로 배우는 마이크로컨트롤러 프로그래밍

2) 메모리 주소

ATmega128에는 8비트의 CPU를 가지고 있지만 기계어 명령어는 16비트 또는 32비트의 크기를 가진다. 기계어 명령어는 130개에 불과하므로 8비트로 표현이 가능하지만, 피연산자를 포함하게 되면 8비트로는 표현할 수 없기 때문에 플래시 메모리의 주소는 다른 메모리들과는 다르게 2바이트 단위로 되어있다. 128KB의 플래시 메모리는 64K 개의 주소를 표현하기 위해서 16비트의 주소(2의 16승 = 65536)를 사용한다. (0x0000 ~ 0 xFFFF)

버스란 마이크로컨트롤러를 구성하는 요소들 사이에서 정보가 교환되는 통로이다. 예를 들어 메모리의 200번지에 100의 값을 기록하는 경우를 살펴보자.

출처: ATmega128로 배우는 마이크로컨트롤러 프로그래밍

이 경우 메모리에 기록할 값인 100은 데이터 버스를 통해, 주소인 200은 어드레스 버스를 통해, 쓰기라는 명령어는 제어 버스를 통해 전달되며, 이를 시스템 버스라고 한다. 어드레스 버스는 CPU에서 메모리로만 전달되는 단방향 버스이지만 데이터 버스는 값을 읽고 쓸 수 있는 양방향 버스이며, 제어 버스 또한 메모리의 상태나 오류를 전달해야 하기 때문에 양방향 버스이다.

데이터 메모리의 경우 하나의 번지에 1바이트의 데이터가 기록되지만, 프로그램 메모리의 경우 위에서 말했듯이 하나의 번지에 2바이트의 명령어가 기록된다.

플래시 메모리는 2개의 영억으로 나눠지는데, 하나는 부트로더 영역이고 하나는 사용자가 입력한 프로그램을 저장하는 영역이다. 부트로더(boot+loader)는 이름에서 알 수 있듯이 마이크로컨트롤러가 부팅되는 시점에서 자동으로 프로그램을 다운로드하여 설치하는 것으로, 프로그램 자동 업데이트 용도로 흔히 사용된다.

출처: ATmega128로 배우는 마이크로컨트롤러 프로그래밍

 

SRAM은 레지스터와 주소를 함께 사용하기 때문에 이해하기가 까다롭다. 아래 그림에서 보다시피 연산을 위해 필요한 피연산자와 연산의 결과를 임시로 저장하는 범용 레지스터가 32개 있다. 그리고 나머지 224개의 레지스터는 입출력 레지스터인데, 이는 다시 기본 입출력 레지스터와 확장 입출력 레지스터로 나뉜다.

출처: ATmega128로 배우는 마이크로컨트롤러 프로그래밍

기본 입출력 레지스터 64개는 모두 이름이 정해져 있지만, 확장 입출력 레지스터는 160개 중 41개만이 이름이 정해져 있으며, 나머지 119개는 추후를 위해 남겨져 있다. 

AVR에서 레지스터와 SRAM으로 이루어지는 메모리를 데이터 메모리라고 하는데, EEPROM 역시 데이터를 저장하기 위한 메모리지만 별도의 주소를 가지고 있으므로 데이터 메모리를 이야기할 때는 포함시키지 않는다. 

정리하자면, 프로그램이 저장되는 플래시 메모리와 변수의 값이 저장되는 SRAM의 주소를 걱정할 필요는 없다. 레지스터 역시 모든 레지스터에는 이름이 정해져 있으므로 레지스터 사용을 위해 번지를 사용할 필요는 없다. 하지만 EEPROM의 경우에는 유일하게 번지로만 접근이 가능한 메모리이므로, 데이터를 쓰거나 읽기 위해서는 번지를 사용해야 한다.

출처: ATmega128로 배우는 마이크로컨트롤러 프로그래밍

앞에서 언급한 부분 중, _SFR_IO8이라는 부분이 있었다. 이는 입출력 주소를 데이터 메모리 주소로 변환하는 기능을 하는데, 입출력 주소란 앞에서 말한 세 가지 주소와는 다른 주소로, 기본 입출력 레지스터로만 구성되는 공간에 할당되는 주소이다. 입출력 주소는 데이터 메모리 주소에서 0x20을 뺀 값으로, 첫 번째 입출력 레지스터의 주소가 0이 되도록 만들어 놓은 것이다. 레지스터 목록을 살펴보면 기본 입출력 레지스터에는 2개의 번지가 할당되어 있는데, 하나는 입출력 주소이고 하나는 데이터 메모리 주소에 해당한다.

3) 범용 레지스터, 전용 레지스터

출처: ATmega128로 배우는 마이크로컨트롤러 프로그래밍

이 외에도 상태 레지스터, 명령어 레지스터, 프로그램 카운터 등이 있고, 그림에는 없지만 중요한 레지스터 중에 스택 포인터가 있다.

CPU 내의 연산은 산술 논리 연산장치(ALU)에서 이루어지는데, 한 번에 한 개의 명령어만을 처리할 수 있지만 여러 프로그램을 번갈아가면서 실행할 수 있기 때문에 프로그램이 동시에 실행되는 것과 같이 보인다. CPU에서는 한 번에 하나씩 명령을 실행하므로 다음에 실행할 명령이 저장된 프로그램 메모리의 주소를 알고 있어야 하는데, 이를 저장하는 곳이 바로 프로그램 카운터(PC)이다. 제어신호를 통해 ALU에서 연산을 수행한 뒤, 그 결과는 상태 레지스터에 반영된다.

ATmega128에서 데이터 버스의 크기는 8비트이지만, 어드레스 버스의 크기는 16비트이다. 그러므로 8비트의 레지스터를 2개 동시에 사용해야 한다.

출처: ATmega128로 배우는 마이크로컨트롤러 프로그래밍

범용 레지스터를 보면 마지막 6개의 레지스터는 3개의 16비트 레지스터 X, Y, Z 레지스터를 구성하기 위해서도 사용된다. 프로그램을 실행하는 동안 사용하는 변수는 데이터 메모리인 SRAM에 저장되는데, 배 결과 같이 큰 메모리를 저장하는 데는 4KB의 SRAM한계가 있다. 이때 상대적으로 크기가 큰 프로그램 메모리(플래시 메모리)에 변수를 생성하여 사용할 수 있는데, 프로그램이 실행하는 동안 메모리의 값을 변경할 수는 없지만 참조 테이블과 같이 읽기만 하는 변수의 경우에는 생성하여 사용할 수 있다. 이때 프로그램 메모리의 주소를 지정하기 위해서는 16비트 주소가 필요한데, 이때 X, Y, Z 레지스터를 사용한다.

마지막으로 언급할 레지스터는 스택 포인터이다. 스택은 함수 호출, 인터럽트 발생 등에 의해 순차적인 실행의 흐름이 바뀔 때 지역변수를 저장하고, 인터럽트 처리 종료 후 다시 실행해야 할 명령이 저장된 메모리 주소를 저장하기 위한 공간으로, SRAM의 마지막에 위치한다. 스택 포인터는 SRAM의 메모리 번지를 가리키므로, 이를 저장하기 위해서 16비트 크기의 레지스터가 필요하다.

4) 시스템 클록

디지털 시스템에서 동작의 기준이 되는 신호를 클록(clock)이라고 한다. 이 책에서는 ATmega128에 16 MHz 크리스털을 연결해서 사용하는데, 이는 1초에 최대 16M 개의 명령을 실행할 수 있다는 것을 뜻한다. 하지만 일부 기능의 경우에는 다른 주파수의 클록에 의해서 동작하는데, 예를 들어 ATmega128의 아날로그-디지털 변환기는 CPU보다 낮은 속도에서 동작하고, 이를 분주(prescale)라고 한다. 또는 CPU 클록과는 아예 독립적인 클록을 사용하는 경우도 있다. 

또한, 시스템이 무한 루프에 빠지거나 정지하는 경우를 검사하는 워치도그 기능도 있는데, 워치도그를 위한 클록은 CPU 클록과는 별개로 내부 오실레이터를 사용하고 있으며, 시계 기능을 위한 RTC(Real Time Clock) 역시도 별도의 외부 클록을 사용한다. 일부 ATmega128 보드의 경우 CPU 클록과 RTC에 공급되는 32.769KHz 클록을 포함하는 경우도 있다.

16M 개의 명령을 처리한다는 것은 16M개의 사칙연산을 수행한다는 것과는 다르다. 곱셈은 2 클록에 가능하므로, 1초에 최대 8M 개의 곱셈을 실행할 수 있다. ATmega128d은 RISC 구조를 채택하여 대부분의 명령을 한 클록에서 처리한다.

ATmega128에서 사용할 수 있는 클록 소스는 여러 가지 종류이며, CKSEL(Clock Selection) 퓨즈 비트를 통해 설정할 수 있다. 그러나 디폴트로 내부 RC 오실레이터를 사용하도록 설정되어 있으므로 별도로 외부 클록 없이도 동작한다.(질문: 그러면 왜 별도로 크리스털 오실레이터를 사용하는 거지?)

출처: ATmega128로 배우는 마이크로컨트롤러 프로그래밍

이 책에서 사용하는 크리스털(crystal, X-tal)은 대표적인 발진자(Oscillator), 발진자란 클록을 생성하는 부품을 말한다. 이처럼 일정한 주파수로 클록을 출력하는 동작을 발진(Oscillate)라고 한다. 레조네이터(Resonator)는 일반적으로 세라믹 발진자를 가리키며, 크리스털보다 안정도가 떨어진다.

출처: ATmega128로 배우는 마이크로컨트롤러 프로그래밍

크리스털은 클록 생성을 위해 발진 회로를 추가해야 하는 수동 발진자이지만, ATmega128은 내부에 발진 회로를 포함하고 있기 때문에 크리스털만 연결하면 사용할 수 있다. 하지만 ATmega128 없이 자체적으로 클록을 생성하기 위해서는 발진자와 발진 회로가 포함된 부품을 사용해야 되는데, 이를 오실레이터라고 한다. 오실레이터는 자체적으로 클록을 생성하므로 퓨즈 비트를 잘못 설정하여 마이크로컨트롤러가 동작하지 않을 때 유용하게 사용할 수 있다.

5) 명령어 실행

ATmega128에서 명령어의 실행은 대부분 1 클록에 실행된다고 하였는데 실제 한 클록에서 실행될까? 일반적으로 CPU에서 명령은 명령어를 읽고, 해석하고, 실행하고 결과를 쓰는 4 단계로 이루어지지만 ATmega128에서 명령의 실행단계는 프로그램 메모리에서 명령어를 읽는 단계와 명령어를 실행하는 단계로 나눌 수 있다. 이 단계는 파이프라인에 의해 중첩돼서 실행된다.

출처: ATmega128로 배우는 마이크로컨트롤러 프로그래밍

읽기 단계에서는 프로그램 메모리(플래시 메모리)에서 명령어를 읽어오고, 실행 단계에서는 ALU에서 레지스터에 있는 피연산자를 사용하여 여 그 결과를 레지스터에 기록되기까지의 단계를 말한다. RISC 구조에서는 메모리를 읽거나 쓰는 연산이 명령과 분리되어 있기 때문에 연산 결과는 레지스터에만 기록된다. 연산 결과는 메모리에 기록할 수 있지만, 중간 결과는 메모리에 기록되지 않으므로 필요에 따라 STORE 명령을 통해 명시적으로 기록해야 할 수도 있다. ATmega128에서 연산은 (1) 레지스터에 있는 값을 읽고 (2) 계산하여 (3) 쓰는 3 단계로 이루어져 있기 때문에 하나의 클록을 3개의 하위 클록으로 나눠서 동작한다.

출처: ATmega128로 배우는 마이크로컨트롤러 프로그래밍

그렇기 때문에 크리스털을 통해 생성된 클록은 16 MHz이지만 ALU에서는 이의 3배인 48 MHz로 동작하게 된다.

 

이번 장에서 솔직히 이해가 잘 안 간 부분도 있긴 하다. 일단 전반적인 내용을 살펴보고 모르는 내용은 나중에 필요한 경우에 더 자세히 살펴봐야겠다. 여기까지가 샘플 책에 나온 앞부분이다. 다행히도 얼마 전에 한국에서 주문한 책이 오늘 도착했으니 이어서 읽어나가야겠다.

반응형