FÜHRENDE PROGRAMMIER- UND MESSLÖSUNGEN

Mikrocontroller Technik

Zur MCS-51 Familie gehören viele beliebte Mikrocontroller, darunter Exemplare die sich bereits seit vielen Jahren bewährt haben. Sie werden im Hobby-Bereich und in der kommerziellen Anwendung von Antiblockiersystemen bis zu komplexen Robotersteuerungen eingesetzt und gelten nicht umsonst als Industriestandard. Ich möchte hier nur einen Auszug der Typen aufzählen. Dazu gehören der 80c31, 80c51, 80c52, 80c535, 80c537, 89c2051, 89c4051, 89c51, 89c52, 89c55 und noch viele mehr.

Der Programmspeicher (ROM/Flash)

Der Programmspeicher kann je nach benutzten E(E)prom bzw. integrierten Flash Speicher bis zu 64 KByte groß sein. Die folgenden Adressen sind sogenannte Startadressen, ihnen fällt eine besondere Bedeutung zu.

Adresse: Bezeichnung: Beschreibung:
(0000) Reset Adresse Von hier aus startet der Mikrocontroller nach einem Reset. Der Befehl der an dieser Adresse steht wird also zuerst ausgeführt. Falls Interrupts verwendet werdet, sollte der erste Befehl ein Sprungbefehl sein, um die nachfolgenden Startadressen zu überspringen.
(0003) Externer Interrupt 0 Wenn dieser Interrupt freigegeben ist und aufgerufen wird, dann springt der Mikrocontroller an diese Adresse.
(000B) Interrupt Timer 0 siehe oben
(0013) Externer Interrupt 1 siehe oben
(001B) Interrupt Timer 1 siehe oben
(0023): Serieller Port Interrrupt siehe oben
(002B): Interrupt Timer 2 siehe oben

Wenn Sie einige dieser Interrupts nicht benötigen, können Sie die Speicherplätze natürlich auch ganz normal mit benutzen.

Der Datenspeicher (RAM)

Es gibt zwei mögliche Datenspeicher. Einmal den integrierten RAM-Speicher, der je nach Mikrocontroller 128 oder 256 Byte groß ist; und den externen Speicher in einem RAM-Baustein, der bis zu 64KByte groß sein kann.

Der integrierte RAM-Speicher teilt sich in einen oberen und einen unteren Bereich auf. Im unteren Bereich stehen die 128 Byte zwar frei zur Verfügung, jedoch existieren in ihm drei Bereiche mit Sonderfunktionen.

FF

80

Oberer RAM Bereich
(Nur MCs mit 256 Byte RAM)

7F

30

Allgemeines RAM

2F

20

Bitadressierbarer Bereich (Bit 00-7F)

1F

18

Registerbank 3

17

10

Registerbank 2

0F

08

Registerbank 1

07

00

Registerbank 0

FF

80

Spezial Funktions Register
(alle MC)




<<< Resetwert des Stackpointers: 08

Registerbänke:

Als erste Sonderfunktion im unteren RAM Bereich wären da die Registerbänke zu nennen. Jede Bank besteht aus jeweils 8 Registern. Die Registerbänke lassen sich softwaremäßig einschalten, durch das Beschreiben der Bits 3 und 4 im Programmstatuswort(PSW). Nach einem Reset ist die Registerbank 0 eingestellt.

Registerbank 0: Bytes 0 bis 7
Registerbank 1: Bytes 8 bis 15
Registerbank 2: Bytes 16 bis 24
Registerbank 3: Bytes 25 bis 31

Stack:

Der Stack speichert den aktuellen Inhalt des Programmzählers, wenn eine Unterroutine oder ein Interrupt aufgerufen wird. Dies erfolgt damit der Mikrocontroller nach der Abarbeitung einer solchen Routine wieder an der unterbrochenen Stelle des Hauptprogrammes fortfahren kann. Die Größe des Stacks hängt von der Anzahl der nacheinander aufgerufenen Unterroutinen ab. Bei jedem neuen Aufruf wird die aktuelle Programmposition in Form von zwei Bytes im Stack gespeichert. Wo dieser Bereich liegt, hängt vom Stackpointer ab.

Nach einem Reset beinhaltet der Stackpointer eine 07. Damit verweist er auf die Adresse 08, da nach einem Eintrag in den Stack zunächst der Wert des Stackpointer um eins erhöht wird und danach die aktuelle Programmadresse an die Adresse geschrieben, die der Stackpointers aufweist. Der Stackpointer lässt sich auch frei Beschreiben, dies ist u.U. nötig um eine Kollision mit einer benötigten Registerbank oder mit einem Bit-Bereich zu vermeiden.

Erfolgt ein Rücksprung aus einer Unterroutine wird die Rücksprungadresse aus dem Stack geholt. Zuerst wird das High Byte an der Adresse gelesen, die der Stackpointer aufweist. Dann wird der Wert des Stackpointer um eins veringert. Nun wird das Low Byte gelesen und der Stackpointer nochmal um eins verringert.

Bitbereich:

Der Bitbereich ist eine ganz besondere Spezialität der mcs-51 Mikrocontroller. Er umfasst 128 Bit (16 Byte) und wird für boolesche Operationen benötigt. Sie können jedes Bit dieses Bereiches einzelnt setzen, rücksetzen und logisch verknüpfen. Er umfasst den Bereich von Byte 20 bis Byte 2F, wobei das erste Bit der Adresse 20 das Bit 00 ist, und das letzte Bit der Adresse 2F das Bit 7F ist.

Byte Nr. Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
2F 7F 7E 7D 7C 7B 7A 79 78
2E 77 76 75 74 73 72 71 70
2D 6F 6E 6D 6C 6B 6A 69 68
2C 67 66 65 64 63 62 61 60
2B 5F 5E 5D 5C 5B 5A 59 58
2A 57 56 55 54 53 52 51 50
29 4F 4E 4D 4C 4B 4A 49 48
28 47 46 45 44 43 42 41 40
27 3F 3E 3D 3C 3B 3A 39 38
26 37 36 35 34 33 32 31 30
25 2F 2E 2D 2C 2B 2A 29 28
24 27 26 25 24 23 22 21 20
23 1F 1E 1D 1C 1B 1A 19 18
22 17 16 15 14 13 12 11 10
21 0F 0E 0D 0C 0B 0A 09 08
20 07 06 05 04 03 02 01 00

Oberer RAM-Bereich:

Bei den MC mit 256 Byte RAM besteht der oberer RAM Bereich aus zwei parallelen Bereichen. Einmal den normalen Bereich und die Spezial-Funktions-Register (SFR, siehe unten). Sie werden durch die Art der Adressierung unterschieden. Der normale RAM-Bereich kann nur über die indirekte Adressierung mit Hilfe von Register 0 und Register 1 erreicht werde, die Spezial-Funktions Register (SFR) werden über die direkte Adressierung abgesprochen.

Beispiel 1: (Schreibe 06 an die normale RAM Speicherstelle 90)
MOV R0,#90
MOV A,#06
MOV @R0,A

Beispiel 2: (Schreibe 06 an die SFR Adresse 90)
MOV 90,#06

Die Spezial-Funktions-Regsiter (SFR)

Durch die Einrichtung der Spezial-Funktions-Register (SFR) werden deutlich mehr Möglichkeiten geschaffen, als mit den 256 Befehlen der MCs eigentlich erreichbar wären. Das Starten der Timer, die Interruptfreigabe und I/O Operationen werden über die SFR erreicht.

Auf die SFR kann nur durch eine direkte Adressierung zugegriffen werden (siehe oben). Auch in diesem Bereich können Sie auf die Adressen, die mit einer 0 oder 8 enden, mit Einzelbitadressierung zugreifen. Z.B. ist das Bit 0 vom Byte 80 (Port 0) ist Bit 80, das Bit 2 vom Byte 90 ist Bit 92, das Bit 6 vom Byte 98 ist Bit 9E usw.

Ein Schreiben auf die nicht belegten Plätze ist ohne Wirkung, man sollte dies aber doch vermeiden um eine Kompatibilität mit nachfolgenden Mikrocontrollern zu wahren. Die nicht belegten Plätze werden immer als Einsen gelesen.

F8 - FF:                
F0 - F7: B              
E8 - EF:                
E0 - E7: ACC              
D8 - DF:                
 D0 - D7:  PSW              
C8 - CF:  T2CON     RCAP2L   RCAP2H   TL2   TH2            
C0 - C7:                
B8 - CF: IP              
B0 - B7:  PORT 3               
A8 - AF: IE              
A0 - A7: P2              
98 - 9F: SCON SBUF            
90 - 97: PORT 1              
88 - 8F: TCON  TMOD  TL0 TL1 TH0 TH1    
80 - 87: PORT 0 SP DPL DPH        PCON 

E0: Akkumulator (ACC):

Der Akkumulator ist das Register, dass bei Operationen mit der Arithmetisch-Logischen-Einheit (kurz:ALU) benutzt wird. Bei Befehlen wird der Akkumulator einfach mit A bezeichnet (z.B. MOV A,#FF).

F0: B-Register (B):

Das B-Register wird für Multiplikationen und Divisionen von dem MC benötigt, ansonsten kann es wie alle anderen RAM Register beschrieben und gelesen werden.

D0: Programmstatuswort (PSW):

Das Programmstatuswort ist bitadressierbar und enthält die folgenden Informationen:

Bit Nr.:  Symbol Funktion 
D7 CY Carry Flag
D6 AC Hilfscarry Flag
D5 F0 Flag 0, zur freien Verwendung
D4 RS1 Registerbank Auswahlbit 1
D3 RS0  Registerbank Auswahlbit 0
D2 0V Überlauf-Flag (Overflow)
D1 -- zur freien Verwendung
D0 P Parity Flag

81: Stackpointer (SP):

Der Stack speichert den aktuellen Inhalt des Programmzählers, wenn eine Unterroutine oder ein Interrupt aufgerufen wird. Dies erfolgt damit der Mikrocontroller nach der Abarbeitung einer solchen Routine wieder an der unterbrochenen Stelle des Hauptprogrammes fortfahren kann. Die Größe des Stacks hängt von der Anzahl der nacheinander aufgerufenen Unterroutinen ab. Bei jedem neuen Aufruf wird die aktuelle Programmposition in Form von zwei Bytes im Stack gespeichert. Wo dieser Bereich liegt, hängt vom Stackpointer ab.

Nach einem Reset beinhaltet der Stackpointer eine 07. Damit verweist er auf die Adresse 08, da nach einem Eintrag in den Stack zunächst der Wert des Stackpointer um eins erhöht wird und danach die aktuelle Programmadresse an die Adresse geschrieben, die der Stackpointers aufweist. Der Stackpointer lässt sich auch frei Beschreiben, dies ist u.U. nötig um eine Kollision mit einer benötigten Registerbank oder mit einem Bit-Bereich zu vermeiden.

Erfolgt ein Rücksprung aus einer Unterroutine wird die Rücksprungadresse aus dem Stack geholt. Zuerst wird das High Byte an der Adresse gelesen, die der Stackpointer aufweist. Dann wird der Wert des Stackpointer um eins veringert. Nun wird das Low Byte gelesen und der Stackpointer nochmal um eins verringert.

82 und 83: Datenpointer (DPTR):

Der Datenpointer besteht aus zwei Bytes, dessen Low-Wert an der Adresse 82 und deren High-Wert an der Adresse 83 steht. Mit Hilfe des Datenpointers wird das externe RAM bei Schreib- und Lesebefehlen addressiert. Zudem kann man den DPTR auch benutzen, um Tabellenwerte im ROM-Speicher zu lesen.

Externes RAM lesen: MOVX A, @DPTR
Externes RAM beschreiben: MOVX @DPTR,A

Daten aus ROM-Tabelle lesen: MOVC A,@A+DPTR

Diese Seite ist noch in Arbeit und soll noch weiter ausgebaut werden...