From 99299986e194337b05ee81cfb7c4aa1cb9e9a74e Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Tue, 19 Dec 2017 16:56:33 -0800 Subject: [PATCH] altos/attiny: Add ADC implementation It's primitive, but might serve to read ADC values. Untested. Signed-off-by: Keith Packard --- src/attiny/ao_adc_attiny.c | 48 ++++++++++++++++++++++++++++++++++++++ src/attiny/ao_arch.h | 3 +++ 2 files changed, 51 insertions(+) create mode 100644 src/attiny/ao_adc_attiny.c diff --git a/src/attiny/ao_adc_attiny.c b/src/attiny/ao_adc_attiny.c new file mode 100644 index 00000000..3a835d13 --- /dev/null +++ b/src/attiny/ao_adc_attiny.c @@ -0,0 +1,48 @@ +/* + * Copyright © 2017 Keith Packard + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + */ + +#include + +/* + * ATtiny ADC interface + */ + +uint16_t +ao_adc_read(uint8_t mux) +{ + uint8_t low, high; + + /* Set the mux */ + ADMUX = mux; + + /* Start conversion */ + ADCSRA = ((1 << ADEN) | + (1 << ADSC) | + (0 << ADATE) | + (0 << ADIF) | + (0 << ADIE) | + (0 << ADPS2) | + (0 << ADPS1) | + (0 << ADPS0)); + + /* Await conversion complete */ + while ((ADCSRA & (1 << ADSC)) != 0) + ; + + /* Read low first */ + low = ADCL; + high = ADCH; + + return (((uint16_t) high) << 8) | low; +} diff --git a/src/attiny/ao_arch.h b/src/attiny/ao_arch.h index 3a34f417..68f5702d 100644 --- a/src/attiny/ao_arch.h +++ b/src/attiny/ao_arch.h @@ -85,4 +85,7 @@ ao_eeprom_read(uint16_t addr, void *buf, uint16_t len); void ao_eeprom_write(uint16_t addr, void *buf, uint16_t len); +uint16_t +ao_adc_read(uint8_t mux); + #endif /* _AO_ARCH_H_ */ -- 2.30.2