28. 3. 2013
volatile int adc[8]; // pole pro ukladani vysledku prevodu
volatile int iadc; // index adc inputu
/*
* Inicializace AD prevodniku
*------------------------------------------------------------------------------*/
void ADC_init(void)
{
// reference je z pinu Avcc ([REFS1, REFS0] = [0 , 1]), vstup je ADC6 (MUX3 - MUX0 = 0110)
ADMUX = (1<<REFS0) | 6;
// cislo (0 - 8) odpovida primo cislu vstupu (ad0 - ad8) jelikoz jdou od 0;
// 6 = 0110; nebo jinak ... | (1<<MUX1) | (1<<MUX2)
// zapnuti ADC, a nastveni division factoru na 64
ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (0<<ADPS0);
// ADC chce clock frequency mezi mezi 50 - 200 kHz, ja mam krystal 12 MHz
// … tedy delim 64mi (12Mhz/64 = 187,5 kHz)
}
/*
* Spusteni ADC konverze daneho kanalu
*------------------------------------------------------------------------------*/
void ADC_convert_start(char chan)
{
ADMUX &= ~0x07; // vynuluje posledni 3 bity ADMUX registru (MUX2 - MUX0)
ADMUX |= chan; // nastavi kanal (ADC0 - ADC7)
/* Konverze */
ADCSRA |= (1<<ADSC); // zacatek konverze
}
/*
* obsluha preruseni od ADC (vyvolane po skonceni prevodu)
*------------------------------------------------------------------------------*/
ISR (ADC_vect) // obsluha preruseni (dle zadaneho vektoru preruseni - definovano v iomx8.h)
{
iadc = ADMUX & 0x07; // zjisti cislo kanalu ktery byl preveden
adc[iadc] = ADC; // ulozi vysledek
}