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
MeinTestboard: Kein Single Step, nur Taster für Reset und Interupt, Schalter für T0 und T1
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:
Mein altes EEPROM Programmiergerät
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