생활
Micro controller 코딩 중인데 인터럽트를 중복해서 사용할 수 있나요?
LCD를 사용하여 시계를 만들고 싶습니다.
모드를 변경하는 스위치 1개를 인터럽트에 연결하여 기본 시계모드에서 스위치를 누르면 시간 설정모드로 들어가게 됩니다. 여기서 다시 이 스위치를 누르면 빠져나오게 만들고 싶은데요.
인터럽트가 발생하면
SET_CLOCK:
MOV A, CLOCK_MODE (초기값은 0입니다.)
JNZ A, QUIT_SET
MOV CLOCK_MODE, #1
CALL LN11
MOV A, #83H
CALL LCD_CMD
LOOPPP: JNB P1.3, QUIT_SET
MOV SETT, #00010000B
MOV A, SETT
CALL DISP
MOV A, #84H
CALL LCD_CMD
CALL CUR
JMP LOOPPP
QUIT_SET:
RETI
이런식으로 짜보았는데. 제 생각은 초기에 인터럽트 발생하면 CLOCK_MODE가 1인지 확인하고
1이 아니면 1을 준 후에 LOOPPP 구문으로가서 무한루프로 빠집니다.
인터럽트 루틴 안에서는 같은 인터럽트를 발생시켜도 루틴의 첫 구문으로 되돌아 와서 도는게 아닌것인가요?
55글자 더 채워주세요.
1개의 답변이 있어요!
- SETCLOCK: ;//인터럽트가 발생하면 MOV CLOCKMODE, #1 RETI LOOP: CALL LN11 MOV A, #83H CALL LCDCMD LOOPPP: MOV A, CLOCKMODE ;//초기값은 0입니다. JNZ A, LOOP JNB P1.3, LOOP MOV SETT, #00010000B MOV A, SETT CALL DISP MOV A, #84H CALL LCD_CMD CALL CUR JMP LOOPPP
중복 인터럽트가 가능합니다(인터럽트 루틴 내에서 인터럽트)
다만, 인터럽트에서 RETI 하면 되돌아 갈수있도록 하는이 stack에의해 자동 발생 됩니다. 그러니 중복 인터럽이 걸리면 스텍은 자꾸만 올라가지요.
인터럽트가 발생되면 들어오기 전의 pointer로 stack을 원상 복구 시키는 겁니다.
그리고 mask된 인터럽트를 해제 하셔야 중복 인터럽트가 가능합니다.