ATega8 ADC Free Running mit Interrupt

Mit diesem Code kann der ADC des ATmega8 im Free Running Mode mit Interrupt laufen gelassen werden.

electroicsplanet home electroicsplanet pagetree Sourcecode Examples electroicsplanet pagetree ATmega8 electroicsplanet pagetree ADC electroicsplanet pagetree Free Running mit Interrupt

Beschreibung

Dieses Codebeispiel lässt den ATmega8 im Free Running Mode mit Interrupt laufen. Am Eingang ADC0 (PC0) wird eine Analogspannung vom ADC eingelesen. Ist diese grösser als 512 (Hälfte von 10Bit) wird der Digitalausgang, wird der Ausgang PB0 gesetzt. Der ADC läuft im Free Running Mode. Jedes mal wenn eine ADC Wandlung abgeschlossen ist, wird ein Interrupt ausgelöst. Dies wird durch ein Toggeln von BP1 angezeigt. Im Free Running Mode startet die nächste Wandlung jeweils automatisch.

Buchtippp:


AVR Mikrocontroller
Programmierung in C

C Sourcecode


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

int main(void)
{

    DDRB = 0x03;                      // Set PB0 and PB1 as output

    
    ADMUX = (1<<REFS0);               // Set Reference to AVCC and input to ADC0
    ADCSRA = (1<<ADFR)|(1<<ADEN)      // Enable ADC, set prescaler to 16
            |(1<<ADPS2)|(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
    
    for(;;);                          // Endless loop
                                      // main() will never be left

    return 0;                         // This line will never be executed

}


// Interrupt subroutine for ADC conversion complete
ISR(ADC_vect) 
{
    PORTB^= 0x02;                     // Toggle PB1

    if(ADC > 512)                     // Is tht ADC vaue greater than 512?
        PORTB |= 0x01;                // Set PB0
    else                              // Is the ADC not greater than 512
       PORTB &= ~0x01;                // Reset PB0
} 

Download C-Sourcefile mit ASCII-Schema: C-Sourcefile mit ACII-Schema

Signalplots

ATmega8 ADC Free Running mit Interrupt

Gelb: Digitaler Ausgang PB0 zeigt an, ob Analog IN > 512

Blau: Digitaler Ausgang PB1 zeigt "End of Conversion" an

Rot: Analoger eingang PC0 (ADC0)