BASIC4MCU | 질문게시판 | Atmega128 ADC기능을 활용하여 가변저항에 걸린 전압을 FND에 표시하려고합니다.
페이지 정보
작성자 27315co 작성일2018-06-02 15:31 조회11,149회 댓글2건본문
전체 코드는 아래와 같고 이론대로라면 가변저항의값이 최소일때 FND 에 5000이 표시되야하지만 자꾸 5013 의 숫자가 표시됩니다. 아마 모듈러 연산부분에서 어떤 부분이 잘못된것같은데 어느부분이 잘못된지를 감을 못잡겠어서 질문드립니다.
#include <mega128.h>
#include <delay.h>char fnd[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
char buf[4] = {0};void fnd_on(void)
{
PORTA = 0x01; PORTB = fnd[buf[0]]; delay_ms(1); PORTA=0x00;
PORTA = 0x02; PORTB = fnd[buf[1]]; delay_ms(1); PORTA=0x00;
PORTA = 0x04; PORTB = fnd[buf[2]]; delay_ms(1); PORTA=0x00;
PORTA = 0x08; PORTB = fnd[buf[3]]; delay_ms(1); PORTA=0x00;
}void adc_controll(void)
{
int adc_value1 = 0;
int adc_value2 = 0;
int adc_value3 = 0;
int adc_value4 = 0;
adc_value1 = ((5*ADCW)/1023);
adc_value2 = ((50*ADCW)/1023);
adc_value3 = ((500*ADCW)/1023);
adc_value4 = ((5000*ADCW)/1023);
buf[0] = adc_value1;
buf[1] =(adc_value2%10);
buf[2] =(adc_value3%10);
buf[3] =(adc_value4%10);
}void main(void)
{
DDRA = 0xff;
DDRB = 0xff;
ADCSRA = 1<<ADEN | 1<<ADSC | 1<<ADFR | 1<<ADPS2 | 1<<ADPS1;while (1)
{
fnd_on();
adc_controll();
}
}
댓글 2
조회수 11,149master님의 댓글
master 작성일
int adc_value4 = 0;
부호있는 2바이트 형으로 선언했고
10비트의 ADC값을 넣는데에는 아무런 문제가 없겠죠?
adc_value4 = 5000*ADCW;
10비트 값에 5000을 곱하면 얼마가 될까요?
1023이 최대값이므로 5115000
이런 큰 수가 부호있는 2바이트 크기의 데이터에 저장이 될 수 있을지 생각해보세요
//
adc_value1 = ((5*ADCW)/1023);
이 문장은 괜찮지만
adc_value2 = ((50*ADCW)/1023);
adc_value3 = ((500*ADCW)/1023);
adc_value4 = ((5000*ADCW)/1023);
나머지는 모두 에러납니다.
master님의 댓글
master 작성일
adc_value1 = ((5*ADCW)/1023);
adc_value2 = ((50L*(long)ADCW)/1023);
adc_value3 = ((500L*(long)ADCW)/1023);
adc_value4 = ((5000L*(long)ADCW)/1023);
반드시 정수연산으로 성공해보겠다고 생각한다면
long으로 형변환 한 후에 계산하면 되겠죠