아하
생활

생활꿀팁

고귀한오랑우탄112
고귀한오랑우탄112

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개의 답변이 있어요!
  • 남다른메추리264
    남다른메추리264
    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된 인터럽트를 해제 하셔야 중복 인터럽트가 가능합니다.