diff options
author | Keith Packard <keithp@keithp.com> | 2017-12-19 16:56:33 -0800 |
---|---|---|
committer | Keith Packard <keithp@keithp.com> | 2017-12-19 16:56:33 -0800 |
commit | 99299986e194337b05ee81cfb7c4aa1cb9e9a74e (patch) | |
tree | a9b6f336d4ecd7940708b16c2fa7b46ffc049b68 | |
parent | 342132a8869d530b6893bb84becf03cb30490600 (diff) |
altos/attiny: Add ADC implementation
It's primitive, but might serve to read ADC values. Untested.
Signed-off-by: Keith Packard <keithp@keithp.com>
-rw-r--r-- | src/attiny/ao_adc_attiny.c | 48 | ||||
-rw-r--r-- | src/attiny/ao_arch.h | 3 |
2 files changed, 51 insertions, 0 deletions
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 <keithp@keithp.com> + * + * 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 <ao.h> + +/* + * 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_ */ |