J 창고

[Atmega128] 8bit 타이머/카운터 인터럽트 본문

컴퓨터/Firmware

[Atmega128] 8bit 타이머/카운터 인터럽트

JSFamily 2015. 1. 3. 17:15




타이머0 에 대한 설정 레지스터 TCCR0 레지스터







1. Mode 설정

Normal, CTC, Fast PWM, Phase Correct PWM 모드 설정은 


6bit, 3bit의 WGM00과 WGM01 레지스터로 설정한다


Table 52. 를 참고



Normal Interrupt 모드와 Compare Match Interrupt(CTC) 모드의 차이점은



위의 그림처럼 TCNTn 레지스터가 클럭에 비례해서 Up 카운팅이 되는데


8bit 카운터이기 때문에 2^8 = 256 까지 카운팅이 되어 OverFlow가 발생하게 된다


이때 Interrupt가 발생한다


그에 반해



CTC모드는 Compare Match Interrupt로


TCNTn에서 지속적으로 Up 카운팅을 하고 는 있지만 OCRn 레지스터와 지속적으로 Compare 하여


OCRn 레지스터와 같아지는 순간에 OverFlow가 발생한다.


따라서 Interrupt 발생하는 시기를 조절할 수 있게 된다.

CTC 모드 뿐만 아니라 Fast PWM, Phase Correct PWM 모드에서도 사용한다.










2. 세부 모드 설정


Nomal 모드가 아닐 때 세부 모드 설정


Table 53. Table 54. Table 55. 참고













3. Prescaler 설정


Nomal 모드시 16Mhz => 62.5ns


Prescaler 1024 적용시 62.5ns * 1024 = 64us


8bit Timer 이므로 64us * 256 = 16.384ms 마다 한번씩 인터럽트 발생





CTC 모드 시 Prescaler 1024, OCR0  0x7C(124)


64us * (1+124번) = 8ms 마다 한번씩 인터럽트 발생


1sec / 8ms = 125    


따라서 1초마다 LED ON/OFF 하려면 인터럽트 카운트 125을 해야 함














4. 카운터 저장하는 저장 레지스터


기본적으로 업 카운팅이며 8비트 카운터로 256까지 카운트 가능


클럭에 따라 카운팅 되는 레지스터






5. Output 비교 레지스터


CTC, Fast PWM, Phase Correct PWM 모드에서 비교 레지스터로 사용







6. 타이머/카운터 인터럽트 마스크 레지스터


타이머/카운터를 인터럽트 발생의 소스로 사용할지 말지에 대한 마스크 레지스터


Overflow Interrupt 를 사용하기 위해선 Bit 0을 SET하고


Compare Match Interrupt 를 사용하기 위해선 Bit 1을 SET 해야 한다.










7. 타이머/카운터 인터럽트 플래그 레지스터

















마지막 참고 자료


타이머0 오버플로우 인터럽트
  TCCR0=3;     TCNT0=156;     TIMSK=1;      //    16000000/  32/100=5000Hz=200us,(256-100)=156
  TCCR0=4;     TCNT0=6;       TIMSK=1;      //    16000000/  64/250=1000Hz=1ms,  (256-250)=6
  TCCR0=5;     TCNT0=131;     TIMSK=1;      //    16000000/ 128/125=1000Hz=1ms,  (256-125)=131
  TCCR0=5;     TCNT0=6;       TIMSK=1;      //    16000000/ 128/250= 500Hz=2ms,  (256-250)=6
  TCCR0=6;     TCNT0=6;       TIMSK=1;      //    16000000/ 256/250= 250Hz=4ms,  (256-250)=6
  TCCR0=7;     TCNT0=100;     TIMSK=1;      //    16000000/1024/156=100.16Hz=0.984ms, (256-156)=100
  TCCR0=7;     TCNT0=6;       TIMSK=1;      //    16000000/1024/250=62.5Hz=16ms, (256-250)=6


 타이머0 매치 인터럽트
  TCCR0=0x0B; OCR0= 28;  TIMSK=2;  //16000000/  32/(1+ 28)=17241.37931Hz=58us
  TCCR0=0x0B; OCR0= 49;  TIMSK=2;  //16000000/  32/(1+ 49)=10000Hz=100us
  TCCR0=0x0B; OCR0= 99;  TIMSK=2;  //16000000/  32/(1+ 99)= 5000Hz=200us
  TCCR0=0x0C; OCR0= 74;  TIMSK=2;  //16000000/  64/(1+ 74)= 3333.3Hz=300us
  TCCR0=0x0C; OCR0=124;  TIMSK=2;  //16000000/  64/(1+124)= 2000Hz=500us
  TCCR0=0x0C; OCR0=249;  TIMSK=2;  //16000000/  64/(1+249)= 1000Hz=1ms
  TCCR0=0x0D; OCR0=124;  TIMSK=2;  //16000000/ 128/(1+124)= 1000Hz=1ms
  TCCR0=0x0D; OCR0=249;  TIMSK=2;  //16000000/ 128/(1+249)=  500Hz=2ms
  TCCR0=0x0E; OCR0=249;  TIMSK=2;  //16000000/ 256/(1+249)=  250Hz=4ms
  TCCR0=0x0F; OCR0= 71;  TIMSK=2;  //14745600/1024/(1+ 71)=  200Hz=5ms
  TCCR0=0x0F; OCR0=155;  TIMSK=2;  //16000000/1024/(1+155)= 100.16..Hz=9.984ms
  TCCR0=0x0F; OCR0=249;  TIMSK=2;  //16000000/1024/(1+249)= 62.5Hz=16ms


 타이머1 오버플로우 인터럽트
  TCCR1B=1; TCNT1=49536; TIMSK=4; //16000000/  1/16000=1000Hz=1ms,  (65536-16000)=49536
  TCCR1B=1; TCNT1=33536; TIMSK=4; //16000000/  1/32000= 500Hz=2ms,  (65536-32000)=33536
  TCCR1B=2; TCNT1=63536; TIMSK=4; //16000000/  8/ 2000=1000Hz=1ms,  (65536- 2000)=63536
  TCCR1B=2; TCNT1=61536; TIMSK=4; //16000000/  8/ 4000= 500Hz=2ms,  (65536- 4000)=61536
  TCCR1B=2; TCNT1=45536; TIMSK=4; //16000000/  8/10000= 200Hz=5ms,  (65536-10000)=45536
  TCCR1B=2; TCNT1=35536; TIMSK=4; //16000000/  8/20000= 100Hz=10ms, (65536-20000)=35536
  TCCR1B=3; TCNT1=65286; TIMSK=4; //16000000/ 64/  250=1000Hz=1ms,  (65536-  250)=65286
  TCCR1B=4; TCNT1=59286; TIMSK=4; //16000000/256/ 6250=  10Hz=100ms,(65536- 6250)=59286
  TCCR1B=4; TCNT1=34286; TIMSK=4; //16000000/256/31250=   2Hz=500ms,(65536-31250)=34286
  TCCR1B=4; TCNT1= 3036; TIMSK=4; //16000000/256/62500=   1Hz=1sec, (65536-62500)= 3036


 타이머1 A매치 인터럽트
  TCCR1B=0x09; OCR1A= 1474; TIMSK=0x10; //14745600/  1/(1+ 1474)=9997.01695Hz=100.02984us
  TCCR1B=0x09; OCR1A= 1599; TIMSK=0x10; //16000000/  1/(1+ 1599)=10KHz=100us
  TCCR1B=0x09; OCR1A= 3999; TIMSK=0x10; //16000000/  1/(1+ 3999)= 4KHz=250us
  TCCR1B=0x09; OCR1A=15999; TIMSK=0x10; //16000000/  1/(1+15999)=1000Hz=1ms
  TCCR1B=0x09; OCR1A=31999; TIMSK=0x10; //16000000/  1/(1+31999)= 500Hz=2ms
  TCCR1B=0x0A; OCR1A= 1999; TIMSK=0x10; //16000000/  8/(1+ 1999)=1000Hz=1ms
  TCCR1B=0x0A; OCR1A= 3999; TIMSK=0x10; //16000000/  8/(1+ 3999)= 500Hz=2ms
  TCCR1B=0x0A; OCR1A= 4999; TIMSK=0x10; //16000000/  8/(1+ 4999)= 400Hz=2.5ms
  TCCR1B=0x0A; OCR1A= 9999; TIMSK=0x10; //16000000/  8/(1+ 9999)= 200Hz=5ms
  TCCR1B=0x0A; OCR1A=19999; TIMSK=0x10; //16000000/  8/(1+19999)= 100Hz=10ms
  TCCR1B=0x0A; OCR1A=18431; TIMSK=0x10; //14745600/  8/(1+18431)= 100Hz=10ms
  TCCR1B=0x0A; OCR1A=39999; TIMSK=0x10; //16000000/  8/(1+39999)=  50Hz=20ms
  TCCR1B=0x0A; OCR1A=59999; TIMSK=0x10; //16000000/  8/(1+59999)= 33.33Hz=30ms
  TCCR1B=0x0B; OCR1A=  249; TIMSK=0x10; //16000000/ 64/(1+  249)=1000Hz=1ms
  TCCR1B=0x0C; OCR1A= 3124; TIMSK=0x10; //16000000/256/(1+ 3124)=  20Hz=50ms
  TCCR1B=0x0C; OCR1A= 6249; TIMSK=0x10; //16000000/256/(1+ 6249)=  10Hz=100ms
  TCCR1B=0x0C; OCR1A=12499; TIMSK=0x10; //16000000/256/(1+12499)=   5Hz=200ms
  TCCR1B=0x0C; OCR1A=31249; TIMSK=0x10; //16000000/256/(1+31249)=   2Hz=500ms
  TCCR1B=0x0C; OCR1A=62499; TIMSK=0x10; //16000000/256/(1+62499)=1Hz=1sec
  TCCR1B=0x0D; OCR1A=62499; TIMSK=0x10; //16000000/1024/(1+62499)=0.25Hz=4sec


 타이머3 A매치 인터럽트
  TCCR3B=0x09; OCR3AH= 1474>>8; OCR3AL= 1474&0xFF; ETIMSK=0x10; //14745600/  1/(1+ 1474)=9997.01695Hz=100.02984us
  TCCR3B=0x09; OCR3AH= 1599>>8; OCR3AL= 1599&0xFF; ETIMSK=0x10; //16000000/  1/(1+ 1999)=10KHz=100us
  TCCR3B=0x09; OCR3AH=15999>>8; OCR3AL=15999&0xFF; ETIMSK=0x10; //16000000/  1/(1+15999)=1000Hz=1ms
  TCCR3B=0x09; OCR3AH=31999>>8; OCR3AL=31999&0xFF; ETIMSK=0x10; //16000000/  1/(1+31999)= 500Hz=2ms
  TCCR3B=0x0A; OCR3AH= 1999>>8; OCR3AL= 1999&0xFF; ETIMSK=0x10; //16000000/  8/(1+ 1999)=1000Hz=1ms
  TCCR3B=0x0A; OCR3AH= 3999>>8; OCR3AL= 3999&0xFF; ETIMSK=0x10; //16000000/  8/(1+ 3999)= 500Hz=2ms
  TCCR3B=0x0A; OCR3AH= 9999>>8; OCR3AL= 9999&0xFF; ETIMSK=0x10; //16000000/  8/(1+ 9999)= 200Hz=5ms
  TCCR3B=0x0A; OCR3AH=19999>>8; OCR3AL=19999&0xFF; ETIMSK=0x10; //16000000/  8/(1+19999)= 100Hz=10ms
  TCCR3B=0x0C; OCR3AH= 6249>>8; OCR3AL= 6249&0xFF; ETIMSK=0x10; //16000000/256/(1+ 6249)=  10Hz=100ms
  TCCR3B=0x0C; OCR3AH=31249>>8; OCR3AL=31249&0xFF; ETIMSK=0x10; //16000000/256/(1+31249)=   2Hz=500ms
  TCCR3B=0x0C; OCR3AH=62499>>8; OCR3AL=62499&0xFF; ETIMSK=0x10; //16000000/256/(1+62499)=1Hz=1sec
  TCCR3B=0x0C; OCR3AH=28799>>8; OCR3AL=28799&0xFF; ETIMSK=0x10; //14745600/1024/(1+28799)=0.5Hz=2sec


 타이머2 매치 인터럽트
  TCCR2=0x0B; OCR2= 24;  TIMSK=0x80; //16000000/64/(1+ 24)=10000Hz=100us
  TCCR2=0x0B; OCR2=249;  TIMSK=0x80; //16000000/64/(1+249)=1000Hz=1ms






Comments