BASIC4MCU | 질문게시판 | atmega128 적외선센서 관련질문입니다.
페이지 정보
작성자 춘배 작성일2023-06-08 22:01 조회1,641회 댓글7건본문
적외선 발광센서 1개와 수광센서 2개를 사용하여 입출력 인원을 세려고합니다.
수광센서 Vcc와 GND는 5V와 GND에 연결하였고 Vout은 포트D의 0번과 1번핀에 연결하였고, 발광센서의 애노드 포트F의 7번에 연결하고 캐소드는 GND에 연결했습니다.
외부인터럽트를 사용할 것이고 코드는 이렇습니다.
.org 0x002
jmp IR0_OVF
.org 0x004
jmp IR1_OVF
외부 인터럽트가 발생하면 각 함수로 점프하며
IR_Init:
out DDRD, r0 ; 포트D를 입력으로
ldi temp,0x03
out PORTD,temp ; 0번과 1번핀을 활성화
ldi temp, 0x80
sts DDRF, temp ; 포트F의 7번핀을 출력으로
sts PORTF, temp ; 7번핀을 활성화
ldi temp, 0x0f;
sts EICRA, temp; ; rising Edge모드로 설정
ldi temp, 0x0A;
out EICRB, temp ; ; Falling Edge모드로 설정
ldi temp, 0x33;
out EIMSK, temp; ; EI4, EI5 Interrupt Mask register만 사용
ret
IR0_OVF:
; PORTD 0번 핀 인터럽트 서비스 루틴
sbic PIND1, 0
rjmp IR0_OVF
inc cnt ; cnt 값 증가
reti ; 인터럽트 반환
IR1_OVF:
; PORTD 1번 핀 인터럽트 서비스 루틴
sbic PIND0, 0
rjmp IR1_OVF
inc cnt ; cnt 값 감소
reti ; 인터럽트 반환
회로나 코드에 어느 부분이 잘못된건지 모르겠어서 질문 드립니다.
댓글 7
조회수 1,641master님의 댓글
master 작성일
ldi temp, 0x33;
out EIMSK, temp; ; EI4, EI5 Interrupt Mask register만 사용
INT0,1,4,5 네개의 인터럽트를 이네이블 시켰는데
0,1만 코드가 작성되어 있습니다.
만약 4,5가 발생한다면 먹통되거나 오동작합니다.
master님의 댓글
master 작성일
IR_Init:
out DDRD, r0 ; 포트D를 입력으로
r0에 0x00이 들어있는 것이 확실 할까요?
다시 체크하시고요
리셋 초기값이 0이므로 없어도 되는 코드입니다.
master님의 댓글
master 작성일
ldi temp,0x03
out PORTD,temp ; 0번과 1번핀을 활성화
풀업저항을 사용한다면
하강엣지 트리거를 사용하는 것이 일반적인데
ldi temp, 0x0f;
sts EICRA, temp; ; rising Edge모드로 설정
어째서 상승엣지 트리거를 사용하고 있을까요?
춘배님의 댓글
춘배
제가알기로 빛을 받고있을때 센서의 값이 0이다가 못받을때, 1을 반환하는것으로 알고있어서 라이징엣지를 사용하려고 햇습니다. 반대일까요??
master님의 댓글
master
내부풀업저항을 사용하면 안되지 않나요?
회로를 알 수가 없으니 직접 판단해보세요
춘배님의 댓글
춘배
풀다운 저항을 사용하게하여
ldi temp,0x00
out PORTD,temp
이렇게 작성하는게 맞을까요???
master님의 댓글
master 작성일
ldi temp, 0x80
sts DDRF, temp ; 포트F의 7번핀을 출력으로
sts PORTF, temp ; 7번핀을 활성화
적외선 발광LED가 HIGH에서 전류가 흐르도록 회로가 구성되어 있는 지도 체크하세요