Hallo, wieso muss ich den ADC channel in ADC_init vorgeben, ein ändern in ADC_read bringt kein Ergebnis (der ADC gibt dann nur 1023 aus)?
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
Danke, Klaus.
|
Anzeige
|
ADC channel via ADMUX ändern?Hallo, wieso muss ich den ADC channel in ADC_init vorgeben, ein ändern in ADC_read bringt kein Ergebnis (der ADC gibt dann nur 1023 aus)?
Danke, Klaus.
Gast
#6212492
ATMEGA 328? Änderungen an ADMUX wirken sich erst bei der nächsten Konvertierung aus, wenn bereits eine Konvertierung läuft, sonst erst bei der übernächsten. Wenn ADMUX geschrieben wird, landet das erst in einem Zwischenregister, erst am Ende der Konvertierung wird der Multiplexer umgeschaltet. Atmega 8 //ADMUX = ADC_channel; // Select pin ADC0 using MUX ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion" -> Das wäre doch VOR der Wandlung? Hatte ich auch schon im DaBla gelesen, meinte es aber damit einzuhalten? Klaus.
Gast
#6212509
> -> Das wäre doch VOR der Wandlung? Hatte ich auch schon im DaBla > gelesen, meinte es aber damit einzuhalten? > Wie gesagt: Die Umschaltung erfolgt am Ende jeder Wandlung. Warte mal das Ende der 1. Wandlung ab und starte eine neue. Dann erhältst du das richtige Ergebnis. Klaus R. schrieb: > ein ändern in > ADC_read bringt kein Ergebnis Vielleicht weil Du da die REFSx-Bits löschst und damit Vref umschaltest?
Gast
#6212512
Wenn Du ADMUX dort nur mit dem Channel beschreibst, vermurkst Du die in ADC_init() gesetzten Vref-Bits.
Gast
#6212520
Das, was Mario M. und Hmmm oben gesagt haben, stimmt natürlich. Ich hatte oben auch nicht ganz recht: Bei der ersten Konvertierung werden MUX und REFS doch upgedatet. Nur im free running mode passiert das nur am Ende jeder Konvertierung. Datenblatt: Figure 92. ADC Timing Diagram, First Conversion (Single Conversion Mode) Figure 93. ADC Timing Diagram, Single Conversion Figure 94. ADC Timing Diagram, Free Running Conversion Trotzdem sollte man nach dem Ändern der Referenzspannungsquelle das Ergebnis der nächsten Konvertierung wegwerfen. (Abschnitt ADC Voltage Reference, letzter Satz) //ADMUX = ADC_channel; // Select pin ADC0 using MUX wie bereits gesagt, werden hier alle anderen Bits in diesem Register gelöscht, was im Allgemeinen NICHT erwünscht ist. Besser so.
Damit werden nur die MUX-Bits in ADMUX gelöscht und ADC-channel außerdem auf 0-15 begrenzt, ein fälschlicher Aufruf mit >15 macht die anderen Bits nicht kaputt. Nennt sich defensives Programmieren. Siehe auch Bitmanipulation. "Wenn Du ADMUX dort nur mit dem Channel beschreibst, vermurkst Du die in ADC_init() gesetzten Vref-Bits." Verdammt - logisch! Es war halt zu spät :) Danke! Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|