PIC 16F877 인터럽트 서비스 루틴 정의(내부 인터럽트)
인터럽트 서비루틴의 정의
1. Timer0 인터럽트
① #int_rtcc
함수명()
{
서비스 프로그램
}
② #int_timer0
함수명()
{
서비스 프로그램
}
2. timer1 인터럽트
① #int_timer1
함수명()
{
서비스 프로그램
}
3. timer2 인터럽트
① #int_timer2
함수명()
{
서비스 프로그램
}
잍터럽트 서비스 루틴의 동작 (셋트)에 관한 명령
1. 인터럽트 허가 명령(활성화 시킴)
형식 ENABLE_INTERRUPTS(lebel)
* lebel 종류
① int_ext - 외부 인터럽트
② int_rtcc 또는 int_timer0 - 타이터0 인터럽트
③ int_timer1 - 타이머1 인터럽트
④ int_timer2 - 타이머2 인터럽트
⑤ global - 모든 인터럽트 허용
2. 인터럽트 중지 명령(금지)
형식 DISABLE_INTERRUPTS(lebel)
* lebel 종류
① int_ext - 외부 인터럽트
② int_rtcc 또는 int_timer0 - 타이머0 인터럽트
③ int_timer1 - 타이머1 인터럽트
④ int_timer2 - 타이머2 인터럽트
인터럽트 카운터 초기 값 세트 명령
① SET_RTCC(value) 또는 SET_TIMER0(value) - 타이머0의 초기 값 세트
- value : 0-255 사이의 값(8bit 타이머)
- 이 명령 이후는 value 값부터 카운터 시작
② SET_TIMER1(value) - 타이머1의 초기 값 세트
- value : 0-65535 사이의 값(16bit 타이머)
- 이 명령 이후는 value 값부터 카운터 시작
③ SET_TIMER2(value) - 타이머2의 초기 값 세트
- value : 0-2555 사이의 값(8bit 타이머)
- 이 명령 이후는 value 값부터 카운터 시작
인터럽트 분주 비 설정 명령
1. 타이머0 인터럽트
형식 SETUP_COMPUTES(rtcc_internal, ps-state)
- rtcc_internal : 내부 클럭 사용
- ps_state : 분주 설정
RTCC_DIV_2 : 2개 입력에 rtcc 1개 증가
RTCC_DIV_4 : 4개 입력에 rtcc 1개 증가
RTCC_DIV_8 : 8개 입력에 rtcc 1개 증가
RTCC_DIV_16 : 16개 입력에 rtcc 1개 증가
RTCC_DIV_32 : 32개 입력에 rtcc 1개 증가
RTCC_DIV_64: 64개 입력에 rtcc 1개 증가
RTCC_DIV_128 : 128개 입력에 rtcc 1개 증가
RTCC_DIV_256 : 256개 입력에 rtcc 1개 증가
2. 타이머1 인터럽트
형식 SETUP_TIMER_1(t1_internal,t1_state)
-t1_state :분주 설정
T1_DIV_BY_1 : 1 대 1로 분주
T1_DIV_BY_2 : 1 대 2로 분주
T1_DIV_BY_4 : 1 대 4로 분주
T1_DIV_BY_8 : 1 대 8로 분주
3. 타이머2 인터럽트
형식 SETUP_TIMER_2(mode, period, postcale)
- 0-255까지 몇번 카운터하면 인터럽트가 발생하도록 할 것 인지를 설정
- 타이머0와 타이머1은 255와 65536을 넘어면 자동으로 인터럽트 발생
- mode : 분주 비 설정
T2_DIV_1 : 1대1로 분주
T2_DIV_4 : 1대2로 분주
T2_DIV_16 : 1대16로 분주
- Period : 카운터 최대값 설정
0-255사이의 값
- postscale : 카운터 횟수 설정
1-15사의 값
예1) SETUP_TIMER_2(T1_DIV_1, 129, 1)
내부 클럭을 사용하여 1: 1분주하여 카운터하고 0-129까지 1회 카운터하면
인터럽트가 발생한다
예2) SETUP_TIMER_2(T1_DIV_4, 255, 2)
내부 클럭을 사용하여 1: 4분하여 카운터하고 0-255까지 2회 카운터하면
인터럽트가 발생한다
인터럽트 사용 방법
1. TIMER0 인터럽트
형식 setup_computers(rtcc_internal, rtcc_div_2); // 내부클럭 사용 , 1대2 분주
set_rtcc(0); // 처음부터 카운시작하면 생략
enable_interrupts(int_rtcc); // timer0 인터럽트 허용
enable_interrupts(global); // global 인터럽트 허용
2. TIMER1 인터럽트
형식 setup_timer_1(t1_internal); // 내부클럭 사용 , 1대1 분주
set_timer1(0); // 처음부터 카운시작하면 생략
enable_interrupts(int_timer1); // timer1 인터럽트 허용
enable_interrupts(global); // global 인터럽트 허용
3. TIMER2 인터럽트
형식 setup_timer_2(t2_div_by_1,255,1); // 내부클럭 사용 , 1대1 분주 하고
0-255까지 1회 카운터하면 인터럽트 발생
set_timer2(0); // 처음부터 카운시작하면 생략
enable_interrupts(int_timer2); // timer2 인터럽트 허용
enable_interrupts(global); // global 인터럽트 허용