12/14/2015

AVR Timer

1. ATmega128A Timer 

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 관련핀들

  1. T1,T2,T3        :  외부의 별도의 Crystal를 사용하여 이를 Timer로 이용. 
  2. ICP1,3           : 외부의 신호 이용하여 Timer로 이용하는 것 같다. 
  3. OC0,OC1A 등 : 내가 설정한 값에 도달하면 이를 알려준다(비교기)
OCx관련된 핀으로  PWM 기능으로 사용한다.
그러므로, 만약 PWM기능이 필요없다면, 사용할 필요가 없을 거 같다.



Timer는 기본적은 PWM과 동작이 가능하며, 여러가지 모드를 제공을 한다.
현재 정확히 모든기능을 모두 사용을 해보지 못하고 테스트를 해보지도 못했다.

  • 제공모드
  1. Normal Mode
  2. Clear Timer on Compare Match (CTC) Mode
  3. Fast PWM Mode
  4. Phase Correct PWM Mode
  5. Phase and Frequency Correct PWM Mode

하지만, 내가하는 일은 PWM을 사용하는 일이 아니기에 필요가 없지만, PWM Motor 제어라든지 이때 사용하면 적합할껏 같다.


  • 확인 Register


  1. TIFR/ETIFR       :  Flag 설정
  2. 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);











  1. TOVn Flag Set on (Timer/Counter Overflow Flag) : Timer interrupt 발생 시점  
  2. Update of OCRnx at : OCRnX Register를 Update 해주는 시점 
  3. TOP : 위 의 정의 참조 
  4. BOTTOM: 위 정의 참조 
  5. 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