Forum: Mikrocontroller und Digitale Elektronik Probleme mit den Zahlensysteme? Register Inhalt auf LCD show


von Kai Kruschke (Gast)


Lesenswert?

Wünsche allen hier erstmal einen schönen Sonntag,

ich habe folgendes Problem, ich habe mir mit einem ATmega8
& von Maxim (DS) ein DS18S20 angeschlossen, die Datenübertragung
zwischen dem uP & DS funktioniert
(lasse einfach das LSB vom DS auf dem LCD Anzeigen) ist natürlich
nicht die Lösung sollte ja nur zeigen ob daten kommen.

Jetzt kommt einfach mal mein Denkfehler, der DS gibt folgende Daten
aus:

LSB = 1010 1010 (entspricht 85°C)
MSB = 0000 0000 (enspricht + Temp)

Wie kann ich diese jetzt so umrechnen, das ich dieses auf einem UART
bzw. LCD Display als Decimal zahl sehe. Sprich 85°C

Ich bin echt schon am verzweifeln und sitze schon die ganze Nacht dran,
vieleicht hat da jemand für mich auch ne gute Doku wo ich so etwas
finde.
Bitte nur in ASM mit C komme ich nicht klar.

cu Kai

von crazy horse (Gast)


Lesenswert?

musst in ASCII umwandeln.
Binärwert durch 10 teilen, das Ergebnis ergibt die Zehner, der Rest die
Einer (bei Atmel auf der page gibts fertige Divisionsroutinen, die
sowohl Ergebnis als auch Rest liefern), zu jedem Ergebnis dann noch
0x30 addieren, fertig.

von Kai Kruschke (Gast)


Lesenswert?

Hi Crazy Horse,

ok also auf dem Taschenrechner klappt es wunderbar.
Nur wie kann ich jetzt z.b. einen Register wie

r16 = 0b10101010

in ASM dementsprechen Teilen ?

ldi r17, r16/10 ???

cu Kai

von Peter D. (peda)


Lesenswert?


von Kai Kruschke (Gast)


Lesenswert?

Hi Peter,

währst du so nett, und würdest mir das ganze mal kurz und einfach als
ASM Beispiel reintippen wie ich das aufteile... zerteile oder zerhacke
;)

Wenn ich das endlich verstanden habe, und darum geht es mir ja es zu
verstehen. Werd ich das ganze gerne nochmal mit Code zusammen fassen.

Aber wie oben schon gesagt ich weis noch nicht WIE ich das zerteile...

Also zusammenfassung ich habe meinen wert 0b10101010 dieser ergibt
geteilt durch 10 dann in Dec genau 85°C was auch der Temperatur
entspricht. Nur das WIE fehlt mit :(

cu Kai

von Peter D. (peda)


Lesenswert?

"dec_out" sind doch nur 18 Zeilen, die solltest Du doch wohl im
Simulator ausprobieren können.

Die Ausgabe im LCD "lcd_data" kannst Du dafür erstmal nur mit einem
NOP belegen.


Peter

von Kai Kruschke (Gast)


Lesenswert?

Hi hi leichter gesagt als getan...

wie schon gesagt durch fremden code... :(
ohne kommentar durch zu schauen... aber nagut ich probiers mal...
vieleicht erbarmt sich ja doch noch jemand, das mehr zu erklären ;)

cu Kai

von Hagen (Gast)


Lesenswert?

Also, ein Byte geht von 0 bis 256 und hat maximal 3 Dezimalstellen.

Angenommen:
X = Byte = Input
D[0..2] array of Char = Output


setze D[0] = D[1] = D[2] = '0';
solange X >= 100 inkrementiere D[2] und X = X - 100;
solange X >=  10 inkrementiere D[1] und X = X - 10;
D[0] = D[0] + X;

1. Loop wird minimal 0, maximal 2 mal durchlaufen
2. Loop wird minimal 0, maximal 9 mal durchlaufen

wird statt der obigen 100 und 10 zB. 8^3, 8^2 und 8^1 benutzt, wird das
Resultat als Oktalstring konvertiert.

Für ein Byte funktioniert diese Methode noch effizient genug.

Gruß Hagen

von Peter D. (peda)


Lesenswert?

"vieleicht erbarmt sich ja doch noch jemand, das mehr zu erklären ;)"


Das ist eben sehr schwer, wenn man nicht weiß, wo es hakt bzw. welche
Grundkenntnisse überhaupt vorhanden sind.

Deshalb denke ich, daß Simulieren am effektivsten sein wird, einfach
mal verschiedene Zahlen (z.B. 0, 1, 10, 100, 255) eingeben und
ausprobieren, was rauskommt und wie die einzelnen Zwischenschritte
sind.


@Hagen,

"Für ein Byte funktioniert diese Methode noch effizient genug."

Die Subtraktionsmethode ist immer am effektivsten, wenn kein
Divisionsbefehl vorhanden ist egal, ob bei 8, 16, 24 oder 32 Bit.


Peter

von Hagen (Gast)


Lesenswert?

>Die Subtraktionsmethode ist immer am effektivsten, wenn kein
>Divisionsbefehl vorhanden ist egal, ob bei 8, 16, 24 oder 32 Bit.

Das ist richtig :) es gibt aber auch Hardware die effizientere Methoden
erlauben, zB. eben Division oder BCD Konvertierungen.
Es gibt aber auch Negativbeipiele wo ein Programmierer mit einem
langsammen Hardware-Dividierer ein Byte umgewandelt hat, obwohl die
Hardware effektiv langsammer war als die Subtraktionsmethode.

Gruß Hagen

von Kai Kruschke (Gast)


Lesenswert?

Ich mal wieder...

ich habe jetzt schon viel rumprobiert
packe es einfach nicht. Kann mir bitte nocheinmal jemand schritt für
schritt erklären was da gemacht werden muss... :(

MSB = 0b00000000
LSB = 0b10101010

Wie bekomm ich das nun als Dezimal zahl.... heul

cu Kai

von Gerhard Schmidt (Gast)


Lesenswert?


von Kai Kruschke (Gast)


Lesenswert?

Ok hab es endlich ;)
erstmal vielen Dank an alle die versucht haben zu helfen.
Wenn erst einmal der wurm drin steckt ist es glaube ich schwer
diesen aus dem Kopf wieder rauszubekommen.

Eigendlich ist das "auszählen" sehr einfach, man muss halt erstmal
drauf kommen.

cu Kai

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.