My Atmega328 board will be used in the robot to detect what is around. For this I will use 8 IR sensors by Sharp: GP2D120 (Bought from sparkfun) To read data from them I use ADC on AVR microcontroller. Here is the code:
And the setup in the robot:
Terminal output looks something like this [8 bit values from each ADC]:
[176] [067] [234] [245] [190] [089] [132]
[161] [067] [230] [230] [191] [106] [121]
And here is the code for ADC:
uint8_t adc_result = 0; int i;
void tim0_init(void) {
TCNT0=0; OCR0A=99; TCCR0A |=(1<<COM0A0)|(1<<WGM01);
}
void tim0_start(void) {
TCCR0B |=(1<<CS01);
}
void tim0_stop(void) {
TCCR0B &=~(1<<CS01); TIMSK0 &=~(1<<OCIE0A);
}
void adc_init() {
ADMUX |= (1<<REFS0)|(1<<ADLAR); ADCSRA |= (1<<ADPS2)|(1<<ADPS0)|(1<<ADATE)|(1<<ADIE)|(1<<ADEN); ADCSRB |= (1<<ADTS1)|(1<<ADTS0);
}
void adc_ch_set(uint8_t ADCchannel) {
ADMUX = (ADMUX & 0xF0) | (ADCchannel & 0x0F); while(!(ADCSRA & (1<<ADIF))); // wait while conversion is performed
}
void adc_start(void) {
ADCSRA |= (1<<ADSC);
} void adc_disable(void) {
ADCSRA &= ~((1<<ADEN)|(1<<ADIE));
}
ISR(ADC_vect) {
TIFR0=(1<<OCF0A);
}
void adc_test() {
adc_init(); tim0_init(); tim0_start(); adc_start(); sei(); while(1) { printf("ADC "); adc_ch_set(0); printf("[%03u]", ADCH); adc_ch_set(1); printf("[%03u]", ADCH); adc_ch_set(2); printf("[%03u]", ADCH); adc_ch_set(3); printf("[%03u]", ADCH); adc_ch_set(4); printf("[%03u]", ADCH); //adc_ch_set(5); //printf("[%u]", ADCH); adc_ch_set(6); printf("[%03u]", ADCH); adc_ch_set(7); printf("[%03u]", ADCH); printf("\r\n"); }
}