Messwertdarstellung: Feste Anzahl Digits, Verschiebbares Komma

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

    Hinweis kann nach Kenntnisnahme deaktiviert werden!

    • Messwertdarstellung: Feste Anzahl Digits, Verschiebbares Komma

      Hallo Leute,

      ich möchte auf einem LCD-Dispay einen Messwert darstellen.


      Ziel: Feste Anzahl Digits, verschiebbares Komma (Automatisch in Abhängigkeit des Messwerts)

      1.00000
      10.0000
      100.000
      1000.00
      10000.0


      Bisherige Vorgehensweise:

      - Mit Format habe ich es schon versucht, allerdings bleibt dann das Komma stehen.
      - Bascom Hilfe: Hab ich schon quer gelesen, habe allerdings nichts gefunden, was mich hier weiterbringen würde.

      Hat jemand eine zündende Idee? Wie macht man sowas?

      Danke und Gruß,

      Marcus :)


    • Hi,
      die Variable ist vom Typ "Single" und kommt direkt aus dem AD-Wandler.
      "Fusing" kenne ich, danke. Allerdings kann man mit "Fusing" nur auf eine bestimmte Nachkommazahl runden bzw. eine bestimmte Nachkommazahl ausgeben.

      Mit "Fusing" auf zwei Stellen in Verbindung mit "Format" sieht es folgendermaßen aus:

      ___1.00
      __10.00
      _100.00
      usw.....

      Komma bleibt also fest...... ( Die Striche sind Leerzeichen und werden nicht als "Striche" am Display dargestellt)

      Ich brauche es aber so:

      Ziel: Feste Anzahl Digits, verschiebbares Komma (Automatisch in Abhängigkeit des Messwerts)

      1.00000
      10.0000
      100.000
      1000.00
      10000.0

      Gruß Marcus
    • Dann mach halt eine Abfrage

      if Messwert <10 then anzeige=fusing(Messwert, #.#####)
      if Messwert<100 then anzeige=fusing(Messwert,#.####)
      ...
      in der Art halt oder mit select case ist es vielleicht übersichtlicher
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Ich habe für unsere Geräte diese Subroutine geschrieben. Funktioniert prima:

      Sub Einruecken_Lcd(byval Anzeigewert As Long)
      Menue_z_space = 0
      Select Case Anzeigewert
      Case Is < 10 : Menue_z_space = 4
      Case Is < 100 : Menue_z_space = 3
      Case Is < 1000 : Menue_z_space = 2
      Case Is < 10000 : Menue_z_space = 1
      End Select
      LCD Space(menue_z_space) ; Anzeigewert
      End Sub


      Gruß Harald
      Wem ich nicht ausdrücklich widerspreche, der darf das bis auf Widerruf als "Gefällt mir" verstehen.
    • tschoeatsch schrieb:

      Dann mach halt eine Abfrage

      if Messwert <10 then anzeige=fusing(Messwert, #.#####)
      if Messwert<100 then anzeige=fusing(Messwert,#.####)
      ...
      genau so


      Anzeige sollte aber ein String sein.

      Dim Messwert As Single, Anwert As String * 10

      Anwert = Str(Messwert)

      If Messwert < 1 Then
      Anwert = Fusing(Messwet, „#.#####)
      End IF

      ...

      ...

      If Messwert > 1000 Then
      Anwert = Fusing(Messwet, „#.#)
      End IF

      Print Anwert

      Gruß
    • Habe übersehen, dass Du auch die Nachkommestellen formatieren willst. Dann einfach so:

      Sub Einruecken_Lcd(byval Anzeigewert As Long)
      Select Case Anzeigewert
      Case Is < 10 : anzeigewert=Fusing(Anzeigewert #.####)
      Case Is < 100 : anzeigewert=Fusing(Anzeigewert #.###)
      Case Is < 1000 : anzeigewert=Fusing(Anzeigewert #.##)
      Case Is < 10000 : anzeigewert=Fusing(Anzeigewert #.#)
      End Select
      LCD Anzeigewert
      End Sub

      Gruß Harald
      Wem ich nicht ausdrücklich widerspreche, der darf das bis auf Widerruf als "Gefällt mir" verstehen.
    • hasta schrieb:

      Habe übersehen, dass Du auch die Nachkommestellen formatieren willst. Dann einfach so:

      Sub Einruecken_Lcd(byval Anzeigewert As Long)
      Select Case Anzeigewert
      Case Is < 10 : anzeigewert=Fusing(Anzeigewert #.####)
      Case Is < 100 : anzeigewert=Fusing(Anzeigewert #.###)
      Case Is < 1000 : anzeigewert=Fusing(Anzeigewert #.##)
      Case Is < 10000 : anzeigewert=Fusing(Anzeigewert #.#)
      End Select
      LCD Anzeigewert
      End Sub

      Gruß Harald
      Aber sub Einruecken_lcd(byval Anzeigewert as string*8)
      Nee, so geht es auch nicht, du brauchst eine 2. Variable. Innerhalb fusing ein single, Ergebnis ein string.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Wenn ich Dich richtig verstanden habe, Marcus, dann brauchst du es so:

      Quellcode

      1. select case xval
      2. case is >=10000:
      3. s = fusing(xval,"#.#")
      4. case is >=1000:
      5. s = fusing(xval,"#.##")
      6. case is >=100:
      7. s = fusing(xval,"#.###")
      8. case is >=10:
      9. s = fusing(xval,"#.####")
      10. case else :
      11. s = fusing(xval,"#.#####")
      12. end select
      13. s = format(s,"000000")
      Alles anzeigen
      EDIT: s ist vom Typ String und xval ist ein single
    • Galahat schrieb:

      Wenn ich Dich richtig verstanden habe, Marcus, dann brauchst du es so:

      Ob mit IF oder Case ein Filter zubasteln ist „Geschmackssache“.
      Der Variable- Typ ist das Maß aller Dinge für die gewünschte Darstellung.
      Hatte ich in #6 schon mal grob geschrieben.
    • fredred schrieb:

      Ob mit IF oder Case ein Filter zubasteln ist „Geschmackssache“.
      Der Variable- Typ ist das Maß aller Dinge für die gewünschte Darstellung.
      Hatte ich in #6 schon mal grob geschrieben.
      Ja, ja Fred...grob.

      Eine zweite Varante die mir kam:

      Quellcode

      1. Config Single = Scientific , Digits = 6
      2. select case xval
      3. case is >=10000:
      4. print str(xval,1)
      5. case is >=1000:
      6. print str(xval,2)
      7. case is >=100:
      8. print str(xval,3)
      9. case is >=10:
      10. print str(xval,4)
      11. case else :
      12. print str(xval,5)
      13. end select
      Alles anzeigen

      xval ist hier ein single.



      EDIT: etwas kompakter...

      Quellcode

      1. Config Single = Scientific , Digits = 6
      2. dim n as byte
      3. select case xval
      4. case is >=10000: n = 1
      5. case is >=1000: n = 2
      6. case is >=100: n = 3
      7. case is >=10: n = 4
      8. case else: n = 5
      9. end select
      10. print str(xval,n)
      Alles anzeigen
    • Galahat schrieb:

      Ja, ja Fred...grob.

      Eine zweite Varante die mir kam:
      Ja nun mein Nachtrag. Bissel spät.

      Hallo Marcus,
      ich frage mich was für hochgenaue Werte(mit 5 Nachkommastellen) du zur Anzeige bringen musst oder willst. Mit Hinweis: „kommt direkt aus dem AD- Wandler“ wäre es schon sehr sportlich so präzise ein Analogwert zu erfassen.
      Vermute aber es geht er in Richtung formatierte Anzeige um die vielen eventuellen Kommastellen auszublenden.
      Wenn du eine formatierte Anzeige für Single wünscht hat doch Bascom ein schönes Makro bereit gestellt.
      [Config Single = Scientific, Digits = x ] ( x kann 1 für nur eine Kommastelle sein).
      Kleiner Nachtteil ist, ist eine Art Fuse- Einstellung(grundsätzlich) im Code für alle Single gültig.
      Bitte entschuldige meine Frage. Möchte einfach wissen warum braucht jemand so was.
      Antwort könnte doch ein neuer Ansatz für eigene Projekte sein.
      Mit freundlichen Grüßen

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von fredred ()

    • Hallo Leute,

      wow, da ist ja ganz schön was zusammengekommen. Danke erstmal für Eure Hilfe!!!

      Ich werde es entsprechend ausprobieren und dann schreiben wie es lief. Sieht aber vielversprechend aus.

      @Galahat: Du stellst die berechtigte Frage, warum so viele Stellen bei einem lumpigen 10-BIT ADC ;)
      Als erstes hierzu sei gesagt, dass das Messsgnal zahlreiche Messbereichsumschalungen durchläuft bevor es dem ADC zugeführt wird.
      Somit kann man einen weiten Messbereich abdecken und die "lumpige" ADC-Auflösung ist dann plötzlich gar nicht mehr so schlimm.
      Ich muss Widerstandswerte darstellen, und zwar von einigen 10mR bis MOHM. Und ich möchte wenige Stellen haben und trotzdem noch ausreichend Genauigkeit.
      Deshalb erschien mir die Lösung mit den festen Stellen und wanderndem Punkt am effektivsten. (Die 5 Kommastellen bei 1.00000 brauch ich natürlich nicht, aber bei der Umsetzung meiner Idee wär das dann einfach Prinzipbedingt so)
      Aber - Du hast mich auf eine Idee gebracht. Ich könnte auch die Einheit wechseln und dafür weniger Dezimalstellen verwenden. (mOhm ,Ohm, KOhm, MOhm)
      Wär vielleicht eleganter.........das überleg ich mir mal noch...


      Danke und noch einen schönen Abend wünscht Euch,

      Marcus

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Marcus ()

    • Marcus schrieb:

      @Galahat: Du stellst die berechtigte Frage, warum so viele Stellen bei einem lumpigen 10-BIT ADC
      Als erstes hierzu sei gesagt, dass das Messsgnal zahlreiche Messbereichsumschalungen durchläuft bevor es dem ADC zugeführt wird.
      Somit kann man einen weiten Messbereich abdecken und die "lumpige" ADC-Auflösung ist dann plötzlich gar nicht mehr so schlimm.
      Ich muss Widerstandswerte darstellen, und zwar von einigen 10mR bis MOHM. Und ich möchte wenige Stellen haben und trotzdem noch ausreichend Genauigkeit.
      Deshalb erschien mir die Lösung mit den festen Stellen und wanderndem Punkt am effektivsten.
      Aber - Du hast mich auf eine Idee gebracht. Ich könnte auch die Einheit wechseln und dafür weniger Dezimalstellen verwenden. (Ohm, KOhm, MOhm)
      Das überleg ich mir mal noch......
      Hallo Marcus
      Also, die Frage kam nicht von mir :rolleyes: , doch ich denke auch für eine Anzeige mit Bereichsumschaltung ist eine Darstellung wie Du sie ja bereits anstrebst, nicht unüblich.
      Mit den Codes aus #13 hast Du ja schon mal die Basis dazu.... Ohne Fusing oder Format.