## Aufgabengruppe 8A: Versuche zum digitalen Signalprozessor

### Aufgabe 8A-1: Analoge Filterschaltungen

Motivation:

Die in den folgenden drei Bildern dargestellten elektronischen Schaltungen werden wegen der verwendeten Bauteile Widerstand R (Resistor) und Kondensator C (Capacity) häufig als RC-Netzwerke bezeichnet. Kurz gesagt, besteht ihre Aufgabe darin, unterschiedliche Frequenzen aus einem Eingangssignal herauszufiltern. In dieser Aufgabe sollen Sie diese Schaltungen aufbauen und ihre Funktion untersuchen.

Mit dieser Aufgabe, die auf den ersten Blick etwas außerhalb des Hauptthemen-kreises des Mikrorechner-Praktikums (MRP) zu liegen scheint, sind zwei Lehr- und Lernziele verknüpft:

1. Anhand der von Ihnen aufzubauenden, einfachen elektronischen Schaltungen sollen Sie die Funktion und die Bedienung der im MRP eingesetzten Laborgeräte kennenlernen. Insbesondere sollen Sie auch lernen, für die Einsendeaufgaben eine nachvollziehbare Versuchsbeschreibung anzufertigen, in der die jeweils vorgenommenen Einstellungen der Meßgeräte und der auf dem Oszilloskop beobachtete Signalverlauf protokolliert werden.
2. Die Analyse der einfachen Schaltungsfunktionen soll Ihr Verständnis für typische Aufgabenstellungen der digitalen Signalprozessoren (DSP) stärken und Ihnen zeigen, daß diese viele Aufgaben erheblich flexibler lösen können.

Unvermeidbarerweise werden von Ihnen elektronische Grundkenntnisse erwartet, wie sie gewöhnlich im Physikunterricht an höheren Schulen vermittelt werden. Für den Fall, daß diese Kenntnisse bei Ihnen nicht mehr vorhanden sind, finden Sie im Anhang zu KE8 eine kurze Zusammenfassung, die Sie zur Vor- und Nachbereitung der Versuche heranziehen können.

Zur weiteren Vertiefung des Themas "analoge und digitale Filter" (insbesondere auch FIR-Filter) empfehlen wir das Standardwerk:

U. Tietze, Ch. Schenk: Halbleiterschaltungstechnik, Springer-Verlag, Berlin

Bevor Sie mit den praktischen Versuchen beginnen, lassen Sie sich nun von Ihrem Betreuer die Einstellung der Laborgeräte kurz erklären. Schließen Sie danach den Funktionsgenerator am Oszilloskop an und üben Sie selbständig die Bedienung der Geräte.

Beginnen Sie Ihre Versuche mit Schaltung I (s. Seite 2), dem Tiefpaß. Die Schaltungen II und III müssen Sie nur bearbeiten, wenn Ihnen dazu genügend Zeit zur Verfügung steht. Schließen Sie am Eingang E der Schaltung(en) den Funktionsgenerator und am Ausgang A das Oszilloskop an. Legen Sie das Eingangssignal außerdem auf den 2. Kanal des Oszilloskops.

#### Schaltung I: Tiefpaß

Bild 8A-1: Tiefpaß, Integrierglied

#### Schaltung II: Hochpaß

Bild 8A-2: Hochpaß, Differenzierglied

#### Schaltung III: Bandpaß

Bild 8A-3: Bandpaß

#### Versuch 1:

1. Bauen Sie die Schaltung nach Bild 8A-1 auf. Erzeugen Sie mit dem Funktionsgenerator eine Sinusschwingung UE(t) (ohne Gleichspannungs-Offset) mit einer Amplitude (Maximal- bzw. Minimalwert) von (absolut) U = 5 Volt und einer Frequenz von 1 kHz.
2. Variieren Sie die Frequenz von UE(t) in einem Bereich von ca. 0 Hz bis 50 kHz und beschreiben Sie das am Ausgang A auf dem Oszilloskop zu beobachtende Verhalten der Schaltung. Dabei soll die Einstellung der Kanalverstärkung unverändert bleiben.
3. Skizzieren Sie die "Hüllkurve", die durch die (positiven und negativen) Amplitudenwerte des Ausgangssignals UA(t) entsteht, wenn man die Frequenz im o.g. Bereich variiert. Geben Sie die Frequenzen im logarithmischen Maßstab an (z.B. eine Dekade pro 2 cm oder 2 Kästchen). Kennzeichnen Sie die Frequenzwerte 50 Hz, 500 Hz, 1 kHz, 5 kHz, 50 kHz in Ihrer Skizze. Berechnen Sie außerdem die Grenzfrequenzen fg und tragen Sie diese in Ihre Diagramme ein. Interpretieren Sie anhand der Diagramme die oben genannte Bezeichnung der Schaltung: Tiefpaß.

#### Versuch 2:

1. Geben Sie nun auf den Eingang E ein symmetrisches Rechtecksignal UE(t) (Square Wave, ohne Gleichspannungs-Offset) mit einer (absoluten) Amplitude von U = 5 Volt.
2. Variieren Sie die Frequenz von UE(t) wiederum im Bereich von 0 Hz bis 50 kHz und beschreiben Sie verbal das am Ausgang A auf dem Oszilloskop zu beobachtende Verhalten der Schaltung. Skizzieren Sie die Signale UE(t) und UA(t) für die Frequenzen 50 Hz, 500 Hz, 1 kHz, 5 kHz, 50 kHz.
3. Interpretieren Sie mit Hilfe dieser Skizzen den angegebenen Begriff "Integrierglied".
4. Ermitteln Sie näherungsweise aus den Oszilloskop-Bildern die Zeitkonstante (s. Anhang), die das Verhalten der Schaltungen bestimmt. Vergleichen Sie das Ergebnis mit dem errechneten Wert. Kann man allein aus eindeutig auf die Werte der benutzten Bauteile (R, C) schließen ? Tragen Sie den errechneten Wert für in Ihre Diagramme ein.
5. Welche Bedeutungen (im positiven und negativen Sinn) hat die betrachtete Schaltung I in der Digitaltechnik ? Wozu kann sie (bewußt) eingesetzt werden ? Wo tritt sie störend in Erscheinung ?

#### Versuche 3 und 4: (nur bei ausreichender Zeit)

Wiederholen Sie die Versuche 1 und 2 mit der Schaltung II (nach Bild 8A-2). Interpretieren Sie dabei die angegebenen Begriffe 'Hochpaß' und 'Differenzierglied'.

#### Versuche 5 und 6: (nur bei ausreichender Zeit)

Wiederholen Sie die Versuche 1 und 2 mit der Schaltung III (nach Bild 8A-3). Interpretieren Sie dabei den angegebenen Begriff 'Bandpaß'. Skizzieren Sie im Versuch 2 auch das Ausgangssignal für 1 kHz.

### Aufgabe 8A-2: (nicht fürs Protokoll)

Motivation:

In dieser Aufgabe sollen Sie nun erfahren, wie ein digitaler Signalprozessor die Aufgabe der Filterung eines Signals erfüllt. Wir werden uns dabei auf die einfachste Form der digitalen Filter beschränken, den sog. FIR-Filtern (Finite Impulse Response). Diese hatten Sie bereits in der Einsendeaufgabe 7-3 kurz kennengelernt und dort erfahren, daß FIR-Filter häufig in Modems (Modulator/Demulator) eingesetzt werden, um Leitungsstörungen herauszufiltern. Im Bild 8A-4 ist der prinzipielle Aufbau eines FIR-Filters und seine Funktionsgleichung dargestellt.

Bild 8A-4: Aufbau eines FIR-Filters

Ein FIR-Filter der Ordnung N besteht aus einer Kette von N-1 Verzögerungsstufen (Taps), die das Eingangssignal E(t) jeweils um die Dauer T verzögern und dann an das folgende Glied weiterreichen. Die Zeitdauer T entspricht dabei gerade der Länge des Intervalls, mit dem das Signal abgetastet wird, also dem Kehrwert der Abtastfrequenz. Zu jedem Zeitpunkt (nach der Initialisierungsphase) liegen im Filter N Abtastwerte zur Auswertung vor: Die Abtastwerte werden mit den Koeffizienten ci gewichtet und die entstehenden Teilprodukte zum Ausgangswert A(t) aufaddiert. Sind, wie im Bild A-4 gezeigt, die Koeffizienten ci konstant, so liegt ein nicht-adaptiver Filter vor. Bei einem adaptiven Filter sind die Koeffizienten zeitabhängig.

Wegen des Fehlens jeder Rückkopplung (s. Bild 8A-4) spricht man bei den FIR-Filtern auch von "nichtrekursiven" Filtern (auch: Transversal-Filter). Diese Filter sind stabil, d.h. nach der Eingabe eines Signals mit begrenzter Amplitude und Zeitdauer stellt sich nach endlicher Zeit wieder der Ausgangszustand A=0 ein. Darauf ist auch die aus dem Englischen übersetzte Bezeichnung "Filter mit endlicher Impulsantwort" zurückzuführen. (Beachten Sie den Literaturhinweis auf Seite 1.)

#### Versuch:

Aus KE6 wissen Sie schon, daß sich Algorithmen der Form, wie sie im Bild 8A-4 für die Ausgangsfunktion eines FIR-Filters gezeigt ist, besonders gut durch einen DSP berechnen lassen. Durch geeignete Wahl der Parameter ci können durch ein und dasselbe DSP-Programm alle in der Aufgabe 8A-1 besprochenen analogen Filter und einige weitere Filtertypen durch FIR-Filter in weiten Grenzen nachgebildet werden. Ein solches Programm ist im Software-Paket des EZ-Kit Lite bereits als Demonstrationsprogramm implementiert.

Lassen Sie sich nun von Ihrem Betreuer die Benutzung des digitalen Signalverarbeitungssystems EZ-Kit Lite und seiner Software erklären.

1. Stellen Sie am Funktionsgenerator ein Sinussignal mit einer Amplitude von 0,5 V (und einer Frequenz von 1 kHz) ein und überprüfen Sie es auf dem Oszilloskop. Schalten Sie die Laborgeräte aus und verbinden Sie diese nun mit dem EZ-Kit Lite (mit Hilfe der ausgeteilten Spezialkabel).
2. Aktivieren Sie das Demonstrationsprogramm "Filter" der EZ-Kit-Lite-Software, schalten Sie die Laborgeräte ein und beobachten Sie das Ein- und Ausgangssignal auf dem Oszilloskop für den in Aufgabe 8A-1 festgelegten Frequenzbereich und für alle implementierten digitalen Filtertypen: Tiefpaß, Hochpaß, Bandpaß, Bandsperre. (Die Bandsperre läßt alle Signalfrequenzen passieren, die nicht im vorgegebenen Bereich liegen.) Bestimmen Sie näherungsweise die Grenzfrequenz bzw. die Resonanzfrequenz (s. Anhang D von KE8).
3. Betrachten Sie auch das Ausgangssignal für alle Filtertypen, wenn der DSP das Eingangssignal durch ein (zufällig erzeugtes) Rauschsignal (noise) ersetzt.

#### Ausblick:

In der folgenden Aufgabe zum EZ-Kit Lite sollen Sie nun ein Programm zur Realisierung eines FIR-Filters selbst schreiben, implementieren und austesten. Dabei werden wir in zwei Schritte vorgehen:

1. Zunächst werden Sie ein Programm entwickeln, mit dem der DSP über den Codec AD1847 ein Signal kontinuierlich einliest und dieses ohne weitere Verarbeitung über den Codec wieder ausgibt. Dieses Programm besteht aus den folgenden Hauptkomponenten:
   - Initialisierung des Codecs, der Systemregister und der seriellen Schnittstelle SPORT0,
   - Entwicklung der Interruptroutine zum Einlesen und Ausgeben eines Signalwertes sowie des Hauptprogramms.
2. Dann wird dieses Programm um einen Programmteil zur Berechnung des FIR-Filters ergänzt.

Sie sollen die Lösung jeder Teilaufgabe so weit wie möglich zunächst mit dem Simulator SIM2181.EXE austesten. Erst wenn Sie das Programm vollständig entwickelt haben, müssen Sie es durch das EZ-Kit Lite ausführen lassen. Wir beginnen mit der Angabe eines Flußdiagrammes, das Ihnen die Programmentwicklung erleichtern soll. In mehreren Teilversuchen werden wir Sie dann Schritt für Schritt zur Lösung der gestellten Aufgabe führen.

Aufgabe 8A-3: Programm zur Bedienung des Codecs

(Analysieren Sie den Programmablauf zur Vorbereitung der Präsenzphase.)

Das folgende Bild soll Ihnen den Ablauf der Kommunikation zwischen DSP-Kern, serieller Schnittstelle (SPORT0) und Codec verdeutlichen.

DSP-Kern und SPORT0 kommunizieren über zwei Bereiche im internen Datenspeicher, die als zirkulare Puffer mit automatischer Pufferung angelegt sind. Beide Puffer werden von den Daten-Adreßgeneratoren des DSP-Kerns verwaltet, auf die aber auch der SPORT0 Zugriff hat. Der Datenaustausch zwischen beiden Komponenten geschieht asynchron, d.h., DSP-Kern und SPORT0 arbeiten mit verschiedenen Takten (CLKIN, SCLK0), und zwischen Senden und Empfangen von Daten kann eine "beliebige" Zeit vergehen. Eine Synchronisation zwischen Sender und Empfänger findet durch einen Interrupt immer dann statt, wenn die End-Adresse des jeweiligen Puffers angesprochen und danach das Indexregister wieder auf den Pufferanfang gestellt wird.

- Zur Aktivierung der automatischen Pufferung sollte zunächst durch direktes Einschreiben eines Wertes in das Senderegister TX0 des SPORT0 ein Interrupt ausgelöst werden. Danach schreibt der DSP-Kern die Daten, die der SPORT0 zum Codec übertragen soll, nur noch in den Sendepuffer TX_BUF mit drei Einträgen. Von dort werden sie durch den SPORT0 abgeholt. Anachließend wird der Kern durch einen Transmit-Interrupt zum Auffüllen des neuen Pufferinhalts aufgefordert.
- Der SPORT0 schreibt die Daten, die er vom Codec empfangen hat, in einen Empfangspuffer RX_BUF mit ebenfalls drei Einträgen. Durch einen Receive-Interrupt wird dann der Kern zum Abholen des neuen Pufferinhalts aufgefordert.

Ein dritter Puffer, INIT_CMDS, nimmt die Befehlswörter für den Codec auf. Sein Inhalt wird bei der Initialisierung des Programms und des Codecs sukzessiv über den Transmit-Puffer TX_BUF und den SPORT0 zum Codec übertragen. Die Übertragung zwischen SPORT0 und Codec findet im 32-Kanal-Modus statt. Dabei wird durch das Signal RFS0 der Beginn eines neuen Übertragungsrahmens angezeigt.

### Teilaufgabe 1: Assembler-/Linker-Initialisierungen

In dieser Teilaufgabe sollen Sie die benötigten Variablen und Datenpuffer deklarieren und initialisieren sowie die Interrupttabelle geeignet aufbauen.

- Definieren Sie ein Assembler-Modul mit dem Namen 'FIR'.
- Binden Sie die Liste aller Registernamen des ADSP-2181, die Sie in der Datei 'SYSTEM.K' auf der Festplatte Ihres Praktikums-PCs finden, in das Modul ein.
- Deklarieren Sie eine Speicherzelle als Benutzer-Flag 'stat_flag'.
- Deklarieren Sie einen Ringpuffer 'tx_buf' mit drei Elementen im Datenspeicher, der die zum Codec zu übertragenden Daten (Steuerwort, Ausgabewert linker Kanal, Ausgabewert rechter Kanal) aufnimmt und initialisieren Sie seine Elemente mit den Werten 0xC000, 0x0000, 0x0000.
- Deklarieren Sie einen Ringpuffer 'rx_buf' mit drei Elementen im Datenspeicher, der die vom Codec empfangenen Daten (Statuswort, Eingabewert linker Kanal, Eingabewert rechter Kanal) aufnimmt und initialisieren Sie seine Elemente mit dem Werten 0xC000, 0x0000, 0x0000.
- Deklarieren Sie einen Ringpuffer 'init_cmds' im Datenspeicher, der die zum Codec zu übertragenden Steuerwörter aufnimmt, und initialisieren Sie seine Elemente mit den Parametern zur Einstellung der folgenden Betriebsarten:
  - linken und rechten Kanal von Line1 mit Eingangsverstärkung 1,5 dB versehen,
  - alle vier Hilfskanäle AUX1, AUX2 stummschalten und auf 0 dB setzen,
  - linken und rechten DAC-Ausgangskanal stummschalten und auf 0 dB setzen,
  - vorzeichenbehaftete 16-bit-Wörter (PCM), Monobetrieb, 8-kHz-Abtastrate,
  - Autokalibrierung und Playback einschalten,
  - Anschluß-Steuerregister (Pin Control Register) auf Null setzen,
  - 32 Slots pro Rahmen, Zweidrahtsystem,
  - Digital Mix Control Register auf Null setzen,
  - Codec aktivieren durch Rücksetzen des MCE-Bits (Pufferwert z.B. 0x8000).
- Bauen Sie die Interrupttabelle im ADSP-2181 auf, indem Sie Sprünge zu den Interruptroutinen für das Senden und Empfangen von Daten zum/vom Codec über den SPORT0 einfügen.
- Assemblieren und linken Sie diesen Programmteil und überprüfen Sie die Deklarationen und Initialisierungen mit dem Simulator.

### Teilaufgabe 2: Laufzeit-Initialisierungen

In dieser Teilaufgabe sollen Sie die benötigten Register der Daten-Adreßgeneratoren (DAGs) und der SPORT0-Schnittstelle sowie die Systemregister initialisieren.

- Wählen Sie für jeden der deklarierten Puffer ein geeignetes Index-, Modifizier- und Längenregister (I, M, L) und initialisieren Sie diese.
- Programmieren Sie die SPORT0-Schnittstelle für die folgende Betriebsart, die dadurch vorgegeben wird, daß der Codec im Mehrkanalbetrieb angesprochen wird und Takt und Rahmensignal liefern muß:
  - externe Taktung; (RFSDIV und SCLKDIV können daher auf 0 gesetzt werden;)
  - Wortlänge: 16 bit;
  - keine Kompression der Daten, unbenutzte Bits mit 0 füllen;
  - automatische Pufferung für Senden und Empfangen; (Beachten Sie dabei, daß die DAG-Register initialisiert sein müssen, bevor Sie im SPORT Autobuffer Control Register die Indizes der DAG-Register einsetzen!)
  - Sende- und Empfangsdaten nicht invertieren (positive Logik);
  - Mehrkanalbetrieb;
  - Multichannel Frame Delay auf 1;
  - Receive Frame Sync (RFS0) extern erzeugt;
  - Rahmenlänge 32 Slots;
  - Senden und Empfangen in den Slots 0,1,2 und 16,17,18.
- Programmieren Sie nun die Systemregister für folgende Betriebsart:
  - Anzahl der Wartezyklen für den Programmspeicher und den Datenspeicher auf 0, für die IO-Adreßräume auf 7 setzen;
  - SPORT0 einschalten, SPORT1 ausschalten;
  - (Hinweis: In größeren Anwendungen sollten hier eventuell anstehende Interrupts gelöscht werden. Dabei sollte ein NOP-Befehl angefügt werden. Alle Interruptquellen könnten z.B. auf Pegeltriggerung (level) gestellt; verschachtelte Interrupts ausgeschlossen werden.)
- Assemblieren und linken Sie das bisher entwickelte Programm und überprüfen Sie seine Funktion mit dem Simulator.

### Teilaufgabe 3: Interruptroutine zum Programmieren des Codecs

In dieser Teilaufgabe sollen Sie nun die Interruptroutine zur Übertragung der Steuerwörter (aus dem Puffer 'init_cmds') in den Codec und die Steuerung und Überwachung dieser Routine im Hauptprogramm programmieren.(Benutzen Sie in der Interruptroutine die Schattenregister, um ein ungewolltes Überschreiben der vom Hauptprogramm benötigten Registerwerte zu verhindern.)

- Im Hauptprogramm soll
  - das oben deklarierte Benutzer-Flag auf 1 gesetzt werden; (dieses dient zur Kommunikation zwischen Hauptprogramm und Interruptroutine - s.u.)
  - (nur) der Sendeinterrupt von SPORT0 aktiviert werden;
  - das erste Wort des Sendepuffers 'tx_buf' durch den DAG adressiert und zum Senderegister TX0 des SPORT0 geschickt werden; dadurch wird die Übertragung der Steuerwörter mit automatischer Pufferung gestartet;
  - in einer Schleife das Benutzer-Flag zyklisch solange eingelesen werden, bis es (von der Interruptroutine) auf 0 gesetzt ist.
- Die Interruptroutine soll im einzelnen:
  - überprüfen, ob das o.g. Flag 0 ist und in diesem Fall sofort zurückspringen,
  - das nächste Steuerwort aus dem Initialisierungspuffer 'init_cmds' zum Transmit-Puffer schicken,
  - überprüfen, ob der Initialisierungspuffer komplett gesendet wurde und zum Hauptprogramm zurückspringen, falls das noch nicht der Fall ist,
- Assemblieren und linken Sie das bisher entwickelte Programm und überprüfen Sie die Übertragung der Steuerwörter in den Codec mit dem Simulator. Machen Sie dazu von den Möglichkeiten des Simulators Gebrauch, die seriellen Leitungen des SPORT0 mit Ein-/Ausgabedateien zu "verbinden" und die Signale der seriellen Schnittstelle zu simulieren (Befehl: Interrupt).

### Teilaufgabe 4: Autokalibrierung und Aktivierung der Codec-Ausgänge

- Die Autokalibrierung wird wie folgt durchgeführt:
  - In einer Schleife wird das Statusbit ACI des Codecs solange abgefragt, bis es auf 1 gesetzt ist und damit den Beginn der Kalibrierung anzeigt;
  - Danach wird in einer zweiten Schleife das Statusbit ACI solange abgefragt, bis es wieder auf 0 gesetzt ist und damit das Ende der Kalibrierung anzeigt;
  - Vor der nachfolgenden Aktivierung der Ausgänge muß auf einen Interrupt vom SPORT0 gewartet werden.
- Aufhebung der Stummschaltung von linkem und rechten DAC-Ausgangskanal:
  - Die Steuerwörter für die Kontrollregister des linken und rechten Digital/Analogwandlers des Codecs sind so zu bestimmen, daß die verlangte Dämpfung (s. Teilaufgabe ) erhalten bleibt, die Stummschaltung aber aufgehoben wird.
  - Diese Wörter sind sukzessiv über SPORT0 an den Codec zu senden; nach jeder Übertragung muß jeweils auf einen Sende-Interrupt gewartet werden.

### Teilaufgabe 5: Interruptroutine zum Einlesen, Verarbeiten und Ausgeben der Abtastwerte (Samples)

Schließlich fehlt nur noch der Teil des Hauptprogramms und die Interruptroutine zum Empfangen von Abtastwerten sowie zu deren Verarbeitung und Ausgabe.

- Im Hauptprogramm muß
  - (nur) der Empfangsinterrupt des SPORT0 aktiviert werden, (Hinweis: In größeren Anwendungen sollte hier eine eventuell anstehende Interrupt-Anforderung gelöscht werden.)
  - in einer Endlosschleife (Befehl: IDLE) auf das Eintreffen eines Interrupts zum Empfang eines neuen Abtastwertes im SPORT0 gewartet werden.
- In der Empfangs-Interruptroutine wird
  - der Abtastwert des linken Kanals aus dem Empfangspuffer 'rx_buf' gelesen;
  - der gelesene Abtastwert ohne weitere Verarbeitung in den Sendepuffer 'tx_buf' zur Ausgabe über den linken Kanal des Codecs übertragen;

(Hinweis: In Teilaufgabe 7 wird er durch einen FIR-Filter weiterverarbeitet.)

### Teilaufgabe 6:

In dieser Teilaufgabe sollen Sie nun das entwickelte Programm auf dem EZ-Kit Lite austesten und "zum Laufen" bringen.

- Stellen Sie auf dem Funktionsgenerator ein Sinussignal mit einer Frequenz von ca. 1 kHz, ohne Gleichspannungsoffset und einer Ausgangsspannung von maximal 1 V (= Spannungsdifferenz zwischen positiver und negativer Amplitude) ein. Zur Sicherung der Spannungsbegrenzung benutzen Sie bitte den (-30 dB)-Ausgang bzw. die (-20 dB)-Abschwächung (Attenuation) des Funktionsgenerators.
- Verbinden Sie den Ausgang des Funktionsgenerators mit dem Eingang des EZ-Kit Lites sowie dem 1. Kanal Kanal des Oszilloskops und den Ausgang des Kits mit dem 2. Kanal. Benutzen Sie dazu die zur Verfügung gestellten Spezialkabel (BNC - Audio).
- Starten Sie die Software zum EZ-Kit Lite auf dem PC und laden Sie Ihr (assembliertes und "gelinktes") Programm in das EZ-Kit Lite. Starten Sie es dort und testen Sie es mit unterschiedlichen Frequenzen des Funktionsgenerators aus. Skizzieren Sie Eingangs- und Ausgangsignal für eine Frequenz von 500 Hz, 1 kHz und 2kHz. Verwenden Sie dazu die Mittelwertmessung des Oszilloscops, um das störende Rauschen am Codec-Ausgang heraus zu filtern.
- Falls Ihr Programm nicht auf Anhieb klappt, können Sie zur Lokalisierung des Fehlers die LED des EZ-Kit Lite als Anzeige verwenden, die am Flag-Ausgang FL1 angeschlossen ist. (Befehle: SET/RESET FL1)
- Versuchen Sie, die eben beobachtete Abschwächung zwischen Eingangssignal und Ausgangssignal anhand der zur Verfügung gestellten Unterlagen zu erklären:
  - Datenblatt des AD1487: Spannungsbereich der A/D-Eingänge bzw. D/A-Ausgänge
  - Schaltpläne des EZ-Kit Lite: Beschaltung der Line1-Eingänge des AD1487.
  - Untersuchen Sie, bis zu welcher Grenzfrequenz des Eingangssignals die Abtastung bei der gewählten Betriebsart des Codecs noch funktioniert. Wodurch ist diese Frequenz gegeben ?
- Ändern Sie Ihr Programm (vorübergehend !) dahin gehend ab, daß
  - das Ausgangssignal näherungsweise dieselbe Amplitude wie das Eingangssignal besitzt,
  - die Grenzfrequenz möglichst groß ist.

### Teilaufgabe 7: Programmierung des FIR-Filters

In dieser Aufgabe sollen Sie nun die einfache Interruptroutine aus Versuch 5 um einen FIR-Filter erweitern. Dieser Filter soll 129 Stufen besitzen. Die Koeffizienten Ci werden Ihnen in der Datei FIR1.DAT zur Verfügung gestellt und sollen mit der Direktive '.INIT' in Ihr Programm eingelesen werden.

Gehen Sie zur Lösung der Aufgabe in folgenden Schritten vor:

- Legen Sie im (internen) Programmspeicher einen zirkularen Puffer fir_coeff für die Koeffizienten Ci an und initialisieren Sie ihn aus der Datei FILTER.DAT. "Reservieren" Sie geeignete Register I, M, L eines DAGs für diesen Puffer und initialisieren Sie diese.
- Legen Sie im (internen) Datenspeicher einen zirkularen Puffer fir_data für die eingelesenen Stützwerte E(t) an. "Reservieren" Sie geeignete Register I, M, L eines DAGs für diesen Puffer und initialisieren Sie diese. Initialisieren Sie alle Elemente des Puffers mit dem Wert 0.
- Fügen Sie die Befehlsfolge zur Berechnung eines Filterwertes in das Programm ein. Runden Sie jeweils das Ergebnis und nehmen Sie u.U. eine Sättigung vor.
- Geben Sie den berechneten Wert auf beide Ausgangskanäle des Codes aus.
- Testen Sie Ihr Programm auf dem EZ-Kit Lite. Geben Sie mit dem Funktionsgenerator ein Sinussignal mit Frequenzen zwischen 0 Hz und 3 kHz ein und stellen Sie dieses Signal und das Ausgangssignal des Codecs auf dem Oszilloskop dar. Um welchen Filter mit welcher charakteristischen Frequenz handelt es sich ?
- Ermitteln Sie (mit Hilfe des Simulators) die Zeit für die Berechnung eines einzelnen Ausgabewertes. Dazu können Sie den Zyklenzähler im Fenster "Program Control" des Simulators benutzen.
- Bestimmen Sie (näherungsweise) die maximale Abtastfrequenz bei einem Systemtakt von 16,667 MHz im vorliegenden System.

Aufgabengruppe 8B: Einfache Versuche zum Mikrocontroller C167

Motivation:

In dieser Aufgabengruppe sollen Sie auf sehr hardwarenaher Ebene mit typischen Mikrocontroller-Eigenschaften bekannt gemacht werden. Dazu verwenden Sie das I+ME EVABoard C167 2.0. Anhand kleiner Versuche werden Sie wichtige Signale und Funktionen analysieren und dabei auch lernen, einen einfachen Logikanalysator einzusetzen und zu bedienen. Zur Lösung der Aufgaben werden Sie sich intensiv mit den beiliegenden Handbüchern auseinander setzen müssen. Ein wichtiges Nebenziel dieser Aufgabengruppe ist es, die Arbeit mit diesen Unterlagen zu üben. Selbstverständlich müssen wiederum alle aufgezeichneten Signale und die verlangten Erklärungen, Interpretationen und Beschreibungen ins Protokoll aufgenommen werden.

Bevor Sie nun mit den Messungen beginnen, lassen Sie sich kurz von Ihrem Betreuer die Bedienung und die Software des C167-Systems (synonym: Board, Kit) und des Logikanalysators erklären.

Aufgabe 8B-1: Signalmessungen und Logikanalyse

Versuch 1: Systemtakt

- Beobachten Sie mit dem Oszilloskop den Systemtakt CLK (Clock) des C167 (am Anschluß E6 des 160-poligen Steckers). Zeichnen Sie eine Vollschwingung auf und berechnen Sie die externe Taktfrequenz.
- Zeichnen Sie nun den Systemtakt mit dem Logikanalysator auf und bestimmen Sie mit Hilfe der beiden verschiebbaren Zeitlinien (Cursor) die Länge einer Vollschwingung, der Impulsdauer sowie der Impulspause. Überlegen Sie, aus welchen meßtechnischen Bedingungen heraus das Taktsignal verfälscht dargestellt wird. Zeichnen Sie das gemessene Signal auf.

Versuch 2: Rücksetzen (RESET) und Systemkonfiguration

- Machen Sie sich anhand des Benutzer-Handbuchs (User Manual) mit den verschiedenen Rücksetzmöglichkeiten des C167 und den Aktionen, durch die sie ausgelöst werden, vertraut. (Kurzbeschreibung ins Protokoll). Setzen Sie einerseits den C167 durch den Rücksetz-Taster des Boards, andererseits durch den Aufruf des C167-Debuggers zurück. Zeichnen Sie dabei jeweils die Signale RSTIN (Steckeranschluß B5) und RSTOUT (Anschluß C5) auf dem Oszilloskop auf. Erklären Sie das unterschiedliche Verhalten des Signals RSTOUT.
- Machen Sie sich anhand des Benutzer-Handbuchs des C167 mit den verschiedenen Konfigurations-Möglichkeiten des Systems nach dem Rücksetzen und ihre Festlegung vertraut (Kurzbeschreibung ins Protokoll). Stellen Sie die aktuelle Systemkonfiguration Ihres C167-Systems wie im Bild 17-3 des Hardware Manuals zum C167 dar. Benutzen Sie dazu den Schaltplan im Hardware Manual zum Board und ermitteln Sie damit die aktuelle Position der Auswahlbrücken (Jumper). Interpretieren Sie die Belegung der signifikanten Bitfelder in den Registern SYSCON, BUSCON und RP0H.

Versuch 3: Chip-Select- und Waitstate-Logik

- Geben Sie das folgende kurze Maschinenprogramm in den C167 ein und starten Sie es. Vervollständigen Sie die Tabelle.

Adresse | Befehl | Assembler-Befehl | Bemerkung
000200 | E6 02 0F 00 |  |
000204 | F2 F0 00 B4 |  |
000208 | F6 F0 00 B4 |  |
00020C | EA 00 00 02 |  |

- Ändern Sie den Zustand der 8 DIP-Schalter (Dual-Inline Package) auf dem C167-Board und beschreiben Sie die Auswirkungen auf die 8 LEDs. Unter welchen absoluten Speicheradressen bzw. Adreßbereichen werden die DIP-Schalter und LEDs angesprochen? Welche Signale dienen zu ihrer Selektion? Geben Sie an, welche Angaben des Benutzerhandbuches zum C167-Board zur Bestimmung der Adressen und Selektionssignale für die genannten Komponenten benötigt werden.
- Betrachten Sie mit dem Oszilloskop das Chip-Select-Signal CS1 (am Steckeranschluß A30). Legen Sie auf den 2. Kanal des Oszilloskops das Lesesignal RD (Anschluß B6). Zeichnen Sie beide Signale (für das Protokoll) auf. Messen Sie die Zeitdauern für beide Signale. Geben Sie an, welche Bedeutung das Register ADDRSEL1 für das Signal CS1 hat.
- Zeichnen Sie die Signale CLK, CS1, RD und WR (Anschlüsse E6, A30, B6, C6) bei der Ausführung des obenstehenden Programmstückes mit dem Logikanalysator auf (Skizze ins Protokoll). Bestimmen Sie aus den Messungen die Anzahl der Wartezyklen, die beim Zugriff auf die LEDs und Schalter eingefügt werden. Beschreiben und interpretieren Sie den Verlauf der aufgezeichneten Signale.

Verbinden Sie zunächst das C167-Board mit der beiliegenden Adapterkarte! (Achtung: Verbinden Sie den CLK-Anschluß erst nach dem Starten des C167-Debuggers und seiner Initialisierung mit dem Logikanalysator !!)

- Zeichnen Sie den Ablauf des obenstehenden Programmstücks auf dem Daten- und Adreßbus (D15 - D0, A9 - A0) mit dem Logikanalysator auf. Stellen Sie auch die Signale CLK, CS1, RD, WR dar. Interpretieren Sie die einzelnen Aktionen in den dargestellten Zyklen.
- Legen Sie das obenstehende Programmstück nun in den internen Speicher ab der Adresse F800h (= $F800) ab. Ändern Sie dabei das letzte Byte zu F8h. Wiederholen Sie die Messungen der Signale CLK, CS1, RD und WR mit dem Logikanalysator. Welche Unterschiede stellen Sie fest?
- Ermitteln Sie den aktuellen Inhalt der Register BUSCON1 und ADDRSEL1, die für die Generierung des Signals CS1 maßgebend sind. Interpretieren Sie den Inhalt der Register und den Verlauf der aufgezeichneten Signale.

- Welche Wirkung hat eine Änderung der Bits CSREN, CSWEN im Register BUSCON1 auf die Form der gemessenen Signale?
- Ändern Sie nun den Inhalt der Register so, daß nur beim Schreibzugriff auf den selektierten Adreßbereich ein CS-Signal erzeugt wird und dabei 3 Wartezyklen eingefügt werden. Zeichnen Sie auch das so erzeugte Signal auf. Was ändert sich nun beim Betätigen der DIP-Schalter?

Aufgabe 8B-2: Timer Unit

Versuch:

In dieser Aufgabe sollen Sie die Arbeit mit den universellen Zeitgebern/Zählern (General Purpose Timer) des C167 kennenlernen. Als "Versuchsobjekt" haben wir dazu den Timer 3 ausgewählt.

- Stellen Sie anhand des Datenbuches fest, welche Portleitungen für den Timer 3 benutzt werden und welche Funktionen sie in den verschiedenen Timer-Modi besitzen. (Erklärung ins Protokoll.)
- Programmieren Sie die Portleitung des Steuereingangs T3IN von Timer 3 als statische Eingangsleitung. Verbinden Sie über einen 1-k-Schutzwiderstand den Eingang T3IN mit einem Schalter des Experimentierboards und lesen Sie den Zustand des Schalters ein. (Zur Verbindung von Adapterkarte und Experimentierboard benutzen Sie bitte das beigefügte Flachbandkabel.)
- Programmieren Sie nun Timer 3 für den einfachen Zeitgebermodus (Timer Mode) und starten Sie ihn. Geben Sie nacheinander die minimale und die maximale Zählzyklus-Länge ein. (Beachten Sie dabei, daß die entsprechenden Timer-Register direkt im Memory-Fenster manipuliert werden müssen und nicht im SFR-Fenster.) Beobachten Sie das Ausgangssignal auf dem Oszilloskop und zeichnen Sie es auf. Wiederholen Sie die Messung und Aufzeichnung mit dem Logikanalysator und bestimmen Sie Impuls- und Pausendauer des Ausgangssignals. Stoppen Sie danach den Timer.
- Programmieren Sie Timer 3 nun für den gesteuerten Zeitgebermodus (Gated Timer Mode, active high) und starten Sie ihn. Beobachten Sie das Ausgangssignal auf dem Oszilloskop und zeichnen Sie es auf. Betätigen Sie den Schalter an T3IN und beobachten Sie seine Wirkung.
- Stellen Sie mit Hilfe des Oszilloskops am Funktionsgenerator eine symmetrische Rechteckschwingung mit der Frequenz 1 Hz. Geben Sie diese Schwingung über den TTL-Ausgang des Generators auf den Zählereingang T3IN des Timer 3. Verbinden Sie den Eingang T3EUD des Timers 3 mit einem entprellten Schalter auf dem Experimentierboard. Programmieren Sie nun den Timer 3 für den Counter Mode (Zählmodus) und starten Sie ihn. Geben Sie eine Befehlsfolge ein, die den Zählerstand zyklisch liest und sein niederwertiges Byte über die LEDs des C167-Boards ausgibt. Ändern Sie zwischendurch die Zählrichtung durch den Schalter am Steuereingang T3EUD. Führen Sie diesen Versuch mit den drei Trigger-Möglichkeiten "positive Flanke", "negative Flanke" und "beide Flanken" durch.

Aufgabengruppe 8C: Versuche zu den Peripheriemodulen des C167

Die folgenden Aufgaben sollen Sie insbesondere mit der Bedienung des Assemblers 'as14' vertraut machen. Benutzen Sie dazu das vorgegebende Programmgerüst 'main.asm'. Diese Datei finden Sie im Unterverzeichnis E:\C167. In dieses Programmgerüst sollen Sie die von Ihnen entwickelten Unterprogramme einfügen. Die Datei wird (Angabe ohne Erweiterung '.ASM' !) mit der Stapelverarbeitungsdatei 'asm.bat' assembliert und in das Intel-Hex-Format umgewandelt. Diese Datei können Sie im Debugger mit dem Menüpunkt 'File\Intel-Hex' in den C167 einlagern. Zum Editieren der Datei benutzen Sie bitte den integrierten Editor des Datei-Verwaltungsprogramms dn (DOS Navigator). Die Assemblerdatei kann auch in einem DOS-Fenster unter Windows assembliert werden.

Aufgabe 8C-1: Die CAPCOM-Einheiten

Der C167 besitzt Capture/Compare-Einheiten (CAPCOM units) mit insgesamt 32 Kanälen. Diese Kanäle können mit vier unabhängigen Zeitgebern (Timer) zusammenarbeiten. Die CAPCOM-Einheiten können einerseits als Reaktion auf das Auftreten eines externen oder internen Triggersignals den aktuellen Inhalt eines festgelegten Timers in ein Register ablegen (Capture). Andererseits können sie den aktuellen Inhalt eines Timer-Zählregisters mit einem vorgegebenden Wert vergleichen (Compare) und ein bestimmtes digitales Ausgangssignal generieren, ohne daß auf Software zurückgegriffen werden muß. Die CAPCOM-Einheiten können als Software-Zeitgeber (Timer), als Zähler für externe Ereignisse oder zur Erzeugung von Ausgangssignalen mit modulierten Pulsweiten eingesetzt werden. Beim Auftreten eines Capture-/Compare-Ereignisses kann jeweils ein Interrupt ausgelöst werden.

In der KE8 wurde bereits erwähnt, daß der C167 bis zu 56 Interruptquellen besitzt, die in 16 Prioritätsebenen eingeteilt werden. Außerdem kann jede Ebene noch einmal in 4 Prioritäten aufgeteilt werden. Machen Sie sich anhand des Manuals mit den CAPCOM-Einheiten vertraut und stellen Sie insbesondere fest, in welchen Registern die Interruptprioritäten der CAPCOM-Einheiten festgelegt werden.

Versuch 1: Interrupt-Erzeugung

In der Vorlagedatei 'main.asm' finden Sie ein Programm zur Erzeugung eines Lauflichts mit Hilfe des CAPCOM-Kanals CC28 und des Timers T7.

- Erweitern Sie die Interruptroutine, so daß auf dem Port P7.5 ein periodisches Signal ausgegeben wird. Bestimmen Sie mit dem Oszilloskop die Periodendauer des Ausgangssignals.
- Kommentieren Sie den kompletten Programmtext.

Versuch 2: Output Compare und Input Capture

- Schreiben Sie ein Assembler-Programm, das mit Hilfe des CAPCOM-Kanals CC28 ein pulsweitenmoduliertes Signal (PWM) ausgibt. Ordnen Sie diesem Kanal den Timer T7 zu. Stellen Sie die größtmögliche Frequenz für den Timer T7 ein (T7REL=0). Mit welchen Compare-Werten muß das CAPCOM-Register CC28 geladen werden, um die folgenden Puls-Pausenverhältnisse zu erzielen:

Puls-Pausenverhältnis | Compare-Wert | Pulsdauer ms | Pausendauer ms
1:0.3 |  |  |
1:1 |  |  |
1:1.5 |  |  |

- CAPCOM-Timer: Schreiben Sie ein Assembler-Programm, das mit Hilfe des CAPCOM-Kanals CC29 die Periodendauer eines Rechtecksignals bestimmt und das High-Byte auf die LED-Zeile des Boards ausgibt. Dabei sollen nur "echte" Werte für die Periodendauer dargestellt werden. Das Signal soll durch den Funktionsgenerator an seinem TTL-Ausgang zur Verfügung gestellt werden und ein Frequenzbereich zwischen 100 Hz und 5 kHz abdecken. Welche Informationen werden für 100 Hz und 2 kHz über die LEDs angezeigt ? Wie groß ist der maximale Meßfehler ?

Aufgabe 8C-2: Die PWM-Einheiten

Versuch: Ausgabe eines pulsweitenmodulierten Signals

Im folgenden soll der PWM-Kanal 0 zur Ausgabe eines pulsweiten modulierten Signals eingesetzt werden.

- Erzeugen Sie mit Hilfe des PWM-Kanals 0 durch Setzen der entsprechenden Register im Debugger (kein Programm) folgende Signale. Kontrollieren Sie die Frequenz und Pulsweite auf dem Oszilloskop.

PWMCON0 |  | PWMCON1 |

f [kHz] | Pulsdauer | PP0 | PW0
1 | 10% |  |
2 | 33% |  |
10 | 66% |  |

- Das Programm aus Versuch 2 von Aufgabe 8C-1 (Periodendauermessung) soll wie folgt erweitert werden: Mit Hilfe des Timers T8 soll die Messung nur noch alle 250 ms erfolgen. Das höherwertige Ergebnisbyte der Periodendauermessung wird auf der LED-Reihe ausgegeben. In Abhängigkeit von der Frequenz soll nun die Pulsdauer des PWM-Signals verändert werden. Die Frequenz des PWM-Kanals soll 1kHz betragen.

PWMCON0 |  | PWMCON1 |

Frequenz-bereich [kHz] | Pulsdauer | PP0 | PW0
0,1-0,5 | 10% |  |
0,5-1,0 | 20% |  |
1,0-1,8 | 30% |  |
1,8-2,3 | 60% |  |
2,3-3,0 | 90% |  |

Aufgabe 8C-3: Die PEC-Kanäle und der A/D-Wandler

- Unter Verwendung des A/D-Wandlers soll nun die Abtastung eines Analogsignals erfolgen.

Stellen Sie am Funktionsgenerator ein Sinussignal zwischen den Spannungswerten -0.4 V und +0.4 V ein. Die Frequenz soll 1kHz betragen. Benutzen Sie dazu den Ausgang des Funktionsgenerators mit 30dB-Dämpfung (bzw. 20dB).

Kontrollieren Sie die Ausgangsspannung auf dem Oszilloskop und lassen Sie die Einstellungen durch den Betreuer überprüfen. Schließen Sie erst danach den Funktionsgenerator an Pin 5 der Steckerleiste JP41 an.

- Die Abtastung des Signals soll über eine volle Periode erfolgen. Eine Folge von 64 Wandlungen soll erfaßt werden und im Speicherbereich ab 1200h abgelegt werden. Die Werte sind auf 8 bit zu runden. Der A/D-Wandler soll auf die maximale Wandlungsdauer eingestellt sein. Am Ende der Erfassung wird der (vorzeichen-lose) Mittelwert des Signals berechnet und das High-Byte des Mittelwertes auf der LED-Reihe des Boards angezeigt.

Der Transfer der Daten soll unter Verwendung des PEC-Kanals 0 geschehen.

Welche Abtastrate wird verwendet ? Wie lange dauert eine Wandlung ? Erklären Sie das Wandlungsprinzip des A/D-Wandlers.