PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Rechnen mit Bascom ?? Kommastellen und Rundung ?!



Roberto
20.03.2005, 00:19
Hallo

Ich ärgere mich gerade mit dem Rechnen mit dem Mega8 herrum
(Temperatur Ausgabe)

Da ist mir gerade was aufgefallen:


Dim A As Long

Wenn ich so rechne:
A = 3 * 0.63
LCD A

kommt 2 raus
Ist normal 1,89 aber durch aufrunden könnte man ja sagen es sind 2

Wenn ich aber ohne Komma , so rechne:

A= 3*63
A=A/100
LCD A

Kommt nur 1 raus.

Eigentlich sollte ja auch 1,89 rauskommen....
Warum rundet Bascom da jetzt auf 1 ab ??

Oder wird beim obigen Beispiel gerundet und beim unteren Beipiel nur das Komma abgeschnitten ?

Wie kann ich machen, dass mir das Komma (am LCD ) angezeigt wird ?

Kennt jemand vielleicht einen Link, wo gut beschrieben wird, wie man mit Bascom (gut) rechnen kann ?

recycle
20.03.2005, 01:51
Warum rundet Bascom da jetzt auf 1 ab ??


Du hast A als "Long" deklariert und der Datentyp Long ist eine 4 Byte grosse Ganzzahl, d.h. eine Zahl ohne Kommastellen.

Wenn du A mit mit 0.63 multiplizierst, nimmt Bascom vermutlich automatisch für A eine Typumwandlung vor, weil an dem Dezimalpunkt in 0.63 eindeutig zu erkennen ist, dass du mit Kommastellen rechnen möchtest.

Wenn du A mit einer Ganzzahl z.B. 63 Multiplizierst und durch eine Ganzzah ,z.B. 100 teilst ist nicht eindeutig klar, dass du mit Dezimalstellen rechnen möchtest und Bascom nimmt keine Typumwandlung vor. Daher wird dir für A als ganzzahliger Datentyp die 2 ausgegeben.

Kannst ja mal versuchen A mit 63.0 zu Multiplizieren und durch 100.0 zu teilen. Vermutlich kommt dann nicht mehr 2 raus.



Eigentlich sollte ja auch 1,89 rauskommen....

Dann deklariere A mal als Single oder Double.



Kennt jemand vielleicht einen Link, wo gut beschrieben wird, wie man mit Bascom (gut) rechnen kann ?


Ein paar Infos dazu findest du in der Bascom Hilfe unter "Language Fundamentals".
Dort sind auf jeden Fall die verschiedenen Datentypen beschrieben und du findest ein paar Infos, warum bei manchen Berechnungen kein genaues Ergebnis rauskommen kann.


Das Problem über das du hier gestolpert bist, findest du aber in den meisten anderen Programmiersprachen auch. Wenn du irgendwo ein Buch oder ein Forum zu C, C++, Java usw. findest, kannst du da auch mal die Themen Datentypen, Deklaration von Variablen, und Typumwandlung nachschlagen.

Roberto
20.03.2005, 05:25
Hallo

Danke für die Erklärung!
Hätte da noch ne Frage ;-)

Habe das Programm jetzt weitergeschrieben und auf einmal mag er das Long nicht mehr :-(

Habe jetzt:



Dim Ad0 As Word
Dim Ad00 As Long
Dim Ad1 As Word
Dim Ad11 As Word

Ad0 = Getadc(0)
Ad00 = Ad0 - 491
Ad00 = Ad00 * 63 '
Ad00 = Ad00 / 100
Ad00 = Ad00 + 22

Ad1 = Getadc(1)
Ad11 = Ad1 - 491
Ad11 = Ad11 * 63
Ad11 = Ad11 / 100
Ad11 = Ad11 + 22

LCD Ad00
LCD Ad11



bekomme so immer einen Error von:
Error 999: Line 185 Demo/beta only supports 2048 bytes of code , in File...

Diese Meldung kommt 3 mal gleich!

Line 185 ist die letzte vom Programm.
Bei doppelklick, springt er auf keine Zeile ?

Als ich das noch mit einem ADC (0) machte, gab es da zuerst auch Probleme, aber dann ging es irgendwie ?!
Jetzt habe ich den Getadc(1) dazu und schon wieder diese Meldung :-(

Roberto
20.03.2005, 05:56
Irgendwie spinnt der Compiler ?! :-(

Jetzt hatte ich das dazugeschrieben:

Ad0 = Ad00
und
Ad1= Ad11
(am Ende von den Umrechnungen)

und dann Ad1 und Ad0 mit LCD ausgegeben.
Funktioniert.
(ausser -1 geht dann halt nicht bei der Temp. Anzeige)

Dann habe ich wieder alles zurückgeändert und auf einmal gibt er mit auch das Long mit dem LCD Ad00 und Ad11 aus ???

Komisch.... ?! :-(

Marco78
20.03.2005, 08:52
Demo/beta only supports 2048 bytes of code bedeutet das du mit der Demo-Version von BASCOM max. 2k Code ersellen kannst.
Für 2049 bytes Programmcode brauchst du also die Vollversion.
Oder die neuste Demo, die soll wohl auch 4k können. Dazu aber erst den Hinweis hier im Forum beachten. Es gibt da noch ein Bug.

Ich denke mal du hast die Kapazität der Demo-Version schon ziemlich ausgereizt.

Roberto
20.03.2005, 16:25
Weis nicht so recht ?!

Diese Meldung kommt eben auch, wenn ich eine falsche Variablen-Bezeichnung eingebe.

Siehe oben halt mit long.

Nach dem oberen hin und her, geht auf einmal aber das Long und es gibtr auch keinen Error mehr ??

Wo sieht man den , wie gross das File ist ?
Im Compiler sthet oben :
Programmed 784
und der Balken ist nur ca. 1/4 voll.

Das HEX-File hat 5kB aber das kann man vermutlich nicht so umrechnen ?

Wie gesagt, vorher durch ersetzen von long durch word, war der Error auch weg und jetzt gehts mit long auch ?? komisch...

Marco78
20.03.2005, 19:33
1/4 voll von wieviel?
Was für ein AVR verwendest du denn?
Wieviel Speicher der Programmcode belegt steht unten links im Programmer nach dem compilieren. Ob man es noch wo anders sehen kann weiss ich nicht.

Nachtrag: Ich seh grade Mega8. 1/4 von 8kb sind ja 2kb ;)

Roberto
20.03.2005, 20:54
ups.
ja stimmt:
Da steht 2030 Byts gelesen :-(

Jetzt habe ich mal im Programm ein paar Zeilen gelöscht...
Habe jetzt 1934 Byts
Dann eine Dim Anweisung mit Long durch Word ersetzt.
Dann habe ich gleich 2040 Byts..

Das macht ja schön viel aus :-(

recycle
20.03.2005, 21:06
@Roberto


Diese Meldung kommt eben auch, wenn ich eine falsche Variablen-Bezeichnung eingebe.
Siehe oben halt mit long.

Der Datentyp Long belegt 4 Byte pro Wert, der Datentyp Word nur 2.
Wenn du sowieso schon an der Speichergrenze des Controllers oder der 2k Begrenzung der Demo-Version kratzt, kann es gut sein, dass du die Begrenzung durch den Wechsel von Word auf Long überschreitest. Dann wäre die Fehlermeldung völlig richtig.

Auch wenn du den Datentyp nur für eine einzige Variable änderst, wird eventuell die ganze Berechnung mit Long-Werten statt mit Word-Werten durchgeführt. D.H. du brauchst nicht nur einmal sondern eventuell mehrfach die 2 Byte Unterschied zwischen Word und Long mehr.

Ausserdem musst du bedenken, dass manche Berechnungen die dir als Quelltext eventuell ganz trivial erscheinen für einen Controller sehr viele Rechenoperationen erfordern.
Eine Multiplikation oder eine Division von Fliesskommazahlen ist in Maschinensprache wesentlich aufwendiger als sie im Bascon-Quelltext aussieht. Hierbei kommt es soweit ich weiss auch noch drauf an welchen Controller du verwendest. Ich glaube manche AVRs unterstützen die Multiplikation intern, dann dürfte der Quellcode den Bacom generieren muss kürzer ausfallen als bei kleineren AVRs die die Multiplikation nicht unterstützen.

Bei den begrenzten Speicherkapazitäten die so ein MC hat, macht es Sinn sich genau zu überlegen, welche Datentypen man verwendet und bei Berechnungen lohnt es sich ein bischen länger zu überlegen welche Rechenschritte wirklich notwendig sind und ob sie sich eventuell vereinfachen lassen.
Manchmal lässt sich durch eine kleine unscheinbare Änderung die sich auf das Ergebnis kaum auswirkt eine ganze Menge Speicher sparen.
Im Zweifelsfall würde ich ein bischen rumprobieren, der Bascom Compiler zeigt dir ja ungefähr an wieviel Speicher dein Programm nach der Compilierung belegt.

Falls du die Demo-Version von Bascom benutzt, würde ich mir mal die aktuelle Version 1.11.7.7 herunterladen. Die unterstützt Programme bis 4 kB Grösse und nicht nur 2kB wie die Vorgängerversion.

Marco78
20.03.2005, 21:11
Die neuste Demo von BASCOM soll bis 4096Bytes frei sein. Getestet habe ich es noch nicht, nur hier gelesen.

Tja, da fühle ich mich wieder in C16-Zeiten zurück versetzt :D
Damals war der Speicher für Programme auch knapp. 12Kb für BASIC.

Einige Befehle, die das gleiche bewirken als andere verbrauchen zum Teil weniger Code.
LOCATE 1,1 braucht mehr Code als Upperline.
Labels verbrauchen auch viel Speicher.
Wenn man schon hart an der Grenze ist, probiert man vieles um Speicherplatz zu sparen ;)
Und man überlegt ob man nicht doch auf Assembler umsteigt. Da sind der Platz und die Ausführungszeiten überschaubarer. Aber warum, so lange es mit BASCOM noch geht :D

Roberto
21.03.2005, 15:55
Hallo

Habe jetzt die neue Version V1.11.7.7 probiert.
Dort ist die Grenze auch 2K

Ich glaube das mit den 4 K ist eher ein Gerücht.
Von wo anders habe ich jetzt gehört, dass sich die 4K auf ein anderes Programm beziehen... (AVr Basic oder so...) und nicht auf Bascom.

Bei der neuen Version V1.11.7.7 kommt leider nicht mal mehr eine Fehlermeldung, wenn ich die 2K überschreite.
Ich merke das dann nur mehr, wenn er das File zum Downloaden nicht mehr laden kann.

Aber danke für Eure Antworten :-)

Dnerb
21.03.2005, 22:19
Hi,

nein, das mit den 2Kb ist kein Gerücht!

Da Du von der 1.11.7.7 schreibst, hast Du sicher diesen Thread: https://www.roboternetz.de/phpBB2/viewtopic.php?t=6432 übersehen.

Downloaden, wie im Thread beschrieben vorgehen und viel Spaß mit der 4Kb Demo haben. :) Und dann meldet sich Bascom mit 1.11.7.8.

Ich habe mir inzwischen Bascom gekauft, denn mein Aktuelles Projekt ist über die 4KB schon hinaus...
Und die gute Arbeit von Mark wollte ich einfach belohnen!

Gruß Bernd