[뇌를 자극하는 하드웨어 - AVR LED 제어 - 타이머(내부 인터럽트)]
책에서는 AVR Studio로 컴파일을 하는데, 저는 IAR로 컴파일을 하다보니 책과 다소 소스가
다릅니다. 그래서 처음에 애 많이 먹었네요...
1. 목표
- 내부 인터럽트를 이용해서 1초마다 LED를 점멸하기
- 내부 인터럽트를 이용해서 FND500 제어
2. 소스
#include<iom162.h> #include<ina90.h> unsigned int timer_count; unsigned int count=0; #pragma vector=TIMER0_COMP_vect __interrupt void TIMER0_COMP_interrupt(void) { if(timer_count==125) { PORTD=count; timer_count=0; count++; if(count==10) { count=0; } } timer_count++; } void main(void) { timer_count=0; DDRD=0xff; // Port D를 출력 포트로 설정 PORTD=0x00; // LED OFF __disable_interrupt(); TCCR0=0x0D; OCR0=125; TCNT0=0x00; TIMSK=0x01; __enable_interrupt(); while(1); }
-TCCR0=0x0D: CTC모드 ( OCR0에 125숫자까지 0부터 1씩 증가하면서 125에도달하면 인터럽트를 발생시킨다. ) , 1024분주
-OCR0=125: 출력비교 레지스터
-TCNT0=0x00: 분주된 클럭주기로 인터럽트 발생시 하나씩 증가한후, 인터럽트 발생후 0으로 자동 초기화됨
-TIMSK=0x01: CTC모드 타입 인터럽트 인에이블 ( 비교 인터럽트 허용)
시스템이 16Mz로 동작하므로 1/16,000,000 * 1024 * 125 * 125 = 1000000 마이크로세컨드 = 1초로 이벤트가 발생한다.
3. 결과 1
- 2진수로 1~10까지를 표현합니다.
4. 결과 2
-위의 소스와 동일한 상태에서 PD0~PD4까지를 이전에 FND 예제에서 스위치를 제거하고 교체하면
위와 같이 자동으로 숫자가 증가됩니다.
5. 피드백
-AVR Studio에서의 인터럽트 처리는 SIGNAL(SIG_OUTPUT_COMPARE0) 인데, IAR에서는 어떻게 처리되는지 몰라서
처음에 많이 헤맨기억이 나네요..#pragma vector=TIMER0_COMP_vect 이런식으로 선언하고 구현해주면 됩니다.
'하드웨어 > 1. 뇌를 자극하는 하드웨어 입문' 카테고리의 다른 글
7. ATmega162 시리얼 통신 (2) | 2012.08.16 |
---|---|
6. 입력회로 실험 (0) | 2012.08.16 |
4. AVR LED 제어 (0) | 2012.08.15 |
3. AVR 환경 설정 (0) | 2012.08.12 |
2. FND507 제어 (2) | 2012.08.11 |