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