8bis32bit binär in Dezimal ausgeben

Gast #7836
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.
Gast #7839
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?
#7840
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
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 #7845
@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
Gast #660889
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
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

Eine eigene Frage? Dieser Thread ist über 24 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.