Forum: Mikrocontroller und Digitale Elektronik PIC18 - Variablen


von bastler (Gast)


Lesenswert?

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?

von frame (Gast)


Lesenswert?

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

von bastler (Gast)


Lesenswert?

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

von Michael S. (rbs_phoenix)


Lesenswert?

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.

von bastler (Gast)


Lesenswert?

nein das geht leider nicht, da "2284" noch eine Variable werden soll, 
sodass die Zeile wie folgt lautet

  ADC = (ADC+ Variable1) * (float)((4095 / Variable2));

von Johnny B. (johnnyb)


Lesenswert?

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.

von Andreas M. (amesser)


Lesenswert?

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....)

von Michael S. (rbs_phoenix)


Lesenswert?

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
Noch kein Account? Hier anmelden.