Forum: Mikrocontroller und Digitale Elektronik C: Problem bei der Parameterübergabe / ADC-Mittelwert


von Wolle (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
ich bin im Programmieren noch totaler Anfänger und benötige eure Hilfe, 
da ich meinen Fehler im Code nicht finde und aktuell noch nicht die 
Hardware zum debuggen habe (den richtigen Programmer).

Zum Code:
Es soll eine Funktion aufgerufen werden, welche den Mittelwert von einem 
analogen Signal bestimmt und wieder übergibt.
Problem:
Beim Verändern der analogen Größe springt die Balkenanzeige ab und zu 
auf den vollen Ausschlag, habs versucht zu fotografieren.

Danke für die Hilfe.

Gruß

von Jens N. (midibrain)


Lesenswert?

Ohne jetzt genauer auf Deinen Code einzugehen:

Hast Du schon mal probiert mehr als 4 (z.B.10)Wandlungen durchzuführen 
und dann den Mittelwert zu bilden?

Und zum Stil: Was macht der C-Code im Header??

Jens

: Bearbeitet durch User
von au weia (Gast)


Lesenswert?

Wolle schrieb:
> Danke für die Hilfe.

Gehe erst mal in dich und ändere Grundlegendes:

- kein Programmcode in *.h Datei, das tut man nicht! Auch wenn
  prinzipiell jeder Sche... erlaubt ist.

- Initialisierung des ADC und Messung in getrennten Funktionen
  (damit einmalig Aufruf der Init, wiederholtes Aufrufen der
   Messung). Bei jeder Messung den ADC initialisieren ist völlig
   sinnlos.

- Bei diesem kleinen Code kannst du alles in einer Datei halten

- versuche die Kommentare so zu schreiben dass man nicht zwei
  Bildschirme braucht um sie sehen zu können.

von Manfred (Gast)


Lesenswert?

Jens N. schrieb:
> Hast Du schon mal probiert mehr als 4 (z.B.10)Wandlungen durchzuführen
> und dann den Mittelwert zu bilden?

Wenn der Ablauf genug Zeit hat, ist das eine gute Sache. Ich füge dann 
in der Schleife noch eine zusätzliche Wartezeit ein und werfe die beiden 
Min- / Max-Werte weg.

Aber:
Wolle schrieb:
> welche den Mittelwert von einem analogen Signal bestimmt

Wir wissen nicht, wie sein analoges Signal aussieht, wie schnell es sich 
ändert. Ob man nun zwei oder 10 oder 27 Werte mittelt und ob ein delay 
sinnvoll ist, hängt von der Signalgeschwindigkeit ab.

au weia schrieb:
> Bei jeder Messung den ADC initialisieren ist völlig sinnlos.

Das könnte sogar zu Fehlmessungen führen, der erste Wert, den ich vom 
ATMega328 bekomme, ist oftmals falsch. Wenn ich Zeit habe, werfe ich den 
rein vorsorglich weg.

> Bei diesem kleinen Code kannst du alles in einer Datei halten

Wohl wahr.

von Jens N. (midibrain)


Lesenswert?

Ja, den ersten Wert sollte man immer verwerfen, gerade dann wenn man 
vorher irgendetwas am ADC geschaltet hat, das hat der TO in seiner 
Funktion auf jeden Fall.

von Oliver S. (oliverso)


Lesenswert?

Vor allem, wenn man völlig unnötig bei jeder Messung an der 
Refrenzspannungseinstellung rumfummelt, und das auch noch unnötig hin- 
und her.
1
      ADMUX = ADMUX|(1<<REFS0);
2
      ADMUX = ADMUX&~(1<<REFS1);

Mach das einmal zur Initialisierung, und fertig.

Oliver

: Bearbeitet durch User
von foobar (Gast)


Lesenswert?

> while((ADCSRA & (1<<ADIF)==0))

Wenn du Warnungen einschalten würdest, hätte der Compiler hier wohl 
gemeckert ...

von Kay M. (wolle2011)


Angehängte Dateien:

Lesenswert?

Hallo,

ja, da hab ich wohl noch sehr viiiile Defizite ... oh man

Ich habe den Code ursprünglich auch erst in einem file geschrieben und 
das funktioniert auch soweit - siehe Anhang.
Als nächsten Schritt möchte ich die ADC-Funktion auslagern, da der Code 
zukünftig wachsen soll und auch zur Übung.
Das Analogsignal wird derzeit über ein Poti an der ADC1-Pin gelegt.

"while((ADCSRA & (1<<ADIF)==0))" --> Ja, eine Warnung kommt, das ist 
richtig. Muss das korrigiert werden?

Wie das mit dem Auslagern funktioniert, muss ich mir jetzt noch genau 
ansehen, wenn man da nicht drin steckt, schein das nicht trivial zu 
sein.

Gruß

von quotendepp (Gast)


Lesenswert?

Kay M. schrieb:
> "while((ADCSRA & (1<<ADIF)==0))" --> Ja, eine Warnung kommt, das ist
> richtig. Muss das korrigiert werden?

naja, so zum spaß wird die warning ja nicht kommen. sich darum zu 
kümmern ist grundsätzlich eine gute idee

von Thomas W. (Gast)


Lesenswert?

Moin, -

> "while((ADCSRA & (1<<ADIF)==0))" --> Ja, eine Warnung kommt, das ist
> richtig. Muss das korrigiert werden?

1990 wahr und auch 2021 immer noch wahr (The Ten Commandments for C 
Programmers):

Thou shalt run lint frequently and study its pronouncements with care, 
for verily its perception and judgement oft exceed thine.

Auf Deutsch: Wenn der Compiler Dir eine Warnung schickt, solltest Du sie 
auf jeden Fall beachten.

Gruesse

Th.

von foobar (Gast)


Lesenswert?

> "while((ADCSRA & (1<<ADIF)==0))" --> Ja, eine Warnung kommt, das ist
> richtig. Muss das korrigiert werden?

Schon zweimal mit der Nase draufgestoßen und immer noch nicht 
verstanden.  Der dritte Versuch: warum kommt bei ((2 + (3) * 4)) nicht 
20 heraus?

Wenn der Groschen jetzt immer noch nicht fällt, solltest du das mit dem 
Hobby "Programmieren" noch mal überdenken.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.