Forum: Mikrocontroller und Digitale Elektronik Frage zur Speicherorganisation 8051uC


von Mathias Storz (Gast)


Lesenswert?

Hi
beschäftige mich grad mit der uC - programmierung mit keil!
da ich noch ganz am anfang stehe hät ich gleich mal eine Frage zur
Speicherorganisation!
Ich hab ja einen internen Speicher von 00h - FFh, der ja wiederum
aufgeteilt wird in den unteren Speicherbereich 00h - 7Fh(unteren 128
Byte RAM, direkt oder indirekt Adressierbar) und den oberen
Speicherbereich 80h - FFh. Der obere Speicherbereich ist ja indirekt
Adressierbar und auch noch direkt adressierbar für die Special Function
Register!
Zu meiner Frage wann benutze ich welchen Speicherbereich? Muss ich ja
wissen zwecks der Adressierung! Warum ist der obere Speicherbereich für
SFR und Daten!?

Thanks @ all

von A.K. (Gast)


Lesenswert?

Sind ja eigentlich 3 Speicherbereiche:
- RAM 128 Bytes, direkt und indirekt adressierbar
- RAM 128 Bytes, nur indirekt adressierbar
- SFR-Bereich, nur direkt adressierbar

Indirekte Adressierung ist umständlicher. Dorthin gehören Daten, die
nicht oder nur selten direkt angesprochen werden, wie Puffer, Stack und
dergleichen.

von Mathias Storz (Gast)


Lesenswert?

Der obere Speicherbereich kann somit "doppelt" belegt werden!? Einmal
durch die SFR und einmal durch die Daten!? Wie geht dass einen gleichen
Speicherbereich 80h-FFh doppelt zu beschreiben! Die ganze
Speicherorganisation ist mir nicht ganz klar! Im unteren Bereich
00h-7Fh hab ich zum Teil Register, zum Teil einen Bitadressierbaren
Bereich!
Wie groß ist denn ein Register? 8Bit?

von cazy horse (Gast)


Lesenswert?

das geht eben deshalb, weil unterschiedliche Adressierungsarten
verwendet werden. Natürlich sind die SFR und die oberen 128Byte
verschiedene Speicherzellen. Sie haben  die gleiche Adresse, es werden
aber intern unterschiedliche read/write-Signale erzeugt. Davon merkst
du nichts, wählst du direkte Adressierung, landet der Zugriff im
SFR-Bereich, indirekt eben im erweiterten RAM (der Original-8051 hat
nur die unteren 128 Byte.

von A.K. (Gast)


Lesenswert?

- Assembler-Befehle, in denen die Adresse direkt im Befehl angegeben
ist, sprechen bei Adresse 00-7F das RAM, bei 80-FF die SFRs an.

- Assembler-Befehle, in denen die Adresse via @Rx im Register steht,
sprechen bei Registerinhalt 00-FF das RAM an.

Register sind 8bit breit. Die ersten 128 Bytes vom RAM dienen teilweise
auch als Register und sind teils bitweise ansprechbar. Anders als im
obigen Fall ist das der phyikalisch gleiche Speicher, nur auf
unterschiedliche Art angesprochen.

von Mathias Storz (Gast)


Lesenswert?

aber woher weiß ich denn welchen Speicher ich verwenden soll? oder ist
das egal? wieso gibt man dann nicht einfach die oberen 128Byte nen
höheren Adressbereich als 80-FF? Kommt dass daher das nur 8 Bit möglich
sind(Nur 8-Bit Adressen möglich?)!?

von dds5 (Gast)


Lesenswert?

Direkte Adressierung ist wegen 8 Bit Adresse (zweites Byte des Befehls)
nur von 0 bis 255 möglich.

Für die indirekte Adressierung größerer Speicherbereiche (über externen
Daten- und Adressbus angeschlossen) gibt es das dptr (dpl und dph)
Doppelregister mit 16 Bit.

Die movc und movx Befehle arbeiten mit diesem Register(paar).

Dieter

von Mathias Storz (Gast)


Lesenswert?

wenn bei der indirekten Adressierung 16 Bit möglich sind wieso wird dann
der obere Speicherberiech und SFR mit 80h- FFh bezeichnet!
Dann könnte man doch den oberen Speicherbereich eine höhere Adress
geben, dass wär doch viel verständlicher!?
oberer Speicherbereich lässt sich ja nur indirekt Adressieren da wären
doch dann höhere Adressen möglich!

von A.K. (Gast)


Lesenswert?

Die 8051 Architektur entstammt den 70-er Jahren des vergangenen
Jahrhunderts und war wie so manche Architektur von Intel ;-) nicht für
jahrzehntelange Nutzung konzipiert. Die ursprüngliche Version 8051
hatte überhaupt nur 128 Bytes RAM und 4KB ROM. Mit dem ROM musste
sparsam umgegangen werden, daher waren nur 8 Bit breite RAM-Adressen
vorgesehen und bei nur 128 Bytes RAM ist dein Problem schlicht nicht
existent.

Und so kommt es eben, dass heutige 51er-Derivate nicht nur durch diese
seltsam anmutende RAM-Konstruktion brillieren, sondern zudem auch noch
über einen weiteren 8-bit-indirekt adressierten RAM-Bereich und diverse
KB 16-bit-indirekt addressiertes RAM verfügen.

Anderen ist es nicht unbedingt besser ergangen. Zilog Z8 hatte auch nur
8 Bit und mit eZ8 dann auf 12 Bits aufgebohrt. Und die Art mit der
12/14-Bit PICs ihr RAM adressieren, ist an Scheusslichkeit nur schwer
zu überbieten. Einzig Motorola blieb dieser Zirkus dank von-Neumann
Architektur und 16 Bit breiter Adresse erspart.

von Peter D. (peda)


Lesenswert?

Wann welche Zugriffe erfolgen, ist einfach zu merken:

1.
Die MOVC-Befehle lesen vom Programmspeicher, d.h. damit kann man auf
Tabellen zugreifen z.B. zur 7-Segment-Umwandlung oder Textausgabe.

2.
Die MOVX-Befehle greifen auf den extendet RAM zu, der mußte früher über
den externen Datenbus angeschlossen werden. Viele moderne 8051 haben
aber bereits 1..8kB extendet RAM intern.

3.
Alle Befehle mit @R0 oder @R1, die keine MOVX-Befehle sind, greifen auf
den indirekten RAM zu, d.h. von 0x00..0xFF.
PUSH/POP sind auch indirekte Adressierungsarten, d.h. auch der Stack
kann bis 0xFF gehen.

4.
Allen anderen Befehle greifen von 0x00..0x7F auf den direkten RAM zu
bzw. von 0x80..0xFF auf die SFRs.

5.
Alle Bitbefehle greifen auf den Bitbereich (0x20..0x2F) zu, das
entspricht dann den Bitadressen 0x00..0x7F.

6.
SFRs, deren Adresse 0x*0 oder 0x*8 ist, können auch bitweise
zugegriffen werden. Die Bitadressen sind dann 0x*8..0x*7 bzw.
0x*8..0x*F, z.B. für das SFR 0xA8: 0xA8..0xAF.

Zu beachten ist, daß die Register mit im RAM liegen, d.h. je nach
ausgewählter Bank sind also die Adressen 0x00..0x1F überlagert. Um z.B.
das Register 7 von Bank 0 auf dem Stack zu sichern, schreibt man "PUSH
0x07".


Einige neuere 8051 haben erweiterte Adressierungsarten, z.B. der
Philips P89C669 kann bis 8MB adressieren und hat dazu 8 (2 je
Registerbank) Universalpointer, die 24 Bit breit sind.
Da sind dann alle Speicherbereiche linear hintereinander gemapt (Flash,
indirekter RAM, extendet RAM).
Zusätzlich Befehle (EJMP, ECALL, ERET) sind für den 24Bit
Funktionsaufruf vorhanden.


Peter

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.