O-M-S-U MCS-BASIC 52 V1.1 to V1.3 mit einer AT89S52 MCU
Ein alter Mann steht auf und ist ein Veteran mit einer langen Tradition. Mit einem AT89S52 und MCS-BASIC 52 V1.3 wird wieder ein Neuanfang. gemacht.
An Old Man Stands Up and is an veteran with a long tradition. With an AT89S52 and MCS-BASIC 52 V1.3, we made a fresh restart.
O.ld M.an S.tands U.p
O.S.M.U. beschäftigt sich nicht damit, etwas bahnbrechend neues zu entwickeln, sondern “altes“ und bewährtes wieder auf den Stand der heutigen Zeit zu bringen. Mit diesem Projekt soll gezeigt werden, dass Technik von “gestern” auch heute noch gewinnbringend für reale Projekte und zur Ausbildung mit viel Spaß eingesetzt werden kann. Mit einer Hochspache die einfach, verständlich und schnell zu erlernen ist und die einer ganzen Generation den Weg zum Computer geebnet hat. Wer dann noch ein wenig Freude an “retro” hat der ist hier genau richtig. Im Internet findet man unzählige Beschreibungen von MCS-BASIC-52. Einige davon sind schon älter und die angegebenen Links funktionieren nicht mehr oder nicht richtig. Daher habe ich die aus meiner Sicht, besten im Anhang zusammengetragen ohne den Anspruch auf Vollständigkeit zu erheben. Ein guter Anlauf Punk sind auch hier wieder die Seiten von Elektor. Zu diesem Thema kann ich das Buch “Mikrocontroller-Praxis ISBN 3-928051-58-X” von Andreas Roßrucker, 1994 im Elektor-Verlag erschinen wärmstens empfehlen. Leider ist dieses Buch nur noch sehr schwer bzw. gar nicht mehr erhältlich. Vielleicht kann der Elektor-Verlag sich ja dazu durchringen solche alten aber sehr gut gemachten Bücher als PDF zum Kauf anzubieten. Es ist didaktisch hervorragend aufgebaut und kann als Leitfaden für die Ausbildung, wie auch als Nachschlagewerk eingesetzt werden.
Die Entwicklungsziele der Hardware im Überblick
- Zuverlässigkeit und Übersichtlichkeit.
- Gute Verfügbarkeit der Bauteile.
- Einfacher Zugang zu allen wichtigen Signalen.
- Leichter Aufbau auch für Anfänger.
- Einfach zu warten und zu reparieren.
- Kompatibel mit MCS-BASIC-52 V1.1 bis V1.3.
- Leichte Erweiterbarkeit und großer Funktionsumfang.
Zuverlässigkeit und Übersichtlichkeit
Die Schaltung ist auf einer Leiterkarte im EURO-Format untergebracht. Die einzelnen Funktiongruppen wurden klar unterteilt und über den Bestückdruck beschriftet, sodass sich auch ein Neuling sehr schnell auf der Leiterkarte zurecht findet. Die Schaltung selbst beruht auf dem Compuboard (Elektor-Ausgabe April 1991) von Hubert Reelsen, die auch in dem Elektor Buch (Mikrocontroller-Praxis) aus dem Jahr 1994 von Andreas Roßrucker verwendet wurde. Die Schaltung von damals war gut durchdacht und ist praxiserpropt. Das Schaltungsdesign wurde nur um die notwendigen Anpassungen und Zusätze erweitert. Die Leiterkarte besitzt einen eigenen DC/DC Wandler, dieser wurde so ausgelegt, dass er für die Schaltung mehr als ausreichend dimensioniert ist. Mit einem Eingansspannungsbereich von 9V bis 35V und einer Ausgangsspannung von 5V bei max. 500mA ist genügend Reserve für eigene Erweiterungen vorhanden. Das O.M.S.U Board benötigt bei voller Bestückung maximal 80mA.
Gute Verfügbarkeit der Bauteile
Die Bauteile sind bei den üblichen Händlern verfügbar. Man bekommt nicht bei einem Händler alles, aber man kann sich die benötigten Bauteile über die verschiedene Quellen gut zusammenstellen. Der 82C55 ist in der PDIP Version bei Ebay erhältlich und wurde dort vom Autor auch schon von verschiedenen Anbietern, ohne entäuscht zu werden bezogen.
Einfacher Zugang zu allen wichtigen Signalen.
Alle Signalleitungen sind durch die Buchsenleisten oder die Bauteile selbst leicht und problemlos zugänglich, sodass es keine Herausforderung ist Messungen durchzuführen. Dies ist besonder bei der Ausbildung aber auch bei der Entwicklung eigener Schaltungen von Vorteil.
Leichter Aufbau auch für Anfänger
Die durchgängige Verwendung bedrahteter Bauteile erweist sich besonders für Löt-Anfänger als besonders günstig. Zudem sind alle verwendeten IC’s mit präzisions Sockeln ausgeführt, sodass ein überhitzen der Bauteile durch zu langes Löten verhindert wird.
Kompatibel mit MCS-BASIC-52 V1.1 bis V1.3
Das Schaltungsdesign wurde dahingehend verändert, dass die Schaltung sowohl mit dem MCS-BASIC-52 V1.1, V1.2 sowie auch mit der in Elektor veröffentlichten Version 1.3 von Detlef Wulf und Hans-Jürgen Böhling voll kompatibel ist. Um die Kompatibilität zwischen den Versionen zu gewährleisten ist lediglich eine Steckbrücke (JUMPER) umzustecken. Alle Versionen des
MCS-BASIC-52 sollten sich für den vollen Funktionsumfang im internen 8K großen Flash-Speicher des AT89S52 befinden. Da der AT89S52 jedoch über eine ISP-Schnittstelle verfügt und die Versionen im Intel-HEX bzw. im Binären Format vorliegen ist diese Hürde mitlerweile sehr einfach zu nehmen. Im Internet findet man hierzu einige gute Beschreibungen. Ich arbeite selbst auch an einem einfachgehaltenen How To, sodass dieser Vorgang auch für Anfänger noch einfacher werden wird.
Leichte Erweiterbarkeit und großer Funktionsumfang
Alle notwendigen und wichtigen Signale wurden (ähnlich wie bei den Arduino-Boards) auf Buchsenleisten an den langen Seiten der Leiterkarte herausgeführt. Somit ist die Erweiterung durch Sandwitch-Bauweise sehr leicht zu lösen und es können auch funktionssichere Geräte für eigene Projekte entworfen werden. Die Schaltung bietet voll bestückt noch einiges an Erweiterungsmöglichkeiten mehr. Dies umfasst von der Echtzeituhr mit NV-RAM einen 82C55 z.B. für ein LCD-Textdisplay mit Tastern auch den vollständig herausgeführten Adress- und Daten-Bus mit zusätzlichem Adress-Decoder, was den Aufwand für eigene I/O-Erweiterungen stark reduziert. Auch eine in Software gelöste I2C-Schnittstelle kann das Board anbieten, wenn die von Detlef Wulf und Hans-Jürgen Böhling geschriebene Erweiterung im externen Flash hinterlegt wurde. Die original Erweiterung wurde vom Autor nur ein klein wenig an die O.M.S.U. Hardware angepasst und liegt mit Quellcode und als HEX-Datei vor. Durch diese Software-Erweiterung erhält man dann die Möglichkeit die beliebte i2C Schnittstelle, direkt aus BASIC anzusprechen.
Speicheraufteilung
Der interne Codespeicher besteht aus dem internen FLASH des 8052-BASIC, das die Adressen von 0 bis 1FFFh verwendet. Zusätzlich ist ein externer Datenspeicher (RAM) beginnend bei 0 Hex erforderlich. BASIC-52 reserviert die ersten 512 Bytes (0-1FFh) des RAM für den eigenen Gebrauch und speichert direkt darüber das aktuelle BASIC-52 Benutzerprogramm ab der Adresse 200h. Die Speicherzuordnung zeigt einen 32K-RAM, der den gesamten Bereich von 0 bis 7FFFh nutzt. (Der 8052 verfügt außerdem über 256 Bytes intern Datenspeicher, der in der Memory-Map nicht dargestellt wird.) Ein 16K-Block kombiniert Code-/Datenspeicher und ist ab 8000h – BFFFh reserviert. Über diesem Block des Code-/Datenspeicher, befindet sich der I/O-Bereich der von C000h bis FFFFh verläuft. Im Bereich von C000h bis DFFFh liegt der eigentliche Bereich der für I/O Schnittstellen vorgesehen ist. Dieser Bereich ist zu Teilen auch schon aus decodiert (weiter unten mehr) und wird mit eigenen Anschlüssen am Erweiterungsport herausgeführt. Ab der Adresse 0E000h bis FFFFh im I/O-Bereich ist der NVRAM vorgesehen der auch (je nach Baustein) eine Echtzeituhr enthält. Lässt man diesen NVRAM weg steht auch dieser I/O-Bereich dem Anwender vollständig zur Verfügung.
I/O Adressen Belegung im Detail
Freier I/O Adressen-Bereich (auf O.M.S.U. nicht decodiert)
Frei für eigene I/O 0C000Hex Bin 1100000000000000
Frei für eigene I/O 0C001Hex Bin 1100000000000001
Frei für eigene I/O 0C002Hex Bin 1100000000000010
Frei für eigene I/O 0C003Hex Bin 1100000000000011
Frei für eigene I/O 0C004Hex Bin 1100000000000100
Frei für eigene I/O 0C005Hex Bin 1100000000000101
Frei für eigene I/O 0C006Hex Bin 1100000000000110
Frei für eigene I/O 0C007Hex Bin 1100000000000111
Compactflash-Interface Adressen (auf O.M.S.U. nicht decodiert Elektor 5/2003)
P8255A Adresse Port A 0C008Hex Bin 1100000000001000
P8255A Adresse Port B 0C009Hex Bin 1100000000001001
P8255A Adresse Port C 0C00AHex Bin 1100000000001010
P8255A Adresse Control 0C00BHex Bin 1100000000001011
Freier I/O Adressen-Bereich (auf O.M.S.U. nicht decodiert)
Frei für eigene I/O 0C00CHex Bin 1100000000000100
…………………………………………………………………………………..
…………………………………………………………………………………..
…………………………………………………………………………………..
Frei für eigene I/O 0C01FHex Bin 1100000000011111
Freier I/O Adressen-Bereich (auf O.M.S.U. nicht decodiert) Fortsetzung
Frei für eigene I/O 0C040Hex Bin 1100000001000000
…………………………………………………………………………………..
…………………………………………………………………………………..
…………………………………………………………………………………..
…………………………………………………………………………………..
…………………………………………………………………………………..
…………………………………………………………………………………..
…………………………………………………………………………………..
…………………………………………………………………………………..
…………………………………………………………………………………..
…………………………………………………………………………………..
…………………………………………………………………………………..
…………………………………………………………………………………..
Frei für eigene I/O 0DFFFHex Bin 1101111111111111
LCD und Taster-Interface Adressen (auf O.M.S.U. decodiert)
P8255A auf O.M.S.U. CPU-BOARD
P8255A Adresse Port A 0C020Hex Bin 1100000000100000
P8255A Adresse Port B 0C021Hex Bin 1100000000100001
P8255A Adresse Port C 0C022Hex Bin 1100000000100010
P8255A Adresse Control 0C023Hex Bin 1100000000100011
Freier I/O Adressen-Bereich (auf O.M.S.U. decodiert)
Frei für eigene I/O 0C024Hex Bin 1100000000100100
Frei für eigene I/O 0C025Hex Bin 1100000000100101
Frei für eigene I/O 0C026Hex Bin 1100000000100110
Frei für eigene I/O 0C027Hex Bin 1100000000100111
Frei für eigene I/O 0C028Hex Bin 1100000000101000
Frei für eigene I/O 0C029Hex Bin 1100000000101001
Frei für eigene I/O 0C02AHex Bin 1100000000101010
Frei für eigene I/O 0C02BHex Bin 1100000000101011
Frei für eigene I/O 0C02CHex Bin 1100000000101100
Frei für eigene I/O 0C02DHex Bin 1100000000101101
Frei für eigene I/O 0C02EHex Bin 1100000000101110
Frei für eigene I/O 0C02FHex Bin 1100000000101111
Frei für eigene I/O 0C030Hex Bin 1100000000110000
Frei für eigene I/O 0C031Hex Bin 1100000000110001
Frei für eigene I/O 0C032Hex Bin 1100000000110010
Frei für eigene I/O 0C033Hex Bin 1100000000110011
Frei für eigene I/O 0C034Hex Bin 1100000000110100
Frei für eigene I/O 0C035Hex Bin 1100000000110101
Frei für eigene I/O 0C036Hex Bin 1100000000110110
Frei für eigene I/O 0C037Hex Bin 1100000000110111
Frei für eigene I/O 0C038Hex Bin 1100000000111000
Frei für eigene I/O 0C039Hex Bin 1100000000111001
Frei für eigene I/O 0C03AHex Bin 1100000000111010
Frei für eigene I/O 0C03BHex Bin 1100000000111011
Frei für eigene I/O 0C03CHex Bin 1100000000111100
Frei für eigene I/O 0C03DHex Bin 1100000000111101
Frei für eigene I/O 0C03EHex Bin 1100000000111120
Frei für eigene I/O 0C03FHex Bin 1100000000111111
NVRAM Adressen-Bereich (auf O.M.S.U. decodiert)
NVRAM 0E000Hex Bin 1110000000000000
…………………………………………………………………………………..
…………………………………………………………………………………..
NVRAM 0FFFFHex Bin 1111111111111111
BASIC-Beispiel Echtzeituhr
REM *********************************************
REM * TESTPROGRAMM INTERNE UHR TIMER 0
REM * MIT ECHTZEITUHR M48T18 ZEIT
REM * QUARZ XTAL=11059200
REM * Die Zeit und das Datum werden manuell ein-
REM * gegeben und in Echtzeituhr gespeichert. Bei
REM * Spannungsausfall laeuft die Echtzeituhr
REM * weiter (Gangreserve). Wird das System wieder
REM * eingeschaltet, wird die interne Uhr TIMER 0
REM * ueber die Echtzeituhr (M48T18) wieder ge-
REM * stellt und laeuft ohne Zeitverlust weiter.
REM * Die Echtzeituhr muss mindestens vorher ge-
REM * stellt worden sein, damit die Funktion her-
REM * gestellt werden kann.
REM * Das Schaltjahr wird von der Software
REM * beruecksichtigt.
REM *********************************************
REM ———- HINTERGRUND-UHR-SETUP ————
5 BLED=PORT1
10 INPUT „ZEIT EINSTELLEN? (JA=7)“ X
20 IF X<>7 THEN GOTO 90
30 INPUT „ZEIT EINGEBEN IN H,M,S > “ HR,MIN,S
40 INPUT „DATUM EINGEBEN IN D,M,Y > “ DAY,M,YEAR
50 INPUT „TAG DER WOCHE (1=MONTAG) > “ WDAY
60 PRINT:PRINT:PRINT:PRINT
80 GOSUB 61400
90 CLOCK0:TIME = 0:ONTIME 1,60000
95 GOSUB 61200: CLOCK1
REM *********************************************
REM ———————————————
REM ————- HAUPTPROGRAMM —————–
REM ———————————————
REM *********************************************
100 PRINT CHR(27),: PRINT „[1J“
120 PRINT:PRINT:PRINT:PRINT
130 PRINT “ DATUM“,DAY,“.“,M,“.“,YEAR,
140 PRINT “ ZEIT“,HR,“:“,MIN,“:“,S, CR,
160 FOR I = 1 TO 200: NEXT I
170 GOTO 130
REM ———– HAUPTPROGRAMM ENDE ————–
REM ———————————————
REM *********************************************
REM * ONTIME INTERRUPT HANDLER
REM *********************************************
60000 TIME=0
60010 ONTIME 1,60000
60020 GOSUB 61000
60030 RETI
REM *********************************************
REM * ZEIT UND DATUM BERECHNEN
REM *********************************************
61000 BLED=BLED.XOR.32:PORT1=BLED
61010 S=S+1
61020 IF S>59 THEN S=0:MIN=MIN+1
61030 IF MIN>59 THEN MIN=0:HR=HR+1:GOSUB 61200
61040 IF HR<24 THEN RETURN
61050 HR=0:WDAY=WDAY+1
61060 IF WDAY>7 THEN WDAY=1
61070 DAY=DAY+1
61080 IF DAY>29.AND.M=2 THEN DAY=1:M=M+1
61090 IF DAY>28.AND.M=2.AND.(4*INT(YEAR/4)<>YEAR)THEN DAY=1:M=M+1
61100 IF DAY=31.AND.(M=4.OR.M=6.OR.M=9.OR.M=11)THEN DAY=1:M=M+1
61110 IF DAY>31 THEN DAY=1:M=M+1
61120 IF M>12 THEN M=1:YEAR=YEAR+1
61130 IF YEAR>99 THEN YEAR=0
61140 RETURN
REM *********************************************
REM * UHR VON M48T18 AUSLESEN
REM * UND INTERNE UHR STELLEN
REM *********************************************
REM ——– STATUS AUF READ SETZEN ————-
61200 STAT_C=XBY(0FFF8H):STAT_C=STAT_C.OR.64:XBY(0FFF8H)=STAT_C
REM ——— BCD SEKUNDEN AUSLESEN ————-
61210 BCD=XBY((0FFF8H+1H))
REM – BCD >=128 STOP BIT GESETZT ST-BIT LOESCHEN –
61220 IF BCD >=128 THEN XBY((0FFF8H+1H))=0
61230 GOSUB 61350:S=DEZ
REM ——— BCD MINUTEN AUSLESEN ————–
61240 BCD=XBY((0FFF8H+2H)):GOSUB 61350:MIN=DEZ
REM ——— BCD STUNDEN AUSLESEN ————–
61250 BCD=XBY((0FFF8H+3H)):GOSUB 61350:HR=DEZ
REM ——– BCD WOCHENTAG AUSLESEN ————-
61260 BCD=XBY((0FFF8H+4H)):BCD=BCD.AND.7:GOSUB 61350:WDAY=DEZ
REM ———— BCD TAG AUSLESEN —————
61270 BCD=XBY((0FFF8H+5H)):GOSUB 61350:DAY=DEZ
REM ———– BCD MONAT AUSLESEN ————–
61280 BCD=XBY((0FFF8H+6H)):GOSUB 61350:M=DEZ
REM ———— BCD JAHR AUSLESEN ————–
61290 BCD=XBY((0FFF8H+7H)):GOSUB 61350:YEAR=DEZ
REM ——– STATUS AUF READ LOESCHEN ———–
61300 STAT_C=XBY(0FFF8H):STAT_C=STAT_C.AND.63:XBY(0FFF8H)=STAT_C
61310 RETURN
REM *********************************************
REM * BCD ZU DEZIMAL UMRECHNEN
REM *********************************************
61350 DEZ=0:IF 128=(BCD.AND.128) THEN DEZ=DEZ+8
61355 IF 64=(BCD.AND.64) THEN DEZ=DEZ+4
61360 IF 32=(BCD.AND.32) THEN DEZ=DEZ+2
61365 IF 16=(BCD.AND.16) THEN DEZ=DEZ+1
61370 DEZ=DEZ*10:DEZ=DEZ+(BCD.AND.15)
61390 RETURN
REM *********************************************
REM * UHR VON M48T18 STELLEN
REM * UND INTERNE UHR STELLEN
REM *********************************************
REM ——– STATUS AUF WRITE SETZEN ————
61400 STAT_C=XBY(0FFF8H):STAT_C=STAT_C.OR.128:XBY(0FFF8H)=STAT_C
REM ——— BCD SEKUNDEN STELLEN ————–
61410 DEZ=S:GOSUB 61500:XBY((0FFF8H+1H))=BCD
REM ———- BCD MINUTEN STELLEN ————–
61440 DEZ=MIN:GOSUB 61500:XBY((0FFF8H+2H))=BCD
REM ———- BCD STUNDEN STELLEN ————–
61450 DEZ=HR:GOSUB 61500:XBY((0FFF8H+3H))=BCD
REM ——— BCD WOCHENTAG STELLEN ————-
61460 DEZ=WDAY:GOSUB 61500:XBY((0FFF8H+4H))=BCD
REM ———— BCD TAG STELLEN —————-
61470 DEZ=DAY:GOSUB 61500:XBY((0FFF8H+5H))=BCD
REM ———– BCD MONAT STELLEN —————
61480 DEZ=M:GOSUB 61500:XBY((0FFF8H+6H))=BCD
REM ———— BCD JAHR STELLEN —————
61490 DEZ=YEAR:GOSUB 61500:XBY((0FFF8H+7H))=BCD
REM ——– STATUS AUF WRITE LOESCHEN ———-
61495 STAT_C=XBY(0FFF8H):STAT_C=STAT_C.AND.63:XBY(0FFF8H)=STAT_C
61496 RETURN
REM ********************************************
REM * DEZIMAL ZU BCD UMRECHNEN
REM ********************************************
61500 VAL_1=INT(DEZ/10):VAL_2=(DEZ/10-VAL_1)*10
61510 BCD=VAL_1*16+VAL_2
61520 RETURN
LINKS
https://www.dos4ever.com/8031board/8031board.html
https://www.dos4ever.com/8031board/8031board.html#appendixB
https://www.elektormagazine.com/magazine/elektor-200102/16965
http://janaxelson.com/microcib.htm Idee Book freies Buch des Autors
Elektor Artikel
https://www.elektormagazine.de/magazine/elektor-198706/48373 Elektor 8051/8052 Basic-Prozessor (Grundlagen)
https://www.elektormagazine.com/magazine/elektor-200102/16965 Elektor MCS BASIC-52 VI 3
https://www.elektormagazine.com/magazine/elektor-199802/34046 Elektor MCS-52 BASIC Language Quick Reference
https://www.elektormagazine.com/magazine/elektor-199110/32458 Elektor Upgrade for MCS BASIC-52 V1.1 (1):
https://www.elektormagazine.com/magazine/elektor-199111/32480 Elektor Upgrade for MCS BASIC-52 V1.1 (2)
https://www.elektormagazine.com/magazine/elektor-200002/16710 Elektor BASIC-537 a high-level language for the 80535-537
https://www.elektormagazine.com/magazine/elektor-198711/47252 Elektor Basic Computer
https://www.elektormagazine.com/magazine/elektor-200306/17484 Elektor CompactFlash (CF) Interface
https://www.elektormagazine.de/magazine/elektor-199802/31426 80C32-BASIC-Steuercomputer (1)
https://www.elektormagazine.de/magazine/elektor-199803/31454 80C32-BASIC-Steuercomputer (2)
https://www.elektormagazine.de/magazine/elektor-199906/31856 Elektor EEPROM fuer BASIC-Steuercomputer
https://www.elektormagazine.de/magazine/elektor-199312/30358 Elektor Interrupterweiterung fuer 8052-AH-BASIC
ASM51
http://ustr.sancaleve.com/files/download.shtml
http://ustr.sancaleve.com/
Beschaffung und Datenblaetter
https://www.futurlec.com/
Compiler
http://sdcc.sourceforge.net/
Putty auf Pi
https://blog.protoneer.co.nz/install-and-run-putty-on-your-raspberry-pi/
BUY// Retro elektronica
https://www.heinpragt.nl
INFO UND FOREN
https://mevihub.com/category/8051/
http://www.8052mcu.com/
http://www.nomad.ee/micros/8052core.shtml
http://www.nomad.ee/micros/index.shtml
http://www.efton.sk/basic/index.htm
https://web.archive.org/web/20050311213802/http://www.kmitl.ac.th/~kswichit/pgm89_web/Pgm89.html