41 lines
862 B
C++
41 lines
862 B
C++
#include "adc.h"
|
|
|
|
#include <avr/io.h>
|
|
#include <avr/interrupt.h>
|
|
|
|
ISR(ADC_vect)
|
|
{
|
|
uint16_t sample = ADCL;
|
|
sample |= ADCH << 8;
|
|
if(Adc::sampleCallback_) Adc::sampleCallback_(sample, Adc::userData_);
|
|
}
|
|
|
|
Adc::Adc(void (*sampleCallback)(uint16_t sample, void* userData), void* userData, uint8_t input, uint8_t referance)
|
|
{
|
|
userData_ = userData;
|
|
sampleCallback_ = sampleCallback;
|
|
ADCSRA = (1 << ADEN) | (1 << ADIE) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);
|
|
setInput(input);
|
|
setReferance(referance);
|
|
}
|
|
|
|
Adc::~Adc()
|
|
{
|
|
ADCSRA = 0;
|
|
}
|
|
|
|
void Adc::setInput(const uint8_t input)
|
|
{
|
|
ADMUX = (ADMUX & 0b11110000) | (input & 0b00001111);
|
|
}
|
|
|
|
void Adc::setReferance(const uint8_t input)
|
|
{
|
|
ADMUX = (ADMUX & 0b00101111) | ((input & 0b00000100) << 2) | ((input & 0b00000011) << 6);
|
|
}
|
|
|
|
void Adc::aquire()
|
|
{
|
|
ADCSRA |= 1 << ADSC;
|
|
}
|