ATTiny25 - ADC liefert nach Kanalwechsel immer 0

Gast #2536180
Hallo

Ich möchte für ein Netzgerät eine Digitale Strom und Spannungsanzeige 
bauen.
Dazu messe ich mit einem ATTiny25 sowohl den Ausgang als auch über einem 
Shunt und zeige das Ergebnis auf einer 7-Segment-Anzeige an.

Da die Anzeige nicht Platz für beides bietet, muss ich die Anzeige per 
Schalter umschalten. Dazu habe ich einen Doppel-Umschalter. Je nach 
Schalterstellung wird V_out oder GND an den ADC3 gelegt. Der ADC2 liegt 
konstant an V_Shunt. Ich nutze die differentiellen Eingänge. zwischen 
V_out und V_Shunt kann ich die Ausgangsspannung messen, zwischen V_Shunt 
und GND (mit Verstärkung x20 und Polarität vertauscht) den 
Ausgangsstrom.
(Der zweite Schalter signalisiert dem µC, was grade gemessen werden 
soll).

Soweit so gut. Das klappt an sich auch sehr gut, nur muss ich jetzt noch 
an ADC1 ein Signal messen. Dazu schalte ich auf den ADC1 um, setze die 
Referenzspannung auf VCC und messe den Pin. Das funktioniert auch noch 
super. Das Problem ist jetzt aber das zurückschalten. Dazu setze ich die 
Referenzspannung auf AREF und wähle ADC2-ADC3 aus. Nur liefert er mir 
dann immer 0.

Ich hab das Problem schon eingekreist, wenn ich "SetMeasureADC1()" 
auskommentiere, kann ich wunderbar die Spannung zwischen den beiden 
Eingängen messen, das Ergebnis stimmt auch soweit (Logischerweise 
liefert die Messung dann murks, da andere Channel ausgewählt sind). 
Sobald ich die Funktion einkommentiere, gibt er mir wieder 0 aus. Und 
zwar wirklich 0, der Wert schwankt auch kein bisschen. Auch vor dem 2ten 
Messen ADMUX komplett auf 0 zu setzen und neu zu initialisieren scheint 
nichts zu bringen.

Code: http://pastebin.de/23218

(Der Interrupt ist absichtlich leer, er soll mich nur aus dem 
Schlafmodus wecken. Das Auslesen geschieht dann in ReadADC(). Sobald ich 
in den Noise-Reduction-Sleepmode wechsle, startet die Messung 
automatisch).

Er hängt sich auch nicht auf, das Display wird weiter aktualisiert. 
Folglich muss er aus dem Schlafmodus wieder raus kommen, was nur durch 
ein Interrupt funktioniert. Der ADC scheint also zu laufen. Nur warum 
liefert er 0? Bestimmt so ein ganz blöder Flüchtigkeitsfehler :/

MfG ATTiny25
Gast #2536912
Hey, danke, es funktioniert :)

Ich wusste zwar dass der ADC n paar Takte länger dauert nach dem 
wechseln, aber dass das Ergebnis gleich 0 ist :/

Naja danke dir nochmal :)

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.