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
48
49
50
51
52
53
54
55
56
/********************************************************************
 파일명 : Timer_led.c
 
 동 작 : 
 타이머0을 이용하여 LED를 1초간격으로 킨다.
       
 포트연결 :
1) 포트E 8핀을 LED에 연결
 
 소스 설명 :
 1) AVR 입출력에 대한 헤더 파일과 인터럽트를 사용하기 위한 헤더를 선언한다.
 2) 타이머 0 오버플로우 인터럽트 서비스 루틴을 선언한다.
 3) LED 모듈에 데이터를 보내기 위해 PORT E를 출력으로 설정한다.
 4) 타이머0 에 대해 1024분주, Normal모드로 설정한다. TCNT0은 내부클럭/분주기의 역수 * TCNT가카운트하는 수 = 인터럽트에 걸리는 시간
 5) 전체 인터럽트를 허용하는 함수
 6) LED_DATA를 PortE로 보내 LED를 킨다.
 7) 타이머0이 오버플로우가 발생되면 호출되는 함수로 TCNT0을 0으로 초기화하지않고 지정한값으로 초기화하고 time0Cnt 변수를 사용함으로 써 더 긴시간을 잴 수 있다.
********************************************************************/
// 1)
#include<avr/io.h>
#include<avr/interrupt.h>
 
 
unsigned char LED_Data = 0x00;
unsigned cchar timer0Cnt=0;
// 2)
SIGNAL(SIG_OVERFLOW0);  //Timper0 Overflow0 ISP
 
 
int main(){
// 3)
    DDRE = 0xFF;  //PORTE를 모두 출력으로 사용
// 4)
    TCCR0 = 0x07;//0000 0111 Timer/Count0을 1024분주기, Normal Mode로 설정
    TCNT0 = 0xff - 72; (1/ (내부 클럭 7.3728 Mhz / 분주기1024 prescaler)) * 72 => 0.01 s
    TIMSK |= 1 << TOIE0;     // 오버플로우 인터럽트 허용
    TIFR |= 1 << TOV0;    //TOV0 Timer/Counter0 overflow flag 클리어
// 5)
    sei();
// 6)
    while(1){
        PORTE = LED_DATA;
    }
    return 0;
}
// 7)
SIGNAL(SIG_OVERFLOW0)
{
    cli();
    TCNT0=0xff-72;    //0으로 초기화되는것이 아닌 0xff-72로 초기화
    timer0Cnt++;
    if(timer0Cnt == 100) {  //0.01s * 100 = 1s
        LED_Data++;
        timer0Cnt = 0;
    }
}
cs


'프로그래밍 > ATMega128' 카테고리의 다른 글

(ATMega128) 정리  (0) 2016.07.10
(ATMega128) PC와의 UART통신  (0) 2016.07.10
(ATMega128) PWM 사용하기  (0) 2016.07.10
(ATMega128) 인터럽트를 이용한 LED동작 멈춤/재생  (0) 2016.07.10
(ATMega128) FND값 올리기  (0) 2016.07.10

+ Recent posts