[아두이노] [강좌] 28. 시간 관련 함수 (3) - MsTimer2 라이브러리
난 시간에 delay() 함수 없이 1초 간격으로 LED를 깜빡이는 BlinkWithoutDelay 예제를 살펴봤었다. 이번 강좌에서는 delay() 없이 1초 간격을 만들 수 있는 또다른 방법, 타이머 라이브러리에 대해 알아보도록 하자.
아두이노의 공식 홈페이지인 arduino.cc에서는 아두이노에 정식으로 탑재된 라이브러리들 외에도 사용자들이 공유한 라이브러리들 중 채택된 일부 라이브러리를 소개하고 있다. MsTimer2 라이브러리 역시 그러한 라이브러리들 중 하나인데, 1밀리초 단위의 타이머를 쉽게 사용할 수 있도록 만들어져 있다.
>> 다운로드 페이지 : http://playground.arduino.cc/Main/MsTimer2
설명에 따르면, MsTimer2 라이브러리는 사용자가 간단하고 쉽게 타이머를 사용할 수 있도록 만들어졌다고 자랑하고 있어.
근데 자랑해도 됨. 정말 쉬우니까.
단 3개의 함수로 이루어져 있는데, 등록하고, 시작하고, 멈추는 기능의 3가지 함수이다. 함수 설명은 다음과 같다.
MsTimer2::set(ms, ISR)
타이머 주기와 타이머 인터럽트 처리 함수를 설정한다.
매개 변수
ms : 밀리초 단위로 타이머 주기를 정한다. unsigned long 타입이므로 약 50일 정도의 시간까지 설정할 수 있다.
ISR : ms로 설정한 밀리초 주기마다 발생하는 타이머 인터럽트 처리 함수명. 타이머가 해제되기 전까지 주기적으로 호출된다. 인터럽트 함수이므로 loop() 구문의 내용과 관계 없이 독립적으로 호출된다.
|
ISR 함수는 외부 인터럽트(attachInterrupt() 함수 참고)에서 사용했던 ISR과 동일하게 loop() 구문의 내용과 관계없이 타이머 인터럽트(설정한 시간이 지나면 자동으로 발생)가 발생한 순간 자동으로 호출되기 때문에 loop() 함수에 delay() 함수가 사용되어도 전혀 영향을 받지 않는다.
인터럽트에 대한 내용은 "인터럽트 강좌"의 초반 내용을 참고할 것.
MsTimer2::start()
타이머를 활성화한다. 이 함수가 호출된 순간부터 인터럽트가 발생. 매개 변수 없음.
MsTimer2::stop()
타이머를 해제한다. 이 후로 인터럽트 함수가 호출되지 않는다. 역시 매개 변수 엄슴.
아두이노 공식 홈페이지에서 MsTimer2 라이브러리를 다운로드 받으면 우노(Uno)에서는 사용할 수 있지만 메가(Mega 2560/ADK)에서는 사용할 수 없다. 메가의 칩인 ATmega2560은 아직 지원이 안되기 때문.
근데 MsTimer2에서 지원한다고 명시되어 있는 ATmega1280 칩이랑 ATmega2560 칩은 타이머 설정이 같다. 그래서 라이브러리 소스 파일에 “ define(__AVR_ATmega2560__)” 구문만 추가하면 메가에서도 사용할 수 있다.
똑같은데 왜 ATmega1280만 지원한다고 해놨을까잉.
암튼 메가(Mega 2560/ADK)에서도 사용할 수 있도록 수정된 라이브러리를 첨부 파일로 첨부해놨으니 필요한 사람은 받아가세요~
크롬에서 안받아지는 건 어쩌지;;;
안받아지는 사람은 위의 공식 홈페이지에서 파일을 다운로드 받은 후 MsTimer2.cpp 파일을 열고 "define(__AVR_ATmega1280__)"이라고 된 부분을 찾아 "define(__
AVR_ATmega2560__)"으로 고치거나 추가하면 된다.
... #if defined (__AVR_ATmega168__) || defined (__AVR_ATmega48__) || defined (__AVR_ATmega88__) || defined (__AVR_ATmega328P__) || (__AVR_ATmega1280__) || (__AVR_ATmega2560__) TIMSK2 &= ~(1<<TOIE2); ... |
이런 식으로. 라이브러리 추가하는 방법은 글 마지막의 "*참고"를 참조.
MsTimer2 라이브러리를 사용하여 1초 간격으로 LED를 켜고 끄는 예제 소스를 첨부하면서 나는 이만. 뿅!
(소스 너무 쉬워서 설명할 것도 엄슴)
아! 라이브러리의 함수를 사용하기 위해서 "#include"로 해당 함수가 선언된 헤더 파일을 꼭 추가해줘야 한다는 것에 유의!!
BlinkWithMsTimer2.ino |
#include <MsTimer2.h> int ledPin=13; int ledState=LOW; void setup() { pinMode(ledPin, OUTPUT);
MsTimer2::set(1000, timerISR); MsTimer2::start();
Serial.begin(9600); } void loop() { } void timerISR() { if(ledState == LOW) ledState = HIGH; else ledState = LOW;
digitalWrite(ledPin, ledState); Serial.println("Timer Check"); } |