#ifndef __ADC_ARCH_H__ #define __ADC_ARCH_H__ #include /* * Reference voltage * The default is 1.6V reference voltage * The selected reference voltage is the maximum voltage that can be * measured. * Directly provide shifted variants so we don't need to shift. */ #define ADC_1_5 (2<<6) #define ADC_1_6 (3<<6) #define ADC_1_8 (1<<6) #define ADC_EXTERNAL (0<<6) #define ADC_DEFAULT ADC_1_6 /* sometimes it's desirable to decouple setup / finish from sampling */ static inline void adc_setup (uint8_t ref_volt, uint8_t pin) { ADMUX = ref_volt | (pin & 0x7); ADCSRA = _BV(ADEN) | _BV(ADPS0) | _BV(ADPS2); } static inline int adc_read (void) { ADCSRA |= (1 << ADSC); loop_until_bit_is_clear (ADCSRA, ADSC); return ADC; } static inline void adc_fin (void) { ADCSRA = 0; ADMUX = 0; } static inline void adc_init (void) { uint8_t temp; ADCSRC = 0; ADCSRB = 0; adc_fin (); /* * Disable JTAG interface * Hardware manual about JTD bit: * "In order to avoid unintentional disabling or enabling of the * JTAG interface, a timed sequence must be followed when changing * this bit: The application software must write this bit to the * desired value twice within four cycles to change its value." * 15.4.1 "MCUCR - MCU Control Register", p. 219 */ temp = MCUCR | (1 << JTD); MCUCR = temp; MCUCR = temp; } int readADC(uint8_t pin); long readVcc(); int readInternalTemp(void); void analogReference(uint8_t mode); #endif /* __ADC_ARCH_H__ */