알 수 없는 사용자
2013. 5. 23. 17:34
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
| | |