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..
AVR에서 인터럽트가 발생하였을 때 이를 처리하기 위한 ISR 함수는 ISR()이라는 매크로를 사용하면 된다고 앞의 글에서 설명하였다. UART RX 인터럽트가 발생하였을 때 이를 처리하기 위하여 ISR(USART_RX_vect)라고 정의해 주면 되었다. 그러나, AVR 프로그램을 처음 시작하는 프로그래머는 어디서 이런 정보를 얻어야 되는지 몰라서 무척 당황하게 된다. 물론 요즘은 인터넷 검색으로 'AVR 인터럽트'라고 치면 많은 정보를 쉽게 찾을 수 있겠지만, 이렇게 찾아낸 것들은 주로 많이 사용하는 인터럽트 몇개의 경우에 한정된다. 만약 Analog Comparator에서 발생하는 인터럽트를 사용하려면 ISR() 안에 무엇을 넣어야 되는지 빨리 못찾을수가 있다. 답부터 얘기하면 Atmel Studio..