ATmega8 ADC Single conversion mit Interrupt.
Dieses C Codebeispiel verwendet den ADC im SC Mode 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. |
Please visit: the four |
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
Gelb: Digitaler Ausgang PB0, zeigt Vergleich von ADC mit 512 an.
|