20140502 - ADC 초기화 실습

ATMega128 2014. 5. 2. 14:40 Posted by Owen.K

ADIF는 한 conversion이 끝나면 변환하게 된다.

• Bit 4 – ADIF: ADC Interrupt Flag

This bit is set when an ADC conversion completes and the data registers are updated.

이 비트가 셋이면 ADC 변환이 완료되었을 때와 데이터레지스터가 업데이트 되었을 때이다.

 

1-1. ADMUX 설정하기.

 

 

 

7 , 6  : 전압 선택 bit // 0 0

* 기본적으로 전압이 vcc5v, gnd-5v 라면 총 10v 인 셈이다. 그러므로 0 5v 로 하기 위해

중간점을 2.5(2.56)v 로 조정해 주기도 한다 ( 1, 1 을 넣음)

 

 

 

5     : 오른쪽 / 왼쪽 정렬  // 오른쪽 0

 

 

4~0 pin 설정

 우리는 single Ended Input 을 활용한다. 그러려면, 입력받는 unsigned char ucCh 는

00111 (0x7)을 넘기지 말아야 한다. 

그걸 막기 위해, ucCh & MASK_MUX 를 설정한다.

 

 

 

 

1-2. ADCSRA 설정하기

 

 

 

 

 

 

7        : 활성화 비트//스위치 같은 기능을 함. 이게 1 이 되어야 작동을 시작한다./ 0

       :             /0

       : FREE mode 의 on / off 설정 /0

4 ,3     : 인터렙트 설정 /0

 

인터렙트 

폴링 

이상이 있을 시, CPU 의 개입이 있음.

CPU가 다른 일을 멀티로 할 수 있다. 

정해진 시각마다 CPU가 개입 함.

CPU의 멀티 기능이 떨어 짐. 

 

ADC_RUN 함수에서 다시 활용된다!!! (뒤에 다시 설명) 

2,1,0    : 주파수 설정 // 0 0 0

 *주파수 설정은 상황과 용도에 맞게 설정해 준다. 작은 일에 많은 주파수를 주는건 낭비다.

 

 

 

unsigned int ADC_Run(void)
{
  ADCSRA   = ADCSRA|(1<<ADSC);
  while(0 == (ADCSRA&(1<<ADIF)));
  return ((ADCH<<8)|ADCL);
}

while 문으로 계속 돌려준단건 일일이 체크하는 '폴링방식'을 채용한것임.

반환값으로 ((ADCH<<8)|ADCL)를 준다.

 

1-3. ETC

void ADC_Init_0CH(void)
{
  ADC_Init(0);
}

unsigned int ADC_Convert(void)
{
  ADC_Init_0CH();

  return ADC_Run();
}

 

1-4.main에서 0000 하이텔/LCD로 보내기!

int main(void)
{
  char cString[] = "0000\n\r";
  unsigned int uiRet;

  USART_Init();
  LCD_Init();

  while(1)
  {
    uiRet = ADC_Convert();

    cString[0= '0' + (uiRet/1000)%10;
    cString[1= '0' + (uiRet/100)%10;
    cString[2= '0' + (uiRet/10)%10;
    cString[3= '0' + (uiRet/1)%10;
    
    USART_Str(cString);

    LCD_Str(cString);


  }

  while(1);
  return 0;
}

 

 

숫자를 넣을 땐, 아스키 코드 추출하는 식으로 보내야 한다.