Forum: Projekte & Code 8bis32bit binär in Dezimal ausgeben


von Phagsae (Gast)


Angehängte Dateien:

Lesenswert?

Recht komfartabel und eigentlich nicht zu gross
mit komma steuerung
mit 0 Stellenunterdrückung
und 8bis32 BIT fähig

have a lot of fun!

von Phagsae (Gast)


Lesenswert?

Die LCD Steuerung die ich weiter oben beschreibe pass übrigens zu dem
Programm

von Thomas H. (Gast)


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.

von Peter D. (peda)


Angehängte Dateien:

Lesenswert?

Anbei ein Beispiel für 32 Bit und auf Geschwindigkeit optimiert.


Peter

von Peter D. (peda)


Angehängte Dateien:

Lesenswert?

Sorry, da hat sich beim Erweitern von 16 auf 32 Bit doch noch ein Fehler 
eingeschlichen.
Jetzt sollte es hinhauen.


Peter

von Ste (Gast)


Lesenswert?

Genau so etwas bräuchte ich für eines meiner Projekte, jedoch nicht so 
gross. Wie kann ich diesen Code auf 16 bit "stutzen"? Was muss ich 
beachten?

von Peter D. (peda)


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

von Ste (Gast)


Lesenswert?

Danke, werde es mal versuchen!!

von Ste (Gast)


Angehängte Dateien:

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!

von Peter D. (peda)


Angehängte Dateien:

Lesenswert?

Noch mal eine Korrektur.


Peter

von Andreas Baier (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Peter!

Ich deine Routine ausprobiert und funktioniert fast.
Anbei noch mal Korrekturen ab Marke _bcd7 und ne angepasste Routine für
BCD16b.

Andreas

von peter dannegger (Gast)


Lesenswert?

@Andreas,

ich gestehe, ich hab die 32-Bit Routine selber noch nicht benutzt.

Aber wenn man das Prinzip verstanden hat, findet man schließlich alle
Schusselfehler.


Peter

von sdsd (Gast)


Lesenswert?

LAME

von Simon K. (simon) Benutzerseite


Lesenswert?

gut zu wissen..

von Daniel (Gast)


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

von Wolfram Quehl (Gast)


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)

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.