인터럽트…

여태까지 배운것…

아두이노란…

  • 입력과 출력

.디지털입력, 아날로그입력
.디지털출력, PWM 출력

  • 통신

.시리얼 vs USB

  • MIDI

————————
. 미디악기를 위한 아두이노 프로그래밍 기초는 배웠구요.
남았다고 생각하는 것은 어떻게 배치하고 구성하느냐와…
어떻게 연주와 퍼포먼스에 활용하냐… (제일 중요)
입니다.

. 1주일 쉬는 동안에 그동안 생각해왔던 아이디어와 고민등을 담아서
개념적으로라도 뭔가를 만들어 봅시다.
. . 완성과 작동은 안하더라도 그림으로라도 그린 생각도
. 훌륭한 작품이라고 생각합니다.
. . 한편으로 버튼하나 볼륨하나로 우리가 만든 것의 새로운 연주법을
생각해 내는 것도 훌륭한 작품이지요…
————————-

다시 제목으로 돌아와서
기초 아두이노에서 배우지 않은 인터럽트에 대해 설명코자 합니다.
아두이노에서는 잘 안쓰는 것으로 보이고요…
저도 잘 몰라요.

일부 분들이 스텝시퀀서를 만들려고 하시는 것 같은데…
제가 한번 해봤는데 우리가 배운 것 만으로는 힘든것 같아서
인터럽트라는 것을 추가로 배울까 합니다.

—–
인터럽트가 발생하면 MCU는 지금하던 프로그램을 종료하고 인터럽트 발생시 해야할 명령들을 수행합니다. 수행이 끝나면 다시 아까하던 프로그램으로 돌아가 동작하게 됩니다.

그러면 인터럽트는 어떻게 발생시키는가?
두가지가 있는데 하나는 버튼으로…
또다른 하나는 타이머/카운터로 합니다.

timer/counter는 시간을 재는 타이머와 숫자를 세는 카운터를 통칭하는 것이고요… 비슷한 다른 기능인데 mcu에서는 둘을 묶어서 사용합니다.

가령 호텔청소부가 방청소하고 있는데 급하게 로비에 재떨이이 비울일이 생겼으면 매니저가 전화를 걸겠지요.
전화를 받고 재떨이 비우고 하던 방청소를 하는 것과 비슷한 것이 버튼으로 인한 인터럽트입니다.

인터럽트 없이도 가능합니다. 방하나 치우고 로비가서 체크하고… 방하나치우고 로비가고… 이런식으로 하면 인터럽트 없이도 가능은 하지만 방치우는 일이 늦어지고 방치우는 동안 재떨이가 더러워진 상태로 있는 시간이 얼마간은 있지요.

두번째 타이머/카운터의 예는 1시간에 한번씩 약을 먹어야하는 청소부에요.
방하나 치우는데 평균 10분이라면 방을 6개 치우고 약하나 먹으면 되지요…
하지만 방마다 걸리는 시간이 다르기 때문에 정확히 1시간에 한번 약을 먹기는 힘들지요.. 1시간에 한번씩 알람이 울리면 청소중에도 정확한 시간에 먹을 수 있겠지요.

인터럽트는 avr에서도 다루기 까다롭기 때문에 아두이노에서는 잘 안쓰는 것 같습니다만 필요시에 사용하는 방법을 익히는 것도 좋을 것 같습니다.

시퀀서를 만들때 인터럽트 쓰지 않는 방법은 박자신호를 아두이노 내부에서가 아닌 노트북에서 주는 방법도 있지요. 맥스랑 프로세싱이랑 여러 프로그램이 서로 싱크해야할 경우 유용할 듯 합니다…. (사과님 아이디어)

===============================================

타이머 인터럽트 사용법
아래를 다운 받아서 라이브러리에 추가하셈
http://code.google.com/p/arduino-timerone/downloads/list

  • 저의 경우 라이브러리를 깔때 다음과 같이 합니다.

file:///Users/seokjongyoo/Documents/Arduino/libraries
일부 버전은 다른 것 같아요… 다들 어디다가 놓으시나요?

/*
 *  Timer1 library example
 *  June 2008 | jesse dot tane at gmail dot com
 */

#include "TimerOne.h"

void setup()
{
  pinMode(13, OUTPUT);
  Timer1.initialize();         // timer1 초기화, 디폴트값은 1000000마이크로초
  Timer1.attachInterrupt(callback, 500000);  // 500000마이크로초(0.5초)시간이 되면 callback()루틴을 실행하라
}

void callback() // callback 루틴
{
  digitalWrite(13, digitalRead(13) ^ 1); // 현재 13번핀이 하이면 로우 로우면 하이로...
}

void loop()
{
  // 실행하고 싶은 프로그램 아무거나...
}

참조 사이트
http://www.arduino.cc/playground/Code/Timer1

Advertisements