Forum: Mikrocontroller und Digitale Elektronik Not enough RAM


von Andi C. (spex)


Lesenswert?

Hallo,

als ich meine Firmware eines PIC16F876 um eine Funktion erweitert habe 
kommt die Fehlermeldung "Not enough RAM for all variables" zurück.

Dabei lag die Auslastung des RAMs vor der Erweiterung bei 44%!

Die zusätzliche Funktion sieht folgendermaßen aus:

putc(com);
putc(0);
putc(SC);

var=(float)wert*(0.004882813);    // 5V/1024 = 0.004882813

      var = var - off;

      sprintf(ascii,"%3.3f V",var);

      i=0;
          while ( ascii[i] != 0 )
           {
             putc( ascii[i++] );
           }

putc(CR);
break;



Gruß

von Marcus B. (raketenfred)


Lesenswert?

kanns sein, adss du probierst über das Ram ende hinauszulesen in der 
while schleife??

weil string ende ist docgh ein '\0' oder?!
=> endlosschleife
=>über ramende hinaus lesen

dann passt die fehlermelung nicht ganz aber halbwegs

mfg

von Peter D. (pdiener) Benutzerseite


Lesenswert?

Der genannte Controller hat ja nur 368 Byte RAM.
sprintf braucht sehr viel Speicher, gerade bei Gleitkommazahlen.

Grüße,

Peter

von Purzel H. (hacky)


Lesenswert?

Float ist schlecht und sprintf ebenso. Das float sollte man durch 
Ganzzahl (byte, int, word, longint, longword) ersetzen, das sprintf 
durch ein integer-to-ascii, mit dezimalpunkt falls noetig.

von Andi C. (spex)


Lesenswert?

Das Problem ist das ich keine Ganzzahl verwenden kann weil ich wegen der 
Genauigkeit eine Kommazahl benötige und eine float-to-ascii Funktion 
gibt es ja leider nicht.

von mobius (Gast)


Lesenswert?

Festkommaarithmetik ist dein freund.

gruss
Mobius

von ^-^ (Gast)


Lesenswert?

Andi C. schrieb:
> Das Problem ist das ich keine Ganzzahl verwenden kann weil ich wegen der
> Genauigkeit eine Kommazahl benötige und eine float-to-ascii Funktion
> gibt es ja leider nicht.

Oh doch, das kannst du. Beispielsweise indem du in Millivolt anstatt in 
Volt rechnest :-)

von Simon K. (simon) Benutzerseite


Lesenswert?

Eine 32 Bit Fließkommazahl ist nicht genauer als eine 32Bit 
Festkommazahl. Zumindest nicht bei richtiger Auslegung ;)

von Ich (Gast)


Lesenswert?

>Eine 32 Bit Fließkommazahl ist nicht genauer als eine 32Bit
>Festkommazahl.

Stimmt, die ist sogar schlechter nach IEEE 754 sind nur 23 bit für die 
Mantisse. Aber man hat einen größeren Wertebereich, den man nicht 
braucht :)

von Anja (Gast)


Lesenswert?

Simon K. schrieb:
> Eine 32 Bit Fließkommazahl ist nicht genauer als eine 32Bit
> Festkommazahl

Der ADC hat doch nur 10 Bit (Auflösung nicht Genauigkeit).

In Andis Fall ist die Rechnung mit Festkommaarithmetik sogar besonders 
einfach:
Er braucht nur eine 16-Bit-Variable und Multiplikation mit Faktor 2 
sowie Faktor 10.

1. Schritt: Multiplikation mit 2 und 10 (also gesamt Faktor 20).
Dadurch wird der ADC-Bereich auf Hexadezimal 0x5000 normiert.

Im High-Nibble steht schon der 1. BCD-Wert (Ganze Volt) für die 
Umwandlung nach ASCII. (Addition von 0x30)

2. Schritt: Einfügen des Kommas in die Ausgabe.

3. Schritt: abziehen des High-Nibble von der 16 Bit Zahl.
4. Schritt: Multiplikation vom Rest mal 10
   Im High - Nibble steht dann die nächste Ziffer als BCD.
5. Weiter bei Schritt 3 bis die notwendige Auflösung ausgegeben ist.

Gruß Anja

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.