5. AVR LED 제어 - 타이머(내부 인터럽트) 이용

|
[뇌를 자극하는 하드웨어 -  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
And