mikrocontroller.net

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


Autor: Jonas Diemer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jonas Diemer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Karl Studeny (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
@Karl,

versuchs mal damit.

Peter

Autor: Karl Studeny (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Peter!

Danke für die Hilfe.Damit funktioniert es.

Gruß Karl

Autor: Andreas Kutschbach (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ??

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Andreas,

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

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


Peter

Autor: Andreas Kutschbach (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: bluemole (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: triantafillidis Christos (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Celik Fahri (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: nobody0 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 */

Autor: Josef (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)


        }

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.