Intel 8049 (8048, 8748, 8749, 8035, 8039) / MCS-48 Hardware-Debugger & Monitor
Die Intel MCS-48 Single Chip Microcomputer Familie wurde ab 1976 auf dem Markt eingeführt und damals sinngemäß als "Erster vollständiger Computer auf einem Chip" (von Intel) beworben. Sie wurde in NMOS-Technologie gefertigt und ließ sich mit einer maximalen Oszillatorfrequenz von 6MHz, später 11MHz, betreiben.
Beim Betrieb mit 11MHz ergibt sich eine Befehlszykluszeit von 1,364µs (T[µs] = 15 / fosc[MHz]), in der 1-Byte-/1-Zyklus-Befehle, deren Anteil mehr als 50% an dem bei den 8035-, 8039-, 8048-, 8049-, 8748-, 8749-, 8040- und 8050-Typen aus 96 Befehlen bestehenden Befehlssatz (siehe "7.1.0 Befehlssatz der 8035, 8039, 8048, 8049, 8748, 8749, 8040, 8050 µC") beträgt, ausgeführt werden.
Spätere Ausführungen wurden in Intels HMOS-II-Prozess (High density, short channel MOS) mit geringerer statischer Leistungsaufnahme, geringeren Strukturgrößen (Kanallänge ca. 2µm) und Gatterverzögerungen (ca. 0,5ns) gefertigt. CMOS-Versionen wurden beispielsweise 1979 von Intersil angeboten.
Die µC der Intel MCS-48 Familie sind für eine Harvard-Architektur ausgelegt, also zur Nutzung von logisch und physisch getrenntem Befehls- und Datenspeicher.
Typ | Gehäuse | ROM | EPROM | RAM | I/O | Anmerkung |
---|---|---|---|---|---|---|
8035 | DIP40 | - | - | 64 | 15 | RAM-Standby |
8048 | DIP40 | 1k | - | 64 | 27 | RAM-Standby |
8748 | DIP40 | - | 1k | 64 | 27 | - |
8039 | DIP40 | - | - | 128 | 15 | RAM-Standby |
8049 | DIP40 | 2k | - | 128 | 27 | RAM-Standby |
8749 | DIP40 | - | 2k | 128 | 27 | - |
8040 | DIP40 | - | - | 256 | 15 | RAM-Standby |
8050 | DIP40 | 4k | - | 256 | 27 | RAM-Standby |
8021 | DIP28 | 1k | - | 64 | 21 | - |
8022 | DIP40 | 2k | - | 64 | 26 + 2xAD | - |
Zeitpunkt | Titel (Thema) | Publikation |
---|---|---|
1976 / 02 | "Intel prepares 8-bit processor for low end" | "Electronics", 05.02.1976 |
1976 / 11 | "Single-chip 8- bit microcomputer fills gap between calculator types and powerful multichip processors" (8048 (Mask ROM) / 8748 (EPROM); 1kB ROM, 64bytes RAM; 6MHz max. clock frequency) | "Electronics", 25.11.1976 |
1976 / 11 | "For the low end of the market we are promised two minimum chip families: the MCS48 and the MCS41." | "Electronics Today International (AU)", 11 / 1976 |
1977 / 03 | "Intel to double microcomputer chip program memory" (2kB 8049 / 8039) | "Electronics", 03.03.1977 |
1977 / 03 | "Programmer added for MCS-48 family" (Prompt-48) | "Electronics", 31.03.1977 |
1977 / 06 | "The [...] control computer features an eight-bit CPU (i.e. the Intel 8048) with BCD arithmetic capabilities 1 k of ROM, 64 words of internal RAM, interrupt, oscillator and clock driver circuits and an internal timer and event counter.[...] US prices are $249 with ROM and $399 with EROM." (IMSAI 8048) | "Electronics Today International (AU)", 06 / 1977 |
1978 / 02 | "Single-chip µC has twice memory of MCS-48s" (2kB 8049 / 8039) | "Electronic Design", 15.02.1978 |
1978 / 04 | "IBM receives license for MCS-48, UPI-41 architectures and software" | "Electronics", 27.04.1978 |
1978 / 05 | "Intel's 8022 packs a-d converter, plus" | "Electronics", 11.05.1978 |
1978 / 05 | "Intel speeds up 8049 and 8039 by 80% to 11 MHz" | "Electronics", 11.05.1978 |
1978 / 05 | "Microcontroller includes a-d converter for lowest-cost analog interfacing" (8022) | "Electronics", 25.05.1978 |
1979 / 01 | "A look at Intel's [...] MCS-48 µP family." | "Radio Electronics", 01 / 1979 |
1979 / 05 | "Intersil's C-MOS drive" (MCS-48 C-MOS devices; 87C48, 87C41, 80C48, 80C41, 80C49, 80C35) | "Electronics", 10.05.1979 |
1979 / 12 | "Microcomputer with A/D converter - Intel's 8022 is the first low-cost single-IC microcomputer that includes an A/D converter." | "Radio Electronics", 12 / 1979 |
1980 / 02 | "Valvo, the Hamburg-based component-producing subsidiary of NV Philips Gloeilampenfabrieken, is now gearing up for production of the 8048 microcomputer" | "Electronics", 28.02.1980 |
1980 / 02 | "8048 to be made with Intel's HMOS process" | "Electronics", 28.02.1980 |
1980 / 09 | "National Semiconductor quadruples memory of 8048 microcomputer" (INS8050: 4kB ROM, 256bytes RAM) | "Electronics", 25.09.1980 |
1981 / 03 | "Intel announced [...] a [...] 'automotive grade' version of its MCS-48 single-chip microcomputer family (able to operate at -40° to +100°C)" | "Electronics", 24.03.1981 |
Die MCS-48 µC 8035, 8039, 8048, 8049, 8748, 8749, 8040 und 8050 bestehen neben den Bestandteilen der CPU, dem je nach Typ vorhandenen und als maskenprogrammiertes ROM oder EPROM ausgeführten, internen Programmspeicher und dem internen statischen RAM aus :
Sie verfügen über zwei "Test" Anschlüsse (T0 und T1), die je nach Programmierung für bedingte Sprünge abgefragt, als Eingang für den 8-Bit-Zähler oder als Ausgang für das "CLK"-Signal (fclk = fosc / 3), mit dessen Frequenz die interne Zustandsmaschine zur Erzeugung der S1 bis S5 Maschinenzyklen getaktet wird, dienen können und mit Hilfe des *SS-Eingangs können Programme im Einzelschritt-Modus ausgeführt werden (siehe "3.5.0 Single-Step Hardware").
Bild: Ausführen des "ENT0 CLK"-Befehls (Opcode 0x75) zur Ausgabe von CLK an T0
Indem man an den "EA"-Anschluss (External Access) H-Pegel legt, lässt sich das interne ROM abschalten und ein externer Speicherbaustein als Programmspeicher mit der Basisadresse 0x000 verwenden. Ein µC mit internem Programmspeicher verhält sich dann wie der sonst identische Typ ohne internen Programmspeicher (beispielsweise ein 8049 wie ein 8039).
Zum Zugriff auf einen externen Programmspeicher werden die Signale von BUS und der unteren Hälfte von P2 (P2.0 bis P2.3) herangezogen. Auf BUS liegen im Zeitmultiplexverfahren abwechselnd die unteren 8-Bit der Adresse und Daten an, das untere Nibble (die niederwertigen 4Bit) von P2 signalisiert die oberen 4Bit der Adresse bzw. zu bestimmten Zeitpunkten während eines Befehlszyklus, der aus den fünf Zuständen S1 bis S5 der CPU-Zustandsmaschine besteht, die auf P2 geschriebene I/O-Information (siehe Zeichnungssatz, "MCS-48 Logic Analyzer Traces").
Bild: S1 bis S5 der CPU-Zustandsmaschine
Die 8048-, 8049-, 8748-, 8749-, 8035-, 8039-, 8040- und 8050-Mikrocontroller der Intel MCS-48 Familie unterstützen einen bis zu 12 Bit breiten Adressbus (A0 bis A11) für den Programmspeicher, so dass maximal 4kByte adressiert werden können. Allerdings sind diese 4kByte in 2 Bänke à 2kByte aufgeteilt, und nur innerhalb dieser 2kByte großen Speicherbänke kann durch "JMP"- und "CALL"-Befehle linear, also "am Stück", adressiert werden.
Zum Wechsel zwischen diesen 2kB Speicherbänken gibt es im MCS-48 Befehlssatz die Befehle "SEL MB0" (Auswahl der Speicherbank 0 : Adressbereich 0x000 bis 0x7FF (0 bis 2047 dezimal)) und "SEL MB1" (Auswahl der Speicherbank 1 : Adressbereich 0x800 bis 0xFFF (2048 bis 4095 dezimal)). Wird einer dieser Befehle ausgeführt, wird im Mikrocontroller ein FlipFlop, dessen offizielle Bezeichnung "DBF : Memory Bank Flip-Flop" lautet (Intel 8-Bit Embedded Controllers Handbook 1990; Kap. "MCS(R)-48 Instruction Set, Symbols and Abbreviations Used"; S.3-7), durch "SEL MB1" gesetzt oder durch "SEL MB0" zurückgesetzt. Sobald ein unbedingter Sprung per "JMP"- oder "CALL"-Befehl ausgeführt wird, werden die unteren 11 Bits (A0 bis A10) des Programmzählers mit der im Sprungbefehl angegebenen Zieladresse geladen und als 12. Bit (A11) des Programmzählers wird der Zustand des Vorbereitungs-FlipFlops übernommen.
Bild: Prinzipdarstellung der internen Logik zur Erzeugung des 12. Adress-Bits, PC.11
Nach Ausführen des folgenden Codes hat der Programmzähler (PC) den Wert 0x800 (Bit11 = 1) :
Wird danach Folgendes ausgeführt, wird der Programmzähler auf 0x000 (Bit11 = 0) gesetzt :
Bild: Ausführen des "SEL MB1"-Befehls (0xF5) und Wirkung auf P2.3 nach "JMP 000" (0x04,0x00)
Durch das Auslösen eines Hardware-Interrupts werden während dessen Bearbeitung alle Programmspeicher-Zugriffe auf die Speicherbank 0 (0x000...0x7FF) begrenzt, der Zustand des MB-FlipFlops bleibt jedoch erhalten.
Wenn ein Bankwechsel im Zusammenhang mit einem Unterprogramm-Aufruf per "CALL"-Befehl stattfindet, ist Vorsicht geboten. Da alle 12 Adress-Bits auf dem Stack gespeichert und durch den Rücksprungbefehl "RET" wiederhergestellt werden, ist der Inhalt des Programmzählers (PC) danach wieder korrekt, jedoch wird das MB-FlipFlop durch "RET" nicht beeinflusst. Das kann zu unerwarteten Ergebnissen führen :
Tatsächlich wird der letzte Sprungbefehl "JMP 010" den Programmzähler auf 0x810 setzen, da das MB-FlipFlop noch gesetzt ist !
("[...]Since all twelve bits of the program counter including bit (11) are stored in the stack when a Call is executed, the user may jump to subroutines across the 2K boundary and the proper bank will be restored upon return. However, the bank switch flipflop will not be altered on return." Quelle: "Intel MCS-48 Family of Single Chip Microcomputers User's Manual" (1980); Kap. "3.1.2 Extended Program Memory Addressing (Beyond 2K)" / "Program Memory Bank Switch"; S. 3-2).
Eine weitere Auswirkung des eigentlich nur 11 Bit breiten Programmzählers (PC) ist, dass, im Fall des Überlaufs des Programmzählers, auf Adresse 0x7FF Adresse 0x000 folgt und entsprechend auf Adresse 0xFFF Adresse 0x800 folgt.
Bedingte Sprungbefehle speichern nur eine 8-Bit Adresse im entsprechenden Befehl und in der Regel muss das Ziel innerhalb derselben 256-Byte-Page liegen. Es gibt dabei einen Sonderfall : wenn der Sprungbefehl in einer der höchsten Adressen einer 256-Byte-Page liegt, dann liegt das Ziel durch das Inkrementieren des Programmzählers während S2 (1. Befehls-Zyklus) oder S3 (2. Befehls-Zyklus) in der nächsten 256-Byte-Page.
Nach einem Reset durch Low-Pegel am *RESET Anschluss startet die Programmausführung an Adresse 0x000, nach einem durch Low-Pegel am *INT Anschluss ausgelösten Interrupt wird die Programmausführung an Adresse 0x003 und nach einem Timer-/Counter-Interrupt an Adresse 0x007 des Programmspeichers fortgesetzt.
Im PSW sind die CPU-Flags und der Stack-Zeiger abgelegt.
Es kann vollständig nur durch "MOV PSW,A"-Befehle (Opcode 0xD7) beschrieben und "MOV A,PSW"-Befehle (Opcode 0xC7) gelesen werden, da es ein vom internen RAM unabhängiges Hardware-Register ist.
Bit | Bedeutung / Funktion | ||
---|---|---|---|
7 | CY | Carry Flag | In A hat ein Überlauf stattgefunden |
6 | AC | Auxiliary Carry Flag | In A hat ein Überlauf von Bit3 zu Bit4 stattgefunden |
5 | F0 | User Flag 0 | Wird mit "CLR F0" gelöscht, mit "CPL F0" invertiert und mit "JF0" für bedingte Sprünge ausgewertet |
4 | BS | Register Bank Select | 0: Registerbank0 aktiv; 1: Registerbank1 aktiv |
3 | '1' | Ist im Ergebnis eines Lesezugriffs auf das PSW immer 1 | |
2 | S2 | Stack Pointer Bit 2 | Stack-Zeiger-Bit mit der dezimalen Wertigkeit 4 |
1 | S1 | Stack Pointer Bit 1 | Stack-Zeiger-Bit mit der dezimalen Wertigkeit 2 |
0 | S0 | Stack Pointer Bit 0 | Stack-Zeiger-Bit mit der dezimalen Wertigkeit 1 |
Das interne statische RAM umfasst bei den Intel 8035-, 8048- und 8748-Typen 64 Byte, bei den 8039-, 8049- und 8749-Typen 128 Byte und bei den 8040- und 8050-Typen 256 Byte.
Über den getrennten Versorgungsanschluss Vdd an Pin 26 der 8035-, 8039-, 8048-, 8049-, 8040- und 8050-Typen kann bei abgeschalteter Hauptversorgung, Vcc an Pin 40, der Speicherinhalt erhalten werden.
Das interne RAM beinhaltet zwei 8 Byte große Registerbänke, innerhalb derer über die Angabe Rr (R0 ... R7) in einem geeigneten Befehl direkt auf den Inhalt der entsprechenden RAM-Adresse zugegriffen werden kann (z.B. : "MOV R5,A" zum Zugriff auf RAM-Adresse 0x05, wenn BS im PSW = 0 ist, beziehungsweise auf RAM-Adresse 0x1D, wenn BS im PSW = 1 ist). Die Auswahl der aktiven Registerbank erfolgt über das "BS"-Flag (Register Bank Select) im PSW (Program Status Word) beziehungsweise über den "SEL RB0"-Befehl (Opcode 0xC5) zur Auswahl der Registerbank 0 und den "SEL RB1"-Befehl (Opcode 0xD5) zur Auswahl der Registerbank 1. Es kann auch indirekt über die Indexregister R0 und R1 auf die RAM-Adressen der beiden Registerbänke zugegriffen werden.
Weil zwei unabhängige Registerbänke zur Verfügung stehen, können unter anderem effektive Interrupt-Service-Routinen erstellt werden, indem beispielsweise die Registerbank 0 im Hauptprogramm und Registerbank 1 in der Interrupt-Routine verwendet wird.
Auf alle anderen Adressen des internen RAMs kann nur indirekt über die Indexregister R0 und R1 der aktiven Registerbank zugegriffen werden. Zum Beispiel kopiert ein "MOV @R0,A"-Befehl den Inhalt des Akkumulators in die RAM-Adresse 0x20, wenn R0 = 0x20 ist.
Zusätzlich enthält es den 8 Ebenen umfassenden Stack-Bereich.
Adresse (hex) | Funktion | Anmerkung |
---|---|---|
20...3F 20...7F 20...FF | RAM | 8035, 8048, 8748 = 32 Byte 8039, 8049, 8749 = 96 Byte 8040, 8050 = 224 Byte |
1F | R7' | Registerbank1 (PSW.4 = 1) |
1E | R6' | Registerbank1 (PSW.4 = 1) |
1D | R5' | Registerbank1 (PSW.4 = 1) |
1C | R4' | Registerbank1 (PSW.4 = 1) |
1B | R3' | Registerbank1 (PSW.4 = 1) |
1A | R2' | Registerbank1 (PSW.4 = 1) |
19 | R1' | Registerbank1 (PSW.4 = 1) |
18 | R0' | Registerbank1 (PSW.4 = 1) |
17 | Stack Level 7 MSB (*) / RAM | SP (PSW.0...PSW.2) = 7 |
16 | Stack Level 7 LSB (*) / RAM | SP (PSW.0...PSW.2) = 7 |
15 | Stack Level 6 MSB (*) / RAM | SP (PSW.0...PSW.2) = 6 |
14 | Stack Level 6 LSB (*) / RAM | SP (PSW.0...PSW.2) = 6 |
13 | Stack Level 5 MSB (*) / RAM | SP (PSW.0...PSW.2) = 5 |
12 | Stack Level 5 LSB (*) / RAM | SP (PSW.0...PSW.2) = 5 |
11 | Stack Level 4 MSB (*) / RAM | SP (PSW.0...PSW.2) = 4 |
10 | Stack Level 4 LSB (*) / RAM | SP (PSW.0...PSW.2) = 4 |
0F | Stack Level 3 MSB (*) / RAM | SP (PSW.0...PSW.2) = 3 |
0E | Stack Level 3 LSB (*) / RAM | SP (PSW.0...PSW.2) = 3 |
0D | Stack Level 2 MSB (*) / RAM | SP (PSW.0...PSW.2) = 2 |
0C | Stack Level 2 LSB (*) / RAM | SP (PSW.0...PSW.2) = 2 |
0B | Stack Level 1 MSB (*) / RAM | SP (PSW.0...PSW.2) = 1 |
0A | Stack Level 1 LSB (*) / RAM | SP (PSW.0...PSW.2) = 1 |
09 | Stack Level 0 MSB (*) / RAM | SP (PSW.0...PSW.2) = 0 |
08 | Stack Level 0 LSB (*) / RAM | SP (PSW.0...PSW.2) = 0 |
07 | R7 | Registerbank0 (PSW.4 = 0) |
06 | R6 | Registerbank0 (PSW.4 = 0) |
05 | R5 | Registerbank0 (PSW.4 = 0) |
04 | R4 | Registerbank0 (PSW.4 = 0) |
03 | R3 | Registerbank0 (PSW.4 = 0) |
02 | R2 | Registerbank0 (PSW.4 = 0) |
01 | R1 | Registerbank0 (PSW.4 = 0) |
00 | R0 | Registerbank0 (PSW.4 = 0) |
Im internen RAM befindet sich von Adresse 0x08 bis 0x17 ein bis zu 16 Byte großer Stack-Bereich zur Ablage von Rücksprungadressen und PSW-Flags durch die CPU.
Die "CY"-, "AC"-, "F0"- und "BS"-Flags (PSW.7 ... PSW.4) werden bei einem Unterprogrammaufruf per "CALL"-Befehl oder durch eine Interruptanforderung zusammen mit dem aktuellen Inhalt des Programmzählers (PC.0 ... PC.11) im durch den Stack-Zeiger (PSW.0 ... PSW.2) adressierten Byte-Paar des Stack-Bereichs im RAM hinterlegt.
Der Stack-Zeiger in PSW.0 bis PSW.2 wird nach der Ausführung eines "CALL"-Befehls oder einer Interrupt-Anforderung automatisch inkrementiert und bei der Ausführung eines "RET"- oder "RETR"-Befehls dekrementiert. Bei einem Überlauf des Stack-Zeigers wechselt er vom Wert 0x07 zum Wert 0x00 und entsprechend bei einem Unterlauf vom Wert 0x00 zum Wert 0x07.
Bei der Ausführung eines "RETR"-Befehls werden neben dem Programmzähler auch die auf dem Stack gesicherten oberen 4 Bit des PSW (PSW.4 ... PSW.7) wiederhergestellt, was bei der Ausführung eines "RET"-Befehls nicht geschieht.
Mit Hilfe des bis zu 16 Byte umfassenden Stack-Bereichs können Unterprogramme maximal 8fach verschachtelt aufgerufen werden, ohne dass es zu einem Stack-Überlauf und zur Zerstörung des Stack-Inhalts kommt.
Nicht genutzte Stack-Positionen stehen zur Nutzung als allgemeines RAM zur Verfügung.
Belegung eines Stack-Byte-Paars :
Bit | StackOffset+0 (*) | StackOffset+1 (*) |
---|---|---|
7 | PC.7 | PSW.7 |
6 | PC.6 | PSW.6 |
5 | PC.5 | PSW.5 |
4 | PC.4 | PSW.4 |
3 | PC.3 | PC.11 |
2 | PC.2 | PC.10 |
1 | PC.1 | PC.9 |
0 | PC.0 | PC.8 |
Beispiel 1 :
PSW.2 = PSW.1 = PSW.0 = 0
StackOffset = 0 * 2 + 8 = RAM-Adresse 0x08
Beispiel 2 :
PSW.2 = 0
PSW.1 = PSW.0 = 1
StackOffset = 3 * 2 + 8 = RAM-Adresse 0x0E
Durch den "STRT CNT"-Befehl (Opcode 0x45) wird die Counter-Betriebsart und durch den "STRT T"-Befehl (Opcode 0x55) die Timer-Betriebsart gestartet. Mit dem "STOP TCNT"-Befehl (Opcode 0x65) werden beide Betriebsarten beendet.
Bei einem Start der Timer-Betriebsart wird der Vorteiler, der die Frequenz des "ALE"-Signals durch 32 teilt (fprescaler = fosc / 480), zurückgesetzt und sein Ausgang mit dem Eingang des Timer/Counters verbunden. Mit Hilfe
der Timer-Betriebsart können Zeiten von
t = 1 / fprescaler bis t = 256 / fprescaler realisiert werden, indem durch den "MOV T,A"-Befehl (Opcode 0x62) ein entsprechender Startwert in das Timer/Counter-Register "T" geladen
wird. Längere Zeiten werden durch Zählen der Überläufe des Timer/Counter-Registers erreicht.
Bei einem Start der Counter-Betriebsart wird der Eingang des Timer/Counters mit dem T1-Anschluss an Pin 39 des µCs verbunden und an T1 auftretende High-zu-Low-Übergänge durch den Timer/Counter gezählt. T1 muss mindestens
für die Dauer eines Befehlszyklus
(t = 15 / fosc) Low-Pegel annehmen und mindestens für die Dauer eines Maschinenzyklus (t = 3 / fosc) nach jedem Low-zu-High-Übergang High-Pegel erhalten. Die Frequenz des Signals an T1
darf fcnt = fosc / 45 nicht überschreiten. Der Zählerinhalt kann mit dem "MOV T,A"-Befehl (Opcode 0x62) voreingestellt und mit dem "MOV A,T"-Befehl (Opcode 0x42) gelesen werden.
Durch jedes Ereignis in der Timer- oder Counter-Betriebsart (32 Befehlszyklen in der Timer-Betriebsart oder ein High-zu-Low-Übergang an T1 in der Counter-Betriebsart) wird das vom RAM unabhängige Hardware-Register "T" inkrementiert und bei einem Überlauf von 0xFF zu 0x00 das Timer-Flag, auf das ausser über den "JTF addr"-Befehl (Opcode 0x16 addr) nicht zugegriffen werden kann, gesetzt.
Wenn bei einem Überlauf des "T"-Registers der Timer/Counter-Interrupt durch den "EN TCNTI"-Befehl (Opcode 0x25) freigegeben ist, wird die Programmausführung an Adresse 0x007 des Programmspeichers fortgesetzt. Der Timer/Counter-Interrupt kann mit Hilfe des "DIS TCNTI"-Befehls (Opcode 0x35) wieder gesperrt werden. Treten gleichzeitig ein durch Low-Pegel am *INT Anschluss ausgelöster Interrupt und ein Timer/Counter-Interrupt auf, wird zuerst die durch den *INT Anschluss ausgelöste Interrupt-Anforderung bearbeitet und danach die des Timer/Counter-Interrupts.
Neben der Möglichkeit des Timer/Counter-Interrupts zur Auswertung eines Überlaufs des T-Registers kann auch das Timer-Flag mit Hilfe des bedingten Sprungbefehls "JTF addr" (Opcode 0x16 addr) zyklisch im Anwenderprogramm abgefragt werden (Polling). Durch das Ausführen des "JTF addr"-Befehls wird das Timer-Flag zurückgesetzt.
Bild: Mit dieser Schaltung lässt sich das MCS-48 Programm im externen EPROM 2732 ausführen
Bauteil | Funktion |
---|---|
8049 | Mikrocontroller |
74LS373 | Latch zum Zwischenspeichern von A0...A7 |
2732 | 32 Kbit EPROM als Programmspeicher |
Pin | Signal | Funktion |
---|---|---|
1 | T0 | "Test0"-Eingang/"CLK"-Ausgang |
2 | XTAL1 | Oszillator-Anschluss 1 |
3 | XTAL2 | Oszillator-Anschluss 2 |
4 | *RESET | Initialisierungseingang |
5 | *SS | Single-Step Eingang |
6 | *INT | Externe Interrupt Anforderung |
7 | EA | Externen Zugriff aktivieren |
8 | *RD | Lesezugriff auf Daten / IO |
9 | *PSEN | Lesezugriff auf Programm |
10 | *WR | Schreibzugriff auf Daten / IO |
11 | ALE | Speicher für Adresse aktivieren |
12 | D0 | "BUS" Adress-/Datenbus, Bit0 |
13 | D1 | "BUS" Adress-/Datenbus, Bit1 |
14 | D2 | "BUS" Adress-/Datenbus, Bit2 |
15 | D3 | "BUS" Adress-/Datenbus, Bit3 |
16 | D4 | "BUS" Adress-/Datenbus, Bit4 |
17 | D5 | "BUS" Adress-/Datenbus, Bit5 |
18 | D6 | "BUS" Adress-/Datenbus, Bit6 |
19 | D7 | "BUS" Adress-/Datenbus, Bit7 |
20 | Vss | Masseanschluss, GND |
Pin | Signal | Funktion |
---|---|---|
40 | Vcc | +5V Hauptversorgung |
39 | T1 | "Test1"-/Counter-Eingang |
38 | P2.7 | Port2, Bit7 |
37 | P2.6 | Port2, Bit6 |
36 | P2.5 | Port2, Bit5 |
35 | P2.4 | Port2, Bit4 |
34 | P1.7 | Port1, Bit7 |
33 | P1.6 | Port1, Bit6 |
32 | P1.5 | Port1, Bit5 |
31 | P1.4 | Port1, Bit4 |
30 | P1.3 | Port1, Bit3 |
29 | P1.2 | Port1, Bit2 |
28 | P1.1 | Port1, Bit1 |
27 | P1.0 | Port1, Bit0 |
26 | Vdd | +5V für RAM-Standby (*) |
25 | PROG | Anschluss für Portexpander (*) |
24 | P2.3 | Port2, Bit3 |
23 | P2.2 | Port2, Bit2 |
22 | P2.1 | Port2, Bit1 |
21 | P2.0 | Port2, Bit0 |
Bild: DIP40 Gehäuse der MCS-48 8035-, 8039-, 8048-, 8049-, 8748-, 8749, 8040- und 8050-Typen
Wenn der EA-Eingang (External Access) an Pin 7 des µCs auf High-Potential (+5V) gelegt ist, erfolgen alle Programmspeicherzugriffe mittels ALE, *PSEN, BUS, P2.0, P2.1, P2.2 und P2.3 auf externe Speichereinheiten, der interne Programmspeicher ist deaktiviert.
*RESET ist ein Low-Pegel-aktiver Initialisierungseingang mit Schmitt-Trigger Eigenschaft und im µC integrierten Pullup-FET mit ca. 80kOhm Impedanz an Pin 4 des µCs. Muss mindestens 10ms aktiviert werden nachdem Vcc, Vdd und Vss stabil anliegen. Muss mindestens 5 Befehls-Zyklen (t = 75 / fosc) aktiviert werden, wenn sich der Oszillator des µCs bereits stabilisiert hat.
Durch Aktivieren des Reset-Eingangs wird folgender Zustand hergestellt :
Aufgrund des im µC integrierten Pullup-FETs reicht im Minimalfall die Beschaltung mit einem externen 1µF-Kondensator aus, um einen Power-On-Reset zu realisieren.
*INT ist ein Low-Pegel-aktiver Eingang für externe Interrupt-Anforderungen an Pin 6 des µCs. Muss mindestens 3 Befehls-Zyklen
(t = 45 / fosc) aktiviert sein, um eine zuverlässige Erkennung der Interruptanforderung zu
gewährleisten. Nachdem der µC die Interrupt-Anforderung erkannt hat, werden PC und PSW auf dem Stack gesichert und PC wird mit Adresse 0x003 geladen - auch wenn gerade der obere 2kB-Block 0x800 bis 0xFFF durch einen
"SEL MB1"-Befehl aktiviert oder vorbereitet ist. Zur Rückkehr aus der ISR ist der "RETR"-Befehl zu nutzen.
Nach einem Reset ist die Auslösung eines Interrupts durch den *INT-Anschluss deaktiviert und kann durch den "EN I"-Befehl (Opcode 0x05) aktiviert werden. Auch wenn Interrupts durch den *INT-Eingang deaktiviert sind, kann der Pegel am *INT-Anschluss über den "JNI"-Befehl für bedingte Sprünge ausgewertet werden. Die Erkennung von Interrupt-Anforderungen am *INT-Eingang kann im Programm durch Ausführen des "DIS I"-Befehls (Opcode 0x15) deaktiviert werden.
Treten gleichzeitig ein durch Low-Pegel am *INT Anschluss ausgelöster Interrupt und ein Timer/Counter-Interrupt auf, wird zuerst die durch den *INT Anschluss ausgelöste Interrupt-Anforderung bearbeitet und danach die des Timer/Counter-Interrupts.
Die fallende Flanke des ALE-Ausgangs (Address Latch Enable) an Pin 11 des µCs zeigt an, dass gültige Adressinformation auf BUS vorhanden ist und kann zur Übernahme der Adresse in einen FlipFlop-Zwischenspeicher genutzt werden. Zum Zeitpunkt der steigenden Flanke des ALE-Signals sind immer die zuletzt geschriebenen I/O-Informationen an P2.0 bis P2.3 verfügbar und können ebenfalls in ein entsprechendes FlipFlop übernommen werden.
Mit Hilfe des Low-aktiven *PSEN-Ausgangs (Program Store Enable) an Pin 9 des µCs wird aus einem externen Programmspeicher gelesen. Die vom Programmspeicher bei *PSEN=Low auf BUS gelegte Information wird vor der steigenden Flanke von *PSEN in den µC übernommen.
Der Low-aktive *RD-Ausgang (Read) an Pin 8 des µCs dient zur Übernahme von Informationen von einer externen Einheit (RAM / IO etc.). Wenn *RD Low wird, legt die externe Einheit die Informationen auf BUS, wo sie dann vor der steigenden Flanke des *RD-Signals in den µC übernommen werden. Zur Erzeugung des *RD-Signals kommen bei EA=High nur die "MOVX A,@Ri"-Befehle (1 Byte, 2 Zyklen) in Frage.
Der Low-aktive *WR-Ausgang (Write) an Pin 10 des µCs dient zur Übernahme von Informationen in eine externen Einheit (RAM / IO etc.). Wird *WR Low, legt der µC die an die externe Einheit zu übermittelnde Information auf BUS, wo sie dann bei der steigenden Flanke des *WR-Signals stabil anliegt und von der externen Einheit übernommen wird. Zur Erzeugung des *WR-Signals kommen bei EA=High nur die "MOVX @Ri,A"-Befehle (1 Byte, 2 Zyklen) in Frage.
Die fallende Flanke des PROG-Ausgangs an Pin 25 des µCs signalisiert, dass an P2.0 bis P2.3 ein Befehlscode und eine Portadresse ausgegeben wird. Die zugehörigen Daten werden bei der steigenden Flanke des PROG-Signals in eine externe Einheit oder vor der steigenden Flanke des PROG-Signals vom µC übernommen.
Der Befehlscode wird durch den eingesetzten Befehl des MCS-48 Befehlssatzes bestimmt | Die Portadresse wird durch den in diesem MCS-48 Befehl angegebenen Port bestimmt | ||||||||||||||||||||||||||||||
|
|
Die Daten entsprechen bei Schreibzugriffen dem unteren Nibble (Bit0...Bit3) des Akkumulator-Inhalts bzw. werden bei Lesezugriffen mit Hilfe des PROG-Signals durch den µC in das untere Nibble des Akkumulator-Inhalts übernommen.
P1 und P2 sind quasi-bidirektionale, statische Ein-/Ausgabeports mit jeweils 8 Portleitungen. Die Quasi-Bidirektionalität wird erreicht, indem an jede Portleitung ein ständig aktiver Pullup-FET mit ca. 8kOhm Impedanz angeschlossen ist und gleichzeitig zwei FETs mit niedriger Impedanz, die die Portleitung auf "0"- oder "1"-Pegel legen können.
Der FET zum Anlegen des "1"-Pegels ist bei jedem Schreibzugriff mit "1" ungefähr einen halben Maschinen-Zyklus (t = 1,5 / fosc) aktiv, um die Flankensteilheit bei einem "0"-zu-"1"-Wechsel zu erhöhen, danach wird der "1"-Pegel von dem Pullup-FET aufrecht erhalten.
Der FET zum Anlegen des "0"-Pegels bleibt nach einem Schreibzugriff auf eine Portleitung mit "0" bis zu einem Schreibzugriff mit "1" ständig aktiv.
Um eine Portleitung als Eingang zu nutzen, muss dafür im entsprechenden Ausgangsregister eine "1" enthalten sein, so dass nur der Pullup-FET mit hoher Impedanz wirksam ist und die Portleitung von einem externen Signal auf "0"-Pegel gelegt werden kann. Für jede Portleitung kann so einzeln festgelegt werden, ob sie als Eingang oder als Ausgang dienen soll.
BUS ist ein bidirektionaler, statischer Ein-/Ausgabeport mit 8 Portleitungen D0 bis D7. Bei einem Schreibzugriff durch einen
"OUTL BUS,A"- oder "MOVX @Ri,A"-Befehl wird die *WR-Leitung aktiviert (Low), durch deren
steigende Flanke signalisiert wird, dass sich gültige Daten auf D0 bis D7 befinden und von einer externen Einheit übernommen werden können.
Bei einem Lesezugriff durch einen "INS A,BUS"- oder "MOVX A,@Ri"-Befehl wird die *RD-Leitung aktiviert (Low), vor deren steigender Flanke die durch eine externe Einheit auf D0 bis D7 gelegte Information vom µC übernommen wird.
Es ist ohne zusätzliche Hardware nicht zulässig, bei der Verwendung eines externen Programmspeichers "OUTL BUS,A"- oder
"INS A,BUS"-Befehle auszuführen.
Bild: Zugriff auf externen Programmspeicher
Bild: Zugriff auf externes RAM
Bild: Schreibzugriff mit "PROG"-Signal
Bild: Schreibzugriff auf Port1 und Port2
Bild: Unbedingter Sprung mit "JMP" oder "CALL"
Bild: Ausführen des "RET"-Befehls
Bemerkenswert ist, dass bei der Ausführung eines "RET"-Befehls (Return from subroutine) für den zweiten Befehlszyklus *PSEN (Program Store Enable) aktiviert (Low) wird, obwohl es sich um einen 1Byte-Befehl handelt, also im zweiten Befehlszyklus nichts aus dem Programmspeicher gelesen wird.
Bild: Indirekter Sprung auf einer 256Byte-Page mit "JMPP @A"
Bild: Lesen von Konstanten aus dem Programmspeicher mit "MOVP A,@A" und "MOVP3 A,@A"
Umfangreichere und höher aufgelöste Grafiken befinden sich im Zeichnungssatz des Projekts.
(Auch die als PDF verfügbare Download-Version der Dokumentation bietet eine bessere Bildqualität.)