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







Zitieren

Lesezeichen