- fchao-Sinus-Wechselrichter AliExpress         
Seite 3 von 5 ErsteErste 12345 LetzteLetzte
Ergebnis 21 bis 30 von 46

Thema: Zahl in Ziffern zerlegen

  1. #21
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    09.07.2005
    Ort
    127.0.0.1
    Alter
    32
    Beiträge
    824
    Anzeige

    Praxistest und DIY Projekte
    Hallo

    Leider funktioniern bei mir beide varianten nicht. Ich habe die erhaltene Zahl als Byte gespeichert, könnte es an dem liegen? Ich bin mir nicht ganz sicher, aber ich glaube die Zahl kann nur in einem Byte gespeichert werden, dass das Programm für die Anzeigen funktioniert. Hier mal den ganzen code, vileicht habe ich ja sonst wo einen Fehler.
    Code:
    Declare Sub Led_display_init()
    Declare Sub Led_display(byval Ziffer As Byte , Byval Zahl As Byte)
    
    
    $regfile = "m32def.dat"
    
    Const Rn_digi_slave_write = &H70
    Const Rn_digi_slave_read = &H71
    Const Dezimalpunktziffer = 0                                'Segment wo Dezimalpunkt leuchten soll (0=keinen)
    
    Dim Segmente As Byte
    Dim Z As Byte
    Dim I As Byte
    
    
    
    
    Dim Einer As Byte
    Dim Zehner As Byte
    Dim Hunderter As Byte
    Dim Tausender As Byte
    Dim A As Word
    
    
    $crystal = 16000000                                         'Quarzfrequenz
    $baud = 9600
    
    Config Scl = Portc.0                                        'Ports fuer IIC-Bus
    Config Sda = Portc.1
    
    
    
    
    I2cinit
    Led_display_init
    
    
    
    
    I = 0
    Sound Portd.7 , 400 , 450                                   'BEEP
    Sound Portd.7 , 400 , 250                                   'BEEP
    Sound Portd.7 , 400 , 450                                   'BEEP
    Print
    Print "**** RN-Control  V1.4 *****"
    Print "Das neue Experimentier- und Roboterboard"
    Print
    Do
    
    
    A = 1245
    
    einer = A mod 1
    zehner = A mod 10
    zehner = zehner - einer
    hunderter = A mod 100
    hunderter = hunderter - zehner
    tausender = A mod 1000
    Tausender = Tausender - Hunderter
    
    Print ; Tausender ; Hunderter ; Zehner ; Einer;
    Print
    Waitms 500
    Led_display 1 , Tausender                                   'Anzeigen der Zahlen
    Led_display 2 , Hunderter
    Led_display 3 , Zehner
    Led_display 4 , Einer
    
    
    Loop
    
    End
    
    
    
    Sub Led_display_init()
      I2cstart
      I2cwbyte Rn_digi_slave_write
      I2cwbyte 0                                                'Control Byte
    
      'Dynamic Alternative Mode und Helligkeit
      'Die oberen 3 Bits bestimmen die Helligkeit
      'Wenn es dunkler sein soll dann z.b. &B0110111
      I2cwbyte &B0110111
    
      I2cstop
    
      'Alle Ziffern auf 0
      For Z = 1 To 4
           Led_display Z , 0
      Next Z
    
    End Sub
    
    
    Sub Led_display(ziffer An Byte , Zahl As Byte)
         I2cstart
         I2cwbyte Rn_digi_slave_write
         I2cwbyte Ziffer
    
    
         Select Case Zahl
             Case 0:
                   Segmente = &H3F
             Case 1:
                    Segmente = &H06
             Case 2:
                    Segmente = &H5B
             Case 3:
                    Segmente = &H4F
             Case 4:
                    Segmente = &H66
             Case 5:
                    Segmente = &H6D
             Case 6:
                    Segmente = &H7D
             Case 7:
                    Segmente = &H07
             Case 8:
                    Segmente = &H7F
             Case 9:
                    Segmente = &H67
             Case Else :
                    Segmente = &H80                             'Ansonsten Dezimalpunkt
    
         End Select
    
         If Dezimalpunktziffer = Ziffer Then Segmente = Segmente Or &H80
         I2cwbyte Segmente
         I2cstop
    End Sub
    anstatt der 1245 werden über Print 2012010 ausgegeben.
    Das Display zeigt auf den ersten 2 Segmenten einen Dezimal Punkt an, dass heisst dass er keine Zahl bekommt. Auf dem 3ten Segment wird eine 1 angezeigt, auf dem ganz rechts eine 0.
    Was mache ich falsch?


    mfg Luca
    Sollte ein Bild von mir nicht angezeigt werden, einfach eine PM schicken!

  2. #22
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    Z.B. hat mich das Posting von Sebastian dazu veranlasst, Morgen auch mal die Hanni/Sebastian Version zu probieren. Wenn es ein paar Byte spart - prima! Ist mir nie in den Sinn gekommen
    Schön, daß Du es ausprobieren willst
    Ich wollte Deinen Lösungsvorschlag auch nicht abwerten (sollte jemand es gedacht haben) Es ist sicher schnell geschrieben und für Anfänger verständlich.
    Der Hanni hat ja schon die Gründe genannt, warum es mit subtrahieren schneller geht.

    Gruß Sebastian
    Software is like s e x: its better when its free.
    Linus Torvald

  3. #23
    Neuer Benutzer Öfters hier
    Registriert seit
    16.07.2006
    Alter
    38
    Beiträge
    18
    Meiner Meinung nach liegt der Fehler in der deklaration von A im typ Word. Soweit ich das jetzt gefunden habe kann man diesen Datentyp nur mit 1 und 0 belegen, was für diesen Fall zuwenig wäre. Bin allerdings auch nicht wirklich fit in Basecom, kenn mir nur mitm Algorithmus aus
    lg Matthias

  4. #24
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    30.07.2005
    Beiträge
    569
    Zitat Zitat von Spion
    A = 1245

    einer = A mod 1
    zehner = A mod 10
    zehner = zehner - einer
    hunderter = A mod 100
    hunderter = hunderter - zehner
    tausender = A mod 1000
    Tausender = Tausender - Hunderter
    Dort liegt übrigens der Hund begraben ...

    Vielleicht einige Worte zur Erklärung:
    Der Modulo Operator besorgt mir den Rest einer Division durch x.

    Damit ergibt sich nach deiner Rechnung:

    einer = 0
    zehner = 5
    hunderter = 40
    tausender = 205

    Damit hast du defakto einen Denkfehler drinne.

    Grüße,
    da Hanni.

  5. #25
    Neuer Benutzer Öfters hier
    Registriert seit
    16.07.2006
    Alter
    38
    Beiträge
    18
    Hallo

    Sorry, stimt natürlich, hab den Algorithmus nur im Kopf zusammengestellt, ihn dabei allerdings nicht wirklich nachgerechnet. Nach einigen Modifikationen sieht er ähnlich aus wie Brunos, funktionieren müsste er auch.

    Code:
    einer = A mod 10 
    A = A - einer
    A = A  / 10
    zehner = A mod 10 
    A = A - zehner
    A = A / 10
    hunderter = A mod 10 
    A = A - hunderter
    A = A / 10
    tausender = A mod 10
    lg Matthias

  6. #26
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    09.07.2005
    Ort
    127.0.0.1
    Alter
    32
    Beiträge
    824
    Hallo

    Also die 2t variante von simonit funktioniert, wenn ich die Ziffern dann in Integer speichere. Aber ich muss leider die Zahl in ein Byte speichern, da es dem Prog. sonst nicht passt. Wenn ich sie in ein Byte speichere, dann bekomme ich z.B. anstatt 8569, 8481. Auch wenn ich andere Zahlen verwende, dann stimmt der Tausender immer. Ich habe mal nur eine 3stellige Zahl eingegeben und er hatt immer die erste Zahl richtig gemacht, die 2te manchmal richtig und die erste immer falsch. Wie kann ich dass beheben?
    Hier noch der neue code:
    Code:
    Declare Sub Led_display_init()
    Declare Sub Led_display(byval Ziffer As Byte , Byval Zahl As Byte)
    
    
    $regfile = "m32def.dat"
    
    Const Rn_digi_slave_write = &H70
    Const Rn_digi_slave_read = &H71
    Const Dezimalpunktziffer = 0                                'Segment wo Dezimalpunkt leuchten soll (0=keinen)
    
    Dim Segmente As Byte
    Dim Z As Byte
    Dim I As Byte
    
    
    
    
    Dim Einer As Byte
    Dim Zehner As Byte
    Dim Hunderter As Byte
    Dim Tausender As Byte
    Dim A As Word
    
    
    $crystal = 16000000                                         'Quarzfrequenz
    $baud = 9600
    
    Config Scl = Portc.0                                        'Ports fuer IIC-Bus
    Config Sda = Portc.1
    
    
    
    
    I2cinit
    Led_display_init
    
    
    
    
    I = 0
    Sound Portd.7 , 400 , 450                                   'BEEP
    Sound Portd.7 , 400 , 250                                   'BEEP
    Sound Portd.7 , 400 , 450                                   'BEEP
    Print
    Print "**** RN-Control  V1.4 *****"
    Print "Das neue Experimentier- und Roboterboard"
    Print
    
    '-------------------------------------------------------------------------------
    
    Do
    
    
    A = 923
    
    
    einer = A mod 10
    A = A - einer
    A = A  / 10
    zehner = A mod 10
    A = A - zehner
    A = A / 10
    hunderter = A mod 10
    A = A - hunderter
    A = A / 10
    Tausender = A Mod 10
    
    Print ; Tausender ; Hunderter ; Zehner ; Einer;
    Print
    Waitms 500
    Led_display 1 , Tausender                                   'Anzeigen der Zahlen
    Led_display 2 , Hunderter
    Led_display 3 , Zehner
    Led_display 4 , Einer
    
    
    Loop
    
    End
    
    '-------------------------------------------------------------------------------
    
    Sub Led_display_init()
      I2cstart
      I2cwbyte Rn_digi_slave_write
      I2cwbyte 0                                                'Control Byte
    
      'Dynamic Alternative Mode und Helligkeit
      'Die oberen 3 Bits bestimmen die Helligkeit
      'Wenn es dunkler sein soll dann z.b. &B0110111
      I2cwbyte &B0110111
    
      I2cstop
    
      'Alle Ziffern auf 0
      For Z = 1 To 4
           Led_display Z , 0
      Next Z
    
    End Sub
    
    '-------------------------------------------------------------------------------
    
    Sub Led_display(ziffer An Byte , Zahl As Byte)
         I2cstart
         I2cwbyte Rn_digi_slave_write
         I2cwbyte Ziffer
    
    
         Select Case Zahl
             Case 0:
                   Segmente = &H3F
             Case 1:
                    Segmente = &H06
             Case 2:
                    Segmente = &H5B
             Case 3:
                    Segmente = &H4F
             Case 4:
                    Segmente = &H66
             Case 5:
                    Segmente = &H6D
             Case 6:
                    Segmente = &H7D
             Case 7:
                    Segmente = &H07
             Case 8:
                    Segmente = &H7F
             Case 9:
                    Segmente = &H67
             Case Else :
                    Segmente = &H80                             'Ansonsten Dezimalpunkt
    
         End Select
    
         If Dezimalpunktziffer = Ziffer Then Segmente = Segmente Or &H80
         I2cwbyte Segmente
         I2cstop
    End Sub
    mfg Luca
    Sollte ein Bild von mir nicht angezeigt werden, einfach eine PM schicken!

  7. #27
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    09.07.2005
    Ort
    127.0.0.1
    Alter
    32
    Beiträge
    824
    Trotz langem Probieren, habe ich es nicht geschafft, dass er vernünftige werte ausgiebt.
    Wenn ich die Zahl in ein Integer speichere, dann ist es kein Problem, jedoch muss ich es in ein Byte speicheren und dann funktioniert es nicht richtig.
    Gibt es einen Befehl um einen Integer in einen Byte zu verwandeln?

    mfg Luca
    Sollte ein Bild von mir nicht angezeigt werden, einfach eine PM schicken!

  8. #28
    Erfahrener Benutzer Fleißiges Mitglied Avatar von DIYLAB
    Registriert seit
    31.10.2004
    Ort
    Berlin
    Beiträge
    156
    Hallo Luca,

    lass das doch mal mit Integer - negative Werte erwartest Du doch nicht.
    Nimm - wie schon beschrieben - für alle Variablen Typ "Word".
    Also Dein A und auch die Variablen für die Ziffern.

    Jetzt stehen also in den Word-Variablen hunderter, zehner, einer jeweils die einzelnen Ziffern, die ja vom Wert her auch in eine Variable "Byte" passen.

    Was hindert Dich also daran, einfach für jede Stellen noch jeweils eine Byte-Variable zu deklarieren und den Wert zu übergeben?

    Also angenommen, Deine Byte-Variablen heissen bhunderter, bzehner und beiner.

    Dann einfach zuweisen:

    bhunderter = hunderter
    bzehner = zehner
    beiner = einer

    Fertig.

    Gruß,
    Bruno

  9. #29
    Erfahrener Benutzer Fleißiges Mitglied Avatar von DIYLAB
    Registriert seit
    31.10.2004
    Ort
    Berlin
    Beiträge
    156
    Hallo Hanni & Sebastian,

    ich finde die Subtraktionsmethode wunderbar!
    Im mikrocontroller.net hat ja z.B. der Peter Dannegger in diesem Thread LINK zwei schöne Beispiele in Assembler gegeben.
    Einmal für 32Bit und einmal für 16Bit - prima.

    Ich habe versucht, diese Beispiele in Bascom mit dem Inline-Assembler in bestehende Programme einzufügen. Leider meckert der Compiler an mehreren Stellen.

    Weil es in Bascom keine BIN2BCD Wandlung gibt, hab ich dann ein wenig mit Schleifen-Konstrukten gearbeitet. Geht auch wunderbar, aber bläht leider den Code im Endeffekt noch mehr auf, also die Modulo-Lösung.

    Ich hatte es ungefähr so versucht:

    Code:
    '============================================
    ' Stellen separieren
    '============================================
     Sub separieren()
    
     hunderter = 0
     zehner = 0
     einer = 0
    
     While result > 100
      result = result - 100
      Incr hunderter
     Wend
    
     While result > 10
      result = result - 10
      Incr zehner
     Wend
    
     einer = result
    
     End Sub
    '--------------------------------------------
    In "result" stand die zu zerlegende Zahl. Geht wiegesagt, ist aber alles andere als effizient - liegt aber an mir

    Ich wäre dankbar für ein paar Denkanstöße, wie diese Methode auch in Bascom gut umzusetzen wäre..

    Viele Grüße,
    Bruno

  10. #30
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    09.07.2005
    Ort
    127.0.0.1
    Alter
    32
    Beiträge
    824
    Danke


    Die Idee hatte ich auch schon, nur haber ich leider etwas vertauscht, ich habe anstatt bhunderter = hunderter, hunderter = bhunderter gemacht und mich dann gewundert warum er 0 ausgiebt.

    Also jetzt funktionierts. Hier noch einmal denn Code der Funktioniert:
    Code:
    Dim Einer As Word
    Dim Zehner As Word
    Dim Hunderter As Word
    Dim Tausender As Word
    Dim A As Word
    
    A = 8956
    
    Einer = A Mod 10
    A = A - Einer
    A = A / 10
    Zehner = A Mod 10
    A = A - Zehner
    A = A / 10
    Hunderter = A Mod 10
    A = A - Hunderter
    A = A / 10
    Tausender = A Mod 10
    
    Print tausender         '8
    Print hunderter         '9
    Print zehner             '5
    Print einer                '6
    In Tausender, Huderter,zehner,einer stehen dann die einzelnen Zahlen.

    Nochmals Danke an alle die geholfen haben. Schönen Tag noch (ist ja nicht mehr lang)

    mfg Luca
    mfg Luca
    Sollte ein Bild von mir nicht angezeigt werden, einfach eine PM schicken!

Seite 3 von 5 ErsteErste 12345 LetzteLetzte

Berechtigungen

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

LiFePO4 Speicher Test