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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.