Also hier bisschen Code mit vielen Kommentaren.
Wobei die Defines nicht die eleganteste Lösung sind. Es ist besser du
machst dir ne eigene adc_init() Funktion und setzt dort nur die Bits die du in deinem Fall brauchst.
Code:
#include <avr/io.h>
/* Analog/Digiatl konverting */
#define ADCchannel_init DDRA=0x00 // ADC Port als Eingang deklarieren
#define ADCinit ADCSRA|=(1<<ADEN) // Teilt dem Board mit das der jeweilige Port für ADC verwendet wird
#define ADCdisable ADCSRA &=~(1<<ADEN) // machs das vorherige wieder rückgänig
#define ADCstart ADCSRA|=(1<<ADSC) // startet eine konvertierung auf dem gewünschten Kannal/Pin
#define ADCfree ADCSRA|=(1<<ADATE) // schaltet den freilaufenden Modus ein
#define ADCvintern ADMUX=(1<<REFS1) | (1<<REFS0) // interne Spannungsversorgung
#define ADCinterrupt_on ADCSRA|=(1<<ADIE) // ADC interrupt wird freigeschalten
#define ADCprescaler_2 ADCSRA |=(1<<ADPS0) // gewünschter Teilungsfaktor/Prescaler
#define ADCprescaler_4 ADCSRA|=(1<<ADPS1)
#define ADCprescaler_8 ADCSRA=(1<<ADPS1) | (1<<ADPS0)
#define ADCprescaler_16 ADCSRA|=(1<<ADPS2)
#define ADCprescaler_32 ADCSRA=(1<<ADPS2) | (1<<ADPS0)
#define ADCprescaler_64 ADCSRA=(1<<ADPS2) | (1<<ADPS1)
#define ADCprescaler_128 ADCSRA=(1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0)
#define ADCprescaler_reset ADCSRA = ~_BV(ADPS2) & ~_BV(ADPS1) & ~_BV(ADPS0) // setzt Prescalerbits zurück
#define ADCchannel_1 //gewünschter Kannal z.B bei ATmega32 PINA0 - PINA7
#define ADCchannel_2 ADMUX|=(1<<MUX0) // bei nicht freilaufen muss ADCchannel_x vor
#define ADCchannel_3 ADMUX|=(1<<MUX1) // ADCstart kommen dann kann man mit getadc() der
#define ADCchannel_4 ADMUX= (1<<MUX1) | (1<<MUX0) // Adcwert des gewählten Kannals auslesen
#define ADCchannel_5 ADMUX|=(1<<MUX2)
#define ADCchannel_6 ADMUX= (1<<MUX2) | (1<<MUX0)
#define ADCchannel_7 ADMUX= (1<<MUX2) | (1<<MUX1)
#define ADCchannel_8 ADMUX= (1<<MUX2) | (1<<MUX1) | (1<<MUX0)
#define ADCchannel_reset ADMUX= ~(1<<MUX2) & ~(1<<MUX1) & ~(1<<MUX0)
inline unsigned int getadc(void)
{
while (ADCSRA & (1<<ADSC)) {} // Warten bis Messung fertig
return ADC;
}
void main(void)
{
unsigned int adc_wert;
ADCchannel_init;
ADCinit; // A/D Converter aktivieren
ADCvintern;
ADCprescaler_128;
ADCchannel_1;
ADCstart; // Startet Messung an A/D Pin1 d.h. PINA0
adc_wert=getadc();
ADCchannel_reset;
ADCchannel_2; // Startet Messung an A/D Pin2
ADCstart;
adc_wert=getadc();
ADCdisable;
}
Lesezeichen