[당근보드] 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);
}
}
---------------------------------------------------------------------------------------
소스는 조잡하고 여기저기 짜맞추고 제가 짠건 얼마 안됩니다.ㅎㅎ
하지만 모두 이해하고 제 입맛대로 고쳐서 쓴것이지요..
저대로 동작을 하면 아래 동영상처럼 작동이 됩니다.

댓글을 달아 주세요