Hallo zusammen,
wenn ich den Rückgabewert der Funktion "ReadChannel" durch 2 dividiere
bekomme ich einen deutlich größeren Wert als den ursprünglichen
return-Wert. Wenn ich aber aber z.B. einfach schreibe "return 95;" dann
funktioniert die anschließende Division durch 2.
Meine Frage ist also warum die Division nur in dem zweiten Fall
funktioniert.
Gruß Gustav
Hallo,
wenn du eine Dummywandlung machst, musst Du auch den Wert auslesen:
1
ADCSRA|=(1<<ADSC);
2
while(ADCSRA&(1<<ADSC));
3
(void)ADCW;
Es mach auch keinen Sinn den ADC immer Ein und wieder Aus zuschalten!
Dann würde ich für die Mittelwertbildung die Anzahl der Messungen auf
2^n; n E {1,..,64} setzen.
Bitte ändere das in deinem Programm und posten den Assembler output.
Gustav schrieb:> Wieso soll das überflüssig sein ? Die Funktion ReadChanel liefert das> Ergebnis 95 und das möchte ich noch durch 2 teilen.
Aber da das Ergebnis nicht genutzt wird gibt es keinen Code dazu.
Insofern ist auch völlig unklar, woraus du deine ursprüngliche Aussage
beziehst.
A. K. schrieb:> Aber da das Ergebnis nicht genutzt wird gibt es keinen Code dazu.> Insofern ist auch völlig unklar, woraus du deine ursprüngliche Aussage> beziehst.
Das Ergebnis wird eigentlich auf einer char - Variable gespeichert und
dann auf einen Attiny 2313 geschickt und dort an einem LED Display
ausgegeben. Da dies jedoch ziemlich viel Code ist habe ich es oben
weggelassen. Das Prinzip der Übertragung funktioniert und eine "normale"
Division, da ich folgendes probiert habe:
Meine fresse nochmal: poste doch einfach den gesamten code! Mit so
einem mist hier ist das nichts als raten!
Und stell dir vor: man kann hier auch dateien anhängen, du must den code
nicht per copy&paste einfügen...
Gustav schrieb:> return result/2
Das ist was anderes als
> uint16_t res = ReadChannel(0) / 2 ;
Für dich mag es das selbe sein, aber nicht zwingend für den
compiler!
Also: häng den orginal code als datei an oder troll dich woanders!
Moin Kaj,
ich hoffe Du hast ausgeschlafen. Warst gestern abend scheinbar sehr müde
und reizbar!
Woher ich das weiß? Deine Ausdrucksweise ließ sehr zu wünschen übrig.
Hoffe, Du bekommst auf Fragen, oder auch schlecht gestellte Fragen,
nicht auch so patzige Antworten. Trink nen Kaffee, geh in Dich, und
antworte nur, wenn Du dazu körperlich in der Verfassung bist...
Würdest Du auch mit jemandem so reden, wenn er vor Dir steht? Glaube ich
kaum.
Besten Gruß
Die Form war etwas hart, inhaltlich hat er aber schon recht. Zu einer
Frage über seltsames Verhalten eines Programms nur Code abzuliefern, der
das beschriebene Problem überhaupt nicht haben kann, darf man schon als
Verarschung betrachten.
Es ist schon ein sinnvolles Vorgehen, ein grösseres Programm so weit wie
möglich zu reduzieren, bevor man es in ein Posting wirft. Nur sollte man
sehr darauf achten und verifizieren, dass man dabei das Problem nicht
ebenfalls rauskürzt.
...ach beim Zusammenkürzen würde er den Fehler doch schon selbst finden
und verstehen und der Post wär überflüssig....
Das ist aber auch nicht leicht in einem Forum. Beschäftigt man sich mit
dem Fehler gut genug, um ihn zu dokumentieren, löst man ihn selbst,
beschäftigt man sich nicht damit, kann das Forum nicht helfen :-O
Schmaler Grat!
@Gustav
Ich verstehe nichts von "C", vermute aber dennoch, daß einer der
beteiligten Datentypen zu "klein" für das Resultat ist. Deshalb kommt
es zu Überläufen und mistigen Ergebnissen.
Schön an "C" finde ich, daß der Kompiler einfach Sachen nach Gutdünken
wegoptimiert. Das ist einer der Gründe, warum ich diese Sprache meide.
:-(
MfG Paul
Paul Baumann schrieb:> Ich verstehe nichts von "C", vermute aber dennoch, daß einer der> beteiligten Datentypen zu "klein" für das Resultat ist. Deshalb kommt> es zu Überläufen und mistigen Ergebnissen.
Der Überlauf bei ganzzahliger Division muss erst noch erfunden werden.
Im obigen Programm - was immer das wert ist - werden 5 ADC-Werte
aufsummiert. In 16 Bits ist das kein Problem.
> Schön an "C" finde ich, daß der Kompiler einfach Sachen nach Gutdünken> wegoptimiert.
Assembler-Fan? Für jeden Compiler, ob C oder nicht, gilt, dass
Optimierungen, die am Ergebnis nichts ändern, zulässig sind. Und dass
der Compiler auch mal Fehler haben kann.
A.K. schrub:
>Der Überlauf bei ganzzahliger Division muss erst noch erfunden werden.
Zitat Gustav:
> return result/2> Fehler !! : das Ergebnis (127) wird angezeigt
Ich würde sage, daß "Result" ein ganzzahliger Wert ist, den er sich aus
dem AD-Wandler-Register holt.
A.K. frug:
>Assembler-Fan?
Unter Anderem auch.
>Für jeden Compiler, ob C oder nicht, gilt, dass>Optimierungen, die am Ergebnis nichts ändern, zulässig sind.
Das mag sein, trotzdem würde ich zum Testen des Programmes erzwingen
wollen, daß nichts optimiert wird. Wenn es dann fehlerlos läuft, von
mir aus...
>Und dass>der Compiler auch mal Fehler haben kann.
Das ist wohl wahr.
MfG Paul
Tobias schrieb:> Moin Kaj,
Mahlzeit
Tobias schrieb:> ich hoffe Du hast ausgeschlafen.
ja, hab ich, danke der nachfrage, und selbst?
Tobias schrieb:> Deine Ausdrucksweise ließ sehr zu wünschen übrig.
Ich hab mich noch zurück gehalten
Tobias schrieb:> Hoffe, Du bekommst auf Fragen, oder auch schlecht gestellte Fragen,> nicht auch so patzige Antworten.
Hab ich hier im Forum mehr als einmal, und das jedes mal zu recht. Auf
eine dumme und/oder unvollständige Frage folgt eine dumme und/oder
patzige Antwort, und das in 99,99% aller Fälle volkommen zu recht.
Tobias schrieb:> Würdest Du auch mit jemandem so reden, wenn er vor Dir steht?
Wenn er mir etwas zeigt, in dem ein "Problem" vorhanden sein soll, das
gezeigte aber eine stark abgewandelte version, und damit mit dem orginal
gar nicht zu vergleichen ist, dann ja.
Stell dir vor: da kommt jemand mit einem Fahrrad zu dir und erzählt dir
was von Problem xy... in wirklich geht es aber um ein Motorrad mit
Beiwagen...
Paul Baumann schrieb:> daß der Kompiler einfach Sachen nach Gutdünken> wegoptimiert
Für die Optimierung gibt es ja Regeln und eine ist die "as if" Regel.
Die Funktion des Codes muss nach der optimierung so sein als ob der
Compiler nichts getan hätte. Das der Code nicht immer das macht was der
Programmiere sich denkt, dafür kann der Compiler ja nichts.
Ein kleines Beispiel:
1
voidfoo(uint8_ta)
2
{
3
if((a>=0)&&(a<=5))
4
{
5
// tu was
6
}
7
}
Den Ausdruck "(a>=0)" darf und wird der Compiler (weg)optimieren weil
die Variable "a" ein unsigned datentyp ist. "a" ist also immer größer
oder gleich 0, dieser vergleich ist also immer wahr. Warum sollte der
Compiler das also nicht optimieren, und daraus ein:
1
voidfoo(uint8_ta)
2
{
3
if(a<=5)
4
{
5
// tu was
6
}
7
}
machen?
Ich gebe zu, das ich auch nicht immer nachvollziehen kann, was der
Compiler wann wie und wo wegoptimiert. Aber das zeigt mir jedesmal
wieder auf's neue, das ich die Sprache wohl doch nicht so gut kann und
auch den Compiler nicht so gut kenne, wie ich manchmal denke.
Paul Baumann schrieb:> Das mag sein, trotzdem würde ich zum Testen des Programmes erzwingen> wollen, daß nichts optimiert wird
Einfach die Optimierung ausschalten.
Grüße
Hey vielen Dank für eure Antworten !
Also erst mal möchte ich mich Entschuldigen, dass ich die Sache wohl
gestern Abend unnötig kompliziert gemacht habe in dem ich das Programm
"vereinfacht" habe.
Paul Baumann schrieb:> Ich verstehe nichts von "C", vermute aber dennoch, daß einer der> beteiligten Datentypen zu "klein" für das Resultat ist.
Du hast natürlich Recht !! Das ist mir eben auch eingefallen ,deswegen
wollte ich mich auch eigentlich noch mal melden um die Verwirrung zu
beheben. Der Wert den die Funktion zurück gibt liegt über dem
Wertebereich eines Char Datentyps. Die Zahl 95 die auf meinem Display
angezeigt wird ist also nur der abgeschnittene Rest, sodass in
Wirklichkeit eine ganz andere Zahl durch 2 geteilt wird.
Mit freundlichen Grüßen
Gustav