Hallo,
ich betreibe an meinen ATmega1284P zur Zeit eine einfache Adc Schaltung.
Benutze die interne Referenz von 2.54V.
Ein 250k Poti hängt zwischen Aref und GND, der Schleifer geht auf Adc1.
Zwischen Aref und GND hängen außerdem noch 100nF.
Meine Initialisierung schaut so aus:
1 | /* select internal reference AVCC */
|
2 | ADMUX |= (1 << REFS1) | (1 << REFS0);
|
3 | /* setting the alignment of the ADC data register */
|
4 | ADMUX |= (1 << ADLAR);
|
5 | /* select single pin measurement on PA0 */
|
6 | ADMUX |= (0 << MUX4) | (0 << MUX3) | (0 << MUX2) | (0 << MUX1) | (0 << MUX0);
|
7 |
|
8 | /* enable the ADC module */
|
9 | ADCSRA |= (1 << ADEN);
|
10 | /* disable the auto trigger */
|
11 | ADCSRA |= (0 << ADATE);
|
12 | /* enable the ADC complete interrupt */
|
13 | ADCSRA |= (1 << ADIE);
|
14 | /* setting the prescaler to 128 */
|
15 | ADCSRA |= (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);
|
16 |
|
17 | /* setting the auto trigger to free running mode, however, auto triggering is disabled */
|
18 | ADCSRB |= (0 << ADTS2) | (0 << ADTS1) | (0 << ADTS0);
|
19 |
|
20 | /* disabling the digital input on pins used for ADC */
|
21 | DIDR0 |= (0 << ADC7D) | (0 << ADC6D) | (0 << ADC5D) | (0 << ADC4D) | (0 << ADC3D) | (0 << ADC2D) | (0 << ADC1D) | (1 << ADC0D);
|
Alle 640ms wird eine neue Messung gestartet:
Im Interrupt wird der Wert nur kurz abgespeichert.
Der Wert wird in einen String gewandelt und per USART und Lcd
ausgebeben.
Funkt auch erstmal alles super.
Aber nach einiger Zeit steht der Wert fest auf 255.
Dreh ich einige Zeit am Poti läufts wieder.
Kennt das jemand?
Liegt das irgendwie am Adc?
Meine Software macht sonst nichts mehr, auch die Ausgabe auf USART und
Lcd klappt ansonsten.
Ist mein Poti vielleicht zu groß? Wollte erst 100k benutzen, aber die
hatte ich grad nicht da...
Viele Grüße,
lex