글
6. MC_E02SM3(ATmega128보드)이용. 인터럽트 LED 테스트2 (타이머인터럽트=내부인터럽트)
●프로젝트와 세미나/AVR-ATmega128
2014. 4. 8. 12:24
.
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 마다 힛
AVR은 0~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
'●프로젝트와 세미나 > AVR-ATmega128' 카테고리의 다른 글
AVR을 이용한 C-LCD출력(GDM2004D-NSW-FBW). (1) | 2014.05.25 |
---|---|
7. MC_E02SM3(ATmega128보드)이용. UART (0) | 2014.04.15 |
5. MC_E02SM3(ATmega128보드)이용. 외부 인터럽트 LED 테스트1 (0) | 2014.04.08 |
4. MC_E02SM3(ATmega128보드)이용. LED테스트 (0) | 2014.04.02 |
3. MC_E02SM3(ATmega128보드)이용. 기본설치(MSVBVM50.dll, EZDownloader for AVR, Silicon Lab) (0) | 2014.04.02 |