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 |