이번에는 시스템 클럭(System clock)에 대해서 설명하도록 하겠다. 블로그에서는 마지막 부분에서 시스템 클럭에 대한 설명을 하지만, 실제 프로젝트에서는 가장 먼저 확인해야 할 것이 보드의 전원과 클럭이 어떻게 설정되어 있는가이다. AVR과 같은 마이크로 컨트롤러가 사용되는 보드는 보통 단일 전원에 단일 시스템 클럭이 사용되지만, 고성능 CPU를 사용하는 보드의 경우에는 전원도 몇가지로 나누어서 공급되고, 클럭도 부품마다 다르게 공급된다. 임베디드 시스템 프로그래머라면 부품마다, 혹은 CPU 내부에 들어있는 각각의 블럭들에 인가되는 클럭이 몇 Hz인지 반드시 확인하여야 한다. 보드가 제대로 동작되지 않는 많은 경우가 클럭 설정이 제대로 안되어 있는 경우가 많기 때문이다. 보드내에 인가되는 클럭은 소..
이번에는 주로 디바이스간의 정보를 주고 받기 위한 방법중 하나인 TWI에 대해서 설명하도록 하겠다. TWI는 Two-Wire Serial Interface의 약자로써 TWSI라고도 부른다. 원래는 필립스사에서 만든 IIC(Inter Integrated-Circuit)라는 규격을 일반적인 용어로 다르게 부르는 것이다. 그러나 아직까지 많은 개발자들이 TWI 대신 I2C라고 부르는 것을 더 편하게 생각하고 있다. TWI는 이미 이름에서 알수 있듯이 두개의 선을 이용하여 데이터를 주고 받는다. 하나는 SDA라는 데이터를 주고 받는 선이고, 또 다른 하나는 SCL이라는 클럭 정보를 제공하는 선이다. 데이터 선이 하나 밖에 없으므로 반이중(half-duplex) 통신을 할 수 밖에 없고 SPI와 마찬가지로 마스터..
SPI는 Serial Peripheral Interface의 머리글자이다. 주변 장치와 직렬 통신을 위한 방법중 한가지를 가리키는 것이다. 이미 앞에서 설명한바 있는 UART와는 다음과 같은 차이점이 있다. UART는 비동기 통신임에 반하여 SPI는 동기 통신 방식이다. 즉, 클럭 신호를 마스터에서 제공하는 것이다. UART는 1:1 통신으로 구성되며 Peer-to-Peer 방식이다. 내 보낼 데이터가 있으면 상대방이 연결되어 있든 없든 무조건 데이터를 주어신 속도에 맞춰 내보낸다. 그러나, SPI는 1:N의 마스터-슬레이브 방식으로 동작된다. 슬레이브는 마스터가 요구하는 동작을 수행하도록 되어 있다. 위의 그림은 하나의 SPI 마스터에 세개의 SPI 슬레이브가 연결되어 예를 보여주고 있다. SPI마스터..
ADC는 아날로그 입력값을 디지털값으로 변환해 주는 모듈이다. 여기서 말하는 아날로그 값이란 다름이 아니고 핀으로 인가되는 전압값을 의미한다. 이 전압값이 ARef값을 기준으로 했을때 어느정도의 비율을 가지는지 숫자로 알려주는것이 ADC인 것이다. AVR의 ADC는 10비트 해상도를 지원한다. 이 말은 아날로그 입력전압이 GND와 같을때 0의 값을 가지고, ARef값과 같으면 2^10-1의 값을 가진다. 즉 0~1023까지의 값으로 표현된다는 의미다. 예를 들어 ARef가 5V 일때 아날로그 입력 전압이 2.5V이면 511의 값으로 표현되는 것이다. 위의 그림이 ADC 블럭이 어떻게 구성되어 있는지 설명해주는 블럭도이다. CPU가 ADC의 동작을 제어하기 위한 레지스터는 Databus에 연결된 ADMUX..
이번 글에서는 타이머/카운터의 PWM 모드 중에서 Phase Correct PWM 모드에 대하여 설명하도록 하겠다. 위의 그림이 Phase correct PWM의 동작원리를 설명한 것이다. 앞에서 설명한 Fast PWM과 비교하여 특이점을 설명하자면, 먼저 TCNT값이 BOTTOM에서 증가하다가 TOP이 되면 다시 BOTTOM에서 새로 시작하는 것이 아니라 BOTTOM을 향해서 1씩 감소해 나가는 것을 볼 수 있다. 이때 OC값은 Non-invert 모드의 경우에 TCNT값이 OCR값과 같아질 때, 증가하는 구간에서 0이 되고, 감소하는 구간에서 1이 된다. 그러므로 OC만 놓고 봤을 때 클럭 구간의 시작 위치가 BOTTOM과는 다른 위치에서 시작되는것을 볼 수 있다. 그래서 이러한 PWM의 이름을 ph..
이번에는 타이머/카운터의 PWM중에서 Fast PWM 모드에 대한 설명을 하도록 하겠다. 위의 그림이 Fast PWM의 동작 원리를 설명하는 것이다. TCNT의 값은 BOTTOM에서 TOP까지 일정하게 증가된다. TCNT값이 증가되는 도중에 OCR값과 같아지면 OC가 0이 된다. TCNT의 값이 계속 증가하다가 TOP값이 되면 OC는 1이 되는 것이다. 결국 BOTTOM에서 TOP까지의 시간이 한 클럭이 되는 것이다. 다음에 설명할 Phase Correct PWM 모드는 Fast PWM 모드에 비해서 클럭 주기가 2배가 된다. Fast PWM 모드에는 어떤식으로 동작되는지 역시 실험을 통해서 알아보도록 하겠다.enum pwm_out_mode { OC_DISCONNECT, OC_TOGGLE, OC_NON_..
이번 글에서는 타이머/카운터의 PWM 모드 중에서 CTC(Clear Timer on Compare Match)모드에 대해서 설명하도록 하겠다. 위의 그림이 CTC 모드의 동작을 설명한 것이다. 카운터로 클럭이 들어올때마다 TCNT값이 1씩 증가한다. TCNT값이 OCR_A와 값이 같아지게 되면 TCNT값이 BOTTOM값으로 초기화된다. 즉 0이 된다는 뜻이다. 그리고 다시 OCR_A와 값이 같아질때까지 1씩 증가되는 동작을 반복한다. TCNT값이 OCR_A값과 같아 질때마다 OC핀의 출력이 토글된다. 그러므로 OCR_A 값을 조절하면 OC핀의 주기를 변경할 수 있게 된다. 위의 그림에서 세번째 구간의 주기가 다른 구간에 비해서 짧아진것을 볼 수 있다. 이때 OCR_A값을 보면 다른 구간에 비해서 작은 값..
타이머/카운터에 있는 TCNT값을 읽거나, Output Compare Register를 설정하여 TIFR의 플래그를 polling 하여 LED를 제어하는 방법을 설명하였다. 끝부분에는 타이머 인터럽트를 사용하는 방법에 대해서도 설명하였다. 앞에서 설명한 글에서는 LED를 점멸하기 위해서 직접 CPU가 포트핀을 제어하였다. 그러나 AVR의 타이머/카운터 블럭에는 CPU의 개입없이 자체로 포트핀을 제어하는 기능이 들어있다. 이 기능을 이용하면 PWM(Pulse Width Modulation)으로도 활용할 수 있게 된다. 이어지는 몇개의 글을 통하여 AVR의 타이머/카운터 블럭에서 제공하는 PWM 모드에 대하여 설명하도록 하겠다. 위의 그림이 타이머/카운터에서 PWM 기능을 사용할 수 있는 원리에 대한 블럭도..
T0 시그널이 카운터로 몇번이나 들어왔는지 TCNT 레지스터를 통하여 알 수 있었다. 그렇다면 TCNT 값을 계속 읽고 있다가 그 값이 10보다 크게 될 때, PD6(12번)핀에 연결된 LED를 켜고, 20보다 크게 될 때는 PD5(11번)핀에 연결된 LED를 켜보도록 하겠다.#define EXT_TO 0x10 #define OC0B 0x20 #define OC0A 0x40 void timer_init(void) { uint8_t tccr_b = timer->tccr_b; portd->ddr |= (OC0A|OC0B); portd->port |= EXT_TO; tccr_b &= ~CLOCK_SELECT_MASK; tccr_b |= EXT_FALLING; timer->tccr_b = tccr_b; time..
잠을 자려고 누웠는데, 잠이 쉬이 오지 않는다. 평소에는 잘 듣지 못했던 벽에 걸린 시계에서 탁, 탁, 탁 초침 소리가 일정한 간격으로 들려온다. 하나, 둘, 셋 ... 소리가 들릴때마다 숫자를 더해간다. 어느덧 300까지 세었다. 그런데 어느 순간부터 일정하게 들려오던 초침 소리가 불규칙한 간격으로 들리기 시작하였다. 소리가 일정한 간격으로 들려 올 때에는, 1초에 한번씩 소리가 난다는 것을 알고 있으므로 300번 세었으면 5분의 시간이 흘렀다는 것을 알 수 있다. 그러나 불규칙한 간격으로 소리가 들린다면 소리가 몇번 났는지는 알 수 있으나 그 다음부터는 얼마나 시간이 흘렀는지는 알 수 없다. AVR에 내장되어 있는 타이머/카운터는 위의 얘기와 비슷한 원리로 동작한다. AVR 뿐만 아니라 대부분의 CP..