목차

타임 인터럽트

여러 개의 타이머 인터럽트를 동시에 등록할 수 있으며, 각 타이머는 독립적으로 동작합니다.

timerId는 고유해야 하며, 동일한 번호를 재사용하면 기존 설정이 덮어쓰기 됩니다.

On Timer

On Timer(timerId, interval) ISR

파라미터 설명
timerId 타이머 인터럽트 번호 (1 ~ 255, 고유값 사용)
interval 인터럽트 주기 (1=10ms, 2=20ms … 65535=655350ms=655초=약10분55초)
ISR 인터럽트 서비스 루틴(Sub 이름)

사용 예:

On Timer(1, 100) ABC   ' 1초마다 실행
On Timer(2, 500) DEF   ' 5초마다 실행

Do
Loop

Sub ABC()
  Incr i
End Sub

Sub DEF()
  Incr j
End Sub

동작 특징:

  1. 각 타이머는 독립적으로 주기 실행됨
  2. 서로 다른 ISR을 연결 가능
  3. Non-blocking 방식 (메인 루프와 병행 실행)
  4. 타이머 개수는 최대 255개까지

주의:
- ISR 내부에서는 반드시 짧고 빠르게 실행되도록 작성하십시오. (Delay,Wait,시리얼 송신명령 사용금지, 무한루프 금지, 블록킹 금지)
- ISR 실행 시간이 길면 동일 타이머의 다음 인터럽트는 지연되거나 무시될 수 있습니다.
- 여러 ISR이 동시에 발생할 경우 실행 순서는 보장되지 않습니다.

Tip: 플래그를 이용한 임시 인터럽트 금지

특정 상황에서 타이머 ISR의 실제 동작을 잠시 막고 싶다면, 다음과 같이 플래그 변수를 이용해 간단하게 제어할 수 있습니다.

Dim Timer1Enable As Byte
Dim i As Integer

Timer1Enable = 1

On Timer(1, 100) ABC   ' 1초마다 실행

Do
  ' 필요할 때 ISR 동작 금지
  Timer1Enable = 0

  ' 중요한 처리 구간
  ' ...

  ' 다시 ISR 동작 허용
  Timer1Enable = 1
Loop

Sub ABC()
  If Timer1Enable = 0 Then Exit Sub

  Incr i
End Sub

이 방식은 타이머 인터럽트 등록 상태는 그대로 유지하면서, ISR 내부의 실제 처리만 선택적으로 실행하거나 건너뛰는 방식입니다.

왜 타임 인터럽트가 필요한가요? (On Timer의 목적)

타임 인터럽트를 쓰는 필요한 이유는 다음과 같습니다.

시간 측정 예제 (시/분/초)

타이머 인터럽트를 이용해 1초마다 시간을 누적하여 시(Hour), 분(Minute), 초(Second)를 계산하는 예제입니다.

Dim sec As Integer
Dim min As Integer
Dim hour As Integer
 
' 1초 타이머 (100 x 10ms = 1000ms)
On Timer(1, 100) TIMER1
 
Do
  ' 필요하면 여기서 시간 출력/사용
  ' Print Dec hour, ":", Dec min, ":", Dec sec, Cr
Loop
 
Sub TIMER1()
 
  Incr sec
 
  If sec >= 60 Then
    sec = 0
    Incr min
  End If
 
  If min >= 60 Then
    min = 0
    Incr hour
  End If
 
  If hour >= 24 Then
    hour = 0
  End If
 
End Sub

설명:

  1. TIMER1 ISR이 1초마다 실행됨
  2. sec → min → hour 순으로 증가
  3. 24시간 기준으로 순환 (시계 형태)

확장 팁:

  1. RTC처럼 쓰려면 초기값을 설정하면 됨

(예: hour=12, min=0, sec=0)

  1. Print 출력은 ISR이 아닌 Do~Loop에서 하는 것이 안전함

← CUBLOC2 목차로 돌아가기