BASIC4MCU | 질문게시판 | avr 블루투스, 초음파, LED 설계
페이지 정보
작성자 전과자14학번 작성일2020-06-02 11:43 조회4,080회 댓글1건본문
#include <avr/io.h>
#define F_CPU 8000000UL
#include <stdio.h>
#include <util/delay.h>
#define Trigger1_ON PORTC|=1 //초음파 트리거 PC0
#define Trigger1_OFF PORTC&=~1
#define Trigger2_ON PORTC|=2 //초음파 트리거 PC1
#define Trigger2_OFF PORTC&=~2
#define Echo1 (PINC&0x04) //초음파 에코 PC2
#define Echo2 (PINC&0x08) //초음파 에코 PC3
//
char rx_char(void){ while(!(UCSR0A&0x80)); return UDR0; }
void tx_char(char tx_data){ while(!(UCSR0A&0x20)); UDR0=tx_data; }
//
unsigned int getEcho(char ch){
unsigned int range;
switch(ch){
case 0: Trigger1_ON; _delay_us(10); Trigger1_OFF; break; // 10uS
case 1: Trigger2_ON; _delay_us(10); Trigger2_OFF; break; // 10uS
}
switch(ch){
case 0: while(Echo1==0x00); TCNT1=0x00; TCCR1B=0x02; while(Echo1); break;
case 1: while(Echo2==0x00); TCNT1=0x00; TCCR1B=0x02; while(Echo2); break;
}
TCCR1B=0x08; range=TCNT1/116; // the range in CM
return(range);
}
int main(void){
unsigned int range[2];
char data;
UCSR0A=0x00; UCSR0B=0x98; UCSR0C=0x06;
UBRR0L=103; UBRR0H=0x00;
DDRA=0xFF; // LED PORT
DDRC=0x03; // PC0,PC1 ouput Trigger, PC2,PC3 input Echo
TCCR1B=0x08; // Set timer up in CTC mode
//UCSR0B=0x18; UBRR0L=103; // 9600 baud
while(1){
data=rx_char();
tx_char(data);
range[0]=getEcho(0); _delay_ms(100);
range[1]=getEcho(1); _delay_ms(100);
//
if(data=='1'){
if(range[0]<10||range[1]<10) {PORTA|=0xFF;}
else if (range[0]<20||range[1]<20) {PORTA|=0xFF; _delay_ms(1000); PORTA&=~0xFF;}
else if (range[0]<30||range[1]<30) {PORTA|=0xFF; _delay_ms(1500); PORTA&=~0xFF;}
}
}
}
제가 원하는 동작은 어플리케이션 블루투스 연동시켜서 어플의 1스위치 버튼을 눌렀을때, 초음파센서가 작동하면서 초음파센서 조건이 만족했을때 LED가 작동하는걸로 구상중입니다.
그래서 if문을 저렇게 짜봤어요. 근데 실행 시키니까 어플 1스위치를 눌렀을때만 작동이 되더라구요.. 계속적으로 작동이 되어야하는데 버튼을 누르는 그때만 작동이 됩니다 ㅠㅠ 뭔가 소스에 문제가 있는것 같은데 제 지식으로는 저렇게 if 문을 써야하는게 맞지 않나 싶네요..?
if 문에 세가지 조건 즉 (data=='1' && (range[0]<10 || rang[1]<10)) 이렇게도 쓸 수 있는건가요??
댓글 1
조회수 4,080master님의 댓글
master 작성일
UCSR0B=0x98; 인터럽트 함수가 없이 인터럽트를 이네이블 시키면 심각한 오동작을 하게 됩니다.
UCSR0B=0x18;