BASIC4MCU | 질문게시판 | Atmega128, 초음파센서 ,부저
페이지 정보
작성자 gksl 작성일2019-08-14 20:56 조회9,289회 댓글0건본문
MCU는 Atmega128을 사용하고 초음파센서 HC-SR04를 사용하여 부저를 울리고 싶습니다.
마이크로컨트롤러 책에 있는 예제를 그대로 AVR Studio 로 컴파일 시켰고 핀도 맞게 꼽았는데 오실로스코프를 찍어도 ECHO에서 파형이 출력이 안됩니다ㅜ 소스는 에러는 없지만 맞지 않는 소스인가요? 고수님들 도와주세요ㅠ.ㅠ
TRIG: 출력 PE6
ECHO:입력 PE7
부저 PB4
#include <avr/io.h>
#include <util/delay.h>
#include <stdio.h>
#define F_CPU 16000000UL // 16 MHz#define TRIG 6 //TRIG: 출력 PE6
#define ECHO 7 //ECHO:입력 PE7
#define SOUND_VELOCITY 340UL //소리속도(m/sec)
int main(void)
{
unsigned int distance;
DDRB = 0x10; //피에조 부저: 출력DDRE =((DDRE | (1<<TRIG)) & ~(1<<ECHO)); //TRIG=출력, ECHO=입력
int i;while(1)
{
TCCR1B = 0x03; //Timer.Counter1 클록 4us
PORTE &= ~(1<<TRIG); //TRIG = LOW 상태 유지
_delay_ms(10);PORTE |= (1<<TRIG); //TRIG = HIGH 거리 측정 명령 시작
_delay_ms(10);PORTE &= ~(1<<TRIG); //TRIG = LOW 거리 측정 명령 끝
while(!(PINE & (1<<ECHO))); //ECHO = HIGH 될때까지 대기
TCNT1 = 0x0000; //Timer.Counter1 값 초기화(=0)while(PINE & (1<<ECHO)); //ECHO = LOW 될때까지 대기(측정완료)
TCCR1B = 0x00; //Timer.Counter1 클록 정지
distance = (unsigned int)(SOUND_VELOCITY * (TCNT1 * 4 / 2) / 1000); //거리 = 속도 * 왕복시간 ,단위:(mm)
if(distance < 300) //30cm 이내 접근
{
for(i=0; i<5; i++)
{
PORTB = 0x10; //1ms 동안 ON 상태 유지
_delay_ms(1);PORTB = 0x00; //1ms 동안 OFF 상태 유지
_delay_ms(1);
}
}else if(distance < 600) //60cm 이내 접근
{
for(i=0; i<50; i++) //약 0.1초(= 50 x 2ms)동안 삐~
{
PORTB = 0x10; //1ms 동안 ON 상태 유지
_delay_ms(1);PORTB = 0x00; //1ms 동안 OFF 상태 유지
_delay_ms(1);
}
}else if(distance < 1000) //1m 이내 접근
{
for(i=0; i<250; i++) //약 0.5초(= 250 x 2ms)동안 삐~
{
PORTB = 0x10; //1ms 동안 ON 상태 유지
_delay_ms(1);PORTB = 0x00; //1ms 동안 OFF 상태 유지
_delay_ms(1);
}
_delay_ms(300); //0.3초 동안 묵음
}
else; //1m 이상 , 버저 안울림
}
}
댓글 0
조회수 9,289등록된 댓글이 없습니다.