#include "Ultra.h"
static volatile unsigned int ui_Tic; // 58us 1cm. static volatile unsigned int ui_dist; // Echo Pulse 가 Low 되는순간의 값을 저장. 거리를 게산가능. static volatile unsigned int ui_state; // 현재 초음파 거리를 측정중인지 아닌지. // 측정중이면 1, 측정중이 아니면 0 unsigned char *ULTRA_RUN(void) { static unsigned char uc_dist[] = "---cm";
ui_Tic = 0; // 미리 0cm 로 초기화. ui_dist = 0; // 계속동작중인 ui_Tic 에다가 값을 넣어서. 실제거리를 제려고.
TRG_PULSE_Toggle(); // TRG Toggle
DDRE = 0x00; // PIN에 입력받음.
while( 0 == ((PINE) & (1<<Echo_Pin)) ); // Echo_Pin 의 상승엣지를 발견함. LOW level 0 , HIGH level 1 TIMSK0 = (0<<OCIE0B) | (0<<OCIE0A) | (1<<TOIE0); // 타이머/카운터0 인터럽트 허용. OverFlow 방식.
sei(); // 모든 인터럽트 켜주기. TC 시작 ui_state = 1; // 측정중 숫자넣어놓기. Echo 주파수의 하강엣지 감지 > vector_5 > state = 0 으로 되면서 while( 1 == ui_state ); // 전역변수에 0 이 드러가면 나옴.
U_Timer_Init(); // 타이머 꺼줌. Echo_INT_Init(); // Echo 꺼줌.
cli(); // 모든 인터럽트 꺼주기. 초기화.
uc_dist[0]= '0' + ((ui_dist%1000)/100); // ui_dist의 실제거리를 넣어둠. uc_dist[1]= '0' + ((ui_dist%100)/10); uc_dist[2]= '0' + ((ui_dist%10)); return uc_dist; }
void ULTRA_INIT(void) { Echo_INT_Init(); TRG_init(); U_Timer_Init(); }
void Echo_INT_Init(void) // Low 레벨에서 걸리도록. { EICRB = (EICRB) | (1<<ISC41) | (0<<ISC40); // 하강엣지감지. EIMSK = (1<<Echo_Pin); // Echo_Pin 쓰겠다. return; }
void __vector_5(void) // Ultra 핸들러. { ui_dist = ui_Tic; ui_state = 0; return; }
void U_Timer_Init(void) { TCCR0A = ((0<<WGM00) | (0<<WGM01) | (0<<COM0A0) | (0<<COM0A1) |(0<<COM0B0) |(0<<COM0B1)) ; // 노말모드 TCCR0B = ((0<<CS02) | (1<<CS01) | (0<<CS00) | (0<<WGM02)); // 상승엣지 에서 동작 설정. 8 분주비
TCNT0 = Tic_Start; // 오버플로수 시작값 설정. //TIMSK0 = (1<<OCIE0A); // 타이머/카운터0 인터럽트 허용.
cli(); }
void __vector_23(void) // 타이머핸들러. { ++ui_Tic; // Tic 을 계속 올려줌. TCNT0 = Tic_Start; // 다시 불러줌. return; }
void TRG_init(void) { DDRA = 0xFF; PORTA = 0<<TRG_PIN; // TRG 핀 초기화. return; }
void TRG_PULSE_Toggle(void) { volatile unsigned int ui_Cnt; DDRA = 0xFF;
PORTA = 1<<TRG_PIN; // TRG 핀 출력 for(ui_Cnt=0;ui_Cnt < 1000;++ui_Cnt); // 48 cycle 이상 지연. 0.00001s 4000 cycle 이상 지연.
PORTA = 0<<TRG_PIN; // TRG 핀 입력
return; }
|