여러 개의 타이머 인터럽트를 동시에 등록할 수 있으며, 각 타이머는 독립적으로 동작합니다.
각 timerId는 고유해야 하며, 동일한 번호를 재사용하면 기존 설정이 덮어쓰기 됩니다.
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
동작 특징:
주의:
- ISR 내부에서는 반드시 짧고 빠르게 실행되도록 작성하십시오. (Delay,Wait,시리얼 송신명령 사용금지, 무한루프 금지, 블록킹 금지)
- ISR 실행 시간이 길면 동일 타이머의 다음 인터럽트는 지연되거나 무시될 수 있습니다.
- 여러 ISR이 동시에 발생할 경우 실행 순서는 보장되지 않습니다.
특정 상황에서 타이머 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 내부의 실제 처리만 선택적으로 실행하거나 건너뛰는 방식입니다.
타임 인터럽트를 쓰는 필요한 이유는 다음과 같습니다.
타이머 인터럽트를 이용해 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
설명:
확장 팁:
(예: hour=12, min=0, sec=0)