/* cds 이용 led 불켜기 adc07이용*/
#include<avr/io.h>
void LED_init();
void ADC_init();
unsigned int ADConversion(int ch);
int main(void)
{ unsigned int ch_ADC;
LED_init();
ADC_init();
while(1)
{
ch_ADC = ADConversion(7);
if(ch_ADC<300)
PORTC = 0b11111110;
else if(ch_ADC<400)
PORTC = 0b11111011;
else if(ch_ADC<500)
PORTC = 0b11101111;
else if(ch_ADC<600)
PORTC = 0b10111111;
else
PORTC = 0b11111111;
}
return 0;
}
/*ADC 정리요함*/
void LED_init()
{
DDRC =0xFF;
PORTC=0xFF;
}
void ADC_init()
{
ADCSRA = (1<<ADEN)//ADC 동작을 활성화 시킨다 1이면 동작
// |(1<<ADIE)//인터럽트활성화
|(1<<ADPS2)// 프리스케일러(분주비) selecter
|(1<<ADPS1)//프리스케일러(분주비) selecter
|(0<<ADPS0);//프리스케일러(분주비) selecter
ADMUX = (0<<REFS1)//REFERENCE SELECTION BIT ADC변환 비교값을 선택 "00" 외부VREF입력을 비교 기준
|(0<<REFS0);//ADC의 변환 값을 비교 선택하는 비트
// ADCL = (0 <<ADLAR);// 데잍이터 레지스터의 정렬방식 '1'= 왼쪽 '0'=오른쪽
}
unsigned int ADConversion(int ch)
{
ADMUX = ADMUX | ch;
/*(0<<MUX4)// 이득조절
|(0<<MUX3)
|(1<<MUX2)
|(1<<MUX1)
|(1<<MUX0);*/
//CONTROLL &STATUS REGISTER
ADCSRA|= (1<<ADSC);//START CONVERSION 각비 트마다 1이면 AD변환을 시작한다
//변환완료되면 ADSC= 0으로 된다
//|(1<<ADIF);//interrupt flag 인터럽트 플레그 AD 변환이 끝나면 1로설정 된다.
while(!(ADCSRA&(1<<ADIF))); // 신호(인터럽트걸린값) 이 계속오는 동안 밑에 문장실행 while(1)ADCSRA(ADIF=1) 실행
//ADIF 인터럽트가 활성화 되어있는상태에서 AD변환이끝나면 1로 설정 된다
return ADC;//ADCL/H (ADC Data Register)변환된 데이터를 가짐
//(1<<ADFR)//ADC FREE RUNNING SELECT 1이면 프리러닝(연속적인 셈플?
}