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.
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
> while((ADCSRA & (1<<ADIF)==0))
Wenn du Warnungen einschalten würdest, hätte der Compiler hier wohl
gemeckert ...
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.