정말 이해하기 힘들었던 초음파를 오늘은 깨달을 수 있었다.
먼저 분주비에 대한 이해
- 자세한건 파일 첨부.
먼저 분주비에 대한 이해
- 자세한건 파일 첨부.
MCK -> 48*1024*1024
분주비는 총 5개(2, 8, 32, 128, 1024)
카운터 -> MCK/분주비
1Cycle time -> 1/카운터
1Cycle time us(micro sec) -> 1Cycle time*1000000
RC -> 1초/1Cycle time
소리는 온도 24C 기준 1초에 346m까지 감
ultra.c 에 관한 소스
#include "ultra.h"
static unsigned int uiDis; // 초음파와 물체간의 거리 변수,외부에서 접근하지 못하도록 static(c만의 유일한기법)
static unsigned char buf[] = "000Cm\n\r";
void TRG_INIT(void)
{
PIO_PER=(1<<TRG_PIN); //PIO Enable register
PIO_OER=(1<<TRG_PIN); //트리거핀의 출력을 허용
PIO_PUDR=(1<<TRG_PIN); //트러거핀 풀업저항을 오픈시켜 사용금지
PIO_CODR=(1<<TRG_PIN); //트리거핀 클리어, 0으로 출력
}
void ECHO_INIT(void)
{
PMC_PCER=(1<<PIOA); //PID2 클록의 공급을 허용
PIO_ODR=(1<<ECHO_PIN); //에코핀 출력버퍼 금지
PIO_PER=(1<<ECHO_PIN); //에코핀 입출력 허용
PIO_IDR=(1<<ECHO_PIN); //에코핀 인터럽트 금지
AIC_IDCR=(1<<PIOA); //PID2의 인터럽트 금지
AIC_SVR[PIOA]=(unsigned int)ECHO_PIN_ISR; //에코핀 인터럽트 호출
AIC_SMR[PIOA]=(3<<SRCTYPE) | (0<<PRIOR);
AIC_ICCR=(1<<PIOA); // 인터럽트의 에지 검출기를 클리어
PIO_IFER=(1<<ECHO_PIN); // 에코핀의 입력에 글리치 필터를 사용하도록 허용
AIC_ISCR=(1<<PIOA); // 인터럽트 에지 검출기를 세트
//PIO_IER=(1<<ECHO_PIN);
AIC_IECR = (1<<PIOA); //인터럽트 허용
}
void ECHO_PIN_ISR(void)
{
static unsigned int uiState = 0;
if(uiState == 0) //타이머 켜기
{
uiDis = 0; //거리를 0으로
TC_CCR0=1<<CLKEN; //카운터 활성화
TC_CCR0=1<<SWTRG; //트리거해서 카운터 리셋, 클록 공급
//하강엣지 셋팅
AIC_SMR[PIOA]=(1<<SRCTYPE) | (0<<PRIOR); //외부 인터럽트 하강엣지 00
uiState = 1; //타이머 실행 막기위해
}
else
{
TC_CCR0=1<<CLKDIS; // Timer off, 클록공급 금지
buf[0] = ('0'+(uiDis%1000)/100); //100단위
buf[1] = ('0'+(uiDis%100)/10); //10단위
buf[2] = ('0'+(uiDis%10)); // 1단위
//LCD화면에 출력(커서off)
LCD_Inst(LCD_CD); //lcd화면 클리어
LCD_Data('0'+(uiDis%1000)/100);
LCD_Data('0'+(uiDis%100)/10);
LCD_Data('0'+(uiDis%10));
LCD_Data('c');
LCD_Data('m');
Send_String(buf); //buf에 들어인는 문자열 전송
PIO_IDR=(1<<ECHO_PIN); //인터럽트 비활성화
uiState = 0;
}
PIO_ISR; //한번 더 넣으면 지워진다
AIC_EOICR=0; //종료신호로 0 (아무숫자 상관없음)
}
void uTIMER0_INIT(void)
{
PMC_PCER=1<<TC0; // Timer0 Power On
TC_CCR0=1<<CLKDIS; // Timer off
TC_IDR0=0xFF; // Interrupt off
TC_SR; // Status Register Clear
AIC_IDCR=1<<TC0;
AIC_SVR[TC0]=(unsigned int)uTIMER0_ISR;
AIC_SMR[TC0]=(2<<SRCTYPE) | (0<<PRIOR); //외부 인터럽트 상승엣지 10
AIC_ICCR=1<<TC0;
TC_CMR0=(TIMER_CLOCK1<<TCCLKS)|(1<<CPCTRG);
TC_RC0=1455; // 분주비 2 초음파 RC 58ms마다 타미어호출 //인터럽트 발생
TC_IER0=1<<CPCS;
AIC_IECR = 1<<TC0;
//타이머키는 코드
// TC_CCR0=1<<CLKEN; //활성화
// TC_CCR0=1<<SWTRG;
}
void uTIMER0_ISR(void) //초음파 1cm전진
{
++uiDis;
TC_SR;
}
//펄스 ㅅ소는 함수
void ultra_trg()
{
volatile unsigned int uiCnt;
PIO_SODR = 1<<TRG_PIN;
for(uiCnt=0; 1000>uiCnt; ++uiCnt);
PIO_CODR = 1<<TRG_PIN;
AIC_SMR[PIOA]=(3<<SRCTYPE) | (0<<PRIOR); //활성화 하기전에 건다
PIO_IER=(1<<ECHO_PIN);
}
void ultra_init()
{
TRG_INIT();
ECHO_INIT();
uTIMER0_INIT();
}
static unsigned int uiDis; // 초음파와 물체간의 거리 변수,외부에서 접근하지 못하도록 static(c만의 유일한기법)
static unsigned char buf[] = "000Cm\n\r";
void TRG_INIT(void)
{
PIO_PER=(1<<TRG_PIN); //PIO Enable register
PIO_OER=(1<<TRG_PIN); //트리거핀의 출력을 허용
PIO_PUDR=(1<<TRG_PIN); //트러거핀 풀업저항을 오픈시켜 사용금지
PIO_CODR=(1<<TRG_PIN); //트리거핀 클리어, 0으로 출력
}
void ECHO_INIT(void)
{
PMC_PCER=(1<<PIOA); //PID2 클록의 공급을 허용
PIO_ODR=(1<<ECHO_PIN); //에코핀 출력버퍼 금지
PIO_PER=(1<<ECHO_PIN); //에코핀 입출력 허용
PIO_IDR=(1<<ECHO_PIN); //에코핀 인터럽트 금지
AIC_IDCR=(1<<PIOA); //PID2의 인터럽트 금지
AIC_SVR[PIOA]=(unsigned int)ECHO_PIN_ISR; //에코핀 인터럽트 호출
AIC_SMR[PIOA]=(3<<SRCTYPE) | (0<<PRIOR);
AIC_ICCR=(1<<PIOA); // 인터럽트의 에지 검출기를 클리어
PIO_IFER=(1<<ECHO_PIN); // 에코핀의 입력에 글리치 필터를 사용하도록 허용
AIC_ISCR=(1<<PIOA); // 인터럽트 에지 검출기를 세트
//PIO_IER=(1<<ECHO_PIN);
AIC_IECR = (1<<PIOA); //인터럽트 허용
}
void ECHO_PIN_ISR(void)
{
static unsigned int uiState = 0;
if(uiState == 0) //타이머 켜기
{
uiDis = 0; //거리를 0으로
TC_CCR0=1<<CLKEN; //카운터 활성화
TC_CCR0=1<<SWTRG; //트리거해서 카운터 리셋, 클록 공급
//하강엣지 셋팅
AIC_SMR[PIOA]=(1<<SRCTYPE) | (0<<PRIOR); //외부 인터럽트 하강엣지 00
uiState = 1; //타이머 실행 막기위해
}
else
{
TC_CCR0=1<<CLKDIS; // Timer off, 클록공급 금지
buf[0] = ('0'+(uiDis%1000)/100); //100단위
buf[1] = ('0'+(uiDis%100)/10); //10단위
buf[2] = ('0'+(uiDis%10)); // 1단위
//LCD화면에 출력(커서off)
LCD_Inst(LCD_CD); //lcd화면 클리어
LCD_Data('0'+(uiDis%1000)/100);
LCD_Data('0'+(uiDis%100)/10);
LCD_Data('0'+(uiDis%10));
LCD_Data('c');
LCD_Data('m');
Send_String(buf); //buf에 들어인는 문자열 전송
PIO_IDR=(1<<ECHO_PIN); //인터럽트 비활성화
uiState = 0;
}
PIO_ISR; //한번 더 넣으면 지워진다
AIC_EOICR=0; //종료신호로 0 (아무숫자 상관없음)
}
void uTIMER0_INIT(void)
{
PMC_PCER=1<<TC0; // Timer0 Power On
TC_CCR0=1<<CLKDIS; // Timer off
TC_IDR0=0xFF; // Interrupt off
TC_SR; // Status Register Clear
AIC_IDCR=1<<TC0;
AIC_SVR[TC0]=(unsigned int)uTIMER0_ISR;
AIC_SMR[TC0]=(2<<SRCTYPE) | (0<<PRIOR); //외부 인터럽트 상승엣지 10
AIC_ICCR=1<<TC0;
TC_CMR0=(TIMER_CLOCK1<<TCCLKS)|(1<<CPCTRG);
TC_RC0=1455; // 분주비 2 초음파 RC 58ms마다 타미어호출 //인터럽트 발생
TC_IER0=1<<CPCS;
AIC_IECR = 1<<TC0;
//타이머키는 코드
// TC_CCR0=1<<CLKEN; //활성화
// TC_CCR0=1<<SWTRG;
}
void uTIMER0_ISR(void) //초음파 1cm전진
{
++uiDis;
TC_SR;
}
//펄스 ㅅ소는 함수
void ultra_trg()
{
volatile unsigned int uiCnt;
PIO_SODR = 1<<TRG_PIN;
for(uiCnt=0; 1000>uiCnt; ++uiCnt);
PIO_CODR = 1<<TRG_PIN;
AIC_SMR[PIOA]=(3<<SRCTYPE) | (0<<PRIOR); //활성화 하기전에 건다
PIO_IER=(1<<ECHO_PIN);
}
void ultra_init()
{
TRG_INIT();
ECHO_INIT();
uTIMER0_INIT();
}
'디지털회로 > AT91SAM7S256' 카테고리의 다른 글
PWM 제어기 (0) | 2011.09.22 |
---|---|
A/C 컨버터(ADC) (1) | 2011.09.19 |
오늘 바꾼 TIMER / main 외 ULTRA (0) | 2011.09.09 |
타이머카운터 (0) | 2011.09.08 |
AT91SAM7S256 <-> 하이퍼터미널 통신 (0) | 2011.09.07 |