/* -----------------------------------------------------------------------
 * Title:    sound sensor
 * Author:   Alexander Weber
 * Date:     19.05.2007
 * Hardware: ATmega8
 * Software: WinAVR 20060421
 * 
 */

#include <inttypes.h>
#include <avr/io.h>
#include <util/delay.h>

#define LED_BIT PD4

/*
 * get_adc
 * Return the 10bit value of the selected adc channel.
 */
uint16_t get_adc() {

	uint16_t value;

	// warm up the ADC, discard the first conversion
	ADCSRA |= (1 << ADSC);
	while (ADCSRA & (1 << ADSC)); 
	value = ADCW;
	
	ADCSRA |= (1 << ADSC);				// start single conversion
	while (ADCSRA & (1 << ADSC)); 		// wait until conversion is done

	return ADCW;
}

int main(void) {

	uint8_t i = 0;
	
	DDRD |= 0x1c;	// PD2-PD3: col 6-7, PD4: debug LED

	// select channel
	ADMUX = 5;

	// ADC setup
	ADCSRA = 
		(1 << ADEN) |						// enable ADC
		(1 << ADPS1) | (1 << ADPS0);		// set prescaler to 8	
			
	// say hello	
	for (i = 0; i < 5; i++) {
		PORTD |= (1 << LED_BIT);
		_delay_ms(10);
		_delay_ms(10);
		_delay_ms(10);
		_delay_ms(10);
		_delay_ms(10);
		PORTD &= ~(1 << LED_BIT);
		_delay_ms(10);
		_delay_ms(10);
		_delay_ms(10);
		_delay_ms(10);
		_delay_ms(10);
	}
	_delay_ms(10);
	_delay_ms(10);


	while (1) {
		
		if (get_adc() > 180) {
			PORTD |= (1 << LED_BIT);
			_delay_ms(10);
			PORTD &= ~(1 << LED_BIT);
		}			
		
	}

	return 0;

}


