zurück zur Startseite
Das MCS-48 Microcontrollersystem
Ich bin begeistert von dem alten 8048 Microcontroller
(Intels MCS-48 System). Er ist sehr einfach aufgebaut und aus meiner Sicht ideal
für den Anfänger, der erste Schritte in der Assemblerprogrammierung unternehmen will.
Dieser Microcontroller wurde sehr
oft hergestestellt, man fand ihn in Nähmaschienen, Waschmaschienen,
Kopierern usw.. Er trägt sein Programm als maskenprogrammiertes ROM in
sich, dieses läßt sich aber abschalten, indem Pin 7 des 40 poligen Gehäuses
(EA) mit + 5 Volt verbunden wird. Man erhält dann gewissermassen die
ROMlose Version (beim 8048 den 8035 bzw. beim 8049 den 8039), der über
das EPROM bzw. besser EEPROM gesteuert wird.
Auch im Kosmos Mircocomputer CP1 in den 80er Jahren wurde ein 8049 verwendet.
Man findet die 8048 oder 8049
immer wieder mal beim Ausschlachten von Geräten. Egal was er
vorher gesteuert hat, er ist für ein kleines Entwicklersystem
weiter verwendbar.
Auf ebay begegnet man ihm ebenfalls, auch als ROM-losen Controller 8039.
Der 8048 lässt eine
Taktfrequenz von 10 Mhz zu, hat 64 Byte internes RAM (beim 8049 sind es
128 Byte, beim 8050 sogar 256), hat 2 je 8 Bit breite Ports, einen Eingang
für Interupt und 2 Testeingänge.
Die EEPROMs gibt es ebenfalls
weiterhin im Handel (z. B. Reichelt Elektronikversand), sie
kosten etwa 2 Euro pro Stück.
Vor ca. 20 Jahren wurde bei
Völkner Elektronikversand eine Platine mit der Bezeichnung PECAZ
(Weidners „Preiswertester Einplatinen Computer Aller
Zeiten“) vertrieben, ergänzt mit kleinem Entwicklungsboard,
EPROM-Simulator und einfachem Assembler. Ich habe mir diese Komponenten
von dem Entwickler Dipl. Ing. Weidner schicken lassen, seitdem hat mich
dieses Ding immer wieder beschäftigt. Herr Weidner ist allerdings
leider nicht mehr unter seiner alten Adresse und Telefonnummer erreichbar.
Auch im Internet konnte ich seine Seite über PECAZ nicht
mehr finden.
PECAZ hatte einen Bus-artigen 21 poligen
Steckanschluss, um ihn auf einem ebenfalls erhältlichen Testboard
zu einem Entwicklungssystem ausbauen zu können. Als
Programmspeicher konnten 2716 (mit 2 Kilobyte) oder 2764 (mit 8
Kilobyte, von denen allerdings nur die "unteren" 4 KB nutzbar waren)
verwendet werden.
Weidners PECAZ
Als Ergänzung war der EPROM Simulator PEPSI und das
Entwicklungsboard PECAID erhältlich. PEPSI wurde an den
paralellen Druckerausgang des PCs anschlossen und die mit dem Assmbler
erstellte Binärdatei mittels mitgelieferter Software in das RAM
von PEPSI übertragen. PECAZ betrachtete das ganze als EPROM.
Auf dem Entwicklungsboard konnten die Zustände des Ports P1 sowie
der oberen 5 Bits des Port P2 mittels LEDs dargestellt werden. Es
finden sich Taster für Reset und Interupt sowie Schalter für
die Testeingänge T0 und T1. Weiterhin war noch eine Schaltung
für Single Step Betrieb des Prozessors vorhanden. Ein zusätzlicher
Steckplatz war für Erweiterungsschaltungen vorgesehen.
Weidners EPROM Simulator PEPSI und Entwicklungsboard PECAID

Schaltschema des 8048 Systems
Die Schaltungen sind aber auch auf Lochrasterplatinen durch einfache Verdrahtung realisierbar.
Mein Testboard: Kein Single
Step, nur Taster für Reset und Interupt, Schalter für T0 und
T1
In Herrn Weidners Buch "Microcontroller angewandt MCS-48-Familie", ISBN 3-928051-23-7,
erschienen im elector Verlag werden Aufbau, Befehlssatz sowie die Layouts der Platinen von PECAZ,
Testboard, AD Wandler und Display dargestellt. Es ist leider nur noch antiquarisch erhältlich.
EEPROM Programmiergerät
Um dem umständlichen Arbeiten mit EPROMs zu entkommen
habe ich ein kleines Programmiergerät für EEPROMs entwickelt.
Das
EEPROM hat einen entscheidenden Vorteil. Es benötigt kein UV
Licht zum Löschen, sondern wird einfach neu beschrieben.
Natürlich gibt es entsprechende Programmiergeräte zu kaufen, sie haben allerdings ihren
Preis.
Der Aufbau ist
denkbar einfach:
Dem PC wird durch Immitation der Centronicsnorm ein angeschlossener Drucker vorgespielt. Die
Binärdatei mit dem Programm für das EEPROM mit "copy xxx.bin lpt"1 in das EEPROM geschrieben. Durch einen 74HCT541 Treiber gelangen die 8 Datenbits vom PC an das EEPROM. Ein 4040 Zähler
spricht die Adressen an, ein 555 besorgt die Steuerung der Zeiten.
Bei der Einfachversion mit dem 4040 kann man bis 4 Kilobyte adressieren,
also 28C16 oder 28C32 EEPROMs, bzw. einen „halben“ 28C64.
Ich habe bei meinem Aufbau einen 4020 dazugeschaltet, das reicht dann
bis für einen 28C128.
Mein altes EEPROM Programmiergerät für 8 KB eines 28C64
Schaltbild der vereinfachten Ausführung für die "unteren" 4 KB eines 28C64 EEPROMs

EEPROM Programmiergerät für 28C16 in der erweiterten Ausführung von ferromel

Hier das Board mit Microcontroller, EEPROM und Anzeige der Ports von ferromel

Als nächstes Projekt plane ich ein
Einplatinensystem, besehend aus dem Programmiereinheit für 28 polige 28C64
EEPROMs, 8048-Microcontroller, der das frisch programmierte EEPROM verwendet
und über 2 Treiber 74 HCT541 Leuchtdioden für die beiden
Ports (8 für Port 1 und 4 für die oberen 4 Bits des Port 2).
Zusätzlich noch 2 Taster für Reset und Interupt sowie 2
Schalter für die Testeingänge T0 und T1. Falls noch Platz
ist, käme eine Single Step Schaltung auch noch dazu, um
ein Programm Schritt für Schritt ablaufen lassen zu
können.
Nach meinen
Überlegungen könnte das ganze ohne weitere Bausteine funktionieren, mit dem
Schalter wird einfach zwischen Programmiereinheit und Microcontroller gewählt.
Das Ergebnis wäre ein äußerst günstiges Entwicklersystem anschließbar an jeden DOS PC
über ein Druckerkabel (dann allerdings Centronics Stecker statt bisher 25
poliger SubD, oder noch einfacher Kabel direkt anlöten), 5 Volt Stromver-
sorgung z. B. aus einem billigen Ladegerät für MP3
Player o. ä..
8048 Befehle
CALL addr Rufe Unterprogramm auf
JMP addr Springe zu Adresse
JZ addr Springe zu Adresse wenn Akku Null ist
JNZ addr Springe zu Adresse wenn Akku nicht Null ist
JT0 addr Springe zu Adresse wenn T0 high ist
JNT0 addr Springe zu Adresse wenn T0 low ist
JT1 addr Springe zu Adresse wenn T1 high ist
JNT1 addr Springe zu Adresse wenn T1 low ist
JTF addr Springe zu Adresse wenn Timer Flag gesetzt ist
JF0 addr Springe zu Adresse wenn Flag 0 gesetzt ist
JF1 addr Springe zu Adresse wenn Flag 1 gesetzt ist
JC Springe zu Adresse wenn Carrybit gesetzt ist
JNC Springe zu Adresse wenn Carrybit nicht gesetzt
CLR A Akku löschen
CLR F0 Flag 0 löschen
CLR F1 Flag 1 löschen
CLR C Carrybit löschen
CPL A Akku invertieren
CPL F0 Flag 0 invertieren
CPL F1 Flag 1 invertieren
CPL C Carrybit invertieren
INC A Akku um 1 erhöhen
DEC A Akku um 1 erniedrigen
INC Rr Register um 1 erhöhen
DEC Rr Register um 1 erniedrigen
INC @Rr indirektes Register um 1 erniedrigen
MOV A,#data Lade Akku mit Daten
MOV A,Rr Lade Akku mit Registerwert
MOV A,@Rr Lade Akku mit Wert aus indirektem Register
MOV Rr,A Lade Register mit Akkuwert
MOV @Rr,A Lade indirektes Register mit Akkuwert
MOV Rr,#data Lade Register mit Daten
MOV @Rr,#data Lade indirektes Register mit Daten
MOV A,T Lade Akku mit Timerregisterwert
MOV T,A Lade Timerregister mit Akkuwert
MOV A,PSW Lade Akku mit Prozessorzustandswort
MOV PSW,A Bilde Prozessorzustandswort aus Akku
OUTL Pp,A Gebe Akkuinhalt auf Port 1 oder 2 aus
IN A,Pp Lese Zustand von Port 1 oder 2 in Akku ein
ANL A,Rr AND Akku mit Register
ANL A,@Rr AND Akku mit indirektem Register
ANL A,#data AND Akku mit Daten
ANL Pp,#data AND Port 1 oder 2 mit Daten
ORL A,Rr OR Akku mit Register
ORL A,@Rr OR Akku mit indirektem Register
ORL A,#data OR Akku mit Daten
ORL Pp,#data OR Port 1 oder 2 mit Daten
XRL A,Rr XOR Akku mit Register
XRL A,@Rr XOR Akku mit indirektem Register
XRL A,#data XOR Akku mit Daten
STRT T Timer starten
STRT CNT Counter starten
STOP TCNT Timer/Counter anhalten
XCH A,Rr Akku mit Register tauschen
XCH A,@Rr Akku mit indirektem Register tauschen
NOP No Operation
RET Rücksprung ohne PSW Restore
RETR Rücksprung mit PSW Restore
SEL RB0 Select Register Bank 0
SEL RB1 Select Register Bank 1
SEL MB0 Select Speicher Bank 0
SEL MB1 Select Speicher Bank 1
EN I Enable Interupt
DIS I Disable Interupt
EN TCNTI Enable Timer/Counter Interupt
DIS TCNTI Disable Timer/Counter Interupt
ENT0 CLK Taktausgabe auf T0
DJNZ Rr,addr DEC Register, wenn nicht Null, JMP Adresse
SWAP A Austausch der Akku Nibbles
DA A Dezimaleinstellung des Akku
ADD A,Rr Addiere Registerinhalt zum Akku
ADD A,@Rr Addiere Inhalt von indirektem Register zum Akku
ADD A,#data Addiere Daten zum Akku
ADDC A,Rr ADD A,Rr und Carrybit
ADDC A,@Rr ADD A,@Rr und Carrybit
ADDC A,#data ADD A,#data und Carrybit
RL A Linksverschiebung ohne Carrybit
RR A Rechtsverschiebung ohne Carrybit
RLC A Linksverschiebung mit Carrybit
RRC A Rechtsverschiebung mit Carrybit
Links:
MCS-48 bei Wikipedia
Elektronikbastelseite von ferromel
Reichelt Elektronik Versand
Startseite