임베디드 시스템 발표 : 2D LiDAR 제작

- 1 min
#include <avr/io.h>
#define F_CPU 16000000UL
#include<util/delay.h>


void init_uart0(){
	UCSR0B = 0x18;   //송신과 수신 둘다 가능하게 설정
	UCSR0C = 0X06;   //전송데이터 1ㅣ트수 설정 : 8비트
	UBRR0H = 0;      //보드레이트 설정 : 9600
	UBRR0L = 103;    //115200은 8 
}

void putchar0(char c)  //문자 출력
{
	while(!(UCSR0A & (1<<UDRE0)));
	UDR0 = c;
}

void puts0(char* ptr)  //문자열 출력
{
	while(1){
		if(*ptr != 0){
			putchar0(*ptr++);
		}
		else{
			return;
		}
	}
}

char getchar0(){       //문자를 입력받음.
	while(!(UCSR0A & (1<<RXC0)));
	return(UDR0);
}

int main(void)
{
	PORTA = 0x01;  //포토 인터럽터 값 입력 받는 포트 A0
    char value;    //라이다 센싱 distance값
	int count = -1; //각도 측정용 카운트
	int before_state = 0;  //LOW에서 HIGH로 바뀔 때 측정하기위해
	int current_state = 0;  // 이전 상태와 현재 상태 지정
	int degree[15] = {0, 24, 48, 72, 96, 120, 144, 168, 192, 216, 240,  264, 288, 312, 336};
	// 이빨이 총 15개 존재. 15개의 각도에 대하여 거리값을 얻어올 것
        int photo = 0;  //PINA로 읽어온 값을 저장할 것
	//char msg2[] = "distance = "; //안내용 문자열

	init_uart0();   //시리얼 포트 초기화
    while (1) 
    {
		value = getchar0(); //Serial.read()와 같은 역할
		photo = (PINA & 0x01); //포토인터럽터 센싱값 저장
		current_state = photo; //현재 상태 저장
		if( (photo==1) && (before_state = 0)){ //LOW에서 HIGH가 될 때
			if(count<15){
				count++; //한바퀴보다 덜 돌았을 땐 카운트 증가
			}else if(count >= 15){
				count = 0; //한바퀴 이상일때 0으로 초기화
			}
			//puts0(msg2);  //안내메세지 출력
			putchar0(value);  //distance값 출력
			before_state = current_state; //이전 상태 갱신			
		}
		else{
			before_state = current_state; //이전 상태 갱신
		}
		
		
    }
}
comments powered by Disqus
rss facebook twitter github gitlab youtube mail spotify lastfm instagram linkedin google google-plus pinterest medium vimeo stackoverflow reddit quora quora