Zápisník experimentátora
Hierarchy: A/D prevodník
V predchádzajúcom článku sme si naprogramovali analógové meranie, ktoré neblokovalo Arduino počas merania. Koniec merania sme kontrolovali pomocou bitu ADSC. Koniec analógového merania môžeme kontrolovať aj pohodlnejšie pomocou prerušenia, ktoré nám Arduino na konci merania zavolá. V tomto článku si ukážeme, ako sa to dá naprogramovať.

Ak používame premenné v normálnom kóde aj v prerušení, musíme ich označiť ako volatile, aby kompilátor vedel, že ich má pri každom použití aktualizovať a má ich zapisovať do RAM. Nastavenie registrov je podobné ako v predchádzajúcom príklade, iba pribudlo nastavenie bitu ADIE, ktoré zapína použitie prerušenia na konci A/D konverzie.
Zvyšok programu tvoria dve podmienky, ktoré obsluhujú koniec A/D konverzie, vypisujú výsledok na sériový port a zapínajú ďalšie analógové meranie.
const byte adc_pin = A0; // = 14 (pins_arduino.h)
volatile int adc_value;
volatile bool adc_done;
volatile bool adc_busy;
unsigned int something_different = 0;
void setup() {
Serial.begin (115200);
Serial.println("ADC with interrupt");
ADCSRA = bit(ADEN) // Turn ADC on
| bit(ADIE) // Enable interrupt
| bit(ADPS0) | bit(ADPS1) | bit(ADPS2); // Prescaler of 128
ADMUX = bit(REFS0) // AVCC
| ((adc_pin - 14) & 0x07); // Arduino Uno to ADC pin
}
// ADC complete ISR
ISR(ADC_vect) {
adc_value = ADC;
adc_done = true;
adc_busy = false;
}
void loop() {
// Last reading
if (adc_done) {
Serial.print("adc_value=");
Serial.print(adc_value);
Serial.print(", something_different=");
Serial.println(something_different);
delay(500);
adc_done = false;
}
// Start new conversion
if (!adc_busy) {
adc_busy = true;
// start the conversion
bitSet(ADCSRA, ADSC);
}
// Do something
something_different++;
}
Zdrojový kód sa nachádza na serveri GitHub.
24.09.2018