#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이면 프리러닝(연속적인 셈플?
}
'ATMEGA' 카테고리의 다른 글
단방향 통신예제 (0) | 2009.12.31 |
---|---|
AT90S2313 (AVR 강의 자료) 파일 (0) | 2009.12.28 |
FND 두자리 동시에 같은숫자표현 (0) | 2009.12.10 |
/*99~0까지 순차적으로 숫자를 1씩 감소하면서 FND에 표시 하기*/ (0) | 2009.12.10 |
1칸?씩 쉬프트시키면서 불켜기 (0) | 2009.12.10 |