www.mikrocontroller.net

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


Autor: Kai Kruschke (Gast)
Datum:

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

Autor: crazy horse (Gast)
Datum:

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

Autor: Kai Kruschke (Gast)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Kai Kruschke (Gast)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

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

Autor: Kai Kruschke (Gast)
Datum:

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

Autor: Hagen (Gast)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

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

Autor: Hagen (Gast)
Datum:

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

Autor: Kai Kruschke (Gast)
Datum:

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

Autor: Gerhard Schmidt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht hilft das weiter:

http://www.avr-asm-tutorial.net/avr_de/rechnen/kon...

MfG
Gerd

Autor: Kai Kruschke (Gast)
Datum:

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

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.