www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Variable aufsplitten unter Bascom


Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wie kann ich eine Variable aufsplitten / aufteilen , zB. aus 43,5 drei 
einzelne Werte /Variablen machen (4 , 3 und 5)?

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
zum Beispiel durch rechnen.......

Du möchtest doch den Inhalt der Zehner-, der Einer- und der 
Nachkommastelle haben.

Otto

Autor: Paul Baumann (paul_baumann)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
@Otto
Genial! -Da wäre er nie drauf gekommen.....
;-)

@Peter
Guck mal in den Anhang, das kannst Du auf Dich anpassen.

MfG Paul

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Paul Baumann schrieb:
> @Otto
> Genial! -Da wäre er nie drauf gekommen.....
> ;-)

Ich schon, habe mich aber rausgehalten, weil (vermutlich unbekümmert) 
Fließkomma im Spiel ist.

>
> @Peter
> Guck mal in den Anhang, das kannst Du auf Dich anpassen.

Ich bin zwar nicht Peter, habe aber auch mal in den Anhang geschaut. Ich 
zitiere mal daraus:
Zahl = 1204                   'Voreinstellung zum Testen

For I = 1 To 4
 Stelle(i) = Temp Mod 10      'letzte Stelle in Ziffernvariable schreiben
 Temp = Temp / 10             'vorletzte Stelle zur letzten machen
Next I                        'das Ganze noch 3 x von vorn

Dir ist bewusst, dass Modulo eine Division ist, bei der man das Ergebnis 
wegwirft und nur den Rest verwendet?
Somit hast Du in jedem Schleifendurchlauf 2 Divisionen, die der AVR in 
Hardware nicht kann, also in Software erledigen muss. Da halte ich die 
Subtraktionsmethode zum Isolieren der Ziffern für ressourcenschonender 
(schneller und kleiner).
Stundenzehner = Stelle(4) * 10
Stundeneiner = Stelle(3) * 1
Stunden = Stundenzehner + Stundeneiner
Print Stunden
Minutenzehner = Stelle(2) * 10
Minuteneiner = Stelle(1) * 1
Minuten = Minutenzehner + Minuteneiner
Print Minuten

Und das funktioniert?

Angenommen, die "Zahl" sei 1204 (Dein obiges Beispiel) und ist durch 
Zählen der Minuten entstanden. Dann ergibt Deine Ausgabe 12 Stunden und 
4 Minuten. 1204 Minuten sind nach meiner Rechnung aber 20 Stunden und 4 
Minuten.

Wäre Deine Zahl 1199 (also 5 weniger), dann würde Deine Ausgabe 11 
Stunden und 99 Minuten ausgeben, es sind tatsächlich aber 19 Stunden und 
59 Minuten.

Auch hier bietet sich die Subtraktionsmethode zum Isolieren der Stunden, 
Minuten und evtl. auch Sekunden aus der "fortlaufenden Zahl" an, weil 
sie einfach effektiver ist und nebenher auch noch korrekte Ergebnisse 
liefert.

>
> MfG Paul

@Peter:

Überdenke bitte erstmal, ob Du unbedingt Dezimalbrüche brauchst.

Oft ist es besser, mit Ganzzahlen (Integer, Long) zu arbeiten, da die 
Rechenalgorithmen einfacher und somit schneller sind. Man skaliert dazu 
einfach auf das 10-fache (100-fache, 1000-fache) der gewünschten Einheit 
und schummelt bei der Ausgabe der Zahl das Dezimalkomma an die richtige 
Stelle. Leider unterstützt das (das Einschummeln des Kommas) weder der 
Bascom-Befehl PRINT noch der Bascom-Befehl LCD. Man muss also die 
Ausgabe (Zerlegung des Ergebnisses in Ziffern) auch selbst machen. Dies 
ist aber (bei Ganzzahlen) mit der Subtraktionsmethode schnell erledigt.

Achja, ich gehe vom AVR aus, beim '8051 sieht das anders aus, der kann 
wohl (wenn ich richtig informiert bin) in Hardware dividieren.

...

Autor: Paul Baumann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Und das funktioniert?

Allerdings! Sonst hätte ich es nicht gepostet. Probier es doch einfach 
mal im Simulator. Ich habe die Schnauze voll von dieser verdammten 
Belehrerei.

Paul

Autor: Weingut Pfalz (weinbauer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
auch eine Variante wäre Du definierst nen String

dim string_var as string *10

und ne Overlayvariabel

dim char_array (11) as byte at string_var overlay

dann machst Du per fusing nen String aus Deinem wert
und die einzelnen Zeichen kannst Du einfach aus dem
Array lesen.

Kommt halt drauf an was mit den Werten dann noch passieren
soll.

Autor: Paul Baumann (paul_baumann)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Weinbauer

Ja nicht! Das ist eine Methode, die Hannes überhaupt nicht leiden kann.
Das weiß ich aus Erfahrung.

Paul

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Paul Baumann schrieb:
> @Weinbauer
>
> Ja nicht!

Wieso nicht? ist doch clever und vermeidet allerhand Stringfunktionen. 
Wie effizient es gegenüber der Subtraktionsmethode ist, könnte man durch 
Analyse des rückassemblierten Maschinencodes und durch Simulation 
ermitteln. Da ich aber nicht die Absicht habe, tiefer in die 
Bascom-Materie vorzudringen, werde ich das nicht tun.

> Das ist eine Methode, die Hannes überhaupt nicht leiden kann.

Das ist eine Verallgemeinerung, die so nicht stimmt, weil sie Äpfel mit 
Birnen vergleicht.

Was mir damals an Deinem Programm nicht gefallen hat, war etwas völlig 
Anderes:

- Zahl mit STR() zum String wandeln
- Ziffern mit MID() ausschneiden
- Ziffern mit VAL() wieder zu Zahlen machen
- Segment-Bitmuster für 7-Segment-Anzeige mit SELECT CASE zuweisen
- und das alles im Interrupt, in dem keine Zeit für solche Spielchen
  ist...

> Das weiß ich aus Erfahrung.

Aus Erfahrung müsstest Du wissen, dass ich meine Programme in ASM 
schreibe und ganz gut ohne Bascom zurecht komme.

Dass ich mich überhaupt mit Bascom befasst habe, ist einzig und allein 
darin begründet, dass ich Dir bei einigen Programmen geholfen habe, bei 
denen Du alleine nicht so recht weiter gekommen bist. Und dabei bin ich 
nicht tiefer in die Besonderheiten von Bascom eingedrungen, als für die 
damaligen Probleme unbedingt nötig war.

Ich bin also nicht der typische Bascom-Benutzer und kenne daher auch 
nicht alle Einzelheiten von Bascom, auch nicht den gesamten Wortschatz 
(Befehle, Anweisungen, Funktionen), denn ich brauche das einfach nicht.

Daher wusste ich zu der Zeit "Deiner Erfahrung" auch nicht, dass man mit 
"Dim as Overlay" ein Byte-Array auf einen String mappen kann und so den 
String durch einfachen (im Gegensatz zu MID() schnellen) indizierten 
Variablenzugriff zerlegen kann. Auch über FUSING und FORMAT wusste ich 
damals nicht bescheid. Und da ich von Fachleuten gelesen hatte, dass das 
Zerlegen von Zahlen zu Ziffern beim AVR in ASM mit der 
Subtraktionsmethode am schnellsten ist, wählte ich auch in Bascom diese 
Methode. Denn der AVR kann nunmal kein Basic, also muss auch Bascom den 
Code in Maschinencode (in ASM notierbar) umwandeln. Und der Erfolg gab 
uns doch damals recht, oder?

>
> Paul

Achja, inzwischen muss ich auch die Behauptung zurücknehmen, dass Bascom 
bei Festkomma-Arithmetik keinen Dezimalpunkt in die Ausgabe schummeln 
könnte.
Beitrag "Re: Variable aufsplitten unter Bascom" 
(vorletzter Absatz)
Es geht, und zwar mittels FORMAT(). Ob es aber effizienter ist als eine 
eigene Ausgaberoutine nach dem Subtraktionsverfahren, das kann (und 
möchte) ich nicht beurteilen. Es ist mir auch nicht wichtig, da ich 
meine Vorhaben ganz gut ohne Bascom realisieren kann.

...

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.