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ß
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
Der genannte Controller hat ja nur 368 Byte RAM. sprintf braucht sehr viel Speicher, gerade bei Gleitkommazahlen. Grüße, Peter
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.
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.
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 :-)
Eine 32 Bit Fließkommazahl ist nicht genauer als eine 32Bit Festkommazahl. Zumindest nicht bei richtiger Auslegung ;)
>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 :)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.