Forum: Mikrocontroller und Digitale Elektronik registerinhalt in 2Byte aufteilen


von gast (Gast)


Lesenswert?

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

von sam (Gast)


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?

von gast (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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?

von gast (Gast)


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

von Karl H. (kbuchegg)


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.

von Johann L. (gjlayde) Benutzerseite


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

von Karl H. (kbuchegg)


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.

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
Noch kein Account? Hier anmelden.