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ß
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
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.
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.
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.
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ß
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
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.
> "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.