본문 바로가기

[ARM]ADC(아날로그 to 디지털)

반응형

#define PIO_ASR (*(volatile unsigned int *) 0xFFFFF470)//주변장치 A 선택

#define PIO_BSR (*(volatile unsigned int *) 0xFFFFF474)//주변장치 B 선택

#define PIO_PDR (*(volatile unsigned int *) 0xFFFFF404)//병렬 입출력 포트로 사용 금지

   

   

#define PIO_SODR (*(volatile unsigned int *) 0xFFFFF430) //출력 

#define PIO_CODR (*(volatile unsigned int *) 0xFFFFF434) //출력 하지 않음

#define PIO_OER  (*(volatile unsigned int *) 0xFFFFF410) //출력버퍼 사용 설정

#define PIO_PER  (*(volatile unsigned int *) 0xFFFFF400) //병렬 입출력 제어 레지스터 병렬 입출력 포트로 사용한다.

#define PIO_PUDR (*(volatile unsigned int *) 0xFFFFF460) //풀업저항 사용하지 않음

   

#define PIO_IFER (*(volatile unsigned int *) 0xFFFFF420) //글리치 필터 사용허가 레지스터

#define PIO_IER (*(volatile unsigned int *) 0xFFFFF440)  //인터럽트 인에이플 레지스터

#define PIO_ISR (*(volatile unsigned int *) 0xFFFFF44C)  //인터럽트 스테이터스 레지스터

#define PIO_ODR (*(volatile unsigned int *) 0xFFFFF414)  //인터럽트 금지 레지스터 

//----------------------------------------------------------------------------------

   

   

   

//----------    전력 제어 설정

   

#define PMC_PCER (*(volatile unsigned int *) 0xFFFFFC10)

   

#define MASTERCLOCK 48000000

   

//---------------------------------------------------------------------------------

   

   

   

//---------   AIC  (인터럽트 ) 설정

   

#define AIC_IDCR (*(volatile unsigned int *) 0xFFFFF124) // 인터럽트 금지 레지스터 

#define AIC_SVR ((volatile unsigned int *) 0xFFFFF080)    //  인터럽트 서비스 루틴 등록

#define AIC_SMR ((volatile unsigned int *) 0xFFFFF000)   //   인터럽트 설정

   

#define AIC_ICCR (*(volatile unsigned int *) 0xFFFFF128) //에지 검출기 클리어

#define AIC_IECR (*(volatile unsigned int *) 0xFFFFF120) // 인터럽트 허용 레지스터

//----------------------------------------------------------------------------------

   

   

 //---------  디버그유닛 레지스터

   

#define DBGU_BRGR (*(volatile unsigned int *) 0xFFFFF220)   //보레이트 설정 레지스터

#define DBGU_MR (*(volatile unsigned int *) 0xFFFFF204)    //모드 레지스터 (모드 설정패리티 설정)

#define DBGU_CR (*(volatile unsigned int *) 0xFFFFF200)    //제어 레지스터 (송수신 설정)

#define DBGU_SR (*(volatile unsigned int *) 0xFFFFF214)    //상태 레지스터 

#define DBGU_THR (*(volatile unsigned int *) 0xFFFFF21C)   // 송신 홀딩 레지스터

#define DBGU_RHR (*(volatile unsigned int *) 0xFFFFF218)   // 수신 홀딩 레지스터

   

//    디버그 유닛 인터럽트 설정

   

#define DBGU_IER (*(volatile unsigned int *) 0xFFFFF208)   // 디버그 유닛 인에이블 

//----------------------------------------------------------------------------------

   

   

//    ADC레지스터 설정

   

#define ADC_CR (*(volatile unsigned int *) 0xFFFD8000)   // ADC제어 레지스터 ADC변환 시작/ADC 내부 하드웨어 리셋처러 리셋 설정  

#define ADC_MR (*(volatile unsigned int *) 0xFFFD8004)   // ADC 모드 제어 레지스터 

#define ADC_CHER (*(volatile unsigned int *) 0xFFFD8010)   // ADC 채널 허용 레지스터

#define ADC_SR (*(volatile unsigned int *) 0xFFFD801C)   //ADC 상태 레지스터 

#define ADC_CDR ((volatile unsigned int *) 0xFFFD8030)  //ADC 채널 데이터 레지스터 

//----------------------------------------------------------------------------------

   

   

   

//---------     사용자 정의 함수

   

void Myitoa(char* pch,int val);    // itoa 함수

   

void Dbug_Init();       //디버그 유닛 사용 설정

   

void Delayms(unsigned int ms);    //딜레이 함수..

   

void DBGU_TX_char(unsigned int data);  //송신 함수

   

void DBGU_TX_String(unsigned char* data);

   

 void ZeroMemory(void* mr,int count,int size);

   

void  DBGU_RX_char(void);     //수신 함수

   

void DBGU_TX_value(unsigned int val);  //숫자 전송 함수

   

void Check_Tx(); //DEBUG CHECK Message

   

//----------------------------------------------------------------------------------

   

   

    

int main(void)

{ 

 unsigned int sum,i;

 unsigned int ADval;

 char val[15];

   

 ADval=0;

   

 PMC_PCER=(unsigned int)1<<2//pioa  사용 함

 PIO_PER=0x0F;

 PIO_PUDR=1<<3;

 PIO_OER=1<<3;

   

   

   

   

 PMC_PCER=(unsigned int)1<<4//ADC  사용 함 

     

 ADC_CR = 0x01//AD리셋

   

 Delayms(50); 

   

 ADC_MR = 0x02020400;   // SHTIM=2 (sample & hold time = 625ns)

   

 // 4.8MHz, 10 bit, software trigger

 ADC_CHER=(unsigned int)0x1<<4;     //CH4 선택

        

   

   

   

      

 Dbug_Init(); //디버그 유닛 사용

   

   

 while(1){ 

  ADval=0;

    Check_Tx();  //Check Data Send 

   Delayms(1000);

   sum = 0;

      for(i=0; i<32; i++)

        {

          ADC_CR=1<<1//ADC 변환 시작

       while(!(ADval&0x10)) // 4 채널 변환 완료 대기

    ADval = ADC_SR; // ADC 상태를 읽어옴

      

    sum += ADC_CDR[4]; // 4 채널 ADC 변환 값 확인

          Delayms(1);

        }

      sum >>= 5

      

   DBGU_TX_value(sum);

   }

        

  return 0;

   

} // End Main....

   

   

   

   

   

//----------------------------------------------------------------------------------------

   

//----------------     함수 원형     -------------------------- 

   

//----------------------------------------------------------------------------------------

   

   

void Delayms(unsigned int ms) //딜레이 함수..

{ 

  volatile unsigned int count, countmax = (MASTERCLOCK / 10000) * ms;

   

  for(count = 0; count < countmax; count++);

}

   

//--------------------------------

   

   

void DBGU_TX_char(unsigned int data)

{

 while(!(DBGU_SR & 0x0002)); //송신 가능 상태이면

 DBGU_THR = data;

   

}

   

//--------------------------------

void DBGU_TX_String(unsigned char* data)

{

 while(*data!=0)

 {   

  while(!(DBGU_SR & 0x0002)); //송신 가능 상태이면

  DBGU_THR = *data;

  data++;

 }

 DBGU_TX_char('\n');

 DBGU_TX_char('\r'); 

}

//--------------------------------

void DBGU_TX_value(unsigned int val)

{

 char data[20];

   

 ZeroMemory(data,20,1); //메모리 초기화 

   

 Myitoa(data,val);

   

 DBGU_TX_String((unsigned char*)data);

}

//--------------------------------

//----------------------------------

void  DBGU_RX_char(void)

{ 

 static int flag=0;

   

 flag ^=0x01;

   

 if(flag)

 PIO_SODR =0x0000000f;

 else

 PIO_CODR =0x0000000f;

   

 DBGU_TX_char(DBGU_RHR);

}

//--------------------------------

   

   

void Dbug_Init()//디버그 유닛 사용 설정

{

 PIO_ASR=(unsigned int)1<<9|(unsigned int)1<<10;//주변 장치 A로 PA9,PA10번 사용

   

 PIO_PDR=(unsigned int)1<<9|(unsigned int)1<<10;//

   

   

 DBGU_MR =0x00000800;// chmode = 정상 모드

          // par= 패리티 사용 하지 않음

            

 DBGU_BRGR = 26;    //보레이트 설정 115200 

          

 DBGU_CR =0x00000150;//송신부 수신부 동작 시작 

   

 DBGU_IER= 0x01//수신 인터럽트 설정

   

 //인터럽트 설정 부분

   

 AIC_IDCR = (unsigned int1 <<1;// PIOA 

   

 AIC_SVR[1= (unsigned int) DBGU_RX_char; // 서비스 루틴 등록

   

 AIC_SMR[1= 0x07//인터럽트 모드 우선순위 설정

   

 AIC_ICCR=(unsigned int1 <<1;// sys 인터럽트 

   

 AIC_IECR = (unsigned int1 <<1;// 인터럽트 허용

}

   

//--------------------------------

   

   

void Myitoa(char* pch,int val)

{

 int count,num,i;

 count =-1;

 num =1;

   

 while(num < val)

 { 

  num *=10;

  count++;

 }

 num /=10;

   

 for(i=0; i<=count; i++)

 {

  pch[i]= (val/num);

  val = val-pch[i]*num;

  pch[i]+=48;

  num/=10;

 }

}

//----------------

void ZeroMemory(void* mr,int count,int size)

{ 

 int num;

 if(size ==1)

 {

  for(num=0; num<count; num++)

  {

   (*(char *)mr) =0;

   ((char *)mr)++;

  }

 }

 else if(size == 4)

 {

  for(num=0; num<count; num++)

  {

   (*(int *)mr) =0;

   ((int *)mr)++;

  }

 }

}

   

//----------------

void Check_Tx()

{ 

  DBGU_TX_char('C');

  DBGU_TX_char('h');

  DBGU_TX_char('e');

  DBGU_TX_char('c');

  DBGU_TX_char('k');

  DBGU_TX_char('\n');

  DBGU_TX_char('\r');

}

반응형

'About 프로그래밍!!! > ARM' 카테고리의 다른 글

[ARM]링크드리스트 하기전에..  (0) 2010.07.14
[ARM]프로젝트(통신)  (0) 2010.07.13
[ARM] ADC  (0) 2010.07.13
[ARM]캐릭터 LCD  (0) 2010.07.09
[ARM] 캐릭터 LCD에 글자쓰기  (0) 2010.07.09
-->