8bis32bit binär in Dezimal ausgeben

Gast #7836
Lesenswert?

Hallo,

ich habe dein Programm ausprobiert uns es funktioniert wunderbar. Nur 
gibt er mir, wenn ich eine 0 ausgeben moechte (NKS=2, Stellen =5, kein 
Vorzeichen) nichts richtiges aus und haengt sich auf.

Ist das bei dir auch - oder nur bei mir. Ich habe die Programme noch 
einmal abgeglichen und habe keinen Unterschied gefunden.

Danke und ciao,

Thomas H.
#7840
Lesenswert?

Also das ist die getunte Subtrahiermethode.

Die langsame Subtrahiermethode geht so:

Ich prüfe, ob ich z.B. 1000000000 abziehen kann, wenn ja dann mache ich 
es und zähle mit wie oft ich das gemacht habe.
Wenn nein, dann mache ich das gleiche mit 100000000 usw. bis nur noch 
die Einer übrig sind.


Die getunte Methode zieht einfach ab und merkt aber erst danach, ups, 
das war einer zuviel.

Wenn ich z.B. von 80 die 100 abziehe, dann kommt -20 raus.
Im nächsten Durchlauf addiere ich also einfach, bis es wieder zuviel war 
usw. immer im Wechsel. Damit ich dabei aber auf die 8 komme zähle ich 
bei der Addition von 10 runter.

Der Trick dabei ist der, daß das Carry-bit gesetzt wird, wenn man zuviel 
subtrahiert oder addiert hat, d.h. man spart sich den extra Vergleich.

Da der AVR aber keine Konstanten addieren kann, subtrahiert man dafür 
den negativen Wert (X + Y = X - -Y). Dabei dreht sich jedoch die 
Bedeutung des Carry-Bits um, d.h. es ist dann nicht gesetzt, wenn ein 
Überlauf stattfindet.


Wenn das jetzt zu unverständlich war, frag einfach nochmal konkret.

Ansonsten sollte es einfach sein, die nötigen Änderungen für 24 oder 16 
Bit zu machen.


Peter
Gast #7842
Lesenswert?

Hallo!

Habe es nun mal versucht, es scheint einigermassen zu klappen, jedoch 
kommt bei der letzten Ziffer anstatt einer Zahl ein Zeichen raus. Und 
ich erhalte vom ADC immer den Wert 128? (?=komisches Zeichen). Ist mein 
ADC kaputt oder liegts am Code, könntest du iohn mal kurz unter die Lupe 
nehmen? Ich wäre echt froh!
Angehängte Dateien:
Gast #660889
Lesenswert?

Hallo,

was gibt es denn noch für Möglichkeiten eine binäre Zahl umzuwandeln (um 
sie dann z.B. per LCD Modul auszugeben)?
Man könnte ja auch die Zahl jeweils durch 10 dividieren und jeweils den 
Rest betrachten.
Zum Beisliel 251.
251 / 10 = 25 Rest 1
25 / 10 = 2 Rest 5
2 / 10 = 0 Rest 2

Danke

Daniel
Gast #662071
Lesenswert?

ich habe hier 2 Versionen:
16bit nach ascii, diese enthält eine kleine Rechenungenauigkeit, wobei 
ich hoffe, daß das ausreicht.
mul16 ist ein Macro in der Codesammlung.
8 bit nach ascii, diese müßte noch auf 16 oder 32 bit erweitert werden. 
Fehler bitte nicht erst in einigen Jahren melden, sondern etwas früher.

;x * 6553 = y (16bit * 16bit)
; y/65536= y  (vordere 16 bit, hinten abschneiden) y=ergebnis
; y * 10=z
; x-z= Rest
bin16toascii1:    ;  y = x:10 Rest
push  r20
ldi   r23,0x19
ldi   r22,0x99     ; r23:r22=6553
mul16 r21,r20,r23,r22  ; r23:r22= ergebnis y
ldi   r20,10
mul   r23,r20
mov   r16,r1
mul   r22,r20
add   r16,r0    ;r16=y*10
pop   r20
sub   r20,r16    ;r22=rest
add   r20,'0'    ;rest>>Ascii
st    z+,r20    ;Ascii speichern
ret

bin16toascii:    ; bin=r21:r20
ldi zl,low (ascii)
ldi zh,high(ascii)
rcall bin16toascii1
rcall bin16toascii1
rcall bin16toascii1
rcall bin16toascii1
rcall bin16toascii1
ret      ; ascii=RAM (ascii)

bin8toascii1:    ; bin=r20
mov r16,r20
lsr r16
lsr r16
mov r17,r16
lsr r16
lsr r16
sub r17,r16
lsr r17      ; r17=r20:10
ldi r16,10
mul r16,r17
sub r20,r0    ; r20=rest
add r20,'0'    ;rest>>Ascii
st  z+,r20    ;Ascii speichern
mov r20,r17
ret

bin8toascii:    ; bin=r21:r20
ldi zl,low (ascii)
ldi zh,high(ascii)
rcall bin8toascii1
rcall bin8toascii1
rcall bin8toascii1
ret      ; ascii=RAM (ascii)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren