본문 바로가기
코스웨어/10년 스마트폰BSP

[BSP]업무일지 - 김병찬 -20100804

by 알 수 없는 사용자 2010. 8. 4.
728x90
반응형


ADMUX : 기준전압설정, ADC0~7 까지 사용할 핀 설정
ADCSRA : ADC Enable, ADC 시작 설정, PRESCALER 값 설정
ADCH/ADCL(데이터 레지스터):  총 16비트 이지만 실제는 10비트만 사용한다.


<ADC 타이밍도>





ADMUX설명
 

우리가 사용하려했던건 AREF 이다(내부전압을 끄고 외부전압을 사용) REFS1 과 REFS0
즉 6번비트와 7번비트를 0 으로 설정한다.
ADLAR 은  데이터 레지스터에서 High 와 Low 의 정렬 상태를 설정하는것이다.
데이터를 읽을때는 ADCL 부터 읽고 그다음  ADCH 를 읽는다.
(밑의 표 참고)




ADCSRA 설명


7번 비트의 ADEN를 1로 설정하면  ADC 변환 Enable(허용)
6번 비트의 ADSC를 1로 설정하면 ADC 변환 시작
5번 비트의 ADIF 가 0이면 변환중이기 때문에 값을 읽으면 안되고 1이면 변환이 완료되었다는 것이다.
0번 1번 2번은 Prescaler 의 값을 설정해주는것이다.


프로그램 소스파일
/*
1초에 클럭 발생수
ZigbeX F_CPU = 7372800
dk-128 F_CPU = 16000000
*/
 
#define DDRA (*(volatile unsigned char *)0x3A)
#define PORTA (*(volatile unsigned char *)0x3B)
#define DDRE (*(volatile unsigned char *)0x22)
#define PORTE (*(volatile unsigned char *)0x23)
#define DDRF (*(volatile unsigned char *)0x61)
#define PORTF (*(volatile unsigned char *)0x62)
#define ADMUX (*(volatile unsigned char *)0x27)
#define ADCSRA (*(volatile unsigned char *)0x26)
#define ADCL (*(volatile unsigned int *)0x24)
#define ADCH (*(volatile unsigned int *)0x25)


void ADC_Init(void)//ADC초기화 부분
{
 ADMUX = 0b00000000; //외부전압을 사용하기위해 6번7번비트를 0으로 설정
 ADCSRA = 0b10000111;//ADC Enable 위해 7번비트 1로 설정
}
unsigned int ADConversion(char i)//ADC 변환하기위한 부분
{
 ADMUX = ADMUX | i;
 ADCSRA = ADCSRA | 1<<6;//ADC start 하기 위해 6번비트 1로 설정 (0b10000111) 
 
 while(!(ADCSRA & (1<<4)))//ADCSRA 의 4번째 비트가 1일때 까지 반복
 {
 }
/*위의 while 반복문을 이와같이 쓸수도있다.
while(1)
{
   if(ADCSRA & (1<<4))
      {
         break;
      }
}*/
 return ADCL + (ADCH<<8);
 
}
int main(void)
{
 
 DDRA=0b00000111;//led 초기화
 PORTA=0b00000111;//led초기화
 
 unsigned int val;
  
 DDRE = DDRE | 1<<4;//출력으로하겠다
 PORTE = PORTE | 1<<4;// INT01 이됨..PORTE의 4번핀을 1로 설정(전압사용)
 DDRF = 0x00; //ADC0 는 PF0 이다.
 
 ADC_Init();
 
 while(1)
 {
  val = ADConversion(0);
  
  if(val<=100)
  {
   PORTA = 1<<1 | 1<<0;// 1<<1 | 1<<2; // 첫번째 LED(Red) 켬
  }
  else if(val<=500)
  {
   PORTA = 1<<0 | 1<<2; //두번째 LED(Green) 켬
  }
  else
  {
   PORTA = 1<<1 | 1<<2;//1<<1 | 1<<0; //세번째 LED(Yellow) 켬
  }
  
 }
 return 0;
}

위의 소스를 실행해보면,
빛의 밝기에 따라 각 각의  값에 해당하는 LED 의 불이 켜진다. 
저작자 표시
728x90