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