Hallo, ich hab volgendes Problem. in meinem Programm hab ich folgende Zeile ADC = (float)(9 + 174) * (float)((4095 / 2284)) ; dies kann ich ohne Probleme compilieren. änder ich die "9" hingegen in eine Variable, so das dort z.B. steht ADC = (float)(ADC + 174) * (float)((4095 / 2284)) ; dann bekomm ich folgende Fehlermeldung beim compilieren Error - section '.idata_Hardware.o' can not fit the section. Section '.idata_Hardware.o' length=0x00000004 Errors : 1 Kann mir jemand helfen?
> Error - section 'xxx' can not fit the section Wenn mich die Erinnerung nicht trügt, heißt das, dein Flash läuft über. Anders gesagt, dein Programmcode ist zu groß für den Flash. Schaue dir den erzeugten Code in beiden Fällen an. Ich kann übrigens keine Notwendigkeit erkennen, unbedingt 'float' zu verwenden. Meine Firma setzt PIC18F in kommerziellen Projekten ein. Die Verwendung von float-Variablen ist dabei tabu - das ist einer der Gründe.
Danke, ich würde auch gerne ohne float arbeiten, aber wenn ich 4095/2284 mache, dann erhalte ich 1,7929, lass ich hier das float weg dann erhalt ich eine 1, was die rechnung fehlerhaft macht
Warum schreibst du denn nicht 1.7929 hin? Da sparst du dir doch eine Rechenoperation. Dem Ergebnis nach ist ADC auch ein float. Dann würde doch "ADC = (ADC + 174) * 1.792907" reichen.
nein das geht leider nicht, da "2284" noch eine Variable werden soll, sodass die Zeile wie folgt lautet ADC = (ADC+ Variable1) * (float)((4095 / Variable2));
bastler schrieb: > ADC = (float)(ADC + 174) * (float)((4095 / 2284)) ; Michael Skropski schrieb: > Dann würde doch "ADC = (ADC + 174) * 1.792907" > reichen. Ja klar würde das reichen, aber warum selber rechnen, wenn das der Computer machen kann? Erstmal wird der Code lesbarer und besser nachvollziehbar, um was für Werte es sich handelt und zum anderen wird das bei vernünftigen Compilern eh bereits vom Preprocessor auf dem PC ausgerechnet und eingesetzt, also nicht vom Mikrocontroller. Edit: > nein das geht leider nicht, da "2284" noch eine Variable werden soll Na dann hat es sich eh erledigt.
bastler schrieb: > nein das geht leider nicht, da "2284" noch eine Variable werden soll, > sodass die Zeile wie folgt lautet > > ADC = (ADC+ Variable1) * (float)((4095 / Variable2)); Das kann man trotzdem ohne float machen, wenn ADC eine integer variable ist:
1 | ADC = ((uint32_t)(ADC + Variable1) * 4096) / Variable2 |
Oder so ähnlich, der Trick ist, das die Multiplikation vor der Division gemacht wird. Durch die Typumwandlung stellt man sicher, das die Variable bei der Multiplikation nicht überläuft. (Der Compiler wird sich die Multiplikation eh sparen und einfach eine Schiebeoperation draus machen....)
Andreas Messer schrieb: > wenn ADC eine integer variable > is WENN.. Warum sollte er aber float-casts nehmen, wenn er nur einen Integer speichern kann? Bei 4096 kann man shiften. Bei 4095 aber nicht. frame schrieb: >> Error - section 'xxx' can not fit the section > > Wenn mich die Erinnerung nicht trügt, heißt das, dein Flash läuft über. > Anders gesagt, dein Programmcode ist zu groß für den Flash. Das würde ich mir mal angucken.
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.