home *** CD-ROM | disk | FTP | other *** search
/ Best of German Only 1 / romside_best_of_german_only_1.iso / anwender / sim / sim51_04.arj / MCS51.DOC < prev    next >
Text File  |  1993-02-01  |  204KB  |  4,656 lines

  1. zum Drucken diese Zeilen durch ESC-Seq. ersetzen (Druck mit 12 CPI und Rand):
  2.     z.B. IBM-Proprinter <ESC>@ <ESC>I<3> <ESC>: <ESC>X<12><90>
  3.  
  4.  
  5.  
  6.  
  7. ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  8. █                                                                         █
  9. █                                                                         █
  10. █                                                                         █
  11. █              ▄███▄          ▄███▄        ███████       ▄██              █
  12. █            ▐█     █▌      ▐█     █▌      ██          ▄█ ██              █
  13. █            ▐█     █▌      ██     ██      ██             ██              █
  14. █            ▐█     █▌      ██     ██      ██ ▄▄          ██              █
  15. █              █████        ██     ██      ██▀▀▀█▄        ██              █
  16. █            ▐█     █▌      ██     ██            █▌       ██              █
  17. █            ▐█     █▌      ██     ██            █▌       ██              █
  18. █            ▐█     █▌      ▐█     █▌      ▄     █▌       ██              █
  19. █              ▀███▀          ▀███▀         ▀███▀         ██              █
  20. █                                                                         █
  21. █                                                                         █
  22. █                                                                         █
  23. █                                                                         █
  24. █                                                                         █
  25. █                                                                         █
  26. █   H    H     A     RRRRr    DDDDd    W     W     A     RRRRr    EEEEEE  █
  27. █   H    H    A A    R    R   D    D   W     W    A A    R    R   E       █
  28. █   H    H   A   A   R    R   D    D   W     W   A   A   R    R   E       █
  29. █   HHHHHH   AAAAA   RRRR     D    D   W  W  W   AAAAA   RRRR     EEEEE   █
  30. █   H    H   A   A   R   R    D    D   W W W W   A   A   R   R    E       █
  31. █   H    H   A   A   R   R    D    D   W W W W   A   A   R   R    E       █
  32. █   H    H   A   A   R    R   DDDD      W   W    A   A   R    R   EEEEEE  █
  33. █                                                                         █
  34. █                                                                         █
  35. █                                                                         █
  36. █                                                                         █
  37. ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
  38.  
  39.  
  40.  
  41.  
  42.  
  43.  
  44.  
  45.  
  46.  
  47.  
  48.           Hardware-Beschreibung des 8051 Mikrocontrollers
  49.  
  50.  
  51.  
  52.  
  53.  
  54.              Esslingen im August 1991
  55.  
  56.  
  57. Vorwort:
  58. --------
  59.  
  60. Diese Dokumentation wendet sich an Anfänger,  die sich mit dem  Aufbau  und
  61. der  Funktion  von Controllern der MSC-51 Familie beschäftigen wollen.  Sie
  62. ist dennoch sehr ausführlich gehalten, denn ein unvollständiges Wissen über
  63. die Hardware verschleiert eher das Verständnis der Materie.
  64.  
  65.  
  66. Die Dokumentation wurde so geschrieben, daß sie wie ein Lehrbuch durchgele-
  67. sen werden kann.  Es wurde versucht,  nichts vorrauszusetzen,  was erst  in
  68. späteren Kapiteln behandelt wird.  Dies geht natürlich nicht immer,  da die
  69. einzelnen Komponenten voneinander abhängen.
  70.  
  71. In den einzelnen Kapiteln wurde jedoch versucht ein  möglichst  umfassendes
  72. Wissen zu dem Stichwort zu geben, damit auch gezielt zu einem Problem nach-
  73. gelesen werden kann.
  74.  
  75.  
  76. Wenn möglich,  sind in den einzelnen Kapiteln kleine Beispiele gegeben. Da-
  77. neben wird in einem extra Kapitel als Beispiel der Aufbau und die  Program-
  78. mierung  einer Rechnerkarte mit zwei verschiedenen PC-Koppel-Schnittstellen
  79. beschrieben.
  80.  
  81.  
  82. Der grundlegende Typ der MSC-51 Familie ist der 8051 Controller von  Intel.
  83. Die  anderen  von  Intel und dann auch von anderen Firmen entwickelten Con-
  84. troller dieser Familie besitzen dieselben Funktionen wie der 8051 plus  ei-
  85. nige zusätzliche. So besitzt der 8052 einen zusätzlichen Timer und ein grö-
  86. ßeres internes RAM.
  87.  
  88. Die Typen 8031,  8751 sind identisch mit dem 8051, jedoch besitzen sie kein
  89. internes ROM bzw. ein intenes EPROM.
  90.  
  91.  
  92. Zunächst wird nur der 8051 betrachtet,  um den Aufbau zu erläutern.  Einige
  93. Funktionen  der  weiteren  CPU's aus der MSC-51 Familie werden anschließend
  94. angegeben.
  95.  
  96.  
  97. Ich kann keine  Garantie für Vollständigkeit und  absoluter Richtigkeit der
  98. Dokumentation  übernehmen. Für Ergänzungen, Hinweiße  und Fehlerkorrekturen
  99. bin ich immer dankbar.
  100.  
  101.         (c)1991,1993    Werner Hennig-Roleff
  102.                 Sulzgrieser Str. 101
  103.                 73733 Esslingen
  104.                 0711/376718
  105.  
  106.  
  107. Inhaltsverzeichnis:
  108. -------------------
  109.  
  110. 1.   8051 Eigenschaften   ...................................   1
  111. 2.   Daten und Adressen   ...................................   2
  112. 3    Rechnerkern des 8051   .................................   4
  113. 3.1    8051-Blockschaltbild                                     4
  114. 3.2    Takt / Zyklus                                            7
  115. 3.3    Befehlsausführung                                        8
  116. 3.4    Spezial Funktion Register                               10
  117. 3.4.1    ACC                                                   11
  118. 3.4.2    B                                                     11
  119. 3.4.3    PSW                                                   12
  120. 3.4.4    SP                                                    13
  121. 3.4.5    DPTR = DPH:DPL                                        14
  122. 3.4.6    PCON                                                  14
  123. 3.5    Ports                                                   16
  124. 3.6    externer Programm-Speicher Zugriff                      20
  125. 3.7    externer Daten-Speicher Zugriff                         23
  126. 3.8    Anschaltungen für den externen Bus                      25
  127. 3.9    internes RAM                                            28
  128. 4.   Befehlssatz   ..........................................  33
  129. 4.1    Daten-Transfer                                          35
  130. 4.2    Rechenoperationen                                       38
  131. 4.3    logische Verknüpfungen                                  41
  132. 4.4    Bit Manipulationen                                      43
  133. 4.5    unbedingte Sprünge und Call's                           44
  134. 4.6    bedingte Sprünge                                        47
  135. 5.   Assembler   ............................................  49
  136. 5.1    der ASM51                                               49
  137. 5.2    Segmentierung unter ASM51                               51
  138. 5.2.1    feste Adresszuordnung                                 52
  139. 5.2.2    relocatable Adresszuordnung                           54
  140. 5.3    ASM51 Aufruf                                            54
  141. 5.4    Programmbeispiel                                        55
  142. 5.5    ASM51 Bug's                                             57
  143. 6.   weitere Komponenten des 8051   .........................  58
  144. 6.1    Interrupt Logik                                         58
  145. 6.2    Timer0 und Timer1                                       61
  146. 6.3    serielle Schnittstelle                                  62
  147. 6.3.1    asynchron, synchron Mode                              63
  148. 6.3.2    seriell Mode Einstellungen                            63
  149. 6.3.3    Interrupt Mode, Polled Mode                           67
  150. 6.3.4    Baud Rate Tabelle                                     70
  151. 7.   weitere Controller der 8051 Familie                       71
  152. 7.1    der 8052                                                71
  153. 7.1.1    zusätzliche SFR des 8052                              71
  154. 7.1.2    Timer2                                                71
  155. 7.1.3    serielle Schnittstelle mit Timer2                     73
  156.  
  157.  
  158. Anhang:
  159. -------
  160. A.1  ASCII-Tabelle   ........................................  75
  161. A.2  Befehlssatz in Hexadezimaler Reihenfolge   .............  77
  162.  
  163.  
  164. 1. 8051 Eigenschaften                                        Seite 1
  165. ───────────────────────────────────────────────────────────────────────────
  166.  
  167. 1.  8051 Eigenschaften:
  168. -----------------------
  169.  
  170.  
  171. Der 8051 wird oft in Regelschaltungen eingesetzt, deßhalb hat sich der Name
  172. Mikrocontroller für den 8051 eingebürgert.
  173.  
  174.  
  175. Der 8051 arbeitet mit einem 8-Bit Datenbus.  Extern  kann  er  getrennt  je
  176. 64 kByte Daten und Code adressieren.  Er verfügt zusätzlich über ein inter-
  177. nes RAM (128 Byte) und über ein internes ROM (4  kByte)  als  Programmspei-
  178. cher.  Aus  dem  internen  Programmspeicher werden die Befehle der Adressen
  179. 0000 bis 0FFFh abgearbeitet.  Befehle höherer Adressen werden immer aus dem
  180. externen Programmspeicher gelesen.  Über einen Eingangspin kann der interne
  181. Programmspeicher abgeschaltet werden.
  182.  
  183.  
  184. Zur Abarbeitung der  meißten Befehle wird nur ein  Zyklus (1 µs)  benötigt.
  185. Zur Datenmanipulation stehen folgende Befehle zur Verfügung:
  186.  
  187.         MOV            (Daten kopieren),
  188.         XCH            (Datenaustausch),
  189.         INC, DEC        (Increment +1, Decrement -1),
  190.         ANL, ORL, XOL    (logische Verknüpfung),
  191.         ADD, ADDC, SUBB    (Addition, Subtraktion),
  192.         MUL, DIV        (Multiplikation, Division).
  193.  
  194.  
  195. Eine  Besonderheit des 8051 ist,  daß auf fast alle seiner elektrischen An-
  196. schlüsse (Pin's) per Software zugegriffen werden kann. Auch verfügt er über
  197. zwei integrierte Timer,  eine serielle Schnittstelle (UART) sowie zwei  In-
  198. terrupteingänge.
  199.  
  200. Dazu gibt es die Möglichkeit,  über MOV,  SETB,  CLR und CPL einzelne BIT's
  201. zu manipulieren.
  202.  
  203.  
  204. Der 8051 verfügt über bedingte und unbedingte Sprungbefehle.  Es können Un-
  205. terprogramme aufgerufen werden.  Die Returnadresse wird von der CPU auf den
  206. Stack gelegt.  Der Stack wird im internen RAM angelegt und wächst  von  von
  207. unten nach oben.
  208.  
  209.  
  210. Bei Divisionen kann nur byteweise (8 BIT) dividiert werden. Für größere Da-
  211. ten sind aufwendige Proceduren nötig. Die Größe des internen RAM's ist auch
  212. oft begrenzend.
  213.  
  214. Gerade  als  preisgünstiger  Controller erfreut sich der 8051 jedoch großer
  215. Beliebtheit.
  216.  
  217. 2. Daten und Adressen                                        Seite 2
  218. ───────────────────────────────────────────────────────────────────────────
  219.  
  220. 2. Daten und Adressen:
  221. ----------------------
  222.  
  223.  
  224. Auf einem Rechner können nur Zahlenwerte verarbeitet werden:  z.B.  Meßgrö-
  225. ßen,  Kalkulationswerte,  usw. Zur Bearbeitung von Texten auf Rechnern wird
  226. jedem Zeichen ein Zahlenwert zugeordnet.
  227.  
  228. In der Digitaltechnik wird mit zwei logischen Zuständen (1=high oder 0=low)
  229. gearbeitet. Damit können mit einer Leitung 2 Zahlenwerte selektiert werden.
  230. Mit 2 Leitungen können schon 4 verschiedene Zahlenwerte dargestellt werden:
  231. 0 = 00b,  1 = 01b,  2 = 10b und 3 = 11b (das "b" steht als Kennzeichen  für
  232. eine Binärzahl).
  233.  
  234.  
  235.  
  236. Das  Alphabeth  beinhaltet 26 Zeichen.  Unterscheidet man zwischen groß und
  237. klein und nimmt noch einige Sonderzeichen (1 2 3..0 , + - ? ! : ; / ( ö ä ü
  238. usw.) hinzu, so kommt man auf ca.  80 Zeichen.  Um die Zeichen eindeutig zu
  239. unterscheiden wären mindestens 7 Leitungen nötig.
  240.  
  241. Die  Zuordnung  von Zeichen zu Zahlenwerten wurde natürlich längst genormt.
  242. In der ASCII-Norm (American Standard Code for Information Interchange) wer-
  243. den 8 Leitungen zur Darstellung eines Zahlenwertes verwendet.  Ein  solcher
  244. Zahlenwert zwischen 0 und 255 wird als BYTE bezeichnet.  Eine einzelne Lei-
  245. tung daraus als BIT.
  246.  
  247. Die Wahl von 8 BIT je BYTE kommt auch der Darstellung von Zahlenwerten  bei
  248. Berechnungen  zugute,  denn in Hexadezimaler Schreibweise kann damit gerade
  249. eine zweistellige Hex-Zahl dargestellt werden. Größere Meßwerte (mit mehre-
  250. ren Stellen) belegen mehrere Bytes.
  251.  
  252.  
  253.  
  254. Dem Rechnung tragend,  wurden Controller und Prozessoren mit 8 BIT  breiten
  255. Datenleitungen ausgestattet.  Neuere,  schnellere CPU's erhielten später 16
  256. oder 32 BIT breite Datenleitungen.  Bei allen wird zur Codierung von Texten
  257. weiterhin die ASCII-Tabelle (siehe Anhang) verwendet.  Folgende Bezeichnun-
  258. gen sind üblich:
  259.  
  260.    BIT       1 Datenleitung
  261.    NIBBLE    4 Datenleitungen = ½ BYTE  einstellige Hexzahl  0..0F
  262.    BYTE      8 Datenleitungen        zweistellige Hexzahl 0..0FF
  263.    WORD     16 Datenleitungen        vierstellige Hexzahl 0..0FFFF
  264.    DWORD    32 Datenleitungen        achtstellige Hexzahl 0..0FFFFFFFF
  265.  
  266.  
  267.      MSB                                                 LSB
  268.     ┌──────┬──────┬──────┬──────┬──────┬──────┬──────┬──────┐
  269.     │ Bit7 │ Bit6 │ Bit5 │ Bit4 │ Bit3 │ Bit2 │ Bit1 │ Bit0 │ BYTE
  270.     └──────┴──────┴──────┴──────┴──────┴──────┴──────┴──────┘
  271.     |        High NIBBLE        |        Low NIBBLE         |
  272.  
  273.       MSB  =  most significant Bit
  274.       LSB  =  least significant Bit
  275.  
  276. 2. Daten und Adressen                                        Seite 3
  277. ───────────────────────────────────────────────────────────────────────────
  278.  
  279. Der 8051 ist ein 8 Bit-Rechner, das heißt: Zahlenwerte ,  Zeichen aber auch
  280. der Code werden als Bytes abgelegt. Als Datenbus besitzt er 8 parallele Da-
  281. tenleitungen.
  282.  
  283. On Chip wird der Datenaustausch über einen  INTERNEN DATENBUS  abgewickelt.
  284. Wird  eine  Rechnerkarte aufgebaut und ein externes RAM oder/und EPROM ver-
  285. wendet,  so müssen für die Daten 8 Verbindungsleitungen zwischen  dem  8051
  286. und den externen Speichern gezogen werden. Dies ist der  EXTERNER DATENBUS.
  287. Der  Übergang  zwischen dem internen und dem externen Datenbus erfolgt über
  288. spezielle Treiber (siehe Ports).
  289.  
  290.  
  291.  
  292. Um eine Zahl von der Größe eines BYTE zu speichern werden 8 Flip-Flop's be-
  293. nötigt.  Um einen ganzen Text zu speichern,  werden eine  Vielzahl  solcher
  294. achtstelligen Flip-Flop-Speicherstellen benötigt.  Dabei muß jede Speicher-
  295. stelle einzeln angesprochen werden können. Für jede Speicherstelle wird al-
  296. so eine Auswahl-Leitung benötigt.
  297.  
  298. Speicher-Chips werden heute hochintegriert hergestellt (ein RAM  61256  be-
  299. sitzt  beispielsweise 32768 Speicherstellen: es können 32 kByte gespeichert
  300. werden).  Von außen werden nicht 32768 Auswahl-Leitungen zugeführt,  um auf
  301. eine  bestimmte  Speicherstelle  zuzugreifen.  Stattdessen  weden  codierte
  302. Adressen verwendet,  die erst auf dem RAM-Chip decodiert werden.  So können
  303. mit den 16 Adressleitungen,  die der 8051 bereitstellt, 65536 Speicherstel-
  304. len adressiert werden.
  305.  
  306.  
  307. Die Auswahl,  auf welche Speicherstelle zugegriffen wird,  hängt beim  8051
  308. nicht nur von der Adresse ab, sondern auch vom Datentyp. Unterschieden wer-
  309. den:   SFR, internes RAM, externes RAM, internes ROM, externes EPROM
  310.  
  311.  
  312.  
  313.  
  314. 3.1 Blockschaltbild                                          Seite 4
  315. ───────────────────────────────────────────────────────────────────────────
  316.  
  317. 3.1  8051 Blockschaltbild:
  318. -------------------------
  319.  
  320. Der 8051 verwendet einen 8 Bit breiten Datenbus.  Er besitzt einige interne
  321. Register, die ebenfalls 8 Bit breit sind.  Über Treiber kann er auf externe
  322. Bausteine (wie Speicher) zugreifen.  Er besitzt ein internes RAM,  2 Timer,
  323. einen seriellen Ein-/Ausgang und einen internen Programmspeicher.
  324.  
  325.  
  326.        ┌┐
  327.     ┌─┤││├─┐
  328.     │  └┘  │
  329.       ┌─┴──────┴─┐            ┌──────────────────────────┐
  330.  ALE  │          │            │                          │
  331. _PSEN │   Takt   ├────────────┤      Recheneinheit       ├─┐
  332.       │          │       ╔═══>│                          │ │
  333.       └────┬─────┘       ║    └──────────────────────────┘ │
  334.        │             ║            | <Code-Fetch> |     │
  335.        │             ║            |              |     │           _EA
  336. Timer:     │             ║i           |              |     │  ┌───────────┐
  337.       ┌───────────┐      ║n           |              |     └─>│ Programm- │
  338.       │   TMOD    │<═════╣t           |         ╔═════════════│  Counter, │
  339.       ├───────────┤      ║e           |         ║i   |        │ Adress-   │
  340.       │   TCON    │<═════╣r           |         ║n   |     ╔══│  Register │
  341.       ├───────────┤      ║n      ┌──────────┐   ║t   |     ║e └───────────┘
  342.       │  TH0:TL0  │<═════╣       │ internes │   ║.   |     ║x
  343.       ├───────────┤      ║D      │          │   ║A   |     ║t
  344.       │  TH1:TL1  │<═════╣A      │   PROM   │<══╝d   |     ║.
  345.       └───────────┘      ║T      │          │    r   |     ║A
  346.              ║A      └──────────┘        |     ║d
  347.              ║                           |     ║r
  348.              ║                           |     ║
  349.       ┌───────────┐      ║       Port-Latches:       |     ║      Treiber:
  350.       │   ACC     │<═════╣           ┌────────┐      |     ╠══════>│
  351.       ├───────────┤      ╠══════════>│   P0   │<═════╧════════════>│ Port 0
  352.       │   B       │<═════╣           └────────┘            ║
  353.       ├───────────┤      ║           ┌────────┐            ╚══════>│
  354.       │   PSW     │<═════╬══════════>│   P2   │<══════════════════>│ Port 2
  355.       ├───────────┤      ║           ├────────┤
  356.       │   PCON    │<═════╬══════════>│   P1   │<══════════════════>│ Port 1
  357.       ├───────────┤      ║           ├────────┤
  358.       │  DPH:DPL  │<═════╬══════════>│   P3   │<══════════════════>│ Port 3
  359.       ├───────────┤      ║           └────────┘
  360.       │   SP      │<═════╣
  361.       └───────────┘      ║
  362.              ║
  363.              ║       ┌──────────┐
  364. serielle Schnittstelle:  ║       │ internes │
  365.       ┌───────────┐      ║══════>│          │
  366.       │   SCON    │<═════╣       │   RAM    │
  367.       ├───────────┤      ║       │          │
  368.       │   SBUF    │<═════╝       └──────────┘
  369.       └───────────┘
  370.  
  371.  
  372.  
  373. 3.1 Blockschaltbild                                          Seite 5
  374. ───────────────────────────────────────────────────────────────────────────
  375.  
  376. Das Blockschaltbild gibt schematisch den inneren Hardwareaufbau an.  Es ist
  377. natürlich  nicht in allen Einzelheiten genau.  Es wurde mehr von der Struk-
  378. tur,  wie sie der Programmierer sieht,  ausgegangen als  vom  tatsächlichen
  379. elektrischen Aufbau
  380.  
  381.  
  382. Wie  im  Blockschaltbild angedeutet kann über den internen Datenbus der CPU
  383. auf die SFR (siehe Kapitel 3.4) und das interne RAM zugegriffen werden. Für
  384. externe Speicherzugriffe (XDATA) werden die Ports P0 und P2  verwendet.  An
  385. P2  wird  dabei  das  High-Adress-Byte  gelegt.  An P0 wird zuerst das Low-
  386. Adress-Byte gelegt.  Nach der negativen Flanke in ALE (Adress-Latch-Enable)
  387. werden dann Daten erwartet bzw. ausgegeben.
  388.  
  389.  
  390. Die Befehle (CODE),  die der 8051 ausführen soll,  werden wahlweise aus dem
  391. internen ROM oder aus einem externen Programmspeicher gelesen. Das Einlesen
  392. von CODE findet in jedem Befehls-Zyklus 2 mal statt. Die Befehle sind eben-
  393. falls als Zahlenwerte von der Größe eines BYTES abgelegt.  Somit sind maxi-
  394. mal 256 verschiedene Befehle möglich.  Jeder Zahl ist ein bestimmter Befehl
  395. zugeordnet: so bedeutet z.B.  der CODE 0A4h --> multiplizier  das  Register
  396. ACC mit dem Register B (für den vollständigen Befehlssatz siehe Kapitel 4).
  397.  
  398.  
  399.  
  400.  
  401. Das  folgende Bild zeigt ein Beispiel für eine externe Beschaltung des 8051
  402. mit einem externen RAM und einem EPROM. Da Port 0 während der ersten Hälfte
  403. eines Zugriffs zuerst die Low-Adressen führt und dann für die zweite Hälfte
  404. umschaltet (multiplexer) auf Daten müssen die Low-Adressen in  einem  Latch
  405. gespeichert werden (es gibt allerdings auch RAM's, die Multiplexed Eingänge
  406. besitzen wie das DPR SAE 81C80 von Siemens, hier wäre kein Latch nötig).
  407.  
  408.  
  409.      8051                                          RAM
  410.   ┌─────────┐                                   ┌────────┐
  411.   │      _WR├──────────────────────────────────>│_WR     │
  412.   │      _RD├──────────────────────────────────>│_RD     │
  413.   │         │                 high Adr.         │        │
  414.   │       P2╞═══════════════════════════╦══════>│        │<══════╗
  415.   │         │                           ║A      │        │       ║
  416.   │         │           LATCH           ║D      │        │      D║
  417.   │         │          ┌─────┐          ║R      └────────┘      A║
  418.   │      ALE├─────────>│74 LS│          ║E        EPROM         T║
  419.   │         │          │ 373 │low Adr.  ║S      ┌────────┐      E║
  420.   │       P0│<═══╦════>│     ╞══════════╣S      │        │      N║
  421.   │         │    ║     │     │          ║E      │        │       ║
  422.   │         │    ║     └─────┘          ║N      │        │<══════╣
  423.   │         │    ║                      ╚══════>│        │       ║
  424.   │         │    ║                       _PSEN  │        │       ║
  425.   │    _PSEN├────║─────────────────────────────>│_RD     │       ║
  426.   └─────────┘    ║                              └────────┘       ║
  427.          ║     externe DATEN                             ║
  428.          ╚═══════════════════════════════════════════════╝
  429.  
  430.  
  431. 3.1 Blockschaltbild                                          Seite 6
  432. ───────────────────────────────────────────────────────────────────────────
  433.  
  434. Mit zum Verständnis der Hard-            ┌────────────────┐
  435. ware und den folgenden Erläu-       P1.0 │ 1            40│ + 5V
  436. terungen zu den einzelnen           P1.1 │ 2            39│ P0.0 (AD0)
  437. Komponenten des 8051 gehört         P1.2 │ 3            38│ P0.1 (AD1)
  438. auch nebenstehendes Anschluß-       P1.3 │ 4            37│ P0.2 (AD2)
  439. bild des 8051.                      P1.4 │ 5            36│ P0.3 (AD3)
  440.                     P1.5 │ 6            35│ P0.4 (AD4)
  441.                     P1.6 │ 7            34│ P0.5 (AD5)
  442.                     P1.7 │ 8            33│ P0.6 (AD6)
  443.                    reset │ 9            32│ P0.7 (AD7)
  444.                   (RxD) P3.0 │10            31│ _EA
  445.                   (TxD) P3.1 │11            30│ ALE
  446.                 (_INT0) P3.2 │12            29│ _PSEN
  447.                 (_INT1) P3.3 │13            28│ P2.7 (A15)
  448.                    (T0) P3.4 │14            28│ P2.6 (A14)
  449.                    (T1) P3.5 │15            28│ P2.5 (A13)
  450.                   (_WR) P3.6 │16            28│ P2.4 (A12)
  451.                   (_RD) P3.7 │17            28│ P2.3 (A11)
  452.                    XTAL2 │18            28│ P2.2 (A10)
  453.                    XTAL1 │19            28│ P2.1 (A9)
  454.                      GND │20            28│ P2.0 (A8)
  455.                      └────────────────┘
  456.  
  457.  
  458.  
  459. Der 8055 wird mit +5V betrieben.  Die meißten Anschlüssen sind in Ports zu-
  460. sammengefaßt.  Auf diese Port-Pins kann von der Software direkt zugegriffen
  461. werden,  daneben  haben  sie  noch  zusätzliche Hardwarefunktionen (oben in
  462. Klammern angedeutet).  Nur der RESET-Pin,  die extern/intern Code-Fetch Um-
  463. schaltung (_EA), den Quarzeingang, den Taktausgang für das Adress-Latch so-
  464. wie  das  externe  Programmspeicher-Lesesignal kann nicht über die Software
  465. zugegriffen werden. Kurzbeschreibung:
  466.  
  467. Port0:                                   XTAL1, XTAL2:
  468.   8-Bit Ein-/Ausgang.  Alternativ          Anschlüsse für einen Quarz oder
  469.   dient er  zur Ausgabe der  Low-          einen externen Takt.
  470.   Adressen und zum  Schreiben/Le-
  471.   sen  beim  Zugriff  auf externe        ALE:
  472.   Speicher.                                Adress Latch Enable  Signal zum
  473.                        Speichern  der Low-Adresse  von
  474. Port1:                                     Port0  beim Zugriff auf externe
  475.   8-Bit Ein-/Ausgang.                      Speicher.
  476.  
  477. Port2:                                   _PSEN:
  478.   8-Bit Ein-/Ausgang.  Alternativ          Programm Store Enable  (Lesesi-
  479.   dient er zur Ausgabe der  High-          gnal) beim Zugriff auf externen
  480.   Adressen  beim  Zugriff auf ex-          Code.
  481.   terne Speicher.
  482.                      reset:
  483. Port3:                                     muß high sein für  mindestens 2
  484.   8-Bit Ein-/Ausgang.  Alternativ          Zykluse, dann Reset.
  485.   dienen  P3.0 und P3.1  als Ein-
  486.   /Ausgang der seriellen Schnitt-        _EA:
  487.   stelle,  P3.2 und P3.3  als In-          Extern Access:   wenn  low,  so
  488.   terrupteingänge,  P3.4 und P3.5          wird aller Code extern gelesen.
  489.   als Timer-Gate,  P3.6 und  P3.7          Wenn high, so wird Code 0000...
  490.   als Schreib- / Lesesignal  beim          0FFFh  intern  gelesen,  höhere
  491.   Zugriff auf externe Daten.               Adressen extern.
  492.  
  493. 3.2 Takt                                                     Seite 7
  494. ───────────────────────────────────────────────────────────────────────────
  495.  
  496. 3.2  Takt / Zyklus:
  497. -------------------
  498.  
  499. Die Logik im 8051 arbeitet getaktet. Der Takt wird aus einem Quarz abgelei-
  500. tet. Die maximal verwendtbare Frequenz ist 12 MHz (es gibt auch schon neue-
  501. re CPU's mit 16 MHz).  Der Quarz muß zum Schwingen  angeregt  werden.  Dazu
  502. wird  er in die Rückkoppelleitung eines invertierenden Verstärkers geschal-
  503. tet. Dieser Treiber ist im 8051 integriert. Damit der Quarz nicht auf einer
  504. Oberwelle schwingt, wird er mit zwei kleinen Kondensatoren beschaltet.
  505.  
  506.  
  507.                Quarz, max. 12 MHz
  508.          30pF          ┌┐          30pF
  509.          ┌───┤├───┬───┤││├───┬───┤├───┐
  510.           GND│        │    └┘    │        │GND
  511.         ─┴─       │          │       ─┴─
  512.               │          │
  513.               │          │
  514.             ------o XTAL1----o XTAL2------
  515.               │          │
  516.               │          │
  517.               │   │ \    │
  518.               └───┤   \──┴─────> zu internen
  519.                   │ /            Taktgewinnung
  520.  
  521.           Beschaltung mit Quarz bei 8051 HMOS + CMOS
  522.  
  523.  
  524.  
  525.  
  526. !  Achtung:  8051 Rechner gibt's in HMOS- und CMOS-Technologie.  Die  CMOS-
  527.      Ausführung  beinhaltet  einen etwas anderst beschalteten Quarztreiber.
  528.      An der externen Beschaltung mit einem Quarz (wie oben gezeichnet)  än-
  529.      dert  sich dabei nichts.  Wird jedoch ein externer Taktoszillator ver-
  530.      wendet und dieser Takt (TTL-Pegel) eingespeist,  so  ist  eine  unter-
  531.      schiedliche Beschaltung nötig:
  532.  
  533.  
  534. Bei der  HMOS-Ausführung  wird der      Bei  der  CMOS-Ausführung wird  der
  535. externe Takt bei XTAL2 eingespeist.     externe Takt bei XTAL1 eingespeist.
  536. Zur Abschaltung des internen Quarz-     Der  Ausgang  XTAL2  des  internen
  537. treibers wird XTAL1 auf GND gelegt.     Quarztreibers bleibt offen.
  538.  
  539.  
  540.  ┌──────┐                                ┌──────┐
  541.  │  ┌┐  │ externe Takt                   │  ┌┐  │ externe Takt
  542.  │ ┤││├ ├──────────────┐                 │ ┤││├ ├────┐
  543.  │  └┘  │              │                 │  └┘  │    │
  544.  └──────┘              │                 └──────┘    │
  545.        ─┬─ GND     │                             │
  546.         │          │                         ----o XTAL1----o XTAL2---
  547.     --------o XTAL1----o XTAL2---                    │          │
  548.         │          │                             │   │ \    │
  549.      HMOS   │          │                     CMOS    ├───┤   \──┘
  550.         │   │ \    │                             │   │ /
  551.         └───┤   \──┴───> interne                 │
  552.         │ /           Takt                   └──────> interne Takt
  553.  
  554. 3.3 Befehlsausführung                                        Seite 8
  555. ───────────────────────────────────────────────────────────────────────────
  556.  
  557. Der von den Eingängen XTAL2 bzw.  XTAL1 oder dem Quarztreiber kommende Takt
  558. wird durch 2 geteilt. Danach steht ein symmetrischer Takt von maximal 6 MHz
  559. zur Verfügung.  Dieser Takt wird vom 8051  als  Systemtakt  verwendet,  das
  560. heißt  alle logischen Zustandsänderungen innerhalb des 8051 werden mit die-
  561. sem Takt gesetzt. Für die Abarbeitung eines Befehls werden mindestens 6 Sy-
  562. stemtakte (State 1 bis 6 = 1 Zyklus) benötigt.
  563.  
  564.     Quarz:          12 MHz maximal  (einige spezielle CPU auch 16 MHz)
  565.     Systemtakt:      6 MHz
  566.     Zyklus:          1 MHz  -->  1 µs
  567.  
  568.  
  569.       ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐  ┌┐ ┌─┐┌──┐ ┌─┐ ┌─
  570.   XTAL   ─┘ └─┘ └─┘ └─┘ └─┘ └─┘ └─┘ └─┘ └─┘ └─┘ └──┘└─┘ └┘  └─┘ └─┘
  571.       ──┐   ┌───┐   ┌───┐   ┌───┐   ┌───┐   ┌───┐   ┌───┐   ┌───
  572.   SysClk    └───┘   └───┘   └───┘   └───┘   └───┘   └───┘   └───┘
  573.   State     |   1   |   2   |   3   |   4   |   5   |   6   |   1
  574.         ^                       ^                       ^
  575.           1.Code-Fetch            2.Code-Fetch
  576.  
  577.  
  578.  
  579. Selbst bei unsymetrischen Quarztakt ergibt sich so ein symetrischer System-
  580. takt (angedeutet für State 5 und 6 in obigen Diagramm).
  581.  
  582.  
  583.  
  584.  
  585.  
  586. 3.3  Befehlsausführung:
  587. -----------------------
  588.  
  589. Die CPU ließt je Zyklus immer  2  Byte  aus  den  Programm-Speicher  (Code-
  590. Fetch).  Dies  geschieht automatisch in State 1 und State 4 (siehe auch Ti-
  591. ming für externen Code-Zugriff):
  592.  
  593.  
  594. Es gibt Befehle ohne und mit 1 bis 2 Operanten.  Es werden je Zyklus  gene-
  595. rell 2 Code-Bytes gelesen, zuviel gelesene werden wieder verworfen. Bei Be-
  596. fehlen,  deren Abarbeitung mehr als 1 Zyklus benötigt, wird der nächste Be-
  597. fehl wiederholt gelesen, bis er zur Ausführung kommt.
  598.  
  599.  
  600.  
  601. ---  Beispiele:
  602.  
  603. Befehl:      Opcode:  Zyklus:  Fetch:
  604. --------------------------------------------------------------------------
  605.  NOP            00         1    00 05         1 Byte zuviel, verworfen
  606.  INC SP         05 81      1    05 81
  607.  INC DPTR       A3         2    A3 E2 E2 83   im 2.Zyklus nächster Fetch
  608.  MOVX A,@R0     E2         2    E2 83 __ __   im 2.Zyklus XDATA nicht Fetch
  609.  MOVC A,@A+PC   83         2    83 02 __ 02   im 2.Zyklus MOVC-Zugriff
  610.  LJMP 3344      02 33 44   2    02 33 44 ??
  611.  
  612. 3.3 Befehlsausführung                                        Seite 9
  613. ───────────────────────────────────────────────────────────────────────────
  614.  
  615. Beim NOP wurde ein Code-Byte zuviel gelesen.  Es  wird  nicht  ausgewertet,
  616. sondern im nächsten Zyklus erneut gelesen. Bei INC DPTR wurde im ersten Zy-
  617. klus 1 Code-Byte zuviel gelesen.  Im 2.  Zyklus werden sogar nocheinmal die
  618. Code-Bytes des nächsten Befehls gelesen aber auch noch nicht ausgewertet.
  619.  
  620. Eine Besonderheit gibt es bei einem externen  Datenspeicherzugriff  (MOVX).
  621. Hier erfolgt im 2.  Zyklus kein Code-Fetch, sondern es wird auf das externe
  622. RAM zugegriffen.
  623.  
  624. Beim Zugriff auf eine Tabelle im Programmspeicher über MOVC wurde im 1. Zy-
  625. klus ein Byte des nächsten Befehls schon mitgelesen (zuviel). Im 2.  Zyklus
  626. erfolgt  zunächst der Zugriff auf die Tabelle und dann noch ein Code-Fetch,
  627. der aber such verworfen wird.
  628.  
  629. Ein LJMP-Befehl benötigt 3 Code-Bytes und 2 Zykluse. Im 1.  Zyklus wird der
  630. Opcode und das High-Byte der Zieladresse (1. Operand) gelesen. Im 2. Zyklus
  631. wird das Low-Byte der Zieladresse (2.  Operand) und (zuviel) der Opcode des
  632. folgenden  Code-Bytes  gelesen.  Nach  Ausführung  des  Sprungs  steht  der
  633. Programm-Counter  auf  der  neuen  Adresse.  Der nächste Code-Fetch erfolgt
  634. dort. Hieraus ist auch ersichtlich,  warum der im vorigen Zyklus zuviel ge-
  635. lesene Befehl immer wieder verworfen wird.
  636.  
  637.  
  638.  
  639. Die Ausführung des Befehls erfolgt zumeißt erst im State 5.  Dort wird auch
  640. schon wieder die Code-Adresse für den Code-Fetch des nächsten Zyklus  ange-
  641. legt.
  642.  
  643.  
  644.  
  645.  
  646.  
  647.  
  648.  
  649. 3.4 SFR                                                      Seite 10
  650. ───────────────────────────────────────────────────────────────────────────
  651.  
  652. 3.4  SFR (Spezial Funktion Register):
  653. -------------------------------------
  654.  
  655. Im  Unterschied  zu  einigen Processoren werden zur Steuerung von Timer und
  656. serieller Schnittstelle keine speziellen  Befehle  verwendet.  Dazu  dienen
  657. spezielle Register, die im Datenbereich des 8051 angeordnet sind. Jedem SFR
  658. (spezial Funktion Register) ist dazu eine DATA-Adresse zugeordnet,  der Zu-
  659. griff erfolgt über den internen Datenbus.
  660.  
  661. Bei gegenüber dem 8051 erweiterten Controllern wie den 8052,  80515,  80552
  662. und anderen kommen bei zusätzlichen Funktionen einfach zusätzliche SFR hin-
  663. zu. Sie besitzen jedoch denselben Befehlssatz!
  664.  
  665.  
  666.  
  667. Anstelle  der DATA-Adresse kann beim ASM51-Assembler eine vordefinierte Ab-
  668. kürzung (Mnemonic) verwendet werden.  Die folgende Tabelle enthält alle SFR
  669. des 8051 mit Mnemonic und DATA-Adresse:
  670.  
  671.    Ports:                                   Timer:
  672.     P0   DATA   80h                          TCON DATA  88h
  673.     P1   DATA   90h                          TMOD DATA  89h
  674.     P2   DATA  0A0h                          TL0  DATA  8Ah
  675.     P3   DATA  0B0h                          TL1  DATA  8Bh
  676.                          TH0  DATA  8Ch
  677.    Rechenregister und CPU-Control:           TH1  DATA  8Dh
  678.     PSW  DATA  0D0h
  679.     ACC  DATA  0E0h                         Interrupt-Control:
  680.     B    DATA  0F0h                          IE   DATA  0A8h
  681.     PCON DATA   87h                          IP   DATA  0B8h
  682.  
  683.    Pointer:                                 serielle Schnittstelle:
  684.     SP   DATA  81h                           SCON DATA  98h
  685.     DPL  DATA  82h                           SBUF DATA  99h
  686.     DPH  DATA  83h
  687.  
  688.  
  689. Einige  SFR  können  bitweise  adressiert werden (immer solche deren DDATA-
  690. Adresse mit 0 oder 8 endet). Beim 8051 sind dies:
  691.  
  692. PSW - Bit's:                IE - Bit's                  IP - Bit's
  693.   CY   BIT  0D7h              EA   BIT  0AFh              PS   BIT  0BCh
  694.   AC   BIT  0D6h              ES   BIT  0ACh              PT1  BIT  0BBh
  695.   F0   BIT  0D5h              ET1  BIT  0ABh              PX1  BIT  0BAh
  696.   RS1  BIT  0D4h              EX1  BIT  0AAh              PT0  BIT  0B9h
  697.   RS0  BIT  0D3h              ET0  BIT  0A9h              PX0  BIT  0B8h
  698.   OV   BIT  0D2h              EX0  BIT  0A8h
  699.   P    BIT  0D0h                                        SCON - Bit's
  700.                 P3 - Bit's                    SM0  BIT  9Fh
  701. TCON - Bit's                  RD   BIT  0B7h              SM1  BIT  9Eh
  702.   TF1  BIT  8Fh               WR   BIT  0B6h              SM2  BIT  9Dh
  703.   TR1  BIT  8Eh               T1   BIT  0B5h              REN  BIT  9Ch
  704.   TF0  BIT  8Dh               T0   BIT  0B4h              TB8  BIT  9Bh
  705.   TR0  BIT  8Ch               INT1 BIT  0B3h              RB8  BIT  9Ah
  706.   IE1  BIT  8Bh               INT0 BIT  0B2h              TI   BIT  99h
  707.   IT1  BIT  8Ah               TXD  BIT  0B1h              RI   BIT  98h
  708.   IE0  BIT  89h               RXD  BIT  0B0h
  709.   IT0  BIT  88h
  710.  
  711. 3.4 SFR                                                      Seite 11
  712. ───────────────────────────────────────────────────────────────────────────
  713.  
  714. Der Zugriff auf die SFR erfolgt direkt.  Das heißt im Code steht  die  HEX-
  715. Adresse des SFR als Operand. Beispiele für einen Zugriff auf ein SFR:
  716.  
  717.      MOV    TMOD, #20h       ; einen Wert in TMOD schreiben
  718.      MOV    89h, #20h        ; dasselbe mit DATA-Adr
  719.      ORL    PSW,  #18h       ; Wert in PSW ändern
  720.      MOV    A, SBUF          ; Wert aus SBUF in Akkumulator laden
  721.  
  722.  
  723.  
  724.  
  725. In diesem Kapitel werden noch die allgemeinen CPU-Register erklärt. Die be-
  726. sonderen Komponenten (wie Ports,  Timer, Interrupt, serielle Schnittstelle)
  727. zugeordenten Register weden im Zusammenhang mit diesen Funktionen erklärt.
  728.  
  729.  
  730.  
  731.  
  732.  
  733. 3.4.1  ACC (Akkumulator):
  734. -------------------------
  735.  
  736. Der Akkumulator (DATA E0h)  dient  als  Hauptrechenregister.  Arithmetische
  737. Operationen können nur in Verbindung mit dem ACC ausgeführt werden.  Außer-
  738. dem wird der ACC bei Zugriffen auf externe Speicher und indirekten Sprüngen
  739. verwendet (siehe Befehle ADD, ADDC, SUBB, MUL, DIV, MOVX,  MOVC,  JMP,  JZ,
  740. SWAP, CLR,...). Der ACC kann bitweise addressiert werden:
  741.  
  742.    ACC.0  BIT  0E0h                 ACC.4  BIT  0E4h
  743.    ACC.1  BIT  0E1h                 ACC.5  BIT  0E5h
  744.    ACC.2  BIT  0E2h                 ACC.6  BIT  0E6h
  745.    ACC.3  BIT  0E3h                 ACC.7  BIT  0E7h
  746.  
  747. Zum  Zugriff  auf den ACC stehen besondere (kürzere und schnellere) Befehle
  748. zur Verfügung.  Zur Unterscheidung wird bei den ASM51-Mnemonic-Abkürzungen,
  749. "A" anstelle von "ACC" geschrieben.  Für den 8051 werden verschiedene Opco-
  750. des generiert.
  751.  
  752. Beispiel:
  753.        MOV ACC, #44h           Hex-Code: 75 E0 44       2 Zykluse
  754.     oder   MOV A, #44h             Hex-Code: 74 44          1 Zyklus
  755.  
  756.  
  757.  
  758.  
  759. 3.4.2  B-Register:
  760. ------------------
  761.  
  762. Das B-Register (DATA F0h) dient als universelles Register. Es kann zum Zwi-
  763. schenspeichern von Werten dienen.  Bei der Multiplikation und der  Division
  764. wird  es  als Hilfsrechenregister verwendet.  Es kann bitweise angesprochen
  765. werden:
  766.  
  767.       B.0  BIT  0F0h                    B.4  BIT  0F4h
  768.       B.1  BIT  0F1h                    B.5  BIT  0F5h
  769.       B.2  BIT  0F2h                    B.6  BIT  0F6h
  770.       B.3  BIT  0F3h                    B.7  BIT  0F7h
  771.  
  772. 3.4 SFR                                                      Seite 12
  773. ───────────────────────────────────────────────────────────────────────────
  774.  
  775. 3.4.3  PSW (Programm Status Word):
  776. ----------------------------------
  777.  
  778. Das PSW (DATA D0h) enthält die wichtigsten Flags der CPU  sowie  zwei  Bits
  779. zur Register-Bank Auswahl (siehe 3.9 internes RAM).  Die Flags sind wichtig
  780. bei Rechenoperationen und Vergleichen:
  781.  
  782.       P      BIT  0D0h                  RS1   BIT  0D4h
  783.       PSW.1  BIT  0D1h                  F0    BIT  0D5h
  784.       OV     BIT  0D2h                  AC    BIT  0D6h
  785.       RS0    BIT  0D3h                  CY    BIT  0D7h
  786.  
  787.  
  788. ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐
  789. │ CY  │ AC  │ F0  │ RS1 │ RS0 │ OV  │PSW.1│  P  │   PSW    (D0h)
  790. └─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘
  791.  
  792.  
  793.  
  794. ┌───────┐     ┌────┐
  795. │ PSW.1 │ und │ F0 │ haben keine Hardware-Funktion. Sie können vom Anwender
  796. └───────┘     └────┘ zu beliebigen  Zwecken verwendet weden.  PSW.5 ist le-
  797.              diglich beim ASM51 als F0 (Flag 0) vordefiniert. PSW.1
  798. und PSW.5 können zum Zwischenspeichern beliebiger Bit-Werte verwendet  wer-
  799. den.
  800.  
  801.  
  802. ┌───┐
  803. │ P │  ist das Parity-Flag.  Es spiegelt immer den  Zustand des ACC wieder.
  804. └───┘  Ist die Summe über alle Bits des ACC gerade (even Parity),  dann ist
  805.        P  =  0.  Ist die Summe ungerade (odd Parity),  dann ist P = 1.  Das
  806. Parity-Flag kann nicht von der Software beschrieben werden (nur lesen).
  807.  
  808. Beispiel:  ACC = 11h = 00010001b --> Σ = 2, gerade   --> P = 0
  809.        ACC = E3h = 11100011b --> Σ = 5, ungerade --> P = 1
  810.  
  811.  
  812. ┌────┐
  813. │ OV │  ist das Overflow-Flag  (Überlauf-Flag). Es wird gesetzt, nach einer
  814. └────┘  Multiplikation,  wenn das  Ergebnis größer  als ein Byte  ist (dann
  815.     paßt es nicht mehr in den ACC allein). Es wird auch gesetzt bei ei-
  816. ner Division durch 0.  Ferner wird es gesetzt bei der Addition und Subtrak-
  817. tion bei einem Vorzeichenfehler.
  818.  
  819. Beim  Rechnen mit vorzeichenbehafteten Zahlen repräsentiert das höchste Bit
  820. das Vorzeichen (Beispiel: 31 = 1Fh, -31 = 9Fh).  Es lassen sich so nur Zah-
  821. len von -128 bis +127 darstellen. Wird nun eine positive Zahl mit einer po-
  822. sitiven Zahl addiert, so müßte das Ergebnis wieder positiv sein. Eine nega-
  823. tive Zahl minus eine negative Zahl müsste dagegen wieder negativ sein.  Bei
  824. einem Überlauf ist dies nicht der Fall:
  825.  
  826. Beispiel:  42h + 47h = 89h = -9      --> Fehler! richtig wäre +137
  827.  
  828.  
  829. ┌────┐
  830. │ AC │  ist das Auxiliary-Carry-Flag (Hilfs-Übertrag-Flag): es wird gesetzt
  831. └────┘  bei einem Übertrag aus Bit 3 bei der Addition und Subtraktion.
  832.  
  833. 3.4 SFR                                                      Seite 13
  834. ───────────────────────────────────────────────────────────────────────────
  835.  
  836. ┌────┐
  837. │ CY │  ist das Carry-Flag (Übertrag-Flag): es wird gesetzt bei einem Über-
  838. └────┘  trag aus Bit 7  bei der Addition, Subtraktion, beim  Dezimal Adjust
  839.     und beim Rotate-Left-durch-Carry.  Außerdem wird es gesetzt bei ei-
  840. nem  Übertrag  aus  Bit  0 beim Rotate-Right-durch-Carry und wenn der linke
  841. Operand kleiner ist als der rechte bei "Compare and Jump if Not Equal".
  842.  
  843. Wie beim ACC gibt es auch für den Zugriff auf das Carry-Flag besondere  Be-
  844. fehle. Zur Unterscheidung wird bei den Mnemonics "C" anstelle von "CY" ver-
  845. wendet.
  846.  
  847. Beispiel:    SETB CY            Hex-Code:  D2 D7          1 Zyklus
  848.          SETB C             Hex-Code:  D3             1 Zyklus
  849.  
  850.  
  851. ┌─────┐     ┌─────┐
  852. │ RS1 │ und │ RS0 │  dienen zur Register-Bank Auswahl. Diese Bits werden
  853. └─────┘     └─────┘  von der Software gesetzt (durch CPU nur lesen).
  854.  
  855.      RS1:RS0 = 00 -->  Reg.Bnk 0           RS1:RS0 = 10 -->  Reg.Bnk 2
  856.      RS1:RS0 = 01 -->  Reg.Bnk 1           RS1:RS0 = 11 -->  Reg.Bnk 3
  857.  
  858.  
  859.  
  860.  
  861.  
  862. 3.4.4  SP (Stack Pointer):
  863. --------------------------
  864.  
  865. Die CPU richtet im internen RAM einen Stapelspeicher ein. Auf diesen Stapel
  866. wird  von  der CPU bei jedem Unterprogrammaufruf (LCALL oder ACALL) die Re-
  867. turnadresse abgelegt.  Dasselbe erfolgt auch automatisch durch die CPU beim
  868. Eintritt in Interrupt-Routinen.  Bei einem RET bzw. RETI werden die Return-
  869. adressen wieder vom Stack geholt.  Ein Anwenderprogramm kann mit den Befeh-
  870. len PUSH und POP auf den Stapelspeicher zugreifen.
  871.  
  872. Der SP (DATA 81h) zeigt immer auf den zuletzt gepuschten Wert.  Zum Ablegen
  873. eines Bytes wird der SP zuerst incrementiert und dann der Wert in  die  in-
  874. tern  RAM Adresse geschrieben,  auf die dann der SP zeigt.  Return-Adressen
  875. sind vom Typ WORD,  bei ihnen legt die CPU zuerst das Low-Byte und dann das
  876. High-Byte auf den Stack.
  877.  
  878. Der Stack wächst von unten nach oben. Nach einem Reset zeigt der SP auf die
  879. intern RAM-Adresse 07h. Das erste gepushte Byte würde also in 08h geschrie-
  880. ben (damit wird Reg-Bnk 0 nicht vom Stack überschrieben).  Ein Anwenderpro-
  881. gramm sollte gleich nach einem Reset den SP mit der letzen von dem Programm
  882. verwendeten intern RAM-Adresse laden,  um den Stack oberhalb der  Programm-
  883. Daten einzurichten.
  884.  
  885.  
  886. Achtung!  Beim 8051 endet das interne RAM bei Adresse 7Fh. Zeigt der SP auf
  887.      höhere Adress-Werte,  so wird er er bei einem PUSH weiterhin incremen-
  888.      tiert, bei einem POP kommt nur Schrott zurück!
  889.  
  890.  
  891.  
  892. 3.4 SFR                                                      Seite 14
  893. ───────────────────────────────────────────────────────────────────────────
  894.  
  895. 3.4.5  DPL, DPH (Datenpointer):
  896. -------------------------------
  897.  
  898. Der Datenpointer (DPTR) ist das einzige 16-Bit Register des 8051,  das auch
  899. mit  einem  16-Bit Zugriff geladen werden kann.  Er setzt sich zusammen aus
  900. den Spezial Funktion Registern  DPH =  Datenpointer  High  (DATA  83h)  und
  901. DPL  = Datenpointer Low (DATA 82h).  Der Datenpointer dient zum Zugriff auf
  902. das externe RAM (siehe MOVX), auf Tabellen im Codespeicher (siehe MOVC) und
  903. für indirekte Sprünge (siehe JMP).
  904.  
  905.  
  906.  
  907.  
  908. 3.4.6  PCON (Power-Control):
  909. ----------------------------
  910.  
  911. Das PCON-Register (DATA 87h) enthält weitere CPU-Flags.  Die  Power-Control
  912. Flags sind nur in der CMOS Versionen (80C51) vorhanden. Das höchstwertigste
  913. Bit  (SMOD) gehört zur Einstellung der Baud Rate bei der seriellen Schnitt-
  914. stelle (siehe serielle Schnittstelle).  PCON ist nicht bitweise  adressier-
  915. bar.
  916.  
  917. ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐
  918. │SMOD │  -  │  -  │  -  │ GF1 │ GF0 │ PD  │ IDL │   PCON    (87h)
  919. └─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘
  920.  
  921.  
  922. ┌──────┐
  923. │ SMOD │  bestimmt  den Vorteil-Faktor für den Schiebetakt der seriellen
  924. └──────┘  Schnittstelle. Bei seriell Mode 1, 2 oder 3 wird die Baud-Rate
  925.       (Shift-Takt) durch 2 geteilt, wenn SMOD = 0 ist.
  926.  
  927.  
  928. ┌─────┐     ┌─────┐
  929. │ GF1 │ und │ GF0 │  haben  keine  Hardwarefunktion.  Sie können  nicht mit
  930. └─────┘     └─────┘  BIT-Adressen angesprochen  werden  (Setzen und Löschen
  931.              nur über ORL - bzw. ANL PCON). Sie können vom Programm
  932. zu  beliebigen Zwecken verwendet werden.  Vorgeschlagen wird die Verwendung
  933. als Kennzeichen, ob Idle-Mode aktiviert wurde.
  934.  
  935.  
  936. ┌─────┐
  937. │ IDL │  schaltet die  CPU in den Idle-Mode (nur CMOS!). Wird IDL = 1 ge-
  938. └─────┘  setzt (über OR PCON, #1), so wird der folgende Befehl nicht mehr
  939.      ausgeführt. Der 8051 geht in den IDLE-Mode. Dies bedeutet:
  940.  
  941.    *  die Befehlsausführung stoppt.
  942.    *  die Port-Ausgangs-Pins behalten ihren letzten elektrischen Wert
  943.    *  die Timer laufen weiter
  944.    *  die serielle Schnittstelle arbeitet weiter
  945.    *  alle anderen Register behalten ihren Wert
  946.    *  der Versorgungsstrom reduziert sich auf ca. 23% (bei 5V und 12 MHz)
  947.  
  948. Der Idle-Mode kann verlassen werden,  durch Aktivierung eines Interrupt und
  949. durch einen Reset. Der Interrupt muß dazu enabled sein. Tritt ein Interrupt
  950. auf, so wird mit Eintritt in die Interrupt-Routine IDL gelöscht. Die Inter-
  951. ruptroutine  wird  abgearbeitet.  Nach dem RETI geht die Befehlsabarbeitung
  952.  
  953. 3.4 SFR                                                      Seite 15
  954. ───────────────────────────────────────────────────────────────────────────
  955.  
  956. weiter bei dem Befehl, der der Idle-Mode Aktivierung folgt. Als Kennung für
  957. die Interrupt-Routine, das Idle-Mode gesetzt war, kann falls nötig GF1 oder
  958. GF0 dienen (IDL wurde ja durch die Hardware gelöscht).
  959.  
  960. Tritt während des Idle-Modes ein Reset auf,  so wird sofort IDL in PCON ge-
  961. löscht.  Die  Befehlsabarbeitung geht mit den folgenden Befehlen weiter -->
  962. bis  zwei Zykluse später die Reset-Logik anläuft und  alle  SFR  sowie  den
  963. Programm-Counter  zurücksetzt.  Die  Abarbeitung  startet  wieder  bei  der
  964. Reset-Adresse 0000.
  965.  
  966. Es werden aber zunächst die der Idle-Mode Aktivierung folgenden  zwei  oder
  967. drei Befehle ausgeführt. Die korrekte Ausführung der Befehle für diesen Zu-
  968. stand ist nicht garantiert. Zugriffe auf Ports oder den externen Datenspei-
  969. cher  sollten deshalb hinter Idle-Mode Aktivierungs Befehlen vermieden wer-
  970. den (eventuel 3 NOP's einfügen).  Zugriffe auf das interne RAM sind  unpro-
  971. blematisch,  denn  die Hardware verhindert in dieser Zeit einen Zugriff auf
  972. das interne RAM.
  973.  
  974. Nach Verlassen des Idle-Mode per Reset sind alle  SFR  zurückgesetzt.  Auch
  975. GF1 und GF0 sind gelöscht.  Jedoch das interne und das externe RAM sind un-
  976. verändert.
  977.  
  978.  
  979. ┌────┐
  980. │ PD │  schaltet die CPU in den Power-Down Mode (nur CMOS!). Wird PD = 1
  981. └────┘  gesetzt (über OR PCON, #2), so wird der folgende Befehl nicht mehr
  982.     ausgeführt. Der 8051 geht in den POWER DOWN-Mode. Dies bedeutet:
  983.  
  984.    *  die Befehlsausführung stoppt.
  985.    *  die Port-Ausgangs-Pins behalten ihren letzten elektrischen Wert
  986.    *  ALE und _PSEN werden low
  987.    *  die Timer stoppen
  988.    *  die serielle Schnittstelle stoppt
  989.    *  der Versorgungsstrom reduziert sich auf ca.0,3% (bei 5V und 12 MHz)
  990.  
  991. Der Power Down-Mode kann nur durch einen Reset verlassen werden. Dieser Re-
  992. set wird dann alle SFR zurücksetzen (auch Ports auf 0FFh),  nicht aber  das
  993. interne und externe RAM.
  994.  
  995. Während  des Power-Down Zustandes kann die Versorgungsspannung auf 2 V her-
  996. runtergesetzt werden ohne das der Inhalt des internen RAM's verloren  geht.
  997. Dies darf aber erst erfolgen,  nachdem PD aktiviert wurde, und die Spannung
  998. muß wieder auf 5 V sein, bevor der Reset ausgelöst wird.
  999.  
  1000.  
  1001.  
  1002. 3.5 Ports                                                    Seite 16
  1003. ───────────────────────────────────────────────────────────────────────────
  1004.  
  1005. 3.5  Ports:
  1006. -----------
  1007.  
  1008. Je 8 elektrische Anschlüsse des 8051 sind zu einem Port zusammengefaßt.  Es
  1009. kann direkt von der Software auf die Port-Pins zugegriffen werden.  Die An-
  1010. schlüsse werden aber auch noch für andere Funktionen verwendet, die nur von
  1011. der Hardware gesteuert werden,  wie zum Beispiel den Code-Fetch  aus  einem
  1012. externen Programmspeicher.
  1013.  
  1014. Damit  die Ports als Eingänge und Ausgänge verwendet werden können besitzen
  1015. sie spezielle Treiber:
  1016.  
  1017.  
  1018.       ║             /│Pin lesen
  1019.       ║       ┌────< ├───────────────────────────────────┐
  1020.       ║       │     \│                                   │
  1021.      i║       │                                          │
  1022.      n║       │     /│Latch lesen             +5V o      │
  1023.      t║\───<──┴────< ├────┐                       │      │
  1024.      e║             \│    │                     │└┘      │
  1025.      r║                   │               ┌─────┤┌┐      │
  1026.      n║                   │               │       │      │  Pin0.x
  1027.       ║          ┌─────┐  │               │       ├──────┴─────o
  1028.       ║\────>────┤D   Q├──┘  Umschalter   │       │
  1029.      D║          │     │      ┌─────┐     │     │└┘
  1030.      A║          │   /Q├──────┤  _\ ├───────────┤┌┐
  1031.      T║          └─────┘      └──┬──┘     │       │
  1032.      A║           Latch          │        │       ┴
  1033.       ║                          │        │
  1034.       ║                     Adress/Data Ausgang
  1035.  
  1036.  
  1037. Das obige Bild zeigt vereinfacht den Aufbau eines Pins von Port 0.  Port  2
  1038. besitzt prinzipiell denselben Aufbau, nur ist dort ein zusätzlicher Pull-Up
  1039. Widerstand an Ausgang vorhanden.
  1040.  
  1041.  
  1042.  
  1043. alternative Funktion bei P0, P2:
  1044. --------------------------------
  1045. Port 0 und Port 2 dienen alternativ zum Lesen vom externen Programmspeicher
  1046. (Code-Fetch) und zum Lesen und Schreiben von/in den externen Datenspeicher.
  1047. Über  Port  0 werden die Low-Byte Adressen ausgegeben und die Daten gelesen
  1048. bzw. geschrieben. Port 2 dient zur Ausgabe der High-Byte Adressen.
  1049.  
  1050. Wird Code nur aus dem internen ROM abgearbeitet und  kein  externer  Daten-
  1051. speicher verwendet (kein MOVX-Befehl),  so werden die alternativen Funktio-
  1052. nen von Port 0 und Port 2 nie angesprochen.  Port 0 und Port 2 können  dann
  1053. beliebigen  Funktionen  (Ein-/Ausgabepins) gewidmet werden.  An Port 0 sind
  1054. dann allerdings Pull-Up Widerstände anzubringen.
  1055.  
  1056. Werden Port 0 und Port 2 zum Code-Fetch verwendet,  so schließt dies  meißt
  1057. andere Anwendungen aus.  Denn die Hardware löscht bei jedem externen Daten-
  1058. zugriff automatisch den Inhalt des Port 0 - Latches.
  1059.  
  1060. Port 2 wird bei MOVX @Ri -  Befehlen  nicht  von  der  Hardware  mit  High-
  1061. Adressen angesteuert.
  1062.  
  1063. 3.5 Ports                                                    Seite 17
  1064. ───────────────────────────────────────────────────────────────────────────
  1065.  
  1066. Schreiben in Port P0 und P2:
  1067. ----------------------------
  1068. In der "Normalen" Funktion wird ein über den internen Datenbus auf die Por-
  1069. tadresse  (P0 DATA 80h,  P2 DATA A0h) geschriebenes Byte in den Latches ge-
  1070. speichert. Ein Umschalter wechselt zwischen der "Normalen" Funktion und der
  1071. Alternativen Funktion, wann immer die Alternative Funktion Werte auszugeben
  1072. hat. Der Inhalt des Latch bleibt davon unverändert (Ausnahme: Lesen über P0
  1073. bei Code-Fetch, MOVX und MOVC).
  1074.  
  1075. Der obere Transistor wird nur angesteuert, wenn für die Alternative Funkti-
  1076. on eine logische 1 auf den Pin gelegt werden soll.  Steht eine 1 im  Latch,
  1077. und wird für die Alternative Funktion kein Wert ausgegeben, so ist der Aus-
  1078. gang  bei  Port  0  hochohmig (floating).  Bei Port 2 wirkt der integrierte
  1079. Pull-Up. Bei beiden kann der Pin dann als Eingang verwendet werden.  Stünde
  1080. eine 0 im Latch,  würde der untere Transistor angesteuert, und der Pin wäre
  1081. immer low (nicht als Eingang verwendtbar).
  1082.  
  1083.  
  1084. Lesen von Port P0 und P2:
  1085. -------------------------
  1086. Bei Port 2 erfolgt kein Einlesen von Daten für die Alternative Funktion des
  1087. Speicherzugriffs (nur High-Adresse ausgeben).  Bei Port 0 werden Daten über
  1088. einen  tristate Treiber auf den internen Datenbus eingelesen. Vor jedem Le-
  1089. sezugriff  auf  externe Speicher schreibt die Hardware automatisch #0FFh in
  1090. die Port P0 - Latches (nur bei alternativen Funktionen). Bei "normalen" Le-
  1091. sezugriffen hat der Anwender selbst dafür Sorge zu tragen,  daß die  Latch-
  1092. Ausgänge high sind,  denn nur dann kann über einen Port-Pin richtig gelesen
  1093. werden (nach einem Reset ist dies erfüllt).
  1094.  
  1095. Wird über einen Software-Befehl "normal" von der  SFR-Adresse  eines  Ports
  1096. gelesen,  so  erfolgt  dies  je nach Befehl über den Treiber direkt von den
  1097. Pins oder über einen weiteren tristate Treiber vom Latch-Ausgang. Bei allen
  1098. Read-Modify-Write Zugriffen wird vom Latch gelesen und sonst vom Pin.
  1099.  
  1100. Ein Beispiel:
  1101.  
  1102.      CPL P2.1 ist ein Read-Modify-Write Befehl: Der Wert im Latch  von  Pin
  1103.      P2.1 soll geändert werden.  Stand eine 0 drinn,  soll eine 1 hineinge-
  1104.      schrieben werden und umgekeht.
  1105.      Würde vom Pin gelesen kann bei         o    |         <--- Last
  1106.      einer Anschaltung wie in nebenste-         │    |         ┌─────o
  1107.      henden Beispiel ein Fehlern auftre-       ┌┴┐   |         │
  1108.      ten. Die Basis des NPN-Transistors        │ │   |         │
  1109.      wird  direkt aus dem Pin gespeist,        └┬┘ P2.1       /
  1110.      was wegen dem internen Pull-Up zu-         ├────o──────┤<    NPN
  1111.      lässig  ist.  Bei einem  gesetzten         │    |        \E
  1112.      Latch beträgt die Spannung  am Pin       │└┘    |         │
  1113.      nur  ca. 0,6 V.  Vom Pin würde ein     ──┤┌┐    |         │
  1114.      Low-Pegel zurückgelesen, obwohl im         │    |        ─┴─
  1115.      Latch eine 1 steht. Der CPL-Befehl        ─┴─   |
  1116.      würde falsch ausgeführt.
  1117.  
  1118.  
  1119. Read-Modify-Write Befehle sind:
  1120.      JBC           Springe wenn Bit (in Latch) gesetzt und lösche Latch
  1121.      DJNZ          decrement Port (SFR des Ports) und springe wenn nicht 0
  1122.      CPL           ändere (Port-) Bit
  1123.      ANL, ORL, XRL, INC, DEC   ändere (Port-) Byte
  1124.  
  1125. 3.5 Ports                                                    Seite 18
  1126. ───────────────────────────────────────────────────────────────────────────
  1127.  
  1128. zur Unterscheidung:
  1129.      JB   (springe, wenn Bit gesetzt) ist kein Read-Modify-Write Befehl, da
  1130.      der Inhalt des Latch hier nicht verändert wird. Hier würde vom Pin ge-
  1131.      lesen.
  1132.  
  1133.  
  1134. Problematisch ist folgende Befehlsfolge:
  1135.  
  1136.    PUSH P2            denn PUSH P2 ist kein Read-Modify-Write Befehl, deß-
  1137.    MOV P2, #80h       halb wird der Wert von den Port-Pin's auf den Stack
  1138.    MOV R0, #0         gelegt. Dies kann gleich dem Latch-Inhalt sein, muß
  1139.    MOVX A, @R0        es aber nicht (siehe Schaltung auf voriger Seite).
  1140.    POP P2             Der Inhalt des Latch darf nur dann auf den Stack ge-
  1141.               sichert werden,  wenn kein Port-Pin als  Eingang  ge-
  1142. schaltet ist,  und die Belastung der Ausgangspins so ist,  daß der elektri-
  1143. sche Pegel nicht verfälscht wird.
  1144.  
  1145.  
  1146.  
  1147. Unterschiede von Port P1 und P3 zu P0:
  1148. --------------------------------------
  1149. Im Unterschied zu Port P0 besitzen P1 und P3 keine Multiplexer.  Soweit be-
  1150. legt,  wird  der Ausgang für die Alternative Funktion mit dem Latch-Ausgang
  1151. über ein NAND verknüpft.  Eingelesen wird nicht auf den internen  Datenbus,
  1152. sondern direkt zu den Baugruppen der alternativen Funktionen.
  1153.  
  1154.  
  1155.        ║             /│Pin lesen
  1156.        ║       ┌────< ├─────────────────────────────┐
  1157.        ║       │     \│                             │
  1158.       i║       │                                    │
  1159.       n║       │     /│Latch lesen       +5V o      │
  1160.       t║\───<──┴────< ├────┐                 │      │
  1161.       e║             \│    │                ┌┴┐     │
  1162.       r║                   │                │ │     │
  1163.       n║          ┌─────┐  │                └┬┘     │  Pin 3.x
  1164.        ║\────>────┤D   Q├──┤     NAND        ├──────┼─────o
  1165.       D║          │     │  │    ┌────┐     │└┘      │  Pin 1.x
  1166.       A║          │   /Q│  └────┤ &  ├o────┤┌┐      │
  1167.       T║          └─────┘   ┌───┤    │       │      │
  1168.       A║           Latch    │   └────┘       ┴      │
  1169.        ║                    │                       │
  1170.        ║                    │                 /│    │
  1171.        ║                    │           ┌────< ├────┘
  1172.                 │           │     \│
  1173.            alternativ:          │
  1174.              Ausgang     Eingang
  1175.  
  1176.  
  1177. In Bezug auf einen "Normalen" Zugriff auf eine Port-Adresse (SFR) durch die
  1178. Software gibt es keinen Unterschied zu Port P0 (siehe Bemerkungen bei P0).
  1179.  
  1180. P1 und P3 besitzen integrierte Pull-Up Widerstände. Der bei dem Bild für P0
  1181. eingezeichnete  obere  Transistor ist nicht vorhanden.  Jedoch gibt es eine
  1182. Besonderheit: Auf dem Chip des 8051  sind  die  Pull-Up  Widerstände  nicht
  1183. durch feste Widerstandsbahnen realisiert, sondern über Feldeffekttransisto-
  1184. ren.  Wird  ein Pin von 0 auf 1 geschaltet,  so wird bei Port P1 und P3 für
  1185. die Dauer von 2 Quarztakten (= 1/6 Zyklus) dieser als Widerstand geschalte-
  1186.  
  1187. 3.5 Ports                                                    Seite 19
  1188. ───────────────────────────────────────────────────────────────────────────
  1189.  
  1190. te FET niederohmiger gesteuert (bei Port 2 für die ganze Zeit der  alterna-
  1191. tiv  Funktion der High-Adress Ausgabe).  Dadurch werden schnellere Ansiegs-
  1192. zeiten des Ausgangssignals eines Pin's erreicht,  und dennoch ist der Pull-
  1193. Up hochohmig genug, daß der Pin als Eingang verwendet werden kann.
  1194.  
  1195.  
  1196. Erfolgt bei Port P3 keine alternative Ausgabe,  so ist der Eingang des NAND
  1197. high. Für diesen Fall ist der logische Zustand des Pins vom Latch abhängig.
  1198. Soll der Pin als Eingang verwendet werden,  so ist wie bei P0 #0FFh in  die
  1199. Port-Latches  von  P1  bzw.  P3 zu schreiben.  Dies muß aber auch erfolgen,
  1200. falls alternative Ausgabe-Funktionen verwendet werden sollen, denn entgegen
  1201. Port P0 und P2 sind bei P1 und P3 keine Umschalter vorhanden.
  1202.  
  1203.  
  1204.  
  1205. 3.6 externer Programmspeicher                                Seite 20
  1206. ───────────────────────────────────────────────────────────────────────────
  1207.  
  1208. Alternative Funktionen beim 8051:
  1209. ---------------------------------
  1210.  
  1211.    Port 0:       Adresse (low Byte) und Daten für externen Speicherzugriff.
  1212.    Port 2:       Adresse (high Byte) für externen Speicherzugriff.
  1213.  
  1214.    P3.7 = _RD:   Lesesignal für externen Datenspeicherzugriff
  1215.    P3.6 = _WR:   Schreibsignal für externen Datenspeicherzugriff
  1216.    P3.5 =  T1:   Timer 1 Gate
  1217.    P3.4 =  T0:   Timer 0 Gate
  1218.    P3.3 = _INT1  externer Interrupt-Eingang 1
  1219.    P3.2 = _INT0  externer Interrupt-Eingang 0
  1220.    P3.1 =  TxD   Sende-Ausgang der seriellen Schnittstelle
  1221.    P3.0 =  RxD   Empfangs-Eingang der seriellen Schnittstelle
  1222.  
  1223.  
  1224.  
  1225. elektrische Kenndaten der Ports:
  1226. --------------------------------
  1227. Isink  =  2,4 mA             Port 0        (UoL < 0,45 V garantiert)
  1228. Isink  =  1,6 mA             Port 1,2,3    (UoL < 0,45 V garantiert)
  1229. Pull-Up   10...30 kΩ         Port 1,2,3
  1230. Idrive =  0,4 mA             Port 0        (UoH > 2,4 V  garantiert)
  1231.  
  1232.  
  1233.  
  1234. Wichtig: bei allen Portpins muß im Latch eine 1 stehen,  wenn der  Pin  als
  1235. Eingang verwendet werden soll!
  1236.  
  1237.  
  1238.  
  1239.  
  1240.  
  1241. 3.6  Zugriff auf den externen Programm-Speicher:
  1242. ------------------------------------------------
  1243.  
  1244. Der  Zugriff auf den externen Programmspeicher erfolgt automatisch 2 mal je
  1245. Zyklus durch die Hardware (siehe 3.3 Befehlsausführung).  Der 8051  besitzt
  1246. ein internes ROM und einen Eingangspin _EA (Extern Access).
  1247.  
  1248. _EA = 1 :  Die Befehle der Code-Adressen 0000-0FFFh werden intern gelesen.
  1249.        Die Befehle der Code-Adressen 1000-FFFFh werden extern gelesen.
  1250.          (8052 besitzt 8 kByte internes ROM: Adressen 0000-1FFFh)
  1251.  
  1252. _EA = 0 :  Die Befehle aller Code-Adressen werden extern gelesen.
  1253.  
  1254.  
  1255. Der  _EA-Pin  dient zur Abschaltung des internen ROM's.  _EA kann nicht wie
  1256. die Port-Pins von der Software gelesen werden.
  1257.  
  1258. Der 8031 besitzt kein internes ROM.  Hier werden alle Befehle extern  gele-
  1259. sen. Es ist jedoch zu empfehlen den _EA-Pin (der wegen der gleichen Gehäus-
  1260. ebauform  beim  8031  auch vorhanden ist) auf GND zu legen.  Beim 8344 (die
  1261. ROM-lose Version des 8044) konnte ich schon beobachten,  daß er mit _EA = 1
  1262. nicht korrekt funktionierte. Es schien, als ob er doch ein internes ROM be-
  1263. saß. Vielleicht ist es für den Hersteller günstiger, nur eine Maske zu fer-
  1264. tigen und die Chips verschieden zu bedrucken.
  1265.  
  1266. 3.6 externer Programmspeicher                                Seite 21
  1267. ───────────────────────────────────────────────────────────────────────────
  1268.  
  1269. _PSEN  (Programm  Store  Enable  dient als Lesesignal für den externen Pro-
  1270. grammspeicher. Auf _PSEN kann ebenfalls nicht per Software zugegriffen wer-
  1271. den.
  1272.  
  1273.  
  1274.  
  1275. externen Programmspeicher lesen:
  1276. --------------------------------
  1277. (vergleiche dazu auch 3.3 Befehlsausführung und 3.5 Ports):
  1278.  
  1279.  
  1280.      -- voriger -------->|<--------------- dieser Zyklus --------------->|
  1281.              |       |       |               |       |       |
  1282.         ┌───┐   ┌────┐   ┌───┐   ┌───┐   ┌───┐   ┌───┐   ┌───┐   ┌───┐
  1283.   SysClk   ─┘   └───┘    └───┘   └───┘   └───┘   └───┘   └───┘   └───┘   └
  1284.              |       |       |       |       |       |       |
  1285.   State     5   |   6    |   1   |   2   |   3   |   4   |   5   |   6   |
  1286.              |   ^1.Fetch    |       |   ^2.Fetch    |       |
  1287.        ─┐            |   ┌───────┐   |       |   ┌───────┐   |       |
  1288.   ALE       └────────────────┘   |   └───────────────┘   |   └────────────
  1289.        ─────┐        |   ┌───────────┐       |   ┌───────────┐       |
  1290.  _PSEN          └────────────┘   |       └───────────┘   |       └────────
  1291.              |       |       |       |       |       |       |
  1292.   P2       CCCCCCCCCCCCCCCCCCCCC-CCCCCCCCCCCCCCCCCCCCCCC-CCCCCCCCCCCCCCCCC
  1293.              |       |       |       |       |       |       |
  1294. P0cpuOut   AAAAA---------?????---AAAAAAAA--------?????---AAAAAAAA---------
  1295. P0epromOut  -----DDDDDDDDDDDDD------------DDDDDDDDDDDD-------------------D
  1296.  
  1297.                              CCC = Code-Adresse
  1298.                              DDD = Daten out
  1299.                              ?   = Daten lesen
  1300.                              --- = hochohmig
  1301.  
  1302.  
  1303.  
  1304. Der Code-Fetch Zugriff beginnt schon in State 5 des vorigen Zyklus mit  dem
  1305. Anlegen der Adresse.  In der Mitte von State 5 wird ALE low.  ALE dient bei
  1306. einem externen Zugriff als Signal für das  Adress-Latch,  die  Low-Adressen
  1307. von P0 zu übernehmen und zu speichern (siehe 3.1 ff).
  1308. Mit  dem Ende von State 5 wird _PSEN low und gleichzeitig P0 hochohmig (als
  1309. Eingang: angedeutet durch das ---).  Ein angeschlossenes EPROM legt nun Da-
  1310. ten auf den externen Datenbus (solange _PSEN = 0).
  1311. Ab  dem  Anfang von State 1 erwartet der 8051 an P0 Daten (angedeutet durch
  1312. das ???, weiterhin hochohmig).  Diese liegen schon am Ausgang des EPROM an.
  1313. In der Mitte von State 1 werden die Daten über P0 auf den internen Datenbus
  1314. übernommen und _PSEN und ALE werden beide wieder high.
  1315.  
  1316. Zum  Ende  von  State  1 wird die (incrementierte) Adresse für den nächsten
  1317. Code-Fetch angelegt.
  1318.  
  1319.  
  1320. Das obige Timing-Diagramm zeigt ideal den Ablauf der beiden CODE-Fetch  Zu-
  1321. griffe  eines  Zyklus.  Real sind alle Übergänge mit Schaltzeiten behaftet.
  1322. Für eine einwandtfreie Funktion wird vom 8051 die Einhaltung folgender Zei-
  1323. ten gefordert:
  1324.  
  1325. - spätestens tPLIV nachdem _PSEN low wurde, muß der Programmspeicher gül-
  1326.   tige Daten auf den Bus legen.
  1327.  
  1328. 3.6 externer Programmspeicher                                Seite 22
  1329. ───────────────────────────────────────────────────────────────────────────
  1330.  
  1331. - spätestens tAVIV nachdem vom 8051 gültige Adressen ausgegeben wurden,
  1332.   sind vom Programmspeicher gültige Daten auf den Bus zu legen.
  1333.  
  1334.  
  1335. Die Zeitwerte hängen vom 8051-Typ ab (Fabrikat...).  Exakte Werte sind  den
  1336. Datenblättern zu entnehmen. Allgemein gilt etwa ( mit T = 1/fOszi):
  1337.  
  1338.    tPLIV = (3 * T) - 105 ns .... (3 * T) - 150 ns    > 100 ns (bei 12 MHz)
  1339.    tAVIV = (5 * T) - 105 ns .... (5 * T) - 150 ns    > 267 ns (bei 12 MHz)
  1340.  
  1341.  
  1342.  
  1343. Als Programmspeicher werden oft EPROM's,  PROM's verwendet. Die übliche An-
  1344. gabe EPROM 27256-250 besagt das EPROM besitzt 256  kBIT  (=  32  kByte)  an
  1345. Speicherzellen mit einer Adress-Access Zeit von 250 ns.
  1346.  
  1347. Angegeben wird die Adress-Access-Time: die Zeit vom Anlegen der Adresse bis
  1348. gültige  Daten  am  Ausgang  liegen.  Die  Chip-Enable-Access-Time ist etwa
  1349. gleich groß (Zeit von Anliegen eines aktiven Chip-Select-Signal bis gültige
  1350. Daten).  Die Output-Enable-Access-Time (Zeit  von  Anliegen  eines  aktiven
  1351. _PSEN bis gültige Daten) ist wesentlich kleiner (Größenordnung 20 ns bis 60
  1352. ns).  Die  bei  der Anwendung als Programmspeicher des 8051 kritischte Zeit
  1353. ist die Chip-Access-Time (= Adress-Access-Time).  Wird diese Bedingung  er-
  1354. füllt, sind auch die anderen Zeiten ok.
  1355.  
  1356. Der  eingesetzte  Speicher  muß eine Adress-Access-Time von 267 ns besitzen
  1357. (bei 12 MHz CPU-Takt). Wird das Chip-Selekt mit Hilfe eines Gatters aus den
  1358. Adressen gebildet,  so  muß  der  Programmspeicher  um  die  Gatterlaufzeit
  1359. schneller sein.  Ein GAL 16V8-25 hat eine Laufzeit von 25 ns.  Es wäre also
  1360. ein Programmspeicher mit einer Zugriffszeit kleiner 242  ns  zu  verwenden.
  1361. Maßgeblich  ist  immer die für den eingesetzten CPU-Typ und den verwendeten
  1362. CPU-Takt  in  den  Datenblättern  angegebene  Zeit   tAVIV   (Adress-Valid-
  1363. Instruktion-Valid) zuzüglich der Gatterlaufzeit der Chip-Select-Logik.
  1364.  
  1365.  
  1366. Bei  einem CPU-Takt von 12 MHz wird man mit EPROM's mit 200 ns immer sicher
  1367. liegen. Bei vielen Anwendungen werden auch 250 ns genügen.
  1368.  
  1369.  
  1370.  
  1371.  
  1372. Bei einem MOVC-Befehl erfolgt  der  Lesezugriff  auf  den  Programmspeicher
  1373. durch die Software im zweiten Zyklus anstelle des 1. Code-Fetch.
  1374.  
  1375. 3.7 externer Datenspeicher                                   Seite 23
  1376. ───────────────────────────────────────────────────────────────────────────
  1377.  
  1378. 3.7  Zugriff auf den externen Daten-Speicher:
  1379. ---------------------------------------------
  1380.  
  1381. Der  Zugriff  auf  den externen Datenspeicher erfolgt im zweiten Zyklus bei
  1382. der Abarbeitung eines MOVX-Befehls (siehe 3.3 Befehlsausführung). In diesem
  1383. Zyklus erfolgt dafür kein Code-Fetch (einziger Fall,  wo ALE und _PSEN aus-
  1384. bleiben). Ein XDATA-Zugriff dauert 6 System-Takte (doppelt so lange wie ein
  1385. CODE-Zugriff).
  1386.  
  1387. _RD (Port P3.7 Pin) dient als Lesesignal für den externen Datenspeicher.
  1388. _WR (Port P3.6 Pin) dient als Schreibsignal.
  1389.     Werden MOVX-Befehle verwendet,  sind diese Bits im Port 3 - Latch auf 1
  1390. zu setzen (dies ist nach einem Reset erfüllt).
  1391.  
  1392.  
  1393. XDATA lesen:
  1394. ------------
  1395.  
  1396.      -- voriger -------->|<--------------- dieser Zyklus --------------->|
  1397.              |       |       |               |       |       |
  1398.         ┌───┐   ┌────┐   ┌───┐   ┌───┐   ┌───┐   ┌───┐   ┌───┐   ┌───┐
  1399.   SysClk   ─┘   └───┘    └───┘   └───┘   └───┘   └───┘   └───┘   └───┘   └
  1400.              |       |       |       |       |       |       |
  1401.   State     5   |   6    |   1   |   2   |   3   |   4   |   5   |   6   |
  1402.        ─┐            |       |       |       |   ┌───────┐   |       |
  1403.   ALE       └────────────────────────────────────────┘   |   └────────────
  1404.              |       |       |       |       |       |       |
  1405.        ──────────────┐       |       |       ┌────────────────────────
  1406.   _RD                    └───────────────────────┘       |       |       |
  1407.              |       |       |       |       |       |       |
  1408.   P2       XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX_CCCCCCCCCCCCCCCCC
  1409.              |       |       |       |       |       |       |
  1410. P0cpuOut   XXXXXXXXXX--------------------?????-----------CCCCCCCCC--------
  1411. P0ramOut   ---------------DDDDDDDDDDDDDDDDDDDDDDDD------------------------
  1412.  
  1413.                              XXX = XDATA-Adresse
  1414.                (vergleiche dazu auch 3.6 Programmspeicher-Zugriff)
  1415.  
  1416.  
  1417.  
  1418. Bereits in State 5 des 1.  Zyklus des MOVX  -  Befehls  werden  die  XDATA-
  1419. Adressen angelegt.  Bei MOVX A,  @DPTR: an P2 die High Adresse (DPH) und an
  1420. P0 die Low Adresse (DPL).  Bei MOVX A,  @Ri: bleibt an P2 der Wert aus  dem
  1421. Latch (SFR von P2) und an P0 wird die Adresse (aus Ri) angelegt.
  1422. In der Mitte von State 5 wird ALE low.  Damit können die Adressen von P0 in
  1423. ein (externes) Adress-Latch (siehe 3.1 ff) übernommen werden.
  1424. Gegen Ende von State 6 wird P0 hochohmig (Adresse  weggenommen),  anschlie-
  1425. ßend wird _RD low.  Ein angeschlossenes RAM legt nun Daten auf den externen
  1426. Datenbus (_RD = 0).
  1427. Ab dem Anfang von State 3 erwartet der 8051 an P0 Daten  (angedeutet  durch
  1428. das ???). In der Mitte von State 3 werden die Daten auf den internen Daten-
  1429. bus übernommen anschließend werden _RD und ALE wieder high.
  1430.  
  1431. Zum  Ende  von State 4 wird die Adresse für den Code-Fetch des nächsten Zy-
  1432. klus angelegt falls der Code-Fetch extern erfolgt (wenn intern,  bleiben P0
  1433. und P2 hochohmig - siehe 3.6 und 3.3).
  1434.  
  1435.  
  1436. 3.7 externer Datenspeicher                                   Seite 24
  1437. ───────────────────────────────────────────────────────────────────────────
  1438.  
  1439. Ein  Zugriff  auf  den  externen  Datenspeicher dauert länger als ein Code-
  1440. Fetch. Das ALE wird einmal nicht ausgegeben. Für den Zugriff stehen längere
  1441. Zeiten zur Verfügung:
  1442.  
  1443. - spätestens tRLDV nachdem _RD low wurde, muß der externe Datenspeicher
  1444.   gültige Daten auf den Bus legen.
  1445. - spätestens tAVDV nachdem vom 8051 gültige Adressen ausgegeben wurden,
  1446.   sind vom externen Datenspeicher gültige Daten auf den Bus zu legen.
  1447.  
  1448.  
  1449. Allgemein gilt etwa ( mit T = 1/fOszi):
  1450.  
  1451.    tRLDV = (5 * T) - 105 ns .... (5 * T) - 165 ns    > 251 ns (bei 12 MHz)
  1452.    tAVDV = (9 * T) - 105 ns .... (9 * T) - 165 ns    > 585 ns (bei 12 MHz)
  1453.  
  1454.  
  1455.  
  1456. XDATA schreiben:
  1457. ----------------
  1458.  
  1459.      -- voriger -------->|<--------------- dieser Zyklus --------------->|
  1460.              |       |       |               |       |       |
  1461.         ┌───┐   ┌────┐   ┌───┐   ┌───┐   ┌───┐   ┌───┐   ┌───┐   ┌───┐
  1462.   SysClk   ─┘   └───┘    └───┘   └───┘   └───┘   └───┘   └───┘   └───┘   └
  1463.              |       |       |       |       |       |       |
  1464.   State     5   |   6    |   1   |   2   |   3   |   4   |   5   |   6   |
  1465.        ─┐            |       |       |       |   ┌───────┐   |       |
  1466.   ALE       └────────────────────────────────────────┘   |   └────────────
  1467.              |       |       |       |       |       |       |
  1468.        ──────────────┐       |       |       ┌────────────────────────
  1469.   _WR                    └───────────────────────┘       |       |       |
  1470.              |       |       |       |       |       |       |
  1471.   P2       XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX_CCCCCCCCCCCCCCCCC
  1472.              |       |       |       |       |       |       |
  1473. P0cpuOut   XXXXXXXXX-DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD----CCCCCCCCC--------
  1474. P0ramOut   --------------------------------------?------------------------
  1475.  
  1476.                              XXX = XDATA-Adresse
  1477.                (vergleiche dazu auch 3.6 Programmspeicher-Zugriff)
  1478.  
  1479.  
  1480.  
  1481. Bereits in State 5 des 1.  Zyklus des MOVX  -  Befehls  werden  die  XDATA-
  1482. Adressen angelegt.  Bei MOVX A,  @DPTR: an P2 die High Adresse (DPH) und an
  1483. P0 die Low Adresse (DPL).  Bei MOVX A,  @Ri: an P2 der Wert aus  dem  Latch
  1484. (SFR von P2) und an P0 die Adresse (Ri).
  1485. In der Mitte von State 5 wird ALE low. Damit werden die Adressen von P0 ins
  1486. (externe) Adress-Latch übernommen.
  1487. Gegen  Ende  von State 6 wird an P0 die Adresse weggenommen und Daten ange-
  1488. legt, anschließend wird _WR low.
  1489. Zum Ende von State 3 wird _WR wieder high.  Damit übernimmt der externe Da-
  1490. tenspeicher die Daten von P0. Anschließend wird P0 wieder hochohmig und ALE
  1491. wieder high.
  1492.  
  1493. Zum  Ende  von State 4 wird die Adresse für den Code-Fetch des nächsten Zy-
  1494. klus angelegt falls der Code-Fetch extern erfolgt (wenn intern,  bleiben P0
  1495. und P2 hochohmig - siehe 3.6 und 3.3).
  1496.  
  1497. 3.8 externe Anschaltungen, Beispiele                         Seite 25
  1498. ───────────────────────────────────────────────────────────────────────────
  1499.  
  1500. - Der 8051 garantiert, daß mindestens tQVWH bevor _WR high wird, gültige
  1501.   Daten auf den Bus liegen.
  1502. - der 8051 garantiert, daß mindestens tWLWH + tAVWL bevor _WR high wird,
  1503.   gültige Adressen ausgegeben wurden.
  1504.  
  1505.  
  1506. Allgemein gilt etwa ( mit T = 1/fOszi):
  1507.  
  1508.    tQVWH = (7 * T) - 105 ns .... (7 * T) - 150 ns    > 433 ns (bei 12 MHz)
  1509.    tWLWH = (6 * T) - 100 ns                          = 400 ns (bei 12 MHz)
  1510.    tAVWL = (4 * T) - 70 ns ..... (4 * T) - 130 ns    >  96 ns (bei 12 MHz)
  1511.  
  1512.  
  1513.  
  1514. Für  den Datenspeicher besteht somit die Forderung einer Adress-Access-Time
  1515. von 585 ns zum Lesen und 496 ns zum Schreiben (bei 12  MHz  CPU-Takt).  Die
  1516. meißten  Typen der Reihe 6164 ...  61256 (statische RAM's) besitzen Adress-
  1517. Access-Zeiten unter 150 ns, so daß es hier keine Probleme geben dürfte.
  1518.  
  1519.  
  1520.  
  1521.  
  1522. 3.8  Anschaltungen für den externen Datenbus (Beispiele):
  1523. ---------------------------------------------------------
  1524.  
  1525. Der Adressraum für CODE und XDATA ist getrennt. Die elektrische Unterschei-
  1526. dung wird durch getrennten Lesesignale _PSEN (für CODE) und _RD (für XDATA)
  1527. erreicht.  Eine typische Beschaltung mit EPROM und RAM wurde schon  in  3.1
  1528. vorgestellt.  Hier  nun  eine  Beschaltung  des  gesamten  Adressraums  mit
  1529. 64 kByte RAM und 64 kByte EPROM:
  1530.  
  1531.  
  1532.                      ┌───────┐
  1533.              ┌─────────────_WR──>│       │      ┌───┐
  1534.              │ ┌───────────_RD──>│ RAM   │<────o│INV│─┐
  1535.              │ │                 │       │      └───┘ │
  1536.              │ │       ╔════════>│ 32kx8 │<═══╗       │
  1537.    8051 CPU          │ │       ║         └───────┘    ║       │
  1538.   ┌────────┐         │ │       ║         ┌───────┐    ║       │
  1539.   │     _WR├─────────┴─────────║───_WR──>│       │    ║       │
  1540.   │     _RD├───────────┴───────║───_RD──>│ RAM   │<───║───────┴── A15
  1541.   │        │                   ║         │       │    ║
  1542.   │      P2╞═══════ADRESSBUS═══╬════════>│ 32kx8 │<═══╣
  1543.   │        │          ┌─────┐  ║         └───────┘    ║
  1544.   │     ALE├─────────>│LATCH│  ║         ┌───────┐    ║
  1545.   │      P0│<═══╦════>│     ╞══╣         │       │    ║
  1546.   │        │    ║     └─────┘  ╚════════>│ EPROM │<═══╣
  1547.   │        │    ║                        │       │    ║
  1548.   │   _PSEN├────║────────────────PSEN───>│ 64kx8 │<─┐ ║
  1549.   └────────┘    ║                        └───────┘  ┴ ║
  1550.         ╚═══DATENBUS══════════════════════════╝
  1551.  
  1552.  
  1553. Da statische RAM's nur bis 32kx8 erhältlich sind, werden zwei RAM-Chips be-
  1554. nötigt.  Das 1.  RAM erhält als Chip-Selekt die Adresse A15 und das  zweite
  1555. RAM  den invertierten Wert von A15.  Als CODE-Speicher wird ein EPROM 64kx8
  1556. verwendet. Sein Chip-Enable Pin wird auf GND gelegt (immer selektiert).
  1557.  
  1558. 3.8 externe Anschaltungen, Beispiele                         Seite 26
  1559. ───────────────────────────────────────────────────────────────────────────
  1560.  
  1561. Das 1. RAM wird bei allen Adressen aktiv,  bei denen A15 = 0 ist,  also bei
  1562. 0000...7FFFh. Das 2. RAM wird aktiv bei 8000...FFFFh (A15 = 1).
  1563.  
  1564.  
  1565.  
  1566. In kaum einer Schaltung wird ein derart großer externer Datenspeicher benö-
  1567. tigt.  Deshalb  wird meißt nur mit einem RAM bestückt.  Oft wird sogar noch
  1568. ein kleineres RAM verwendet (billiger).  Zu empfehlen sind die  Typen  6164
  1569. (8kx8),  61128  (16kx8) und 61256 (32kx8).  Kleinere Typen als 8kx8 könnten
  1570. zwar eingesetzt werden, jedoch sind sie wieder teurer.
  1571.  
  1572. Wird nur ein RAM im XDATA-Raum eingesetzt,  so kann dessen Chip-Enable  Pin
  1573. auf GND gelegt werden (immer selektiert). Auf ein und dieselbe Speicherzel-
  1574. le  des RAM's kann dann über verschiedene XDATA-Adressen zugegriffen werden
  1575. (mehrfach sleektiert). Das stört allerdings nicht wenn die Software ok ist.
  1576.  
  1577.  
  1578.  
  1579. --- IO-Bereich -----------------------------------------------------------
  1580.  
  1581. Der XDATA-Bereich kann neben der Verwendung als externer Datenspeicher  für
  1582. andere Zwecke dienen. Einige Beispiele:
  1583.  
  1584. - zum Einlesen von Jumper-Stellungen oder anderen Daten über einen tristate
  1585.   Treiber.
  1586. - als universeller Port (8-Bit Ein/Ausgabe) über bidirektionale tristate
  1587.   Treiber (74 LS 245).
  1588. - als Anschluß spezieller Bausteine wie externen Analog/Digital Wandlern
  1589.   einem SCC (Serial Communication Controller) für eine zweite serielle
  1590.   Schnittstelle, einem Display-Baustein und anderen.
  1591. - als Schnittstelle zu anderen Rechnern über 8 Bit-Register (realisiert
  1592.   bei der Intel 8044-BITBUS-Rechnerkarte) oder über DPR (Dual Port RAM).
  1593.   (-- siehe Beispiel im Anhang)
  1594.  
  1595. Werden  IO-Funktionen  installiert,  sind  dafür  eine  oder mehrere XDATA-
  1596. Adressen zu reservieren.  Im allgemeinen ist dann ein Adress-Decoder nötig.
  1597. Oft  wird  das RAM in den Bereich von 0000...7FFFh gelegt (A15 als Chip Se-
  1598. lect) und der IO-Bereich ab 8000h.
  1599.  
  1600.  
  1601.  
  1602. --- ladbarer Code --------------------------------------------------------
  1603.  
  1604. Wird die aufgebaute Rechnerkarte mit einer Schnittstelle z.B.  zu einem  PC
  1605. versehen,  dann kann es sinnvoll sein, für einen Teil des CODE-Bereichs ein
  1606. RAM zu verwenden um CODE über die Schnittstelle zu laden. Ein EPROM ist im-
  1607. mer notwendig, zumindest für die Laderroutinen der Schnittstelle.  Der Code
  1608. bei Adresse 0 (Reset-Adresse) ist aus dem EPROM zu lesen.
  1609.  
  1610. Unter  Verwendung  eines EPROMS 16kx8 und eines RAM's 32kx8 kann beispiels-
  1611. weise folgende Aufteilung gewählt werden:
  1612.  
  1613.      XDATA 0000...7FFFh  -->  Zugriff auf   RAM 0000...7FFFh
  1614.      CODE  0000...3FFFh  -->  Zugriff auf EPROM 0000...3FFFh
  1615.      CODE  4000...7FFFh  -->  Zugriff auf   RAM 4000...7FFFh
  1616.  
  1617. 3.8 externe Anschaltungen, Beispiele                         Seite 27
  1618. ───────────────────────────────────────────────────────────────────────────
  1619.  
  1620.     │                                                 │           │
  1621.   _PSEN ├─ _PSEN ────────────┬────────────────────────────┤_OE        │
  1622.     │                    │                            │     EPROM │
  1623.    P2.6 ├─ A14 ──┬────────────────────────────────────────┤_CE   16kx8│
  1624.     │        │           │  ┌─────┐                   └───────────┘
  1625.     │        │           └──┤     │     ┌─────┐
  1626.     │        │  ┌─────┐     │ NOR ├─────┤     │       ┌───────────┐
  1627.   8051  │        └──┤ INV ├─────┤     │     │ NOR ├───────┤_OE        │
  1628.   CPU   │           └─────┘     └─────┘  ┌──┤     │       │           │
  1629.     │                       ┌─────┐  │  └─────┘       │           │
  1630.    P3.7 ├─ _RD ─────────────────┤ INV ├──┘             ┌──┤_CE        │
  1631.     │                       └─────┘                ┴  │     RAM   │
  1632.     │                                                 │      32kx8│
  1633.    P3.6 ├─ _WR ───────────────────────────────────────────┤_WR        │
  1634.     │                                                 │           │
  1635.  
  1636.  
  1637.    Das Bild zeigt eine mögliche Verknüpfung von _PSEN und _RD zur Erzeug-
  1638.    ung des RAM-Lesesignals für das obige Beispiel. Damit wird CODE bis
  1639.    Adresse 3FFFh aus dem EPROM und CODE ab 4000h aus dem RAM abgearbeitet.
  1640.    Über MOVX kann CODE ins RAM geladen werden. Die Interrupt-Einsprünge
  1641.    liegen im EPROM. Dort können per LJMP 4003h, LJMP 400Bh ... die Ein-
  1642.    sprünge in den Lader-Bereich umgelenkt werden, soweit sie nicht von der
  1643.    Laderroutine verwendet werden.
  1644.  
  1645.  
  1646.  
  1647. Eine besonders einfache Realisierung der Code-Abarbeitung aus dem  externen
  1648. RAM (ladbarer Code) kann erreicht werden, wenn die Laderoutinen ins interne
  1649. EPROM gebrannt werden und _EA = 1 gesetzt wird.  Nun brauchen _PSEN und _RD
  1650. nur noch über ein AND verknüpft zu werden.  Es ist kein externes EPROM mehr
  1651. nötig.
  1652.  
  1653.         │   o +5V
  1654.     _EA ├───┘                              │           │
  1655.         │                 ┌─────┐       ┌──┤_CE        │
  1656.       _PSEN ├─ _PSEN ─────────┤     │       ┴  │           │
  1657.         │                 │ AND ├──────────┤_OE        │
  1658.        P3.7 ├─ _RD ───────────┤     │          │     RAM   │
  1659.         │                 └─────┘          │      32kx8│
  1660.        P3.6 ├─ _WR ────────────────────────────┤_WR        │
  1661.         │                                  │           │
  1662.  
  1663.  
  1664.  
  1665.  
  1666. 3.9 internes RAM                                             Seite 28
  1667. ───────────────────────────────────────────────────────────────────────────
  1668.  
  1669. 3.9  internes RAM:
  1670. ------------------
  1671.  
  1672. Eine Besonderheit des 8051 ist sein internes RAM von 128 Byte.  Der Zugriff
  1673. ist schneller als auf das externe RAM und es gibt verschiedene  Zugriffsar-
  1674. ten. Bei einfachen Programmen kann der 8051 (in Verbindung mit dem internen
  1675. EPROM so als Stand-Allone Rechner dienen).
  1676.  
  1677.  
  1678. Zugriffsarten auf das interne RAM:
  1679. ----------------------------------
  1680. direkt:    Im Code ist die intern RAM-Adresse mit angegeben.
  1681. register:  spezielle Befehle für den Zugriff auf Register R0..R7,
  1682.        die im internen RAM auf Adresse 00..1Fh liegen.
  1683. indirekt:  über Pointer. Als Pointer kann dienen R0, R1, SP
  1684. bit:       die intern RAM-Adressen 20h..2Fh können zusätzlich bit-
  1685.        weise angesprochen werden.
  1686.  
  1687.  
  1688.      ┌ ─ ─ ─ ─ ─ ─ ┐ FF         Nebenstehend ist die Aufteilung des inter-
  1689.      |             |            nen RAM's nach den Adressiermöglichkeiten
  1690.      |  80h .. FFh |            skizziert.
  1691.      |             |
  1692.   80 ┌─────────────┐            Der 8051 besitzt ein internes RAM von 128
  1693.      │             │ 7F         Byte. Der gesamte Bereich ist direkt und
  1694.      |             |            indirekt adressierbar.
  1695.      |             |            Der 8052 und andere besitzen ein internes
  1696.      │             │            RAM bis 256 Byte. Nur 00...7Fh sind direkt
  1697.      │             │            adressierbar. Die direkt DATA-Adressen ab
  1698.      │             │            80h sind für die SFR reserviert (siehe 3.4)
  1699.   30 ├─────────────┤
  1700.   28 │    Bit      │ 2F         Die Adressen 20...2Fh können bitweise
  1701.   20 ├─────────────┤            adressiert werden. Zugeordnet sind die BIT-
  1702.   18 │ Reg.-Bank 3 │ 1F         Adessen 00..7Fh. Die BIT-Adressen ab 80h
  1703.   10 │ Reg.-Bank 2 │            sind für SFR reserviert.
  1704.   08 │ Reg.-Bank 1 │
  1705.   00 │ Reg.-Bank 0 │            Von 00 bis 1Fh weden die Register abgelegt
  1706.      └─────────────┘            (siehe auch 3.4.3 PSW).
  1707.  
  1708.  
  1709.  
  1710. Register:
  1711. ---------
  1712. Beim  8051  wurden 8 universell verwendbare Register definiert.  Sie werden
  1713. nicht zu den SFR (spezial Funktion Register) gezählt, da sie keine speziel-
  1714. len Hardwarefunktion wie TCON, SCON und andere SFR besitzen.
  1715.  
  1716. Die Register sind dadurch ausgezeichnet, daß es für den Zugriff darauf spe-
  1717. zielle (einfache und schnelle) Befehle gibt.  Sie werden nicht wie die  SFR
  1718. in extra Speicherzellen abgelegt, sondern ihr Wert wird im internen RAM ge-
  1719. speichert.  Dies erfolgt in 8 aufeinanderfolgenden intern RAM-Adresen = ei-
  1720. ner Register-Bank.  Über zwei BIT's im Programm Status  Word  (siehe  3.4.3
  1721. PSW) kann die aktive Register-Bank selektiert werden.
  1722.  
  1723. Ist  Register-Bank  0 selektiert (dies ist der Fall nach einem Reset,  oder
  1724. nach ANL PSW, #11100111b oder CLR RS0 und CLR RS1), wird R0 im internen RAM
  1725. auf Adresse 00 abgelegt,  R1 auf 01 usw.  Ist Register-Bank  3  selektiert,
  1726. wird R0 auf Adresse 18h, R1 auf 19h usw. abgelegt.
  1727.  
  1728. 3.9 internes RAM                                             Seite 29
  1729. ───────────────────────────────────────────────────────────────────────────
  1730.  
  1731.     RS1:RS0    Reg.Bnk      DATA-Adresse
  1732.     ------------------------------------
  1733.       00          0          00..07
  1734.       01          1          08..0Fh
  1735.       10          2          10..17h
  1736.       11          3          18..1Fh
  1737.  
  1738.  
  1739. Die  verschiedenen Register-Banks können vorteilhaft bei Interrupts verwen-
  1740. det werden:
  1741.       Werden in einer Interrupt-Routine Register verwendet,  müßte ihr  In-
  1742.      halt  beim Eintritt in die Interrupt-Routine gerettet werden (PUSH auf
  1743.      Stack).  Vor dem RETI müßten die Register  wieder  hergestellt  werden
  1744.      (POP  von  Stack).  Es kann einer Interrupt-Routine eine Register-Bank
  1745.      zugeordnet werden.  Nun muß nur die Register-Bank umgeschaltet  werden
  1746.      (schneller!).
  1747.      Obwohl beim 8051 fünf Interruptquellen vorhanden sind, kommt man mit 3
  1748.      Reg.Bnk's aus,  denn es gibt nur 2 Interrupt-Prioritätsstufen. Ein In-
  1749.      terrupt kann nie von einem anderen Interrupt  gleicher  oder  niederer
  1750.      Priorität unterbrochen werden. Interrupts derselben Priorität kann al-
  1751.      so dieselbe Registerbank zugeordnet werden, sofern nach dem RETI keine
  1752.      Werte  in den Registern gehalten werden sollen bis zum nächsten Inter-
  1753.      rupt.
  1754.  
  1755.  
  1756. Da bei einem Reset nur einige SFR,  jedoch nicht das interne  RAM  gelöscht
  1757. wird,  bleibt  der  Inhalt  der  Register  bei  einem Reset bestehen sofern
  1758. Reg.Bnk 0 gewählt war.  Bei einem Reset wird die Register-Bank umgeschaltet
  1759. auf Reg.Bnk 0.
  1760.  
  1761. R0  und  R1  haben über die Möglichkeit einer universellen Verwendung durch
  1762. die Software noch die Funktion von Indexregistern bei der indirekten Adres-
  1763. sierung im internen RAM und beim pageweisen Zugriff  auf  das  externe  RAM
  1764. (siehe Befehlssatz).
  1765.  
  1766.  
  1767.  
  1768. indirekte Adressierung:
  1769. -----------------------
  1770. Auf  das interne RAM kann zusätzlich indirekt über Pointer zugegriffen wer-
  1771. den.  Als Pointer können die Register R0 und R1 oder der Stack Pointer (SP)
  1772. dienen.  Bei  RAM-Adressen ab 80h (nur 8052...) ist die indirekte Adressie-
  1773. rung die einzige Möglichkeit auf das interne RAM zuzugreifen.
  1774.  
  1775.  
  1776. Ein Zugriff indirekt über den SP auf das interne  RAM  erfolgt  automatisch
  1777. bei jedem Aufruf eines Unterprogramms,  aber auch beim Eintritt in eine In-
  1778. terruptroutine. Die CPU legt dabei die Return-Adresse auf den Stack ab (low
  1779. Byte zuerst).  Für den Anwender besteht mit den Befehlen PUSH die  Möglich-
  1780. keit  auch Werte auf den Stack abzulegen bzw.  mit POP wieder zurückzulesen
  1781. (siehe auch 3.4.4 Stack Pointer).
  1782.  
  1783.  
  1784. Um über R0 oder R1 auf das interne RAM zuzugreifen muß zuerst  die  Adresse
  1785. der Speicherstelle in R0 bzw.  R1 geladen werden. Mit einem weiteren Befehl
  1786. erfolgt dann der Zugriff:
  1787.  
  1788.  
  1789. 3.9 internes RAM                                             Seite 30
  1790. ───────────────────────────────────────────────────────────────────────────
  1791.  
  1792.      Beispiel:
  1793.         MOV R0, #30h        ; intern RAM-Adresse 30h laden
  1794.         MOV @R0, #0Dh       ; #0Dh in intern RAM 30h schreiben
  1795.  
  1796.  
  1797. Ein indirekter Zugriff mutet so recht umständlich an, jedoch gibt es Anwen-
  1798. dungen, wo eine indirekte Adressierung unerlässlich ist (z.B. bei der Bear-
  1799. beitung von Textstrings, bei Empfangs- und Sende-Buffern ...).
  1800.  
  1801.  
  1802.  
  1803. direkte Adressierung:
  1804. ---------------------
  1805. Eine direkte Adressierung erlaubt einen schnellen Zugriff  auf  Daten.  Bei
  1806. der Programmerstellung werden an bestimmten festen Adressen im internen RAM
  1807. Speicherplätze zum Ablegen von Werten reserviert. Der Assembler erlaubt die
  1808. Definition von Variablennamen.
  1809.  
  1810. Im  internen RAM des 8051 (und auch der erweiterten CPU's 8052,  80535,...)
  1811. können nur 128 Byte direkt adressiert werden (Adessen 00...7Fh).  Beim Lin-
  1812. ken eines Programms wird die Adresse, mit in den Code aufgenommen.
  1813.  
  1814.  
  1815. Beispiel:
  1816.        Mnemonic:                                          Opcode:
  1817.    MOV  A, 20h        ; Inhalt von int.RAM 20h in ACC       -->  E5 20
  1818.    MOV  A, #20h       ; zum Unterschied: hier Wert in ACC   -->  74 20
  1819.  
  1820.  
  1821.  
  1822. direkt BIT-Adressierung:
  1823. ------------------------
  1824. Die intern-RAM Adressen 20h...2Fh können bitweise angesprochen werden. Die-
  1825. se Speicherplätze können so als Flag-Bank (8 Bit's je Byte) benutzt werden.
  1826. Der Zugriff erfolgt über spezielle Bit-Befehle.
  1827.  
  1828.        MSB                                 LSB
  1829.       ┌────┬────┬────┬────┬────┬────┬────┬────┐
  1830.       │ 7F │ 7E │ 7D │ 7C │ 7B │ 7A │ 79 │ 78 │  DATA 2Fh
  1831.       │ 77 │ 76 │ 75 │ 74 │ 73 │ 72 │ 71 │ 70 │  DATA 2Eh
  1832.       │ 6F │ 6E │ 6D │ 6C │ 6B │ 6A │ 69 │ 68 │  DATA 2Dh
  1833.       │ 67 │ 66 │ 65 │ 64 │ 63 │ 62 │ 61 │ 60 │  DATA 2Ch
  1834.       │ 5F │ 5E │ 5D │ 5C │ 5B │ 5A │ 59 │ 58 │  DATA 2Bh
  1835.       │ 57 │ 56 │ 55 │ 54 │ 53 │ 52 │ 51 │ 50 │  DATA 2Ah
  1836.       │ 4F │ 4E │ 4D │ 4C │ 4B │ 4A │ 49 │ 48 │  DATA 29h
  1837.       │ 47 │ 46 │ 45 │ 44 │ 43 │ 42 │ 41 │ 40 │  DATA 28h
  1838.       │ 3F │ 3E │ 3D │ 3C │ 3B │ 3A │ 39 │ 38 │  DATA 27h
  1839.       │ 37 │ 36 │ 35 │ 34 │ 33 │ 32 │ 31 │ 30 │  DATA 26h
  1840.       │ 2F │ 2E │ 2D │ 2C │ 2B │ 2A │ 29 │ 28 │  DATA 25h
  1841.       │ 27 │ 26 │ 25 │ 24 │ 23 │ 22 │ 21 │ 20 │  DATA 24h
  1842.       │ 1F │ 1E │ 1D │ 1C │ 1B │ 1A │ 19 │ 18 │  DATA 23h
  1843.       │ 17 │ 16 │ 15 │ 14 │ 13 │ 12 │ 11 │ 10 │  DATA 22h
  1844.       │ 0F │ 0E │ 0D │ 0C │ 0B │ 0A │ 09 │ 08 │  DATA 21h
  1845.       │ 07 │ 06 │ 05 │ 04 │ 03 │ 02 │ 01 │ 00 │  DATA 20h
  1846.       └────┴────┴────┴────┴────┴────┴────┴────┘
  1847.  
  1848. Das  LSB von DATA 20h hat die BIT-Adresse 00.  Das nächste Bit aus DATA 20h
  1849. die BIT-Adresse 01 usw.:
  1850.  
  1851. 3.9 internes RAM                                             Seite 31
  1852. ───────────────────────────────────────────────────────────────────────────
  1853.  
  1854. Die BIT-Adressen 80h...FFh sind für Spezial-Funktion  Register  reserviert,
  1855. auch wenn beim 8051 nicht alle SFR-Adressen belegt sind. Immer die SFR sind
  1856. bitweise adressierbar, bei deren das low Nibble der Adresse 0 oder 8 ist:
  1857.  
  1858.       ┌────┬────┬────┬────┬────┬────┬────┬────┐                8051-SFB
  1859. B         │ F7 │ F6 │ F5 │ F4 │ F3 │ F2 │ F1 │ F0 │  DATA F0h      --------
  1860.       ├────┼────┼────┼────┼────┼────┼────┼────┤
  1861. ACC       │ E7 │ E6 │ E5 │ E4 │ E3 │ E2 │ E1 │ E0 │  DATA E0h
  1862.       ├────┼────┼────┼────┼────┼────┼────┼────┤
  1863. PSW       │ D7 │ D6 │ D5 │ D4 │ D3 │ D2 │ D1 │ D0 │  DATA D0h
  1864.       ├────┼────┼────┼────┼────┼────┼────┼────┤
  1865. IP        │ BF │ BE │ BD │ BC │ BB │ BA │ B9 │ B8 │  DATA B8h
  1866. P3        │ B7 │ B6 │ B5 │ B4 │ B3 │ B2 │ B1 │ B0 │  DATA B0h
  1867.       ├────┼────┼────┼────┼────┼────┼────┼────┤
  1868. IE        │ AF │ AE │ AD │ AC │ AB │ AA │ A9 │ A8 │  DATA A8h
  1869. P2        │ A7 │ A6 │ A5 │ A4 │ A3 │ A2 │ A1 │ A0 │  DATA A0h
  1870.       ├────┼────┼────┼────┼────┼────┼────┼────┤
  1871. SCON      │ 9F │ 9E │ 9D │ 9C │ 9B │ 9A │ 99 │ 98 │  DATA 98h
  1872. P1        │ 97 │ 96 │ 95 │ 94 │ 93 │ 92 │ 91 │ 90 │  DATA 90h
  1873.       ├────┼────┼────┼────┼────┼────┼────┼────┤
  1874. TCON      │ 8F │ 8E │ 8D │ 8C │ 8B │ 8A │ 89 │ 88 │  DATA 88h
  1875. P0        │ 87 │ 86 │ 85 │ 84 │ 83 │ 82 │ 81 │ 80 │  DATA 80h
  1876.       └────┴────┴────┴────┴────┴────┴────┴────┘
  1877.  
  1878.  
  1879.  
  1880.  
  1881. Code für intern RAM-Zugriff:
  1882. ----------------------------
  1883. Für  jede  Adressierungsart  gibt es spezielle Befehle.  --> siehe auch Be-
  1884. fehlssatz.
  1885.  
  1886.  
  1887. Bei der Erstellung eines Programms muß darauf  geachtet  werden,  das  sich
  1888. verschieden  adressierte Speicherstellen nicht überlappen.  Bei großen Pro-
  1889. grammen wird es schnell unübersichtlich. Bei korrekter Anwendung bieten je-
  1890. doch komfortablere Assembler und Linker eine Fehlererkennung. Die Speicher-
  1891. stellen werden je nach Datentyp eingeteilt.
  1892.  
  1893.  
  1894.  
  1895. Folgende Regeln sollten beachtet werden:
  1896.  
  1897. - Daten möglichst am Anfang des Source-Files mit Namen definieren. Nicht im
  1898.   Programm  Befehle mit absoluten Adressen  verwenden, da man sonst schnell
  1899.   die Übersicht verliert.
  1900.  
  1901.  
  1902. - beginnend mit der untersten Adresse das interne RAM "füllen". Das heißt:
  1903.  
  1904.   *** zuerst die Register berücksichtigen: (beim ASM51 und A51 mit USING 0,
  1905.       USING 1, usw.) Platz reservieren, je nach Anzahl der verwendeten
  1906.       Reg.Bnk's.
  1907.  
  1908.   *** dann Flags definieren (denn diese können nur in DATA 20h...2Fh unter-
  1909.       gebracht werden)
  1910.  
  1911. 3.9 internes RAM                                             Seite 32
  1912. ───────────────────────────────────────────────────────────────────────────
  1913.  
  1914.   *** dann direkt DATA Variablen definieren (wenn Platz ist, können einzel-
  1915.       ne noch vor den Flags angeordnet werden.
  1916.  
  1917.   *** dann Platz für verwendete indirekt zu adressierende Buffer (IDATA)
  1918.       vergeben
  1919.  
  1920.   *** zuletzt Platz für Stack vergeben.
  1921.  
  1922.  
  1923.  
  1924.  
  1925. Beispiel für ASM51:
  1926.  
  1927.      USING 1                ; Platz für Register-Bank 1 reservieren
  1928.      USING 0                ; Platz für Register-Bank 0 reservieren
  1929.  
  1930.      FLag1     BIT    0     ; dies liegt in DATA 20h
  1931.      Variable1 DATA  10h    ; Platz ist noch frei (Reg.Bnk 2 unbenutzt)
  1932.      BufPtr    DATA  11h    ; bis 1Fh können noch direkt DATA definiert
  1933.      BufCnt    DATA  12h    ;  werden, dann aufpassen wegen BIT!
  1934.  
  1935.      buffer    IDATA 21h    ; der Buffer oberhalb DATA und BIT
  1936. bufferLength  EQU 20h
  1937.      stack     IDATA 41h    ; Stack beginnt oberhalb von buffer - Platz
  1938.                 ; bis 7Fh! Nach Reset ist der SP zu initiali-
  1939.                 ; sieren mit: MOV SP, #(stack - 1)
  1940.  
  1941.  
  1942.  
  1943. die Zuordnung der Adressen wurde hier "von  Hand"  vorgenommen.  Der  ASM51
  1944. bietet  auch  die  Möglichkeit  dies  durch  den Linker vornehmen zu lassen
  1945. (siehe Assembler).
  1946.  
  1947.  
  1948. 4. Befehlssatz                                               Seite 33
  1949. ───────────────────────────────────────────────────────────────────────────
  1950.  
  1951. 4.  8051 Befehlssatz:
  1952. ---------------------
  1953.  
  1954. Alle Controller der 8051-Familie verwenden denselben Befehlssatz.  Bei  den
  1955. neueren  (weiterentwickelten)  Typen  sind  zur  Streuerung der zusätzliche
  1956. Hardwarefunktionen lediglich einige SFR hinzugekommen.
  1957.  
  1958.  
  1959. Ein Programm besteht aus einer Folge von Befehlen.  Die Befehle  werden  in
  1960. Form von codierten Zahlenwerten im Programmspeicher (=Festwertspeicher z.B.
  1961. EPROM) abgelegt.  Der 8051 besitzt intern eine Übersetzungstabelle,  in der
  1962. jedem Zahlenwert eine bestimmte Operation zugeordnet ist (siehe Anhang).
  1963.  
  1964.  
  1965. Damit der 8051 eine gewollte Folge von Befehlen (Programm) ausführt,  müßte
  1966. der  Programmierer  eine  Folge  von  Zahlenwerten  in  das EPROM schreiben
  1967. (Maschinencode oder Hexcode).  Für jeden Befehl müßte er in  einer  Tabelle
  1968. den Zahlenwert nachschlagen. Dies ist sehr unübersichtlich und umständlich.
  1969.  
  1970.  
  1971. Ein  Werkzeug,  daß  einem diese Arbeit abnimmt ist der Assembler: er über-
  1972. setzt ein in einer abkürzenden Symbolsprache geschriebenes Programm in eine
  1973. Folge von Zahlenwerten.  Die Abkürzungen der einzelnen Befehle  werden  als
  1974. Mnemonic   bezeichnet.   Das  so  niedergeschriebene  Programm  selbst  als
  1975. Assembler-Sourcecode oder als Maschinensprache. Damit wird ausgedrückt, das
  1976. die Programmiersprache Assembler Befehle auf der Maschinenebene  verwendet.
  1977. Jeder Befehl,  den der 8051 später ausführen soll muß, nämlich als Mnemonic
  1978. angeschrieben werden.
  1979.  
  1980. Ein weiteres beliebtes Werkzeug zur Erzeugung von  8051  Maschinencode  ist
  1981. ein C-Compiler.  C ist eine Hochsprache, sie bietet fertige standartisierte
  1982. Funktionen, die dann gemäß den Funktionsaufrufen im C-Sourcefile zum ferti-
  1983. gen Programm zusammengelinkt werden.  Die Funktionen wurden  als  Unterpro-
  1984. gramme  in Assembler geschrieben,  compiliert und in einer Libary abgelegt.
  1985. Der Vorteil von einer Hochsprache wie C ist,  das Programme erstellt werden
  1986. können,  die  dann gelinkt mit einer anderen Libary auf verschiedenen Rech-
  1987. nern laufen können. Bei Programmen für den 8051 ist das nicht so gewichtig,
  1988. da die C-Funktionen für den 8051 doch sehr speziell sind. Allerdings bietet
  1989. C einige Funktionen wie Floating-Point Berechnungen,  die den  Einsatz  des
  1990. C-Compilers für den 8051 interessant machen. Viele sind auch schon vertraut
  1991. mit  der Sprache C,  was neben einer besseren Übersichtlichkeit des Source-
  1992. Files auch oft ein Entscheidungspunkt zugunsten von C ist.
  1993.  
  1994.  
  1995. Im folgenden wird der vollständige Befehlssatz des 8051 erläutert.  Angege-
  1996. ben  werden die Mnemonics,  wie sie beim Assembler verwendet werden und der
  1997. zugeordnete Hexcode. Bei einigen Befehlen sind hinter dem OpCode (codierter
  1998. Zahlenwert, der den Befehl kennzeichnet), noch ein bis zwei Operanten ange-
  1999. hängt wie eine Adresse oder ein Festwert.
  2000.  
  2001.  
  2002.  
  2003. In den Mnemonics werden Abkürzungen wie  MOV  (übertragen),  ADD  (Addiere)
  2004. usw. verwendet. Anstelle von absoluten Adressen sind Variablen-Namen zuläs-
  2005. sig.  Die  SFR-Namen sind bei einigen Assemblern schon default bekannt bzw.
  2006. können geladen werden (SFR des 8051 siehe 3.4).
  2007.  
  2008.  
  2009. 4. Befehlssatz                                               Seite 34
  2010. ───────────────────────────────────────────────────────────────────────────
  2011.  
  2012. Zusätzlich gibt es einige spezielle Abkürzungen:
  2013. -----------------------------------------------
  2014.  
  2015. #       konstanter Wert folgt
  2016. @       indirekte Adressierung: Wert aus der Speicherstelle, auf die das
  2017.     folgende Register zeigt
  2018. A       Akkumulator (= ACC, jedoch wird ein spezieller Opcode erzeugt, wenn
  2019.     A anstelle von ACC verwendet wird)
  2020. C       Carry-Flag (= CY, jedoch wird ein spezieller Opcode erzeugt, wenn
  2021.     C anstelle von CY verwendet wird)
  2022. DPTR    Datenpointer ( für Zugriff auf externe Daten) - setzt sich zusammen
  2023.     aus DPH und DPL.
  2024. PC      Programm-Counter (hält Code-Adresse)
  2025. Ri      (mit i = 0...1)  --> verwendet, um anzudeuten, daß R0 oder R1 für
  2026.     diesen Befehl zulässig sind
  2027. Rn      (mit n = 0...7)  --> verwendet, um anzudeuten, daß R0 ... R7 für
  2028.     diesen Befehl zulässig sind.
  2029.  
  2030.  
  2031.  
  2032.  
  2033. Im folgenden wird jeder 8051-Befehl kurz erläutert. Links steht der Code in
  2034. ASM51-Memomics und in den Kästchen in der Mitte der Opcode (Hexwert). Jedes
  2035. Kästchen entspricht ein Byte im Programm-Code.  Ganz rechts sind die Anzahl
  2036. der benötigten Zyklen und die Flags, soweit sie sich ändern, angeführt.
  2037.  
  2038.  
  2039. Mnemonic:             Hex-Code:                        Zyklus:  Flags:
  2040. ---------------------------------------------------------------------------
  2041.  
  2042.  
  2043.  
  2044. Zur  Ausführung  vieler  Befehle wird nur ein CPU-Zyclus benötigt.  Einige,
  2045. insbesondes solche mit Zugriff auf externe Speicher  benötigen  2  Zycluse.
  2046. Ein  Zyclus dauert 6 CPU-System-Takte (bei 12 MHz Quarztakte dauert ein Zy-
  2047. clus 1 µs).  In jedem Zyclus werden die Timer falls sie laufen jeweils um 1
  2048. incrementiert.
  2049.  
  2050.  
  2051.  
  2052. 4.1 Daten-Transfer                                           Seite 35
  2053. ───────────────────────────────────────────────────────────────────────────
  2054.  
  2055. 4.1  Daten-Transfer:
  2056. --------------------
  2057. Mit dem MOV-Befehl können Daten von einem internen Register oder vom inter-
  2058. nen RAM in eine andere interne Speicherstelle kopiert werden.
  2059.  
  2060.               ┌───────────┐
  2061. MOV A, Rn             │ 1110 1nnn │                          1    P
  2062.               ├───────────┤
  2063. MOV Rn, A             │ 1111 1nnn │                          1    -
  2064.               ├───────────┼───────────┐
  2065. MOV A, direct         │    E5h    │  dataAdr  │              1    P
  2066.               ├───────────┼───────────┤
  2067. MOV direct, A         │    F5h    │  dataAdr  │              1    -
  2068.               ├───────────┼───────────┘
  2069. MOV A, @Ri            │ 1110 011i │                          1    P
  2070.               ├───────────┤
  2071. MOV @Ri, A            │ 1111 011i │                          1    -
  2072.               ├───────────┼───────────┐
  2073. MOV A, #data          │    74h    │   data    │              1    P
  2074.               ├───────────┼───────────┤
  2075. MOV Rn, #data         │ 0111 1nnn │   data    │              1    -
  2076.               ├───────────┼───────────┤
  2077. MOV @Ri, #data        │ 0111 011i │   data    │              1    -
  2078.               ├───────────┼───────────┤
  2079. MOV Rn, direct        │ 1010 1nnn │  dataAdr  │              2    -
  2080.               ├───────────┼───────────┤
  2081. MOV direct, Rn        │ 1000 1nnn │  dataAdr  │              2    -
  2082.               ├───────────┼───────────┤
  2083. MOV @Ri, direct       │ 1010 011i │  dataAdr  │              2    -
  2084.               └───────────┴───────────┘
  2085.               ┌───────────┬───────────┐
  2086. MOV direct, @Ri       │ 1000 011i │  dataAdr  │              2    -
  2087.               ├───────────┼───────────┼───────────┐
  2088. MOV direct, #data     │    75h    │  dataAdr  │   data    │  2    -
  2089.               ├───────────┼───────────┼───────────┤
  2090. MOV direct1, direct2  │    85h    │ dataAdr2  │ dataAdr1  │  2    -
  2091.               └───────────┴───────────┴───────────┘
  2092.  
  2093.  
  2094.      Jeweils der in der Mnemonic rechts stehende Operand wird in den Linken
  2095.      geschrieben.
  2096.  
  2097.      Bemerkenswert ist,  daß im Hex Code für   "MOV direct1, direct2"   die
  2098.      Reihenfolge im Hexcode gegenüber der im Memomic vertauscht ist.
  2099.  
  2100.   Beispiele:  MOV  A, R5     ; ED        ->schreibe Inhalt von R5 in ACC
  2101.           MOV  PSW, A    ; F5 D0     ->schreibe Inhalt von A in PSW
  2102.           MOV  A, @R1    ; E7        ->schreibe Inhalt aus int.RAM-
  2103.                  ;             Adresse die in R1 steht, in ACC
  2104.           MOV  R2, #22h  ; 7A 22     ->schreibe 22h in R2
  2105.           MOV  R7, 22h   ; AF 22     ->schreibe Inhalt aus int.RAM-
  2106.                  ;             Adresse 22h in R7
  2107.           MOV  30h, SP   ; 85 81 30  ->schreibe SP in int.RAM-Adr. 30h
  2108.  
  2109.  
  2110.  
  2111. 4.1 Daten-Transfer                                           Seite 36
  2112. ───────────────────────────────────────────────────────────────────────────
  2113.  
  2114. Mit dem XCH-Befehl werden Daten zwischen internen Register oder dem  inter-
  2115. nen RAM und dem Akkumulator ausgetauscht.
  2116.  
  2117.             ┌───────────┐
  2118. XCH A, Rn           │ 1100 1nnn │                          1    P
  2119.             ├───────────┼───────────┐
  2120. XCH A, direct       │    C5h    │  dataAdr  │              1    P
  2121.             ├───────────┼───────────┘
  2122. XCH A, @Ri          │ 1100 011i │                          1    P
  2123.             └───────────┘
  2124.  
  2125.  
  2126.   Beispiel:  es sei Reg.Bnk 1 aktiv, in DATA 9 stehe #16h im ACC #9Fh
  2127.           XCH  A, R1     ; C9    -> in ACC #16h und in DATA 9 #9Fh
  2128.  
  2129.  
  2130.  
  2131.  
  2132.  
  2133.  
  2134.  
  2135. XCHD  vertauscht  das Low-Nibble des adressierten Bytes im internen RAM mit
  2136. dem Low_Nibble aus dem ACC.
  2137.  
  2138.             ┌───────────┐
  2139. XCHD A, @Ri         │ 1101 011i │                          1    P
  2140.             └───────────┘
  2141.  
  2142.  
  2143.   Beispiel:  in R0 stehe #33h, in DATA 33h stehe #16h im ACC #9Fh
  2144.           XCHD  A, @R0   ; D6    -> in ACC #96h und in DATA 33h #1Fh
  2145.  
  2146.  
  2147.  
  2148.  
  2149.  
  2150.  
  2151.  
  2152. Lade Datenpointer mit Festwert:
  2153.  
  2154.             ┌───────┬──────────────┬─────────────┐
  2155. MOV DPTR, #data16   │  90h  │ data16(high) │ data16(low) │ 2    -
  2156.             └───────┴──────────────┴─────────────┘
  2157.  
  2158.      dies ist die einzige 16-Bit Operation  beim  8051.  Sie  hat  dieselbe
  2159.      Funktion wie:
  2160.  
  2161.            MOV DPH, #HIGH(data16)
  2162.      und   MOV DPL, #LOW(data16)
  2163.  
  2164.  
  2165.  
  2166. 4.1 Daten-Transfer                                           Seite 37
  2167. ───────────────────────────────────────────────────────────────────────────
  2168.  
  2169. externer Daten-Speicher-Zugriff:
  2170.  
  2171.             ┌───────────┐
  2172. MOVX A, @DPTR       │    E0h    │                          2    P
  2173.             ├───────────┤
  2174. MOVX @DPTR, A       │    F0h    │                          2    -
  2175.             ├───────────┤
  2176. MOVX A, @Ri         │ 1110 001i │                          2    P
  2177.             ├───────────┤
  2178. MOVX @Ri, A         │ 1111 001i │                          2    -
  2179.             └───────────┘
  2180.  
  2181.      Beim  Zugriff  auf  den externen Datenspeicher wird _RD als Lesesignal
  2182.      und _WR als Schreibsignal verwendet.  Der Zugriff erfolgt über die al-
  2183.      ternativen  Funktionen von Port 0 und Port 2 (siehe 3.5).  Der Wert im
  2184.      Latch von Port 2 bleibt erhalten.  Der Wert im Latch von Port  0  wird
  2185.      von der Hardware beim Lesen mit 0FFh überschrieben.
  2186.  
  2187. WICHTIG!
  2188.      Beim  Zugriff  indirekt  über  Ri wird nur die Low-Adresse multiplexed
  2189.      über Port 0 ausgegeben.  Der Inhalt des Latches von P2 bleibt  während
  2190.      des Zugriffs am Portausgang anliegen.  Der Anwender hat bei Verwendung
  2191.      eines externen RAMs vor dem Zugriff selbst das High-Byte  der  Adresse
  2192.      in P2 zu schreiben.
  2193.  
  2194.   Beispiel:
  2195.        MOV   DPTR, #0FF00h     ; Datenpointer laden
  2196.        MOVX  A, @DPTR          ; Zugriff (lesen) auf externes RAM
  2197.  
  2198.  
  2199.        MOV   R0, #0            ; diese Routine löscht das externe
  2200.        MOV   P2, #1            ; RAM von Adresse 100h bis 1FFh. In
  2201.        CLR   A                 ; P2 wird das High-Byte der Adresse
  2202.       clearPage1:                  ; (=Page) geladen, in R0 das LOW-Byte
  2203.        MOVX  @R0, A            ; R0 wird je Durchlauf decrementiert.
  2204.        DJNZ  R0, clearPage1
  2205.  
  2206.  
  2207.  
  2208.  
  2209.  
  2210. Byte aus dem Programmspeicher lesen:
  2211.  
  2212.             ┌───────────┐
  2213. MOVC A, @A+DPTR     │    93h    │                          2    P
  2214.             ├───────────┤
  2215. MOVC A, @A+PC       │    83h    │                          2    P
  2216.             └───────────┘
  2217.  
  2218.      Ein  Byte  aus  dem Programmspeicher (extern oder intern: abhängig von
  2219.      der Adresse und /EA Pin) wird in den ACC gelesen. Die Adresse wird aus
  2220.      der Summe der Inhalte vom ACC und dem DPTR bzw. dem (zuvor um 1 incre-
  2221.      mentierten) Programm-Counter gebildet (siehe auch 3.3, 3.5 und 3.6).
  2222.  
  2223.      Der Inhalt des Latches von P2 ändert sich dabei nicht,  während in  P0
  2224.      von der Hardware vor dem Zugriff 0FFh geschrieben wird.
  2225.  
  2226.  
  2227. 4.2 Rechen-Operationen                                       Seite 38
  2228. ───────────────────────────────────────────────────────────────────────────
  2229.  
  2230. Byte auf/vom Stack:
  2231.  
  2232.             ┌───────────┬───────────┐
  2233. PUSH direct         │    C0h    │  dataAdr  │              2    -
  2234.             ├───────────┼───────────┤
  2235. POP direct          │    D0h    │  dataAdr  │              2    -
  2236.             └───────────┴───────────┘
  2237.  
  2238.      Beim  PUSH wird der Stack Pointer um 1 incrementiert und dann der Wert
  2239.      in diese Adresse geschrieben.  Beim POP wird zuerst gelesen  und  dann
  2240.      der  SP  decrementiert.  Der Stackpointer zeigt also immer auf das zu-
  2241.      letzt gepushte Byte.
  2242.  
  2243.      Auch bei Unterprogrammaufrufen und Interrupts  werden  Werte  auf  den
  2244.      Stack geschoben (siehe dazu ACALL,  LCALL,  RET,  RETI). Ist der Stack
  2245.      voll (SP zeigt auf Adressen oberhalb 7Fh,  so wird trotzdem bei  einem
  2246.      PUSH  der  SP weiterhin incrementiert,  die Daten gehen aber verloren.
  2247.      Der 8044 besitzt ein internes RAM mit 192 Byte (bis Adresse 0BFh). Der
  2248.      8052 besitzt ein internes RAM mit 256 Byte. Bei einem SP-Überlauf über
  2249.      0FFh wird beim 8052 der Registerbereich des internen RAM's überschrie-
  2250.      ben.
  2251.  
  2252.      Nach einem Reset steht im SP die Adresse 07.
  2253.  
  2254.  
  2255.  
  2256.  
  2257.  
  2258. 4.2  Rechenoperationen:
  2259. -----------------------
  2260.  
  2261.  
  2262. Addiere Wert, Register, intern RAM-Adr. zu Akku:
  2263.  
  2264.             ┌───────────┬───────────┐
  2265. ADD A, #data        │    24h    │    data   │              1    C AC P OV
  2266.             ├───────────┼───────────┘
  2267. ADD A, @Ri          │ 0010 011i │                          1    C AC P OV
  2268.             ├───────────┤
  2269. ADD A, Rn           │ 0010 1nnn │                          1    C AC P OV
  2270.             ├───────────┼───────────┐
  2271. ADD A, direct       │    25h    │  dataAdr  │              1    C AC P OV
  2272.             └───────────┴───────────┘
  2273.  
  2274.      Nach der Ausführung hält der ACC das Ergebnis,  das  C-Flag  hält  den
  2275.      Übertrag aus Bit 7 und AC hält den Übertrag aus Bit 3.  Das OV ist ge-
  2276.      setzt, wenn ein Vorzeichenfehler auftrat (siehe 3.4.3 PSW).
  2277.  
  2278.   Beispiel:             vor ADD:            nach ADD:
  2279.      ADD  A, #44h    ; A = 33h    -->    A = 77h, C = 0, AC = 0, OV = 0
  2280.      ADD  A, #44h    ; A = 43h    -->    A = 87h, C = 0, AC = 0, OV = 1
  2281.      ADD  A, #4Ah    ; A = 2Ah    -->    A = 74h, C = 0, AC = 1, OV = 0
  2282.      ADD  A, #93h    ; A = 0B1h   -->    A = 44h, C = 1, AC = 0, OV = 1
  2283.  
  2284.  
  2285. 4.2 Rechen-Operationen                                       Seite 39
  2286. ───────────────────────────────────────────────────────────────────────────
  2287.  
  2288. Addiere Wert, Register, intern RAM-Adr. zu Akku mit Carry:
  2289.  
  2290.             ┌───────────┬───────────┐
  2291. ADDC A, #data       │    34h    │    data   │              1    C AC P OV
  2292.             ├───────────┼───────────┘
  2293. ADDC A, @Ri         │ 0011 011i │                          1    C AC P OV
  2294.             ├───────────┤
  2295. ADDC A, Rn          │ 0011 1nnn │                          1    C AC P OV
  2296.             ├───────────┼───────────┐
  2297. ADDC A, direct      │    35h    │  dataAdr  │              1    C AC P OV
  2298.             └───────────┴───────────┘
  2299.  
  2300.      Wie Addition ohne Carry.  Jedoch wird zusätzlich der Wert  des  Carry-
  2301.      Flags hinzuaddiert.
  2302.  
  2303.   Beispiel:             vor ADD:             nach ADD:
  2304.      ADDC  A, #44h    ; A = 33h, C = 1  -->  A = 78h, C = 0, AC = 0, OV = 0
  2305.      ADDC  A, #44h    ; A = 33h, C = 0  -->  A = 77h, C = 0, AC = 0, OV = 0
  2306.  
  2307.  
  2308.  
  2309.  
  2310.  
  2311. Subtrahiere Wert, Register, intern RAM-Adr. von Akku mit Carry:
  2312.  
  2313.             ┌───────────┬───────────┐
  2314. SUBB A, #data       │    94h    │    data   │              1    C AC P OV
  2315.             ├───────────┼───────────┘
  2316. SUBB A, @Ri         │ 1001 011i │                          1    C AC P OV
  2317.             ├───────────┤
  2318. SUBB A, Rn          │ 1001 1nnn │                          1    C AC P OV
  2319.             ├───────────┼───────────┐
  2320. SUBB A, direct      │    95h    │  dataAdr  │              1    C AC P OV
  2321.             └───────────┴───────────┘
  2322.  
  2323.      Subtrahiere immediate Data,  indirekt Byte,  Inhalt von Rn bzw. direkt
  2324.      Byte plus das Carry-Flag von ACC. Flags siehe ADD.
  2325.  
  2326.  
  2327.  
  2328.  
  2329.  
  2330. Increment = der Inhalt der angegebenen Register um 1 erhöht.
  2331.  
  2332.             ┌───────────┐
  2333. INC A               │    04h    │                          1    P
  2334.             ├───────────┤
  2335. INC Rn              │ 0000 1nnn │                          1    no Flags
  2336.             ├───────────┤
  2337. INC @Ri             │ 0000 011i │                          1    no Flags
  2338.             ├───────────┼───────────┐
  2339. INC direct          │    05h    │  dataAdr  │              1    no Flags
  2340.             ├───────────┼───────────┘
  2341. INC DPTR            │    A3h    │                          2    no Flags
  2342.             └───────────┘
  2343.  
  2344.  
  2345. 4.2 Rechen-Operationen                                       Seite 40
  2346. ───────────────────────────────────────────────────────────────────────────
  2347.  
  2348. Decrement = der Inhalt der angegebenen Register wird um 1 erniedrigt.
  2349.  
  2350.             ┌───────────┐
  2351. DEC A               │    14h    │                          1    P
  2352.             ├───────────┤
  2353. DEC Rn              │ 0001 1nnn │                          1    no Flags
  2354.             ├───────────┤
  2355. DEC @Ri             │ 0001 011i │                          1    no Flags
  2356.             ├───────────┼───────────┐
  2357. DEC direct          │    15h    │  dataAdr  │              1    no Flags
  2358.             └───────────┴───────────┘
  2359.  
  2360.  
  2361.  
  2362.  
  2363.  
  2364. Multipiziere Akku mit B-Register:
  2365.  
  2366.             ┌───────────┐
  2367. MUL AB              │    A4h    │                          4    C P OV
  2368.             └───────────┘
  2369.  
  2370.      Das Ergebnis steht in ACC.  Wenn das Ergebnis ein Word ist,  steht das
  2371.      low Byte in ACC,  das High Byte in B und das OV-Flag ist gesetzt.  Das
  2372.      C-Flag wird immer gelöscht (C = 0).
  2373.  
  2374.  
  2375.  
  2376.  
  2377.  
  2378. Dividieren Akku durch B-Register:
  2379.  
  2380.             ┌───────────┐
  2381. DIV AB              │    84h    │                          4    C P OV
  2382.             └───────────┘
  2383.  
  2384.      Das Ergebnis steht in ACC und der Rest in B. Bei einem Fehler (Divisi-
  2385.      on durch 0) ist das OV - Flag gesetzt.  Das Carry Flag wird immer  ge-
  2386.      löscht.
  2387.  
  2388.  
  2389.  
  2390.  
  2391.  
  2392. Decimal Adjust von ACC:
  2393.  
  2394.             ┌───────────┐
  2395. DA A                │    D4h    │                          1    C P
  2396.             └───────────┘
  2397.  
  2398.      Wurden zwei BCD Zahlen miteinander addiert, so muß danach das Ergebnis
  2399.      korrigiert werden, soll es auch im BCD-Format erscheinen.
  2400.      Ist das AC-Flag gesetzt, oder das low Nibble > 9, dann wird 6 addiert.
  2401.      Ist  das C-Flag gesetzt,  oder das high Nibble > 9,  dann wird 60h ad-
  2402.      diert. Wenn beim Ergebnis ein Übertrag von Bit 7 des ACC erfolgt, wird
  2403.      das Carry-Flag (C=1) gesetzt.
  2404.  
  2405.  
  2406. 4.3 logische Verknüpfungen                                   Seite 41
  2407. ───────────────────────────────────────────────────────────────────────────
  2408.  
  2409.    Beispiel:                      bcd_59 = 0101 1001
  2410.                   bcd_68 = 0110 1000
  2411.                        +  ────────────
  2412.       nach ADD (ohne Korrektur):  bcd_C1 = 1100 0001    (Flags: AC=1, C=0)
  2413.       wegen (AC=1):                        0000 0110
  2414.       wegen (high Nibble > 9):             0110 0000
  2415.                        +  ────────────
  2416.       Ergebnis (mit Korrektur):   bcd_27 = 0010 0111    (Flags: C=1)
  2417.  
  2418.  
  2419.  
  2420.  
  2421.  
  2422.  
  2423.  
  2424. 4.3  logische Verknüpfungen:
  2425. ----------------------------
  2426.  
  2427.             ┌───────────┬───────────┐
  2428. ANL A, #data        │    54h    │   data    │              1    P
  2429.             ├───────────┼───────────┘
  2430. ANL A, @Ri          │ 0101 011i │                          1    P
  2431.             ├───────────┤
  2432. ANL A, Rn           │ 0101 1nnn │                          1    P
  2433.             ├───────────┼───────────┐
  2434. ANL A, direct       │    55h    │  dataAdr  │              1    P
  2435.             ├───────────┼───────────┤
  2436. ANL direct, A       │    52h    │  dataAdr  │              1    no Flags
  2437.             ├───────────┼───────────┼───────────┐
  2438. ANL direct, #data   │    53h    │  dataAdr  │   data    │  2    no Flags
  2439.             └───────────┴───────────┴───────────┘
  2440.  
  2441.    bitweise logisch AND Verknüpfung:
  2442.      wenn beide Bit 1, dann 1
  2443.  
  2444.  
  2445.  
  2446.  
  2447.  
  2448.             ┌───────────┬───────────┐
  2449. ORL A, #data        │    44h    │   data    │              1    P
  2450.             ├───────────┼───────────┘
  2451. ORL A, @Ri          │ 0100 011i │                          1    P
  2452.             ├───────────┤
  2453. ORL A, Rn           │ 0100 1nnn │                          1    P
  2454.             ├───────────┼───────────┐
  2455. ORL A, direct       │    45h    │  dataAdr  │              1    P
  2456.             ├───────────┼───────────┤
  2457. ORL direct, A       │    42h    │  dataAdr  │              1    no Flags
  2458.             ├───────────┼───────────┼───────────┐
  2459. ORL direct, #data   │    43h    │  dataAdr  │   data    │  2    no Flags
  2460.             └───────────┴───────────┴───────────┘
  2461.  
  2462.    bitweise logisch OR Verknüpfung:
  2463.      wenn eines der beiden Bits 1, dann 1
  2464.  
  2465.  
  2466. 4.3 logische Verknüpfungen                                   Seite 42
  2467. ───────────────────────────────────────────────────────────────────────────
  2468.  
  2469.             ┌───────────┬───────────┐
  2470. XRL A, #data        │    64h    │   data    │              1    P
  2471.             ├───────────┼───────────┘
  2472. XRL A, @Ri          │ 0110 011i │                          1    P
  2473.             ├───────────┤
  2474. XRL A, Rn           │ 0110 1nnn │                          1    P
  2475.             ├───────────┼───────────┐
  2476. XRL A, direct       │    65h    │  dataAdr  │              1    P
  2477.             ├───────────┼───────────┤
  2478. XRL direct, A       │    62h    │  dataAdr  │              1    no Flags
  2479.             ├───────────┼───────────┼───────────┐
  2480. XRL direct, #data   │    63h    │  dataAdr  │   data    │  2    no Flags
  2481.             └───────────┴───────────┴───────────┘
  2482.  
  2483.    bitweise logisch XOR Verknüpfung:
  2484.      wenn beide Bit verschieden, dann 1
  2485.  
  2486.  
  2487.  
  2488.  
  2489.  
  2490.             ┌───────────┐
  2491. CLR A               │    E4h    │                          1    P
  2492.             └───────────┘
  2493.  
  2494.      lösche ACC  -->  ACC = 0
  2495.  
  2496.  
  2497.  
  2498.             ┌───────────┐
  2499. CPL A               │    F4h    │                          1    P
  2500.             └───────────┘
  2501.  
  2502.    Komplement zu ACC  -->  ACC wird bitweise invertiert
  2503.  
  2504.  
  2505.  
  2506.  
  2507.  
  2508.             ┌───────────┐
  2509. RL A                │    23h    │                          1    no Flags
  2510.             └───────────┘
  2511.  
  2512.    rotate ACC bitweise nach links:
  2513.      schiebt Inhalt von ACC bitweise nach links. Das höchste Bit wird dabei
  2514.      in das niedrigste geschrieben.  Das Parity-Flag ändert sich nicht,  da
  2515.      die Summe über alle Bit's gleich bleibt.
  2516.  
  2517.  
  2518.  
  2519.             ┌───────────┐
  2520. RLC A               │    33h    │                          1    P C
  2521.             └───────────┘
  2522.  
  2523.    rotate ACC bitweise nach links durch Carry :
  2524.      schiebt Inhalt von ACC bitweise nach links. Das höchste Bit wird dabei
  2525.      in C und C in das niedrigste geschrieben.
  2526.  
  2527. 4.4 Bit-Manipulationen                                       Seite 43
  2528. ───────────────────────────────────────────────────────────────────────────
  2529.  
  2530.             ┌───────────┐
  2531. RR A                │    03h    │                          1    no Flags
  2532.             └───────────┘
  2533.  
  2534.    rotate ACC bitweise nach rechts:
  2535.      schiebt  Inhalt  von ACC bitweise nach rechts.  Das niederste Bit wird
  2536.      dabei in das höchste geschrieben.  Das Parity-Flag ändert sich  nicht,
  2537.      da die Summe über alle Bit's gleich bleibt.
  2538.  
  2539.  
  2540.  
  2541.             ┌───────────┐
  2542. RRC C               │    13h    │                          1    P C
  2543.             └───────────┘
  2544.  
  2545.    rotate ACC bitweise nach rechts durch Carry:
  2546.  schiebt Inhalt von ACC bitweise nach rechts.  Das niederste Bit wird dabei
  2547.      in C und C in das höchste geschrieben.
  2548.  
  2549.  
  2550.  
  2551.  
  2552.             ┌───────────┐
  2553. SWAP A              │    C4h    │                          1    no Flags
  2554.             └───────────┘
  2555.  
  2556.       vertausche in ACC low Nibble mit high Nibble
  2557.  
  2558.  
  2559.  
  2560.  
  2561.  
  2562.  
  2563. 4.4  Bit-Manipulationen:
  2564. ------------------------
  2565.  
  2566.  
  2567.             ┌───────────┬───────────┐
  2568. MOV C, bit          │    A2h    │  bitAdr   │              1     C
  2569.             ├───────────┼───────────┤
  2570. MOV bit, C          │    92h    │  bitAdr   │              2     no Flags
  2571.             └───────────┴───────────┘
  2572.  
  2573.    kopiere Inhalt aus Bit-Adresse in C bzw. C in Bit-Adresse.
  2574.  
  2575.  
  2576.  
  2577.  
  2578.  
  2579.             ┌───────────┬───────────┐
  2580. ANL C, bit          │    82h    │  bitAdr   │              2     C
  2581.             ├───────────┼───────────┤
  2582. ANL C, /bit         │    B0h    │  bitAdr   │              2     C
  2583.             └───────────┴───────────┘
  2584.  
  2585.    logisch AND Bit bzw. invertierter Wert von Bit zu C
  2586.  
  2587.  
  2588. 4.5 unbedingte Sprünge und CALL's                            Seite 44
  2589. ───────────────────────────────────────────────────────────────────────────
  2590.  
  2591.             ┌───────────┬───────────┐
  2592. ORL C, bit          │    72h    │  bitAdr   │              2     C
  2593.             ├───────────┼───────────┤
  2594. ORL C, /bit         │    A0h    │  bitAdr   │              2     C
  2595.             └───────────┴───────────┘
  2596.  
  2597.    logisch OR Bit bzw invertierter Wert des Bits zu C
  2598.  
  2599.  
  2600.  
  2601.  
  2602.  
  2603.             ┌───────────┐
  2604. CLR C               │    C3h    │                          1     C
  2605.             ├───────────┼───────────┐
  2606. CLR bit             │    C2h    │  bitAdr   │              1     no Flags
  2607.             └───────────┴───────────┘
  2608.  
  2609.    lösche Bit bzw. Carry-Flag  -->  Bit = 0
  2610.  
  2611.  
  2612.  
  2613.  
  2614.  
  2615.             ┌───────────┐
  2616. CPL C               │    B3h    │                          1     C
  2617.             ├───────────┼───────────┐
  2618. CPL bit             │    B2h    │  bitAdr   │              1     no Flags
  2619.             └───────────┴───────────┘
  2620.  
  2621.    invertiere Bit bzw. Carry-Flag
  2622.  
  2623.  
  2624.  
  2625.  
  2626.  
  2627.             ┌───────────┐
  2628. SETB C              │    D3h    │                          1     C
  2629.             ├───────────┼───────────┐
  2630. SETB bit            │    D2h    │  bitAdr   │              1     no Flags
  2631.             └───────────┴───────────┘
  2632.  
  2633.    setze Bit bzw. Carry-Flag  -->  Bit = 1
  2634.  
  2635.  
  2636.  
  2637.  
  2638.  
  2639. 4.5  unbedingte Sprünge und CALLs:
  2640. ----------------------------------
  2641.  
  2642. CALL codeAdress
  2643.  
  2644.      Dies ist kein Maschinen-Befehl  des  8051.  Der  Assembler  legt  hier
  2645.      selbst fest,  ob ein ACALL oder LCALL verwendet wird. Bei "Forward Re-
  2646.      ferenzen",  also Adressen,  die dem Assembler hier noch nicht  bekannt
  2647.      sind, wird immer ein LCALL eingesetzt, auch wenn ein ACALL genügte.
  2648.  
  2649. 4.5 unbedingte Sprünge und CALL's                            Seite 45
  2650. ───────────────────────────────────────────────────────────────────────────
  2651.  
  2652. JMP codeAdress
  2653.  
  2654.      Dies  ist  kein  Maschinen-Befehl  des  8051.  Der Assembler legt hier
  2655.      selbst fest, ob ein SJMP, AJMP oder LJMP verwendet wird.  Bei "Forward
  2656.      Referenzen"  wird immer ein LJMP eingesetzt,  auch wenn er nicht effi-
  2657.      zient ist.
  2658.  
  2659.  
  2660.  
  2661.  
  2662.            ┌──────────────────┬─────────────────────────┐
  2663. ACALL codeAdr  │ A10 A9 A8 1 0001 │ A7 A6 A5 A4 A3 A2 A1 A0 │   2  no Flags
  2664.            └──────────────────┴─────────────────────────┘
  2665.  
  2666.    Absolute CALL (innerhalb 2 KByte Page):
  2667.      Der PC (Programm-Counter) wird um  2  incrementiert  und  die  Return-
  2668.      Adresse auf den Stack gelegt (low Byte zuerst). Dann wird die folgende
  2669.      Adresse in den PC geladen:
  2670.        A11 bis A15 im PC (Programm-Counter) bleiben unverändert,
  2671.        die unteren 11 Bit werden aus dem Opcode geladen.
  2672.  
  2673.  
  2674.  
  2675.            ┌─────────┬────────────┬───────────┐
  2676. LCALL codeAdr  │   12h   │ CodAdrHigh │ CodAdrLow │         2    no Flags
  2677.            └─────────┴────────────┴───────────┘
  2678.  
  2679.    Long CALL:
  2680.      Der  PC  (Programm  Counter)  wird  um 3 incrementiert und die Return-
  2681.      Adresse auf den Stack gelegt (low Byte zuerst). Dann wird mit Wert aus
  2682.      dem Opcode geladen.
  2683.  
  2684.  
  2685.  
  2686.  
  2687.             ┌───────────┐
  2688. RET                 │    22h    │                           2    no Flags
  2689.             └───────────┘
  2690.  
  2691.    Return von Unterprogramm (CALL):
  2692.      Die Return-Adresse wird vom Stack geholt (high Byte zuerst) und  ange-
  2693.      sprungen.
  2694.  
  2695.  
  2696.  
  2697.             ┌───────────┐
  2698. RETI                │    32h    │                           2    no Flags
  2699.             └───────────┘
  2700.  
  2701.    Return von Interrupt:
  2702.      In einem internen Register hat sich die CPU gemerkt, welche Interrupts
  2703.      gerade in Bearbeitung sind.  Dies können auch zwei Interrupts sein, da
  2704.      es zwei Prioritätsstufen gibt, und eine Routine niederer Stufe von ei-
  2705.      nem Interrupt höherer Stufe unterbrochen werden kann.  Ist ein  Inter-
  2706.      rupt  in Bearbeitung sind alle anderen Interrupts gleicher oder niede-
  2707.      rer Prioritätsstufe gesperrt. Mit RETI wird der Höchstwertigste Inter-
  2708.      rupt ausgetragen und die Interrupts sind wieder frei.
  2709.  
  2710. 4.5 unbedingte Sprünge und CALL's                            Seite 46
  2711. ───────────────────────────────────────────────────────────────────────────
  2712.  
  2713.      Die Return-Adresse wird vom Stack geholt (high Byte zuerst) und  ange-
  2714.      sprungen.
  2715.  
  2716.   Achtung:    soll innerhalb einer           MOV A, #0
  2717.      Interrupt-Routine durch einen           PUSH ACC
  2718.      Sprung auf Adresse 0000 ein             PUSH ACC
  2719.      Software-Reset erfolgen, so             MOV A, #LOW(retiReset)
  2720.      hat der Sprung über ein zwei-           PUSH ACC
  2721.      maliges RETI zu erfolgen, da            MOV A, #HIGH(retiReset)
  2722.      sonst entgegen einen Hardware-          PUSH ACC
  2723.      Reset das internen Enable-Re-     retiReset:
  2724.      gister nicht gelöscht würde.            RETI
  2725.  
  2726.  
  2727.  
  2728.  
  2729.  
  2730.           ┌───────────┬───────────┐
  2731. SJMP codeAdr      │    80h    │ relOffset │                 2     no Flags
  2732.           └───────────┴───────────┘
  2733.  
  2734.    Short JUMP (-128 +127):
  2735.      Der  PC  wird  um 2 incrementiert und dazu wird der relOffset addiert.
  2736.      Das höchste Bit der Wertes relOffset dient dabei als Vorzeichen.
  2737.  
  2738.      Zur Berechnung: der relOffset (BYTE) wird erst in ein WORD umgewandelt
  2739.      (auf einer 8088 kompatiblen CPU durch CBW).  Ist der relOffset negativ
  2740.      (höchstes Bit gesetzt),  so wird dabei 0FF00h addiert, sonst 0. Dieses
  2741.      WORD wird zum incrementierten PC addiert.
  2742.  
  2743.      Beispiel:    relOffset = 47h  --> 0047h  +  PC
  2744.           relOffset = 87h  --> FF87h  +  PC
  2745.  
  2746.  
  2747.  
  2748.  
  2749.            ┌──────────────────┬─────────────────────────┐
  2750. AJMP codeAdr   │ A10 A9 A8 0 0001 │ A7 A6 A5 A4 A3 A2 A1 A0 │  2   no Flags
  2751.            └──────────────────┴─────────────────────────┘
  2752.  
  2753.    Absolute JUMP (innerhalb 2 KByte Page):
  2754.      Der PC wird um 2 incrementiert, und die Adresse wird dann folgenderma-
  2755.      ßen gebildet:  A11 bis A15 im PC (Programm-Counter)  bleiben  unverän-
  2756.      dert, die unteren 11 Bit werden aus dem Opcode geladen.
  2757.  
  2758.  
  2759.  
  2760.  
  2761.            ┌─────────┬────────────┬───────────┐
  2762. LJMP codeAdr   │   02h   │ CodAdrHigh │ CodAdrLow │         2     no Flags
  2763.            └─────────┴────────────┴───────────┘
  2764.  
  2765.    Long JUMP:
  2766.       Sprung zur im Opcode angegebenen Adresse.
  2767.  
  2768.  
  2769. 4.6 bedingte Sprünge                                         Seite 47
  2770. ───────────────────────────────────────────────────────────────────────────
  2771.  
  2772.             ┌───────────┐
  2773. JMP @A+DPTR         │    73h    │                           2    no Flags
  2774.             └───────────┘
  2775.  
  2776.    Jump indirekt zu Accumulator + DataPointer:
  2777.      Inhalt von ACC und DPTR addieren, Sprung zu dieser Adresse.
  2778.  
  2779.  
  2780.  
  2781.  
  2782.  
  2783.  
  2784. 4.6  bedingte Sprünge:
  2785. ----------------------
  2786. Sprung um relativen Offset,  wenn die Bedingung erfüllt ist. Zur Berechnung
  2787. der Zieladresse siehe SJMP (4.5 unbedingte Sprünge).
  2788.  
  2789.  
  2790.  
  2791.             ┌───────────┬───────────┐
  2792. JZ codeAdress       │    60h    │ relOffset │               2     no Flags
  2793.             ├───────────┼───────────┤
  2794. JNZ codeAdress      │    70h    │ relOffset │               2     no Flags
  2795.             └───────────┴───────────┘
  2796.  
  2797.      springe, wenn ACC = 0 bzw. wenn ACC nicht = 0
  2798.  
  2799.  
  2800.  
  2801.  
  2802.  
  2803.             ┌───────────┬───────────┐
  2804. JC codeAdress       │    40h    │ relOffset │               2     no Flags
  2805.             ├───────────┼───────────┤
  2806. JNC codeAdress      │    50h    │ relOffset │               2     no Flags
  2807.             └───────────┴───────────┘
  2808.  
  2809.      springe, wenn C = 1 bzw. C = 0
  2810.  
  2811.  
  2812.  
  2813.  
  2814.  
  2815.             ┌─────────┬───────────┬───────────┐
  2816. JB bit, codeAdress  │   20h   │  bitAdr   │ relOffset │     2    no Flags
  2817.             ├─────────┼───────────┼───────────┤
  2818. JNB bit, codeAdress │   30h   │  bitAdr   │ relOffset │     2    no Flags
  2819.             ├─────────┼───────────┼───────────┤
  2820. JBC bit, codeAdress │   10h   │  bitAdr   │ relOffset │     2    no Flags
  2821.             └─────────┴───────────┴───────────┘
  2822.  
  2823.      springe, wenn Bit = 1, bzw. Bit = 0:
  2824.      Bei JBC: Sprung, wenn Bit = 1 und lösche Bit.
  2825.  
  2826.  
  2827. 4.6 bedingte Sprünge                                         Seite 48
  2828. ───────────────────────────────────────────────────────────────────────────
  2829.  
  2830.              ┌───────────┬───────────┬───────────┐
  2831. CJNE A, direct,codeAdr   │    B5h    │  dataAdr  │ relOffset │  2     C
  2832.              ├───────────┼───────────┼───────────┤
  2833. CJNE A, #data, codeAdr   │    B4h    │    data   │ relOffset │  2     C
  2834.              ├───────────┼───────────┼───────────┤
  2835. CJNE Rn, #data,codeAdr   │ 1011 1nnn │    data   │ relOffset │  2     C
  2836.              ├───────────┼───────────┼───────────┤
  2837. CJNE @Ri,#data,codeAdr   │ 1011 011i │    data   │ relOffset │  2     C
  2838.              └───────────┴───────────┴───────────┘
  2839.  
  2840.    vergleiche und springe, wenn nicht gleich:
  2841.      Ist der linke Operand kleiner als der Rechte,  so ist anschließend das
  2842.      Carry Flag gesetzt (C = 1).
  2843.  
  2844.  
  2845.  
  2846.  
  2847.  
  2848.             ┌───────────┬───────────┐
  2849. DJNZ Rn, codeAdr    │ 1101 1nnn │ relOffset │              2    no Flags
  2850.             ├───────────┼───────────┼───────────┐
  2851. DJNZ direct, codeAdr│    D5h    │  dataAdr  │ relOffset │  2    no Flags
  2852.             └───────────┴───────────┴───────────┘
  2853.  
  2854.    Decrement und springe, wenn Inhalt danach ungleich 0
  2855.  
  2856.  
  2857.  
  2858.  
  2859.  
  2860.             ┌───────────┐
  2861. NOP                 │    00h    │                          1    no Flags
  2862.             └───────────┘
  2863.  
  2864.    keine Aktion.  NOP ist oft dienlich, wenn eine Wartezeit überbrückt wer-
  2865.      den soll. Bei einem Takt von 12 MHz dauert ein NOP 1 µs.
  2866.  
  2867.  
  2868.  
  2869.  
  2870.  
  2871.             ┌───────────┐
  2872. reserved            │    A5h    │                          ?    ?
  2873.             └───────────┘
  2874.  
  2875.    unerlaubter Opcode. Diesem HEX-Code ist kein Befehl zugeordnet.
  2876.  
  2877.  
  2878.  
  2879. 5. Assembler                                                 Seite 49
  2880. ───────────────────────────────────────────────────────────────────────────
  2881.  
  2882. 5.  Assembler:
  2883. --------------
  2884.  
  2885. Ein Assembler wird zur Übersetzung eines mit Mnemonic-Symbolen  geschriebe-
  2886. nen Programms in ausführbaren HEX-Code verwendet. Im Source-Code wird jeder
  2887. Befehl einzeln angeschrieben.  Manche Assembler bieten zwar die Möglichkeit
  2888. MACRO's zu definieren,  aber auch dort ist letztlich jeder einzelne  Befehl
  2889. im Source-File definiert,  MARCOS dienen nur zur Abkürzung sich oft wieder-
  2890. holender Befehlsfolgen.
  2891.  
  2892. Der Assembler übersetzt jeden einzelnen Befehl in den  entsprechenden  HEX-
  2893. Code  (siehe 4.  Befehlssatz).  Der Assembler berechnet aber auch die Ziel-
  2894. adressen bei einem JMP oder CALL.
  2895.  
  2896.  
  2897. Für den 8051 gibt es einige kommerzielle Assembler wie den ASM51 von  Intel
  2898. oder den A51 von Keil.  Es gibt aber auch einige Shareware-Produkte wie den
  2899. TASM, die sich ebenfalls eignen.  Von der Zeitschrift elektor wird zur Zeit
  2900. (Start: 09.1991) ein Assemblerkurs durchgeführt, dazu gibt es ebenfalls ei-
  2901. nen preisgünstigen Assembler EASM51.  Allerdings generiert der EASM51 einen
  2902. eigendefinierten HEX-Code.  Die meißten anderen Assembler generieren  einen
  2903. HEX-Code im Intel-HEX-Format.
  2904.  
  2905.  
  2906.  
  2907.  
  2908. 5.1  Der ASM51:
  2909. ---------------
  2910.  
  2911. Der ASM51 und der A51 sind weitgehend kompatibel.  Der Assembler selbst ge-
  2912. neriert einen Objekt-File. Dieser File kann nicht in ein EPROM oder auf ei-
  2913. nen 8051 Rechner geladen werden. Der Objekt-File enthält noch keine absolu-
  2914. ten Adressen.  Im Source-Code als relocatabel definierte Segmente  (Codebe-
  2915. reiche) können noch innerhalb des 64 kByte Adressraums verschoben werden.
  2916.  
  2917. Die  Adresszuweisung übernimmt der Linker (RL51.EXE).  Der Linker generiert
  2918. einen Absolut-File. Das Programm ist nun fest auf Code-Adressem zugeordnet.
  2919. Dieses Verfahren hat seine Vorteile  bei  umfangreicheren  Programmen.  Vom
  2920. Linker  können  mehrere  Objekt-Files zu einem Absolut-File zusammengelinkt
  2921. werden.  Ein Programm kann so in mehreren kleinen Modulen erstellt  werden.
  2922. Es bleibt übersichtlicher,  außerdem eignet sich der ASM51 damit zur Anwen-
  2923. dung in Firmen, wo oft mehrere Leute an einem Programm basteln.
  2924.  
  2925. Es besteht zusätzlich die Möglichkeit,  allgemeinem Routinen,  die oft ver-
  2926. wendet  werden in einen Libary-File abzulegen (LIB51.EXE).  Libary-Routinen
  2927. können vom Linker in den Absolut-File eingebunden werden.
  2928.  
  2929. Der Absolut-File kann aber auf vielen Eprommern  auch  noch  nicht  geladen
  2930. werden.  Es wird noch ein Konvertierprogramm von Absolut- in HEX-Format be-
  2931. nötigt (OH.EXE).
  2932.  
  2933.  
  2934. Assembler:         ASM51   -->   Objekt-File
  2935. Linker:            RL51    -->   Absolut-File
  2936. Konvertierung:     OH      -->   HEX-File
  2937.  
  2938.  
  2939. 5. Assembler                                                 Seite 50
  2940. ───────────────────────────────────────────────────────────────────────────
  2941.  
  2942. Anmerkung: Der Absolut- und der Objekt-File besitzen denselben Aufbau:  Die
  2943.      Files bestehen aus einer Aneinanderreihung von RECORD's.  Jeder Record
  2944.      beginnt mit einem Byte, das den Record-Typ definiert, danach folgt ein
  2945.      Word mit der Anzahl der im  Record-Body  folgenden  Bytes.  Am  Schluß
  2946.      folgt noch ein Byte mit einer Checksumme.  Je nach Record-Typ sind die
  2947.      Record-Body's von verschiedener Struktur.  Absolut-  und  Objekt-Files
  2948.      enthalten Code in binärer Form.  Zusätzlich können noch die im Source-
  2949.      File definierten Variablen-Namen enthalten sein.
  2950.  
  2951.      Auch wenn ein Objekt-File Code in binärer Form enthält,  darf er nicht
  2952.      mit einem Binär-File verwechselt werden. Binär-Files werden von einfa-
  2953.      chen  Assemblern  und Eprommern verwendet.  In Binär-Files ist nur der
  2954.      Code enthalten. Der Offset innerhalb des Files ist gleich der Adresse.
  2955.      Binär-Files sind so bei kurzen Programmen,  die bei Offset 0000 begin-
  2956.      nen  sehr kompakt.  Bei Objekt-Files steht einleitend noch der Record-
  2957.      Typ und die Record-Länge. Bei Programmen,  die Code bei hohen Adressen
  2958.      enthalten wird der Binär-File schnell umfangreicher.  Nicht verwendete
  2959.      Adressen, die davor liegen müssen mit 0FFh aufgefüllt werden.
  2960.  
  2961.      HEX-Files beinhalten nur Code.  Jedes Byte ist als ASCII-HEX-Zahl dar-
  2962.      gestellt.  Sie  können  mit  einem  normalen Editor betrachtet werden.
  2963.      HEX-Files sind Standart beim Laden auf vielen Eprommern.
  2964.  
  2965.  
  2966.  
  2967. In dieser Beschreibung soll nicht auf die verschiedenen Finessen eines  As-
  2968. semblers wie den ASM51 eingegangen werden. Es wird nur kurz die zur Erstel-
  2969. lung eines kleinen Programms wesentliche Syntax erläutert.
  2970.  
  2971.  
  2972.  
  2973. Der ASM kennt alle Mnemonics,  wie sie in Kapitel 4 definiert sind. Default
  2974. kennt der ASM51 auch die SFR- und SFB-Definitionen des 8051.  Es  muß  also
  2975. z.B.  nicht  erst die Abkürzung  PSW DATA 0D0h  definiert werden,  PSW kann
  2976. direkt verwendet werden.
  2977.  
  2978. Für Bit-Adressen kann ebenfalls der vordefinierte SFB-Name eingesetzt  wer-
  2979. den.  Es kann aber auch der SFR-Namen des (DATA-)Bytes,  in dem sich dieses
  2980. Bit befindet, verwendet werden und hinter einem .  die Nummer des Bit's an-
  2981. gegeben werden.
  2982.   Beispiel:
  2983.        Das Auxillary-Carry-Flag (BIT 0D6h) liegt         SETB 0D6h
  2984.        im Programm-Status-Word (DATA 0D0h). Ne-          SETB AC
  2985.        benstehende Befehle führen zu demselben           SETB PSW.6
  2986.        Ergebnis.
  2987.  
  2988.  
  2989. Soll Code für eine andere CPU generiert werden, so müssten die zusätzlichen
  2990. SFR  und SFB definiert werden.  Hierzu wird praktisch ein Include-File ver-
  2991. wendet. Include-Files mit den SFR-Definitionen für andere CPU's werden beim
  2992. ASM51  auf  Disk  mitgeliefert.   In  den  Include-Files  sind  alle   SFR-
  2993. Definitionen  für die CPU enthalten,  auch die der ASM51 schon default (vom
  2994. 8051) kennt.  Der ASM51 bringt in einem solchen  Fall  eine  Fehlermeldung,
  2995. deßhalb   werden  mit  dem  Befehl  $NOMOD51  die  default  bekannten  SFR-
  2996. Definitionen abgeschaltet.
  2997.  
  2998.  
  2999. 5. Assembler                                                 Seite 51
  3000. ───────────────────────────────────────────────────────────────────────────
  3001.  
  3002. Zur Steuerung des Assemblers können im  Source-File  Befehle  (Direktriven)
  3003. mitangegeben  werden.  Es  werden  hier nur die wichtigsten erläutert.  Die
  3004. meißten anderen betreffen ohnehin nur das Format des List-Files.
  3005.  
  3006.  
  3007. $noMOD51    die sonst default bekannten SFR für den 8051 werden  abgeschal-
  3008.      tet. $NOMOD51 muß am Anfang des Source-Files stehen.
  3009.  
  3010. $INCLUDE(fileName)        die in dem angegebenen File enthaltenen Mnemonics
  3011.      werden an jener Stelle in  den  Assembler-Source-File  übernommen,  wo
  3012.      $INCLUDE steht. Der Include-File muß gültigen Source-Code enthalten.
  3013.  
  3014. $DEBUG     die Variablen-Definitionen werden als Debug-Informationen in den
  3015.      Objekt-File übernommen. $DEBUG am Anfang des Source-Files stehen.
  3016.  
  3017. $DEBUG und $NOMOD51 können auch  in  der  Aufrufzeile  mitangegeben  werden
  3018. (dann ohne $).
  3019.  
  3020.  
  3021.  
  3022.  
  3023. Mit    USING n   (n = 0..3)  kann eine Registerbank reserviert werden.  Der
  3024. Linker reserviert die entsprechenden Adressen im internen RAM.  Default ist
  3025. USING 0 eingestellt.
  3026.  
  3027.  
  3028.  
  3029.  
  3030. Der  ASM51 kennt default folgende Code-Adressen.  Diese Definitionen werden
  3031. auch mit dem Befehl $noMOD51 nicht abgeschaltet.
  3032.  
  3033.      RESET   CODE  00h             Anmerkung: für den 8052 sollte
  3034.      ExtI0   CODE  03h                        noch die Definition
  3035.      Timer0  CODE  0Bh                        Timer2  CODE  2Bh
  3036.      ExtI1   CODE  13h                        in den Include-File
  3037.      Timer1  CODE  1Bh                        mit den SFR-Definition-
  3038.      SINT    CODE  23h                        en eingefügt werden.
  3039.  
  3040.  
  3041.  
  3042.  
  3043.  
  3044. 5.2  Segmentierung unter ASM51:
  3045. -------------------------------
  3046.  
  3047. Ein Programm kann bereits im Sourcecode mit festen Adresszuordnungen verse-
  3048. hen,  oder relocateable geschrieben sein.  Diese Optionen können  auch  ge-
  3049. mischt verwendet werden.
  3050.  
  3051. Den Variablen der verschiedenen Speicherbereiche bzw. dem Code ist entspre-
  3052. chend der Adressierungsart der Typ DATA,  IDATA,  XDATA,  BIT oder CODE zu-
  3053. geordnet.  Jeder Variablen-Definition oder Code-Procedure ist eine  Segmen-
  3054. tangabe richtigen Typs vorrauszustellen.
  3055.  
  3056.  
  3057. 5. Assembler                                                 Seite 52
  3058. ───────────────────────────────────────────────────────────────────────────
  3059.  
  3060. 5.2.1  feste Adresszuordnung:
  3061. -----------------------------
  3062. Eine  feste Adresszuordnung ist die einfachste Art unter ASM51 ein Programm
  3063. zu erstellen. Hier stehen die Adressenb schon im Objekt-File fest. Der Lin-
  3064. ker kann die übersetzten Code-Bereiche nicht mehr verschieben.
  3065.  
  3066. Bei professioneller Programmerstellung werden feste Segmente nur verwendet,
  3067. wo die Hardware feste Adresen erfordert.  Zum Beispiel für die  Einsprunga-
  3068. dressen für Reset und die Interrupts.  Aber auch für bestimmte feste Adres-
  3069. sen im XDATA-Bereich (falls dort unter einer ganz bestimmten  Adresse  eine
  3070. Hardware-Erweiterung aufgebaut wurde).
  3071.  
  3072.  
  3073.  
  3074. Eine  feste Adresszuordnung wird erreicht durch Voranstellen eines der fol-
  3075. genden Schlüsselwörter:
  3076.  
  3077.                CSEG,  XSEG, DSEG, ISEG, BSEG
  3078.  
  3079. Obigen Schlüsselwörtern kann noch der Zusatz  "AT adr" folgen.  Damit  wird
  3080. der Beginn des Segmentes auf eine bestimmte feste Adresse gesetzt.  Default
  3081. beginnt der ASM51 ansonsten in jedem Segment bei 0000.
  3082.  
  3083. Ein Segment bleibt solange geöffnet,  bis wieder  ein  neues  Schlüsselwort
  3084. (aus obigen) angegeben wird.  Am Beginn des Source-Files wird vom Assembler
  3085. default CSEG AT 0000 angenommen.
  3086.  
  3087.  
  3088.  
  3089.  
  3090. Code kann selbstverständlich nur im CSEG eingegeben werden. Dazu werden die
  3091. in Kapitel 4. erklärten Mnemonics verwendet. Zusätzlich gibt es die folgen-
  3092. den Pseudo-Befehle, um Texte,  Tabellen oder Festwerte in den Code einzufü-
  3093. gen:
  3094.  
  3095.    DB byte         ; reserviere 1 Byte (? bedeutet Wert = beliebig)
  3096.    DW word         ; reserviere 1 Word
  3097.  
  3098.  
  3099. Beispiele:
  3100.  
  3101.   DB 0A5h                        ; Hexwert A5h
  3102.   DB 'Dies ist ein Text.',0      ; Text in Hochkomma gefolgt von Hexwert 0
  3103.   DW label1                      ; Hexwert der Adresse von Label1. Das
  3104.                  ; High Byte wird zuerst gespeichert.
  3105.  
  3106.  
  3107.  
  3108.  
  3109. In  anderen  Segmenten  (DSEG,  ISEG,  XSEG  oder  BSEG) können keine Code-
  3110. Mnemonics stehen.  Hierin werden nur Variablen-Namen definiert.  Der  Platz
  3111. für  jede  definierte Variable wird mit DS definiert.  In jedem Segment-Typ
  3112. werden Variable durch ein Label festgelegt.  Jedem Label ist ein :  nachzu-
  3113. stellen.
  3114.  
  3115.    DS   n            reserviere n Bytes
  3116.    DBIT n            reserviere n Bit
  3117.  
  3118. 5. Assembler                                                 Seite 53
  3119. ───────────────────────────────────────────────────────────────────────────
  3120.  
  3121. Beispiel:
  3122.  
  3123.    ISEG AT 30h
  3124.       buffer:   DS  20       ; 20 Bytes für buffer reservieren
  3125.       stack:    DS  12
  3126.  
  3127.    CSEG                      ; nun weiter mit Code = ISEG geschlossen
  3128.        .......
  3129.  
  3130.  
  3131.  
  3132.  
  3133. Für  ein  ganz einfaches Programm kann man auch auf die Verwendung von Seg-
  3134. menten verzichten.  Dann werden die Variablen-Namen mit folgenden Direktri-
  3135. ven definiert (Beispiele):
  3136.  
  3137.      dAdr1     DATA      23h
  3138.      iAdr1     IDATA     8Fh
  3139.      xAdr1     XDATA   1234h
  3140.      bAdr1     BIT        0
  3141.      cAdr1     CODE   0FFF0h
  3142.      wert1     EQU        1             ; Definition eines festen Wertes
  3143.  
  3144. Diese  Form  wird  auch  bei der Definition der SFR für andere CPUs als den
  3145. 8051 verwendet, um sie mit INCLUDE einzubinden.
  3146.  
  3147.  
  3148.  
  3149.  
  3150.  
  3151. Einfache Assembler kennen oft nur die EQU-Zuordnung.  Dort werden auch  Va-
  3152. riablen  vom Typ DATA,  XDATA,  IDATA und BIT mit EQU definiert.  Dies kann
  3153. beim ASM51 auch gemacht werden. Allerdings wird dann auf eine Fehlermeldung
  3154. verzichtet,  die ASM51 generiert,  wenn in einem Befehl eine  Variable  mit
  3155. falschen Typ verwendet wird.
  3156.  
  3157. Einfache Assembler verwenden auch nicht die Direktrive CSEG AT Adr,  um die
  3158. Assemblierung  bei  einer  bestimmten  Code-Adresse  zu  beginnen,  sondern
  3159. ORG Adr.
  3160.  
  3161.  
  3162.  
  3163.  
  3164. Zur Erstellung eines Programms werden nur noch folgende Direktriven oft be-
  3165. nötigt:
  3166.  
  3167.    END           ; Dieses Schlüsselwort muß am Ende des Assembler-Source
  3168.          ; Files stehen.
  3169.  
  3170.    $             ; anstelle dieses Symbols setzt der ASM51 immer die aktu-
  3171.          ; elle Adresse des PC ein.
  3172.  
  3173.  
  3174.  
  3175. 5. Assembler                                                 Seite 54
  3176. ───────────────────────────────────────────────────────────────────────────
  3177.  
  3178. 5.2.2  relocatable Segmentierung:
  3179. ---------------------------------
  3180.  
  3181. Bei  einer relocatablen Segmentangabe sind zuerst Segmentnamen in folgender
  3182. Form zu definieren. Es können auch mehrere Segmente gleichen Typs definiert
  3183. werden.
  3184.  
  3185.          segNameC   SEGMENT  CODE
  3186.          segNameX   SEGMENT  XDATA
  3187.          segNameD   SEGMENT  DATA
  3188.          segNameI   SEGMENT  IDATA
  3189.          segNameB   SEGMENT  BIT
  3190.  
  3191. Den einzelnen Bereichen sind dann folgende Schlüsselwörter vorranzustellen:
  3192.  
  3193.            RSEG  segNameC
  3194.            RSEG  segNameX
  3195.            RSEG  segNameD
  3196.            RSEG  segNameI
  3197.            RSEG  segNameB.
  3198.  
  3199. Die Eingabe von Code-Mnemonics und Variablendefinitionen  erfolgt  wie  bei
  3200. festen Segmenten.
  3201.  
  3202.  
  3203.  
  3204. Im Zusammenhang mit relocatabel geschriebenen Programm-Modulen sind folgen-
  3205. de Direktriven wichtig:
  3206.  
  3207.    PUBLIC varName1, varName2,...   ; Variablen-Namen werden dem Linker
  3208.                    ; bekanntgegeben
  3209.  
  3210.    EXTRN CODE (cAdr1,cAdr2,...)    ; Variablen-Namen werden extern dekla-
  3211.    EXTRN DATA (dAdr1,dAdr1,...)    ; riert. Der Assembler weiß damit, das
  3212.    EXTRN IDATA (iAdr1,....)        ; sie in einem anderen Segment defi-
  3213.    EXTRN XDATA (xAdr1,....)        ; niert sind.
  3214.    EXTRN BIT (bAdr1,bAdr2....)
  3215.    EXTRN NUMBER (wert1,wert2...)
  3216.  
  3217.  
  3218.  
  3219.  
  3220.  
  3221.  
  3222. 5.3  ASM51 Aufruf:
  3223. ------------------
  3224.  
  3225. Der  Aufruf von Assembler,  Linker und Konvertierprogramm erfolgt in unten-
  3226. stehender Form.  Die Angaben in <> sind optional.  Default erhält sonst der
  3227. ObjekFile die Extension .obj,  der Listfile .lst und der AbsolutFile erhält
  3228. keine Extension. Die default eingestellt Größe des internen RAM beim Linker
  3229. ist 128 Byte.
  3230.  
  3231. ASM51 sourceName <OJ(objektName)> <PR(listName)>
  3232. RL51 objektName <TO absolutName> <RAMSIZE(256)>
  3233. OH absolutName TO hexName
  3234.  
  3235. 5. Assembler                                                 Seite 55
  3236. ───────────────────────────────────────────────────────────────────────────
  3237.  
  3238. 5.4  Programmbeispiel:
  3239. ----------------------
  3240.  
  3241. Folgendes Programmierbeispiel zeigt wie  Variablennamen  absolut  definiert
  3242. werden.  Gezeigt  wird eine seriell-Interrupt Routine,  die ein empfangenes
  3243. Zeichen als Echo wieder zurücksendet.
  3244.  
  3245. Es wird nur  mit  CSEG  gearbeitet.  Der  Code  beginnt  mit  der  Default-
  3246. Einstellung  CSEG  AT Reset bei Adresse 0.  Die Interrupt-Routine wird fest
  3247. auf die Adresse 23h gelegt.
  3248.  
  3249. ┌──────────────────────────────────────────────────────────────────────┐
  3250. │TxFlag    BIT  00            ; Bit0 in DATA 20h als Flag              │
  3251. │stack     IDATA 21h          ; Adresse in int.RAM für Stack           │
  3252. │                                                                      │
  3253. │;CSEG AT reset               ; Code beginnt bei default Label Reset   │
  3254. │     AJMP init               ; Sprung zur Initialisierung             │
  3255. │                                                                      │
  3256. │CSEG AT SINT                 ; an Adresse 23h ist Einsprung für SINT  │
  3257. │     JNB RI, sintChkTx       ; wurde etwas empfangen?                 │
  3258. │     PUSH ACC                                                         │
  3259. │     MOV A, SBUF             ; einlesen                               │
  3260. │     CLR RI                  ; Empfangsbuffer wieder bereit           │
  3261. │     JB TxFlag, echoChar                                              │
  3262. │     JNB TI, $               ; warte bis Sendebuffer frei ist         │
  3263. │echoChar:                                                             │
  3264. │     MOV SBUF, A             ; als Echo wieder zurücksenden           │
  3265. │     CLR TxFlag                                                       │
  3266. │     CLR TI                  ; Sendebuffer voll markieren             │
  3267. │     POP ACC                                                          │
  3268. │sintChkTx:                                                            │
  3269. │     JNB TI, sintRet         ; wenn SendeBuffer-leer Interrupt, dann  │
  3270. │     SETB TxFlag             ; Flag setzen, TI danach löschen, damit  │
  3271. │     CLR TI                  ; serieller Interrupt wieder frei wird.  │
  3272. │sintRet:                                                              │
  3273. │     RETI                                                             │
  3274. │                                                                      │
  3275. │init:                                                                 │
  3276. │     MOV SP, #(stack - 1)    ; Stack umlegen                          │
  3277. │     MOV IE, #90h            ; SINT enablen                           │
  3278. │     MOV SCON, #50h          ; serielle Schnittstelle und Timer 1     │
  3279. │     MOV TH1, #0FDh          ; initialisieren                         │
  3280. │     MOV TMOD, #20h                                                   │
  3281. │     SETB TR1                                                         │
  3282. │     JMP $                   ; Warteschleife. Empfang über Interrupt  │
  3283. │                                                                      │
  3284. │END                                                                   │
  3285. └──────────────────────────────────────────────────────────────────────┘
  3286.  
  3287. In obigen Programm steht die spätere  Lage  des  Code  in  Programmspeicher
  3288. schon während der Assemblierung fest.
  3289.  
  3290.  
  3291. Auf der folgenden Seite wird noch ein Programmbeispiel mit relocatablen Co-
  3292. de vorgestellt.:
  3293.  
  3294. 5. Assembler                                                 Seite 56
  3295. ───────────────────────────────────────────────────────────────────────────
  3296.  
  3297. ┌──────────────────────────────────────────────────────────────────────┐
  3298. │idataSeg SEGMENT IDATA       ; Namen für relocatable Segmente         │
  3299. │dataSeg SEGMENT DATA         ; werden definiert.                      │
  3300. │codeSeg SEGMENT CODE                                                  │
  3301. │                                                                      │
  3302. │ PUBLIC initRingBuf                                                   │
  3303. │ PUBLIC putCharToBuf, getCharFromBuf                                  │
  3304. │                                                                      │
  3305. │ USING 0                     ; Register-Bank 0 reservieren            │
  3306. │                                                                      │
  3307. │RSEG dataSeg                 ;                                        │
  3308. │ rdBufPtr: DS 1              ; Lesezeiger auf Ringbuffer              │
  3309. │ wrBufPtr: DS 1              ; Schreibzeiger auf Ringbuffer           │
  3310. │                                                                      │
  3311. │RSEG idataSeg                ; einlesen                               │
  3312. │ ringBuf:    DS 30           ; 30 Bytes für Ringbuffer                │
  3313. │                                                                      │
  3314. │RSEG codeSeg                                                          │
  3315. │ initRingBuf:                ; Initialisierungs-Routine               │
  3316. │     MOV rdBufPtr, #ringBuf  ; Lesezeiger auf Bufferanfang            │
  3317. │     MOV wrBufPtr, #ringBuf  ; Schreibzeiger auf Bufferanfang         │
  3318. │     RET                                                              │
  3319. │                                                                      │
  3320. │ putCharToBuf:                             ; wrBufPtr zeigt auf den   │
  3321. │     XCH A, wrBufPtr                       ; Platz im Buffer, auf     │
  3322. │     INC A                                 ; dem beim nächstenmal     │
  3323. │     CJNE A, #(ringBuf+30), noRingBufTop   ; geschrieben wird.        │
  3324. │     MOV A, #ringBuf                                                  │
  3325. │ noRingBufTop:                             ; Geschrieben wird ohne    │
  3326. │     CJNE A, rdBufPtr, leaveRdBufPtr       ; Rücksicht, ob schon      │
  3327. │     INC rdBufPtr                                                     │
  3328. │     CJNE rdBufPtr, #(ringBuf+30), leaveRdBufPtr                      │
  3329. │     MOV rdBufPtr, #ringBuf                ; ausgelesen wurde.        │
  3330. │ leaveRdBufPtr:                            ; Wird ein Zeichen nicht   │
  3331. │     XCH A, wrBufPtr                       ; rechtzeitig ausgelesen,  │
  3332. │     MOV @R0, A                            ; so geht es verloren.     │
  3333. │     RET                                                              │
  3334. │                                                                      │
  3335. │ getCharFromBuf:                                                      │
  3336. │     MOV A, rdBufPtr                   ; wenn der Lesezeiger gleich   │
  3337. │     CJNE A, wrBufPtr, getCharDo       ; dem Schreibzeiger ist, ist   │
  3338. │     SETB C                            ; der Buffer leer. Dann RET    │
  3339. │     RET                               ; mit Carry.                   │
  3340. │ getCharDo:                                                           │
  3341. │     MOV R0, A                                                        │
  3342. │     MOV A, @R0                        ; Nach dem Auslesen rückt der  │
  3343. │     INC R0                            ; Lesezeiger weiter.           │
  3344. │     CJNE R0, #(ringBuf+30), leaveRdBufPtrR0                          │
  3345. │     MOV R0, #ringBuf                                                 │
  3346. │ leaveRdBufPtrR0:                      ; Der Lesezeiger zeigt auf das │
  3347. │     MOV rdBufPtr, R0                  ; nächste auszulesende Byte.   │
  3348. │     CLR C                                                            │
  3349. │     RET                                                              │
  3350. │END                                                                   │
  3351. └──────────────────────────────────────────────────────────────────────┘
  3352.  
  3353.  
  3354. 5. Assembler                                                 Seite 57
  3355. ───────────────────────────────────────────────────────────────────────────
  3356.  
  3357. Obiges  Programm  ist vollkommen relocateabel.  Es kann vom Linker zu einem
  3358. anderen Programm dazugelinkt werden.  Das Programm kann die hier  bereitge-
  3359. stellten Routinen zur Verwaltung eines Ringbuffers über CALL's aufrufen. Zu
  3360. beachten ist nur,  das R0 zerstört wird,  das das Zeichen im Akku übergeben
  3361. wird und das bein Lesen das Carry gesetzt ist,  falls der Buffer leer  ist,
  3362. also kein Zeichen gelesen werden konnte.
  3363.  
  3364. Praktisch  werden  solche  Routinen  oft  angewandt in Verbindung mit einer
  3365. Interrupt-Routine.   Zum  Beispiel  beim  seriellen   Empfang.   In   einer
  3366. Interrupt-Routine  müssen jedoch auf jeden Fall erst alle verwendeten Regi-
  3367. ster und die Flags gerettet werden und dann wird das empfangene Zeichen  in
  3368. einen  Ringbuffer eingetragen.  Die Procedure putCharToBuf ist entsprechend
  3369. zu ergänzen.  Das Auslesen des Ringbuffers erfolgt dann durch das Hauptpro-
  3370. gramm.
  3371.  
  3372.  
  3373.  
  3374.  
  3375.  
  3376. 5.5  ASM51 - Bug's:
  3377. -------------------
  3378.  
  3379. Der ASM51 hat einige Besonderheiten, hier sei davor gewarnt:
  3380.  
  3381.  
  3382. * Der ASM51 kennt  PCON DATA 87h  nicht, obwohl dies zu den SFR des 8051
  3383.   gehört.
  3384.  
  3385. * Einige Editoren setzen asc26 als End-Of-File Kennung an das Ende des
  3386.   Source-Codes. ASM51 mäkelt dies als Fehler an, arbeitet aber korrekt wei-
  3387.   ter. Die Fehlermeldung  2 ERRORS FOUND  kann bei solchen Files ignoriert
  3388.   werden.
  3389.  
  3390. * Beim Einlesen von Zeichen aus einem File löscht der ASM51 bei jedem Byte
  3391.   das höchstwertigste Bit. asc8Dh ist also gleich asc0Dh usw. Zeichen grös-
  3392.   ser asc7Fh können deßhalb nicht in Strings angegeben werden (auch nicht
  3393.   ö, ä, ü, ß). asc8Dh = 'ì' (auch innerhalb eines Kommentars wird mit End-
  3394.   Of-Line verwechselt.
  3395.  
  3396. * Das Zeichen asc25h = '%' ist beim ASM51 reserviert für die Kennzeichnung
  3397.   von MACRO's. ES darf nicht in Strings verwendet werden. Der ASM51 macht
  3398.   aber sogar einen Fehler, wenn ein '%' innerhalb eines Kommentars steht.
  3399.   Es darf auch nicht das Zeichen ascA5h = 'Ñ' verwendet werden.
  3400.  
  3401. * Von Variablen-Namen werden nur die ersten 31 Zeichen gewertet, mehr Zei-
  3402.   chen werden ignoriert. Dies ist kein Bug, der Programmierer sollte es nur
  3403.   beachten.
  3404.  
  3405.  
  3406. 6.1 Interrupt-Logik                                          Seite 58
  3407. ───────────────────────────────────────────────────────────────────────────
  3408.  
  3409. 6.  weitere Hardwarekomponenten des 8051:
  3410. -----------------------------------------
  3411.  
  3412. 6.1  Interrupt-Logik:
  3413. ---------------------
  3414.  
  3415. Der 8051 besitzt 5 Interrupt-Quellen. Zur Interrupt-Logik gehören die Regi-
  3416. ster  IE  (Interrupt Enable),  IP (Interrupt Priority) und einige Flags aus
  3417. TCON (Timer-Controll).
  3418.  
  3419. Wird eine Interrupt-Bedingung erfüllt und ist der Interrupt  enabled,  dann
  3420. unterbricht  die  CPU  das  gerade  laufende Programm,  schiebt die Return-
  3421. Adresse auf den Stack und springt die Interrupt-Routine an.  Die Flags wer-
  3422. den  jedoch  nicht automatisch gesichert (wie beim 8088).  Jeder Interrupt-
  3423. Quelle ist eine feste Einsprungadresse zugeordnet.
  3424.  
  3425. EXTI0   CODE  0003h     ; externer Interrupt-Eingang _INT0 (P3.2)
  3426. Timer0  CODE  000Bh     ; Timer 0 Überlauf
  3427. EXTI1   CODE  0013h     ; externer Interrupt-Eingang _INT1 (P3.3)
  3428. Timer1  CODE  001Bh     ; Timer 1 Überlauf
  3429. SInt    CODE  0023h     ; serieller Interrupt:  Receive (RI)
  3430.             ;                  oder Transmit (TI)
  3431.  
  3432.  
  3433. Die Interrupts können per Software gesperrt werden.  Das heißt,  sie werden
  3434. nur generiert,  wenn das entsprechende Bit im Interrupt Enable Register ge-
  3435. setzt ist. Zusätzlich muß auch EA = 1 sein. Die Flags im IE-Register können
  3436. bitweise adressiert werden. Mit CLR EA können also alle Interrupts gesperrt
  3437. werden.  Mit SETB EA werden die gesetzten wieder enabled.  Nach einem Reset
  3438. sind alle Interrupts disabled (IE = 0xx00000b).
  3439.  
  3440.        ┌────┬───┬───┬────┬─────┬─────┬─────┬─────┐
  3441.        │ EA │ _ │ _ │ ES │ ET1 │ EX1 │ ET0 │ EX0 │   IE DATA 0A8h
  3442.        └────┴───┴───┴────┴─────┴─────┴─────┴─────┘
  3443.  
  3444.        EX0  BIT  0A8h       ; enabled extern INT0
  3445.        ET0  BIT  0A9h       ; enabled Timer0 Interrupt
  3446.        EX1  BIT  0AAh       ; enabled extern INT1
  3447.        ET1  BIT  0ABh       ; enabled Timer1 Interrupt
  3448.        ES   BIT  0ACh       ; enabled seriellen Interrupt
  3449.        EA   BIT  0AFh       ; freigeben/sperren aller gesetzten Interrupts
  3450.  
  3451.  
  3452. Der  8051  arbeitet  mit 2 Interrupt-Prioritätsstufen.  Über das Interrupt-
  3453. Priority Register (IP) kann jeder Interruptquelle eine Prioritätsstufe  zu-
  3454. gewiesen werden (1 = high Priority).
  3455.  
  3456.        ┌───┬───┬───┬────┬─────┬─────┬─────┬─────┐
  3457.        │ _ │ _ │ _ │ PS │ PT1 │ PX1 │ PT0 │ PX0 │   IP DATA 0B8h
  3458.        └───┴───┴───┴────┴─────┴─────┴─────┴─────┘
  3459.  
  3460.        PX0  BIT  0B8h       ; extern INT0 Priorität
  3461.        PT0  BIT  0B9h       ; Timer0 Interrupt Priorität
  3462.        PX1  BIT  0BAh       ; extern INT1 Priorität
  3463.        PT1  BIT  0BBh       ; Timer1 Interrupt Priorität
  3464.        PS   BIT  0BCh       ; seriellen Interrupt Priorität
  3465.  
  3466. 6.1 Interrupt-Logik                                          Seite 59
  3467. ───────────────────────────────────────────────────────────────────────────
  3468.  
  3469. Ein  sich gerade in Bearbeitung befindlicher Interrupt kann nicht durch ei-
  3470. nen anderen Interrupt gleicher oder niederer  Prioritätsstufe  unterbrochen
  3471. werden.  Wohl  aber  kann ein Interrupt mit höherer Priorität einen solchen
  3472. mit niederer unterbrechen. Der 8051 merkt sich dazu in einem internen Regi-
  3473. ster, welche Interrupts in Bearbeitung sind.  Dies können maximal 2 gleich-
  3474. zeitig  sein,  da  es nur 2 Prioritätsstufen gibt.  Bei einem RETI wird der
  3475. höchste Interrupt in Service ausgetragen.
  3476.  
  3477. Treten zwei Interrupts gleicher Priorität gleichzeitig auf,  so geniest EX-
  3478. TI0 den Vorzug vor Timer0,  vor EXTI1,  vor Timer1, vor SINT (diese Reihen-
  3479. folge innerhalb einer Prioritätsstufe).
  3480.  
  3481.  
  3482. In State 5 eines jeden Zyklus (siehe 3.2 Takt  und  3.3  Befehlsausführung)
  3483. werden  die  Interruptbedingungen in die Flags (siehe unten) gelatched.  Im
  3484. folgenden Zyklus werden diese Bedingungen überprüft (poll).  Ist  dies  der
  3485. letzte Zyklus eines Befehls (es gibt Befehle mit 2 Zyklus Dauer) so erfolgt
  3486. ein LCALL in die Interrupt-Routine.  Wenn nicht,  so wird ein Zyklus später
  3487. nocheinmal gepolled.
  3488.  
  3489. Ein LCALL wird jedoch nicht generiert,  wenn der  Interrupt  disabled  ist,
  3490. wenn  sich  ein anderer Interrupt in Bearbeitung (Priorität?) befindet oder
  3491. wenn der letzte Befehl ein RETI oder ein Zugriff auf IE oder IP  war.  Dies
  3492. hat mitunter zur Folge, das wenn ein Interrupt in Sevice ist, und ein ande-
  3493. rer ansteht, nach dem RETI erst noch mindestens ein Befehl der Hauptroutine
  3494. abgearbeitet  wird,  bevor  ein  Einsprung in den anstehenden Interrupt er-
  3495. folgt.
  3496.  
  3497. Vor jedem Poll werden in State 5 des vorigen Zyklus die  Interruptbedingun-
  3498. gen neu übernommen.  Lag ein Interrupt an,  war aber gesperrt,  und ist nun
  3499. wieder weg, so wird er von der CPU nicht angesprungen.
  3500.  
  3501.  
  3502. Als Interrupt-Anforderungen dienen folgende Flags:
  3503.  
  3504.      IE0    (in TCON)    extern INT0 Flag
  3505.      TF0    (in TCON)    Timer 0 Überlauf Flag
  3506.      IE1    (in TCON)    extern INT1 Flag
  3507.      TF1    (in TCON)    Timer 1 Überlauf Flag
  3508.      RI     (in SCON)    seriell Receive full
  3509.      TI     (in SCON)    seriell Transmit empty
  3510.  
  3511. Eine Interrupt-Anforderung liegt dann an,  wenn das entsprechende Flag  ge-
  3512. setzt  ist.  Beim  seriellen Interrupt genügt eines der beiden: RI oder TI.
  3513. Dafür muß die Software in der Interrupt-Routine prüfen, welches (RI oder TI
  3514. oder beide) den Interrupt ausgelöst hat.
  3515.  
  3516.  
  3517. RI wird von der Hardware gesetzt,  sobald über die  serielle  Schnittstelle
  3518. ein Zeichen empfangen wurde und in SBUF bereitsteht.  TI wird von der Hard-
  3519. ware gesetzt, sobald beim Senden SBUF wieder leer ist. RI und TI müssen von
  3520. der Software zurückgesetzt werden.
  3521.  
  3522.  
  3523. TF0 und TF1 werden von der Hardware gesetzt, wenn ein Timer-Überlauf nach 0
  3524. erfolgt. Beim Einsprung in die Interrupt-Routine werden TF0 und TF1 automa-
  3525. tisch von der Hardware gelöscht.
  3526.  
  3527. 6.1 Interrupt-Logik                                          Seite 60
  3528. ───────────────────────────────────────────────────────────────────────────
  3529.  
  3530. Bei den externen Interrupts gibt es eine Besonderheit: mit  den  Flags  IT0
  3531. bzw. IT1 (in TCON) können sie auf "flankengetriggert" umgeschaltet werden.
  3532.  
  3533. Bei  Level-Triggerung (IT0 = 0,  bzw.  IT1 = 0) wird im State 5 eines jeden
  3534. Zyklus  der  invertierte  Wert  von  den  Port-Pin's  _INT0  =  P3.2   bzw.
  3535. _INT1 = P3.3 in IE0 bzw.  IE1 übernommen. Bei Level-Triggerung hat es somit
  3536. keinen Wert,  die Flags IE0 und IE1 per Software zu setzen oder zu Löschen.
  3537. Die Flags spiegeln immer den Zustand der Eingänge wieder.
  3538.  
  3539. Bei  Flanken-Triggerung  werden die Flags IE0 bzw.  IE1 erst dann durch die
  3540. Hardware gesetzt,  wenn an _INT0 bzw.  _INT1 eine negative Flanke  auftrat.
  3541. Beim Einsprung in die Interrupt-Routine werden IE0 bzw, IE1 automatisch von
  3542. der Hardware gelöscht.  Sie können aber auch von der Software geändert wer-
  3543. den.
  3544.  
  3545.  
  3546. TCON beinhaltet verschiedene Flags zur Steuerung der Timer und für die  In-
  3547. terruptlogik. Die Flags können bitweise adressiert werden:
  3548.  
  3549.        ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐
  3550.        │ TF1 │ TR1 │ TF0 │ TR0 │ IE1 │ IT1 │ IE0 │ IT0 │  TCON DATA 88h
  3551.        └─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘
  3552.  
  3553.        IT0  BIT  88h       ; extern INT0 auf Flanken/_Level Triggerung
  3554.        IE0  BIT  89h       ; extern INT0 Flag
  3555.        IT1  BIT  8Ah       ; extern INT1 auf Flanken/_Level Triggerung
  3556.        IE1  BIT  8Bh       ; extern INT1 Flag
  3557.        TF0  BIT  8Dh       ; Timer 0 Überlauf Flag
  3558.        TF1  BIT  8Fh       ; Timer 1 Überlauf Flag
  3559.  
  3560.        TR0  BIT  8Ch       ; Timer 0 run
  3561.        TR1  BIT  8Eh       ; Timer 1 run
  3562.  
  3563.  
  3564.  
  3565. 6.2 8051 Timer                                               Seite 61
  3566. ───────────────────────────────────────────────────────────────────────────
  3567.  
  3568. 6.2  8051 Timer:
  3569. ----------------
  3570.  
  3571. Der  8051 besitzt zwei Timer/Counter: Timer 0 und Timer 1.  Jeder Timer be-
  3572. steht aus zwei 8 Bit Registern.  Sie können je in 4 verschiedenen Betriebs-
  3573. arten geschaltet werden.
  3574.  
  3575. Die  Timer  werden (wenn running) je Zyklus um 1 incrementiert.  Sie können
  3576. aber auch als Counter  verwendet  werden,  dann  werden  sie  abhängig  vom
  3577. Count-Eingang T0 bzw. T1 incrementiert.
  3578.  
  3579.  
  3580. Die Betriebsart wird mit dem TMOD-Register ausgewählt.  TMOD ist nicht bit-
  3581. weise adressierbar.  Das high Nibble von TMOD  wählt  die  Betriebsart  für
  3582. Timer 1 und das low Nibble für Timer 0:
  3583.  
  3584.        ┌──────┬─────┬────┬────┬──────┬─────┬────┬────┐
  3585.        │ GATE │ C/T │ M1 │ M0 │ GATE │ C/T │ M1 │ M0 │  TMOD DATA 89h
  3586.        └──────┴─────┴────┴────┴──────┴─────┴────┴────┘
  3587.  
  3588.  
  3589.    C/T = 0     -->  Timer Mode (increment um 1 je Zyklus)
  3590.    C/T = 1     -->  Counter Mode (increment um 1 je negativer Flanke am
  3591.             Port-Pin  T0 = P3.4 bzw. T1 = P3.5)
  3592.  
  3593.    GATE = 0    -->  Timer/Counter läuft immer, wenn TRx = 1 (in TCON)
  3594.    GATE = 1    -->  Timer/Counter läuft nur, wenn TRx = 1 und _INTx = 1
  3595.             der Interrupt-Eingang kann als Gate für den Timer/
  3596.             Counter dienen.
  3597.  
  3598.    M1:M0 = 00  -->  Mode 0:  13 Bit Timer/Counter
  3599.             Als Zähler dienen die 8 Bits aus THx und die lowest
  3600.             5 Bits aus TLx.
  3601.  
  3602.    M1:M0 = 01  -->  Mode 1:  16 Bit Timer/Counter
  3603.  
  3604.    M1:M0 = 10  -->  Mode 2:  8 Bit Timer/Counter mit Auto-Reload
  3605.             TLx dient als Zähler. Bei jedem Überlauf wird der Wert
  3606.             aus THx in TLx geladen.
  3607.  
  3608.    M1:M0 = 11  -->  Mode 3:  TL0 dient als 8 Bit Timer/Counter. TL0 ver-
  3609.             wendet die üblichen Controll-Bits von Timer 0.
  3610.                  TH0 dient als weiterer 8 Bit Timer/Counter.
  3611.             TH0 verwendet die Controll-Bits von Timer 1 (_INT1 als
  3612.             Gate, T1 als Counteingang, TR1, TF1).
  3613.             Timer 1 steht, wenn er sich in Mode 3 befindet.
  3614.  
  3615.  
  3616. Sobald  sich  Timer 0 in Mode 3 befindet,  kann Timer 1 nicht mehr mit TR1,
  3617. T1,  _INT1 kontrollieren werden.  Ein Timer 1 Überlauf setzt nicht mehr TF1
  3618. und kann keinen Interrupt mehr generieren.  Timer 1 kann angehalten werden,
  3619. indem er ebenfalls in Mode 3 geschaltet  wird,  sonst  läuft  er.  Obgleich
  3620. Timer  1 keine Controll-Bits mehr zugeordnet sind,  kann er während Timer 0
  3621. im Mode 3 läuft,  gut zur Schiebetakt-Erzeugung für die  serielle  Schnitt-
  3622. stelle dienen.
  3623.  
  3624.  
  3625. 6.3 serielle Schnittstelle                                   Seite 62
  3626. ───────────────────────────────────────────────────────────────────────────
  3627.  
  3628. 6.3  serielle Schnittstelle:
  3629. ----------------------------
  3630.  
  3631. Über  die serielle Schnittstelle des 8051 kann entweder synchron oder asyn-
  3632. chron gesendet und empfangen werden.  Im Asynchron Mode kann sogar  gleich-
  3633. zeitig gesendet und empfangen werden.
  3634.  
  3635. Der 8051 besitzt zum Senden und zum Empfang getrennte Register. Die Inhalte
  3636. sind  voneinander  getrennt,  jedoch  wird  für beide dieselbe DATA-Adresse
  3637. (SBUF DATA 99h) verwendet.
  3638.  
  3639.  
  3640.  
  3641. Das folgende Bild zeigt vereinfacht die  Funktion  der  seriellen  Schnitt-
  3642. stelle im Asynchron Mode.
  3643.  
  3644.        |                       ┌───────────────┐
  3645.      S |──────────────────────>│ SBUF Tx-Shift ├────────────> TxD
  3646.      o |                       └──────┬────────┘
  3647.      f |                        ┌─────┴─────┐
  3648.      t |           SysTakt ───>││    ÷ 16   │
  3649.      w |           Timer 1 ───>│├───────────┤
  3650.      a |           Timer 2 ───>││ DPLL ÷ 16 ├───────┐
  3651.      r |                        └─────┬─────┘       │
  3652.      e |      ┌─────────┐      ┌──────┴────────┐    │
  3653.        |<─────│ SBUF Rx ├──────┤ Rx-Shift Reg. ├────┴───────< RxD
  3654.        |      └─────────┘      └───────────────┘
  3655.  
  3656. Wird in SBUF (transmit) ein Wert geschrieben, beginnt die Schnittstelle da-
  3657. mit,  die Daten in TxD zu schieben. Wenn alle Bits gesendet sind, setzt die
  3658. Logik das TI Flag (BIT 99h in SCON). Der Schiebetakt kommt von einem inter-
  3659. nen 16 Bit- Zähler.
  3660.  
  3661. Empfangene Bits werden erst in das Receive Shift Register  geschoben.  Wenn
  3662. alle  Bits empfangen wurden,  wird das Zeichen in SBUF (receive) übernommen
  3663. und RI gesetzt. Der Schiebetakt kommt von einem DPLL, das mit den Empfangs-
  3664. daten synchronisiert wird.
  3665.  
  3666.  
  3667.  
  3668. Das folgende Bild zeigt vereinfacht die  Funktion  der  seriellen  Schnitt-
  3669. stelle im Synchron Mode.
  3670.  
  3671.        |                       ┌───────────────┐
  3672.      S |──────────────────────>│ SBUF Tx-Shift ├────┐
  3673.      o |            ┌─────┐    └──────┬────────┘    │
  3674.      f | SysTakt ──>│ ÷ 6 ├───────────┤   senden    │
  3675.      t |            └─────┘              o──────────│──────<> TxD
  3676.      w |                                / empfang   │
  3677.      a |                              │             │
  3678.      r |      ┌─────────┐      ┌──────┴────────┐    │
  3679.      e |<─────│ SBUF Rx ├──────┤ Rx-Shift Reg. ├────┴──────<> RxD
  3680.        |      └─────────┘      └───────────────┘
  3681.  
  3682. Senden-und Empfangs-Shift funktioniert wie beim Asynchron Mode. Jedoch wer-
  3683. den  die  Daten an RxD gesendet und empfangen.  An TxD wird der Schiebetakt
  3684. gesendet bzw. synchron empfangen.
  3685.  
  3686. 6.3 serielle Schnittstelle                                   Seite 63
  3687. ───────────────────────────────────────────────────────────────────────────
  3688.  
  3689. 6.3.1  Asynchron Mode, Synchron Mode:
  3690. -------------------------------------
  3691.  
  3692. Beim Synchron Mode wird der Schiebetakt synchron mit den Daten  übertragen.
  3693. Der  Empfänger  verwendet  also  den vom Sender kommenden Schiebetakt.  Die
  3694. Übertragungslänge ist begrenzt, da bei größeren Entfernungen die Phasenlage
  3695. zwischen Daten und Takt abweichen könnte.
  3696.  
  3697.  
  3698.  
  3699. Beim Asynchron Mode wird kein Takt übertragen.  Der Takt muß  im  Empfänger
  3700. aus den Flanken auf der Datenleitung zurückgewonnen werden.  Dazu dient ein
  3701. 16-stelliges Digital Phase Locked Loop (DPLL).  Dies ist ein 16 Bit Zähler,
  3702. der mit den Flanken der empfangenen Daten synchronisiert wird:
  3703.  
  3704.      Bei  einer negativen Flanke an RxD wird der Ausgang des DPLL auf 1 ge-
  3705.      setzt. Dort bleibt er 8 DPLL-Takte,  dann geht er für 8 DPLL-Takte auf
  3706.      0 usw. Jede negative Flanke erzwingt die Synchronisation.
  3707.  
  3708.  
  3709.  
  3710. Über  eine  Universal Asynchron Receive Transmit Schnittstelle (UART),  wie
  3711. sie beim 8051, beim PC oder einem Terminal definiert ist,  werden Daten nur
  3712. zeichenweise  übertragen.  Jedes  Zeichen wird eingeleitet durch ein Start-
  3713. bit (=0) und abgeschlossen durch 1,  1½ oder 2 Stopbits (=1).  Das Startbit
  3714. in Verbindung mit dem Stopbit garantiert, das beim Empfang der Beginn eines
  3715. Zeichens erkannt und das DPLL synchronisiert wird.
  3716.  
  3717. Das LSB (low Bit) wird immer zuerst übertragen. Sender und Empfänger müssen
  3718. im allgemeinen nicht in der Anzahl der Stopbits übereinstimmen. Die Baudra-
  3719. te  sollte  so gut übereinstimmen,  daß während der Übertragungsdauer eines
  3720. Zeichens das DPLL nicht zu weit "wegläuft".
  3721.  
  3722.  
  3723.  
  3724. Beispiel für die Übertragung des Zeichens 'A' = asc41h im Asynchron Mode:
  3725.  
  3726. ───────┐     ┌─────┐                             ┌─────┐     ┌─────────
  3727.        └─────┘     └─────────────────────────────┘     └─────┘
  3728.        |Start| LSB |     |     |     |     |     |     | MSB |Stop |
  3729.  
  3730.  
  3731.  
  3732.  
  3733.  
  3734. 6.3.2  8051 seriell Mode Einstellung:
  3735. -------------------------------------
  3736.  
  3737. Der 8051 kann im Synchron Mode mit maximal 1 MBit/s  betrieben  werden.  Im
  3738. Asynchron Mode mit maximal 375 kBit/s
  3739.  
  3740. Die  serielle  Schnittstelle kann in 4 vershiedenen Betriebsarten betrieben
  3741. werden.  Die  Betriebsart  wird  eingestellt  im  SCON  (Seriell  Controll-
  3742. Register). SCON ist bitweise addressierbar.
  3743.  
  3744.        ┌─────┬─────┬─────┬─────┬─────┬─────┬────┬────┐
  3745.        │ SM0 │ SM1 │ SM2 │ REN │ TB8 │ RB8 │ TI │ RI │  SCON DATA 98h
  3746.        └─────┴─────┴─────┴─────┴─────┴─────┴────┴────┘
  3747.  
  3748. 6.3 serielle Schnittstelle                                   Seite 64
  3749. ───────────────────────────────────────────────────────────────────────────
  3750.  
  3751. SM0 (BIT 9Fh) und SM1 (BIT 9Eh) dienen zur Modeeinstellung.
  3752. SM2 (BIT 9Dh) enabled spezielle Empfangsbedingungen.
  3753. REN (BIT 9Ch) ist das Receiver Enable Flag.
  3754. TB8 (BIT 9Bh) wird als 9th Bit gesendet.
  3755. In RB8 (BIT 9Ah) wird das 9th Bit empfangen.
  3756. TI (BIT 99h) ist das Transmit Interrupt Flag.
  3757. RI (BIT 98h) ist das Receive Interrupt Flag.
  3758.  
  3759. Zur Bedeutung und Anwendung dieser Flags siehe unten.
  3760.  
  3761.  
  3762.  
  3763.  
  3764.  
  3765. Mode 0:  Synchron-Mode mit 1/12 Oszillatorfrequenz (max. 1 MBit/s):
  3766. -------------------------------------------------------------------
  3767. SM0:SM1 = 00
  3768.  
  3769. Es  werden  8  Datenbits (LSB zuerst) über RxD gesendet und empfangen.  Der
  3770. Schiebetakt wird über TxD gesendet bzw.  empfangen.  Gleichzeitiger Empfang
  3771. und Senden ist nicht möglich.
  3772.  
  3773. Der  Schiebetakt  wird beim sendenden Teilnehmer vom Systemtakt abgeleitet.
  3774. Der Schiebetakt entspricht der Zyklusfrequenz (= 1 MHz bei 12 MHz  Oszilla-
  3775. tor). Wenn SBUF (transmit) wieder leer ist, wird TI gesetzt.
  3776.  
  3777. Damit Zeichen empfangen werden können muß der Empfänger enabled sein.  Dazu
  3778. hat die Software REN = 1 und RI = 0 zu setzen.  Das Zeichen wird  in  einem
  3779. internen Schiftregister empfangen.  Erst wenn dies voll ist,  wird der Wert
  3780. in SBUF übertragen und RI gesetzt.
  3781.  
  3782. In Mode 0 ist SM2 = 0 zu wählen, TB8 und RB8 sind ohne Bedeutung.
  3783.  
  3784.  
  3785.  
  3786. Einzelheiten Mode 0:
  3787. --------------------
  3788.  
  3789. Der Schiebetakt TxD ist low während State 3,  4  und  5  des  System-Taktes
  3790. (siehe Kapitel 3.2 und 3.3).  Mit der positiven Flanke im Schiebetakt wech-
  3791. selt der Wert an RxD, das nächste Bit wird rausgeschoben.
  3792.  
  3793. Nachdem ein neues Zeichen zum Senden in SBUF geschrieben wurde, verstreicht
  3794. erst ein voller Zyklus,  bevor mit dem Shift  begonnen  wird.  Nachdem  das
  3795. letzte Bit (MSB) des Zeichens hinausgeschoben wurde,  wird noch eine 1 hin-
  3796. terhergeschoben (damit RxD wieder in Ruhe auf 1 liegt) erst  dann  wird  TI
  3797. gesetzt.  Seit  dem  Schreibvorgang in SBUF durch die Software sind also 10
  3798. Zyklen verstrichen.
  3799.  
  3800. Beim Empfang werden mit der positiven Flanke an TxD die Daten ins Empfangs-
  3801. Shiftregister geschoben. In SBUF können zu diesem Zeitpunkt noch alte Daten
  3802. stehen.  Sie werden erst von der Hardware mit dem neuen Zeichen überschrie-
  3803. ben,  wenn  alle  Bits  empfangen wurden.  Danach wird RI = 0 gesetzt.  Ist
  3804. REN = 0 (receiver nicht enabled) oder RI = 1 (SBUF noch  voll),  so  werden
  3805. ankommende Daten nicht empfangen, sie sind verloren.
  3806.  
  3807.  
  3808. 6.3 serielle Schnittstelle                                   Seite 65
  3809. ───────────────────────────────────────────────────────────────────────────
  3810.  
  3811. Mode 1:  Asynchron-Mode mit variabler Baud Rate als 8 Bit UART:
  3812. ---------------------------------------------------------------
  3813. SM0:SM1 = 01
  3814.  
  3815. Es wird kein Takt übertragen, sondern nur die Daten. Gesendet wird über TxD
  3816. mit  1  Startbit,  den  8  Datenbits (LSB zuerst) und 1 Stopbit.  Wenn SBUF
  3817. (transmit) wieder leer ist, wird TI gesetzt.
  3818.  
  3819. Empfangen wird über RxD. Der Takt wird im Empfänger aus den Flanken der Da-
  3820. ten zurückgewonnen.  Damit Zeichen empfangen werden können muß REN = 1  und
  3821. RI = 0 sein (Receive enable). Ist SM2 = 1, so muß zusätzlich das empfangene
  3822. Stopbit = 1, also gültig sein. Das Zeichen wird in einem internen Schiftre-
  3823. gister empfangen. Erst wenn dies voll ist, wird der Wert in SBUF übertragen
  3824. und RI gesetzt. Das Stopbit wird in RB8 eingetragen.
  3825.  
  3826.  
  3827.  
  3828. Einzelheiten Mode 1:
  3829. --------------------
  3830. Das  Senden  beginnt mit der ersten Überlauf des Taktgenerators nachdem ein
  3831. Zeichen in SBUf geschrieben wurde. Zuerst wird als Startbit ein 0 gesendet,
  3832. dann folgen die 8 Bits des Zeichens (LSB zuerst).  Als letztes wird eine  1
  3833. als Stopbit gesendet. Erst dann wird TI = 1.
  3834.  
  3835. Der  Empfang  beginnt mit der ersten negativen Flanke an RxD.  Das Startbit
  3836. wird im Zustand 7, 8 und 9 des Schiebetakt-Zählers abgetastet. Es muß immer
  3837. 0 sein (zur Datensicherheit, um Störungen auszublenden). Ist dies nicht der
  3838. Fall, oder ist nicht REN = 1, so wird der Empfang abgebrochen und die Logik
  3839. geht wieder in den Grundzustand (warten auf negative Flanke).
  3840.  
  3841. Nach Erkennen des Startbits und REN = =1,  werden die ankommenden Bits  ins
  3842. Receive-Shift  Register geschoben.  Zu diesem Zeitpunkt können in SBUF noch
  3843. alte Daten stehen, RI braucht noch nicht 0 zu sein. Der Empfang ist beendet
  3844. mit Empfang des Stopbits. Nur wenn jetzt folgende Bedingungen erfüllt sind,
  3845. wird das Zeichen in SBUF übernommen,  RI = 1 gesetzt und das Stopbit in RB8
  3846. geschrieben:
  3847.              RI = 0   und   SM2 = 0
  3848.            oder  RI = 0   und   SM2 = 1   und   Stopbit = 1.
  3849.  
  3850.  
  3851.  
  3852. Mode 1 Schiebetakt:
  3853. -------------------
  3854. Der  Schiebetakt  wird zum Senden aus einem 16 stelligen Zähler abgeleitet,
  3855. der vom Timer1-Überlauf getriggert wird.  Der Schiebetakt für  den  Empfang
  3856. wird  aus einem DPLL abgeleitet,  das ebenfalls vom Timer1-Überlauf getrig-
  3857. gert wird.  Wird das Bit SMOD in PCON gelöscht (SMOD  =  0),  so  wird  der
  3858. Timer1-Übertrag  zuvor  zusätzlich durch 2 geteilt.  Der Schiebetakt ergibt
  3859. sich nach folgender Formel :
  3860.  
  3861.        Oszi       1         SMOD + 1    1        Oszi * (SMOD + 1)
  3862. BaudRate = ──── * ────────── *  ──────── * ────   =  ──────────────────
  3863.         12    100h - TH1        2       16       384 * (100h - TH1)
  3864.  
  3865.          │         │            │        └─── 16 Bit-Zähler / DPLL
  3866.          │         │            └─────────── Vorteiler durch 2
  3867.          │         └─────────────────────── Zählwert Timer 1
  3868.          └──────────────────────────────── Trigger für Timer je Zyklus
  3869.  
  3870. 6.3 serielle Schnittstelle                                   Seite 66
  3871. ───────────────────────────────────────────────────────────────────────────
  3872.  
  3873. Beim 8052 kann alternativ der Timer2-Überlauf gewählt werden um den  Schie-
  3874. betaktzähler und/oder das DPLL zu triggern.  Soll zum Senden Timer2 verwen-
  3875. det werden ist Bit TCLK in T2CON zu setzen (siehe  8052  Timer).  Soll  zum
  3876. Empfang  Timer2 verwendet werden,  ist Bit RCLK in T2CON zu setzen.  Sender
  3877. und Empfänger können so mit verschiedene Baudraten laufen (einer mit Timer1
  3878. und der andere mit Timer2), sie können aber auch gleich sein: beide aus Ti-
  3879. mer1 oder beide aus Timer2.
  3880.  
  3881.  
  3882.  
  3883.  
  3884.  
  3885. Mode 2:  Asynchron-Mode mit fester Baud Rate als 9 Bit UART:
  3886. ------------------------------------------------------------
  3887. SM0:SM1 = 10
  3888.  
  3889. Es wird kein Takt übertragen, sondern nur die Daten. Gesendet wird über TxD
  3890. mit 1 Startbit, den 8 Datenbits (LSB zuerst) das Bit aus TB8 und 1 Stopbit.
  3891. Wenn SBUF (transmit) wieder leer ist, wird TI gesetzt.
  3892.  
  3893. Empfangen wird über RxD. Der Takt wird im Empfänger aus den Flanken der Da-
  3894. ten zurückgewonnen.  Damit Zeichen empfangen werden können muß REN = 1  und
  3895. RI = 0 sein (Receive enable). Ist SM2 = 1, so muß zusätzlich das empfangene
  3896. 9th Bit = 1 sein. Das Zeichen wird in einem internen Schiftregister empfan-
  3897. gen.  Erst wenn dies voll ist,  wird der Wert in SBUF übertragen und RI ge-
  3898. setzt. Das Stopbit wird in RB8 eingetragen.
  3899.  
  3900.  
  3901.  
  3902. Einzelheiten Mode 2:
  3903. --------------------
  3904. Das Senden beginnt mit der ersten Überlauf des Taktgenerators  nachdem  ein
  3905. Zeichen in SBUf geschrieben wurde. Zuerst wird als Startbit ein 0 gesendet,
  3906. dann  folgen die 8 Bits des Zeichens (LSB zuerst).  Danach wird das Bit aus
  3907. TB8 gesendet und schließlich eine 1 als Stopbit. Erst dann wird TI = 1.
  3908.  
  3909. Der Empfang beginnt mit der ersten negativen Flanke an  RxD.  Das  Startbit
  3910. wird im Zustand 7, 8 und 9 des Schiebetakt-Zählers abgetastet. Es muß immer
  3911. 0 sein (zur Datensicherheit, um Störungen auszublenden). Ist dies nicht der
  3912. Fall, oder ist nicht REN = 1, so wird der Empfang abgebrochen und die Logik
  3913. geht wieder in den Grundzustand (warten auf negative Flanke).
  3914.  
  3915. Nach  Erkennen des Startbits und REN = =1,  werden die ankommenden Bits ins
  3916. Receive-Shift Register geschoben.  Zu diesem Zeitpunkt können in SBUF  noch
  3917. alte Daten stehen, RI braucht noch nicht 0 zu sein. Der Empfang ist beendet
  3918. mit Empfang des Stopbits. Nur wenn jetzt folgende Bedingungen erfüllt sind,
  3919. wird das Zeichen in SBUF übernommen,  RI = 1 gesetzt und das 9th Bit in RB8
  3920. geschrieben:
  3921.              RI = 0   und   SM2 = 0
  3922.            oder  RI = 0   und   SM2 = 1   und   9th Bit = 1.
  3923.  
  3924.  
  3925. 6.3 serielle Schnittstelle                                   Seite 67
  3926. ───────────────────────────────────────────────────────────────────────────
  3927.  
  3928. Mode 2 Schiebetakt:
  3929. -------------------
  3930. Der Schiebetakt wird zum Senden/Empfang aus einem 16 stelligen Zähler / dem
  3931. DPLL abgeleitet, der/das vom Systemtakt (= ½ Oszillatortakt,  max 6 MHz bei
  3932. 12  MHz  Quarz)  getriggert  wird.  Wird  das  Bit  SMOD  in  PCON gelöscht
  3933. (SMOD = 0),  so wird der Timer1-Übertrag zuvor zusätzlich durch 2  geteilt.
  3934. Der Schiebetakt ergibt sich nach folgender Formel:
  3935.  
  3936.        Oszi    SMOD + 1    1           Oszi * (SMOD + 1)
  3937. BaudRate = ──── *  ──────── * ────    =    ──────────────────
  3938.         2         2        16                 64
  3939.  
  3940.         │         │         └─── 16 Bit-Zähler / DPLL
  3941.         │         └──────────── Vorteiler durch 2
  3942.         └───────────────────── System-Takt
  3943.  
  3944.  
  3945.  
  3946.  
  3947.  
  3948. Mode 3:  Asynchron-Mode mit variabler Baud Rate als 9 Bit UART:
  3949. ---------------------------------------------------------------
  3950. SM0:SM1 = 11
  3951.  
  3952. Die Übertragung erfolgt wie in Mode 2, jedoch wird der Schiebetakt gebildet
  3953. wie in Mode 1.
  3954.  
  3955.  
  3956.  
  3957.  
  3958. In Mode 2 und 3 kann mit Hilfe von RB8,  TB8 und SM2 ein Feldbussystem auf-
  3959. gebaut werden. Es können mehrere 8051-Rechner an einer Busleitung betrieben
  3960. werden. Ein geeignetes Protokoll (z.B. Master-Slave) ist erforderlich.  Ein
  3961. Teilnehmer, des sein SM2 = 0 gesetzt hat, empfängt alle über den Bus gesen-
  3962. deten Zeichen.  Ein Teilnehmer,  der sein SM2 = 1 gesetzt hat, empfängt nur
  3963. solche Zeichen die mit TB8 = 1 gesendet wurden.  So können zwei  Teilnehmer
  3964. miteinander kommunizieren, ohne die anderen zu stören.
  3965.  
  3966.  
  3967.  
  3968.  
  3969.  
  3970. 6.3.3  Interrupt Mode oder Polled Mode:
  3971. ---------------------------------------
  3972.  
  3973. Beim Senden über die serielle Schnittstelle darf erst dann das nächste Zei-
  3974. chen in SBUF geschrieben werden,  wenn das alte Zeichen draußen ist. Sobald
  3975. SBUF (transmit) leer ist, setzt dazu die Hardware das TI-Flag. Der Anwender
  3976. darf erst dann das nächste Zeichen in SBUF schreibt, wenn TI = 1 ist.
  3977.  
  3978. Sobald über die serielle Schnittstelle ein Zeichen empfangen  wurde,  setzt
  3979. die Hardware das RI-Flag.  Nur wenn RI = 1 ist,  steht ein gültiges Zeichen
  3980. in SBUF (receive).
  3981.  
  3982. Die Hardware setzt nur RI und TI,  löscht sie aber nicht.  Nach einem Reset
  3983. sind jedoch RI, TI wie auch REN gelöscht (SCON = 0).
  3984.  
  3985. 6.3 serielle Schnittstelle                                   Seite 68
  3986. ───────────────────────────────────────────────────────────────────────────
  3987.  
  3988. Polled Mode:
  3989. ------------
  3990.  
  3991. Damit die serielle Schnittstelle korrekt funktioniert, ist von der Software
  3992. folgendes zu beachten:
  3993.  
  3994.       - nur in SBUF schreiben, wenn TI = 1 ist.
  3995.       - nachdem in SBUF geschrieben wurde TI löschen.
  3996.       - vor dem Lesen von SBUF RI prüfen.
  3997.       - nach dem Auslesen von SBUF RI löschen.
  3998.  
  3999. Wird  so  vorgegangen,  stellt sich folgendes Problem: Nach einem Reset ist
  4000. TI = 0 obwohl SBUF (transmit) leer ist.  Es wird von der Hardware  nie  ge-
  4001. setzt,  da  nicht gesendet wird,  als nie der Zustand Senden-Ende auftritt.
  4002. Das erste zu sendende Zeichen darf also in SBUF geschrieben werden,  obwohl
  4003. TI = 0 ist. Eleganter wird gleich nach einem Reset TI = 1 gesetzt.
  4004.  
  4005.  
  4006. Beispiel für serielle Übertragung im Polled Mode:
  4007. -------------------------------------------------
  4008.  
  4009. iniSCON:
  4010.      CLR   ES              ; seriellen Interrupt löschen
  4011.      CLR   ET1             ; Timer 1 Interrupt löschen
  4012.      MOV   TH1, #-3        ; Vorladewert für Timer 1 = -3
  4013.      MOV   TL1, TH1
  4014.      SETB  TR1             ; Timer 1 starten
  4015.      ANL   PCON, #7Fh      ; SMOD = 0
  4016.      MOV   SCON, #52h      ; Mode 1, SM2=0,TB8=0,RB8=0, TI=1, REN=1,RI=0
  4017.      RET
  4018.  
  4019. sendeChar:
  4020.      JNB  TI, sendeChar    ; warte bis SBUF (transmit) leer ist
  4021.      MOV  SBUF, A
  4022.      CLR  TI
  4023.      RET
  4024.  
  4025. empfangeChar:
  4026.      JNB  RI, empfangeChar
  4027.      MOV  A, SBUF
  4028.      CLR RI
  4029.      RET
  4030.  
  4031. nach einem Reset wird die serielle Schnittstelle wie oben initialisiert für
  4032. 8  Bit UART mit 9600 Baud (mit 11,059 MHz Quarz). Der Receiver wird enabled
  4033. und TI=1 gesetzt.
  4034.  
  4035. Beim Senden wird jedesmal gewartet,  bis SBUF leer ist.  Dann wird das beim
  4036. Unterprogrammaufruf im Akku übergebene Zeichen in SBUF geschrieben.  TI muß
  4037. von der Software gelöscht werden.
  4038.  
  4039. Beim Empfang wird hier auch gewartet,  bis ein Zeichen empfangen wurde. Hat
  4040. die CPU nichts weiteres zu tun,  ist das ok.  Denn das Programm bleibt hier
  4041. hängen, wenn keine Zeichen empfangen werden.
  4042.  
  4043.  
  4044. 6.3 serielle Schnittstelle                                   Seite 69
  4045. ───────────────────────────────────────────────────────────────────────────
  4046.  
  4047. Interrupt Mode:
  4048. ---------------
  4049.  
  4050. Bei  umfangreicheren Programmen,  kann oft nur zu bestimmten Zeiten der se-
  4051. rielle Empfänger gepolled werden,  falls von der CPU noch  andere  Routinen
  4052. bearbeitet werden müssen. Wird nicht genügend oft gepolled, so können Daten
  4053. verloren  gehen.  Manchmal ist es auch nicht zulässig,  zu warten,  bis ein
  4054. Zeichen gesendet werden kann. Als Lösung kann die serielle Schnittstelle im
  4055. Interrupt-Mode betrieben werden.
  4056.  
  4057. Von der Hardware wird bei gesetzten RI- oder TI-Flag  ein  Interrupt  gene-
  4058. riert.  Dazu muß der Interrupt enabled sein (Bit ES = 1). Beim Einsprung in
  4059. die Interrupt-Routine (bei CODE 0023h) werden RI und TI nicht von der Hard-
  4060. ware gelöscht. Sie sind innerhalb der Interrupt-Routine von der Software zu
  4061. löschen, sonst wird nach dem RETI die Interrupt-Routine gleich wieder ange-
  4062. sprungen.
  4063.  
  4064. Im Normalzustand ist der Sendebuffer leer.  Wird mit Interrupts gearbeitet,
  4065. darf  jedoch TI nicht stehen gelassen werden.  Als Kennung für Sende-Buffer
  4066. leer muß ein extra Flag definiert werden.
  4067.  
  4068.  
  4069. Beispiel für serielle Übertragung im Interrupt Mode:
  4070. ----------------------------------------------------
  4071.  
  4072. TxEmpty BIT 0                ; als Beispiel wird die Schnittstelle
  4073.                  ; in asynchron Mode (Mode 2) betrieben.
  4074. iniSCON:                     ; Der Empfang erfolgt über Interrupt.
  4075.      SETB  TxEmpty           ; Senden im Polled Mode. (TxEmpty-Flag)
  4076.      ORL   PCON, #80h        ; SMOD = 1, damit 375 kBit/s bei 12 MHz Quarz
  4077.      MOV   SCON, #98h        ; SM2=0, REN=1 und RI=0 enablen für Receive
  4078.      SETB  ES                ; TI wird gelöscht, dafür wird das Flag
  4079.      SETB  EA                ; TxEmpty gesetzt.
  4080.      RET                     ; Die Interrupt-Routine liest das Zeichen
  4081.                  ; aus SBUF und trägt es in einen Ringbuffer
  4082. CSEG AT 0023h                ; ein, von wo es vom Hauptprogramm abgeholt
  4083.      JNB  RI, chkTxInt       ; wird. Es könnte an dieser Stelle auch eine
  4084.      PUSH PSW                ; Befehlsdispatcher-Routine oder ähnliches
  4085.      PUSH ACC                ; angesprungen werden. Ein Beispiel für eine
  4086.      MOV  A, R0              ; Zeicheneintrags-Routine (Ringbuffer) steht
  4087.      PUSH ACC                ; in Kapitel 5.4.
  4088.      MOV  A, SBUF            ; Die Interrupt-Routine muß auf jeden Fall
  4089.      CLR  RI                 ; die verwendeten Register und die Flags
  4090.      CALL putCharToBuf       ; sichern (hier ACC, R0 und PSW).
  4091.      POP  ACC                ; Ist TI gesetzt, wird TxEmpty gesetzt. TI
  4092.      MOV  R0, A              ; wird dafür gelöscht. Die Sende-Routine
  4093.      POP  ACC                ; polled TxEmpty anstelle TI.
  4094.      POP  PSW                ; Achtung: Vorsicht ist geboten, wenn die
  4095. chkTxInt:                    ; Sende-Routine Teil einer Interrupt-Routine
  4096.      JNB  TI, sintRet        ; ist. Dann sind beide TI und TxEmpty zu
  4097.      SETB TxEmpty            ; pollen, da kein Interrupt durchkommt und
  4098.      CLR  TI                 ; so TxEmpty nicht gesetzt würde.
  4099. sintRet:
  4100.      RETI
  4101.  
  4102. 6.3 serielle Schnittstelle                                   Seite 70
  4103. ───────────────────────────────────────────────────────────────────────────
  4104.  
  4105. 6.3.4  Baud-Rate Tabelle:
  4106. -------------------------
  4107.  
  4108. Diese Tabellen enthalten die Einstellwerte zur Erzielung  einer  bestimmten
  4109. Baud-Rate. Gleichungen siehe Kapitel 6.3.2
  4110.  
  4111.  
  4112. Quarz: SM0:SM1 SMOD  TH1    BaudRate
  4113. -------------------------------------        Mit einem 12 MHz Quarz lassen
  4114. 12 MHz   00   X      X       1 MBit/s        sich die meißten der üblichen
  4115. 12 MHz   10   1      X     375 kBit/s        Baud-Raten nicht exakt ein-
  4116. 12 MHz   10   0      X   187.5 kBit/s        stellen.
  4117. 12 MHz   01   1     -1   62 500 Bit/s
  4118. 12 MHz   01   1     -3   20 800 Bit/s        Da das DPLL jedoch maximal
  4119. 12 MHz   01   1     -7    8 929 Bit/s        über 10 Bitzellen die Phasen-
  4120. 12 MHz   01   1    -14    4 808 Bit/s        lage halten muß reicht die
  4121. 12 MHz   01   1    -26    2 404 Bit/s        Genauigkeit für Baudraten
  4122. 12 MHz   01   1    -52    1 202 Bit/s        bis 4800 Baud sicher aus.
  4123. 12 MHz   01   1   -104      601 Bit/s
  4124. 12 MHz   01   1   -208      300 Bit/s
  4125. 12 MHz   01   0   -208      150 Bit/s        BR in Mode 01 und 11 gleich
  4126.  
  4127.  
  4128. Quarz:     SM0:SM1 SMOD  TH1    BaudRate
  4129. -----------------------------------------     Mit einem speziellen Quarz
  4130. 11.0592 MHz   01   1     -1   57 600 Bit/s    lassen sich BaudRaten bis
  4131. 11.0592 MHz   01   1     -3   19 200 Bit/s    19200 Baud exakt einstellen.
  4132. 11.0592 MHz   01   1     -6    9 600 Bit/s    Jedoch arbeitet die CPU nun
  4133. 11.0592 MHz   01   1    -12    4 800 Bit/s    nicht mit der maximalen
  4134. 11.0592 MHz   01   1    -24    2 400 Bit/s    Frequenz und die Zeitbasis
  4135. 11.0592 MHz   01   1    -48    1 200 Bit/s    von sonst 1 µs für einen
  4136. 11.0592 MHz   01   1    -96      600 Bit/s    Zyklus geht verloren.
  4137. 11.0592 MHz   01   1   -192      300 Bit/s
  4138. 11.0592 MHz   01   0   -192      150 Bit/s
  4139.  
  4140.  
  4141. Niederere BaudRaten als 150 Bit/s lassen sich so (mit diesen Quarzen) nicht
  4142. erzielen.  Es  bleibt  die  Möglichkeit  an  T1 einen Takt einzuspeisen und
  4143. Timer 1 als Counter zu betreiben. Dabei ergibt sich folgende BaudRate:
  4144.  
  4145.           Count * (SMOD + 1)
  4146. BaudRate =   ───────────────────
  4147.           32 * (100h - TH1)
  4148.  
  4149.  
  4150. Eine weitere Möglichkeit zur Erzielung niederer  BaudRaten  besteht  darin,
  4151. Timer  1  als  16  Bit  Timer  zu  betreiben.  Es  wird  dazu  eine Timer 1
  4152. Interrupt-Routine installiert, die einen 16 Bit Nachladewert in TH1:TL1
  4153. schreibt.
  4154.  
  4155.  
  4156.  
  4157. Beim 8052 lassen sich Baudraten exakter mit Timer 2 einstellen (siehe Kapi-
  4158. tel 7.1).
  4159.  
  4160.  
  4161. 7.1 der 8052                                                 Seite 71
  4162. ───────────────────────────────────────────────────────────────────────────
  4163.  
  4164. 7.  weitere Controller der 8051-Familie:
  4165. ----------------------------------------
  4166.  
  4167. 7.1  der 8052:
  4168. --------------
  4169.  
  4170. Gegenüber dem 8051 besitzt der 8052 ein größeres internes RAM, ein größeres
  4171. internes ROM und einen weiteren Timer, sonst ist er identisch mit dem 8051.
  4172.  
  4173. internes RAM 8051:    128 Byte    00....7Fh
  4174. internes RAM 8052:    256 Byte    00...0FFh
  4175.  
  4176. internes ROM 8051:    4 kByte    0000...0FFFh      ; 8031 und 8032 besitzen
  4177. internes ROM 8052:    8 kByte    0000...1FFFh      ; kein internes ROM
  4178.                            ; 8751 und 8752 besitzen
  4179.                            ; ein internes EPROM
  4180.  
  4181.  
  4182. internes RAM:
  4183. -------------
  4184.  
  4185. Bei einem Stacküberlauf (SP über 0FFh),  Wird der  SP  weiterhin  incremen-
  4186. tiert.  Dabei  zeigt er auf die intern RAM-Adressen ab 00.  Der Stack über-
  4187. schriebe somit den Registerbereich. Es ist also Sorge dafür zu tragen,  daß
  4188. kein Stacküberlauf stattfindet.
  4189.  
  4190. Die  intern  RAM-Adressen  80h...FFh können nicht direkt adressiert werden.
  4191. Auf diesen Bereich kann nur indirekt zugegriffen werden (MOV @Ri, ..).
  4192.  
  4193. (vergleiche auch Kapitel 3.9)
  4194.  
  4195.  
  4196.  
  4197.  
  4198. 7.1.2  zusätzliche SFR des 8052:
  4199. --------------------------------
  4200.  
  4201. Zur Steuerung des Timer2 sind beim 8052 einige zusätzliche SFR vorhanden:
  4202.  
  4203.      T2CON    DATA  0C8h
  4204.      RCAP2L   DATA  0CAh
  4205.      RCAP2H   DATA  0CBh
  4206.      TL2      DATA  0CCh
  4207.      TH2      DATA  0CDh
  4208.  
  4209.  
  4210.  
  4211.  
  4212. 7.1.3  Timer 2:
  4213. ---------------
  4214.  
  4215. Timer2 ist ein 16 stelliger Zähler.  Sein Zählregister  wird  gebildet  aus
  4216. TH2:TL2  (Timer2  High- und Timer2 Low-Byte).  T2CON (Timer2 Control) dient
  4217. zur Steuerung des Timers/Zählers.
  4218.  
  4219.  
  4220. 7.1 der 8052                                                 Seite 72
  4221. ───────────────────────────────────────────────────────────────────────────
  4222.  
  4223. Bei einem Zählerüberlauf kann ein  Interrupt  generiert  werden.  Die  Ein-
  4224. sprungadresse  ist  002Bh.  Dazu sind folgende Bits im Interrupt-Enable und
  4225. Interrupt-Priority Register definiert:
  4226.  
  4227.      ET2     BIT  0ADh
  4228.      PT2     BIT  0BDh
  4229.      Timer2  CODE 002Bh
  4230.  
  4231.  
  4232.  
  4233. Timer2 läuft als 16 Bit Zähler/Timer  wahlweise  mit  Reload  oder  Capture
  4234. Funktionen. Dazu besitzt Timer2 neben dem 16 Bit Zählregister (TH2:TL2) ein
  4235. Capture/Reload Register (RCAP2H:RCAP2L).
  4236.  
  4237. Im  Reload  Mode wird bei einem Überlauf oder bei einem externen Trigger an
  4238. Port1-Eingangspin T2EX der Wert aus RCAP2 in das Zählregister geladen.
  4239.  
  4240. Im Capture Mode wird bei einem externen Trigger der Wert aus dem  Zählregi-
  4241. ster in RCAP2 geladen.
  4242.  
  4243.  
  4244.  
  4245. Wird Timer2 als Timer betrieben,  so wird TH2:TL2 je CPU-Zyklus um 1 incre-
  4246. mentiert (Ausnahme bei Baud-Rate Generator siehe RCLK, TCLK).  Beim Betrieb
  4247. als  Counter  wird  er je negative Flanke an Port1-Eingangspin T2 incremen-
  4248. tiert.
  4249.  
  4250.  
  4251.      T2EX  BIT  091h                 ; = P1.1
  4252.      T2    BIT  090h                 ; = P1.0
  4253.  
  4254.  
  4255.  
  4256.  
  4257.  ┌─────┬──────┬──────┬──────┬───────┬─────┬──────┬────────┐
  4258.  │ TF2 │ EXF2 │ RCLK │ TCLK │ EXEN2 │ TR2 │ C_T2 │ CP_RL2 │ T2CON DATA 0C8h
  4259.  └─────┴──────┴──────┴──────┴───────┴─────┴──────┴────────┘
  4260.  
  4261.  
  4262. CP_RL2 BIT 0C8h    -->  Mit CP_RL2 = 1 wird Capture Mode gewählt, sonst Re-
  4263. load Mode. Reload Mode wird auch gewählt, wenn Timer2 als Baud-Rate Genera-
  4264. tor für die serielle Schnittstelle verwendet wird. (siehe acuh EXEN2,  RCLK
  4265. und TCLK).
  4266.  
  4267. C_T2 BIT 0C9h   -->  Mit C_T2 = 1 wird Timer2 als Counter betrieben,  sonst
  4268. als Timer.
  4269.  
  4270. TR2 BIT 0CAh   -->  Timer2 Run Flag
  4271.  
  4272. EXEN2 BIT 0CBh   -->  Der externe Trigger Eingangspin T2EX ist  nur  aktiv,
  4273. mit  EXEN2  =  1.  Nur  dann erfolgt bei einer negativen Flanke an T2EX ein
  4274. Übertrag in RCAP2 (im Capture Mode) bzw. eine Reload (in Reload Mode).
  4275.  
  4276. TCLK BIT 0CCh   -->  Ist TCLK gesetzt,  dient der Timer2-Überlauf als Trig-
  4277. ger für den Baud-Rate Generator der seriellen Schnittstelle beim Sende.
  4278.  
  4279. 7.1 der 8052                                                 Seite 73
  4280. ───────────────────────────────────────────────────────────────────────────
  4281.  
  4282. RCLK BIT 0CDh   -->  Ist RCLK gesetzt,  dient der Timer2-Überlauf als Trig-
  4283. ger für den Baud-Rate Generator (DPLL)  der  seriellen  Schnittstelle  beim
  4284. Empfang.
  4285.  
  4286. EXF2 BIT 0CEh   -->  Extern Trigger Interrupt Flag. EXF2 wird von der Hard-
  4287. ware gesetzt,  nachdem aufgrund einer negativen Flanke an T2EX ein Übertrag
  4288. erfolgte (also nur,  wenn EXEN2 = 1).  EXF2 muß von der  Software  gelöscht
  4289. werden.
  4290.  
  4291. TF2 BIT 0CFh   -->  Timer2 Überlauf Interrupt Flag.  TF2 wird von der Hard-
  4292. ware gesetzt,  nachdem ein Überlauf von 0FFFFh nach 0000 in TH2:TL2 erfolg-
  4293. te. TF2 muß von der Software gelöscht werden.
  4294.  
  4295.  
  4296.  
  4297. Timer2 Interrupt:
  4298. -----------------
  4299.  
  4300. Durch den Timer2 wird ein Interrupt ausgelöst,  wenn TF2 oder EXF2 gesetzte
  4301. sind. Es genügt,  das nur eines von beiden gesetzt ist.  Die CPU rettet die
  4302. Return-Adresse  auf den Stack und springt CODE 002Bh an.  Beim Einsprung in
  4303. die Interrupt-Routine bleiben TF2 und EXF2 erhalten,  denn nur so  kann  in
  4304. der  Interrupt-Routine  festgestellt  werden,  welche Ursache der Interrupt
  4305. hat:
  4306.       TF2    -->  Timer2 Überlauf
  4307.    oder   EXT2   -->  externer Trigger und Übertrag
  4308.  
  4309. TF2 und EXF" müssen von der Software (in der Interrupt-Routine  )  gelöscht
  4310. werden.  Ansonsten  erfolgte  nach einem RETI ein erneuter Einsprung in die
  4311. Interrupt-Routine.
  4312.  
  4313. TF2 und/oder EXF2 könnten auch per Software gelöscht oder  gesetzt  werden.
  4314. Wird  eines:  EXF2 oder TF2 nicht benutzt,  so kann dies zum Erzeugen eines
  4315. Software-Interrupts mißbraucht werden.
  4316.  
  4317.  
  4318.  
  4319. 7.1.4  serielle Schnittstelle mit Timer2:
  4320. -----------------------------------------
  4321.  
  4322. Ist eines von TCLK und RCLK gesetzt,  so wird Timer2 als Trigger für minde-
  4323. stens  einen der Baud-Rate Generatoren (Senden oder Empfang oder beide) der
  4324. seriellen Schnittstelle verwendet.  Timer2 läuft dann im Reload Mode (unab-
  4325. hängig  von CP_RL2).  Timer2 wird in dieser Betriebsart nicht je CPU-Zyklus
  4326. einmal incrementiert,  sondern je System Takt (Quarztakt /  2)  einmal.  Er
  4327. läuft also schneller.
  4328.  
  4329.  
  4330. Voraussetzung  für  die  Erzeugung  des seriellen Schiebetaktes mit Timer 2
  4331. ist,  daß die serielle Schnittstelle in Mode 1 (SM0:SM1 = 01) oder  Mode  3
  4332. (SM0:SM1  =  11) betrieben wird.  Default wird dann der Timer1-Überlauf zum
  4333. Triggern des Baud-Rate Generators verwendet.  Ist TCLK  oder/und  RCLK  ge-
  4334. setzt, wird zum Senden bzw. Empfang der Timer2-Überlauf verwendet.
  4335.  
  4336.    TCLK = 0  RCLK = 0   -->  Timer1 für Senden und Empfang
  4337.    TCLK = 0  RCLK = 1   -->  Timer1 zum Senden und Timer2 zum Empfang
  4338.    TCLK = 1  RCLK = 0   -->  Timer2 zum Senden und Timer1 zum Empfang
  4339.    TCLK = 1  RCLK = 1   -->  Timer2 zum Senden und Empfang.
  4340.  
  4341. 7.1 der 8052                                                 Seite 74
  4342. ───────────────────────────────────────────────────────────────────────────
  4343.  
  4344. Mit Verwendung von Timer2 ergibt sich folgende Baud-Rate:
  4345.  
  4346.  
  4347.        Oszi          1          1
  4348. BaudRate = ──── * ────────────── * ────             ; RCAP2 = RCAP2H:RCAP2L
  4349.         2     10000h - RCAP2    16
  4350.  
  4351.          │           │           └─ 16 Bit-Zähler / DPLL
  4352.          │           └─────────────── Zählwert Timer 2
  4353.          └───────────────────────────── Trigger für Timer je SystemTakt
  4354.  
  4355.  
  4356.  
  4357. Baud-Rate Tabelle:
  4358. ------------------
  4359.  
  4360. Diese  Tabelle  enthält  die  Einstellwerte  zur Erzielung einer bestimmten
  4361. Baud-Rate. Vergleiche auch Kapitel 6.3.4. Hier SM0:SM1 = 01 oder 11.
  4362.  
  4363.  
  4364. Quarz:   RCAP2     BaudRate
  4365. ------------------------------
  4366. 12 MHz      -1   375    kBit/s      Mit einem 12 MHz Quarz lassen sich
  4367. 12 MHz      -2   187,5  kBit/s      auch hier nicht alle üblichen Baud-
  4368. 12 MHz      -3   125    kBit/s      Raten exakt einstellen
  4369. 12 MHz        -4    93750  Bit/s
  4370. 12 MHz      -5    75000  Bit/s
  4371. 12 MHz      -6    62500  Bit/s         11,0592 MHz     -3   115200  Bit/s
  4372. 12 MHz      -7    53571  Bit/s       11,0592 MHz     -6    57600  Bit/s
  4373. 12 MHz      -9    41667  Bit/s
  4374. 12 MHz     -10    37500  Bit/s       11,0592 MHz     -9    38400  Bit/s
  4375. 12 MHz     -20    18750  Bit/s       11,0592 MHz    -18    19200  Bit/s
  4376. 12 MHz     -39     9615  Bit/s       11,0592 MHz    -36     9600  Bit/s
  4377. 12 MHz     -78     4808  Bit/s       11,0592 MHz    -72     4800  Bit/s
  4378. 12 MHz    -156     2404  Bit/s       11,0592 MHz   -144     2400  Bit/s
  4379. 12 MHz    -312     1202  Bit/s       11,0592 MHz   -288     1200  Bit/s
  4380. 12 MHz    -625      600  Bit/s
  4381. 12 MHz   -1250      300  Bit/s
  4382. 12 MHz   -2500      150  Bit/s
  4383. 12 MHz   -3409      110  Bit/s
  4384. 12 MHz   -5000       75  Bit/s
  4385.  
  4386.  
  4387. Einstellbar bei PC: 
  4388.  
  4389. 115200, 57600, 38400, 28800, 23040, 19200, 16457, 
  4390.  
  4391.  
  4392. Bei einem Assembler kann eine negative Zahl angegeben werden.  Es kann aber
  4393. auch umgerechnet werden:   -1 = 0FFFFh, -2 = 0FFFEh ....
  4394.  
  4395. Beispiel für 1200 Baud mit Timer2:
  4396.  
  4397.      CLR   ES                     ; seriellen Interrupt löschen
  4398.      CLR   ET2                    ; Timer 2 Interrupt löschen
  4399.      MOV   RCAP2H, #HIGH(-312)    ; Vorladewert für Timer 2
  4400.      MOV   RCAP2L, #LOW(-312)
  4401.      MOV   TH2, RCAP2H
  4402.      MOV   TL2, RCAP2L
  4403.      MOV   T2CON, #00110100b      ; RCLK, TCLK, TR2
  4404.      MOV   SCON, #52h      ; Mode 1, SM2=0,TB8=0,RB8=0, TI=1, REN=1,RI=0
  4405.  
  4406.  
  4407. A.1 ASCII-Tabelle                                            Seite 75
  4408. ───────────────────────────────────────────────────────────────────────────
  4409.  
  4410. A.1  ASCII-Tabelle:
  4411. -------------------
  4412.  
  4413.  
  4414. Die  folgende Seite zeigt die Zuordnung von Zeichen zu Zahlenwerten (ASCII-
  4415. Tabele):
  4416.  
  4417. Die Zeichen unter 20h (Leerzeichen) sind  im  allgemeinen  nicht  druckbar,
  4418. auch  werden  sie  von  einigen Editoren und Textbearbeitungssystemen nicht
  4419. dargestellt.  Sie dienen dort wie auch bei  der  Datenübertragung  oft  als
  4420. Steuerzeichen. Die wichtigsten:
  4421.  
  4422.      BEL = Klingelzeichen (bell)
  4423.      BS  = rückwärts löschen (Back Space)
  4424.      HT  = horizontal TAB
  4425.      VT  = vertikal Tab
  4426.      CR  = an Zeilenanfang (Carriage Return)
  4427.      LF  = Zeilenvorschub (Line Feed)
  4428.      FF  = neue Seite (Form Feed)
  4429.  
  4430.  
  4431.  
  4432. Den  Zeichen unter 20h ist zwar auch ein grafisches Zeichen zugeordnet,  in
  4433. dieser Tabelle wurde aber nicht das Zeichen dargestellt, sondern die Bedeu-
  4434. tung für die Datenübertragung angegeben (denn auf vielen Editoren würde  es
  4435. ohnehin Probleme geben die Darstellung zu betrachten).
  4436.  
  4437.  
  4438. A.1 ASCII-Tabelle                                            Seite 76
  4439. ───────────────────────────────────────────────────────────────────────────
  4440.  
  4441. NUL  0  00      BEL  7  07      SO  14  0E      NAK 21  15      FS  28  1C
  4442. SOH  1  01      BS   8  08      SI  15  0F      SYN 22  16      GS  29  1D
  4443. STX  2  02      HT   9  09      DLE 16  10      ETB 23  17      RS  30  1E
  4444. ETX  3  03      LF  10  0A      DC1 17  11      CAN 24  18      US  31  1F
  4445. EOT  4  04      VT  11  0B      DC2 18  12      EM  25  19
  4446. ENQ  5  05      FF  12  0C      DC3 19  13      SUB 26  1A
  4447. ACK  6  06      CR  13  0D      DC4 20  14      ESC 27  1B
  4448.  
  4449.     32  20      0   48  30      @   64  40      P   80  50      `   96  60
  4450. !   33  21      1   49  31      A   65  41      Q   81  51      a   97  61
  4451. "   34  22      2   50  32      B   66  42      R   82  52      b   98  62
  4452. #   35  23      3   51  33      C   67  43      S   83  53      c   99  63
  4453. $   36  24      4   52  34      D   68  44      T   84  54      d  100  64
  4454. %   37  25      5   53  35      E   69  45      U   85  55      e  101  65
  4455. &   38  26      6   54  36      F   70  46      V   86  56      f  102  66
  4456. '   39  27      7   55  37      G   71  47      W   87  57      g  103  67
  4457. (   40  28      8   56  38      H   72  48      X   88  58      h  104  68
  4458. )   41  29      9   57  39      I   73  49      Y   89  59      i  105  69
  4459. *   42  2A      :   58  3A      J   74  4A      Z   90  5A      j  106  6A
  4460. +   43  2B      ;   59  3B      K   75  4B      [   91  5B      k  107  6B
  4461. ,   44  2C      <   60  3C      L   76  4C      \   92  5C      l  108  6C
  4462. -   45  2D      =   61  3D      M   77  4D      ]   93  5D      m  109  6D
  4463. .   46  2E      >   62  3E      N   78  4E      ^   94  5E      n  110  6E
  4464. /   47  2F      ?   63  3F      O   79  4F      _   95  5F      o  111  6F
  4465.  
  4466. p  112  70      Ç  128  80      É  144  90      á  160  A0      ░  176  B0
  4467. q  113  71      ü  129  81      æ  145  91      í  161  A1      ▒  177  B1
  4468. r  114  72      é  130  82      Æ  146  92      ó  162  A2      ▓  178  B2
  4469. s  115  73      â  131  83      ô  147  93      ú  163  A3      │  179  B3
  4470. t  116  74      ä  132  84      ö  148  94      ñ  164  A4      ┤  180  B4
  4471. u  117  75      à  133  85      ò  149  95      Ñ  165  A5      ╡  181  B5
  4472. v  118  76      å  134  86      û  150  96      ª  166  A6      ╢  182  B6
  4473. w  119  77      ç  135  87      ù  151  97      º  167  A7      ╖  183  B7
  4474. x  120  78      ê  136  88      ÿ  152  98      ¿  168  A8      ╕  184  B8
  4475. y  121  79      ë  137  89      Ö  153  99      ⌐  169  A9      ╣  185  B9
  4476. z  122  7A      è  138  8A      Ü  154  9A      ¬  170  AA      ║  186  BA
  4477. {  123  7B      ï  139  8B      ¢  155  9B      ½  171  AB      ╗  187  BB
  4478. |  124  7C      î  140  8C      £  156  9C      ¼  172  AC      ╝  188  BC
  4479. }  125  7D      ì  141  8D      ¥  157  9D      ¡  173  AD      ╜  189  BD
  4480. ~  126  7E      Ä  142  8E      ₧  158  9E      «  174  AE      ╛  190  BE
  4481.    127  7F      Å  143  8F      ƒ  159  9F      »  175  AF      ┐  191  BF
  4482.  
  4483. └  192  C0      ╨  208  D0      α  224  E0      ≡  240  F0
  4484. ┴  193  C1      ╤  209  D1      ß  225  E1      ±  241  F1   ASCII-Tabelle
  4485. ┬  194  C2      ╥  210  D2      Γ  226  E2      ≥  242  F2   -------------
  4486. ├  195  C3      ╙  211  D3      π  227  E3      ≤  243  F3   links: Zeichen
  4487. ─  196  C4      ╘  212  D4      Σ  228  E4      ⌠  244  F4   mitte: Dezimal
  4488. ┼  197  C5      ╒  213  D5      σ  229  E5      ⌡  245  F5   rechts: Hexa-
  4489. ╞  198  C6      ╓  214  D6      µ  230  E6      ÷  246  F6          dezimal
  4490. ╟  199  C7      ╫  215  D7      τ  231  E7      ≈  247  F7
  4491. ╚  200  C8      ╪  216  D8      Φ  232  E8      °  248  F8
  4492. ╔  201  C9      ┘  217  D9      Θ  233  E9      ∙  249  F9
  4493. ╩  202  CA      ┌  218  DA      Ω  234  EA      ·  250  FA
  4494. ╦  203  CB      █  219  DB      δ  235  EB      √  251  FB
  4495. ╠  204  CC      ▄  220  DC      ∞  236  EC      ⁿ  252  FC
  4496. ═  205  CD      ▌  221  DD      φ  237  ED      ²  253  FD
  4497. ╬  206  CE      ▐  222  DE      ε  238  EE      ■  254  FE
  4498. ╧  207  CF      ▀  223  DF      ∩  239  EF         255  FF
  4499.  
  4500. A.2 Befehlssatz                                              Seite 77
  4501. ───────────────────────────────────────────────────────────────────────────
  4502.  
  4503. A.2  Befehlssatz in Hexadezimaler Reihenfolge:
  4504. ----------------------------------------------
  4505.  
  4506. Code  Bytes  Zyklus   Mnemonic
  4507.  
  4508. 00   1  1  NOP                      30   3  2  JNB   bitAdr, codeAdr
  4509. 01   2  2  AJMP  codeAdr            31   2  2  ACALL codeAdr
  4510. 02   3  2  LJMP  codeAdr            32   1  2  RETI
  4511. 03   1  1  RR    A                  33   1  1  RLC   A
  4512. 04   1  1  INC   A                  34   2  1  ADDC  A, #wert
  4513. 05   2  1  INC   dataAdr            35   2  1  ADDC  A, dataAdr
  4514. 06   1  1  INC   @R0                36   1  1  ADDC  A, @R0
  4515. 07   1  1  INC   @R1                37   1  1  ADDC  A, @R1
  4516. 08   1  1  INC   R0                 38   1  1  ADDC  A, R0
  4517. 09   1  1  INC   R1                 39   1  1  ADDC  A, R1
  4518. 0A   1  1  INC   R2                 3A   1  1  ADDC  A, R2
  4519. 0B   1  1  INC   R3                 3B   1  1  ADDC  A, R3
  4520. 0C   1  1  INC   R4                 3C   1  1  ADDC  A, R4
  4521. 0D   1  1  INC   R5                 3D   1  1  ADDC  A, R5
  4522. 0E   1  1  INC   R6                 3E   1  1  ADDC  A, R6
  4523. 0F   1  1  INC   R7                 3F   1  1  ADDC  A, R7
  4524.  
  4525. 10   3  2  JBC   bitAdr, codeAdr    40   2  2  JC    codeAdr
  4526. 11   2  2  ACALL codeAdr            41   2  2  AJMP  codeAdr
  4527. 12   3  2  LCALL codeAdr            42   2  1  ORL   dataAdr, A
  4528. 13   1  1  RRC   A                  43   3  2  ORL   dataAdr, #wert
  4529. 14   1  1  DEC   A                  44   2  1  ORL   A, #wert
  4530. 15   2  1  DEC   dataAdr            45   2  1  ORL   A, dataAdr
  4531. 16   1  1  DEC   @R0                46   1  1  ORL   A, @R0
  4532. 17   1  1  DEC   @R1                47   1  1  ORL   A, @R1
  4533. 18   1  1  DEC   R0                 48   1  1  ORL   A, R0
  4534. 19   1  1  DEC   R1                 49   1  1  ORL   A, R1
  4535. 1A   1  1  DEC   R2                 4A   1  1  ORL   A, R2
  4536. 1B   1  1  DEC   R3                 4B   1  1  ORL   A, R3
  4537. 1C   1  1  DEC   R4                 4C   1  1  ORL   A, R4
  4538. 1D   1  1  DEC   R5                 4D   1  1  ORL   A, R5
  4539. 1E   1  1  DEC   R6                 4E   1  1  ORL   A, R6
  4540. 1F   1  1  DEC   R7                 4F   1  1  ORL   A, R7
  4541.  
  4542. 20   3  2  JB    bitAdr, codeAdr    50   2  2  JNC   codeAdr
  4543. 21   2  2  AJMP  codeAdr            51   2  2  ACALL codeAdr
  4544. 22   1  2  RET                      52   2  1  ANL   dataAdr, A
  4545. 23   1  1  RL    A                  53   3  2  ANL   dataAdr, #wert
  4546. 24   2  1  ADD   A, #wert           54   2  1  ANL   A, #wert
  4547. 25   2  1  ADD   A, dataAdr         55   2  1  ANL   A, dataAdr
  4548. 26   1  1  ADD   A, @R0             56   1  1  ANL   A, @R0
  4549. 27   1  1  ADD   A, @R1             57   1  1  ANL   A, @R1
  4550. 28   1  1  ADD   A, R0              58   1  1  ANL   A, R0
  4551. 29   1  1  ADD   A, R1              59   1  1  ANL   A, R1
  4552. 2A   1  1  ADD   A, R2              5A   1  1  ANL   A, R2
  4553. 2B   1  1  ADD   A, R3              5B   1  1  ANL   A, R3
  4554. 2C   1  1  ADD   A, R4              5C   1  1  ANL   A, R4
  4555. 2D   1  1  ADD   A, R5              5D   1  1  ANL   A, R5
  4556. 2E   1  1  ADD   A, R6              5E   1  1  ANL   A, R6
  4557. 2F   1  1  ADD   A, R7              5F   1  1  ANL   A, R7
  4558.  
  4559.  
  4560. A.2 Befehlssatz                                              Seite 78
  4561. ───────────────────────────────────────────────────────────────────────────
  4562.  
  4563. Code  Bytes  Zyklus   Mnemonic
  4564.  
  4565. 60   2  2  JZ    codeAdr            90   3  2  MOV   DPTR, #wert16
  4566. 61   2  2  AJMP  codeAdr            91   2  2  ACALL codeAdr
  4567. 62   2  1  XRL   dataAdr, A         92   2  2  MOV   bitAdr, C
  4568. 63   3  2  XRL   dataAdr, #wert     93   1  2  MOVC  A, @A+DPTR
  4569. 64   2  1  XRL   A, #wert           94   2  1  SUBB  A, #wert
  4570. 65   2  1  XRL   A, dataAdr         95   2  1  SUBB  A, dataAdr
  4571. 66   1  1  XRL   A, @R0             96   1  1  SUBB  A, @R0
  4572. 67   1  1  XRL   A, @R1             97   1  1  SUBB  A, @R1
  4573. 68   1  1  XRL   A, R0              98   1  1  SUBB  A, R0
  4574. 69   1  1  XRL   A, R1              99   1  1  SUBB  A, R1
  4575. 6A   1  1  XRL   A, R2              9A   1  1  SUBB  A, R2
  4576. 6B   1  1  XRL   A, R3              9B   1  1  SUBB  A, R3
  4577. 6C   1  1  XRL   A, R4              9C   1  1  SUBB  A, R4
  4578. 6D   1  1  XRL   A, R5              9D   1  1  SUBB  A, R5
  4579. 6E   1  1  XRL   A, R6              9E   1  1  SUBB  A, R6
  4580. 6F   1  1  XRL   A, R7              9F   1  1  SUBB  A, R7
  4581.  
  4582. 70   2  2  JNZ   codeAdr            A0   2  2  ORL   C, /bitAdr
  4583. 71   2  2  ACALL codeAdr            A1   2  2  AJMP  codeAdr
  4584. 72   2  2  ORL   C, bitAdr          A2   2  1  MOV   C, bitAdr
  4585. 73   1  2  JMP   @A+DPTR            A3   1  2  INC   DPTR
  4586. 74   2  1  MOV   A, #wert           A4   1  4  MUL   AB
  4587. 75   3  2  MOV   dataAdr, #wert     A5   -  -  reserved
  4588. 76   2  1  MOV   @R0, #wert         A6   2  2  MOV   @R0, dataAdr
  4589. 77   2  1  MOV   @R1, #wert         A7   2  2  MOV   @R1, dataAdr
  4590. 78   2  1  MOV   R0, #wert          A8   2  2  MOV   R0, dataAdr
  4591. 79   2  1  MOV   R1, #wert          A9   2  2  MOV   R1, dataAdr
  4592. 7A   2  1  MOV   R2, #wert          AA   2  2  MOV   R2, dataAdr
  4593. 7B   2  1  MOV   R3, #wert          AB   2  2  MOV   R3, dataAdr
  4594. 7C   2  1  MOV   R4, #wert          AC   2  2  MOV   R4, dataAdr
  4595. 7D   2  1  MOV   R5, #wert          AD   2  2  MOV   R5, dataAdr
  4596. 7E   2  1  MOV   R6, #wert          AE   2  2  MOV   R6, dataAdr
  4597. 7F   2  1  MOV   R7, #wert          AF   2  2  MOV   R7, dataAdr
  4598.  
  4599. 80   2  2  SJMP  codeAdr            B0   2  2  ANL   C, /bitAdr
  4600. 81   2  2  AJMP  codeAdr            B1   2  2  ACALL codeAdr
  4601. 82   2  2  ANL   C, bitAdr          B2   2  1  CPL   bitAdr
  4602. 83   1  2  MOVC  A, @A+PC           B3   1  1  CPL   C
  4603. 84   1  4  DIV   AB                 B4   3  2  CJNE  A, #wert, codeAdr
  4604. 85   3  2  MOV   dataAdr, dataAdr   B5   3  2  CJNE  A, dataAdr, codeAdr
  4605. 86   2  2  MOV   dataAdr, @R0       B6   3  2  CJNE  @R0, #wert, codeAdr
  4606. 87   2  2  MOV   dataAdr, @R1       B7   3  2  CJNE  @R1, #wert, codeAdr
  4607. 88   2  2  MOV   dataAdr, R0        B8   3  2  CJNE  R0, #wert, codeAdr
  4608. 89   2  2  MOV   dataAdr, R1        B9   3  2  CJNE  R1, #wert, codeAdr
  4609. 8A   2  2  MOV   dataAdr, R2        BA   3  2  CJNE  R2, #wert, codeAdr
  4610. 8B   2  2  MOV   dataAdr, R3        BB   3  2  CJNE  R3, #wert, codeAdr
  4611. 8C   2  2  MOV   dataAdr, R4        BC   3  2  CJNE  R4, #wert, codeAdr
  4612. 8D   2  2  MOV   dataAdr, R5        BD   3  2  CJNE  R5, #wert, codeAdr
  4613. 8E   2  2  MOV   dataAdr, R6        BE   3  2  CJNE  R6, #wert, codeAdr
  4614. 8F   2  2  MOV   dataAdr, R7        BF   3  2  CJNE  R7, #wert, codeAdr
  4615.  
  4616.  
  4617. A.2 Befehlssatz                                              Seite 79
  4618. ───────────────────────────────────────────────────────────────────────────
  4619.  
  4620. Code  Bytes  Zyklus   Mnemonic
  4621.  
  4622. C0   2  2  PUSH  dataAdr            E0   1  2  MOVX  A, @DPTR
  4623. C1   2  2  AJMP  codeAdr            E1   2  2  AJMP  codeAdr
  4624. C2   2  1  CLR   bitAdr             E2   1  2  MOVX  A, @R0
  4625. C3   1  1  CLR   C                  E3   1  2  MOVX  A, @R1
  4626. C4   1  1  SWAP  A                  E4   1  1  CLR   A
  4627. C5   2  1  XCH   A, dataAdr         E5   2  1  MOV   A, dataAdr
  4628. C6   1  1  XCH   A, @R0             E6   1  1  MOV   A, @R0
  4629. C7   1  1  XCH   A, @R1             E7   1  1  MOV   A, @R1
  4630. C8   1  1  XCH   A, R0              E8   1  1  MOV   A, R0
  4631. C9   1  1  XCH   A, R1              E9   1  1  MOV   A, R1
  4632. CA   1  1  XCH   A, R2              EA   1  1  MOV   A, R2
  4633. CB   1  1  XCH   A, R3              EB   1  1  MOV   A, R3
  4634. CC   1  1  XCH   A, R4              EC   1  1  MOV   A, R4
  4635. CD   1  1  XCH   A, R5              ED   1  1  MOV   A, R5
  4636. CE   1  1  XCH   A, R6              EE   1  1  MOV   A, R6
  4637. CF   1  1  XCH   A, R7              EF   1  1  MOV   A, R7
  4638.  
  4639. D0   2  2  POP   dataAdr            F0   1  2  MOVX  @DPTR, A
  4640. D1   2  2  ACALL codeAdr            F1   2  2  ACALL codeAdr
  4641. D2   2  1  SETB  bitAdr             F2   1  2  MOVX  @R0, A
  4642. D3   1  1  SETB  C                  F3   1  2  MOVX  @R1, A
  4643. D4   1  1  DA    A                  F4   1  1  CPL   A
  4644. D5   2  2  DJNZ  dataAdr, codeAdr   F5   2  1  MOV   dataAdr, A
  4645. D6   1  1  XCHD  A, @R0             F6   1  1  MOV   @R0, A
  4646. D7   1  1  XCHD  A, @R1             F7   1  1  MOV   @R1, A
  4647. D8   2  2  DJNZ  R0, codeAdr        F8   1  1  MOV   R0, A
  4648. D9   2  2  DJNZ  R1, codeAdr        F9   1  1  MOV   R1, A
  4649. DA   2  2  DJNZ  R2, codeAdr        FA   1  1  MOV   R2, A
  4650. DB   2  2  DJNZ  R3, codeAdr        FB   1  1  MOV   R3, A
  4651. DC   2  2  DJNZ  R4, codeAdr        FC   1  1  MOV   R4, A
  4652. DD   2  2  DJNZ  R5, codeAdr        FD   1  1  MOV   R5, A
  4653. DE   2  2  DJNZ  R6, codeAdr        FE   1  1  MOV   R6, A
  4654. DF   2  2  DJNZ  R7, codeAdr        FF   1  1  MOV   R7, A
  4655.  
  4656.