/* adc1.c
 * Basic usage of the ADC as a comparator 
 */

#include<avr/io.h>
#define COMPARE_VALUE 125
#define sbi(x,y) x |= _BV(y) 
#define cbi(x,y) x &=~_BV(y)

int main(void)
{
    DDRB=0xff; //PORTB as output
    PORTB=0x00;
    DDRA=0x00; //PORTA set as input (since we want to take inputs for the ADC)
    PORTA=0xff; //Enable the pull-ups on PORTA

    ADMUX =_BV(ADLAR); //Enable the Left aligning of the ADC result

    ADCSRA = _BV(ADEN) | _BV(ADPS2) | _BV(ADPS1) | _BV(ADPS0); //Enable the ADC with prescaler=128

    ADCSRA |=_BV(ADSC); //Set the bit to start the conversion
    while(1==1)
    {
        while(ADCSRA &_BV(ADSC)) {} //Waits for ADC conversion to complete

        if(ADCH>=COMPARE_VALUE)
        {
			sbi(PORTB,PB1); //Suppose a motor between PB0 and PB1 with proper buffers
			cbi(PORTB,PB0); // In this case, the motor runs forward
        }
        else if (ADCH<COMPARE_VALUE)
        {
			sbi(PORTB,PB0); //Here the motor runs backward
            cbi(PORTB,PB1);
        }
        ADCSRA |=_BV(ADSC); //Set the bit to start conversion again
    }
    return 0;
}