guten nabend ich habe im register =r17 eine zahl zb.38 die soll im sram abgelgt werden und zwar 3 und 8 einzeln aber wie kann ich die zahl aufsplitten .dseg zahl .byte2 für eine abtwort wäre ich dankbar
ganzzahlige division durch 10? 38 durch 10 gleich 3 rest 8 (int) (38/10) = 3 38 mod 10 = 8 (modulodivision ... ich glaub % in C) oder 38 - (int(38/10) * 10) = 8 haperts hier an der mathematik oder am speichern im ram?
ich arbeite mit nem atmega8 in asm, es habert ein wenig beim praktischen umsetzen vielleicht wäre es möglich mir ein wenig auf die sprünge zuhelfen mfg
gast schrieb: > ich arbeite mit nem atmega8 in asm, > es habert ein wenig beim praktischen umsetzen > vielleicht wäre es möglich mir ein wenig auf die sprünge zuhelfen dein Problem ist die Division. http://www.mikrocontroller.net/articles/AVR-Tutorial:_Arithmetik8 btw. ist deine Zahl, 38, ist die in hex oder Dezimal?
>btw. ist deine Zahl, 38, ist die in hex oder Dezimal? die zahl liegt in dezimal vor >http://www.mikrocontroller.net/articles/AVR-Tutori... den Artikel habe ich mir schon durchgelesen, wie gesagt , die zahl soll dann in 2Byte im sram abgelegt werden und später über uart versendet werden aber vorm versenden muss noch in ascii gewandelt werden,das problem was ich hab die zahl 38 in 2byte aufzuteilen mfg
gast schrieb: >>btw. ist deine Zahl, 38, ist die in hex oder Dezimal? > > die zahl liegt in dezimal vor > >>http://www.mikrocontroller.net/articles/AVR-Tutori... > den Artikel habe ich mir schon durchgelesen, > wie gesagt , die zahl soll dann in 2Byte im sram abgelegt werden und > später über uart versendet werden aber vorm versenden muss noch in ascii > gewandelt werden,das problem was ich hab die zahl 38 in 2byte > aufzuteilen Schau dir auch noch andere Tutorialsbeiträge an. Da kommt dasselbe 'Problem' des öfteren vor. Praktisch immer dann, wenn eine Zahl irgendwo angezeigt werden muss. Allerdings wird dort selten eine tatsächliche 'Division' wie im Arithmetik Beitrag beschrieben, benutzt. Das benutzte Prinzip ist sehr viel einfacher. Wenn du wissen willst, wieviele Zehner in 56 enthalten sind, dann ziehst du einfach ständig 10 ab, bis du ein Ergebnis kleiner 0 erhältst. Du zählst mit wie oft du das gemacht hat und diese Anzahl ist die Anzahl der Zehner in 56 Zahl Anzahl Zehner 56 0 46 1 36 2 26 3 16 4 6 5 -4 <- Oops, Ergebnis ist negativ. Daher braucht nicht weiter gemacht zu werden Die Anzahl der Zehner in 56 beträgt 5. Zum letzten 'Ergebnis' -4, werden noch 10 dazuaddiert, das machtz 6. Also sind in 56 genau 6 Einer enthalten. PS: Mit einem Byte kannst du Zahlen bis 255 darstellen. Es reicht also nicht wenn du nur auf Zehner und Einer zerlegst. Da können auch Hunderter vorkommen. Das Prinzip ist aber dasselbe. Einfach immer 100 abziehen und mitzählen, wie oft das geht, ehe ein negatives Zwischenergebnis auftritt. Dieses in einer Schleife abziehen und mitzählen, ist für diesen Zweck eigentlich gar nicht so schlecht geeignet. Es ist einfach und auch nicht langsamer als eine richtige, allgemeine Division. Man kann allerdings auch eine richtige Divisionroutine dafür einsetzen. Auf der Arithmetikseite findet sich doch eine. Musst du nur auf deine tatsächliche Registerbenutzung anpassen.
Karl heinz Buchegger schrieb: > gast schrieb: >>>btw. ist deine Zahl, 38, ist die in hex oder Dezimal? >> >> die zahl liegt in dezimal vor >> >>>http://www.mikrocontroller.net/articles/AVR-Tutori... ojojoj ... der Overkill ...die Wumme Speziell wenn man durch eine Konstante K teilt, kann man das geschickter machen, indem man mit 1/K multipliziert. Hier ausgetextet für K=10:
1 | ;; Input: Wert x in R24 |
2 | ;; Output: x div 10 in R27 |
3 | ;; Zerstört: R24, R26 |
4 | div10: |
5 | ; x*25 |
6 | ldi R26, 25 |
7 | mul R24, R26 |
8 | movw R26, r0 |
9 | clr __zero_reg__ ; avr-gcc hat immer 0 in R1 |
10 | ; x = x/2 |
11 | lsr R24 |
12 | ; += x/2 |
13 | add R26, R24 |
14 | adc R27, __zero_reg__ |
15 | ; += 25 |
16 | adiw R26, 25 |
Der Fall K=10 taucht oft auf, wenn man eine Zahl für die Darstellung in Einer und Zehner aufspalten will. Mit obigem Code erhält man die Zehner in R27. Die Berechnung der Einer ist eine Übung für den geneigten Foren-Leser ;-) Es braucht dann ne handvoll Instruktionen mehr. Johann
Johann L. schrieb: > Mit obigem Code erhält man die Zehner in R27. Die Berechnung der Einer > ist eine Übung für den geneigten Foren-Leser ;-) Es braucht dann ne > handvoll Instruktionen mehr. Nette Routine. Allerdings glaub ich nicht, dass gast verstehen wird, was da abgeht. Hinweis für gast: Wenn das Ergebnis in r26/r27 steht (r26 ist das LowByte) und man effektiv nur r27 weiterverwendet, hat man dem Prinzip nach r26/r27 durch 256 dividiert. 25,6 * x / 256 ist aber dasselbe wie x / 10. Nur dass man durch 256 viel simpler dividieren kann: Man lässt einfach das Low-Byte weg.
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.