==================================Outline====================================
Interrupt Code
초음파 센서 SRF05
Timer/Counter
----------------------------------------------------------------------------
Interrupt Code
#include <project.h>
unsigned char DBGU_RX() { while( 0 == (*AT91C_DBGU_CSR & AT91C_US_RXRDY) ); //reciever inactive status holding here
return *AT91C_DBGU_RHR; //Data read from DBGU_RHR register }
void DBGU_TX(char ucData) { while( 0 == (*AT91C_DBGU_CSR & AT91C_US_TXRDY) ); //transmitter inactive status holding here
*AT91C_DBGU_THR = ucData; //put data into THR register
return; }
void DBGU_STR(const char * cpStr) { while( 0 != *cpStr) { DBGU_TX(*cpStr); ++cpStr; } }
void DBGU_Init_Polling() //initiating { *AT91C_PIOA_PDR = AT91C_PA9_DRXD | AT91C_PA10_DTXD; //Turn off other function in PIOA *AT91C_PIOA_ASR = AT91C_PA9_DRXD | AT91C_PA10_DTXD; //DBGU Debug Transmit Data & DBGU Debug Receive Data //*AT91C_DBGU_CR = AT91C_US_RSTRX | AT91C_US_RSTTX; //(DBGU) Reset Transmitter&Reciever *AT91C_DBGU_CR = AT91C_US_RSTTX | AT91C_US_RSTRX; // Reset Receiver and Transmitter *AT91C_DBGU_MR = AT91C_US_CHMODE_NORMAL | AT91C_US_PAR_EVEN; //Normarl mode, Even Parity *AT91C_DBGU_BRGR = DBGU_CD; //CD setting *AT91C_DBGU_CR = AT91C_US_RXEN | AT91C_US_TXEN; //Enable Receiver and Transmitter } void DBGU_Menu() { DBGU_STR("1. LCD Print\n\r"); DBGU_STR("m. Menu Print\n\r"); }
void DBGU_RX_ISR() { //while(*AT91C_DBGU_RHR == 0); switch((*AT91C_DBGU_RHR & 0x000000FF)) { default : DBGU_STR("Wrong Instruction\n\r"); DBGU_Menu(); break; case 'M' : DBGU_Menu(); break; case 'm' : DBGU_Menu(); break; case '1' : LCD_Inst(LCD_INST_CLR); LCD_Print("Hello World"); break; } //RX TX Enable }
void DBGU_Init_ISR() //initiating RX with interrupt { *AT91C_PIOA_PDR = AT91C_PA9_DRXD | AT91C_PA10_DTXD; //Turn off other function in PIOA *AT91C_PIOA_ASR = AT91C_PA9_DRXD | AT91C_PA10_DTXD; //DBGU Debug Transmit Data & DBGU Debug Receive Data //*AT91C_DBGU_CR = AT91C_US_RSTRX | AT91C_US_RSTTX; //(DBGU) Reset Transmitter&Reciever *AT91C_DBGU_CR = AT91C_US_RSTTX | AT91C_US_RSTRX; // Reset Receiver and Transmitter *AT91C_DBGU_MR = AT91C_US_CHMODE_NORMAL | AT91C_US_PAR_EVEN; //Normarl mode, Even Parity *AT91C_DBGU_BRGR = DBGU_CD; //CD setting
*AT91C_AIC_IDCR = 1<<AT91C_ID_SYS; // SYS인터럽트 핀 커맨드 비 활성화 AT91C_AIC_SVR[AT91C_ID_SYS] = (unsigned int)DBGU_RX_ISR; // 핸들러 등록 AT91C_AIC_SMR[AT91C_ID_SYS] = AT91C_AIC_SRCTYPE_POSITIVE_EDGE| AT91C_AIC_PRIOR_LOWEST; // 동작모드 및 우선순위 결정 *AT91C_AIC_ICCR = 1<<AT91C_ID_SYS; // 커맨드 레지스터 클리어 *AT91C_DBGU_IER = AT91C_US_RXRDY; //RXRDY 레지스터 활성화 *AT91C_AIC_IECR = 1<<AT91C_ID_SYS; // SYS 인터럽트 핀 인터럽트 활성화 *AT91C_DBGU_CR = AT91C_US_RXEN | AT91C_US_TXEN; //Enable Receiver and Transmitter
}
void DBGU_Init() { DBGU_Init_ISR(); } |
초음파 센서 SRF05
센서는 센서의 감지 값을 직접 변환하여 사용해야 하지만 센서 모듈은 사용자가 직접 프로그래밍 과정을 거치지 않고 작동 원리를 알지 않아도 사용자가 바로 사용할 수 있도록 제공된다.

//음속 : 340m/s

Timer/Counter
초음파 센서를 작동시키기 위해서는 Timer/Counter와 인터럽트를 사용해야 한다.
ARM의 Timer/Counter에 대해서 배워보자.


Timer/Counter를 사용하기 위해 PMC에서 클럭을 공급해 주어야 한다. TC_CMR을 사용하아 T/C를 조작해야 한다.

카운터가 최대 값에 도달한 후 0으로 떨어질 수도 있지만 숫자가 서서히 감소할 수도 있다.
이를 이용하여 다양한 파형을 만들 수 있다.