본문 바로가기
코스웨어/13년 스마트컨트롤러

초음파센서 소스 - 석주원

by 알 수 없는 사용자 2013. 5. 23.
728x90
반응형

unsigned char *ULTRA_run()
{
  static unsigned char ucDist[] = "---cm";

  uiState = 1;
  uiTic = 0;      // 거리를 시간으로 잰다
  uiDist = 0;

  TRG_pulse();

  while (0 ==((AT91C_BASE_PIOA->PIO_PDSR) & (1 << ECHO_PIN)));  // PIN상태 레지스터->echo핀 상승엣지발견

  /* 타이머 카운터 활성화 */
  AT91C_BASE_TC0->TC_CCR = AT91C_TC_CLKEN;  // Timer Clock Enable
  AT91C_BASE_TC0->TC_CCR = AT91C_TC_SWTRG;  // Software Trigger Command:
                        // the counter is reset and the clock is started
  
  /* 인터럽트 켜줌 */
  AT91C_BASE_PIOA->PIO_IER = 1 << ECHO_PIN;    // 15번핀 interrupt enable  
  AT91C_BASE_AIC->AIC_IECR = 1 << AT91C_ID_PIOA;  // Interrupt Enable Command Register

  uiState = 1;    // 인터럽트가 중간에 호출되므로 다시 1로 세팅해줘야함
  // 하강엣지가 검출되면 루프 종료(인터럽트 서비스 루틴 ULTRA_Handler()에서 종료)
  while(uiState == 1);

  /* 타이머 & 외부 인터럽트 비활성화 */
  UTIMER_init();
  ECHO_init();
  
  /* 백자리부터 추출해서 문자열에 삽입 */
  ucDist[0= ((uiDist%1000)/100)+'0';
  ucDist[1= ((uiDist%100)/10)+'0';
  ucDist[2= (uiDist%10)+'0';
  
  return ucDist;
}

void ECHO_init()
{
  AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_PIOA;    // PIOA에 전원공급
  AT91C_BASE_PIOA->PIO_ODR = 1 << ECHO_PIN;    // PIO 15번 출력 차단 output disable
  AT91C_BASE_PIOA->PIO_PER = 1 << ECHO_PIN;    // PIO 15번 Enable Register
  AT91C_BASE_PIOA->PIO_IDR = 1 << ECHO_PIN;    // 15번핀 interrupt 끄기
  AT91C_BASE_AIC->AIC_IDCR = 1 << AT91C_ID_PIOA;  // Interrupt Disable Command Register
  AT91C_BASE_PIOA->PIO_PPUDR = 1 << ECHO_PIN;    // 풀업저항 OFF : Pin을 Low상태로 유지
  // AIC Source Vector Register : interrupt 처리 함수 주소 저장
  AT91C_BASE_AIC->AIC_SVR[AT91C_ID_PIOA] = (unsigned int)ULTRA_Handler;
                      // 배열의 인덱스 처럼 사용(AIC_SVR을 주소로 define)
                      //(타이머 카운터0번(12)을 인덱스로 이용) 
                      // 인터럽트가 걸리면 Timer_Handler로 이동(PC의 이 주소 대입)

  // Source Mode Register - 우선순위 0으로 설정(최하)|하강 엣지(EXTERNAL:누를 때 입력)
  AT91C_BASE_AIC->AIC_SMR[AT91C_ID_PIOA] = (AT91C_AIC_PRIOR_LOWEST)
                    |(AT91C_AIC_SRCTYPE_EXT_NEGATIVE_EDGE);

  // PIOA의 인터럽트 CLEAR (0으로): 인터럽트 지워줌 P.165
  AT91C_BASE_AIC->AIC_ICCR = 1 << AT91C_ID_PIOA;
  AT91C_BASE_PIOA->PIO_IFER = 1 << ECHO_PIN;  // IO의 핀에 글리치 필터 활성화
  AT91C_BASE_AIC->AIC_ISCR = 1 << AT91C_ID_PIOA;    // 다시 AIC EDGE DETECTER ON
}

int main()
{
  ......
  while(1)
  {
    for (uiCnt = 0; uiCnt < 1000000; uiCnt++);
    LCD_cmd_write(0x80);  // Set DD Ram Address 0x00 : LCD커서 맨 앞으로
    LCD_string(ULTRA_run());
  }
  ......
  return 0;
}

석주원_ultra.zip



728x90