www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LOW and HIGH Arbeitsregister?


Autor: H. F. (hfquincy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Servus,

habe eine totale Anfänger Frage, die ich mittels älteren Beträgen nicht 
selbst beantworten konnte.

Habe in einem Beispiel Code gesehen, dass ein Arbeitsregister (r16) auch 
mit HIGH and LOW angesprochen werden kann. Low addressiert das erste 
(0-7) und HIGH obere Byte (8-15), richtig? Ist es aber nicht so, dass 
die Arbeitsregister nur 1 Byte groß sind? Ist diese adressierung dann 
nicht Unsinn?

LG


HFQ

Autor: Drahteinsparer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Ist es aber nicht so, dass
>die Arbeitsregister nur 1 Byte groß sind?

Musst mal im Datenblatt nachschauen. r32, r31, r30 sind 16 Bit breit.

Autor: Kai G. (runtimeterror)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Ist diese adressierung dann
>nicht Unsinn?

Siehe auch: Beitrag "Little oder Big Endian im mega64?"
Der Fred ist noch ganz warm...

Normaler Weise werden die Bytes einzeln angesprochen. Da das aber bei 
Adressen lästig ist, haben die sich für die X, Y, Z-Register Ausnahmen 
einfallen lassen. High und Low sprichst du einfach über XH, XL, YH, YL, 
ZH, ZL an.

>Low addressiert das erste (0-7) und HIGH obere Byte (8-15), richtig?
Low ist Bit 0-7 und High ist 8-15 und die Anordnung erst Low, dann High 
ist Little Endian, korrekt.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
HI

High und Low beziehen nicht auf das Register, sondern auf das Argument.
Also du lädst damit z.B. r16 mit den oberen oder unteren 8 Bit eines 
Wertes.
Das ganze ist sinnvoll, wenn man einen Wert>255 auf zwei Register 
aufteilen will.

MfG Spess

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ hfquincy

>Habe in einem Beispiel Code gesehen, dass ein Arbeitsregister (r16) auch
>mit HIGH and LOW angesprochen werden kann.

Nein, so nicht.

> Low addressiert das erste (0-7) und HIGH obere Byte (8-15), richtig?

Ja, von einer Konstante.

> Ist es aber nicht so, dass
>die Arbeitsregister nur 1 Byte groß sind? Ist diese adressierung dann
>nicht Unsinn?

Nöö. Das nutzt man so.
ldi  ZL,low(meine_daten*2)
ldi  ZH,high(meine_daten*2)
; Der Z-Pointzer, welcher aus R30/r31 besteht, zeigt nun auf meine_daten

....

meine_daten:    ; eine Tabelle im Flash
db. 1,2,3,4,5,6,7

Siehe

AVR-Tutorial: Mehrfachverzweigung

MFG
Falk

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Drahteinsparer wrote:
>>Ist es aber nicht so, dass
>>die Arbeitsregister nur 1 Byte groß sind?
>
> Musst mal im Datenblatt nachschauen. r32, r31, r30 sind 16 Bit breit.
Da solltest Du wohl selber mal im Datenblatt nachschauen... 
16-Bit-Register gibt es beim AVR nicht, nur einige Befehle, die 
Registerpaare ansprechen können.

Autor: H. F. (hfquincy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ johnny-m

Genau so habe ich das auch verstanden. Wofür also z. B. so etwas:
...
ldi r16,LOW(RAMEND)
out SPL,r16
ldi r16,HIGH(RAMEND)
out SPH,r16
...

Dass es sich insgesamt in dem Bsp. um die Initialisierung des Stack 
Pointers handelt ist mir völlig klar. Und das unter den Arbeitsregistern 
auch 3 Pointer Registerpaare (X,Y,Z) existieren, ist mir auch bekannt. 
Aber dies trifft

A) bei R16 nicht zu UND
B) weiterhin wird in dem o.g. Bsp. ausschließlich R16 mit LOW/HIGH 
angesprochen

Hast du so etwas schon einmal gesehen? Wie darf ich das verstehen?

LG

HFQ

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

Bewertung
0 lesenswert
nicht lesenswert
H. F. wrote:
> ...
> ldi r16,LOW(RAMEND)
> out SPL,r16
> ldi r16,HIGH(RAMEND)
> out SPH,r16
> ...
>
> Dass es sich insgesamt in dem Bsp. um die Initialisierung des Stack
> Pointers handelt ist mir völlig klar. Und das unter den Arbeitsregistern
> auch 3 Pointer Registerpaare (X,Y,Z) existieren, ist mir auch bekannt.
> Aber dies trifft
>
> A) bei R16 nicht zu UND
> B) weiterhin wird in dem o.g. Bsp. ausschließlich R16 mit LOW/HIGH
> angesprochen

Da wird nicht r16 angesprochen. Das LOW bzw. HIGH bezieht sich auf
RAMEND.
RAMEND ist ein 16 Bit Wert. Davon willst du das niederwertige Byte
und dieses soll wiederrum in r16 landen

    ldi   r16, LOW(RAMEND)

von wo es dann weitergereicht wird in das Register, welches
das niederwertige Byte des Stackpointer aufnimmt.

    out SPL, r16

Selbiges mit dem höherwertigen Byte von RAMEND und dem HIGH

Autor: H. F. (hfquincy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Prima,

jetzt habe ich auch Spess53 verstanden. Vielen Dank für diese Antworten 
dafür! Weiß nun endlich bescheid.

LG


HFQ

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

Bewertung
0 lesenswert
nicht lesenswert
H. F. wrote:
> Prima,
>
> lag es an meiner ersten Frage?

Indirekt.

Merken: Wenn du Fragen zu einem Codestück hast, dann zeige
das Codestück selbst und nicht nur eine Beschreibung davon.

Ein Codestück ist meistens ziemlich eindeutig. Eine
Beschreibung davon eher nicht.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Mal ein Beispiel:

Low($3FF)=$FF
High($3FF)=$03

Beim Stackpointer ist r16 nur ein Zwischenregister, da SPL/SPH nicht 
direkt mit einem Wert geladen werden können. Das Low und High bezieht 
sich in diesem Fall auf SPL und SPH.

MfG Spess

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.