Timer를 사용하는 이유는 다양하겠지만, 기본 Timer 와 추가 Timer를 사용하고 있으며,
기본 Timer는 일정 간격으로 Main 함수의 여러 기능의 함수를 Poling 방식 호출하는 데 사용하고 있다.
Linux의 일종의 HZ 설정 , 즉 jiffies 기능이다
기본구성을 처음 Timer 없이 Polling으로 Main 함수를 구현 했으며, 필요한 부분은
Delay를 사용을 했으나, 각 interrupt의 성능저하의 문제를 일으켜 delay대신 Timer로 변경하게되었다.
http://www.elecrom.com/2008/02/12/avr-tutorial-2-avr-input-output/
2. TIMER의 기본구성
AVR128은 Timer는 4개의 Timer로 구성이 되어있으며, 8bit와 16bit 각각 2개씩 구성이 되어있다.
그리고, 이 Timer는 많은 기능을 가지고 있어 나의 경우는 Timer로 밖에 사용하지 않았기에 다른 기능은 별로 중요하지 않았다.
- 아래와 같이, Timer 관련핀들
- T1,T2,T3 : 외부의 별도의 Crystal를 사용하여 이를 Timer로 이용.
- ICP1,3 : 외부의 신호 이용하여 Timer로 이용하는 것 같다.
- OC0,OC1A 등 : 내가 설정한 값에 도달하면 이를 알려준다(비교기)
그러므로, 만약 PWM기능이 필요없다면, 사용할 필요가 없을 거 같다.
Timer는 기본적은 PWM과 동작이 가능하며, 여러가지 모드를 제공을 한다.
현재 정확히 모든기능을 모두 사용을 해보지 못하고 테스트를 해보지도 못했다.
- 제공모드
- Normal Mode
- Clear Timer on Compare Match (CTC) Mode
- Fast PWM Mode
- Phase Correct PWM Mode
- Phase and Frequency Correct PWM Mode
하지만, 내가하는 일은 PWM을 사용하는 일이 아니기에 필요가 없지만, PWM Motor 제어라든지 이때 사용하면 적합할껏 같다.
- 확인 Register
- TIFR/ETIFR : Flag 설정
- TIMSK/ETIMSK : Interrupt 설정
- 16bit timer의 구성
- 8bit timer 기본정의
TOP은 고정값 0XFF이외에도 OCR2에 저장된 값에 의해서도 사용이 가능하다. (유저셋팅)
- 16bit timer 기본정의
TOP은 고정값, 0xFF, 0x1FF,0x3FF 혹은 OCRnA의 ICRn에 저장된 값에 의해 변경이 가능
cbi(TCCR1A,WGM10);
sbi(TCCR1A,WGM11);
sbi(TCCR1B,WGM12);
sbi(TCCR1B,WGM13);
- TOVn Flag Set on (Timer/Counter Overflow Flag) : Timer interrupt 발생 시점
- Update of OCRnx at : OCRnX Register를 Update 해주는 시점
- TOP : 위 의 정의 참조
- BOTTOM: 위 정의 참조
- MAX: 위 정의 참조
위 도표를 보면,
예를 들면, Mode 14 , Fast PWM 일 경우, TOP에 ICRn로 유저가 설정하고
그 TOP이 TOV에 적용이 된다. 그래서, User Timer로 사용이 가능하다.
15도 동일 할 것이다.
- 8bit timer
- 16bit Counter , 8bit는 유사함
- ICP
- OCP
아래와 같이 library를 사용해서 간단히 Timer를 쉽게 구현했다.
timer1Init(); timer1SetPrescaler(TIMER_CLK_DIV1024); // 11059200/1024 = 10800 HZ Tick . timer1PWMInitICR(TIMER_DIV_VAL); // 10800/1080 = 10Hz , 100ms this timer is 16bit and (timer 1) timerAttach(TIMER1OVERFLOW_INT,setHandler); // timer handler, timer3Init(); timer3SetPrescaler(TIMER_CLK_DIV1024); // 11059200/1024 = 10800 HZ Tick . timer3PWMInitICR(TIMER_DIV_VAL); // 10800/1080 = 10Hz , 100ms this timer is 16bit and (timer 3) timerAttach(TIMER3OVERFLOW_INT,Timer2Handler); // Timer2Handler