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
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.
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
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
"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
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
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
"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
>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
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
Vielleicht hilft das weiter: http://www.avr-asm-tutorial.net/avr_de/rechnen/konversion.html MfG Gerd
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.