#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; //이전 상태 갱신
}
}
}