ATMEGA

/* cds 이용 led 불켜기 adc07이용*/

빛나는 미래 2009. 12. 17. 13:44

#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이면 프리러닝(연속적인 셈플?
 }