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:
- 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.
- 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:
- 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.
- 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.
- 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:
- 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.
- 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.
- Interpretieren Sie mit Hilfe dieser Skizzen den angegebenen
Begriff "Integrierglied".
- 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.
- 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.
- 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).
- 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).
- 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:
- 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.
- 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.
| 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.
| 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.