BASIC4MCU | 질문게시판 | Atmega128 LED제어 포텐셔미터 활용 질문입니다.
페이지 정보
작성자 life 작성일2022-11-30 12:45 조회1,656회 댓글3건본문
책을 보고 문제에 맞게끔 작성하였는데 엉뚱하게 작동됩니다. 도와주세요.아래는 문제고 그 아래는 제작 작성한 코드입니다.7-Segment와 포텐셔미터를 사용하며, 포텐셔미터의 위치에 따라 7-Segment에 0부터 99까지의 숫자가 나타난다.즉, 포텐셔미터의 ADC 값이 최대이면 7-Segment에 숫자 99가 출력되고 포텐셔미터의 ADC값이 최소이면 7-Segment에 숫자 0이 출력 되는 프로그램을 작성해보세요.#include <avr/io.h>
void Init_io(void){DDRA = 0xFF;PORTA = 0xFF;}
int Init_adc(void){ADCSRA |= (1<<ADEN)ADCSRA |= (1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);}
double Fn_ADC_get(unsigned char ch, unsigned int cnt){unsigned int i, AdcData = 0;double dAdcData;
ADMUX |= ch;
for(i = 0 ; i < cnt ; i++){ADCDRA |=(1<<ADSC);while(! (ADCSRA & 0x10));AdcData += ADC;}dAdcData = AdcData / cnt;return dAdcData;}
int main(void){Init_io();Init_adc();int vadc;int i, tmp;
while(1){vadc = Fn_ADC_get(0,10) / 114;tmp = 1;for(i = 1 ; i <= vadc ; i++) tmp = 2 * tmp;PORTA = tmp - 1;}}
댓글 3
조회수 1,656master님의 댓글
master 작성일
ADMUX |= ch;
원칙적으로 이 명령을 사용하면 안됩니다.
이 전의 채널을 삭제하고 난 후에 새로운 채널을 OR 시켜야겠죠
ADMUX =(ADMUX &0xE0) | ch;
//
while(!(ADCSRA&0x10));
ADCSRA|=0x10; // clear bit4
비트를 clear 시켜주지 않으면 제대로 변환이 안된 상태에서 값을 읽어오게 됩니다.
master님의 댓글
master 작성일
vadc = Fn_ADC_get(0,10) / 114;
1023/114=8.973684210526316 이므로
vadc에는 0~8까지 들어가게 됩니다.
master님의 댓글
master 작성일
#include <avr/io.h>
void Init_io(void){
DDRA = 0xFF;
PORTA = 0xFF;
}
int Init_adc(void){
ADCSRA |= (1<<ADEN)
ADCSRA |= (1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
}
double Fn_ADC_get(unsigned char ch, unsigned int cnt){
unsigned int i, AdcData = 0;
double dAdcData;
ADMUX |= ch;
for(i = 0 ; i < cnt ; i++){
ADCDRA |=(1<<ADSC);
while(!(ADCSRA&0x10));
ADCSRA|=0x10; // clear bit4
AdcData+=ADC;
}
dAdcData = AdcData / cnt;
return dAdcData;
}
int main(void){
int i,vadc;
Init_io();
Init_adc();
while(1){
vadc = Fn_ADC_get(0,10);
vadc = (float)vadc*100.0/1024.0; // 0~1023 => 0~99
PORTA = (vadc/10)|(vadc%10);
}
}