www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Umgang mit float Typ in C 89C51CC03


Autor: Gerd F. (gerd_f)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

brauche kurz Hilfe beim Umgang mit float Variablen. Ich möchte die 
entnommenen Ah von meinen 12V Verbauchern berechnen. Wenn ich mit int 
variablen rechne lässt sich das Programm compilieren, der int Bereich 
ist aber zu klein, da ich dann in mAh rechnen muss, da überläuft die 
Variable dann bald.

Wenn ich long oder float nehme, kommt die Fehlermeldung
"Error: nearbss: out of memory (full), sclass 'dram' at address $7d 
(max. addr. $80)" vom Compiler. Der Speicher kann aber nicht schon voll 
sein oder?

Der Programmteil sieht so aus:

float strom;
float Ah=0;

wait(1)
{
(Stromfluss ermitteln)
Ah = Ah + ( strom / 3600 ); //Fuktioniert nur wenn typ int

_wait_ms(1000);
}

Wieso macht er das nicht und wie könnte man die Berechnung sonst 
angehen?

Gruss
Gerd

Autor: LP90 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gib doch mal die Wertebereiche und gewünschte Auflösung von strom und Ah 
an. Dann können wir mal sehen, ob es eine andere Möglichkeit gibt.

Ob dein Speicher reicht, liegt natürlich auch am Rest des Programms.

Autor: Gerd F. (gerd_f)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Strom geht von 0-150A, den messe ich mit einem 12bit ADC also in ca. 
36,6mA Schritten (ADC Wert * 0.0366300366300366 = Strom in A). Dann 
messe ich noch 2 Spannungen auch als float von 0-20V über 10bit ADC. 
Aberauch wenn ich die Spannungsmessung weg nehme, geht es trotzdem 
nicht.

Gruss
Gerd

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gerd F. schrieb:
> Der Speicher kann aber nicht schon voll
> sein oder?

Woher sollen wir das wissen?

Zeig mal das Map-File (aber als Anhang!).


Peter

Autor: Gerd F. (gerd_f)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht noch was als Ergänzung:

So lässt sich das Programm kompilieren:
Ah =  strom / 3600 ;

Und so eben nicht:
Ah = Ah + ( strom / 3600 );

Autor: Carlos (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Gerd,
der Grund für die Fehlermeldung könnte darin liegen, daß Du in Deinem 
Compiler (welchen benutzt Du eigentlich ??) das falsche Speichermodel 
eingestellt hat.
Wenn Du ´Small´nimmst, werden die Variablen im internen RAM des CC03ers 
abgelegt und dieser Bereich ist sehr klein (darauf läßt die 
Fehlermeldung schließen:

"max. addr. $80"

Versuche das Speichermodel auf ´Large´ umzustellen, dann werden die 
Variablen im externen RAM abgelegt (der natürlich vorhanden sein muß).

Viele Grüße
Carlos

Autor: Gerd F. (gerd_f)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter Dannegger schrieb:
> Gerd F. schrieb:
>> Der Speicher kann aber nicht schon voll
>> sein oder?
>
> Woher sollen wir das wissen?
>
> Zeig mal das Map-File (aber als Anhang!).
>
>
> Peter

Welches ist das Map-File. Ich arbeite mit JFE, das kommt mit der 
Wickenhaeuser IDE. http://wickenhaeuser.de/

Gerd

Autor: Carlos (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Gerd,
dann stell unter

MakeWiz - C-Compiler - Memory-Modell

einfach einmal ´Large´ ein und übersetze das Programm neu.

Carlos

Autor: Gerd F. (gerd_f)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Carlos schrieb:
> Versuche das Speichermodel auf ´Large´ umzustellen, dann werden die
> Variablen im externen RAM abgelegt (der natürlich vorhanden sein muß).

Externen RAM hab ich leider nicht angeschlossen, ich wollte das mit dem 
internen schaffen. Wieso sage er max adresse 80h, das ist bei 128bytes 
der cc03er hat aber 256 bytes.

Gerd

Autor: Gerd F. (gerd_f)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Carlos schrieb:
> Hallo Gerd,
> dann stell unter
>
> MakeWiz - C-Compiler - Memory-Modell
>
> einfach einmal ´Large´ ein und übersetze das Programm neu.
>
> Carlos

Ok, ich versuchs.

Gerd

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Carlos schrieb:
> einfach einmal ´Large´ ein und übersetze das Programm neu.

Dann kracht es.
Du mußt erst dem Compiler sagen, ob und wo der XRAM sich befindet und 
ihn eventuell erstmal enablen.

Nicht einfach drauflos ändern, sondern erstmal die Ursache für Dein 
Problem finden.

Der direkte RAM ist 128 Byte groß, das ergibt abzüglich der ersten 
Registerbank 120 Byte = Platz für 30 float Variablen.

Wie Du ein Map-File erzeugst, sollte im Manual zu Deinem Compiler 
stehen.


Peter

Autor: Carlos (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Gerd,
der C-Compiler bzw. das übersetzte Programm benötigt ja auch noch für 
seine Arbeit RAM-Speicherplatz und den nimmt es aus dem internen RAM.
Und wenn jetzt noch Deine selbst angelegten Variablen hinzukommen, wird 
es sehr schnell knapp.
Vor allen Dingen wenn Du float Variablen anlegst: eine Variable benötgt 
immerhin 4 Byte und wenn Du dann noch damit rechnest, reicht der 
Rest-RAM-Speicher meist nicht mehr aus und man muß in den externen 
RAM-Bereich gehen.
Wenn Du keinen externen RAM angeschlossen hast, wird es an dieser Stelle 
sehr kritisch, d.h. das Programm wird so nicht funktionieren.

Carlos

Autor: Carlos (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Peter:
Es muß i.a. nicht krachen, wenn man den ext. RAM standardmäßig bei 0000 
angeschlossen hat.
Dann passen nämlich die Grundeinstellungen von MakeWiz.
Außerdem muß man hier nichts weiter enablen.

Carlos

Autor: Gerd F. (gerd_f)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Carlos schrieb:
> @Peter:
> Es muß i.a. nicht krachen, wenn man den ext. RAM standardmäßig bei 0000
> angeschlossen hat.
> Dann passen nämlich die Grundeinstellungen von MakeWiz.
> Außerdem muß man hier nichts weiter enablen.
>
> Carlos

Was ist denn mit dem Upper Ram, der cc03er hat ja 256byte Ram und dann 
gibts da drin auch noch das ERAM 2048 bytes, kann man das nicht auch 
verwenden anstatt externes anzuschliessen?

Ich hab das Memorymodell mal auf large gesetzt, momentan läuft das 
Programm ,ob die Werte stimmen muss ich aber noch prüfen.

Gerd

Autor: Carlos (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Gerd,
eine kleine Korrektur meinerseits:
der CC03er hat ja bereits einen 2 kByte großen RAM-Bereich auf dem Chip 
(ERAM), der als externes RAM angesprochen wird.
Durch Auswahl des Memory-Models ´Large´ wird dieser Bereich auch als 
ext. RAM benutzt und Dein Programm müßte jetzt laufen.
Du hast ja schon geschrieben, daß Du Dein Programm jetzt fehlerfrei 
übersetzen kannst.

Carlos

Autor: Gerd F. (gerd_f)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Carlos,

ja super, das war der ensprechende Hinweis, ich hab grad im Datenblatt 
nachgeschaut, defaultmässig ist das Register AUXR so gesetzt, dass er 
das interne ERAM verwendet, für XRAM müste man das Bit entsprechend 
ändern, darum funktioniert es jetzt auch und mit soooo viel Speicher 
kann ich ja jetzt richtig wüten ..hehe...

Gruss
Gerd

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.