개발/아두이노

[아두이노] 타이머카운터, 타이머인터럽트 소스코드 (내부인터럽트)

두노이노 2014. 12. 9. 19:45
타이머인터럽트는 정말로 많이 쓰인다.

시스템을 구성할 때 여러개를 동시에 돌려야 하기 때문에!

void loop()에서는 순차적으로 모든 프로세스를 해결한다.

그렇지만 타이머인터럽트를 쓰게되면 원하는 시간에 원하는 작업을 진행할 수 있다.

RTOS를 대체할 수 있는?? 기능이라고 생각해도 될거같음!!


<소스>


#include "string.h"
#include <MsTimer2.h>

/* TimerCnt */
 int Timer;


void ISR_Timer()
{
  Timer++;
  if(Timer>1000)
  {
    Serial.print("1sec\n");
    Timer = 0;
  }
}


void setup() 
{
  MsTimer2::set(1,ISR_Timer);      //1ms, ISR_Timer
  MsTimer2::start();
  Serial.begin(9600);    //Serial Baudrate Set
}

void loop()     //system loop
{    
 
}



</소스>






<동작 설명>
MsTimer2 라는 라이브러리를 추가 하시고(라이브러리 추가하는 방법 게시글 확인)
라이브러리 다운 ( http://cafe.naver.com/dunoino/5 )
#include <MsTimer2.h> 를 추가합니다.
loop문에 소스가 없이 타이머인터럽트를 이용하여서  원하는 작업을 할 수 있습니다.
해당 소스는 1ms주기로 ISR_Timer()이라는 함수를 호출하여 Timer이라는 변수를 1씩 증가시켜줍니다.
Timer이란 변수가 1000을 넘어가게 되면, 즉 1000ms(1초)가 되면 1sec를 시리얼통신을 통해 시리얼모니터에 출력시키게 됩니다.
그 후 Timer이라는 변수를 다시 0으로 초기화 시켜 주게 된다면 위의 소스는 1초에 1번씩 1sec를 시리얼모니터에 출력시킵니다.
Serial.print("1sec\n");
이라는 함수 대신에 LED를 켠다던지, 원하는 작업을 하시면 됩니다.
1초가 아니라 2초를 원하신다면 if(Timer>2000)이라고 수정하시면 되겠죠?