registerinhalt in 2Byte aufteilen

Gast #1274205
Lesenswert?

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?
Gast #1274243
Lesenswert?

>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
#1274244
Lesenswert?

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.
Persönliche Seite #1274252
Lesenswert?

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
#1274257
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren