6. Für den Test kleinerer Programmodule ohne Berücksichtigung des Echtzeitverhaltens ist der Simulator das geeignete Werkzeug. Durch die Möglichkeit der Einzelschrittausführung sind erste Tests von Programmen in der Regel schnell und übersichtlich auf dem Simulator auszuführen. Allerdings dauert die Simulation eines Programms in der Größenordnung 2 bis 10 mal so lange (abhängig von der Geschwindigkeit des PC) wie seine direkte Ausführung auf dem Mikrocontroller. Deshalb ist der Test größerer Programme, deren Module für sich schon mit dem Simulator getestet wurden, auf real existierender Hardware effektiver durchführbar. Weiterhin sind Programme, die auf zeitliche Abhängigkeiten verschiedener Prozesse reagieren müssen, nur schwer und oft unvollständig mit Simulatoren prüfbar. Da die Entwicklungsumgebung (Editierung, Assemblierung bzw. Compilierung) sinnvoll nur auf dem PC durchgeführt werden kann, ergibt sich die in Abb. 6.1. dargestellte Struktur der Programmentwicklungs- und Programmtestumgebung. Abb. 6.1. Struktur des 80535-Programmentwicklungssystems Der Übungsrechner besteht aus einer 80535-Rechnerkarte im Europaformat, einer 8-Bit-Ein/Ausgabekarte für Port 1 für die Eingabe über Taster oder alternativ für die Ausgabe über LED's und aus einer Ein/Ausgabekarte für die Ports P4 und P5 sowie das Analog/Digitalwandlerport, die nur an Buchsen angeschlossen sind. Über seine serielle Schnittstelle ist der Übungsrechner an den PC angeschlossen. Von hier aus werden die ausführbaren Maschinenprogramme im Intel-HEX-Format in das RAM des Übungsrechners geladen. Auf dem PC läuft eine Benutzeroberfläche (µvision), über die Programme editiert, assembliert, in den Übungsrechner oder in den Simulator geladen und ausgeführt werden können. 6.1. Grundsätzliche Struktur des Übungsrechners Abb. 6.2. zeigt das Blockschaltbild der 80535-Rechnerkarte. Port 0 dient bei ROM-losen Prozessorversionen als 8- Bit-gemultiplexter Daten- und Adressbus. Auf ihm werden sowohl Daten als auch die unteren 8 Bit der Adresse für externe Speicher übertragen. Die unteren 8 Bit der Adrese werden in einem Adresslatch, das durch das vom Prozessor erzeugte Signal ALE (Adress-Latch-Enable) gesteuert wird, aufgefangen. Die oberen 8 Bit der Adresse werden über Port 2 ausgegeben. Die Adressbits A13 bis A15 sind zusätzlich auf einen 1-aus-8-Decoder angeschlossen, über den der 64 K Byte Adressraum vom ROM und RAM in acht 8-K-Byte große Bereiche aufgeteilt wird. Während das EPROM die ersten 16-K-Byte des Adressraums belegt, beginnt der Adressraum des externen RAM's ab Adresse 8000H. 6-1
Abb. 6.2. Blockschaltbild In Kapitel 3 wurde erwähnt, daß der 80535 getrennte Adressräume für den Programm- und Datenspeicher hat (Havard-Architektur). Diese Konfiguration ist für einen Übungsrechner äußerst ungünstig, da dann die zu testenden Programme nicht vom RAM aus ausgeführt werden können. Zugriffe auf den Programmspeicher werden über das Signal /PSEN, (lesende) Zugriffe auf den Datenspeicher durch /RD gesteuert. Legt man an das RAM das UND-verknüpfte Signal /RD. /PSEN, können auch vom RAM aus Programme ausgeführt werden. Der gesamte, zur Verfügung stehende Adressraum ist jetzt allerdings nur noch 64-K-Byte groß, während er ohne die Verknüpfung von /RD und /PSEN 128-K-Byte groß wäre. Die verfügbaren Portanschlüsse von P0 bis P5 und AN0..AN7 (P6) sind auf Pfostenverbinder geführt. Über diese wird eine Ein/Ausgabeplatine (Eingabe über Taster, Ausgabe über LED's) mit Port 1 verbunden. Mit einem Jumper kann festgelegt werden, ob die Platine als Tastatureingabe oder als LED-Ausgabe betrieben werden soll. Eine weitere Platine ist nur mit Buchsen versehen und mit den Ports P4 und P5 sowie dem Analogport AN0..AN7 verbunden. Die integrierte serielle Schnittstelle des Controllers wird über den Pegelwandlerbaustein MAX 232 als V24 bzw. RS 232 Schnittstelle zur Verfügung gestellt. Über diese Schnittstelle erfolgt die Verbindung des Übungsrechners mit dem PC. Abb. 6.3. zeigt das detaillierte Schaltbild der Übungsrechnerplatine. Die mit Wn bezeichneten Brücken bzw. Jumper dienen im Wesentlichen der Konfiguration für verschiedene Speicherbausteine. Das auf dem Rechner vorhandene RAM hat eine Speicherkapazität von 8 K Byte und liegt im Bereich 8000H bis 9FFFH. Für den Benutzer steht allerdings nur der Bereich 8000H bis 9FDFH zur Verfügung. Der Bereich 9FE0H bis 9FFFH wird vom Monitorprogramm für die Zwischenspeicherung von Werten benötigt. Das EPROM belegt den Adressbereich von 0 bis 3FFFH. In den freien Adressbereichen könnten bei Bedarf weitere Speicher bzw. Ein/Ausgabebausteine gelegt werden. 6-2
Abb. 6.3 Schaltbild Übungstechner 6-3
6.2. Monitor, Bedienungsoberfläche Um Programme im Übungsrechner testen zu können, benötigt dieser ein kleines Betriebs-system, das mindestens folgende Möglichkeiten bieten muß: - Laden von Maschinenprogrammen über den PC - Start von Programmen an festlegbaren Adressen - Definierbare Unterbrechungspunkte - Anzeige und Veränderung von Registerinhalten - Anzeige und Veränderung von Speicherplatzinhalten Ein solches minimales Betriebssystem heißt Monitor und befindet sich im EPROM des Übungsrechners. Die möglichen Befehle werden meistens durch einen oder zwei Buchstaben abgekürzt. In Abb. 6.4. sind die im Übungsrechner implementierten Monitorbefehle aufgelistet. memory display modify fill utility ------ ------- ------ ---- ------- bit: >DB range >EB address >FILLB range value >A address - assemble code: >DC range >EC address >FILLC range value >U range - disassemble data: >DD range >ED address >FILLD range value >X [register]-disp/change idata: >DI range >EI address >FILLI range value xdata: >DX range >EX address >FILLX range value program execution breakpoint(s) program load/save ----------------- ------------- ----------------- >G [address] [,breakadd] - go >BD bp - disable >:hex_rec - load intel hex >T [count] - trace step >BE bp - enable >S range - save intel hex >P [count] - procedure step >BK bp - kill >BL - list >HELP - display menu >BS address - set Abb. 6.4. Monitorbefehle Betreibt man den PC als Terminal, so läßt sich der Übungsrechner über die Eingabe obiger Befehle steuern. Ein Nachteil dabei ist, daß die Syntax der Monitorbefehle keine großen Ähnlichkeiten mit der Syntax der Simulatorbefehle aufweist und daß die aktuellen Speicher-inhalte des Controllers nicht permanent aktuell auf dem Bildschirm angezeigt werden. Aus diesem Grund wird unter der Bedienungsoberfläche µvisionfür der Debugger tscope, der weitgehend identisch mit dem Simulator dscope ist, eingesetzt. Die in tscope eingegebenen Befehle werden per Programm so in Monitorbefehle umgesetzt, daß die gewünschte Wirkung der Befehle eintritt. Es ist allerdings darauf zu achten, daß das Monitorprogramm eine zu tscope kompatible Version ist. Ältere Versionen des Monitorprogramms arbeiten mit tscope nicht zusammen. 6.3. Fehlersuche mit dem Monitor Für die Fehlersuche mit dem Monitor gilt grundsätzlich das, was in Kapitel 5.4. auch für den Simulator gesagt wurde. Solange man unter tscope arbeitet, ergeben sich keine grundsätzlichen Unterschiede. Führt man den Test nur mit dem Monitor und einem dazu passenden Terminalprogramm durch, so ist hier in den meisten Fällen die effektivste Methode des Programmtests die Methode des abschnittsweisen Tests. Das zu testende Programm wird an einer definierten Adresse, die die Adresse eines Befehlscodes sein muß, gestartet und an einer zuvor gesetzten Breakpointadresse (die auch wieder die Adresse eines Befehlscodes sein muß) gestoppt. Danach wird geprüft, ob die vom Programm veränderten Register und Speicherplätze die erwarteten Werte haben. Ist dies der Fall, wird eine neue Breakadresse definiert und das Programm erneut gestartet. Im anderen Fall wird 6-4
die Breakadresse weiter zum Programmanfang hin verlegt, der Test erneut durchgeführt und somit die fehlerhafte Programmstelle weiter eingegrenzt. Der Monitor lädt die angegebene Startadresse in den Programmzähler des Controllers und startet ihn. Der Controller läuft jetzt eigenständig ohne Aufsicht durch das Monitorprogramm in Echtzeit. Um den Controller in dieser Betriebsart an einer vorgegebenen Adresse anzuhalten, muß der an dieser Adresse stehende Befehl durch einen Softwareinterrupt ausgetauscht werden. Wenn der Controller diesen Interrupt ausführt, muß er den ursprünglich an dieser Stelle stehenden Befehl restaurieren und dann zum Monitorprogramm verzweigen. Es ist also von entscheidender Bedeutung, daß bei der Angabe von Start- und Stopadressen die Adressen der Befehlscodes angegeben werden, die man am besten einem aktuellen Assemblerlisting entnimmt. Bei der Benutzung von tscope ist ein symbolisches Debugging möglich. Das Listing des auszuführenden Programms steht im Debug-Fenster zur Verfügung und durch Doppelklick auf eine Befehlszeile läßt sich z.b. eine Stopadresse setzen. 6-5