added cleaned up and tested ADC support library

master
Ondřej Hruška 8 years ago
parent 28edebb943
commit eaf8623772
  1. 2
      CMakeLists.txt
  2. 1
      Makefile
  3. 49
      lib/adc.c
  4. 32
      lib/adc.h

@ -13,6 +13,8 @@ set(SOURCE_FILES
lib/nsdelay.h lib/nsdelay.h
lib/spi.c lib/spi.c
lib/spi.h lib/spi.h
lib/adc.c
lib/adc.h
lib/usart.c lib/usart.c
lib/usart.h lib/usart.h
) )

@ -29,6 +29,7 @@ OBJS = $(BINARY).o
OBJS += lib/usart.o OBJS += lib/usart.o
OBJS += lib/iopins.o OBJS += lib/iopins.o
OBJS += lib/spi.o OBJS += lib/spi.o
OBJS += lib/adc.o
# Dirs with header files # Dirs with header files
INCL_DIRS = . lib/ INCL_DIRS = . lib/

@ -0,0 +1,49 @@
#include <avr/io.h>
#include <stdint.h>
#include "calc.h"
#include "adc.h"
/** Initialize the ADC */
void adc_init(enum ADC_Prescaller presc)
{
ADCSRA |= presc; // 128 prescaler -> 125 kHz
ADMUX |= _BV(REFS0); // Voltage reference
sbi(ADCSRA, ADEN); // Enable ADC
}
/** Disable ADC */
void adc_disable(void)
{
cbi(ADCSRA, ADEN);
}
/** Enable ADC */
void adc_enable(void)
{
sbi(ADCSRA, ADEN);
}
static void adc_convert(uint8_t channel)
{
set_low_nibble(ADMUX, channel); // Select channel to sample
sbi(ADMUX, ADLAR); // Align result to left
sbi(ADCSRA, ADSC); // Start conversion
while (bit_is_high(ADCSRA, ADSC)); // Wait for it...
}
/** Sample analog pin with 8-bit precision */
uint8_t adc_read_byte(uint8_t channel)
{
adc_convert(channel);
return ADCH; // The upper 8 bits of ADC result
}
/** Sample analog pin with 10-bit precision */
uint16_t adc_read_word(uint8_t channel)
{
adc_convert(channel);
return ADCW; // The whole ADC word (10 bits)
}

@ -0,0 +1,32 @@
#pragma once
//
// Utilities for build-in A/D converter
//
#include <stdint.h>
enum ADC_Prescaller {
ADC_PRESC_2 = 1,
ADC_PRESC_4 = 2,
ADC_PRESC_8 = 3,
ADC_PRESC_16 = 4,
ADC_PRESC_32 = 5,
ADC_PRESC_64 = 6,
ADC_PRESC_128 = 7,
};
/** Initialize the ADC and enable it */
void adc_init(enum ADC_Prescaller presc);
/** Disable ADC (for power saving) */
void adc_disable(void);
/** Enable (already initialized) ADC */
void adc_enable(void);
/** Sample analog pin with 8-bit precision */
uint8_t adc_read_byte(uint8_t channel);
/** Sample analog pin with 10-bit precision */
uint16_t adc_read_word(uint8_t channel);
Loading…
Cancel
Save