/* 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;
}
