mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Not enough RAM


Autor: Andi C. (spex)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: Marcus B. (raketenfred)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Diener (pdiener) Benutzerseite
Datum:

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

Grüße,

Peter

Autor: Zwölf Mal Acht (hacky)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andi C. (spex)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: mobius (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Festkommaarithmetik ist dein freund.

gruss
Mobius

Autor: ^-^ (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: Simon K. (simon) Benutzerseite
Datum:

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

Autor: Ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :)

Autor: Anja (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.