ATmega32 ADC mit Interrupt

Dieser ATmega32 Beispielcode betreibt den ADC mit Interrupt nach jeder Konversion.

electroicsplanet home electroicsplanet pagetree Sourcecode Examples electroicsplanet pagetree ATmega32 electroicsplanet pagetree ADC electroicsplanet pagetree Mit Conversion Complete Interrupt

Beschreibung

Der ADC arbeitet im single conversion Mode. Nach jeder Wandlung, wird der ADC Interrupt ausgelöst. Die Interruptroutine startet die nächste Conversion. Während der Wandlung wird das Mainprogramm ausgeführt. Dieses lässt einfach den Ausgang PB1 toggeln. Diese Dumyaktivität zeigt, dass der Controller während der ADC-Wandlung weiterarbeiten kann. PB0 wird in der Interruptroutine gesetzt oder gelöscht, wenn der ADC Wert grösser als 512 ist. Port PB2 zeigt, ob sich der Controller gerade in der Interruptroutine befindet.

#include <avr/io.h>
#include <avr/interrupt.h>

int main(void)
{

    DDRB = 0x07;                      // Setup PB0, PB1 and PB2 as output

    
    ADMUX |= (1<<REFS0)|(1<<MUX2);    // Set Reference to AVCC and input to ADC4
    ADCSRA |= (1<<ADEN)|(1<<ADPS2)    // Enable ADC, set prescaler to 16
             |(1<<ADIE);              // Fadc=Fcpu/prescaler=1000000/16=62.5kHz
                                      // Fadc should be between 50kHz and 200kHz
                                      // Enable ADC conversion complete interrupt

    sei();                            // Set the I-bit in SREG

    ADCSRA |= (1<<ADSC);              // Start the first conversion
    PORTB |= 0x04;                    // Indicate the start of the conversion
  
  
    for(;;)                           // Endless loop;
    {
        PORTB^= 0x02;                 // Toggle PB1

    }                                 // main() will never be left

    return 0;                         // This line will never be executed

}


// Interrupt subroutine for ADC conversion complete interrupt
ISR(ADC_vect)
{
        PORTB &= ~0x04;               // Indicate the end of the conversion

        if(ADC >= 512)                // Compare the conversionresult with 512
            PORTB |= 0x01;            // If larger, set PB0
        else
            PORTB &= ~0x01;           // If smaller, reset PB0

        ADCSRA |= (1<<ADSC);          // Start the next conversion
        PORTB |= 0x04;                // Indicate the start of the conversion
}


Download lauffähiges C-File mit ASCII-Schema: Downloadlink

Signalplots

ADC-Interrupt-1

Gelb: Analoges Eingangssignal PA4
Blau: PB2, Interruptroutinenindikator
Rot: PB1, Dummy toggeln während main() läuft
Grün: PB1, zeigt an, ob der ADC wert grösser als 512 ist

ADC-Interrupt-2

Gelb: Analoges Eingangssignal PA4
Blau: PB2, Interruptroutinenindikator
Rot: PB1, Dummy toggeln während main() läuft
Grün: PB1, zeigt an, ob der ADC wert grösser als 512 ist