AVR > 타이머 오버플로우 인터럽트와 매치 인터럽트

TODAY7,578 TOTAL7,737,697
사이트 이용안내
Login▼/회원가입
최신글보기 질문게시판 기술자료 동영상강좌

아두이노 센서 ATMEGA128 PWM LED 초음파 AVR 블루투스 LCD UART 모터 적외선


BASIC4MCU | AVR | 타이머 | 타이머 오버플로우 인터럽트와 매치 인터럽트

페이지 정보

작성자 키트 작성일2017-08-29 09:33 조회5,862회 댓글0건

본문

많은 분들이 타이머 인터럽트에 대해서 이해가 잘 안가는 것 같아서

간단하게 설명을 해보겠습니다.

 

128에서

타이머0,2는  8비트 타이머,

타이머1,3은 16비트 타이머 입니다.

//=====================================================

분주비

TCNTx가 1씩 증가 하는, 타이머클럭을 결정 하는 것이 분주비입니다.

x-tal / 분주비 = 타이머클럭

 

CSx2 CSx1 CSx0  각 비트의 0,1 설정에  따라서

1/1, 1/8, 1/32, 1/64, 1/128, 1/256, 1/1024 등을 만듭니다.

타이머0, 타이머1,3, 타이머2가 조금씩 다르므로 데이터시트를 봐야 합니다.

 

//=====================================================

타이머카운터 TCNTx

1. 오버플로우 인터럽트

TCNT는 0부터 0xFF(0xFFFF)까지 1씩 증가 한 후 다시 0으로 오버플로우 하면서 인터럽트가 발생 합니다.

일정한 카운터를 시키기 위해서는 인터럽트 함수 초기에 TCNT값을 갱신 해줘야 합니다.

 

2. 매치 인터럽트

TCNT는 0부터 OCRx(OCRxA,OCRxB,OCRxC)과 같아질 때까지 1씩 증가 한 후 다시 0으로 크리어 되고 인터럽트가 발생 합니다.

타이머1과 3은 OCR 레지스터가 3개(OCRxA,OCRxB,OCRxC)씩 있어서 조금 복잡 하지만

주로 A매치 인터럽트 1개만 사용 합니다.

//=====================================================

아래는 코드비젼의 인터럽트 함수와 메인함수의 초기 설정 예입니다.

 

//=====================================================

// 타이머0 인터럽트
interrupt [TIM0_OVF] void timer0_ovf_isr(void){       
// 오버플로우 인터럽트
    TCNT0=131// TCNT값 갱신
}
interrupt [TIM0_COMP] void timer0_comp_isr(void){ }  // 매치 인터럽트
//=====================================================

// 타이머1 인터럽트
interrupt [TIM1_OVF] void timer1_ovf_isr(void){       
// 오버플로우 인터럽트
    TCNT1=49536// TCNT값 갱신
}
interrupt [TIM1_COMPA] 
void timer1_compa_isr(void){ } 
// A매치 인터럽트
//=====================================================



//=====================================================

void main(void){// 메인함수
//=====================================================

// TCCR0    FOC0    WGM00    COM01    COM00    WGM01    CS02    CS01    CS00
// TCCR0=1:1/1, TCCR0=2:1/8, TCCR0=3:1/32, TCCR0=4:1/64, TCCR0=5:1/128, TCCR0=6:1/256, TCCR0=7:1/1024 
//
// Compare Output Mode & Waveform Generation Mode
// TCCR1A    COM1A1    COM1A0    COM1B1    COM1B0    COM1C1    COM1C0    WGM11    WGM10
//
// TCCR1B    ICNC1    ICES1    ?    WGM13    WGM12    CS12    CS11    CS10
// TCCR1B=1:1/1, TCCR1B=2:1/8, TCCR1B=3:1/64, TCCR1B=4:1/256, TCCR1B=5:1/1024 
//
// TIMSK  OCIE2   TOIE2    TICIE1       OCIE1A   OCIE1B   TOIE1    OCIE0   TOIE0

//        Compare Overflow InputCapture CompareA CompareB Overflow Compare Overflow
//=====================================================

// 타이머0 오버플로우 인터럽트 //16000000/128/125=1000, (256-125)=131
    TCCR0=5; TCNT0=131; TIMSK=0x01;

// 타이머0 매치 인터럽트 //16000000/128/(1+124)=1000

    TCCR0=
0x0D; OCR0=124;  TIMSK=0x02


// 타이머1 오버플로우 인터럽트 //16000000/16000= 1000, (65536-16000)=49536
    TCCR1B=1; TCNT1=49536; TIMSK=0x04;

// 타이머1 A매치 인터럽트 //16000000/(1+15999)=1000

    TCCR1B=
9; OCR1A=15999; TIMSK=0x10;

//=====================================================

 


//=====================================================

// 타이머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=9.84ms, (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

//=====================================================

댓글 0

조회수 5,862

등록된 댓글이 없습니다.

AVRHOME > AVR > 전체 목록

게시물 검색

2022년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2021년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2020년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2019년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2018년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
Privacy Policy
MCU BASIC ⓒ 2020
모바일버전으로보기