Also was auf jeden fall besser wäre, wär wenn du "ergebnis = ADC" schreibst da das auselsen von 16bi registern nicht so einfach ist.
while(i){ ... wird nie gehen. sondern: ist auch eleganter
while((i--)>0) {
...
}
ich machs anders.
ergebnis = ergebnis / ii ; //Enelegant
(ADIF-bit) //was bedeutet das?
es reicht eine dummy zum warmlaufen und es reichen 3 wandlungen zum mittelwert bilden. sonst wartest ja so lange bis der wert da ist und dan stimmt er erst wieder nicht.
So schauts bei mir aus.
Code:/************************************************* AUTHOR: Thomas Grübler Version: 0.1 Beschreibung: Erfasst werte am ADC Port Beispielfunkton zum auslesen der Werte: void beispiel(void) { uint16_t adcval; adcstart(); adcval = adcget(0); // MUX-Bits auf 0b0000 -> Channel 0 adcval = adcget(2); // MUX-Bits auf 0b0010 -> Channel 2 adcstop(); } *************************************************/ #include <avr/io.h> #include "adc.h" #include "usart.h" #include "nuetzliches.h" #define wandlungen 3 void adcstart(void); void adcstop(void); uint16_t adcget(uint8_t kanal); void adcstart(void) { ADCSRA |= ((1<<ADPS0) | (1<<ADPS1) | (1<<ADPS2) | (1<<ADEN));//ADPS0-2(Vorteiler 128), ADEN (Enable) ADMUX = 0; ADMUX |= (1<<REFS1) | (1<<REFS0); ADCSRA |= (1<<ADSC); // eine ADC-Wandlung als Dummy zum warmlaufen while ( ADCSRA & (1<<ADSC) ) { ; // auf Abschluss der Konvertierung warten } } void adcstop(void) { ADCSRA &= ~(1<<ADEN); } uint16_t adcget(uint8_t kanal) { uint8_t i = 0; uint16_t ergebnis = 0; ADMUX = kanal; // Kanal waehlen ADMUX |= (1<<REFS1) | (1<<REFS0); // interne Referenzspannung nutzen while (i!=wandlungen) { //Mehrere wandlungen und durchschnittswert ermitteln ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion" while ( ADCSRA & (1<<ADSC) ) { ; // auf Abschluss der Konvertierung warten } i++; ergebnis += ADC; } ergebnis = ergebnis/wandlungen; //Durchschnittswert bilden return ergebnis; }






Zitieren

Lesezeichen