Commit d024b5fc authored by Jan Kasprzak's avatar Jan Kasprzak
Browse files

adc.c: for one pwmled only

parent e207868d
......@@ -4,32 +4,13 @@
#include "lights.h"
#define BATTERY_ADC (N_PWMLEDS + 0)
#define BUTTON_ADC (N_PWMLEDS + 1)
#define ZERO_ADC (N_PWMLEDS + 2)
#define ZERO_ADC 1
//#define NUM_ADCS ZERO_ADC
#define NUM_ADCS 1
struct {
unsigned char read_zero_log : 2;
unsigned char read_drop_log : 2;
unsigned char read_keep_log : 4;
} adc_params[NUM_ADCS] = {
{ 0, 1, PWMLED_ADC_SHIFT }, // pwmled 1
#if 0
{ 0, 1, PWMLED_ADC_SHIFT }, // pwmled 2
{ 0, 1, PWMLED_ADC_SHIFT }, // pwmled 3
{ 0, 1, AMBIENT_ADC_SHIFT }, // ambient
{ 0, 1, 0 }, // battery
{ 0, 1, 0 }, // gain20
{ 0, 1, 0 }, // buttons
#endif
};
volatile static unsigned char current_adc, current_slow_adc;
static uint16_t adc_sum, zero_count, drop_count, read_count, n_reads_log;
static uint16_t adc_sum, read_zero, drop_count, read_count, n_reads_log;
static void setup_mux(unsigned char n)
{
......@@ -72,23 +53,14 @@ void start_next_adc()
#endif
adc_sum = 0;
// we use the last iteration of zero_count to set up the MUX
// to its final destination, hence the "1 +" below:
if (adc_params[current_adc].read_zero_log)
zero_count = 1 + (1 << (adc_params[current_adc].read_zero_log-1));
else
zero_count = 1;
if (adc_params[current_adc].read_drop_log)
drop_count = 1 << (adc_params[current_adc].read_drop_log - 1);
else
drop_count = 0;
read_zero = 0;
drop_count = 1;
read_count = 1 << adc_params[current_adc].read_keep_log;
n_reads_log = adc_params[current_adc].read_keep_log;
read_count = 1 << PWMLED_ADC_SHIFT;
n_reads_log = PWMLED_ADC_SHIFT;
// set up mux, start one-shot conversion
if (zero_count > 1)
if (read_zero)
setup_mux(ZERO_ADC);
else
setup_mux(current_adc);
......@@ -96,6 +68,7 @@ void start_next_adc()
ADCSRA |= _BV(ADSC);
}
#if 0
void timer_start_slow_adcs()
{
if (current_slow_adc > N_PWMLEDS) { // Don't start if in progress
......@@ -105,6 +78,7 @@ void timer_start_slow_adcs()
// TODO: kick the watchdog here
}
}
#endif
/*
* Single synchronous ADC conversion.
......@@ -128,7 +102,6 @@ static uint16_t read_adc_sync()
void init_adc()
{
unsigned char i;
current_slow_adc = NUM_ADCS;
current_adc = 0;
......@@ -170,16 +143,11 @@ static void adc1_gain20_adc(uint16_t adcsum)
ISR(ADC_vect) { // IRQ handler
uint16_t adcval = ADCW;
if (zero_count) {
if (zero_count > 1) {
ADCSRA |= _BV(ADSC);
zero_count--;
return;
} else {
if (read_zero) {
setup_mux(current_adc);
zero_count = 0;
/* fall through */
}
read_zero = 0;
ADCSRA |= _BV(ADSC); // drop this one, start the next
return;
}
if (drop_count) {
......@@ -189,7 +157,7 @@ ISR(ADC_vect) { // IRQ handler
}
if (read_count) {
ADCSRA |= _BV(ADSC);
ADCSRA |= _BV(ADSC); // immediately start the next conversion
adc_sum += adcval;
read_count--;
return;
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment