C: Problem bei der Parameterübergabe / ADC-Mittelwert

Gast #6675345
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ß
Angehängte Dateien:
Gast
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.
Gast
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.
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
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ß
Angehängte Dateien:
Gast
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
Gast
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.
Gast
> "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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 5 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.