Zápisník experimentátora
Hierarchy: A/D prevodník
V předchozím článku jsme si naprogramovali analogové měření, které neblokovalo Arduino během měření. Konec měření jsme kontrolovali pomocí bitu ADSC
. Konec analogového měření můžeme kontrolovat i pohodlněji pomocí přerušení, které nám Arduino na konci měření zavolá. V tomto článku si ukážeme, jak se to dá naprogramovat.
Pokud používáme proměnné v normálním kódu i v přerušení, musíme je označit jako volatile
, aby kompilátor věděl, že je má při každém použití aktualizovat a má je zapisovat do RAM. Nastavení registrů je podobné jako v předchozím příkladu, pouze přibylo nastavení bitu ADIE
, které zapíná použití přerušení na konci A/D konverze.
Zbytek programu tvoří dvě podmínky, které obsluhují konec A/D konverze, vypisují výsledek na sériový port a zapínají další analogové měření.
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 se nachází na serveru GitHub.
08.10.2018