6. MC_E02SM3(ATmega128보드)이용. 인터럽트 LED 테스트2 (타이머인터럽트=내부인터럽트)

.


Colored By Color Scripter

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
 
int index = 0;                        //인터럽트 500번을 세기위한 인덱스
 
ISR(TIMER0_OVF_vect) {       
//TIMER/COUNTER0의 TCNT0이 overflow 났을때 발생하는 인터럽트, TIMSK0의 
                                                     //TOIE0 비트 설정되어야 이 인터럽트 발생함
    if(++index == 500) {             //인터럽트 500번 발생하면 if문 실행.
                 //LED 
            PORTD = 0x00;          //LED on-pull up resister.
            _delay_ms(200);        
                       
            PORTD = 0xFF;      // LED off
           TCNT0 = 6;    //인터럽트 발생시 TCNT0 6으로 재 초기화
           index = 0;    //500번 셋으니까 다시 500번 세기위해 0으로 초기화
        }             
           
     
           
}
 
void init_pin(void) {
    DDRD = 0xFF;           //PortD 출력으로 설정
    PORTD = 0B11111111;  //PortD 에 전압 인가
 
}
 
void init_timer(void) {
    cli();                  //전역 인터럽트 블럭
    TCNT0 = 6;              //TCNT0 6으로 초기화-1000ms로 맞추기 위해.
    TIMSK = (1 << TOIE0);   
    //TIMSK0의 TOIE0비트 1로 설정. 즉 TCNT0 reg 오버플로우시 인터럽트 발생
    TCCR0 = 0x00;           
    //Timer/Counter0 operations mode를 일반모드로 설정 p.91,92(표1.13.3)
    TCCR0 = (1 << CS02);     //prescaler 64 p.94 표(1.13.7)
    sei();                  //전역 인터럽트 허용
}
 
int main(void) {
    init_pin();  //핀설정
    init_timer();//타이머 설정
    while(1);   //기다림
    return 0;
}
 



AVR의 처리속도는 16MHz 이다.


      8, 32, 64, 128, 등등으로 나눌 수 있다. pdf자료 참고.

 -- 1/250000 마다 힛

 

AVR0~255까지 clock을 세면서 255이후를 세면서 overflow 발생. ->인터럽트 발생

 

그럼

 250이냐면 6부터 255까지 count 하니까.

 

그러면 1/1000 -> 1ms 마다 인터럽트가 발생한다.

 

416.6666666666667

 

(프리스케일러값) (카운팅 시작상수(0~255))

/8 -52.08333333333333

/32 -13.02083333333333

/64 -6.510416666666667

/128 -3.255208333333333

/256 -1.627604166666667

/1024 -0.4069010416666667

설정

트랙백

댓글