PIC18 - Variablen

Gast #2832551
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?
Gast #2832583
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.
#2832681
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.
#2832691
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....)
#2832706
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren