Forum: Projekte & Code 10bit binär -> BCD


von Jonas Diemer (Gast)


Lesenswert?

Hallo!

Manchmal möchte man eine 10bittige Zahl ins BCD format umwandeln (z.B. 
vom AD Wandler).

hier mein code (musste leider ins statement, weil upload nicht geht).
Ich hab in Englisch kommentiert... aber das is ja kein problem.

.include "../avr/includes/4433def.inc"
.DEVICE at90s4433

.def mpr  = r16
.def numberL  = XL  ;number stores the hex value
.def numberH  = XH

.def bcd1000  = r1  ;these registers will contain
.def bcd100  = r2  ;the binary coded decimals.
.def bcd10  = r3
.def bcd1  = r4

.org 0x000;
reset:
  ;set up stack
  ldi r16,RAMEND
  out SPL, r16   ;SPL=Stack Pointer Low
      ; we don't need to set SPH,
    ; because 4433 only has 128bytes of sram

  ldi mpr,0x00
  mov r1,mpr
  mov r2,mpr
  mov r3,mpr
  mov r4,mpr




  ldi numberL, LOW(1012)
  ldi numberH, HIGH(1012)
  rcall c10bit2bcd

end: rjmp end

;**********************************
;Convert 8bit number in mpr to bcd
;bcd is stored in 3 registers
;this will destroy the number in mpr
;***********************************
c8bit2bcd:
  gt100:
    cpi mpr,100
    brlo gt10    ;jump if less than 100
    subi mpr,100
    inc bcd100
    rjmp gt100;
  gt10:
    cpi mpr,10
    brlo lt10    ;jump if less than 10
    subi mpr,10
    inc bcd10
    rjmp gt10
  lt10:
    mov bcd1,mpr  ;the number is now less than 10
  ret

; Add a number to BCDn, with carry
; this macro could be made a routine
; if we use indirect register adressing (0x00-0x1f)
.MACRO addtobcd
  ldi mpr,@1
  add bcd@0,mpr

  mov mpr,bcd@0    ;if bcd<10 then break
  cpi mpr,10
  brlo lt10_m

  mov mpr,bcd@0    ;bcd -= 10
  subi mpr,10
  mov bcd@0,mpr

  inc bcd@00
lt10_m:
.ENDMACRO

c10bit2bcd:
  mov mpr,numberL  ;convert the lower byte to bcd
  rcall c8bit2bcd;

  clc      ;clear the carry
  lsr numberH    ;LSB to carry
        ;if Carry set, add 256 to the number
  brcc dont_add_256

  addtobcd 1,6
  addtobcd 10,5
  addtobcd 100,2

  dont_add_256:
  clc      ;clear the carry
  lsr numberH    ;LSB to carry
        ;if Carry set, add 512 to the number
  brcc dont_add_512

  addtobcd 1,2
  addtobcd 10,1
  addtobcd 100,5

  dont_add_512:

  ret

von Jonas Diemer (Gast)


Lesenswert?

achja: wenn das jemand einfacher hat, immer her damit! :-)

hab vergessen zu erwähnen, dass die BCDs dann noch ungepackt sind (d.h. 
eine Ziffer pro byte).

von Karl Studeny (Gast)


Lesenswert?

Hallo!

Ich versuche eine 8 Bit binär Zahl vom ADU in ein
ASCII Zeichen umzuwandeln.
Ich verwende diesen Teil des Code's:
;**********************************
;Convert 8bit number in mpr to bcd
;bcd is stored in 3 registers
;this will destroy the number in mpr
;***********************************
c8bit2bcd:
  gt100:
    cpi mpr,100
    brlo gt10 ;jump if less than 100
    subi mpr,100
    inc bcd100
    rjmp gt100;
  gt10:
    cpi mpr,10
    brlo lt10 ;jump if less than 10
    subi mpr,10
    inc bcd10
    rjmp gt10
  lt10:
    mov bcd1,mpr ;the number is now less than 10
  ret
und addiere danach zu bcd100, bcd10 und bcd1 48.
es funktioniert aber nur die Einerstelle.
Bei der 10 u.100 Stelle werden nur Sonderzeichen dargestellt. Woran 
könnte das liegen?
Danke im voraus
Grüsse Karl

von Peter D. (peda)


Angehängte Dateien:

Lesenswert?

@Karl,

versuchs mal damit.

Peter

von Karl Studeny (Gast)


Lesenswert?

Hallo Peter!

Danke für die Hilfe.Damit funktioniert es.

Gruß Karl

von Andreas Kutschbach (Gast)


Lesenswert?

Ich finds schon mal gut, dass da einige Leute sind,
die sich anscheinend mit ASM für Atmels auskennen.
Ich bin der Anfänger schlechthin und möchte folgendes
machen:

Eine 10 bit Zahl vom ADC (liegt ja auf ADCH und ADCL)
durch eine Konstante dividieren und dann auf
4 Register in BCD-From aufteilen. (Also ungepackt;
ein Register pro Digit).

Das 10Bit --> 4xBCD schafft ja das anfangs gezeigte Programm
vermutlich. Aber wie führe ich eine 10 Bit-Division im
Assembler aus ? also Pauschal: ERGEBNIS=ADCWERT/KONSTANTE ??

von Peter D. (peda)


Lesenswert?

@Andreas,

hier findest Du z.B. eine Division / 60:

http://www.mikrocontroller.net/forum/read-4-23408.html


Peter

von Andreas Kutschbach (Gast)


Lesenswert?

@peter,

Okay, da müsste ich mich mal durchfinden, das
krieg ich schon hin. Danke.

@jonas
Mir ist aufgefallen, dass dein ASM-Programm, welches
du gepostet hast, bei mir (AVR Studio 4) nicht läuft.
Eine Angabe "r@0" nimmt der Compiler nicht mit;
es werden also keine Registernummern als Parameter
akzeptiert. Schade.
Ich habe ein ähnliches Programm gefunden. Dort läuft
alles ganz gut (16 bit bin2bcd). Problem: die BCD-
Digits sind gepackt. Kann mir jemand sagen, wie
ich BCD-Digits entpacke ? Ich brauche die Darstellung:
[ein Byte pro digit].

Danke im Voraus...

von Michael (Gast)


Lesenswert?

Hallo ,

kann mir einer helfen ich versuche mich schon einige Zeit daran
meinen Controller in asm zu programmieren. Habe auch einige Erfolge
dabei errungen, aber mit dem ADU komme ich absolut nicht zurecht.

AGND, AVcc, ARef, und Register sind korekt eingestellt
nur ein Ergebniss ist nicht zu sehen.

von bluemole (Gast)


Angehängte Dateien:

Lesenswert?

Hi Michael,

ich bin auch erst eingestiegen in die Mikrocontrollergeschichten. Im
Anhang findest du meinen Code zum Auslesen des ADUs. Allerdings sind
noch ein paar extra Elemente im Code enthalten. z.B LCD- Display etc.
Die Performance in Sachen Geschwindigkeit kann noch sehr stark
verbessert werden.
Aber die Kiste läuft :-)
Du mußt dir nur die entsprechenden Abschnitte raussuchen....

mfg bluemole

von triantafillidis Christos (Gast)


Lesenswert?

Hallo leute ich habe ein Problem und zwar ich muss eine präsentation
halten über binär-BCDwandler das problem ist ich muss das im logic_2
programmieren und zwar auf maximale stellenanzahl der eingänge ich
könnte zwar die tabelle machen aber irgendwie geht es leichter über die
gleichung ich habe auf dem logic baustein 9 eingänge und 9 ausgänge ob
mir da jemand weiterhelfen könnte?

von Celik Fahri (Gast)


Lesenswert?

Hallo ,

ich habe Ihre programierung mir mal angesehen und hab dazu eine frage

kann mann das auch mit anderen simulations programmen realisieren (Z.B.
Logic ) und wenn ja wie ???

ich würde mich freuen wenn sie mir da weiterhelfen könnten.

vielen dank

von nobody0 (Gast)


Lesenswert?

Ich benutzte für solche einfachen Sachen kleine C-Makros:

// Convert a nibble into an ASCII hex digit.
#   define mc_NIBBLE_TO_ASCII(n) ("0123456789ABCDEF"[ n ])


// Convert bytes from/to 4-bit BCD.
#   define BCD2B(bcd) (10*((bcd) >> 4) + ((bcd) & 0xf)) /* always
succeds (fits in one byte) */
#   define B2BCD(b) ((((b) / 10) << 4) + ((b) % 10))    /* b<=99
asserted */

von Josef (Gast)


Lesenswert?

//***********************Zahl in BCD umrechnen
void Convert_Int_Bcd (int Zahl)
        {
        int Help;

            Help  =

Zahl /1000;

            put_char (Help +0x30)    //an Uart

            Zahl = Zahl - (Help * 1000);
            Help  = Zahl / 100;
            put_char (Help +0x30)

            Zahl = Zahl - (Help * 100);
            Help  = Zahl / 10;
            put_char (Help +0x30)

            Zahl = Zahl - (Help * 10);
            Help  = Zahl;
            put_char (Help +0x30)


        }

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.