가속도 센서 값으로 하이퍼 터미널로 값 출력하기
가속도 센서 + ADC + DBGU
//---------------------전력제어 설정-------------------------------------------
#define PMC_SCER (*(volatile unsigned int *) 0xFFFFFC00)//시스템 클록 허용 레지스터
#define PMC_PCER (*(volatile unsigned int *) 0xFFFFFC10)// 주변장치 클록 허용 레지스터
//----ADC-------------------------------------------------------------
#define ADC_CR (*(volatile unsigned int *) 0xFFFD8000)
#define ADC_MR (*(volatile unsigned int *) 0xFFFD8004)
#define ADC_SR (*(volatile unsigned int *) 0xFFFD801C)
#define ADC_CDR4 (*(volatile unsigned int *) 0xFFFD8040)
#define ADC_CDR5 (*(volatile unsigned int *) 0xFFFD8044)
#define ADC_CHER (*(volatile unsigned int *) 0xFFFD8010)
//-------------DBGU----------------------------------------------------
//-----------디버그 유닛----------------------------------------------
#define DBGU_MR (*(volatile unsigned int*) 0xFFFFF204)
#define DBGU_BRGR (*(volatile unsigned int*) 0xFFFFF220) // BAUD RATE GENERRATOR REGISTER.
#define DBGU_CR (*(volatile unsigned int*) 0xFFFFF200) // CONTROLL REGISTER
#define DBGU_THR (*(volatile unsigned int*) 0xFFFFF21C)
#define DBGU_SR (*(volatile unsigned int*) 0xFFFFF214)
//-----------입출력 제어 PIO-------------------------------------------------
#define PIO_ASR (*(volatile unsigned int *) 0xFFFFF470)
#define PIO_BSR (*(volatile unsigned int *) 0xFFFFF474)
#define PIO_PDR (*(volatile unsigned int *) 0xFFFFF404)
#define MASTERCLOCK 48000000
float sum[10];
int i,j;
void Delay_ms(unsigned int ms) //딜레이 함수..
{
volatile unsigned int count, countmax = (MASTERCLOCK / 10000) * ms;
for(count = 0; count < countmax; count++);
}
void DBGU_TX_char(unsigned char data)
{
// while(!(*AT91C_DBGU_CSR & 0x0002));
// *AT91C_DBGU_THR = data;
while(!(DBGU_SR &0x0002));
DBGU_THR = data;
}
void num_order(void)//낮은수부터 높은수 까지 정렬
{
int temp;
for(i=0;i<10;i++)
for(j=0;j<10;j++)
{
if(sum[i]>sum[j]);
{
temp=sum[j];
sum[j]=sum[i];
sum[i]=temp;
}
}
}
int main(void)
{
unsigned int num=10000000;
unsigned char ch[10];
unsigned int total=0,gsenser;
// MCU_initialize();
// AT91F_DBGU_CfgPMC();
PMC_PCER = 1<<1;
// AT91F_DBGU_CfgPIO();
PIO_ASR = 1<<10|1<<9;
PIO_PDR = 1<<9|1<<10;
// *AT91C_DBGU_MR=0x00000800;
DBGU_MR = 0x800;//페리티 사용불가
// *AT91C_DBGU_BRGR = 26;
DBGU_BRGR = 26;
// *AT91C_DBGU_CR = 0x00000150;//수신부동작허용,송신부동작허용,송신부즉시리셋 동작금지
DBGU_CR = 0x150;
// AT91F_ADC_CfgPMC();
PMC_PCER = 1<<5;
// AT91F_ADC_SoftReset(AT91C_BASE_ADC);//무효
ADC_CR = 0x1<<0;
//*AT91C_ADC_MR = 0x02020400;
ADC_MR = 0x02020400;//클록주파수=mck/((prescal+1)*2),기동시간,샘플/홀드 시간
//AT91F_ADC_EnableChannel(AT91C_BASE_ADC, AT91C_ADC_CH5);
ADC_CHER = 0x1<<5;// 5번채널까지 허용
while(1)
{
num=1000000;
for(i = 0; i<10 ; i++)
{
// AT91F_ADC_StartConversion(AT91C_BASE_ADC);
ADC_CR = 0x1<<1;//ADC변환시작
//while(!(AT91F_ADC_GetStatus(AT91C_BASE_ADC)&AT91C_ADC_EOC4));
//while(!(ADC_SR&(1<<4))//
//sum[i] = AT91F_ADC_GetConvertedDataCH5(AT91C_BASE_ADC);
sum[i] = ADC_CDR5;//5번채널사용
Delay_ms(10);
}
num_order();
for(i=2;i<8;i++)//튀는값 버림
{
total +=sum[i];
}
gsenser=(total/6);//추출한 6개의 합의 평균
for(i=0;i<7;i++)
{
ch[i]= (gsenser%(10*num)-gsenser%num)/num + 48;
num/=10;
DBGU_TX_char(ch[i]);
}
DBGU_TX_char('\r');
DBGU_TX_char('\n');
Delay_ms(10);
total=0;
}
}