www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 10 Bit binärzahl in BCD umwandeln


Autor: Florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi zusammen, ich möchte eine 10 bit zahl in eine BCD zahl (3-stellen) 
umwandeln, kann mir da jemand helfen?
habe bisher nur 8-Bit-Zahlen in BCD umgewandelt.
ich programmiere in Assembler (8051).

Gruss und danke

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
10 Bit ist im Extremfall vierstellig (0-1023) oder dreistellig mit 
Vorzeichen.

Autor: Thomas Bremer (Firma: Druckerei Beste) (virtupic)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Am besten unterteils du die 10 Bit in Gruppen: (2 + 4 + 4) Bit. Dann 
kriegst du x = a2 * 256 + a1 * 16 + a0.

Daraus machst du dir vier Bytes, die die einzelnen Stellen enthalten: x 
= 1000 * d3 + 100 *  d2 + 10 * d1 + d0. Daraus ergibt sich

b0 = a0 + 6 * (a1 + a2)
b1 = a1 + 5 * a2 + s * a3 + (b0 / 10)
b2 = 2 * a2               + (b1 / 10)
b3 = 0                    + (b2 / 10)

und daraus dann:

d0 = b0 % 10
d1 = b1 % 10
d2 = b2 % 10
d3 = b3 % 10

Ziemlich trickreich, das Ganze! Wenn du die ai mit 2, 5, oder 6 
multiplizierst, dann kommen höchstens 6 * 15 = 90 raus. Spielt sich also 
in einem Byte ab - und ist damit problemlos auf uC zu implementieren.

virtuPIC

Autor: Passi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
!!!!!!!!!

Autor: Thomas Bremer (Firma: Druckerei Beste) (virtupic)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
?????????

virtuPIC

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Man benutze die übliche 16Bit auf Dezimal Ausgaberoutine und lasse die 2 
höherwertigen Digits weg:

;*************************************************************************
;*                                                                       *
;*                      Convert unsigned 16bit to ASCII                  *
;*                                                                       *
;*              Author: Peter Dannegger                                  *
;*                                                                       *
;*************************************************************************
;
;input: R6, R7= 16 bit value 0 ... 65535
;output: R3, R4, R5, R6, R7 = 5 digits (ASCII)
;
bin16_ascii:
        mov     a, r7
        mov     r3, #-1 + '0'
_bcd1:  inc     r3
        add     a, #low(-10000)
        xch     a, r6
        addc    a, #high(-10000)
        xch     a, r6
        jc      _bcd1
        mov     r4, #10 + '0'
_bcd2:
        dec     r4
        add     a, #low(1000)
        xch     a, r6
        addc    a, #high(1000)
        xch     a, r6
        jnc     _bcd2
        mov     r5, #-1 + '0'
_bcd3:
        inc     r5
        add     a, #low(-100)
        xch     a, r6
        addc    a, #high(-100)
        xch     a, r6
        jc      _bcd3
        mov     r6, #10 + '0'
_bcd4:
        dec     r6
        add     a, #10
        jnc     _bcd4
        add     a, #'0'
        mov     r7, a
        ret
;-------------------------------------------------------------------------
end

Wenn keine ASCII-Ausgabe gewünscht wird, einfach alle '0' durch 0 
ersetzen.


Peter

Autor: Florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Peter Dannegger

wenn ich zum Beispiel die zahl 3600 habe, welche zahl befindet sich dann 
in welchem Register?

gruss

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
r3 = '0'
r4 = '3'
r5 = '6'
r6 = '0'
r7 = '0'


Peter

Autor: Tagträumer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Peter Dannegger

Hast du wirklich schön programmiert.
Ich würde nur gerne mal wissen, wie rufe ich dieses Unterprogramm 
"formal" richtig auf, wie übergebe ich Daten, wie bekomme ich Daten 
zurück.
Du magst die Frage vieleicht dämmlich finden, sie hat aber durchaus ihre 
Berechtigung.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tagträumer wrote:
> @ Peter Dannegger
>
> Hast du wirklich schön programmiert.
> Ich würde nur gerne mal wissen, wie rufe ich dieses Unterprogramm
> "formal" richtig auf, wie übergebe ich Daten, wie bekomme ich Daten
> zurück.

Steht eigentlich oben drüber:

;input: R6, R7= 16 bit value 0 ... 65535
;output: R3, R4, R5, R6, R7 = 5 digits (ASCII)

D.h. der 16Bit-Wert muß in R6 und R7 übergeben werden.
Üblicher Weise schreibt man das höherwertige Register links
(wie bei Zahlen auch).
Also R6 mit dem High-Byte laden und R7 mit dem Low-Byte
Und dann:

call bin16_ascii

Und danach ist in R3 die 10000-Stelle usw.


Peter

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.