BASIC4MCU | 질문게시판 | atmega129 초음파센서, 블루투스 모듈(HC-06)관련 질문드립니다.
페이지 정보
작성자 루크 작성일2021-06-09 18:05 조회8,099회 댓글2건본문
<<<<<블루투스 모듈 연결하기 전 코드>>>>>
#include
#define F_CPU 16000000UL
#include
#include
#include
#define echo PIND&0x01
#define LF 0x0A
#define CR 0x0D
unsigned int pulse_width=0;
void Init_USART0(unsigned int);
void TxByte(unsigned char);
void TxString(char*);
void trg();
void getEcho();
char TempBuffer[20];
int main(void)
{
DDRC|=0xFF; //LED 출력 설정
DDRD|=(1<<1); //PE1 출력
DDRD&=~(1<<0); //PE0 입력
PORTD&=~((1<<0)|(1<<1));
/****************타이머1 설정(단순 카운터 시작, 정지 반복 루틴)****************/
TCCR1A=0x00; //타이머 카운터 컨트롤 설정 - CTC 모드, 나머지 사용X
TCCR1B=0x08; //CTC모드(카운터 정지)
/****************USART0 설정******************/
Init_USART0(19200);
while (1)
{
trg();
getEcho();
if(pulse_width<=30)PORTC=0x01; //30cm미만일 때
else PORTC=0x02; //그 이상 값
sprintf(TempBuffer, "%d", pulse_width);
TxString(TempBuffer);
TxByte(LF);
TxByte(CR);
_delay_ms(50);
}
}
void trg(){
PORTD|=(1<<1);
_delay_us(10);
PORTD&=~(1<<1);
}
//반사된 신호의 펄스폭을 구하는 함수
void getEcho(){
while(!echo); //high가 될 때까지 대기
TCNT1=0; TCCR1B=0x03; //카운터 시작, 64분주=4us
while(echo); //low가 될 때까지 대기
TCCR1B=0x08; //카운터 정지
pulse_width=TCNT1*4/58; //cm로 변환
}
//USART 초기화 함수
void Init_USART0(unsigned int BaudRate){
unsigned int Tmp;
Tmp=(unsigned int)(F_CPU/((unsigned long)16*BaudRate))-1;
UBRR0H=Tmp/256; //UBRR0의 상위 바이트
UBRR0L=Tmp%256; //UBRR0의 하위 바이트
//데이터 길이:8, 패리티: 사용x, 정지 비트: 1비트
UCSR0A=0x00;
UCSR0B=0x08; //송신은 미사용
UCSR0C=0x06;
}
//1바이트 전송 transmit
void TxByte(unsigned char TxData){
while(!(UCSR0A&0x20)); //IDRE0 비트가 '0'인 동안. 송신 버퍼에 아직 이전 데이터가 남아 있는 동안 기다림
UDR0=TxData; //한 바이트 전송
}
//문장 전송 함수
void TxString(char *Pointer){
while(*Pointer)TxByte(*Pointer++); //NULL문자가 나타날 때까지 한 바이트씩 데이터를 송신한다
}
<<<<<블루투스 모듈 연결한 코드>>>>>
#include
#define F_CPU 16000000UL
#include
#include
#include
#define echo PIND&0x01
#define LF 0x0A
#define CR 0x0D
unsigned int pulse_width=0;
void Init_USART0(unsigned int);
void TxByte(unsigned char);
void TxString(char*);
void trg();
void getEcho();
void uart_ini() { // 시리얼 초기화 함수입니다.
UCSR1A=0; UCSR1B=0x98; UCSR1C=6; UBRR1H=0; UBRR1L=0x67; // 9600 bps, 16MHz 기준
}
char TempBuffer[20];
int main(void)
{
DDRC|=0xFF; //LED 출력 설정
DDRD|=(1<<1); //PE1 출력
DDRD&=~(1<<0); //PE0 입력
PORTD&=~((1<<0)|(1<<1));
/****************타이머1 설정(단순 카운터 시작, 정지 반복 루틴)****************/
TCCR1A=0x00; //타이머 카운터 컨트롤 설정 - CTC 모드, 나머지 사용X
TCCR1B=0x08; //CTC모드(카운터 정지)
/****************USART0 설정******************/
Init_USART0(19200);
uart_ini();
while (1)
{
trg();
getEcho();
if(pulse_width<=30)PORTC=0x01; //30cm미만일 때
else PORTC=0x02; //그 이상 값
UDR1 = pulse_width;
sprintf(TempBuffer, "%d", pulse_width);
TxString(TempBuffer);
TxByte(LF);
TxByte(CR);
_delay_ms(50);
}
}
void trg(){
PORTD|=(1<<1);
_delay_us(10);
PORTD&=~(1<<1);
}
//반사된 신호의 펄스폭을 구하는 함수
void getEcho(){
while(!echo); //high가 될 때까지 대기
TCNT1=0; TCCR1B=0x03; //카운터 시작, 64분주=4us
while(echo); //low가 될 때까지 대기
TCCR1B=0x08; //카운터 정지
pulse_width=TCNT1*4/58; //cm로 변환
}
//USART 초기화 함수
void Init_USART0(unsigned int BaudRate){
unsigned int Tmp;
Tmp=(unsigned int)(F_CPU/((unsigned long)16*BaudRate))-1;
UBRR0H=Tmp/256; //UBRR0의 상위 바이트
UBRR0L=Tmp%256; //UBRR0의 하위 바이트
//데이터 길이:8, 패리티: 사용x, 정지 비트: 1비트
UCSR0A=0x00;
UCSR0B=0x08; //송신은 미사용
UCSR0C=0x06;
}
//1바이트 전송 transmit
void TxByte(unsigned char TxData){
while(!(UCSR0A&0x20)); //IDRE0 비트가 '0'인 동안. 송신 버퍼에 아직 이전 데이터가 남아 있는 동안 기다림
UDR0=TxData; //한 바이트 전송
}
//문장 전송 함수
void TxString(char *Pointer){
while(*Pointer)TxByte(*Pointer++); //NULL문자가 나타날 때까지 한 바이트씩 데이터를 송신한다
}
제가 하고싶은 일은 초음파센서로 측정한 거리에 따라 LED로 나타내고 그 값을 블루투스 모듈로 받으려고합니다.
아직 많이 부족한 학생입니다. 도와주시면 감사하겠습니다!
1. 블루투스 모듈 연결하기 전에는 초음파 센서 값에 따라 LED가 잘 구현되었는데, 블루투스 모듈을 연결하고 코드를 수정했더니 LED가 잘 구현되지 않습니다.
2. 블루투스를 연결해 초음파 센서로 측정한 거리값이 화면에 보이게 하고싶습니다.
댓글 2
조회수 8,099master님의 댓글
master 작성일
UDR1 = pulse_width;
쓸데없는 코드가 들어가있군요
삭제하세요
루크님의 댓글
루크
답변감사합니다.
삭제했습니다!