------------------------------------------------------------------------ **************************************************************** * MIDI8031 Mikrocontroller-Entwicklungssystem fr ATARI ST/STE * **************************************************************** Autor: Jrgen Piscol, Rastatterstr. 144, W-7500 Karlsruhe 51 Tools: Alle Programme von mir (JP) wurden mit LASER C entwickelt (bis auf TESTRAM.PRG) WICHTIGER HINWEIS: ================== ALLE PROGRAMME DIESES ENTWICKLUNGSSYSTEMS SIND PUBLIC DOMAIN! SIE DšRFEN ABER NUR UNTER DER VORAUSSETZUNG KOPIERT WERDEN, DASS KEIN TEIL DES ENTWICKLUNGSSYSTEMS VERŽNDERT WIRD! DIE VORLIEGENDE SOFTWARE WURDE MIT GR™SSTER SORGFALT ERSTELLT. TROTZDEM LASSEN SICH FEHLER NICHT MIT SICHERHEIT AUSSCHLIESSEN. DAHER KANN ICH KEIN HAFTUNG FšR IRGENDWELCHE SCHŽDEN šBERNEHMEN, DIE DURCH DEN GEBRAUCH DIESER SOFTWARE ODER HARDWARE ENTSTEHEN K™NNTEN. ------------------------------------------------------------------------ Inhalt: ======= 1.) Vorwort, šbersicht 2.) Die Hardware MIDI8031 3.) Installation, Zusatzprogramme 4.) Shell (SHELL51.PRG) 5.) Assembler (A51.TTP) 6.) Disassembler (DIS51.TTP) 7.) Execute (EX51.TTP) 8.) Monitor/Source-Level-Debugger (MON51.TTP) 9.) Interrupts des MIDI8031 10.) Tips zur Fehlersuche 11.) Die Demoprogramme 12.) Sprachsynthese mit SMSSEDIT.PRG 13.) Zusatzhardware, MIDI8031-Powerport 14.) Stromsparmechanismen des 80C31 15.) Fileformate 16.) Programme ins EPROM brennen, das OS-EPROM, EPROM Service 17.) Literatur zum Thema 1.) Vorwort, šbersicht ====================== Ein Entwicklungssystem fr Mikrocontroller gab es bis jetzt meines Wissens nach fr ATARI Computer noch nicht. Aus aktuellem Anlass habe ich die vorliegende Software/Hardware entwickelt: Sie bezieht sich auf das Mikrocontrollerprojekt in der *************************************************** * Zeitschrift ST-Computer, Ausgaben Mai-Juli 1992 * *************************************************** In diesen Ausgaben finden sie auch die Grafiken und Baupl„ne zur Hardware! Schreibfehler und andere kleinere Unzul„nglichkeiten in diesem Text bitte ich zu entschuldigen. Ich bitte sie, aus diesen Fehlerchen auch keine Rckschlsse auf die Qualit„t der Software zu ziehen: Die Software wurde von mir sehr sorgf„ltig entwickelt, da ich sie vor allem auch fr den eigenen Gebrauch konzipiert habe. Soft- und Hardware wurden monatelang intensiv ausgetestet, bevor ich mich dazu entschloss sie der Allgemeinheit ( = Public Domain) zug„nglich zu machen! Mikrocontroller? What's this? ----------------------------- Was ein Mikroprozessor ist, weiss inzwischen ja wohl jeder. Dagegen ist der Begriff Mikrocontroller den meisten weniger gel„ufig. Der Grund: Mikrocontroller sind 'Heinzelm„nnchen'; sie arbeiten fast immer im Verborgenen: in Videorecordern, Waschmaschinen, Aufzgen, in Spielzeug, Alarmanlagen und sogar in Bohrmaschinen! Mit Sicherheit gibt es heutzutage bedeutend mehr Mikrocontroller auf der Welt als "reine" Mikroprozessoren. Was aber ist der Unterschied: Zum Aufbau eines "klassischen" Computersystems werden mindestens die folgenden Komponenten ben”tigt: Mikroprozessor \ Schnittstellen \ Etwas RAM = Mikrocontroller ROM oder EPROM als Programmspeicher / Taktgenerator / Ein Mikrocontroller ist die Summe dieser 5 Teile in einem einzigen IC. Daher werden Mikrocontroller oft auch als Ein-Chip-Computer bezeichnet, was den Sachverhalt sehr genau beschreibt: Die gesamte Peripherie eines Mikrocontrollers besteht im Minimalfall aus einer Batterie und einem Quarz. Durch den massenhaften industriellen Einsatz ist der Preis fr Mikrocontroller ziemlich niedrig: Einfache Typen sind bereits fr weniger als 5.-- DM zu erhalten! Fr den Amateur sind Mikrocontroller prinzipiell nicht weniger interessant als fr die Industrie: Die Wahrscheinlichkeit, dass eine selbstgebastelte Schaltung funktioniert, sinkt eben mit der Anzahl der Bauteile. Es gibt eigentlich nur ein Haupthindernis: Ein Entwicklungssystem fr Mikrocontroller kostete bis heute mindestens 1000 DM, davon abgesehen, dass es sowas fr ATARIs bis jetzt berhaupt nicht gab. Doch jetzt, brandneu, gibt es MIDI8031, ein komplettes Entwicklungs- system fr die industriell am h„ufigsten verbreitete Mikrocontroller- Familie: Die "80x1x"-er . Und es kostet keine 1000 DM, keine 500 DM, und auch nicht 100 DM, nein: es ist UMSONST, Public Domain! Sie ben”tigen lediglich die Hardware, die sie als kompletten Bausatz preiswert selbst herstellen k”nnen. ! Speicher auf dem Chip ! Name ! ROM/EPROM ! RAM ! Besonderheiten ------+---------------+---------+------------------- 8051 4kB ROM 128B 8751 4kB EPROM 128B 8031 keines 128B 8052 8kB ROM 256B 87C71 4kB EPROM 128B / Das 'C' bedeuted CMOS = 80C31 keines 128B \ niedrigen Stromverbrauch 80C515 8kB ROM 256B / 8 AD-Wandler sind mit auf dem 80C535 keines 256B \ auf dem Chip! ... ... ... Die "80x1x"-Mikrocontroller-Familie umfasst einige Dutzend Mitglieder. Einige der "80x1x" besitzen keinen Programmspeicher auf dem Chip (wie etwa der 8031). Diese sind dann keine echten Ein-Chip-Computer, da sie zus„tzlich ein ROM oder EPROM ben”tigen. Manche der Typen sind fr Amateure ungeeignet (zum Beispiel der 8051): Ein ROM kann nur bei der Herstellung des Chips programmiert werden, soetwas lohnt sich erst bei hohen Stckzahlen. Typen mit EPROM (8751,87C51, ...) lassen sich mit etlichen handelsblichen EPROM-Programmierger„ten programmieren. Das 'C' im Namen mancher Typen (etwa 80C31) bedeutet, dass es sich um einen CMOS-Typ handelt. CMOS-Typen brauchen nur sehr wenig Strom. Die Verwandschaft der Familie liegt an zwei Dingen: Zum einen besitzen alle eine minimale gemeinsame Anzahl von Ports, Timern und RAM, zum anderen sind die CPUs aller Typen identisch! Das heisst: Der Befehlssatz der CPUs ist 100% identisch. Der Befehls- satz an sich ist sehr einfach zu erlernen. Einige Literaturhinweise zu Bchern, die den Befehlssatz beschreiben finden sie in Kapitel 17. Obwohl er an sich recht einfach ist, ist er trotzdem auch effizient, und vor allem schnell: Fr eine 8*8-Bit Multiplikation oder eine 16/8-Bit Divison ben”tigten selbst die Langsamsten der Familie nur 4 Mikrosekunden! Alle "80x1x" sind somit Software-aufw„rtskompatibel zum 8031. Die zus„tzlichen Funktionen der gr”sseren Geschwister des 8031 (sie haben mehr Ports, mehr RAM, ROM oder EPROM, Timer; sie sind schneller; ...) lassen sich durch ein schlaues Softwarekonzept ohne Žnderungen mit einem Standard-8031-Assembler nutzen. Doch davon sp„ter mehr. Das Entwicklungssystem ---------------------- Das Entwicklungssystem MIDI8031 besteht aus 2 Komponenten: Soft- und Hardware. Die Software selbst ist sehr umfangreich, aber, wie bereits erw„hnt, v”llig Public Domain! Hier eine kurze šbersicht: Software: 80x1x-Crossassembler, fr die ganze "Familie" Source-Level-Debugger (!!! Ein echter Leckerbissen !!!) Monitorprogramm 80x1x-Disassembler GEM-Editor Demo-Programmen (sogar ein Sprachsynthesizer ist dabei) Shell ausfhrliche Anleitung: Sie lesen sie gerade Die MIDI8031-Hardware besteht aus einem Mikrocontroller 80C31 einem EPROM (das ein kleines "Betriebssystemchen") enth„lt, einer MIDI-Schnittstelle, und einem 32kB-RAM. MIDI8031 ist ein kompletter Mikrocomputer! Einige Daten: Hardware (Name: "MIDI8031") 80C31-8-Bit CMOS-Mikrocontroller: - Softwarekompatibel zum 8031 - getaktet mit 12 MHz - 16 bidirektionale I/O-Pins - 128 Bytes On-Chip-RAM 32kB RAM max. 32kB EPROM MIDI-Schnittstelle Der Entwicklungsablauf ist folgendermassen: Das 8031-Programm wird auf einem ATARI geschrieben. Per 'Tastendruck' wird es ber MIDI in das RAM des MIDI8031 transferiert, wo es getestet werden kann. L„uft es korrekt, bestehen 3 M”glichkeiten: 1.) Sie brennen das Programm in ein EPROM und ersetzen das Original-EPROM des MIDI8031 durch Ihr eigenes. 2.) Oder aber, sie verwenden ihr EPROM fr eine komplette Eigenentwicklung. 3.) Als dritte Alternative kann das Programm in einen Mikrocontroller mit eingebautem EPROM gebrannt werden, womit sie sich ihren pers”nlichen Ein-Chip-Computer verwirklicht h„tten, sofern ihr Programm in das EPROM des entsprechenden Chips passt. Besonders durch die eingebaute MIDI-Schnittstelle steht Ihnen mit der MIDI8031-Hardware aber auch die Welt der Musik offen! 2.) Die Hardware MIDI8031 ========================= Die Hardware wurde m”glichst einfach gehalten, sie besteht nur aus wenigen Bauteilen, im wesentlichen: - 80C31-Mikrocontroller - EPROM wahlweise 32kB- oder 8kB-Typ (enth„lt das "Betriebs- systemchen") - RAM 32kB (CMOS-Ausfhrung) - Optokoppler zur Steuerung der MIDI-Schnittstelle - 2 MIDI-Buchsen (IN/OUT) - Softwaregesteuerte LED - Spannungsstabilisierung 9-20 Volt auf 5 Volt - Reset-Taste - Einige Gatter: Normalerweise kann der 8031 keine Programme im RAM ausfhren. Mit einem Extra-Gatter geht das aber trotzdem. - 20 Polige Buchsenleiste an der die 16 Ports, etc. anliegen. Den Schaltplan finden Sie in den oben genannten Zeitschriften, oder aber: Service ------- Nicht jeder hat zuhause eine "Žtzkche" fr die Platinenher- stellung. Daher k”nnen Sie folgendes Angebot wahrnehmen: Der komplette Bausatz MIDI8031 mit einer hochwertigen Platine (Epoxydharz, verzinnt, mit Bestckungsaufdruck), s„mtlichen Bauteilen (incl. 6 Sockel fr die ICs), dem gebrannten Entwicklungs- system-EPROM, einer ausfhrlichen Aufbauanleitung und einer Diskette mit dem vollst„ndigen Public-Domain-Entwicklungs-system fr alle ATARI ST/STE ab 512 kB, k”nnen Sie fr DM 89.-- (Nachnahme) unter dieser Adresse bestellen: Jrgen Piscol Rastatter Str. 144 W-7500 Karlsruhe 51 3.) Installation, Zusatzprogramme ================================= Dieses Entwicklungssystem arbeitet Dateiorientiert, das heisst der Informationsaustausch zwischen den einzelnen Programmen erfolgt ber Dateien. Die Software l„uft zwar auch von Floppy-Disk, aber eben nur recht langsam. Auch wenn sie eine Festplatte besitzen, empfehle ich ihnen die Verwendung einer RAM-Disk. Nicht alle Programme des Entwicklungssystems stammen von mir: Den Editor und die RAM-Disk habe ich anderen Public-Domain- Disketten entnommen. Sie sind unver„ndert, die Anleitungen dazu sind separat in den Dateien: VDISK35.DOC, EDITOR.DOC (Textdateien). Falls sie eine Festplatte besitzen: Kopieren sie zur Installation den ganzen Ordner MIDI8031 darauf, bei Bedarf kopieren sie die RAM- Disk VDISK.ACC ins Bootlaufwerk. Falls sie keine Festplatte besitzen: Fertigen Sie sich eine Kopie dieser Disk an und kopieren sie die RAM-Disk VDISK.ACC ins Wurzelverzeichnis. Die RAM-Disk belegt nach dem Booten nur einen Eintrag in der Menueleiste, jedoch noch keinen RAM-Speicher! Um mit MIDI8031 zu arbeiten melden sie die RAM-Disk mit einer entsprechenden Gr”áe an (bei 1 MB RAM z. Bsp. mit 500kB) und kopieren Sie die gewnschten Dateien des Entwicklungs- systems (oder gleich den ganzen Ordner MIDI8031) hinein, nun kann es losgehen ... Beachten sie, daá die RAM-Disk reset-fest ist! Zum Anschluss von MIDI8031 an ihren ATARI ben”tigen sie 2 Stereo- šberspielkabel von etwa 1-2 Meter L„nge. Falls sie sich ber die Eignung der Kabel nicht ganz sicher sind, finden sie dazu auch einen Hinweis im Kapitel 7. Booten von dieser Disk ---------------------- Damit sie sofort loslegen k”nnen, habe ich auf dieser Disk bereits einige Voreinstellungen getroffen: - Booten sie ihren Rechner (sofern er mind. 1 MB RAM besitzt) von dieser Disk. - Auf Ihrem Desktop finden sie rechts oben ein RAM-Disk Zeichen. - Gehen sie auf den Menuepunkt "Ramdisk". Die RAM-Disk bietet ihnen nun die Gr”sse 512kB an. Klicken sie auf "ANMELDEN". - Kopieren sie nun den kompletten Ordner MIDI8031 auf die RAM-Disk. - Klicken sie doppelt auf eine beliebige "*.S51"-Datei um die Shell aufzurufen. 4.) Shell (SHELL51.PRG) ======================= Die meisten Programme des Entwicklungssystems werden ber Kommandozeilen gesteuert. Um Ihnen dazu die Arbeit etwas zu vereinfachen, existiert die Shell (SHELL51.PRG): Per Tastendruck wird das Programm assembliert, gestartet, editiert, gelistet, ... Die Shell ist m„ssig intelligent: Sie versucht sich zu merken, ob z. Bsp. Assemblierung wirklich notwendig ist. Kommandos: 'e': Aufruf des Editors und šbergabe der Projekt-Sourcedatei an ihn. 'x': Wenn n”tig wird das Projekt assembliert und gestartet. Das Programm l„uft dann auf MIDI8031, bis sie auf MIDI8031 Reset drcken. 'm': Wie 'x'. Das Projekt wird aber nicht gestartet, sondern an den MIDI8031-Monitor bergeben (Debugging). 'd': Wie 'm', zus„tzlich erzeugt die Shell aber eine Source-Level- Debugger-Datei. 'p': Um den Assemblervorgang zu kontrollieren, kann hier eine Liste erzeugt werden: LISTE.LST 'n': Manuelle Eingabe des Projektnamens (Immer ohne Extender)! Hinweis: Wenn sie SHELL51 als GEM-Anwendung anmelden, auf die Extender 'S51', und dann das Desktop sichern (Arbeit sichern), reicht es, wenn Sie in Zukunft auf das jeweilige Projekt klicken, den Namen tr„gt dann die Shell selbst ein. 5.) Assembler (A51.TTP) ======================= Konvention: 8051-Sourcedateien enden mit ".S51". Dateien mit Programmcode fr MIDI8031 enden mit ".O51". Diese Dateien werden im folgenden auch als Objektdateien bezeichnet. Der Assembler kann prinzipiell Code fr alle 51-er erzeugen. Die Definition der Spezialfunktionen der einzelnen Typen befindet sich in der Datei reg51.inc fr 80(C)31,80(C)51,87(C)51. Wenn Sie Programme fr andere Typen schreiben wollen, wenden Sie sich bitte an mich. Im Wesentlichen unterscheidet sich der Assembler nicht von anderen. Falls was unklar sein sollte: Lassen Sie sich die Demos ausdrucken. Bedienung --------- Kommentarzeilen beginnen immer mit einem Semikolon. Symbolnamen drfen maximal 8 Zeichen lang sein. Gross-/Klein-Schreibung wird ignoriert, Umlaute ('A™š') und 'ž' drfen nicht verwendet werden! Das Rechnen mit Symbolnamen ist jederzeit m”glich. Ausdrcke wie z. Bsp. "100-(('a'/$16)+symbol-num*4)" sind erlaubt. Zahlenwerte: ------------ [Dezimalzahl] Byte kann sein: -256..255 Wort: -32768..65535 '[ASCII]' Bsp.: '@' hat den Wert 64 $[Hexzahl] Bsp.: $FFFF hat den Wert 65535 %[Binaerzahl] Bsp.: %11111110 hat den Wert 254 [Symbolname] Es wird der Name des Symbols verwendet. ! Wert des PCs bei Zeilenanfang: Bsp. mov R0,#10 = mov R0,#10 djnz R0,! = w: djnz R0,w spart ein Label! Symbole: -------- Symbole (auch 'Label' genannt) mit Doppelpunkt am Ende, werden als Adressdefinitionen behandelt. Doppelte Definitionen von Adressen sind verboten! Symbole mit '=' am Ende werden als Variable behandelt. Bei Variablendefinitionen sind mehrfache Zuweisungen erlaubt, jeweils die letzte gilt: Bsp: nr = 11 mov A,#nr ; ACC mit 11 laden nr = 21 mov A,#nr ; ACC mit 21 laden Symbole, die mit '?' beginnen, werden als 'versteckt' gekennzeichnet. Sie tauchen in der Symbolliste nicht auf. Sinnvoll z. Bsp. bei sehr kurzen Sprngen. Symbolnamen drfen keine deutschen Umlaute enthalten (Bsp.: 'fnf') und auch kein 'ž'. Operatoren: ----------- Es gilt natrlich "Punkt vor Strich". Da der Assembler aber noch mehr sogenannte 'Operatoren' kennt als nur Plus, Minus, Multiplikation und Division, dient die folgende Liste als šbersicht: Hierarchie und Art der m”glichen Operatoren: Priorit„t: Hoch ( ) Normale Klammer . Bitadressen Bsp. ACC.7: Bit 7 von ACC * / + - & Logisches Und (Bsp: %110 & %010 = %010) | Logisches Oder (%110 | %011 = %111) ^ Logisches Exlusiv-Oder (%110 ^ %011 = %101) Priorit„t: Nieder Direktiven ---------- .registers [Datei] w„hlt die Definition der Register fr Spezialfunktionen, hier nur beigelegt reg51.inc: Fr die Typen: 80(C)31,80(C)51,87(C)51 .text_org [Zahlenwert] Adresse des 1. Codebytes. Nur einmal pro Sourcefile erlaubt. Fr Programme, die im RAM des MIDI8031 getestet werden sollen, muss der Zahlenwert gr”sser als $8000 sein, da nur dieser Bereich RAM ist. Das RAM in MIDI8031 betr„gt 32kB ab dieser Adresse. .var_org [Zahlenwert] ™ffnet ein (uninitialisiertes) Variablen-Segment. in Variablensegmenten sind keine Definitionen er- laubt, nur Reservierungen (.ds.b und .ds.w, siehe nachfolgend). Es sind beliebig viele .var_org pro Sourcedatei m”glich. Diese Direktive ist hilfreich beim Aufbau von Variablenfeldern im internen oder externen RAM des 8031. .ds.w, ds.b Reserviert Speicher (Wort/Byte), .w: 2 Bytes pro Wort. Bsp.: test: .ds.w 50 reserviert fr 'test' 100 Bytes (die es im Text- segment mit dem Wert 0 initialisiert) .dc.b Definiert ein Byte, oder einen String, d.h. der Speicher wird an dieser Stelle initialisiert. Bsp.: .dc.b "HALLO!",0 Wichtig: Strings werden nicht automatisch beendet, daher hier die Null. .dc.w Schreibt Worte im Intel-Format: Zuerst Low-, dann Highbyte. Bsp.: .dc.w go,hello,$8000,%11111111000 .ibytes [Datei] Fgt an dieser Stelle eine Datei ein. Verwendung Beispielsweise in der Demo PHONEM .hide Versteckt den nachfolgenden Teil des Listing, z. Bsp. beim Source-Level-Debugging, bis zu einem .show: .show Hebt .hide wieder auf. Bsp.: test: .hide .ibytes lange_da.tei .show Verhindert, dass in Listings des Assemblers alle Bytes der langen Datei einzeln erscheinen. .nlist Bei Ausgabe eines Assemblerlistings (z. Bsp. die Funktion 'p' in der Shell) wird ab hier die Ausgabe unterdrckt. .list hebt .nlist wieder auf, nicht aber .show Der Unterschied zwischen .hide/.show und .nlist/.list ist der, dass .hide/.show eine Ebene tiefer ist als .nlist/.list, Bsp.: Sourcefile Assembler-Listing Debugger ------------------------------------------------------------------ .hide .hide .hide .dc.w $1234 .show .dc.w $2345 45 23 .dc.w $2345 45 23 .dc.w $2345 .nlist .nlist .hide .hide .dc.w $1234 .show .dc.w $2345 45 23 .dc.w $2345 .list .list Variablenzugriffe ----------------- Will der 8031 einen Befehlscode holen oder Daten aus dem Programmspeicher (Tabellen, Konstanten), so gibt der die Adresse aus und setzt danach das Signal PSEN- auf LOW. Bei Lesezugriffen auf den RAM-Speicher wird nach der Adressausgabe das Signal RD- auf LOW gesetzt, bei Schreibzugriffen das Signal WR-. Normalerweise wrden also bei gleicher Adresse verschiedene Speicherbausteine angesprochen! Leider gibt es normalerweise keine M”glichkeit Programme im RAM eines 8031-Systems ablaufen zu lassen. Durch den Schaltungs- kniff mit dem NAND-Gatter 74HCT00 werden beide Adressr„ume bei Zugriffen auf Adressen oberhalb von $8000 vereinigt. Hinweis zum "Linken" -------------------- Der Assembler in der vorliegenden Version 2.x ist nicht in der Lage Programmteile zu linken. Bedeutung des Befgriffs "linken": Normalerweise bestehen gr”ssere Programme immer aus mehreren kleineren Modulen, die getrennt editiert und assembliert werden. Beim "linken" werden diese kleinerern Module zu einem funktions- f„higen Programm zusammengesetzt. Ein "Linker" ist zwar in diesem Paket nicht enthalten, trotzdem ist mit MIDI8031 die Entwicklung mehrteiliger Programme m”glich: Solange MIDI8031 mit Strom versorgt wird, bleiben Daten im RAM-Speicher erhalten. Auch bei Drcken der Reset-Taste! Zus„tzlich ist es mit der Assembler-Direktive ".text_org" m”glich, Code an beliebige Adressen im RAM zu laden. Mein Vorschlag w„re: Verteilen sie ihr Programm in mehrer Bl”cke, die jeweils bei markanten Adressen beginnen (etwa bei $8000, $9000, $A000 ...). Zwischen den einzelnen Bl”cken liegt dann zwar jede Menge unbenutzter Speicher, aber das ist ja in der Entwicklungs- phase nicht ausschlaggebend. Wenn das Programm sp„ter ordnungsgem„ss arbeitet, k”nnen die Lcken immer noch zusammengeschoben werden. Jedes der Module beginnt mit einer Liste von Sprngen, zu den vom Modul angebotenen Funktionen. Der erste Sprung geht jeweils entweder zu einer Endlosschleife oder zum Hauptprogramm. Jedenfalls darf der 8031 nie ins "Leere" springen, da sonst Daten zerst”rt werden k”nnten. Sie k”nnen nun an jeweils einem der Module arbeiten. Ein Beispiel: -------------------------------------------------------------- ;* Datei 1, Hauptprogramm: .registers reg51.inc datei1 = $8000 ; Hier beginnen die Module datei2 = $9000 .var_org datei2 ; Funktionen im Unterprogrammmodul .ds.b 3 ; Einsprungroutine led_on: .ds.b 3 ; ljmp belegt 3 Bytes led_off: .ds.b 3 .text_org datei1 ; Modul beginnt bei $8000 stop: ljmp stop ; Endlosschleife oder ljmp go go: mov SP,#$30 ; Stack fuer lcall setzen lcall led_on ; Fremdes Unterprogramm aufrufen lcall wait lcall led_off lcall wait sjmp go ; * Unterprogramm: Wartet etwa 0.2 sec. wait: mov R0,#0 mov R1,#1 ?w0: djnz R0,?w0 djnz R1,?w0 ret -------------------------------------------------------------- ; *Datei 1, Unterprogramme: .registers reg51.inc datei1 = $8000 datei2 = $9000 .text_org datei2 stop: ljmp datei1+3 ; Sprung ins Hauptprogramm oder stop led_on: ljmp ?lonn led_off: ljmp ?loff ?lon: setb P3.5 ; MIDI8031 LED an ret ?loff: clr P3.5 ; aus ret -------------------------------------------------------------- Angenommen, sie m”chten an den Unterprogrammen arbeiten: Editieren sie Datei1, setzen sie den ersten ljmp als Endlosschleife und starten sie datei1 auf MIDI8031. W„hlen sie nun den neuen Projektnamen datei2, sorgen sie dafr, dass der erste ljmp das Hauptprogramm aufruft.... Natrlich ist diese Methode zur Entwicklung mehrteiliger Programme schon etwas aufwendiger. Vor allen Dingen kann man nicht mehr einfach schnell mal so "drauflosprogrammieren", da hier schon ein gewisses Mass an Programmierdisziplin n”tig wird. Aber mit etwas Konsequenz k”nnen sie mit dieser Methode Programme beliebiger L„nge entwickeln. Vorschau -------- Der Assembler ist im Moment noch nicht besonders schnell. Fr die Zukunft habe ich folgende Erweiterungen geplant: 1.) Umstellung auf Tokenisierende Assemblierung (Faktor 100 schneller) 2.) Makros 3.) Bedingte Assemblierung 4.) Linkf„hige Objektdateien 6.) Disassembler (DIS51.TTP) ============================ Der Disassembler kann O51-Dateien wieder in disassemblieren (was sonst). Parameter der Kommandozeile: 1.) Name O51-Datei ohne Extender 2.) '>'+Ausgabedatei (vollst„ndiger Name) Diese Kommandozeile disassembliert die Datei TEST.O51 in die Datei LIST.LST: TEST >LIST.LST 7.) Execute (EX51.TTP) ====================== Um vorhandene O51-Dateien an MIDI8031 zu senden und sofort zu starten dient dieses Programm. Es kann mit der TOS-Funktion Pexec() auch von anderen Programmen aufgerufen werden. Wichtig: Bei Pexec muss das 1. Byte der Kommandozeile ihre L„nge enthalten (Pascal-Format). Parameter ist der Name der zu startenden O51-Datei ohne den Extender .O51. Es ist zu empfehlen, vor Aufruf von EX51.TTP MIDI8031 zu resetten, falls das momentan laufende Programm Interrupts verwendet. Datensicherheit, MIDI-Kabel --------------------------- Die Datenbertragung ber MIDI ist sehr zuverl„ssig, solange sie (abgeschirmte) MIDI-Kabel verwenden, deren L„nge 2 Meter nicht bersteigt. Eine Fehlererkennung bei der Datenbertragung wurde deshalb nicht vorgesehen. Das Programm TESTRAM.PRG dieser Disk dient zum Test der Datenbertragung und des MIDI8031 RAMs. Bei MIDI werden die Daten mit einer Rate von 31500 Baud bertragen. Das sind maximal etwa 3 Kilobyte pro Sekunde! Zus„tzlich wurde MIDI eigentlich als Schnittstelle zwischen Synthesizern fr Musik entwickelt. Um der Gefahr von Brummschleifen zu entgehen, sind MIDI-Ger„te immer galvanisch (also ber Optokoppler) voneinander getrennt. Als MIDI-Kabel eignen sich gew”hnliche Stereo-šberspiel- kabel. Mit Mono-Kabeln gibt es normalerweise Probleme, da im ATARI die (normalerweise) freien PINs der MIDI-Buchsen teilweise belegt sind! Spezielle sogenannte "MIDI-Kabel", wie sie oft in Musik- gesch„ften angeboten werden, sind zwar auch geeignet, aber bedeutend teuerer und keinesfalls besser als Stereo-šberspielkabel. 8.) Monitor/Source-Level-Debugger (MON51.TTP) ============================================= Um Fehler in Programmen zu suchen, dient diese Programm. Ein bergebens Programm wird an MIDI8031 gesendet, danach wird ein Bildschirm aufgebaut, der die wichtigsten Register anzeigt, sowie Teile des Programmes. Die F„higkeiten von MON51: - bis zu 10 Breakpoints - Single-Step-Betrieb - st„ndige Anzeige wichtiger Register und Flags - Anzeigen des internen und externen RAMs von MIDI8031 - Disassembler - Source-Level-Debugger MON51 wird durch die SHELL51 gestartet. šbergibt die Shell an MON51 eine Source-Level-Debugger-Datei (Extender 'M51'), so integriert MON51 diese folgendermassen: Cursortasten Hoch/Runter: Scrollen im Sourcetext, 1 Zeile. Mit 'Shift' jeweils 10, mit 'Control' 50 Zeilen. Im Sourcetext k”nnen sie Teile mit der Assemblerdirektive .hide verstecken! Scrollen ist nur im Sourcetext m”glich, nicht aber bei disassemblierten Programmteilen. PC befindet sich an einer Stelle, zu der Sourcecode vorliegt: Sourcecode wird angezeigt. PC befindet sich an einer Stelle im RAM, zu der kein Sourcecode vorliegt: RAM wird disassembliert. PC befindet sich im EPROM (etwa bei Programmfehlern): Nichts wird angezeigt, ausser die Adresse des PCs. Bei Berechnungen: Mit dem Sourcecode bergibt die Shell an MON51 auch eine Symbolliste, so dass die Symbolnamen verwendet werden k”nnen. Befehle des Monitors -------------------- - 'g' ohne Zus„tze: Das Programm wird an der Stelle fortgesetzt, auf den der PC zeigt. Das Programm kann per Tastendruck unterbrochen werden, oder wenn es auf einen Breakpoint trifft. - 'g + Zahlenwert': Programm starten ab Zahlenwert. Bsp.: g schleife+$16 - Die wichtigste Taste ist wohl 'Undo': Sie enth„lt 'g '. - 's+': Single-Step-Ein: Pro 'g' wird nun nur ein Schritt ausgefhrt. - 's-': Single-Step-Aus - 'b': Liste der Breakpoints anzeigen - 'b-': Alle Breakpoints aufheben - 'b0-' bis 'b9-': Einzelnen Breakpoint aufheben - 'b0 = Zahlenwert' bis 'b9 = Zahlenwert': Setzen eines Breakpoints (Beachten Sie dazu die Hinweise am Ende des Kapitels) - 'd': Erneuter Download: Oft ist es wnschenswert das gleiche Programm nocheinmal zu starten. Dazu dient 'd'. Vor 'd' kann MIDI8031 evtl. mit der Reset-Taste neu gestartet werden, falls n”tig. - '?' Dient zur Berechnung von Ausdrcken Bsp.: ? $8000+(schleife+nr)*3 Ausgabe als Dezimal- und Hexadezimal-Zahl. - 'x Zahlenwert': Zeigt externes RAM des MIDI8031 an, Bsp.: x $8000 - 'r Zahlenwert': Zeigt internes RAM des MIDI8031 an, maximal- Adresse ist 127! Bsp.: r 120 - 'q': Verl„sst MON51, MIDI8031 bleibt angehalten, wird aber nicht resettet (das k”nnen sie ja bei Bedarf manuell am MIDI8031 machen). Troubleshooting --------------- MON51 untersttzt keinen selbstmodifitzierenden Code. Ausserdem ben”tigt er etwa 10 Bytes auf dem Stack des MIDI8031. Treten beim Debuggen wiederholt unerkl„rliche Zust„nde auf, so liegt das oft an falsch gesetztem (oder garnicht gesetztem) Stack des MIDI8031. Ein weiteres "Problemchen" liegt an dem geringen MIDI-Buffer des ATARI: Gelegentlich kann es vorkommen, dass dieser berl„uft, z. Bsp. bei sehr schnellem Single-Steppen: Pl”tzlich werden 'seltsame' Registerinhalte angezeigt, Adressen die es nicht gibt... Abhilfe: Einfach noch einen Step mehr machen: Der PC des MIDI8031 wird von diesem selbst verwaltet und nur bei Bedarf ver„ndert etwa bei explizitem Go (Bsp 'g $8000'). Interrupts: Jedesmal wenn MON51 sich meldet (Breakpoints, Singlestep) werden die Interrupts des 8031 disabled. Bei der Verwendung von Interrupts sollten sie also die Interruptroutine vielleicht zuerst als 'normales' Unterprogramm austesten, und erst dann auf einen Interrupt legen. Breakpoints: Breakpoints auf MIDI8031 werden dadurch erzeugt, dass MON51 an die Stelle des Breakpoints eine (im Moment 7 Bytes lange) Routine schreibt. Nun kann folgendes Problem auftreten: Angenommen sei folgender Sourcetext: test: ret nixgut: inc R0 ret Wenn Sie nun einen Breakpoint an die Stelle 'test' setzen, wird auch das Unterprogramm 'nixgut' berschrieben, was zu seltsamen Effekten fhren wrde... Also, behalten Sie diese Tatsache im Hinterkopf und setzen Sie nie Breakpoints zu nahe vor derartigen Sprungbefehlen. Trotz alledem glaube ich, dass MON51 ein sehr gutes Hilfsmittel bei der Softwareentwicklung fr MIDI8031 ist. 9.) Interrupts des MIDI8031 =========================== Der 8031 springt bei Auftreten eines Interrupts immer auf eine fest vorgegebene Adresse: $0003 Externer Interrupt 0 (Pin -INT0) $000B Timer 0 Interrupt $0013 Externer Interrupt 1 (Pin -INT1) $001B Timer 1 Interrupt $0023 Serieller Interrupt (Senden und Empfangen) Im Entwicklungssystem MIDI8031 liegen diese Adressen im EPROM, ausserdem stehen fr die einzelnen Interruptroutinen so nur je 8 Bytes zur Verfgung. Daher befindet sich an dieser Stelle im Enntwicklungssystem-EPROM folgender Code: $0000: reset: ljmp ... ; Systeminitialisierung $0003: int0: ljmp $8003 .ds.b 5 $000B: timer0: ljmp $800b .ds.b 5 $0013: int1: ljmp $8013 .ds.b 5 $001B: timer1: ljmp $801b .ds.b 5 $0023: serial: jnb PSW.5,?ose ; F0=0: MIDI abfangen ljmp $8023 ; F1=1: USER-MIDI ?ose: ajmp ... Bei Auftreten eines Interrupts springt der 8031 also zur entsprechenden Adresse im RAM! Verwendet werden Interrupts z. Bsp. im Schrittmotorprogramm oder im Sprachsynthesizer. Eine Besonderheit stellt der serielle Interrupt dar: Normaler- weise dient er ja zur Steuerung des Entwicklungssystems. Wollen sie jedoch den seriellen Interrupt fr eigene Programme verwenden, mssen sie das Prozessorflag F0 setzen, was natrlich auch heisst, dass dieses Flag anderweitig nicht verwendet werden darf! Verwendet Ihr Programm Interrupts, und l„uft es im RAM korrekt, und beginnt es normalerweise an Adresse $8000, k”nnen Sie es ohne Probleme in ein EPROM brennen, indem Sie einfach die Anfangsadresse in $0 „ndern und mit diesem Sourcecode eine O51-Datei erzeugen, mehr dazu sp„ter... Allerdings laufen die Interrupts im EPROM etwas schneller ab, da ja nun jeweils ein Sprungbefehl fehlt! 10.) Tips zur Fehlersuche ========================= šber dieses Thema liesse sich natrlich sehr viel sagen. Oft aber liegen Fehler an so elementaren Dingen, dass man fast nicht drauf- kommt: - Initialisierung von Interrupts: Interrupts werden durch 3 Bits initialisiert: 1.) Das Enable-Bit des Interrupts im IE-Spezialfunktionsregister, 2.) Das Priorit„ts-Bit des Interrupts im IP-Register, 3.) Das Generelle Interrupt-Enable- Bit EA, es ist das oberste Bit im Register IE (also IE.7). Speziell zu bei Timern gibt es auch noch das Zusammenspiel zwischen Timer-Overflow-Flag (TF0/1) und Timer-Run-Flag (TR0/1): Immer wenn ein Timer dir Grenze 255->0 šberschreitet wird sein Overflow-Flag (TF0/1) gesetzt. TF0/1 wird bei Ausfhrung eines Interrupts automatisch rckgesetzt. Bevor sie Timer-Interrupts verwenden, sollten sie zus„tzlich diese Sequenz in Ihrer Software einbauen: 1.) Timer Interrupt disablen, 2.) TR-Bit l”schen, 3.) TF-Bit rcksetzen ( = auf 0). - Stack: der Stack w„chst nach oben! Vergessen Sie niemals ihn zu initialisieren. Das Entwicklungssystem ben”tigt etwa 10 Bytes auf dem Stack. - Read-Modify-Write: Jedem Port ist noch ein Zwischenspeicher vorgeschaltet, der den Ausgabepegel des Ports speichert. Manche Befehle lesen nun den Wert des Port-Latches, andere wiederum den wirklichen Pegel am Port. Insbesondere im Zusammenhang mit Port 3 kann dies zu Problemen fhren: Der Befehl mov A,P3 etwa liest den am Port aussen anliegenden Pegel, indem einfach der Port auf LOW geschaltet wird, und dann gemessen wird, ob ein Strom fliesst. Leider h„ngen auch die Signale -RD und -WR an diesem Port. Durch den Lesebefehl ist deshalb das RAM der Meinung, es soll beschrieben werden, was sofort zum Absturz von MIDI8031 fhrt! Dagegen ist das Lesen des Portlatches v”llig ungef„hrlich. Zu diesem Thema finden Sie Informationen unter dem Stichwort: Read-Modify-Write-Befehle in jedem Buch zum Thema 51-er Controller. 11.) Die Demoprogramme ====================== A - Dieses Minimalprogramm bringt die LED von MIDI8031 zum Blinken MORSE ----- Dieses Programm gibt einen Text als Morsezeichen aus, indem es mit der LED blinkt, und auch T”ne am Pin P1.0 ausgibt. Ausserdem zeigt es auch, wie Portpins abgefragt werden k”nnen: Wenn Sie zwischen Pin P3.3 und GND (Buchsenleiste Pin 15 und 20) eine Taste anschliessen, k”nnen sie durch Drcken der Taste die Tonh”he des Morsesignals verstellen. Der Lautsprecher wird zwischen Pin 2 und 3 der Buchsenleiste angeschlossen. Der Port kann im LOW- Zustand pro Pin nur wenige Miliampere ziehen. Daher muss dem Laut- sprecher ein Wiederstand vorgeschaltet werden. Je nach Wiederstand des Lautsprechers sollte der Gesamtwiederstand mindestens 200 Ohm betragen, um Sch„den am Port des MIDI8031 zu vermeiden. Leider bleibt aufgrund des Vorwiederstandes nicht mehr viel Leistung fr den Lautsprecher brig, wenn seine Impendanz klein ist (4-8 Ohm). Empfehlenswerter sind hier sogenannte 'Mittelohmige Lautsprecher', deren Impendanz etwa 40-45 Ohm betr„gt. Als besonders geeignet fr Tonausgabe hat sich die Schaltung bew„hrt, wie sie im Text des Programmes PHONEM.S51 beschrieben ist, wie noch folgt. SCHRITT ------- Dieses Programm dient zur gleichzeitigen Ansteuerung zweier Schrittmotoren. Prinzipiell soll es eigentlich mur zeigen, wie problemlos sich auch Interrupts in eigenen Programmen verwenden lassen. Die Schrittmotoren werden ber Port P1 gesteuert. Es k”nnen nur sogenannte 4-Strang-Motoren verwendet werden, die aber auch am verbreitetsten sind. Dazu wird die spezielle MIDI8031- Hardware-Erweiterung MIDI8031-Powerport verwendet, die im 3. Teil der Serie beschrieben worden ist. MIDI8031-Powerport ist aber bedeutend mehr als nur eine einfache Schrittmotorkarte: Auf der Platine befinden sich 8 preiswerte SIPMOS-Leistungs-MOSFET- Transistoren, von denen jeder(!) maximal 20 Ampere ziehen kann (Summe also 160 Ampere!). Dabei kann die Taktrate bis zu 500 kHz betragen. Prinzipiell k”nnen sie an den MIDI8031-Powerport alles anschliessen, das sich mit maximal 30 Volt und 20 Ampere betreiben l„sst: Kleinbohrmaschinen, L”tkolben, Halogenlampen, Relais, ... Die Bauanleitung zu dieser Karte finden sie, wie bereits erw„hnt im 3. Teil der Serie. Zu SCHRITT geh”rt auch die Datei SCHRITT.TXT: Ein GFA-Basic-Programm: Starten sie SCHRITT von der Schell aus und verlassen sie dann die Shell. Starten sie nun GFA-Basic und laden Sie mit MERGE SCHRITT.TXT. SCHRITT.TXT gibt fr jeden Motor ein individuelles Fahrprogramm aus und zeichnet es auf dem Bildschirm. CODE ---- Ein Software-Rauschgenerator. OS -- Das ist der Sourcecode des Entwicklungssystem-EPROMS PHONEM ------ Das wohl interessanteste Demo-Programm berhaupt: Ein Sprach- synthesizer mit linearem 7-Bit-Pulswandler. Mithilfe von SMSEDIT.PRG, einem Programm zur digitalen Signalverarbeitung, das im n„chsten Kapitel beschrieben wird, k”nnen aus gesampelten Sprachsignalen Dateien erzeugt werden, mit denen PHONEM gesteuert wird. In ein 32KB-EPROM passen ohne Aufwand bis zu 1 Minute Sprache in guter Qualit„t. Einige fertige Text befinden sich bereits mit im Paket, sie mssen nur noch den jeweiligen Namen der Datei im Sourcecode zu PHONEM einsetzen. PHONEM ist in der vorliegenden Fassung nur ein Fragment: ver- bessert man die Datenverwaltung noch etwas, lassen sich der Speicherverbrauch ohne Qualit„tseinbusen auf etwa 1/5 senken! Geht man noch weiter, lassen sich aus den Daten die Grundbausteine menschlicher Sprache, die sogenannten Phoneme isolieren. Dann allerdings sinkt die Qualit„t etwas ab, aber der Speicherverbrauch l iegt bei weniger als 50 Bytes pro Sekunde Sprache! In jedem Fall bleibt die Sprache noch ziemlich gut verst„ndlich. Wollen Sie PHONEM in ein EPROM brennen, beachten Sie bitte die Hinweise im Kapitel Interrupts: Das Timing von PHONEM ist auf den Zyklus genau berechnet. In der EPROM-Version mssen daher 3 zus„tzliche Zyklen in die Timer0-Interruptroutine eingebaut werden (Z. Bsp. 3 mal NOP). Die Arbeitsweise von PHONEM: Aus dem gesprochenen und gesampelten Text isoliert SMSSEDIT die wesentlichen Merkmale der Sprache: Jede Sekunde Sprache wird in etwa 60 Abschnitte zerlegt. Fr jeden Abschnitt wird eine Hartley-Transformation durchgefhrt (das ist eine der FFT verwandte Transformation). Aus dem Leistungsdichte-Spektrum eines jeden Fensters werden die 12 wichtigsten Frequenzen entnommen, zusammen mit ihrer Amplitude. Die Synthese in PHONEM erfolgt nun derart, dass die jeweiligen 6 Frequenzen mithilfe einer Tabelle einer Sinusschwingung wieder zusammmengesetzt werden. Leider kann der 8031 nur vorzeichenlose Zahlen miteinander multiplizieren. Daher ist zu jedem Datensatz noch ein Extrabyte zugefgt, das einen Offset angibt, der jeweils addiert wird. Pro Sekunde synthetisiert MIDI8031 etwa 8000 Werte des Signals. Um das Signal h”rbar zu machen, wird es als Pulsweite-Moduliertes Signal am Portpin P1.0 ausgegeben. Leider pfeift das Signal noch etwas. Leidliche Abhilfe schafft ein Tiefpass, wie im Source- text beschrieben. Besser noch w„re ein aktives Filter, was aber auch den Aufwand in die H”he treiben wrde. Interessante Bilder ergeben sich, wenn man den Frequenzverlauf der einzelnen Komponenten zeichnet: SMSSEDIT sortiert die Daten nach Frequenz. Zeichnet man also den Verlauf der Frequenz- komponenten auf, deren Amplitude gr”sser als 1 ist, ergeben sich interessante Muster, die fr jeden Menschen (der den gleichen Text spricht) in etwa gleich sind! Die meisten Spracherkennungs- programme arbeiten nach diesem System. 12.) Sprachsynthese mit SMSSEDIT ================================ Dieses Programm wurde ursprnglich fr einen anderen Zweck geschrieben. Daher enth„lt es viele Funktionen, die hier nicht notwendig sind. Vorgehensweise: Mit 'l' (Bereich laden) wird eine bereits gesampelte Datei eingeladen (eine, ZAHL1_10.PAT, befindet sich bereits auf Disk). 'r': Falls sie einen Sampler zum Anschluss am Druckerport des STs besitzen, probieren sie einfach mal aus, ob er mit SMSSEDIT zusammenarbeitet: 'r'+ '' startet die Aufnahme. Mit 'p' wird der geladene Bereich abgespielt (Monitorlautsprecher dazu voll aufdrehen). Mit 'b' k”nnen sie mit der Maus einen Ausschnitt des Bereichs zoomen, mit 'o' kommen sie wieder zurck. mit 'i' wird eine Sprachanalyse des Bereichs durchgefhrt und das synthetisierte Signal anstelle des Originals eingesetzt. Haben sie ihr MIDI8031 am ATARI angeschlossen, k”nnen sie auch das synthetische Signal dort ausgeben, indem sie vor 'i' das '~' drcken. Die Analyse ist enorm rechenaufwendig. Ich habe dazu die schnellsten derzeit bekannten Analysealgorithmen verwendet (selbstverst„ndlich in 100% optimiertem Assembler). Wenn sie das synthetisierte Signal ber MIDI8031 ausgegeben haben, empfiehlt es sich, es durch Druck der Reset-Taste zu beenden. '0' speichert die gewonnen Koeffizienten auf Disk ab (Format PHO) '1' l„dt eine PHO-Koeffizientendatei ein. Es befindet sich bereits eine mit auf Disk. '2' fhrt nur eine Synthese mit den bereits vorhandenen Koeffizienten durch (Bsp.: erneute Augabe an MIDI8031) '3' w„hlt einen anderen Analyse-Verst„rkungsfaktor '4' speichert die Koeffizienten im Format P51 ab, so dass sie mit PHONEM verwendet werden k”nnen. Der Filestruktur ist folgendermassen: - Jede Sekunde Sprache wird in ca. 60 Fenster zerlegt, von denen jedes durch 13 Bytes beschrieben wird. - Die ersten 6 Bytes eines Fensters enthalten die 6 Frequenzen der Komponenten (0..127), danach kommen die 6 Lautst„rken der Komponenten,(0..255), zum Schluss noch ein Offset der das Synthesesignal auf Wandlermitte justiert. Falls sie an einer genauen Anleitung zu SMSSEDIT interessiert sind: SMSSEDIT ist Teil des SMS Synthesisers V1.10, den sie in jeder gut sortierten Public-Domain-Sammlung finden. Auf der SMS-Diskette ist auch eine detailierte Anleitung zu SMSSEDIT enthalten. 13.) Zusatzhardware, MIDI8031-Powerport ======================================= Die Menge der m”glichen Hardware-Erweiterungen zu MIDI8031 ist v”llig beliebig. MIDI8031-Powerport ist lediglich ein eine M”glichkeit. Es sind nur einige Dinge zu beachten: Die Ports des 80C31 enthalten stark vereinfacht: (+ 5 Volt) ---------------+ | [ Pull-Up-Wdst etwa 20kOhm ] | +----------> Portpin | | <-- FET, kann bis etwa 20 Mili-Ampere - - - ------| <-- aufnehmen, mehr ist gef„hrlich | ----- --- GND - - Nach Reset befinden sich Portpins immer auf High. - Eingabeger„te: Taster, Schalter, ... werden immer zwischen dem Portpin des 80C31 und GND angeschlossen. Aus Schutzgrnden k”nnen sie dem Taste, Schalte, ..., einen 150 Ohm Wiederstand vorschalten (Struktur des Portes ist in Wirklichkeit komplizierter, auch zwischen +5V und dem Pin liegt noch ein zweiter FET, der aber nur fr wenige Mikrosekunden bei Schreibzugriffen auf den Portpin durchschaltet). - Ausgabe: Im LOW-Zustand ist der FET durchgeschaltet. Trotzdem ist die Verwendung von Puffern (wie etwa im MIDI8031-Powerport, wie in ST-Computer 7/92 beschrieben) zum Schutz des 80C31 zu empfehlen. 14.) Stromsparmechanismen des 80C31 =================================== Die CMOS-Mikrocontrollertypen der 51er-Familie, wie auch der 80C31, besitzen 2 softwaerm„ssige Mechanismen zur Reduzierung der Leistungs- aufnahme des Mikrocontrollers. Die beiden Zust„nde sind als 'IDLE-Mode' und als 'POWER-DOWN-Mode' bezeichnet. Zur Aktivierung der Moden gibt es das SF-Register 'PCON'. Das Register PCON ist nicht bitadressierbar! IDLE-Mode --------- Durch Setzen des Bits PCON.0 l„sst sich der IDLE-Mode setzen. Im IDLE-Mode bleibt der Prozessor stehen, h„lt aber die Zust„nde der Ports. Bei Auftreten eines nicht gesperrten Interrupts (Intern oder Extern) wird der IDLE-Mode wieder aufgehoben und der entsprechende Interrupt ausgefhrt. Der IDLE-Mode kann durch folgenden Befehl aktiviert werden: orl PCON,#%1. Sind alle Ports auf High, und die LED aus, verbraucht MIDI8031 nur noch etwa 6 Miliampere, von denen etwa 3 Miliampere auf den 80C31 entfallen, der Rest auf die brigen ICs, vor allem Optokoppler und Spannungsregler. POWER-DOWN-Mode --------------- Durch Setzen des Bits PCON.1 gelangt der 80C31 in den POWER-DOWN-Mode. In diesem Modus ist der Prozessor praktisch eingefroren. Der Zustand kann nur durch einen Reset beendet werden! Im POWER-DOWN-Mode verbraucht der Prozessor 80C31 nur noch etwa 10 Mikroampere bei einer Versorgungs-Spannung von 2 Volt. Dabei ist der Erhalt der Daten im internern RAM garantiert, sofern der POWER-DOWN-Mode vor Absinken der Versorgunsspannung unter 4.5 Volt aktiviert worden ist. Die Zust„nde der Ports bleiben ebenfalls erhalten. Da der 80C31 auch im POWER-DOWN- Mode bei einer Versorgungsspannung von 5 Volt etwa 1 Mili- Ampere verbraucht, ist dieser Modus fr MIDI8031 eigentlich ungeeignet, da er wie gesagt nur durch Reset beendet werden kann. Fr Batteriebetriebene Eigenentwicklungen kann folgendes Schema verwendet werden: - Bei Absinken der Versorgungsspannung unter eine bestimmte Schwelle wird ein Interrupt ausgel”st. - Der Interrupt sichert relevante Daten im internen RAM, setzt m”glichst alle Portbits auf 1 und aktiviert den POWER-DOWN-Mode. - šber eine Schaltung mit einer Schottky-Diode wird nur der Prozessor Ruhestromversorgt: Schottky-Diode +5Volt !\ ! +4.8Volt o-------------! >!----------------------+ +Allgemein !/ ! ! ! ! Batterie ! o--------------------------[ Wdst. ]----+-------> +U-Bat ! zum Pin1 ! 80C31 Kond. ----- 100nF ----- ! ! ! --- Gnd - Der Wiederstand wird so bemessen, dass im POWER-DOWN-Mode auch bei schw„cherer Batterie eine Spannung von mindestens 2 Volt am Pin1 anliegt. 15.) Fileformate =============== Assembler: Das Format ist total primitiv (Format O51): zuerst kommen die Codebytes. Die letzten 2 Bytes einer O51-Datei geben die Startadresse an (also zwischen $8000 und $FFFF bei wenn das Programm in's RAM des MIDI8031 soll) SMSSEDIT, PHO: Zu jeweils 128 Bytes des Samples werden die 6 wichtigsten Frequenzanteile bestimmt und als Worte abgespeichert: 6 * ( Frequenz.w, Amplitude.w ) Am Ende der Datei folgt 4 * -1L Die Frequenz bezieht sich immer auf eine 256-Schritte lange Sinusschwingung, d.h. der Frequenz '256' wrde die Tonfrequenz 7980 Hertz entsprechen, der Frequenz '1' die Tonfrequenz 7980/256 Hertz. Die Amplitude liegt normalerweise immer im Bereich von 0..127. 16.) Programme ins EPROM brennen, das OS-EPROM, EPROM-Service ============================================================= Leider vergisst MIDI8031 alles, wenn ihm der Strom fehlt. Ich habe weiter oben bereits erw„hnt, dass Besteller des MIDI8031- Bausatzes einen besonderen Service in Anspruch nehmen k”nnen: * Ich brenne EPROMs fr Besteller des MIDI8031-Bausatzes zum * Selbstkostenpreis. Dadurch sparen sie sich die Anschaffung eines teuren EPROM-Brenners und sie k”nnen die erprobte MIDI8031-Hardware fr ihr eigenes Programm benutzen. EPROM-Dateien, OS-EPROM ----------------------- Um ein 8051-Programm in ein EPROM zu brennen, gengt es, wenn sie im Sourcetext die Zieladresse mit .text_org $0 angeben. Falls ihr Programm Interrupts verwendet, stellen sie sicher, dass Interrupts wie im gleichnamigen Kapitel initialisiert worden sind. Der Assembler kann auch direkt aufgerċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċċs Programm wurde ursprnglich fr einen anderen Zweck geschrieben. Daher enth„lt es viele Funktionen, die hier nicht notwendig sind. Vorgehensweise: Mit 'l' (Bereich laden) wird eine bereits gesampelte Datei eingeladen (eine, ZAHL1_10.PAT, befindet sich bereits auf Disk). 'r': Falls sie einen Sampler zum Anschluss am Druckerport des STs besitzen, probieren sie einfach mal aus, ob er mit SMSSEDIT zusammenarbeitet: 'r'+ '' startet die Aufnahme. Mit 'p' wird der geladene Bereich abgespielt (Monitorlautsprecher dazu voll aufdrehen). Mit 'b' k”nnen sie mit der Maus einen Ausschnitt des Bereichs zoomen, mit 'o' kommen sie wieder zurck. mit 'i' wird eine Sprachanalyse des Bereichs durchgefhrt und das synthetisierte Signal anstelle des Originals eingesetzt. Haben sie ihr MIDI8031 am ATARI angeschlossen, k”nnen sie auch das synthetische Signal dort ausgeben, indem sie vor 'i' das '~' drcken. Die Analyse ist enorm rechenaufwendig. Ich habe dazu die schnellsten derzeit bekannten Analysealgorithmen verwendet (selbstverst„ndlich in 100% optimiertem Assembler). Wenn sie das synthetisierte Signal ber MIDI8031 ausgegeben haben, empfiehlt es sich, es durch Druck der Reset-Taste zu beenden. '0' speichert die gewonnen Koeffizienten auf Disk ab (Format PHO) '1' l„dt eine PHO-Koeffizientendatei ein. Es befindet sich bereits eine mit auf Disk. '2' fhrt nur eine Synthese mit den bereits vorhandenen Koeffizienten durch (Bsp.: erneute Augabe an MIDI8031) '3' w„hlt einen anderen Analyse-Verst„rkungsfaktor '4' speichert die Koeffizienten im Format P51 ab, so dass sie mit PHONEM verwendet werden k”nnen. Der Filestruktur ist folgendermassen: - Jede Sekunde Sprache wird in ca. 60 Fenster zerlegt, von denen jedes durch 13 Bytes beschrieben wird. - Die ersten 6 Bytes eines Fensters enthalten die 6 Frequenzen der Komponenten (0..127), danach kommen die 6 Lautst„rken der Komponenten,(0..255), zum Schluss noch ein Offset der das Synthesesignal auf Wandlermitte justiert. Falls sie an einer genauen Anleitung zu SMSSEDIT interessiert sind: SMSSEDIT ist Teil des SMS Synthesisers V1.10, den sie in jeder gut sortierten Public-Domain-Sammlung finden. Auf der SMS-Diskette ist auch eine detailierte Anleitung zu SMSSEDIT enthalten. 13.) Zusatzhardware, MIDI8031-Powerport ======================================= Die Menge der m”glichen Hardware-Erweiterungen zu MIDI8031 ist v”llig beliebig. MIDI8031-Powerport ist lediglich ein eine M”glichkeit. Es sind nur einige Dinge zu beachten: Die Ports des 80C31 enthalten stark v