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


von Gerd F. (gerd_f)


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

von LP90 (Gast)


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.

von Gerd F. (gerd_f)


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

von Peter D. (peda)


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

von Gerd F. (gerd_f)


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 );

von Carlos (Gast)


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

von Gerd F. (gerd_f)


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

von Carlos (Gast)


Lesenswert?

Hallo Gerd,
dann stell unter

MakeWiz - C-Compiler - Memory-Modell

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

Carlos

von Gerd F. (gerd_f)


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

von Gerd F. (gerd_f)


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

von Peter D. (peda)


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

von Carlos (Gast)


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

von Carlos (Gast)


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

von Gerd F. (gerd_f)


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

von Carlos (Gast)


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

von Gerd F. (gerd_f)


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

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.