|
9. |
|
 |
µVision - alles auf einem Blick:
debug-Modus ... View ... Disassembly Window
Farbige Darstellung hier zur
Veranschaulichung erweitert
Programmcounter
C-Quellcode
Hexcode
Assembler-Code
Kommentierung des
Assembler-Codes und nachfolgende Hinweise von
Marc Schmidt |
C:0x0000 020018 LJMP
C:0018
"Langer" Sprung zur Adresse
C:0x0018
A51
PC
18: main()
19: {
20: P1M1 = 0xFC;
21:
C:0x0003 7591FC
MOV P1M1(0x91),#OCRCL(0xFC)
Lade
den Wert „0xFC“ in den Speicher 0x91(P1M1)
A51
SFR
22: while ( 1 )
23: {
24: if ( ( sbSchranke2 == 0 ) && (
sbSchranke1 == 0 ) )
C:0x0006 20B109
JB sbSchranke2(0xB0.1),C:0012 Wenn Port 3.1 (B0) nicht gesetzt,
dann springe zu Adresse C:0x0012
A51
C:0x0009 20B006
JB sbSchranke1(0xB0.0),C:0012 Wenn Port 3.0 (B0) nicht
gesetzt, dann Springe zu Adresse C:0x0012
25: {
26: sbFehler = 0;
C:0x000C C291
CLR sbFehler(0x90.1) Lösche
Inhalt von Adresse 0x90.1 (Port1 Pin 1) (setze LOW) A51
27: sbOK = 1;
C:0x000E D290
SETB sbOK(0x90.0)
Setze
Adresse 0x90.0 (Port1 Pin 0) (setze HIGH)
A51
28: }
29:
30: else
C:0x0010 80F4
SJMP C:0006 Springe
zu Adresse C:0x0006
A51
31: {
32: sbOK = 0;
C:0x0012 C290
CLR sbOK(0x90.0)
Lösche
Inhalt von Adresse 0x90.0 (Port1 Pin 0) (setze LOW)
33: sbFehler = 1;
C:0x0014 D291
SETB sbFehler(0x90.1)
Setze Adresse
0x90.1 (Port1 Pin 1) (setze HIGH )
34: }
C:0x0016 80EE
SJMP C:0006
Springe zu
Adresse
C:0x0006
In der Programmiersprache C müssen globale
Variablen vorerst mit 0 initialisiert werden
=> Löschen des RAM von 0x7F bis 0x00
C:0x0018 787F
MOV R0,#0x7F
Lade
Register R0 mit Adresse 0x7F
A51
C:0x001A E4
CLR A Lösche
Inhalt von Akku (setze LOW)
A51
C:0x001B F6
MOV @R0,A
Lade
Akku (LOW) in das Register mit der Adresse, die in R0
steht (0x7F). Indirekte Adressierung
A51
C:0x001C D8FD DJNZ
R0,C:001B Decrementiere
(-1) den Wert (Adresse) in Register R0 und
springe zu
Adresse C:0x001B,
wenn Wert nicht NULL
A51
C:0x001E 758107
MOV SP(0x81),#0x07 Schreibe
in den Stack (SP) die Adresse 0x07
C:0x0021 020003 LJMP main(C:0003) Springe
zu Adresse C:0x0003
C:0x0024 00 NOP
No Operation (bewirkt auch kurze
Pause)
A51
C:0x0025 00
NOP
Darstellung der
Assembler-Befehle im Buch C51 / Philips LPC900 Hardware-Software-Toolchain
(M. Baldischweiler) ab Kapitel 11, Unterkapitel 2 erläutert Programmablauf
und Adressenstruktur des 8051-Mikrocontrollers.
Stack (SP): enthält
Adresse des nächsten Befehl (Speicherplatzes)
JNB badr, rel: Wenn
Wert von badr = 0 springe zum relativen Punkt
des Programmzählers.
- Programmschritte werden über Zyklen berechnet. Pro Zyklus werden 2 bit
eingelesen.
Jeder Befehl benötigt 1-3 Zyklen, um ausgeführt
zu werden. Der Befehl JNB benötigt 2 Zyklen.
Im ersten wird badr
und im zweiten wird rel eingelesen. Die
Zieladresse des Sprungbefehls
berechnet sich dann über die Zyklen, die nicht
ausgeführt werden.
Löschen RAM: Der RAM umfasst
die
Adresse 0x00 bis 0x7F. Dies ist der dat/ idata und bdata Bereich.
Ab Adresse 0x80 liegt der SFR Bereich, in dem die
Funktionen des Controllers hinterlegt sind.
Mit der RAM-Lösch-Sequenz werden somit alle Variablen
gelöscht und können danach neu
deklariert werden. Zum Löschen werden ca. 730
Programmschritte benötigt.
Adresse C:0x0003: Enthält normalerweise die
Einstiegsadresse des Interrupt 0.