IceRage
01.02.2009, 15:17
Hallo
ich habe mal folgenden Code ausprobiert:
uint16_t readADC(uint8_t channel) {
uint8_t i;
uint16_t result = 0;
// Den ADC aktivieren und Teilungsfaktor auf 128 (16MHz) stellen
ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);
// Kanal des Multiplexers waehlen
ADMUX = channel;
// Externe Referenzspannung verwenden (also 4,95 V)
ADMUX |= (0<<REFS1) | (0<<REFS0);
// Den ADC initialisieren und einen sog. Dummyreadout machen
ADCSRA |= (1<<ADSC);
while(ADCSRA & (1<<ADSC));
// Jetzt 3x die analoge Spannung and Kanal channel auslesen
// und dann Durchschnittswert ausrechnen.
for(i=0; i<3; i++) {
// Eine Wandlung
ADCSRA |= (1<<ADSC);
// Auf Ergebnis warten...
while(ADCSRA & (1<<ADSC));
result += ADCW;
}
// ADC wieder deaktivieren
ADCSRA &= ~(1<<ADEN);
result /= 3;
return result;
}
Habe den Atemga32 auf dem AVR-NET-IO Board, von bekanntem Versandhandel. Ich kann zwar ein bisschen C, aber wie das setzen der Bits funktioniert verstehe ich leider nur zum Teil. Ich habe da eine ganz gute Erklärung gefunden, in wie weit, welche Bits gesetzt werden müssen. Demnach sollte (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0) für einen Teiler von 128 korrekt sein. Die Frequenz für den AD-Wandler liegt ja dann wohl bei 150kHz, was wohl laut Beschreibung auch richtig wäre.
Bei der Beschaltung der externen Referenz Spannung sollen REFS1 und REFS0 jeweils auf 0 liegen, und dann dieser Wert dem Multiplexer zugewiesen werden. Aber mit: ADMUX |= (0<<REFS1) | (0<<REFS0) erreicht man dies nicht oder? :|
Ansonsten rufe ich den Code innerhalb von httpd_data_send() auf, und setze dann jedes mal einen Wert in var_array auf den aktuellen Ablesewert: var_array[3] = readADC(4). Also jedes Mal, wenn ich die Webseite aufrufe erhalte ich dann den aktuellen Wert. Die Webseite habe ich natürlich entsprechend umgebaut, damit eben dieser angezeigt wird.
Ich habe mir vorgestellt, die Webseite dann über ein Perlskript immer wieder neu aufzurufen und das Ergbnis dann zu parsen. Wie das in Perl funktioniert weiß ich. Nur ob ich die Register richtig gesetzt habe, da bin ich mir nicht so sicher. Der Wert auf der Webseite ist übrigens permanent bei 1023 (also Maximum bei 2^10), da ändert sich nichts.
Wäre nett wenn mir da jemand einen Hinweis geben würde,
vielen Dank IceRage
ich habe mal folgenden Code ausprobiert:
uint16_t readADC(uint8_t channel) {
uint8_t i;
uint16_t result = 0;
// Den ADC aktivieren und Teilungsfaktor auf 128 (16MHz) stellen
ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);
// Kanal des Multiplexers waehlen
ADMUX = channel;
// Externe Referenzspannung verwenden (also 4,95 V)
ADMUX |= (0<<REFS1) | (0<<REFS0);
// Den ADC initialisieren und einen sog. Dummyreadout machen
ADCSRA |= (1<<ADSC);
while(ADCSRA & (1<<ADSC));
// Jetzt 3x die analoge Spannung and Kanal channel auslesen
// und dann Durchschnittswert ausrechnen.
for(i=0; i<3; i++) {
// Eine Wandlung
ADCSRA |= (1<<ADSC);
// Auf Ergebnis warten...
while(ADCSRA & (1<<ADSC));
result += ADCW;
}
// ADC wieder deaktivieren
ADCSRA &= ~(1<<ADEN);
result /= 3;
return result;
}
Habe den Atemga32 auf dem AVR-NET-IO Board, von bekanntem Versandhandel. Ich kann zwar ein bisschen C, aber wie das setzen der Bits funktioniert verstehe ich leider nur zum Teil. Ich habe da eine ganz gute Erklärung gefunden, in wie weit, welche Bits gesetzt werden müssen. Demnach sollte (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0) für einen Teiler von 128 korrekt sein. Die Frequenz für den AD-Wandler liegt ja dann wohl bei 150kHz, was wohl laut Beschreibung auch richtig wäre.
Bei der Beschaltung der externen Referenz Spannung sollen REFS1 und REFS0 jeweils auf 0 liegen, und dann dieser Wert dem Multiplexer zugewiesen werden. Aber mit: ADMUX |= (0<<REFS1) | (0<<REFS0) erreicht man dies nicht oder? :|
Ansonsten rufe ich den Code innerhalb von httpd_data_send() auf, und setze dann jedes mal einen Wert in var_array auf den aktuellen Ablesewert: var_array[3] = readADC(4). Also jedes Mal, wenn ich die Webseite aufrufe erhalte ich dann den aktuellen Wert. Die Webseite habe ich natürlich entsprechend umgebaut, damit eben dieser angezeigt wird.
Ich habe mir vorgestellt, die Webseite dann über ein Perlskript immer wieder neu aufzurufen und das Ergbnis dann zu parsen. Wie das in Perl funktioniert weiß ich. Nur ob ich die Register richtig gesetzt habe, da bin ich mir nicht so sicher. Der Wert auf der Webseite ist übrigens permanent bei 1023 (also Maximum bei 2^10), da ändert sich nichts.
Wäre nett wenn mir da jemand einen Hinweis geben würde,
vielen Dank IceRage