적외선 센서 두개를 외부 인터럽트에 연결하여 사람이 들어오고 나가는 것을 카운팅 하고 이를 이용하여 화장실의 불을 키는 프로그램을 작성하고 있습니다..
머리속에서 떠오르는 데로 작성하고 프로그램을 실행해보았는데 실행이 되지 않습니다 ㅠㅠ...
뭐가 잘못된건지.. 조언좀 부탁 드리겠습니다..
학교 실습이 어셈블리어로 이루어져 있어서.. 완전 다시시작하는 기분입니다..
도와주세요 ㅠㅠㅠ
ORG 0000H ;*/P1.0 =>LED(전구대신),P1.1 =>스피커 센서 감지 여부)*/
JMP START
;
ORG 0003H ;인터럽트 0(사람수 -카운팅)
JMP MINUS
ORG 0013H ;인터럽트 1(사람수 +카운팅)
JMP PLUS
;
START: MOV SP,#40H
MOV TCON,#00000101B
MOV IE,#10000101B
CLR A ; A는 사람수
JMP $
;
PLUS:
CLR EX0 ; 사람 수(-) 카운팅 무효화(인터럽트0)
CALL DELAY
CALL DELAY
CALL DELAY ; 사람이 들어가는 시간만큼 지연=> +카운팅 하고 - 카운팅 되면 안되기 때문에... NOP가 적으면 DELAY함수 사용!
SETB EX0 ; 사람수 (-) 카운팅 다시 유효화...
INC A ; 사람수 카운팅(+) 완료
SETB P1.1 ; 센서 인식 스피커 감지 ON
CALL DELAY ; 약간 지연해서 소리 사람이 소리 인식할 수 있는 시간 을 범
CLR P1.1 ; 스피커 OFF
JNZ LEDON ; LED ON GOGO
RETI
;
MINUS:
CLR EX1 ; 사람수 + 카운팅 무효화(인터럽트1)
CALL DELAY
CALL DELAY
CALL DELAY ; PLUS함수와 동일
SETB EX1 ; 사람수 + 카운팅 유효롸
DEC A ; 사람수 카운팅(-)
SETB P1.1 ; 스피커 ON
CALL DELAY ; 약간지연
CLR P1.1 ; 스피커 OFF
CALL DELAY ; 마이너스 카운트는 스피커 2번!!!!
SETB P1.1 ; 스피커 ON
CALL DELAY ; 약간지연
CLR P1.1 ; 스피커 OFF
JZ LEDOFF ; R4의 값이 0이면 LEDOFF로 고고
RETI
;
DELAY: MOV R0,#0FFH
DELAY1: MOV R1,#0FFH
DELAY2: MOV R2,#0FFH
DELAY3: NOP
DJNZ R2,DELAY3
DJNZ R1,DELAY2 딜레이는 나중에 실습시 시간 계산하기로 하고 임의값 삽입
DJNZ R0,DELAY1
RET ;
;
LEDOFF:
SETB P1.0 ; LED OFF
RET
LEDON:
CLR P1.0 ; LED ON
RET
END
오늘 가입하고 오늘 답변 다네요.
인터럽트 0, 인터럽트 1이 사람의 들어가고 나가는 것을 체크하는게 아니라는 생각이 드는군요.
다음과 같이 수정하면 어떨까요?
인터럽트 발생순서가 인터럽트 0, 인터럽트 1이면 들어오는것,
인터럽트 1, 인터럽트 0 면 나가는것으로