| Einsendeaufgaben zur Kurseinheit 6 |  | Einsendeaufgaben zur Kurseinheit 8-98 |

# Einsendeaufgaben zur Kurseinheit 7

- Aufgabe 7-1
- Aufgabe 7-2
- Aufgabe 7-3

## Aufgabe 7-1: (30 Punkte)

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.

### a) (10 Punkte, Vorlagedatei: 1A_VORL.DSP;

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:

- Variablen für die drei Vektoren definieren,
- alle Verweise auf absolute Adressen (außer ggf. in den oben genannten Variablendefinitionen) durch Symbole oder Marken ersetzen,
- die beiden Variablen für die zu addierenden Vektoren aus den Dateien 1A_X.DAT und 1A_Y.DAT initialisieren, indem Sie die Direktive .INIT verwenden,
- und natürlich ein syntaktisch korrektes Assemblerprogramm erzeugen.

### b) (10 Punkte; Vorlagedatei: 1B_VORL.DSP; Lösungsdatei: 1B_ML.DAT)

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.

### Hinweis:

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.

### c) (5 Punkte; Datendateien: 1_MAT.DAT, 1_VEKT.DAT;
Lösungsdatei: 1C_ML.DAT)

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?

### d) (5 Punkte; Lösungsdatei 1D_ML.DSP)

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.

## Aufgabe 7-2: (30 Punkte)

### 7-2 a) (10 Punkte; Datendateien: 2_MAT1.DAT, 2_MAT2.DAT;
Lösungsdatei: 2A_EA.DSP)

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

1. den Speicherplatz für die drei Matrizen reservieren und den Speicherplatz für die zu multiplizierenden Matrizen aus den Datendateien initialisieren,
2. alle benötigten Register im Programm initialisieren,
3. ein Programm schreiben, welches deutlich an die Struktur einer Marixmultiplikation (mxn * nxp = mxp, in diesem Fall m=n=p=3) angelehnt ist.

Hinweise:

- In den Datendateien 2_MAT1.DAT und 2_MAT2.DAT sind die Matrizen für folgende Berechnung vorgegeben:

  W = | ì ï î | 1 4 7 | 2 5 8 | 3 6 9 | ü ï þ | * | ì ï î | 2 3 4 | 3 2 1 | 5 3 1 | ü ï þ

- Sie sollen 2_MAT1.DAT im Datenspeicher und 2_MAT2.DAT im Programmspeicher ablegen, da die Daten entsprechend angegeben sind.

### 7-2 b) (10 Punkte; Datendateien: 2_X1.DAT, 2_Y1.DAT; Lösungsdatei: 2B_EA.DSP)

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:

1. alle benötigten Register initialisieren,
2. die Multiplikation zunächst nur für S=Z=3 durchführen.

Hinweise:

- Die Zeilen- und Spaltenzahl können Sie (in diesem Aufgabenteil noch) ignorieren. Die beiden Vorlagedateien enthalten 3x3-Matrizen wie in Teil a). Sie können jedoch nicht ignorieren, daß dort Speicherzellen benötigt werden.
- Die Zeilen- und Spaltenzahl der Ergebnismatrix müssen nicht auf 3 gesetzt werden.
- Legen Sie den Speicherbereich für die erste Matrix im Datenspeicher und für die zweite Matrix im Programmspeicher ab, da die Datendateien entsprechend formatiert sind (2_Xn.DAT für den Datenspeicher, 2_Ym.DAT für den Programmspeicher).
- In den Dateien 2_X1.DAT und 2_Y1.DAT finden Sie die Matrizen aus Teil a) im neuen Format gespeichert.

### 7-2 c) (10 Punkte; Datendateien: 2_X*.DAT, 2_Y*.DAT; Lösungsdatei: 2C_EA.DSP)

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:

1. die Werte ZX, SX, ZY und Sy für Zeilen- und Spaltenzahl der beiden Matrizen daraufhin überprüfen, ob eine Multiplikation der dadurch definierten Teilmatrizen innerhalb der 8x8-Matrizen definiert ist,
2. ans Programmende springen, falls die Überprüfung einen Fehler anzeigt,
3. alle benötigten Register initialisieren,
4. die Multiplikation durchführen.

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.

## Aufgabe 7-3: (30 Punkte)

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:

y(t) = | N-1 å k=0 | hk(t) x (t-k)
|  | (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.

### 7-3 a) (5 Punkte; Vorlagedatei: 3_VORL.DSP; Datendatei: 3_TEST.BIN)

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:

- Mit welchem Befehlswort müssen Sie SPCR1 initialisieren?
- Wieso kann im weiteren Verlauf mit 1.15-Festpunktzahlen gerechnet werden, obwohl nur 8 bit pro Wort übertragen werden?
- Welchen Wert wählen Sie für SCLKDIV?
- Welche Werte sind für RFSDIV erforderlich, um die o.g. Abtastraten zu erzielen?

### 7-3 b) (5 Punkte)

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.

### 7-3 c) (15 Punkte; Vorlagedatei: 3_VORL.DSP; Datendatei: 3_TEST.BIN; Lösungsdatei: 3_EA.DSP)

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:

- Verwenden Sie zirkulare Puffer für die Koeffizienten und die eingelesenen Werte.
- Denken Sie daran, daß während der ersten N-1 gelesenen Werte der Empfangspuffer ungültige Werte enthält, und umgehen Sie dieses Problem durch Initialisierung des Puffers mit Nullen.

### 7-3 d) (5 Punkte)

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 |