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
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.
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
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
Vielleicht noch was als Ergänzung: So lässt sich das Programm kompilieren: Ah = strom / 3600 ; Und so eben nicht: Ah = Ah + ( strom / 3600 );
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
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
Hallo Gerd, dann stell unter MakeWiz - C-Compiler - Memory-Modell einfach einmal ´Large´ ein und übersetze das Programm neu. Carlos
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
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
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
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
@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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.