[당근보드] ADC로 cds의 값을 받아 FND에 출력하기.

글 내용

당근보드엔 4개의 FND와 1개의 CDS, 그리고 ATmega32의 PORTA0~PORTA7 까지의 ADC가 있습니다.
당근보드에서의 CDS는 ADC1에 연결되어있습니다. 
오늘은 A/D 컨버터로 CDS의 값을 받아 FND에 뿌려보도록 하겠습니다^^

------------------------------------------------------------------------------------------
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <stdio.h>

#include <carroty/fundamental.h>
#include <carroty/delay.h>
#include <carroty/fnd.h>

unsigned char number_array[16]= { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, };
unsigned char fnd_sel_array[4]= { 0,0,0,0,};

unsigned int adc0;
int n1000, n100, n10, n;

void display_fnd(unsigned char number, unsigned char fnd_select) {
  PORTB= number;
  PORTC= fnd_select;
}

// 입력받은 ADC 값을 FND 출력으로 변환
void adc2fnd(unsigned int value) {
 
//ACD출력의 4자리수를 구함.
 n1000=value/1000;
 n100=(value-(value/1000*1000))/100;
 n10=(value-(value/100*100))/10;
 n=value-(value/10*10);

//ADC 출력의 각 자리수를 FND에 출력함.
 for(int g=0;g<10;g++){
  display_fnd(number_array[n1000], fnd_sel_array[0]); delay_ms(3);
  display_fnd(0x11111111, fnd_sel_array[0]);    delay_us(10);
  display_fnd(number_array[n100], fnd_sel_array[1]);  delay_ms(3);
  display_fnd(0x11111111, fnd_sel_array[1]);    delay_us(10);
  display_fnd(number_array[n10], fnd_sel_array[2]); delay_ms(3);
  display_fnd(0x11111111, fnd_sel_array[2]);    delay_us(10);
  display_fnd(number_array[n], fnd_sel_array[3]);  delay_ms(3);
  display_fnd(0x11111111, fnd_sel_array[3]);    delay_us(10);
 }
}

void adc_init() {
  ADMUX= 0x41;        // ADC1(PA1)핀, AVCC 단자, 단극성 입력
  ADCSRA= 0x8C;       // ADC Enable, ADC Interrupt Enable, 16분주(1MHz)
}

SIGNAL(SIG_ADC) {               // ADC 완료 인터럽트
  unsigned int temp;
  temp =  ADCL;                 // ADCL 먼저 읽기
  temp += (ADCH<<8);
  adc0= temp;
}

void led_init(void) {  // FND에 대한 포트 설정.
  DDRB= 0xFF;
  DDRC= 0xF0;
}

int main(void) {
 number_array[0]=  NUMBER_0;  //각 배열값에 FND에 표시될 수를 입력.
 number_array[1]=  NUMBER_1;
 number_array[2]=  NUMBER_2;
 number_array[3]=  NUMBER_3;
 number_array[4]=  NUMBER_4;
 number_array[5]=  NUMBER_5;
 number_array[6]=  NUMBER_6;
 number_array[7]=  NUMBER_7;
 number_array[8]=  NUMBER_8;
 number_array[9]=  NUMBER_9;
 
 fnd_sel_array[0]= FND_SEL_1;
 fnd_sel_array[1]= FND_SEL_2;
 fnd_sel_array[2]= FND_SEL_3;
 fnd_sel_array[3]= FND_SEL_4;

 led_init();           // FND 초기화
 adc_init();        // ADC 초기화
 sei();            // 글로벌 인터럽트 허용

  while(true) {

    ADMUX= 0x41; //외부의 AVCC단자로 입력된 전압 사용, ADC1 단극성 입력.
    ADCSRA |= 0x40;  // ADC1 시작

    adc2fnd(adc0); // adc 값 출력
 delay_ms(1);
  }
}
---------------------------------------------------------------------------------------

소스는 조잡하고 여기저기 짜맞추고 제가 짠건 얼마 안됩니다.ㅎㅎ
하지만 모두 이해하고 제 입맛대로 고쳐서 쓴것이지요..

저대로 동작을 하면 아래 동영상처럼 작동이 됩니다.



cds에서 감지된 아날로그값을 adc해서 나온 10비트값을 10진수로 FND에 나타냅니다.
cds를 가리면 수치가 낮아지고 빛을 비추면 값이 높아지지요..