[아두이노] [강좌] 28. 시간 관련 함수 (3) - MsTimer2 라이브러리

난 시간에 delay() 함수 없이 1초 간격으로 LED를 깜빡이는 BlinkWithoutDelay 예제를 살펴봤었다. 이번 강좌에서는 delay() 없이 1초 간격을 만들 수 있는 또다른 방법, 타이머 라이브러리에 대해 알아보도록 하자. 



아두이노의 공식 홈페이지인 arduino.cc에서는 아두이노에 정식으로 탑재된 라이브러리들 외에도 사용자들이 공유한 라이브러리들 중 채택된 일부 라이브러리를 소개하고 있다. MsTimer2 라이브러리 역시 그러한 라이브러리들 중 하나인데, 1밀리초 단위의 타이머를 쉽게 사용할 수 있도록 만들어져 있다.



>> 다운로드 페이지 : http://playground.arduino.cc/Main/MsTimer2



설명에 따르면, MsTimer2 라이브러리는 사용자가 간단하고 쉽게 타이머를 사용할 수 있도록 만들어졌다고 자랑하고 있어. 


moon_and_james-5 




근데 자랑해도 됨. 정말 쉬우니까.



단 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");

 }






0
0
이 글을 페이스북으로 퍼가기 이 글을 트위터로 퍼가기 이 글을 카카오스토리로 퍼가기 이 글을 밴드로 퍼가기

임베디드 보드

번호 제목 글쓴이 날짜 조회수
118 아두이노 ESP32 Analog Inputs (ADC) +4 icon 양재동메이커 02-12 16,149
117 아두이노 TIP : Serial의 Port가 Open 시점 확인 icon 양재동메이커 01-21 13,007
116 아두이노 ESP32 Boot Mode icon 양재동메이커 12-28 12,847
115 아두이노 아두이노 에러 리스트(Arduino Error list) icon 양재동메이커 11-24 17,829
114 아두이노 ESP32 main.cpp +1 icon 양재동메이커 11-19 13,195
113 아두이노 ESP32 EEPROM 와 IR Remote icon 양재동메이커 08-06 13,096
112 아두이노 Learn ESP32 icon 양재동메이커 06-25 12,670
111 라즈베리 파이 라즈베리 파이 (Raspberry Pi) 기초 icon 양재동메이커 06-19 14,169
110 라즈베리 파이 (동영상 강의) 라즈베리 파이 강좌 Link icon 양재동메이커 06-17 13,270
109 STM32 / MBED [MED] Switch debouncing icon HellMaker 12-30 15,251
108 기타 [타이젠] 아두이노의 16x2 LCD Display라이브러리 LiquidCrystal_I2C의 타이젠 포팅 icon 양재동메이커 09-15 14,818
107 기타 [타이젠] GPIO의 디지탈 출력과 입력 인터럽트의 C++ Class 제작 icon 양재동메이커 09-12 14,300
106 마이크로비트 서보 모터 icon HellMaker 09-03 14,117
105 마이크로비트 아날로그 온도센서 (마이크로 비트 센서 활용) icon HellMaker 09-01 14,631
104 마이크로비트 터치센서 (마이크로 비트 센서 활용) icon HellMaker 09-01 13,737
103 마이크로비트 디지털 홀 센서 (마이크로 비트 센서 활용) icon HellMaker 08-29 12,921
102 마이크로비트 리니어 홀 센서 (마이크로 비트 센서 활용) icon HellMaker 08-29 12,471
101 마이크로비트 불꽃 감지 센서 (마이크로 비트 센서 활용) icon HellMaker 08-26 12,810
100 마이크로비트 로터리 엔코더 (마이크로 비트 센서 활용) icon HellMaker 08-25 12,919
99 마이크로비트 2컬러 LED(3mm) (센서 활용) icon HellMaker 08-22 12,917