www.mikrocontroller.net

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


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

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

Autor: Phagsae (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die LCD Steuerung die ich weiter oben beschreibe pass übrigens zu dem
Programm

Autor: Thomas H. (Gast)
Datum:

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

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

Bewertung
0 lesenswert
nicht lesenswert
Anbei ein Beispiel für 32 Bit und auf Geschwindigkeit optimiert.


Peter

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

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


Peter

Autor: Ste (Gast)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

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

Autor: Ste (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke, werde es mal versuchen!!

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

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

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

Bewertung
0 lesenswert
nicht lesenswert
Noch mal eine Korrektur.


Peter

Autor: Andreas Baier (Gast)
Datum:
Angehängte Dateien:

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

Autor: peter dannegger (Gast)
Datum:

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

Autor: sdsd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
LAME

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
gut zu wissen..

Autor: Daniel (Gast)
Datum:

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

Autor: Wolfram Quehl (Gast)
Datum:

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

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.