View difference between Paste ID: zqPUBxzM and EMdCTEU1
SHOW: | | - or go back to the newest paste.
1
/*
2
 * SimplePotPlay.c
3
 *
4
 * Created: 1/1/2013 3:57:11 PM
5
 *  Author: grist.carrigafoyl
6
 
7-
 Testing reading analog pins.
7+
 Testing reading analog pins. This one works properly.
8
 
9-
 Using the reading to alter the flashing pattern on an LED.
9+
 Using the readings to alter the flashing pattern on an LED.
10-
 Only 8bit for now.
10+
 Using 10 bit resolution.
11
 
12
 */ 
13
14-
#define F_CPU 8000000UL  //  8Mhz
14+
#define F_CPU			8000000UL   //  8Mhz
15-
#define timer_pot MUX0
15+
#define admux_bits		0b00000000  // All default (VCC ref, ADLAR unset)
16-
#define photoresistor MUX1
16+
#define timer_pot		0b00000001  // ADC1 PB2 (pin7)
17
#define photoresistor	0b00000011  // ADC3 PB3 (pin2)
18
19
#include <avr/io.h>
20
#include <util/delay.h>
21
22
23
// Prototypes
24
int main(void);
25
int read_adc(char pin);
26
27
int main(void)
28
{
29-
	DDRB = _BV(PB1); // All input except PB1
29+
30-
	PORTB = _BV(PB0);  // Turn on the internal pullup resistor
30+
31
	DDRB = _BV(PB1); // All input except PB1 (will drive the SSR, is LED for now)
32
	PORTB = _BV(PB0);  // Turn on the internal pullup resistor on the IR detector pin
33-
	// How long the light stays on for. Simple constant multiplied by the pot reading
33+
34
	// ADC settings. Check with datasheet that this is what you want
35-
	//wake_up();
35+
	ADCSRA |= _BV(ADEN) | // Enable ADC
36
	(_BV(ADPS1)) | // set prescaler to 128 (clock/128)
37
	(_BV(ADPS0)) | // 8MHz/128 = 62.5Khz (aiming for 50 - 200)
38
	(_BV(ADPS2));
39
	
40
	// How long the light stays on or off for. Simple constant multiplied by the pot reading
41
	int delay_time = 2; // ms
42
43
    while(1) {
44-
		ambient_light = read_adc(photoresistor);
44+
45
		timer_val = read_adc(timer_pot);
46
		PORTB |= _BV(PB1);  // On
47
		// _delay_ms will only take a constant as its argument or the code won't compile. So
48
		// I'm using a constant time with a for loop around it as a simple multiplier. It's
49
		// not very accurate, but good enough for this purpose.
50
		for (i=0;i<timer_val;i++) {
51
			_delay_ms(delay_time);
52
		}
53
		
54
		ambient_light = read_adc(photoresistor); 
55-
{  // Read the analog value from the ADC input pin.
55+
56-
	// Speculative code based on 	http://avrbasiccode.wikispaces.com/
56+
57-
	// When getting a 10bit value make sure you read the ADCL register before the ADCH register
57+
58-
	// collected_value = (ADCH << 8)|ADCL (representation only, have to get ADCL first as per above)
58+
59
60
    }
61
	return 0;
62-
		ADCSRA |= _BV(ADEN) | // Enable ADC
62+
63-
		(_BV(ADPS1)) | // set prescaler to 128 (clock/128)
63+
64-
		(_BV(ADPS0)) |
64+
65-
		(_BV(ADPS2));
65+
66
{ // Read the analog value from the ADC input pin.
67
	// Code based on samples from http://avrbasiccode.wikispaces.com/
68-
	//ADMUX |= _BV(ADLAR) | // AD result store in (more significant bit in ADCH)
68+
69-
	ADMUX |= _BV(pin); // Chose which AD input to read
69+
70
	// Assumes ADCSRA enabled and prescalars are set already
71
	// Set the input channel and other ADMUX bits
72
	ADMUX = admux_bits | pin;
73-
	// Throw away the first reading.	
73+
74
	// Discard the first reading as it could 
75
	ADCSRA |= _BV(ADSC); // start a single conversion
76
	while (ADCSRA & _BV(ADSC)){} // wait until conversion is done
77-
	ret_val = ADCL; // only the high byte for now. I will want ADCL as well for 10bit
77+
78
	ADCSRA |= _BV(ADSC); // start a single conversion
79-
	ADCSRA &= ~(_BV(ADEN)); // Turn the ADC off
79+
80
	
81
	ret_val = ADCL; // Get ADCL first for 10bit and combine with ADCH 
82
	return((ADCH << 8) | ret_val); 
83
}