- LiFePO4 Speicher Test         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 12

Thema: Rechnen mit Bascom ?? Kommastellen und Rundung ?!

  1. #1
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    29.10.2004
    Ort
    GRAZ
    Alter
    57
    Beiträge
    576

    Rechnen mit Bascom ?? Kommastellen und Rundung ?!

    Anzeige

    Praxistest und DIY Projekte
    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 ?

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    29.01.2004
    Beiträge
    2.441
    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.

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    29.10.2004
    Ort
    GRAZ
    Alter
    57
    Beiträge
    576
    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:

    Code:
    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

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    29.10.2004
    Ort
    GRAZ
    Alter
    57
    Beiträge
    576
    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.... ?!

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.11.2004
    Beiträge
    1.693
    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.

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    29.10.2004
    Ort
    GRAZ
    Alter
    57
    Beiträge
    576
    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...

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.11.2004
    Beiträge
    1.693
    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

  8. #8
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    29.10.2004
    Ort
    GRAZ
    Alter
    57
    Beiträge
    576
    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

  9. #9
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    29.01.2004
    Beiträge
    2.441
    @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.

  10. #10
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.11.2004
    Beiträge
    1.693
    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
    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

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress