Gast
#2398324
Hi,
ich habe folgende Routinen:
#define AD_MUX_CHANNEL(y) ADMUX |= ((y)&0x0f)
void ADC_Init (void)
{
/*
ADMUX
.-----.-----.---....
|REFS1|REFS0|
'-----'-----'---...
| |
| |
| |
.--. |\| |
AVCC | |---------------|0 \ |
'--' | | _|_
| |-------.
.---------------. | | |
| Internal 1.1V |--|1 / |
| Reference | |/ |
'---------------' |
|
.--. | .-------....
AREF | |---------------------------o-----| A/D Conf
'--' '-------....
.---.-------.-------.-----------------------------------------------.
|Nb.| REFS1 | REFS0 | Voltage Reference Selecttion (23.8.1 / P.256) |
.---+-------+-------+-----------------------------------------------.
| 0 | 0 | 0 | AREF, Internal VRef turned off |
.---+-------+-------+-----------------------------------------------.
| 1 | 0 | 1 | AVcc with external cap. at AREF |
.---+-------+-------+-----------------------------------------------.
| 2 | 1 | 0 | Reserverd |
.---+-------+-------+-----------------------------------------------.
| 3 | 1 | 1 | Int. VRef 1.1V with ext. cap. at AREF |
'---'-------'-------'-----------------------------------------------'
*/
ADMUX &=~ (1<<REFS0);
ADMUX &=~ (1<<REFS1); //Referenzquelle wählen
ADCSRA = (1<<ADPS1) | (1<<ADPS0); // Frequenzvorteiler
// setzen auf 8 (1)
}
und
uint16_t ADC_ReadChannel(uint8_t mux)
{
uint8_t i;
uint16_t result;
AD_MUX_CHANNEL(mux); //Kanal waehlen
ADCSRA |= (1<<ADEN);
/* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man
liest
also einen Wert und verwirft diesen, um den ADC "warmlaufen zu
lassen" */
ADCSRA |= (1<<ADSC); // eine ADC-Wandlung
while ( ADCSRA & (1<<ADSC) ) {
; // auf Abschluss der Konvertierung warten
}
result = ADCW; // ADCW muss einmal gelesen werden,
// sonst wird Ergebnis der nächsten Wandlung
// nicht übernommen.
/* Eigentliche Messung - Mittelwert aus 4 aufeinanderfolgenden
Wandlungen */
result = 0;
for( i=0; i<4; i++ )
{
ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion"
while ( ADCSRA & (1<<ADSC) ) {
; // auf Abschluss der Konvertierung warten
}
result += ADCW; // Wandlungsergebnisse aufaddieren
}
ADCSRA &= ~(1<<ADEN); // ADC deaktivieren (2)
result /= 4; // Summe durch vier teilen = arithm.
Mittelwert
return result;
}
Die Routine hatte ich aus dem Tutorial und dann in init() und read()
aufgetreilt.
Ich habe nach wie vor das Problem, wenn ich sie mit read(5) und dann mit
read(3) aufrufe, dass ich nur noch schrott bekomme, es passiert quasi
keine Werteänderung mehr an ch5.
wenn ich nur ch5 abfrage - kein Problem.
Für einen Tip wäre ich dankbar.
Hannes