Hallo zusammen,
ich habe ein merkwürdiges Problem mit dem ADC meines ATmega16. Ich
möchte ihn verwenden, um die Versorgungsspannung zu überwachen. Dazu
schalte ich AREF intern auf AVcc und verwende Kanal 30 (Interne 1.22V
Referenz). Bei einem ATmega8, bei dem ich sowas kürzlich gemacht hatte,
funktionierte das bestens, aber hier lese ich immer nur 0x3FF, also alle
Bits gesetzt. Ich habe an ARef keinen Kondensator, aber eigentlich
sollte der ja nur das Rauschen unterdrücken, oder? Jedenfalls nehme ich
später eh den Mittelwert von 256 Messungen, da kann der rauschen so viel
er will. Allerdings müsste ich dazu erstmal ein gescheites Signal
rausbekommen.
Ich schätze mal, dass ich irgendwo einen blöden Fehler gemacht habe,
aber ich komm' nicht drauf...
Hier meine Initialisierung des ADCs:
1 | void init_vsupervisor()
|
2 | {
|
3 | //Initialize ADC with Vcc as Vref and internal 1.22V on ch. 30
|
4 | ADMUX = _BV(REFS1) | _BV(REFS0) | _BV(ADLAR);
|
5 | ADMUX |= _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
|
6 |
|
7 | ADCSRA = _BV(ADEN) | _BV(ADIE);
|
8 | ADCSRA |= _BV(ADPS2) | _BV(ADPS1) | _BV(ADPS0);
|
9 | }
|
Was ebenfalls komisch ist: Die Referenz ist weder AVcc (Wenn ich REFS1
rausnehme), noch 2.56V mit obigem Code. Ausserdem habe ich auch mal an
Kanal 0 gemessen. Das Ergebnis war das Selbe, was mich aber sehr
verwundert: An PA0 (Bzw. am ganzen PortA) hängt ein Eingang von einem
74AC138 und das funktioniert alles wunderbar weiter...
Was kann das sein?!
Wäre froh, wenn mir jemand helfen könnte. Danke im Voraus!
Grüsse
Philipp