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
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.
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?
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.
- 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.
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?)!?
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
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!
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.