Forum: Mikrocontroller und Digitale Elektronik verschiedene Adressen im Register Summary des Datenblattes


von Matthias K. (john_connor)


Lesenswert?

Bei dem Register Summary des ATmega128 Datenblatts sind immer zwei 
verschiedene Adressen in einer Zeile angegeben.

Beispiel:
Adresse      |    Name          |
$3F ($5F)          SREG
$3E ($5E)          SPH

Warum gibt es verschiedene Adressen für das gleiche Register?

von hmm.. (Gast)


Lesenswert?

Der Unterschied wird in den 32 ($20) internen Registern liegen.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Das eine ist die I/O-Adresse, wie sie zB für IN/CBI/SBIC... anzugeben 
ist. Das andere ist die RAM-Adressem wie sie für STS... und 
Adressarithmetik (in avr-gcc) verwendet wird.

Johann

von Matthias K. (john_connor)


Lesenswert?

hmm.. schrieb:
> Der Unterschied wird in den 32 ($20) internen Registern liegen.

Eigentlich sind doch alle Register des Mikrocontrollers intern?
(Register befinden sich innerhalb des Míkrocontrollerbausteins)

Es gab ja mal CPU's welche auf einen erweiterten Cache auf den Mainboard 
zurückgreifen konnten. Nur da macht eine Unterscheidung interne/externe 
Register für mich Sinn.

Meinst du mit "interne Register" vielleicht Register welche nur der 
Mikrocontroller selbst verändern kann? (im Gegensatz zu Register welche 
vom Programmierer verändert werden können)

Johann L. schrieb:
> Das eine ist die I/O-Adresse, wie sie zB für IN/CBI/SBIC... anzugeben
> ist. Das andere ist die RAM-Adressem wie sie für STS... und
> Adressarithmetik (in avr-gcc) verwendet wird.
>
> Johann

Was ist dann was?
Ist die erste angegeben Adress die I/O Adresse?
Oder ist die I/O Adresse die zweite Angegebene Adresse? (welche in 
Klammer hinter der ersten Adresse steht)

von spess53 (Gast)


Lesenswert?

Hi

>st die erste angegeben Adress die I/O Adresse?
>Oder ist die I/O Adresse die zweite Angegebene Adresse? (welche in
>Klammer hinter der ersten Adresse steht)

Der Wert in der Klammer ist die absolute Adresse. Der Wert davor die 
IO-Adresse.
Bei den AVRs befinden sich r0..r31, IO-Adressen und RAM im gleichen 
Adressraum. Bestimmte Befehle (z.B. in/out...) addieren beim Zugriff $20 
zur angegebenen Adresse. Dadurch lässt sich der Adressbereich $20...$5F 
mit einer 6 Bit-Adresse ansprechen.

MfG Spess

von Hannes Lux (Gast)


Lesenswert?

Du solltest mal (anhand des Datenblattes) den Unterschied ergründen 
zwischen:

- unteren Allzweckregistern (r0-r15), darunter die Besonderheit von
  r0 und r1
- oberen Allzweckregistern (r16-r31), darunter die Pointer-Register
- unteren 32 I/O-Registern (und ihren Zugriffsmöglichkeiten)
- oberen 32 I/O-Registern (und ihren Zugriffsmöglichkeiten)
- extended I/O-Bereich (mit seinen arg begrenzten Zugriffsmöglichkeiten)
- SRAM

Und dann solltest Du mal die Unterschiede zwischen IN, OUT und LD, LDD, 
LDS, ST, STD, STS, ergründen, dabei besonders auf die Adressierung 
achten.

Ohne dieses Wissen über die AVR-Architektur wirst Du nicht so recht 
voran kommen.

...

von hmm.. (Gast)


Lesenswert?

Zumindest in ASM.

von Z8 (Gast)


Lesenswert?

Beispiel: (M644)

asm:
   out portb, r16  =  sts portb, r16

beide Anweisungen sind gleichwertig.

wird übesetzt in:
   out 0x05, r16  =   sts 0x25, r16


Z8

von Z8 (Gast)


Lesenswert?

edit:

3. Zeile
> out portb, r16  =  sts portb, r16

ist nonsens!

sts portb, r16 ; speichert den Wert aus r16 nicht an Adr. 0x25 sondern
               ; an Adr. 0x05

der Reset stimmt. sorry Z8

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.