ich habe eine dualzahl z.b. 0b11111111=0d255. die zahl kodiert bei mir eine dezimalzahl mit 10tel kommastelle also 255=>25,5. da ich das ganze auf nem lcd ausgeben muss, hatte ich mir gedacht ich schneide die erste 10er stelle von 255 ab, so dass nur noch 25 bleiben und gebe dann sowas wie:
print 25 print "," print 5
aus. kann mir jemand erklären wie ich dieses problem lösen kann? wie gesagt in (avr-)assembler.
Ich weiß die Lösung zwar nicht, aber im Prinzip ist die Sprache Assembler hierbei egal. Es reicht, einen Algorithmus in einer höheren Sprache zu finden, der ohne Division auskommt. Dann kann man ihn als Assembler darstellen.
Mit Modulo und Division kann man sowas erledigen: 255 / 10 = 25 (Gerundet) 255 mod 10 = 5
Da allerdings der Faktor 10 in den meisten Architekturen eher schlecht ist, würde ich empfehlen das ganze als BCD-Variante zu speichern. Z.b. die ersten 5 Bit als Vorkommastellen und die restlichen 3 als Nachkommastellen, oder je nachdem wie du es halt brauchst. Dann kannst mit Binäroperationen wie Rightshift um Anzahl der Nachkommastellen die Vorkommastellen und mit einer And-Verknüpfung die Nachkommastellen lesen. 1001 0100 in BDC = 9,4 in Dezimal, da 10010100 rsh 4 = 1001b = 9 und 10010100b and 1111b = 0100b = 4. In vielen Prozessoren wird BCD auch unterstützt. Ist halt allerdings nicht das kompakteste Format.
Da die AVRs keine Division unterstützen, bleibt dir nichts anderes übrig, als von deinem Ausgangswert sukzessive 10 zu subtrahieren (müsste mit subi gehen) und zwar solange, bis das Ergebnis wieder größer ist, als dein vorhergehendes Ergebnis (könnte auch sein, dass ein Statusbit gesetzt wird).