www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Frage zur Speicherorganisation 8051uC


Autor: Mathias Storz (Gast)
Datum:

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

Autor: A.K. (Gast)
Datum:

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

Autor: Mathias Storz (Gast)
Datum:

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

Autor: cazy horse (Gast)
Datum:

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

Autor: A.K. (Gast)
Datum:

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

Autor: Mathias Storz (Gast)
Datum:

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

Autor: dds5 (Gast)
Datum:

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

Autor: Mathias Storz (Gast)
Datum:

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

Autor: A.K. (Gast)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

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

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.