728x90
반응형
ADMUX : 기준전압설정, ADC0~7 까지 사용할 핀 설정
ADCSRA : ADC Enable, ADC 시작 설정, PRESCALER 값 설정
ADCH/ADCL(데이터 레지스터): 총 16비트 이지만 실제는 10비트만 사용한다.
<ADC 타이밍도>
ADMUX설명
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초에 클럭 발생수
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)
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;
}
{
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 의 불이 켜진다.
{
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
'코스웨어 > 10년 스마트폰BSP' 카테고리의 다른 글
[BSP]업무일지-강혜정-20100810 (1) | 2010.08.10 |
---|---|
[BSP]업무일지 - 송동규 -20100809 (0) | 2010.08.09 |
[BSP]업무일지 - 서동준 -20100806 (1) | 2010.08.08 |
[BSP]업무일지 - 김강수 -20100806 (2) | 2010.08.06 |
[BSP]2010 08/03 업무일지- 이도헌 (0) | 2010.08.03 |
[BSP]업무 일지 정홍환 0802 (0) | 2010.08.02 |
[BSP]업무일지 - 임종현 -20100730 (0) | 2010.08.02 |
[BSP]업무일지-전현수-20100729 (0) | 2010.07.29 |