A/D převodník - Měření pomocí přerušení

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.

Příklad

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

Zdrojový kód se nachází na serveru GitHub.


08.10.2018


Menu