로봇_PROJECT/센서부

가속도 센서 값으로 하이퍼 터미널로 값 출력하기

빛나는 미래 2010. 2. 18. 17:44

가속도 센서 + 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;
 }
}