Elektor
2/2000
Das angepasste BASIC-537 hat fol-
gende Eigenschaften:
➧ Übertragungsrate 9600 Baud
bei 12 MHz
➧ 32 K RAM
➧ 6 neue Befehle
➧ Direkte Abfrage des AD-Wandlers
➧ LCD-Unterstützung
(Adresse FFC0h)
➧ Autostart-Funktion
Der BASIC-Interpreter belegt den
Adressbereich 0000 bis 403F im EPROM
und setzt 32 K RAM ebenfalls ab
Adresse 0000 voraus. Bei den 80537-
Boards müssen einige Jumperstellun-
gen (siehe Tabelle 1) beachtet werden,
damit die Adressbereiche stimmen.
Zum Betrieb des BASIC-Interpreters ist
im Prinzip nur ein beliebiges Terminal-
programm mit 9600 Baud erforderlich.
Nach dem Einschalten des Systems
meldet sich das BASIC mit einer Ein-
schaltmeldung:
Der am häufigsten ein-
gesetzte BASIC-Dialekt
für Mikrocontroller, Intels
8052AH-BASIC, ist nicht
ohne weiteres für neuere
8051-Derivate geeignet.
Wir stellen einen modifi-
zierten Interpreter vor,
der auch 80535/537-
Mikrocontroller unter-
stützt, wie sie zuletzt in
den Elektor-Projekten
80C537-Compuboard
und 537-Light-Board ein-
gesetzt wurden.
62
Entwurf von Burkhard Kainka
Hochsprache für 80535/537
MIKROPROZESSOREN
BASIC-537
Wer aber einmal versucht hat, einen
BASIC52-Interpreter im EPROM in ein
80535- oder 80537-System einzusetzen,
der wird eine herbe Enttäuschung
erlebt haben, denn die Initialisierung
der seriellen Schnittstelle verwendet
Eigenschaften des 8052, die nicht in
gleicher Weise vom 80535 übernom-
men wurden. Schuld ist der Timer 2,
der nicht 8052-kompatibel ist.
Mit einer neuen Reset-Routine aber
können auch diese Prozessoren einge-
setzt werden. Der BASIC-52-Interpre-
ter sieht bereits den Aufruf einer eige-
nen Reset-Routine und die Erweite-
rung mit eigenen Befehlen vor.
Deshalb konnten Anpassungen
geschrieben werden, die nun auch mit
den neuen Mikrocontrollern laufen.
Speziell werden zwei neuere Boards
unterstützt, die bereits in Elektor vor-
gestellt wurden, nämlich das 80C537-
Compuboard und das neue 537-Light-
Board.
Ursprünglich wurde der Interpreter
BASIC-52 von Intel in Form eines
maskenprogrammierten Mikrocon-
trollers mit der Bezeichnung 8052AH-
BASIC geliefert. Der Interpreter
erkennt beim Start automatisch das
verfügbare RAM und die verwendete
Baudrate des angeschlossenen Termi-
nals. Außerdem gibt es Autostart-
Funktionen, um ein Programm auto-
matisch mit dem Einschalten des Pro-
zessors auszuführen. Sogar das
Programmieren eines EPROMs ist im
System möglich, solange man den ori-
ginalen Intel-Chip verwendet.
Inzwischen wird der 8052AH-Basic
nicht mehr hergestellt, aber das Pro-
gramm ist freigegeben, so dass man es
nun auch legal in einem EPROM ver-
wenden kann. Mit einem 80C32-Pro-
zessor erhält man auf diese Weise ein
stromsparendes BASIC-System. Nur die
Programmierfunktion des ursprüngli-
chen Chips geht dabei verloren.
MCS-51(tm) BASIC V1.1 /
ES537
READY
>
Nun kann man in gewohnter Weise
BASIC-Zeilen mit Zeilennummern ein-
geben. Jedes Zeichen wird über die
serielle Schnittstelle zum Terminal
zurückgesandt. Mit dem Zeilenende
übersetzt der Interpreter die gesamte
Zeile in das interne Token-Format und
legt sie im RAM ab. Mit RUN kann ein
Programm gestartet werden, mit Ctrl-
C lässt es sich jederzeit unterbrechen.
LIST sendet das komplette Listing zum
Terminal. Mit NEW löscht man den
Speicher.
Statt eines einfachen Terminal- kann
auch das Windows-Programm
BASIC.EXE eingesetzt werden, das sich
ebenfalls auf der Diskette befindet. Es
handelt sich um ein kombiniertes Ter-
minal- und Editorprogramm speziell
für BASIC-537.
Daneben findet man auf der Diskette
eine Befehlsübersicht (BASIC52.HLP),
eine Initialisierungsdatei (SBASIC.INI),
die Binärdatei des EPROM-Inhalts
(BASIC537.BIN) sowie Beispielpro-
gramme mit der Extension BAS.
D
E R
P
R O G R A M M
- E
D I T O R
Beim ersten Start ist BASIC.EXE für
COM2 eingestellt. Im Menü Optio-
nen/RS232 lässt sich eine andere
Schnittstelle auswählen. Die Einstel-
lung wird beim Beenden des Pro-
gramms in der Datei SBASIC.INI
gespeichert.
Beim Einschalten des Boards meldet
sich der BASIC-537-Interpreter mit sei-
ner Einschaltmeldung, das erste Pro-
gramm kann eingegeben und gestartet
werden. Das Beispielprogramm
Test1.bas führt Portausgaben an Port
P1 durch und verwendet den origina-
len BASIC-52-Befehl PORT1.
10 REM Portausgaben
20 FOR N=0 TO 255
30 PORT1=N
40 FOR I=1 TO 200 : NEXT I
50 NEXT N
60 GOTO 20
RUN
BASIC.EXE hat zwei Textfenster. Im
oberen Fenster arbeitet ein Texteditor
mit vielen Editierfunktionen. In das
untere Fenster werden alle vom Mikro-
controller gesendeten Zeichen
geschrieben. Jedesmal, wenn im Editor
<RETURN> gedrückt wird, wird die
komplette Zeile zum Controller
geschickt.
Das Echo erscheint im Terminalfenster.
Der Benutzer kann jede Zeile vor der
Übertragung beliebig editieren. Dies
gilt auch für Zeilen, die bereits weiter
oben im Text stehen und die nachträg-
lich noch einmal geändert werden sol-
len. Im Terminalfenster lässt sich
jeweils beobachten, ob eine Zeile ange-
nommen wurde oder eine Fehlermel-
dung auslöst. Der Benutzer kann aber
auch das Terminalfenster aktivieren
und dort Text eingeben, der zeichen-
weise übertragen wird.
Spezielle Funktionen des Programms
lassen sich über das Menü Programm
aufrufen: RUN, LIST, BREAK, CONTI-
NUE, NEW als Befehle für den Inter-
preter im Mikrocontroller und CLS, um
den Inhalt des Terminalfensters zu
löschen. Ein fertig entwickeltes Pro-
gramm holt man mit LIST in das Edi-
torfenster und speichert es von dort
auf dem Datenträger.
Natürlich können neben Programm-
zeilen auch Befehle wie NEW, LIST,
RUN und so weiter direkt über die
Tastatur eingegeben werden. Zum
Testen können direkte Abfragen erfol-
gen wie etwa PRINT PORT1. Ein
Besonderheit des Gesamtsystems ist es,
dass geladene Programme andere,
schon im Controller vorhandene Pro-
gramme nur insoweit überschreiben,
wie sie gleiche Zeilennummern erset-
zen. Man kann daher eine Sammlung
von Unterprogrammen anlegen, die
bei Bedarf hinzugeladen werden. Um
ganz neu anzufangen, muss vor dem
Laden eines Programms NEW einge-
geben werden.
Programme werden über Datei/Öffnen
geladen. Zuvor sollte ein bereits lau-
fendes Programm mit Programm/Break
gestoppt und mit Programm/New aus
dem System entfernt werden. Der Pro-
grammtext erscheint in einem neuen
Editor- und parallel auch im Terminal-
fenster, wenn der Interpreter bereit
war. Es können mehrere Editorfenster
gleichzeitig geöffnet sein, so dass man
Programmteile hin und her kopieren
kann.
B
E F E H L S Ü B E R S I C H T
Tabelle 2 nennt die wichtigsten Befehle
und Funktionen von BASIC-537. Zahl-
reiche Sonderfuntionen sind speziell
an die Umgebung des Mikrocontrollers
angepasst. Einige originale BASIC52-
Befehle sind mit dem erweiterten
BASIC nicht nutzbar und werden hier
nicht aufgeführt. Vier neue Befehle
wurden speziell für den 80537 hinzu-
gefügt.
Der Messbereich der zwölf möglichen
Analogeingänge beträgt 0...5 V, lässt
sich jedoch mit dem Befehls DAPR, der
einen Byte-Parameter in das gleichna-
mige Prozessorregister schreibt, in wei-
ten Grenzen verändern. Für jede Mes-
sung kann ein Steuerparameter ange-
geben werden, wobei jeweils eine
untere und eine obere Grenze durch
einen 4-Bit-Parameter festgelegt sind,
die zusammen einen Byte-Parameter
bilden. Die Bits 0...3 legen die untere
Grenze als Vielfaches von 5 V/16 fest,
Bits 4...7 ebenso die obere Grenze.
Beide Referenzspannungen müssen
einen Mindestabstand von 1,25 V ein-
halten. So bewirkt zum Beispiel 84
H
den Messbereich 1,25...2,5 V. Eine Aus-
nahme ist der Wert 00
H
, mit dem man
den Bereich 0...5 V vorgibt.
Mit SFR und WrSFR lassen sich alle
speziellen Hardwarefunktionen des
80C537 verwenden, so dass man auf
die beiden seriellen Schnittstellen, die
Timer, alle zusätzlichen Ports und so
weiter zugreifen kann. Der freie
Zugriff auf alle Spezial-Funktionsregi-
ster stellt für einen Interpreter eine
besondere Herausforderung dar, da
8051-Derivate nur die direkte Adres-
sierung (etwa über mov 90h, A) erlau-
63
Elektor
2/2000
80C537-Compuboard
➧ IC2 wird mit dem BASIC537-
EPROM bestückt.
➧ IC4 erhält ein 32-K-RAM
➧ IC5 und IC5 bleiben frei
➧ Alle 6 Jumper J1A werden mit
J1C verbunden
(Stand Alone Modus)
Einstellungen für das
537-Light-Board
➧ J7:1-2 (12 MHz)
➧ J1A bis 1C: 1-2
(Stand-Alone-Betrieb)
➧ Schalter S1: RUN
Tabelle 1. Notwendige
Einstellungen der 537-
Boards
Anzeige
ben. Die SFR-Adresse kann also nicht
in einem anderen Register übergeben
werden. Ein Compiler hat damit keine
Probleme, weil die Adresse fest kodiert
Für jede Adresse im Bereich 128 bis 255
gibt es zwei kleine Unterprogramme
zum Lesen und zum Schreiben. Wenn
der Interpreter auf einen SFR- oder
WrSFR-Befehl stößt, wird eine Sprung-
adresse berechnet, die in das richtige
Unterprogramm führt. Damit ist der
erweiterte Interpreter sogar für solche
Controller gerüstet, die es jetzt noch
gar nicht gibt.
Auf der Programmdiskette befindet
sich die Textdatei Beispielprogramme, die
den Gebrauch der spezifischen Befehle
des Interpreters erläutert.
L C D - A
N S T E U E R U N G
BASIC-52 kennt die Möglichkeit, Aus-
gaben von der seriellen Schnittstelle
auf eine eigene Ausgaberoutine umzu-
lenken. Sie wird beim BASIC-537 für
die Ansteuerung eines LC-Displays
verwendet. Das Display wird weitge-
hend über die normalen Befehle ange-
sprochen. Nur ein Befehl zur Initiali-
sierung des LCDs (LCDINIT) und einer
zur Festlegung des Ausgabeposition
(CURSOR) sind hinzugekommen.
Das neue 537-Light-Board besitzt einen
Anschluss für ein LCD-Modul. Der
Anschluss liegt im Adressraum ab
FFC0
H
. Das Display wird mit dem
neuen Befehl LCDINIT initialisiert.
Danach gibt es mehrere Möglichkeiten,
Zeichen am Display auszugeben. Die
jeweilige Zeichenposition wird mit
CURSOR
angegeben.
PRINT@
schreibt direkt auf das Display. Ein Bei-
spielprogramm ist ebenfalls auf der
Diskette/im Internet vorhanden.
Ein Programm kann beliebig Ausgaben
mit PRINT zum Terminal und mit
PRINT@ zum LCD senden. Alle Aus-
gaben lassen sich mit USING formatie-
ren. Allerdings hat ein
Zeilenvorschub keine
Funktion auf das LCD.
Nach Möglichkeit sollte
also mit CURSOR immer
die jeweils gewünschte
Ausgabeposition angege-
ben werden. Es können
unterschiedliche LCDs
mit einer, zwei oder vier
Zeilen verwendet wer-
den. Das Programmbei-
spiel LCD1.BAS zeigt die
jeweilige Zeichenposition
für den Anfang jeder
Zeile.
Eine zweite Möglichkeit
besteht darin, die Ausgabe
komplett auf das LCD
umzulenken. Dazu gibt es
den Befehl UO 1. Mit UO
0 schaltet man die Ausga-
ben wieder zurück auf
das Terminal.
A
U T O S T A R T
-
F
U N K T I O N
Das originale BASIC-52
64
Elektor
2/2000
Befehle
RUN Ctrl-C CONT LIST NEW
Operatoren
+ - / * = > >= < <= <> .AND. .OR. .XOR. ABS() NOT() INT() SGN()
SQR() RND LOG() EXP() SIN() COS() TAN() ATN()
Statements
CALL DATA READ RESTORE DIM DO-WHILE DO-UNTIL END FOR-TO-STEP NEXT
GOSUB ON-GOTO ON-GOSUB IF-THEN-ELSE INPUT LET ONERR PRINT REM STOP
Erweiterte Statements des BASIC537
ONEX1
Unterprogrammaufruf nach Interrupt 1
ONTIME
Timer-Interruptaufruf
RETI
Ende eines Interrupt-Unterprogramms
PH0., PH1.
Ausgabe einer Hexadezimalzahl ohne/mit Nullstellen
PUSH, POP
Daten zum, vom Argument-Stack
STRING
Speicher für Textstrings reservieren
IDLE
Warten auf Interrupt
Spezialfunktions-Operatoren und Systemvariablen
CBY() DBY() XBY() GET IE IP PCON T2CON TCON TIME TIMER0 TIMER2 PI XTAL
MTOP LEN FREE
I/O-Handling des 80C537
AD (Kanal) (nur Lesen)
C = AD (0)
Analogeingabe (0..5V) am Eingang AD0
C = AD (11)
Analogeingabe (0... 5V) am Eingang AD11
DAPR (nur Schreiben)
DAPR = 128
Umschalten des Messbereichs auf 2,5 V
SFR (nur Lesen)
print SFR (90H)
Lesen von Spezialfunktionsregistern
WrSFR (nur Schreiben)
WrSFR 90H,255
Beschreiben von Spezialfunktionsregistern
Tabelle 2. Befehlsüber-
sicht des BASIC-537
Bild 1.
Modifikation des
80C537-Compuboards
wird, ein Interpreter jedoch muss sie
übergeben können. Diese Schwierig-
keit hat wohl dazu geführt, dass das
originale BASIC-52 zwar den freien
Zugriff auf das interne RAM, das
externe RAM und sogar den Pro-
grammbereich erlaubt, nicht aber auf
die SFRs. Da in einem 32K-Eprom
genügend Platz für die Erweiterung
ist, wurde folgender Trick angewandt:
testet nach dem Start das gesamte
RAM, löscht es und startet das Pro-
gramm, das es im zusätzlichen
EPROM erkennt. Beide 80C537-Boards
von Elektor verfügen über eine Batte-
riepufferung für das RAM, so dass das
letzte Programm beim Einschalten
noch vorhanden ist. Die Initialisierung
des BASIC wurde deshalb so geändert,
dass ein vorhandenes Programm auto-
matisch gestartet wird.
Man muss lediglich ein Programm in
den Speicher des Systems laden. Dann
kann man das serielle Kabel zum PC
abziehen und das Board allein arbeiten
lassen. Mit jedem Neustart wird das
Programm erneut ausgeführt, jeden-
falls solange die Lithiumbatterie das
RAM ausreichend versorgt, um seinen
Inhalt zu bewahren. Falls man einmal
nicht möchte, dass das System beim
nächsten Einschalten ein Programm
ausführt, dann genügt ebenfalls ein
NEW.
A
U C H F Ü R
8 0 5 3 5 !
Und dann gibt es ja auch noch die weit
verbreiteten 80535-Systeme wie das
80C535-Compuboard von Elektor.
Auch für dieses System kann der Inter-
preter verwendet werden, wenn man
einige Änderungen vornimmt.
Das System muss mit 12 MHz laufen,
damit sich eine Übertragungsrate von
9600 Baud ergibt. Alles andere funk-
tioniert auch, wenn man die vorhan-
dene Hardware des Prozessors beach-
tet. Der A/D-Wandler hat nur 8 Kanäle,
ist aber sonst kompatibel. Natürlich
besitzt der 80535 weniger Timer, Ports
und so weiter.
Intels BASIC-52 erwartet ein Daten-
RAM ab Adresse 0000. Daran ändert
auch die neue Initialisierung nichts.
Das 80C535-Compuboard verteilt
jedoch seine 32 Kilobyte RAM auf die
Adressbereiche 4000 bis 7FFF und C000
bis FFFF. Eine besondere Logik sorgt
dafür, dass das RAM in diesen Berei-
chen auch Programmcode aufnehmen
kann.
Die Änderung in Bild 1 bezeichnet ist
ganz einfach: Man nehme IC2 (4-fach
NAND-Gatter 74HC00) aus der Fas-
sung und stecke statt dessen drei
kleine Drahtbrücken ein:
➀ 3 - 4, RAM-/OE direkt an /RD
➁ 11 - 12, RAM-/CE direkt an A14
➂ 7 - 8, EPROM-/CS direkt an Masse
In dieser Konfiguration verfügt das
System über 16 Kilobyte RAM ab
Adresse 0000. Damit läuft das normale
BASIC-537. Allerdings muss man dem
System unbedingt mitteilen, dass nur
16 K vorhanden sind. Man gibt also
ein:
MTOP = 16383
Diese Zeile sollte auch am Anfang
jedes Programms stehen, denn nach
einem Neustart initialisiert der Inter-
preter zunächst 32 K. Da alle Variablen
an der oberen RAM-Grenze aufgeho-
ben werden, funktioniert BASIC-537
nur mit einer korrekten Information
über das RAM.
Falls man doch lieber das komplette
RAM mit 32 Kilobyte nutzen möchte,
müssen noch zwei weitere Änderun-
gen vorgenommen werden.
➃ Pin 1 des RAM (A14) wird nicht mit
in die Fassung gesteckt, sondern
direkt mit der Adressleitung A14
verbunden, zum Beispiel über Pin
12 der Fassung von IC2.
➄ Pin 20 des RAM (/CE) wird ebenfalls
an der Fassung vorbei verbunden,
und zwar mit der Adressleitung
A15, die sich an derselben Fassung
an Pin 1 befindet.
Nun sieht das System die vollen 32
Kilobyte des RAMs durchgehend ab
Adresse 0000. Eine Angabe des verfüg-
baren Speichers mit MTOP ist nicht
mehr erforderlich.
Das 80C535-Compuboard verfügt über
keine Batteriepufferung. Aber man hat
ja die Möglichkeit, ein so genanntes
Zeropower-RAM mit interner Batterie
einzusetzen. Damit verhält sich auch
dieses Board wie das neue 80C537-
Board. Man kann Programme bereit-
halten, die autonom starten. Aber auch
ohne diesen Luxus macht sich die
Autostart-Funktion des erweiterten
BASIC bemerkbar. Wenn nämlich bei
anliegender Betriebsspannung ein
Reset ausgeführt wird, startet das vor-
handene Programm unverzüglich.
Diese Eigenschaft ist recht nützlich,
wenn man Programme entwickelt.
Statt BREAK und RUN verwendet man
einfach die Reset-Taste.
Ein weiterer Unterschied zeigt sich bei
der möglichen Verwendung eines LC-
Displays. Das 535-Board verfügt nicht
über eine Dekodierlogik für das LCD.
Man müsste also eine entsprechende
Zusatzschaltung bauen oder alternativ
könnte man das Display an einem Port
anschließen und den 4-Bit-Modus ver-
wenden. Die Ansteuerung gelingt mit
etwas aufwendigeren BASIC-Pro-
grammen.
Alle zusätzlichen Ports des 80535 kön-
nen übrigens nicht nur über ihre SFR-
Adressen, sondern auch direkt ange-
sprochen werden. Nur für Ausgaben
gibt es die Befehle P3, P4 und P5. Man
kann den Ports direkt Ausgabewerte
zuweisen (P4=255). Porteingaben über
die Befehle InP3, InP4, InP5 und InP6
sind leider weniger komfortabel, da
man über den Ergebnis-Stack gehen
muss. Gelesene Portzustände werden
mit POP in eine Variable geholt:
InP4 : POP A : PRINT A
Die direkten Portbefehle funktionieren
übrigens auch mit dem 80C537, aller-
dings nur bis Port P6. BASIC-52 lässt
nur eine begrenzte Anzahl neuer
Schlüsselworte zu. Deshalb ist es nicht
möglich, jeder neuen Funktion einen
eigenen Namen zu geben. Man wird
also auch weiterhin die spezielle Hard-
ware des Controllers über Register-
adressen programmieren. Gerade für
Leseoperationen ist der Weg über die
Registeradresse (Print SFR(0E8h)) oft
eleganter als die Verwendung der
direkten Portkommandos.
Eigene Reset-Routinen und Befehlser-
weiterungen kann man relativ einfach
selbst schreiben, weil das BASIC-52
bereits geeignete Schnittstellen dazu
enthält. Eine genaue Beschreibung der
erforderlichen Arbeitsschritte findet
sich in der Literatur.
(000018)rg
Literatur:
B. Kainka
Erfolgreich Messen, Steuern, Regeln
mit Mikrocontrollern
Franzis-Verlag, 2. Auflage 1998
Weitere Informationen, Beispielpro-
gramme auch für 80C535-Prozesso-
ren und ein DOS-Terminal für
BASIC52 findet man im Internet auf
der Home-Page des Autors:
http://home.t-online.de/home/B.Kainka
Software
Diskette (Terminal, Hilfe, Beispiele)
EPS 996029-1
EPROM (BASIC-537-Interpreter)
EPS 996532-1
65
Elektor
2/2000
Anzeige