Atmega16을 사용하고 있으며 다음과 같이 소스 코드를 간단하게 짜 보았습니다.
그런데 ADC값이 이상하게 나오더라구요~
무엇이 문제인지 좀 알고 싶습니다.
#include <avr/io.h>
#include <util/delay.h>
#include <stdio.h>
void PORT_init(void);
void ADC_init(void);
void UART_init(unsigned int baud);
void UART_Tx(unsigned int data);
unsigned char UART_Rx(void);
void PORT_init(void) // 포트초기화
{
}
void ADC_init(void) // ADC초기화
{
ADMUX=0xC0; // 내부 vref 사용(2.56V), ADC0
ADCSRA=0x87;
}
void UART_init(unsigned int baud)
{
UCSRA=0x00; // Normal 모드
UCSRB=0x18; // TX/RX enable
UCSRC="0x06; // no parity, 1bit stop, 8bit data
UBRRH=(unsigned int)0; //수신속도 Max 1M(bps)설정
UBRRL=(unsigned int)baud; //주파수 16Mhz에서 Max값(Error=0%)
}
void UART_Tx( unsigned int data )
{
while (!(UCSRA & 0x20));
UDR = data;
}
unsigned char UART_Rx( void )
{
while (!(UCSRA & 0x80));
return UDR;
}
void main(void)
{
int adc_val;
int i;
PORT_init();
ADC_init();
UART_init(103);
while(1)
{
adc_val=0;
for(i=0; i<16; i++)
{
ADCSRA |= 0x40;
while((ADCSRA & 0x10) ==0x00);
ADCSRA |= 0x10;
adc_val=adc_val+(ADCL + ADCH*256);
}
adc_val=adc_val/16;
UART_Tx(adc_val);
_delay_ms(1000);
UART_Tx(' ');
}
}
adc_val 은 10bit의 데이터 값이고, UART_Tx의 인수는 8bit 값이라서. 256 이상의 값은 깨질것입니다.
따라서 상위 8bit만 읽어서 처리하시던지..
아니면 UART_Tx를 두번던지시셔서 받아서 처리하시던지 해야합니다.
UART_Tx(adc_val >> 2); // 상위 8bit ADC 값
또는
UART_Tx(adc_val / 0x100); //상위 2bit ADC 값
UART_Tx(adc_val % 0x100); //하위 8bit ADC 값
이렇게 처리하시는 게 바람직하겠습니다.
참고로 8bit ADC 로만 처리하실경우 ADCSRA의 ADLAR비트를 1로 하여 상위 8비트만 읽으면 8bit데이터로 쓰시기 편합니다.