Forum: Mikrocontroller und Digitale Elektronik Ausgabe von float oder double über printf [dsPIC33fj]


von Heos (Gast)


Lesenswert?

Guten Tag,

ich versuche momentan float oder double zahlen mit printf übern UART 
auszugeben (Programmiersprache C).

Jedoch fängt der an zu meckern, wenn ich folgenden Programmcode anwende:

[...]
float floatvar;
printf("T1:%f",floatvar);
[...]

oder

[...]
double doublevar;
printf("T1:%Lf",doublevar);
[...]

Die Fehlermeldung:
------------------------------------------
c:\programme\microchip\mplab c30\bin\pic30-coff-ld.exe: Link Error: 
region program is full (1-Wire.cof section .text)
data_init: Link Error: Could not allocate section .dinit, size = 308 PC 
units, attributes = code
default_isr: Link Error: Could not allocate section .isr, size = 2 PC 
units, attributes = code
Link Error: Could not allocate program memory
------------------------------------------

Meine Vermutung: Der PIC hat nicht genug Speicher für diese 
Convertierung in printf.
Ich würde ungern auf float und double bei der Programmierung eines PICs 
verzichten, deshalb wäre ich für jede Hilfe dankbar!

Grüße,
Heos

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Heos schrieb:
> deshalb wäre ich für jede Hilfe dankbar!

Nimm einen PIC mit größerem Flash-ROM.

von Frank K. (fchk)


Lesenswert?

(a) größeren PIC nehmen (welcher ist es denn momentan GENAU?)
(b) nur float ODER double verwenden
(c) alles per Integer oder Festkomma machen

fchk

von Heos (Gast)


Lesenswert?

> Nimm einen PIC mit größerem Flash-ROM.

Sorry das hat natürlich gefehlt...

Es ist der dsPIC33fj12GP202. Dieser besitzt 12Kbyte Programmspeicher und 
1Kbyte RAM

von Frank K. (fchk)


Lesenswert?

Für die Entwicklung und Einzelstücke nimmt man am Besten den größten, 
also Bei Dir den dsPIC33FJ128GP202, und schaut dann, wie viel Speicher 
man nachher tatsächlich braucht.

Bei 12k Flash (also 4 kWorten) solltest Du Dir tatsächlich float und 
double verkneifen.

fchk

von Heos (Gast)


Lesenswert?

Es ist sehr merkwürdig: Mein Kollege hat ein ähnliches Programm für 
diesen PIC geschrieben, jedoch hat der bei weitem mehr printf-Befehle 
ausgeführt und der hat sogar einen long double reingehauen und der 
compiliert.

Ich schätze das müsste an meinen Compilereinstellungen in MPLAB liegen.

Jedoch habe ich keine Ahnung was ich das umstellen soll.

von W.S. (Gast)


Lesenswert?

Heos schrieb:
> Ich würde ungern auf float und double bei der Programmierung eines PICs
> verzichten, deshalb wäre ich für jede Hilfe dankbar!

Dann schmeiß dieses aufgeblähte printf weg und mach's zu Fuß. Beispiel 
dazu findest du in der Lernbetty.

W.S.

von Frank K. (fchk)


Lesenswert?

Heos schrieb:

> Ich schätze das müsste an meinen Compilereinstellungen in MPLAB liegen.
>
> Jedoch habe ich keine Ahnung was ich das umstellen soll.

Warum fragst Du nicht Deinen Kollegen und lässt Dir sein Projekt geben.

Das Map-File des Linkers ist auch immer eine gute Quelle. Da steht drin, 
was wie viel Speicher braucht.

Wenn Du wenig Speicher hast, solltest Du tatsächlich auf printf/scanf 
und float/double verzichten, insbesondere wenn Du keinen großen 
Dynamikbereich brauchst.

fchk

von Somebody123 (Gast)


Lesenswert?

Heos schrieb:
>> Nimm einen PIC mit größerem Flash-ROM.
>
> Sorry das hat natürlich gefehlt...
>
> Es ist der dsPIC33fj12GP202. Dieser besitzt 12Kbyte Programmspeicher und
> 1Kbyte RAM

Hallo,

ich kenne das Problem vom PIC24 (was die gleiche Lib ist).

Stringfunktionen aus der PIC24/dsPIC33 Standardlib sind leider verdammt 
teuer. 1x sprintf %f ->ein paar kBit weg.

Einfachste Lösung: Bürde die "komplexen" Sachen dem PC auf. Schicke dem 
die Floats roh, der muss das dann interpretieren. Der hat genug Dampf.

Oder drehe mal die Optimierungen des XC16 auf:
Projekt->Properties->XC16->xc16-gcc->Optimizations->Optimization level
Eventuell reichts ja. Das könnte das sein, was dein Kollege gemacht hat.

von Heos (Gast)


Lesenswert?

Ich habe das Problem gelöst:

Ich habe die Version des C30-Compilers von mir und meinem Kollegen 
verglichen.

Das Resultat: Ich hatte eine viel zu alte Version des Compilers, der 
float und double in einem printf-Befehl nicht drauf hatte.

Die Version 3.31 vom C30-Compiler sollte es tun.
Hier zu finden:
http://www.microchip.com/pagehandler/en-us/devtools/dev-tools-parts.html


Vielen Dank für eure Antworten!

Gruß,
Heos

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Somebody123 schrieb:
> 1x sprintf %f ->ein paar kBit weg.

Aber dafür ist der Unterschied zwischen 1x sprintf und 2x sprintf kaum 
noch wahrzunehmen.

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.