mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik registerinhalt in 2Byte aufteilen


Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: sam (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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-Tutori...

btw. ist deine Zahl, 38, ist die in hex oder Dezimal?

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
;; Input:  Wert x in R24
;; Output: x div 10 in R27
;; Zerstört: R24, R26
div10:
  ; x*25
  ldi R26, 25
  mul R24, R26
  movw R26, r0
  clr __zero_reg__ ; avr-gcc hat immer 0 in R1
  ; x = x/2
  lsr R24
  ; += x/2
  add R26, R24
  adc R27, __zero_reg__
  ; += 25
  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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.