Forum: Mikrocontroller und Digitale Elektronik LOW and HIGH Arbeitsregister?


von H. F. (hfquincy)


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

von Drahteinsparer (Gast)


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.

von Kai G. (runtimeterror)


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.

von spess53 (Gast)


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

von Falk B. (falk)


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.
1
ldi  ZL,low(meine_daten*2)
2
ldi  ZH,high(meine_daten*2)
3
; Der Z-Pointzer, welcher aus R30/r31 besteht, zeigt nun auf meine_daten
4
5
....
6
7
meine_daten:    ; eine Tabelle im Flash
8
db. 1,2,3,4,5,6,7

Siehe

AVR-Tutorial: Mehrfachverzweigung

MFG
Falk

von Johannes M. (johnny-m)


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.

von H. F. (hfquincy)


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

von Karl H. (kbuchegg)


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

von H. F. (hfquincy)


Lesenswert?

Prima,

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

LG


HFQ

von Karl H. (kbuchegg)


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.

von spess53 (Gast)


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

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.