ATmega32 ADC mit Interrupt
Dieser ATmega32 Beispielcode betreibt den ADC mit Interrupt nach jeder Konversion.
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. |
Please visit: the four |
#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
Gelb: Analoges Eingangssignal PA4
|
|
Gelb: Analoges Eingangssignal PA4
|