본문 바로가기

디지털회로/AT91SAM7S256

초음파 SRF-05 실행시키기

정말 이해하기 힘들었던 초음파를 오늘은 깨달을 수 있었다.

먼저 분주비에 대한 이해
 - 자세한건 파일 첨부.


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=01000>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