Binär zu BCD Wandlung

    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!

    • @Galahat Ich kann tschoeatschs Bedenken schon nachvollziehen.
      Wenn du in ASM etwas programmierst, dann kommen dazwischen ja in der Regel keine Bascom Befehle.
      Damit können die auch nicht den Inhalt von Registern ändern, in denen du Werte hältst, die über den Bascom Befehl erhalten bleiben sollen.
      Das ist hier ja anders, sowohl bei den GPIOR als auch bei den von dir verwendeten Registern.
      Aber ich habe auch noch nie gesehen, dass Bascom diese verwendet. Das wäre auch nur sinnvoll, wenn der Compiler mit den Rx nicht auskommt, was eher unwahrscheinlich ist.
      Aber man könnte MCS ja mal fragen, ob dazu eine klare Aussage gegeben werden kann.
      Wenn ich was zeit- oder platzkritisches habe, verwende ich die jedenfalls gerne, während ich um die RX einen Bogen mache.
    • @Michael, hier noch eine Version für die Statistik.

      Das hier ist die ASM-Variante des Codes aus Beitrag #36_2, also heros-Version + Vitamin G . a_447_3df864b7
      Schon die Bascom-Ausführung lässt ja ahnen, daß es hier recht flink zugehen muss. So genügen zur Umsetzung der Prüfzahl 59999 154 Takte (vom Aufruf mit Breakpoint bis zum Folgebehl), womit diese Variante trotz Dehnungsstreifen bis auf Weiteres vone liegt. :thumbup:

      BASCOM-Quellcode

      1. function Bin2BCD(byreg R16 as word) as dword
      2. $asm
      3. ldd Xl,y+0
      4. LDD Xh, y+1
      5. CLR R18
      6. CLR R19
      7. Clr R20
      8. ;--------------------
      9. LDI R21, &H40
      10. LDI R22, &H9c
      11. cp R16, R21
      12. cpc R17, R22
      13. BRLO Bin2BCD_1
      14. sub R16, R21
      15. sbc R17, R22
      16. subi R20, -4
      17. Bin2BCD_1:
      18. LDI R21, &H20
      19. LDI R22, &H4e
      20. cp R16, R21
      21. cpc R17, R22
      22. BRLO Bin2BCD_2
      23. sub R16, R21
      24. sbc R17, R22
      25. subi R20, -2
      26. Bin2BCD_2:
      27. LDI R21, &H10
      28. LDI R22, &H27
      29. cp R16, R21
      30. cpc R17, R22
      31. BRLO Bin2BCD_3
      32. sub R16, R21
      33. sbc R17, R22
      34. subi R20, -1
      35. Bin2BCD_3:
      36. LDI R21, &HA0
      37. LDI R22,&H0F
      38. cp R16, R21
      39. cpc R17, R22
      40. BRLO Bin2BCD_4
      41. sub R16, R21
      42. sbc R17, R22
      43. subi R19, -64
      44. Rjmp -6
      45. Bin2BCD_4:
      46. LDI R21, &HD0 ; edit
      47. LDI R22, &H07
      48. cp R16, R21
      49. cpc R17, R22
      50. BRLO Bin2BCD_5
      51. sub R16, R21
      52. sbc R17, R22
      53. subi R19, -32
      54. Bin2BCD_5:
      55. LDI R21, &HE8
      56. LDI R22, &H03
      57. cp R16, R21
      58. cpc R17, R22
      59. BRLO Bin2BCD_6
      60. sub R16, R21
      61. sbc R17, R22
      62. subi R19, -16
      63. Bin2BCD_6:
      64. LDI R21, &H90
      65. LDI R22, &H01
      66. cp R16, R21
      67. cpc R17, R22
      68. BRLO Bin2BCD_7
      69. sub R16, R21
      70. sbc R17, R22
      71. subi R19, -4
      72. Rjmp -6
      73. Bin2BCD_7:
      74. LDI R21, 200
      75. LDI R22, 0
      76. cp R16, R21
      77. cpc R17, R22
      78. BRLO Bin2BCD_8
      79. sub R16, R21
      80. sbc R17, R22
      81. subi R19, -2
      82. Bin2BCD_8:
      83. LDI R21, 100
      84. cp R16, R21
      85. BRLO Bin2BCD_9
      86. sub R16, R21
      87. clc
      88. subi R19, -1
      89. Bin2BCD_9:
      90. LDI R21, 40
      91. cp R16, R21
      92. BRLO Bin2BCD_10
      93. sub R16, R21
      94. subi R18, -64
      95. RJMP -4
      96. Bin2BCD_10:
      97. LDI R21, 20
      98. cp R16, R21
      99. BRLO Bin2BCD_11
      100. sub R16, R21
      101. subi R18, -32
      102. Bin2BCD_11:
      103. LDI R21, 10
      104. cp R16, R21
      105. BRLO Bin2BCD_12
      106. sub R16, R21
      107. subi R18, -16
      108. Bin2BCD_12:
      109. OR R18,R16
      110. ;--------------------
      111. st X+,R18
      112. St X+,R19
      113. St X+,R20
      114. St X ,R17
      115. $end asm
      116. end function
      Alles anzeigen
    • Hallo Galahat,
      bei bin2bcd4 hast du glaube ich einen C&P Fehler. müsste bestimmt 07C0 heißen.
      Siehst du eigentlich Potential darin, diese immer gleichen Blöcke durch einen zu ersetzen um den Flash Bedarf zu reduzieren?
      Also eine Schleife über die 8 gleichen Abschnitte und nur die Vergleichs- und Add Werte anpassen.
      Heißt 40000->20000->10000 usw.
    • Galahat schrieb:

      Um den Speicherkonsum zu reduzieren, ist eindeutig Potential vorhanden. Ich schätze, dass dann etwa 70 bis 100 Zyklen hinzukommen, wenn ich mich nicht arg irre.
      Die Geschwindigkeit ist um den Faktor 20 gestiegen, Respekt.


      Galahat schrieb:

      154 Takte (vom Aufruf mit Breakpoint bis zum Folgebehl)

      Meine Test beziehen sich immer auf ein fertiges Programm mit Attiny85 und einer Do-Loop Schleife, die den Wert setzt und danach das Ergebnis in einem DWord bekommt. Ich messe einen kompletten Loop um eben alles vergleichbar zu machen. Deshalb haben die Programme ein paar Byte mehr als die Funktion an sich.

      smallerbetterfaster3.png
    • Was mich richtig geschockt hat, war dieser Befehl:
      Mystr = Str(i)
      Der braucht über 3000 Takte, also ganz alleine 20 mal soviel wie Galahats Programm.
      Das kann ich beim besten Willen nicht verstehen, was MCS da gemacht hat.
      Bestätigt mich nur darin, dass Bascom keinesfalls ein "Textverarbeitungsprogramm" ist.

      Kopfrechnen übrigens schwach: Es muss 07D0 heißen.
    • Ja, in manchen Belangen könnte es fixer gehen. Manchmal muss man dann selbst Hand anlegen, aber mit Geschwindigkeit wurde ja auch nie geworben.
      Positiv ausgedrückt, wird an dem Bascom-Programmierer zuweilen ein hoher Anspruch gestellt.

      Da fällt mir ein, ich hatte vor einigen Jahren eine lib geschrieben, die alle möglichen Konvertierungen überlud. Ich muss das mal suchen.
    • Moin!

      Das hier ist die Variante #44 in Flash freundlicherer Weise. Jetzt sind es etwa 140 Takte mehr als zuvor, anstelle der von mir geschätzten 70 bis 100 (@hero , das Kopfrechnen klappt bei mir auch nicht immer), doch damit ist diese Variante immer noch schnell genug um sich den Platz an der Spitze zu sichern.

      @Michael, würdest Du bitte... a_30_7dc14a07

      BASCOM-Quellcode

      1. function Bin2BCD(byreg R16 as word) as dword
      2. $asm
      3. LDD Xl,y+0
      4. LDD Xh, y+1
      5. CLR R24
      6. LDI R21, &H40
      7. LDI R22, &H9c
      8. LDI R23, 4
      9. rcall Bin2BCD_conv
      10. LDI R21, &H20
      11. LDI R22, &H4e
      12. LDI R23, 2
      13. rcall Bin2BCD_conv
      14. LDI R21, &H10
      15. LDI R22, &H27
      16. LDI R23, 1
      17. rcall Bin2BCD_conv
      18. MOV R20,R24
      19. clr r24
      20. LDI R21, &HA0
      21. LDI R22,&H0F
      22. LDI R23, 64
      23. rcall Bin2BCD_conv
      24. LDI R21, &HD0
      25. LDI R22, &H07
      26. LDI R23, 32
      27. rcall Bin2BCD_conv
      28. LDI R21, &HE8
      29. LDI R22, &H03
      30. LDI R23, 16
      31. rcall Bin2BCD_conv
      32. LDI R21, &H90
      33. LDI R22, &H01
      34. LDI R23, 4
      35. rcall Bin2BCD_conv
      36. LDI R21, 200
      37. LDI R22, 0
      38. LDI R23, 2
      39. rcall Bin2BCD_conv
      40. LDI R21, 100
      41. LDI R23, 1
      42. rcall Bin2BCD_conv
      43. MOV R19,R24
      44. clr r24
      45. LDI R21, 40
      46. LDI R23, 64
      47. rcall Bin2BCD_conv
      48. LDI R21, 20
      49. LDI R23, 32
      50. rcall Bin2BCD_conv
      51. LDI R21, 10
      52. LDI R23, 16
      53. rcall Bin2BCD_conv
      54. OR R24,R16
      55. MOv R18,R24
      56. ;--------------------
      57. st X+,R18
      58. St X+,R19
      59. St X+,R20
      60. St X ,R22
      61. rjmp Bin2BCD_end
      62. ;---------------------
      63. Bin2BCD_conv:
      64. cp R16, R21
      65. cpc R17, R22
      66. BRLO +5
      67. sub R16, R21
      68. sbc R17, R22
      69. Add R24, R23
      70. Rjmp -6
      71. ret
      72. Bin2BCD_end:
      73. $end asm
      74. end function
      Alles anzeigen
    • [Monolog]

      Es gibt da aber noch eine MCS-Version und die kann mann sich folgendermaßen nutzbar machen:

      BASCOM-Quellcode

      1. $regfile = "attiny85.dat"
      2. $crystal = 8000000
      3. $hwstack = 64
      4. $swstack = 32
      5. $framesize = 32
      6. $lib "bcd.lib" :$external bin2bcd16
      7. dim dw as dword
      8. declare function BIN2BCD16(byval inval as word)as dword
      9. dw=bin2BCD16(59998)
      10. end
      Alles anzeigen
      Edit: Der Algorithmus entspricht #20/#21 und scheint mir der Appnote204 zu entstammen.

      [/Monlog]
    • Also @Galahat ich neige nicht so zum finger pointing und jeder geneigte Leser kann das Ursprungsdokument ja gegen Deine/Eure Entwicklungen abgleichen. Wie gesagt, der Ansatz von Peter Dannegger oder der AVR2014 fußt ja sicher auf einem erprobten Algorithmus, welche sich häufig (früher oder später) in Büchern und Webartikeln wiederfinden - sofern diese nicht dort herkamen.

      Ähnliche "Wettbewerbe" gab es mal in Ansätzen bei den Bresenham Algorithmen für Displays.

      Das Forum profitiert allgemein in (eigenen) Projekten oder im speziellen bei der Erlangung von Fähigkeiten. Deshalb empfinde ich die Zusammenarbeit hier sehr von Nutzen.
      Aus datenschutzrechtlichen Gründen befindet sich die Kontaktdaten auf der Rückseite dieses Beitrages.
    • Nee, @Galahat - überhaupt nicht. Ehrlich gesagt bin ich froh diese Resonanz zu bekommen.

      Was ich blöd ausdrückte und meinte: Ich muss ja nicht auf die Lösungen zeigen und meinen „Kommentar“ abgeben. Bin nicht der Oberlehrer, der andere Menschen belehren muss was da gerade passiert.

      Du als Autor wirst etwas sagen wenn Du es für richtig hälst. Mach‘ ich auch so.
      Aus datenschutzrechtlichen Gründen befindet sich die Kontaktdaten auf der Rückseite dieses Beitrages.