'ATmega328'에 해당되는 글 1건

  1. 2016.11.15 AVR Timer
2016.11.15 23:16

AVR 타이머 예제


앞에서 while 문에 타이밍 에 따라 분기 시켰는데...


이게 더 정답일듯 하다. 왜냐면.. 그 앞의 함수 실행 시간 동안 미세하게 나마 지연(?)같은 것이 발생할 테고... 그러면 미미하게나마 타이밍이 틀어질 수 있으니까...


타이머 사용하면 타이밍에 맞게 알아서 인트럽트 발생시켜 주니까 이쪽이 타이밍이 더 정확하게 동작할 것 같다.


스레드 대신 타이머... 로 생각하면 되려나...?

...일단은 어렵다!!


타이머가 몇개 인지는 모르겠는데... 타이머 갯수만큼 스레드 처럼 부려먹을수 있을지 조사해 봐야겠다 -_-;;


모드가 아래 2가지가 있는 듯 한데 

Normal - 정확하지 않은 타이밍

CTC - 정확한 타이밍


이것만 보면 당연히 CTC만 써야되고 Normal 은 못쓸것이 된다.

장/단점 이라던가... 더 찾아봐야 겠다.


음... 이 코드는 OCR1A가 있는 것으로 봐서 CTC 모드 인 것으로 보인다. (아직 코드 이해가 -_-)


일단 갖고 놀다보면 이해가 될거라 굳게 믿고 있음!! 꼭!!


#define F_CPU 16000000UL // Set CPU Frequency 16 MHz


#define setbit(PORTX, BitX) PORTX |= (1 << BitX) // set bit to 1

#define clrbit(PORTX, BitX) PORTX &= ~(1 << BitX) // clear bit


#include <avr/io.h>

#include <avr/interrupt.h>


int count = 0;


// Main Function

int main(void)

{

OCR1A = 0x3D08;


setbit(TCCR1B, WGM12);

setbit(TIMSK1, OCIE1A);

setbit(TCCR1B, CS12);

setbit(TCCR1B, CS10);


sei();


DDRD |= (1 << DDD6); // Set output PD6

DDRD |= (1 << DDD7); // Set output PD7


while (1)

{


}

}


ISR (TIMER1_COMPA_vect)

{

if (count == 0)

{

count++;

clrbit(PORTD, PORTD6);

}

else

{

setbit(PORTD, PORTD6);

count = 0;

}


일단... 돌아는 갑니다... 직접 칩에 넣고 돌려서 확인 했어용~ 




Posted by 해비