===== 타임 인터럽트 ===== 여러 개의 타이머 인터럽트를 동시에 등록할 수 있으며, 각 타이머는 독립적으로 동작합니다. 각 ''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 ---- **동작 특징:** - 각 타이머는 독립적으로 주기 실행됨 - 서로 다른 ISR을 연결 가능 - Non-blocking 방식 (메인 루프와 병행 실행) - 타이머 개수는 최대 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의 목적) ===== 타임 인터럽트를 쓰는 필요한 이유는 다음과 같습니다. * **정확한 시간 보장**: 타임 인터럽트를 사용하면 정해진 시간마다 정확하게 작업을 수행합니다. * **병렬 작업 효과**: 메인 루프에서는 복잡한 계산이나 통신을 처리하고, 배경(Background)에서는 타임 인터럽트가 0.1초마다 센서를 체크하거나 LED를 깜빡이는 등 두 가지 일을 동시에 하는 것처럼 운영할 수 있습니다. * **코드의 간결함**: 메인 루프 안에 "시간이 얼마나 흘렀나?"를 체크하는 복잡한 조건문을 넣을 필요가 없어 코드가 훨씬 읽기 쉬워집니다. ===== 시간 측정 예제 (시/분/초) ===== 타이머 인터럽트를 이용해 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 ---- **설명:** - TIMER1 ISR이 1초마다 실행됨 - sec → min → hour 순으로 증가 - 24시간 기준으로 순환 (시계 형태) ---- **확장 팁:** - RTC처럼 쓰려면 초기값을 설정하면 됨 (예: hour=12, min=0, sec=0) - Print 출력은 ISR이 아닌 Do~Loop에서 하는 것이 안전함 [[..:index|← CUBLOC2 목차로 돌아가기]]