본문 바로가기

배움의 즐거움/하드웨어

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

반응형

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

 

(9) 네덜란드에서 살아남기 - Fab Academy 네 번째 수업 - 전기전자 공학도의 첫 PCB 제작

내가 전자전기공학을 전공했다는 것은 팹 아카데미에서 말하지 않았다. 왜냐면.... 전자전기를 전공했음에도 불구하고 나는 이 분야에 대해서 잘 알지 못하고ㅠㅠ 그 사실이 너무 창피하기 때문이다. 그리고 이번..

bricoler.tistory.com

그래서 마이크로컨트롤러에 대한 책을 찾던 중, 우연히 이 책을 찾게 되었고 샘플이 있길래 읽어보았는데 내가 배우고 있는 부분과 딱 맞아떨어져서 바로 구매하게 되었다.

ATmega128로배우는마이크로컨트롤러프로그래밍_sample.pdf
5.29MB

아쉽게도 e-book이 없어서 19,000원의 배송비까지 내면서 ㅠㅠ 눈물을 머금고 네덜란드로 주문하였다.

책은 총 34장으로 구성되어 있고 무려 752 페이지에 달한다.. 다 읽을 수 있을는지는 모르겠지만 최대한 시간 날 때마다 틈틈이 정리해볼 예정이다. 이번 글에서는 마이크로컨트롤러가 무엇인지에 대해 알아보자.

 

챕터 1. 마이크로컨트롤러

1.1 마이크로컨트롤러란 무엇인가?

책에서는 아트멜(Atmel)에서 제작한 AVR 시리즈 중 하나인 ATmega128에 대해서 다룬다. 

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

위의 그림에서 보면 (a)가 마이크로컨트롤러이고, (b)와 (c)는 마이크로컨트롤러라고 부르기도 하지만 이들은 '마이크로컨트롤러 보드'에 해당한다. 마이크로컨트롤러는 5V의 전원만 있으면 동작한다. 즉 하나의 칩으로 구현한 컴퓨터라고 할 수 있다.

마이크로컨트롤러가 컴퓨터와 다른 점은 주변장치(마우스, 키보드 등)가 연결되어있지 않다는 점이다. 컴퓨터처럼 케이스를 씌워서 사용할 수 도 있지만 대부분의 경우 마이크로컨트롤러는 다른 시스템에 일부러 포함되기 때문에(임베디드) 별도로 케이스를 만들지는 않는다.

마이크로컨트롤러는 입출력장치를 연결하기 위해서는 컴퓨터보다 복잡한 과정을 거쳐야 되지만 입출력 장치를 연결하면 작은 컴퓨터로써 기능할 수 있다.

 

1.2 마이크로컨트롤러 vs 마이크로프로세서

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

컴퓨터를 이해하면 마이크로컨트롤러를 좀 더 쉽게 이해할 수 있다. 위의 컴퓨터의 구조를 보면 연산의 핵심인 연산장치, 연산을 제어하는 제어장치, 데이터를 저장하는 주기억장치, 보조기억장치 그리고 입출력 장치로 구성되어 있다. 직접회로 기술의 발달로 인해 중앙처리장치(연산장치, 제어장치)를 하나의 칩으로 집적시켜 만든 반도체 소자를 마이크로프로세서라고 한다.

그리고 이러한 마이크로프로세서에 일정 용량의 메모리와 입출력 인터페이스까지 내장한 것을 마이크로컨트롤러라고 한다. 마이크로컨트롤러가 컴퓨터로서 동작하기 위해서는 입출력 장치만 있으면 된다. 그러나 굳이 연결하지 않는 이유는, 마이크로컨트롤러는 컴퓨터와는 목적이 다르기 때문이다. 마이크로컨트롤러는 작고 간단한 제어장치를 만들기 위한 목적으로 특화된 마이크로프로세서의 한 종류라고 볼 수 있다.

 

1.3 마이크로컨트롤러는 어디에 사용할 수 있을까?

마이크로컨트롤러는 컴퓨터이긴 하지만 우리가 일반적으로 컴퓨터를 사용하는 작업들을 하기에는 너무 느리고 용량도 적다. 그러나 마이크로컨트롤러의 장점은 저렴한 가격에 있다. 예를 들어 사람이 들어오면 불이 켜지는 일을 제어하기 위해서는 마이크로컨트롤러면 충분하다. 물론 고성능 마이크로컨트롤러도 존재한다. 

앞서 말했듯이 마이크로컨트롤러는 다른 시스템에 일부러 포함되는 경우가 대부분이기 때문에 케이스를 만들지 않는다. 이처럼 다른 시스템에 일부러 포함되는 것을 임베디드라고 하는데, 마이크로프로세서도 임베디드 시스템에서 중요한 역할을 차지한다. 예를 들면 라즈베리파이는 마이크로프로세서를 사용한 싱글보드 컴퓨터이다.

- 마이크로컨트롤러가 마이크로프로세서에 비해 지닌 장점
(1) 제품의 소형화 및 경량화: 하나의 칩으로 작고 가벼운 제어장치 구현 가능
(2) 저렴한 가격
(3) 신뢰성 향상: 마이크로컨트롤러는 시스템을 구성할 때 필요한 부품수가 적어서 유지보수가 용이  
(4) 융통성: 제어 기능들을 소프트웨어를 통해 구현 가능함

- 마이크로컨트롤러가 마이크로프로세서에 비해 지닌 단점
(1) 처리능력 떨어짐: 많은 데이터를 처리해야 하는 경우 마이크로프로세서가 적합
(2) 범용성: 마이크로프로세서의 경우 운영체제를 통해 다양한 프로그램 설치, 실행 가능하나 마이크로컨트롤러는 특정 작업만을 위한 하나의 프로그램만 설치, 실행 가능

 

1.4 마이크로컨트롤러를 공부하기 위하여 필요한 것

1) 마이크로컨트롤러
2) 다운로더: 마이크로컨트롤러에서 돌아갈 프로그램은 컴퓨터에서 작성해서 마이크로컨트롤러로 옮겨야 한다. 프로그램을 다운로드하기 위해서는 ISP(In-System Programming) 또는 시리얼 방식을 사용하면 된다. ISP 방식이 가장 일반적이고, 시리얼 방식은 UART 시리얼 통신을 통해 하는 방법으로, 프로그램 다운로드를 위해 부트로더라고 불리는 프로그램이 필요하다. 아두이노에서는 UART 방식을 사용하고 있다. 이 책에서는 컴퓨터와 데이터를 주고받기 위해서는 UART방식을, 프로그램 다운로드를 위해서는 ISP 방식을 사용한다고 한다.
3) JTAG 장치: 디버깅을 위해서는 이 장치가 필요하다.

 

1.5 주변장치와 어떻게 데이터를 교환하나?

마이크로컨트롤러는 디지털 컴퓨터의 일종이므로 0과 1의 디지털 데이터만을 처리할 수 있다. 핀을 통해 주변장치와 데이터 교환을 하는데, ATmega128의 경우 64개의 핀 중 53개의 핀, 즉 53비트의 데이터를 주변장치와 교환할 수 있다. 즉 핀 하나에 1비트의 데이터 교환이 가능하다.

53개라고 하면 많아 보이지만 작은 크기의 LCD를 제어하는 것만 해도 13개의 핀이 필요하다. 그래서 마이크로컨트롤러에서는 데이터를 전달할 때 여러 개의 핀을 사용하는 병렬방식보다 하나의 핀을 통해 여러 번 데이터를 주고받는 직렬 방식을 선호한다.

ATmega128 내부에서 데이터를 전달할 때는 8비트의 데이터를 병렬로 전달하지만 CPU를 벗어나면 직렬로 8번에 나눠서 전달한다. 그리고 데이터를 전송할 때 한 바이트만을 전송하는 것이 아니라 여러 바이트를 전송하므로 비트 데이터의 시작점과 끝점을 구분할 수 있는 방법이 필요하다.(아래에서 더 설명)

 

직렬 전송 구분 1) 동기방식 vs 비동기 방식

일단, 직렬로 데이터를 전송하는 방법은 크게 동기방식과 비동기 방식으로 나눌 수 있다. 동기 방식은 데이터와는 별도로 동기화 클록을 사용하는데, 이 클록의 목적은 데이터를 언제 읽을지 알려주기 위한 것이다. 

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

위의 그림에서 보면 구형파 클록의 상승 에지에서 데이터를 읽는다고 가정하자. 그러면 간단하게 수신된 데이터를 읽는 시점을 결정할 수 있다. 

비동기 방식은 클록 없이 데이터만 보내는데, 이 경우 데이터를 읽는 시간에 따라 전혀 다른 데이터를 수신하게 될 수 있다.

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

그림 1-7에서 보면 데이터 전송속도는 1 bps(bit per second)인데, 수신장치 역시 1 bps로 검사한다면 01이라는 맞는 데이터를 수신하겠지만, 2 bps로 검사하게 될 경우 0011이라는 전혀 다른 데이터를 받게 된다. 따라서 비동기 방식을 사용할 경우에는 보내는 쪽과 받는 쪽의 속도를 일치시켜야 된다.

 

직렬 전송 구분 2) 전이중 방식과 반이중 방식

전이중과 반이중 방식은 데이터를 전달하는 데 사용하는 연결선의 개수로 구분하는데, 전이중은 2개, 반이중은 1개의 데이터 선을 사용한다. 2개의 선이 연결되어 있는 경우 데이터를 보내는 동시에 받을 수도 있지만, 1개의 선만이 연결되어 있는 경우에는 동시에 주고받는 것이 불가능하다.

이렇게 두 가지 구분법에 따라 아래처럼 4가지 방법으로 나뉜다.

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

SPI는 짧은 거리에서 주변장치와 고속으로 정보를 교환할 때 사용되는데, 핀 2개는 데이터 송수신, 1개는 동기화 클록, 1개는 제어를 위해 총 4개의 핀이 필요하다. SPI 포트를 통해 1:N 통신이 가능하며, 제어 핀을 사용하여 특정 슬레이브(slave) 장치를 선택한다. 그러므로 연결 장치가 늘어남에 따라 제어 핀의 수가 늘어난다는 단점이 있다.

UART의 경우 송수신을 위해 2개의 핀을 필요로 하며 비동기 방식이므로 별도로 동기화 클록을 위한 핀은 필요하지 않다. 그러나 송수신 속도를 맞춰야 하며, 한 번에 하나의 장치만 연결 가능한 1:1 방식이다. 2개의 주변장치를 연결하고자 한다면 2개의 UART 포트가 필요하다. 사용이 간단하다는 장점이 있다.

I2C의 경우 짧은 거리에서 주변장치와 저속으로 정보 교환할 때 사용하며, 데이터 전송하는 핀 1개, 동기화 클록을 위한 핀 1개가 필요하다. SPI와 마찬가지로 1:N 통신이 가능하지만 SPI와는 달리 제어 핀이 필요하지 않다. 장치 구별을 위해 소프트웨어적인 주소를 사용하기 때문이다. 그렇기 때문에 연결 장치수가 증가해도 필요로 하는 핀의 수는 증가하지 않는다.

1-와이어 방식도 존재하지만 ATmega128에서는 이를 위한 하드웨어를 제공하지 않는다.

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

 

1.6 프로그램은 어떻게 만들어지나?

ATmega128과 같은 마이크로컨트롤러의 경우 프로그램을 저장할 수 있는 메모리가 128KB에 불과하기 때문에 이 안에서 프로그램을 개발하는 것은 불가능하다. 메모장과 같은 간단한 프로그램도 수백 메가바이트의 공간을 필요로 하기 때문이다. 그러므로 마이크로컨트롤러를 위한 프로그램은 컴퓨터에서 개발한 뒤 마이크로컨트롤러에 다운로드하는 과정을 거쳐야 하는데, 이처럼 프로그램 개발환경이 실행되는 환경과 다른 경우를 교차 개발 환경(cross development environment)라고 한다.

교차 개발이 가능하려면 실행되는 환경에서 실행 가능한 기계어 파일을 생성하기 위해 교차 컴파일러(cross compiler)가 필요한데, 책에서는 이를 위해 아트멜 스튜디오를 를 이용한다. 교차 컴파일러는 마이크로컨트롤러에서 실행 가능한 기계어 파일(HEX 확장자)을 생성해준다. 기계어 파일이 생성되면 이를 위에서 배운 직렬 통신을 통해 마이크로컨트롤러에 전송할 수 있다. 프로그램 다운로드는 SPI 직렬 통신을 사용하는 ISP 또는 UART 직렬통신을 사용하는 시리얼 방식으로 가능하며, 이 책에서는 프로그램 다운로드를 위해 주로 ISP 방식을 사용한다.

 

1.7 마이크로컨트롤러가 꼭 필요한가?

어두워지면 자동으로 불이 켜지는 전등을 만드려고 할 때, 마이크로컨트롤러 없이도 만들 수 있다. 빛의 양에 따라 저항이 변하는 조도 센서를 이용하면 되기 때문이다. 하지만 여기에 불이 최소 10초 켜지도록 하는 기능을 추가하고자 하면 어떠할까? 시간을 알려주는 부품, 불이 켜진 시간을 저장할 수 있는 메모리, 현재 시간과 저장된 시간을 비교할 수 있는 비교기 등이 필요하다. 이때 마이크로컨트롤러를 사용하면 이러한 기능들을 쉽게 구현할 수 있다.

기준 광량을 바꾸고 싶다면, 마이크로컨트롤러를 사용하지 않은 경우에는 저항을 교체하는 작업이 필요하지만 마이크로컨트롤러를 사용한 경우에는 소스 코드만 바꿔서 다시 업로드하면 되기 때문에 훨씬 간단하다. 즉 마이크로컨트롤러를 사용하면 복잡한 작업을 효율적으로 할 수 있게 된다.

 

1.8 마이크로컨트롤러의 CPU vs. 데스크톱 컴퓨터의 CPU

마이크로컨트롤러와 컴퓨터는 목적 자체가 달라서 단순 비교하는 것은 적합하진 않지만 비교를 함으로써 마이크로컨트롤러에 대한 이해를 높일 수 있다. 크게 3가지로 비교를 해보자.

비교 1) CISC / RISC

마이크로컨트롤러의 경우 CPU로 RISC(Reduced Instruction Set Computer) 구조를 사용하는 경우가 많고, 데스크톱 컴퓨터에서 흔히 사용되는 인텔의 CPU는 CISC(Complex Instruction Set Computer) 구조를 사용한다. CISC와 RISC의 가장 큰 차이점은 CPU에서 지원하는 명령어의 개수에 있다. CPU의 발전에 따라 CPU에서 처리할 수 있는 명령어의 개수가 증가하였다. 이에 따라 CPU는 점점 더 복잡해졌고 하위 호환성을 위해서 이전 명령어들을 그대로 유지해야 되었으므로, 새롭게 추가된 복잡한 명령어와 이전의 간단한 명령어들을 처리하기 위해 필요한 시간이 서로 다른 경우가 발생하게 되었다. 이러한 문제점을 해결하기 위해 CISC 구조에서 자주 사용하는 명령어만으로 만들어진 구조가 RISC이다.

명령어 개수를 줄이면 CPU 구조는 단순해지고 처리 속도를 높일 수 있지만 복잡한 명령어를 처리하기 위해서는 많은 수의 간단한 명령어를 실행해야 한다. CISC 구조에서 하나의 명령어로 가능한 작업을 RISC에서는 여러 개의 명령어로 처리해야 되는데, 이러한 명령어 분해작업은 기계어 파일을 만들어내는 컴파일러가 소프트웨어적으로 처리하도록 하고 있다. 

즉 CISC 구조에서는 복잡한 명령의 처리를 하드웨어가 담당하는 방면, SISC에서는 소프트웨어가 담당한다.

또한 CISC 구조에서는 명령어들이 서로 다른 실행시간을 필요로 하기에 파이프라인을 구성하기가 쉽지 않지만, RISC 구조에서는 모든 명령어들이 동일한 실행 속도를 갖기 때문에 파이프라인 구조를 갖기에 용이하다.

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

비교 2) 폰 노이만 구조 / 하버드 구조

마이크로컨트롤러는 하버드 구조를, 인텔의 CPU는 폰 노이만 구조를 채택하고 있다. 폰 노이만 구조내장 메모리 순차 처리 방식을 말하는데, 컴퓨터에 설치된 프로그램은 먼저 컴퓨터의 메인 메모리로 읽어 들이고, 이 프로그램은 CPU 내의 레지스터로 이동한 후 산술 논리 연산장치(ALU, Arithmetic Logic Unit)에서 실행된다. 이처럼 먼저 메모리에 저장된 후 실행되는 내장 메모리 방식이며, 메모리에 저장된 프로그램은 한 번에 하나씩 CPU에 옮겨져서 실행되므로 순차처리 방식이다.

폰 노이만 구조에서는 명령어와 데이터가 모두 메인 메모리에 저장된다. 예를 들어 'int a = a + b'라는 명령을 실행할 때, 명령어(ADD)와 데이터 a, b 모두 메인 메모리에 저장된다. 명령어는 프로그램이 실행되는 동안 내용이 바뀌지 않지만 데이터는 바뀔 수 있지만, 이러한 차이점에도 불구하고 폰 노이만 구조에서는 모두 메인 메모리에 저장된다.

하지만 메모리의 내용을 읽는 시간은 CPU가 연산을 하는 시간에 비해 오래 걸린다. 그러므로 CPU가 연산을 수행하지 않는 유휴(idle) 상태에 놓이게 된다. 이러한 병목현상을 개선하기 위한 방법으로 프로그램 실행에 필요한 명령어와 데이터를 분리해서 저장하는 방법을 하버드 구조라고 한다.

하버드 구조에서는 멍령어(프로그램 메모리)와 데이터(데이터 메모리)가 분리되어 저장되어 있기 때문에 데이터를 동시에 읽는 것이 가능하므로, 메모리를 읽는 시간을 줄일 수 있다. 물론 2개의 메모리를 제어해야 하는 만큼 CPU가 복잡해질 수 있다.

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

비교 3) 메모리의 종류

위에서 폰 노이만의 경우 메인 메모리가, 하버드 구조의 경우 프로그램 메모리와 데이터 메모리가 필요하다. 컴퓨터의 메인 메모리는 DRAM(Dynamic RAM)으로 만들어지고, ATmega128에서 프로그램 메모리는 플래시 메모리, 데이터 메모리는 SRAM(Static RAM)으로 만들어진다. 이들의 차이는 무엇일까?

메모리는 크게 ROM(Read only memory)RAM(Random access memory)로 나눠진다. 컴퓨터의 부팅 과정에서 사용되는 정보를 저장하고 있는 BIOS(Basic Input Output System) 칩이 ROM에 해당한다. 근데 ROM은 정말 읽기만 가능할까?

 

- ROM

초기의 롬은 기록한 내용은 변경할 수 없도록 만들어졌는데 이를 Mask ROM이라고 한다. 하지만 이후 내용을 지우고 다시 쓸 수 있는 롬이 만들어졌다. 롬은 전원이 주어지지 않아도 보존되는 비휘발성 특성을 가지며, 롬에 쓰기는 가능하지만 수명이 있어서 일정 횟수를 수행한 후에는 롬을 사용할 수 없다. 

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

내용을 기록할 수 있는 롬 중 PROM(Programmable ROM)이 있는데 PROM은 내용이 기록되지 않은 채 생산되고, 전용장치를 통해 한번만 내용을 기록할 수 있다. PROM을 개선하여 여러 번 지우고 쓸 수 있게 만든 것이 EPROM(Erasable ROM)인데, 이를 위해서는 전용장치가  필요하므로, 이를 개선한 것이 EEPROM(Electrically EPROM)이다.

EEPROM에 데이터를 쓰기 위해서는 RAM에 비해 많은 시간이 소요되므로 RAM을 대체할 수는 없지만 읽는 속도는 RAM과 비슷하기 때문에 데이터를 기록한 후 잦은 읽기가 필요한 경우 사용된다. 플래시 메모리는 EEPROM을 변형한 것으로, 여전히 쓰기 속도가 느리지만 블록 단위의 쓰기가 가능하다. 이후 USB 메모리를 포함하여 대부분의 휴대용 장치에서는 플래시 메모리를 사용하고 있다. ATmega128에서는 128KB의 플래시 메모리를 가지고 있으며, 프로그램을 저장하는 프로그램 메모리로 사용된다.

 

- RAM

위에서 본 EEPROM과 플래시 메모리가 롬이라면, SRAM, DRAM은 램에 속한다. CPU는 연산을 수행하는 동안 잦은 메모리 쓰기를 해야 되므로 램을 사용하는데 SRAM와 DRAM의 차이는 전원이 공급되는 동안 기록된 데이터가 보존되는지의 여부에 있다.

DRAM의 경우 커패시터 전하를 저장하는 방식으로 데이터를 기록하므로, 일정 시간이 지나면 방전으로 인해 기록된 데이터가 사라지기 때문에 일정 시간 간격으로 커패시터를 재충전해야 되는데 이를 리프레시(refresh)라고 한다. SRAM은 플립플롭을 바탕으로 만들어진 메모리로 전원이 공급되는 한 한번 만들어진 메모리는 계속 남아있다. SRAM은 DRAM에 비해 최대 20배 빨리 동작할 수 있지만 집적도가 낮고 가격이 비싸다. 반면 DRAM은 집적도를 높이기가 용이하므로 대용량의 메인 메모리에 주로 사용된다. ATmega128은 4KM의 SRAM을 데이터 메모리로 사용하고 있다. 

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

반응형