สำคัญคือ ค่า ADC จะยังไม่เปลี่ยนแปลงจนกว่าเราจะอ่านค่า ADCH
ดังนี้เพื่อให้ค่าที่ได้ถูกต้อง เราจึงต้องอ่าน ADCL ก่อน ADCH เสมอ
ถ้าอ้างอิง code จากท่าน JENG
ADLAR ค่า default = 0 (10 bit ล่าง)
ซึ่งค่า return ADC; จะได้ค่า 0 - 1023
โดยการ return ADC; สามารถอ่านค่าจาก ADCH,ADCL พร้อมกันในคำสั่งเดียวได้เลยครับ
//analog initial
void analog_initial(void){
//Set ADC prescalar to 128 - 125KHz sample rate @ 16MHz
ADCSRA |= (1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
//Set ADC prescalar to 64 - 125KHz sample rate @ 8MHz
//ADCSRA |= (1<<ADPS2)|(1<<ADPS1);
//ADMUX |= (1<<REFS1); //Set ADC reference to 2.56v
ADMUX |= (1<<REFS0); //Set ADC reference to AVCC
//ADMUX |= (1<<ADLAR); //Left adjust ADC result to allow
//ADCSRA |= (1<<ADFR); //Set ADC to Free-Running Mode
ADCSRA |= (1<<ADEN); //Enable ADC
//ADCSRA |= (1<<ADSC); //Start A2D Conversions
}
//analog read
unsigned int analog_read(unsigned char mux_ch){
ADMUX &= 0b11100000;
ADMUX |= mux_ch; //Select ADC Channel ch must be 0-7
ADCSRA |= (1<<ADSC); //Start Single conversion
while(!(ADCSRA&(1<<ADIF))); //Wait for conversion to complete
ADCSRA |= (1<<ADIF); //Clear ADIF by writing one to it
return ADC;
}