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; } } |
일단... 돌아는 갑니다... 직접 칩에 넣고 돌려서 확인 했어용~