| Einsendeaufgaben zur Kurseinheit 6 | Einsendeaufgaben zur Kurseinheit 8-98 |
In dieser Aufgabe soll der Umgang mit dem Assembler und dem Linker geübt werden. Sie sollen zeigen, daß Sie die grundlegenden Elemente der 21XX-Assemblersprache beherrschen, den Assembler und Linker aufrufen sowie die Fehlermeldungen deuten können. Außerdem sollen Sie den Simulator zum Testen Ihrer Programme nutzen können.
Datendateien: 1A_X.DAT, 1A_Y.DAT; Lösungsdatei: 1A_EA.DSP)
Die Datei 1A_VORL.ASM enthält den Speicher-Dump eines Programmes, welches im Simulator erzeugt wurde. Das Programm addiert zwei Vektoren und speichert das Ergebnis im Datenspeicher ab. Erzeugen Sie aus diesem Speicher-Dump ein Assemblerprogramm.
Sie sollen im einzelnen:
In dieser Aufgabe sollen Sie ein fehlerhaftes Assemblerprogramm korrigieren. Das Programm in der Datei 1B_VORL.DSP soll die Multiplikation einer 3x3-Matrix mit einem Vektor durchführen und das Ergebnis abspeichern.
Sie sollen das Programm in dieser Aufgabe soweit ändern, daß es fehlerfrei assembliert und "gelinkt" werden kann, und das Ergebnis unter 1B_ML.DAT abspeichern.
Der Assembler scheint einen Fehler zu haben: Unter gewissen Umständen wird die Listingdatei nicht korrekt erzeugt, wenn das Assemblerprogramm Fehler enthält. Betroffen ist jedoch nur die Formatierung der Zeile, in der ein Fehler aufgetreten ist. Die Bildschirmausgaben sind korrekt, so daß Sie durch diesen Fehler nicht weiter beeinträchtigt werden.
In dieser Aufgabe sollen Sie sich mit initialisierten Datenbereichen und mit dem Laden von Datenbereichen im Simulator beschäftigen. Zuerst soll Ihr Programm aus Teil b) im Simulator selbst mit Daten gefüllt werden, dann soll es im Assembler mit initialisierten Datenbereichen versehen werden.
Laden Sie das Programm aus Teil b) in den Simulator. Lesen Sie nun durch die Tastenkombination Strg + M (bzw. dieAuswahl des Eintrags Load Memory im Menü Memory) die beiden Vorlagedateien in den vorgesehenen Adreßbereich im internen Speicher. Was fällt Ihnen auf?
Ändern Sie Ihr Programm aus Teil b) nun so ab, daß die beiden Vorlagedateien beim Linkvorgang mit eingebunden und damit die Variablenbereiche vorbelegt werden. Verwenden Sie dazu die Direktive .INIT. Laden Sie dann das Programm in den Simulator und schauen Sie sich die Belegung der Speicherbereiche an. Was fällt Ihnen auf?
Was können Sie nun über das Format von Dateien sagen, die sowohl vom Simulator wie auch vom Assembler genutzt werden sollen?
In dieser Teilaufgabe sollen Sie zwei kleine Verbesserungen in das Programm aus Teil b) oder c) einbauen. Erstens sollen Sie das Variablenfeld im Programmspeicher hinter das Programm legen. Die andere Änderung betrifft die Berechnung. Hier sollen Sie zwei "Umwege" ausbauen.
Beim Austesten des Programms mit Hilfe des Simulators werden Sie bemerkt haben, daß der Linker den Variablenbereich für den Vektor und das Ergebnis vor das Programm gelinkt hat. Das ist nicht weiter schlimm, nur müssen Sie zum Starten des Programms den Befehl "PC=100" von Hand im Command Window angeben. Sie sollen nun den Variablenbereich hinter das Programm legen.
Bei einer kleinen Analyse des Programms werden Sie festgestellt haben, warum die Korrektur des Zeigers I0 mit M1 notwendig ist. Suchen Sie nach einem Weg, um diese Korrektur zu umgehen.
Benutzen Sie dann einen zirkularen Puffer, um die Initialisierung von I4 in jedem Durchlauf der äußeren Schleife zu vermeiden.
Schreiben Sie ein Programm zur Multiplikation
zweier vorzeichenloser 3x3-Matrizen M1
und M2. Beide Matrizen liegen als Dateien mit vorzeichenlosen Integerwerten vor. Beide Dateien besitzen die gleiche Organisation: Die Werte sind zeilenweise abgespeichert. Die Ergebnismatrix soll im Programmspeicher abgelegt werden. Falls ein Wert größer als 216 wird, soll dafür 0xFFFF gespeichert werden.
Im einzelnen sollen Sie
Hinweise:
|
Erweitern Sie Ihr Programm aus a) so, daß die Eingabematrizen in einem anderen Format abgelegt sind. An erster und zweiter Stelle stehen die Zahl der Zeilen Z und die Zahl der Spalten S (0 < S 8, 0 < Z 8). Dann kommt eine 8x8-Matrix (zeilenweise gespeichert), bei der nur die ersten S Werte der ersten Z Zeilen gesetzt sind. Der Rest ist '0' oder undefiniert. (Jede Matrix in diesem Format ist also 66 Wörter groß.) Die Ergebnismatrix soll ebenfalls dieses Format haben und im Datenspeicher liegen.
Das Programm soll im einzelnen:
Hinweise:
Erweitern Sie Ihr Programm aus c) so, daß die Angaben für Zeilen- und Spaltenzahl nicht ignoriert werden, daß es also beliebige Matrizenmultiplikationen der Form mxn * nxp, jedoch mit jeweils höchstens 8 Zeilen und Spalten, durchführen kann.
Das Programm soll im einzelnen:
Hinweis:
In den Dateien 2_Xn.DAT (n=1..2) und 2_Ym.DAT (m=1..3) finden Sie Matrizen im benötigten Format, um sie miteinander multiplizieren zu können.
In dieser Aufgabe sollen Sie einen FIR-Filter (Finite Impulse Response) programmieren. Diese Filterart wird z.B. oft in Modems verwendet, um Leitungsstörungen herauszufiltern. Die Daten sollen über die serielle Schnittstelle interruptgesteuert eingelesen, dann gefiltert, und schließlich über die serielle Schnittstelle wieder ausgegeben werden.
Der gefilterte Wert zum Zeitpunkt t errechnet sich als:
| (7.3-20) |
Dabei ist x(t) der eingelesene Wert zum Zeitpunkt t. Die hk sind die Gewichtungen der vergangenen Werte. Wir beschäftigen uns mit den sog. nichtadaptiven Filtern, bei denen die hk ein Feld von N konstanten Koeffizienten bilden.
Wir werden mit N= 10 rechnen.
In dieser Teilaufgabe sollen Sie die serielle Schnittstelle vorbereiten. In der Datei 3_VORL.DSP finden Sie ein Programmgerüst, welches SPORT 1 initialisiert und für den interruptgesteurten Empfang von Daten vorbereitet. Allerdings fehlen die Werte, mit denen SPCR1, SCLKDIV und RFSDIV initialisiert werden sollen.
Folgende Betriebsart wird benötigt: Interne Takterzeugung, kein Sende- oder Empfangsrahmen verwendet, interne Erzeugung des Sende- und Empfangsrahmen, nicht invertierte Rahmensignale, µ-Law-Datenkompression, acht Datenbits pro Übertragung.
Sie sollen nun Abtastraten von 300 Hz, 1200 Hz, 2400 Hz, 9600 Hz und 19200 Hz erzielen können. Wählen Sie einen Wert für SCLKDIV, so daß Sie zum Erreichen dieser Abtastraten nur den Wert für RFSDIV ändern müssen. Nehmen Sie als Systemtakt 12,288 MHz an.
Beantworten Sie bitte die folgenden Fragen:
In dieser Teilaufgabe sollen Sie die Hexadezimaldarstellung der Koeffizienten hk berechnen. Die Koeffiziententabelle soll im Programmspeicher angelegt werden. Der Assember kann jedoch keine Festkommazahlen umwandeln, so daß Sie die 1.15-Werte "von Hand" oder unter Zuhilfenahme des Simulators in das vom Assembler beherrschte hexadezimale Format umsetzen müssen.
Berechnen Sie die hexadezimalen 24-bit-Werte, die sich für folgende Gewichtungen ergeben:
h0 = 0,048401; h1 = -0,135834; h2 = -0,052338; h3 = 0,155853; h4 = 0,362488;
h5 = 0,362488; h6 = 0,155853; h7 = -0,052338; h8 = -0,135834; h9 = 0,048401.
Hinweis:
Falls Sie keine Werte herausfinden, können Sie mit SCLKDIV=2 und RFSDIV=255 arbeiten (Tip: ergibt 2,048 KHz). Diese Werte ergeben zwar nicht die gesuchten Frequenzen und sind daher keine richtige Lösung. Für die weitere Bearbeitung spielt ein korrektes Zeitverhalten des "Ausgangssignals" aber keine Rolle.
In dieser Teilaufgabe sollen Sie den digitalen Filter programmieren. Verwenden Sie dazu die Initialisierung aus Teil a) und die Koeffizienten aus Teil b). Sie sollen die Vorlagedatei so ausbauen, daß alle empfangenen Zeichen in einem Puffer gespeichert werden. Danach sollen die gefilterten Wert ausgerechnet und ausgegeben werden.
Versuchen Sie, ein möglichst schnelles Programm zu schreiben, welches diese Aufgabe erfüllt. In der Datei 3_TEST.BIN finden Sie eine längere Folge von binären 8-bit-Werten, die Sie zum Testen benutzen können.
Hinweise:
In dieser Teilaufgabe sollen Sie die Echtzeitfähigkeit Ihrer Implementation beurteilen.
Berechnen Sie in Abhängigkeit von N die Laufzeit in Takten, die Ihr Programm zum Empfangen, Filtern und Senden eines Wertes benötigt. Berechnen Sie dann die Laufzeit bei einer Taktrate von 8 MHz. Wie groß kann N werden, um bei 19200 Hz Abtastrate noch in Echtzeit zu filtern?
Überprüfen Sie Ihr Ergebnis mit Hilfe des Simulators für N = 10.
| Einsendeaufgaben zur Kurseinheit 6 | Einsendeaufgaben zur Kurseinheit 8-98 |