|
Speicheraufbau |
||
|
|
Des internen und externen Speichers beim 80515 / 80535 |
|
|
|
|
|
|
|
-> |
Gesamtspeicher |
|
||
|
|
-> |
CODE |
|
||
|
|
-> |
XDATA |
|
||
|
|
-> |
DATA / IDATA |
|
||
|
|
-> |
DATA |
|
||
|
|
|
|
IDATA |
|
|
|
|
|
|
BIT |
|
|
CODE |
(Externer) 8kByte großer Programmspeicher, auf dem Chip, abschaltbar |
(normalerweise im externen ROM, max. 64kByte) |
|
XDATA |
Externer Datenspeicher |
(normalerweise im externen RAM, max 64kByte) |
|
DATA |
Interner, direkt adressierbarer Datenspeicher |
(unterer RAM und SFR-Speicher auf den Chip, 128 Bytes + max.128Bytes) |
|
IDATA |
Interner, indirekt adressierbarer Datenspeicher |
(unterer und oberer interner RAM auf dem Chip, 128 Bytes + 128Bytes) |
|
BIT |
Bits der bitadressierbaren Speicherbytes |
(unterer interner RAM und SFR-Speicher, auf dem Chip, 32 Bytes, 265 Bits) |
|
|
Aus dem Programmspeicher kann der Benutzer nur lesen. Der Befehl lautet MOVC (Move_Code). Als Ziel dieser Leseoperation kann nur der Akkumulator (A) angegeben werden. Dabei steht die Basisadresse der zu lesenden Speicherzelle im Programmzähler (PC) oder im Datenzeiger (DPTR). Zu dieser Adresse wird vor dem Zugriff auf den Speicher noch ein Offset hinzuaddiert. Der Offset muß im Akkumulator (A) enthalten sein. Diese Adressierungsart nennt man 'indirekt, indiziert'. Die beiden möglichen Assemblerbefehle lauten ... |
|
|
|
Lesen: |
MOVC A, @A+PC |
MOVC A, @A+DPTR |
|
|
Damit der Programmspeicher vom Datenspeicher unterschieden werden kann, beide liegen ja wie gesagt adreßparallel, wird bei den obigen Befehlen das Lesesignal PSEN aktiviert. Ein Schreibsignal für den Programmspeicher gibt es nicht. |
|
|
|
Da beide Speicher parallel liegen, also gleiche Adressen besitzen, können sie nur durch unterschiedliche Lese-Schreibsignale voneinander getrennt werden. Diese Signale werden durch entsprechende Maschinenbefehle ausgelöst. Für den externen RAM-Speicher gibt es als einzigen Befehl den Tranferbefehl MOVX. Er kann nur indirekt über die 8-Bit Register R0, R1 oder den 16-Bit Datenzeiger DPTR adressiert werden. Durch die Umkehrung von Ziel- und Quelloperand ist es möglich ihn zu lesen oder zu beschreiben. Bei neuen Mikrocontrollern sind wegen der zunehmenden Integrationsdichte einige KByte des externen RAMs bereits auf dem ControllerChip integriert. |
|
|
|
Lesen: |
MOVX A, @R0 |
MOVX A, @DPTR |
|
|
|
MOVX A, @R1 |
|
|
|
Schreiben: |
MOVX @R0, A |
MOVX @DPTR, A |
|
|
|
MOVX @R1, A |
|
|
|
|
|
|
|
mov |
A, |
12h |
; Inhalt des Speichers 12 zum Akkumulator |
|
|
|
|
|
|
mov |
R1, |
#12h |
; Adresse des Speichers 12 zum Register R0 |
|
|
mov |
A, |
@R1 |
; A mit dem Inhalt der Speicherzelle laden, |
|
|
|
|
|
; deren Adresse in R1 steht. |
|
|
|
|
|
|
Dazu sind die Bits einzelner Speicherzellen durchnummeriert. In der Maschinensprache wurden spezielle Befehle eingeführt, die nur mit Bits arbeiten (Boolescher Prozessor, mit C dem CarryFlag als BitAkkumulator). Es ist also möglich, von bestimmten Speicherzellen jedes Bit einzeln zu verändern, oder alle 8 Bits gemeinsam durch Lesen oder Schreiben der entsprechenden Speicherzelle. Bits lassen sich durch die Transferbefehle MOV bit, C oder MOV C, bit lesen und schreiben. Dabei erkennt die CPU des Controllers an der Verwendung des CarryFlags C, daß es sich bei der angegebenen Adresse um eine Bitnummer handeln muß. |
|
|
|
Lesen: |
MOV C, BitNummer |
|
|
|
Schreiben: |
MOV BitNummer, C |
|
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
|
|
Neben den Registern die die Schnittstelleneigenschaften des Controllers bestimmen, sind im SFR-Speicher die Register der CPU des Mikrocontrollers enthalten. Dazu gehören .. |
|
|
|
|
|
|
|
der Akkumulator |
(A) |
[E0h] |
Prozessorhauptregister |
|
|
|
das Hilfsregister |
(B) |
[F0h] |
Benutzt bei Multiplikation und Division |
|
|
|
das Flaggenregister |
(PSW) |
[D0h] |
(Program_Status_Word) |
|
|
|
der Stapelzeiger |
(SP) |
[81h] |
(Stack_Pointer) |
|
|
|
der 16 Bit Datenzeiger |
(DPTR) |
|
(Data_Pointer) Er kann in den externen RAM zeigen und ist das einzige 16-Bit Register |
|
|
|
der sich aus den Registern.. |
(DPL) |
[82h] |
|
|
|
|
zusammensetzt. |
(DPH) |
[83h] |
|
|
|
|
|
|
|
|
Das einzige Register der CPU auf das der Benutzer nicht zugreifen kann ist .. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Damit sich die Programmierung eines Controllers vereinfacht sind den Adressen des SFR-Speichers sowie den Bitadressen Namen zugeordnet. Diese Namen werden normalerweise in Assemblerprogrammen zur Kennzeichnung der Adressen verwendet. Hier gibt es von Assembler zu Assembler geringe Abweichungen. Namen und Adressen werden in Definitionsdateien miteinander in Bezug gebracht, so daß eine Änderung jederzeit möglich ist. Da nicht jeder Controller den gleichen SFR-Speicherumfang besitzt, werden solche Definitionsdateien zu jedem Mitglied der Familie vorgehalten oder können vom Programmierer erstellt werden. |
|
|
|
|
|
|
|
Ein Beispiel für einen indirekten Lesevorgang der internen oberen Speicherzelle 84h wäre: |
|
|
|
mov |
R0 |
#84h |
; Register R0 mit 84h direkt laden |
|
|
|
mov |
A |
@R0 |
; den Inhalt der Speicherzelle, auf die R0 |
|
|
|
|
|
|
; zeigt, das ist die Speicherzelle 84h, |
|
|
|
|
|
|
; in den Akkumulator übertragen. |
|
|
|
|
|
|
|
Schreiben nach 84h würde so aussehen: |
|
|
|
mov |
R0 |
#84h |
; Register R0 mit 84h direkt laden |
|
|
|
mov |
@R0 |
A |
; den Inhalt von A zu der Speicherzelle, |
|
|
|
|
|
|
; auf die R0 zeigt. Das ist die |
|
|
|
|
|
|
; Speicherzelle 84h, deren Adresse |
|
|
|
|
|
|
; in R0 steht. |
|
|
|
|
|
|
|
Beispiel für eine Verlagerung des Stacks in den internen oberen RAM: |
|
|
|
mov |
SP |
#7Fh |
; Stackpointer weist auf Stack ab 80h |
|
|
Da der Stackpointer vor jeder Ablage eines Wertes auf dem Stack incrementiert wird, muß er am Anfang, vor die erste Speicherzelle des Stacks zeigen. Im Beispiel 7Fh. Der Stack beginnt dann bei 80h. Mit einem Stack von 128 Bytes könnten 64 Unterprogrammsprünge stattfinden, ohne daß der Stack überläuft. Aber Achtung, sollte der Stack überlaufen, dann würde er sich bei 00h fortsetzen und Registerbank 0 überschreiben. |
|
|
|
|
|
|
|
Ein ganzer Satz von Maschinenbefehlen kann über die Bitadresse auf diese Einzelbits zugreifen, sie kopieren, verändern und logisch verknüpfen. Dies geschieht über einen 'Booleschen Prozessor' innerhalb der ALU. Dessen 'Arbeitsregister' ist das CarryFlag C. Durch die Bitverarbeitung können so z.B. schnell und einfach Veränderungen an den Ein/Ausgabetoren vorgenommen werden. Es entfällt die Maskenbildung, die bei der Adressierung der Gesamtspeicherzelle nötig wäre, um nur eines ihrer Bits zu verändern. Besonders hervorzuheben ist die Bitadressierbarkeit der CPU-Register.. des Akkumulators A, des Hilfsregisters B und des Flaggenregisters PSW. |
|