ATmega8 ADC Single conversion mit Interrupt.

Dieses C Codebeispiel verwendet den ADC im SC Mode mit Interrupt.

electroicsplanet home electroicsplanet pagetree Sourcecode Examples electroicsplanet pagetree ATmega8 electroicsplanet pagetree ADC electroicsplanet pagetree Single Conversion mit Interrupt

Beschreibung

Das Programm vergleicht den ADC Wert mit 512(Hälfte von 10 Bits) und setzt den Digitalausgang PB0 beim Überschreiten der Schwelle. Der Vergleich findet in der Interrupt Routine des ADC statt, die gestartet wird, sobald eine ADC Wandlung komplett ist. Die erste Wandlung wird in main() ausgelöst, jede weitere in der Interruptroutine. Die Zeitpunkte, wo die Interruptroutine beginnt, wrid durch Toggeln von PB1 angezeigt. Die Spannungsreferenz des ATmega8 ADC ist Vcc. Der ADC Prescaler wird auf 16 eingestellt, um bei einem Systemclock von 1MHz den ADC Cock auf 62.5kHz einzustellen.

Buchtippp:


AVR Mikrocontroller
In C programmieren

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<<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
    
    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

    ADCSRA |= (1<<ADSC);          // Start the next conversion
} 





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

Signalplots

ATmega8 ADC single conversion mit Interrupt

Gelb: Digitaler Ausgang PB0, zeigt Vergleich von ADC mit 512 an.

Blau: Digitaler Ausgang PB1 zeigt start der Interruptroutine an

Rot: Analoger eingang PC0 (ADC0)