Das Lernpaket MSR mit dem PC basiert ebenso wie das Lernpaket Elektronik Start mit USB
auf einer Schnittstellenplatine mit dem FT232R. Alle digitalen Ein- und
Ausgänge sind direkt zugänglich. Damit sind auch
zeitkritische Vorgänge wie z.B. die Untersuchung digitaler
Schaltungen möglich. Die hier vorgestellten Anwendungen stammen
zum Teil aus dem Handbuch des Lernpakets und sind in gleicher
Weise auch mit einer echten seriellen Schnittstelle z.B. mit der Elexs-Platine durchführbar.
Logikanalysator
Ein
Logikanalysator zeichnet digitale Signale auf und ermöglicht eine
Betrachtung schneller Vorgänge. Hier wird ein Kanal über den
Eingang CTS eingelesen und dargestellt. Ein Messergebnis kann in
unterschiedlichen Zeitmaßstäben betrachtet werden. Die
Messung kann einmal ausgeführt oder automatisch einmal pro Sekunde
wiederholt werden.
Darstellung eines digitalen Signals
Die
zeitliche Auflösung der Aufnahme beträgt 20 µs.
Insgesamt werden 5500 Messpunkte erfasst, die Messung dauert also 110
ms. Die Darstellung der Daten erfolgt in Abhängigkeit von der
eingestellten Zeitbasis zwischen einer und zehn Millisekunden pro
Skalenteil.
REALTIME TIMEINIT For n = 1 To 5500 Ch1(n) = CTS While TIMEREAD < (n * 0.02) Wend Next n NORMALTIME Plot
Aufzeichnung der Eingangszustände
Falls
eine geeignete Signalquelle fehlt, kann das Programm wieder mit einem
Vorverstärker getestet werden, dessen Eingang man mit dem Finger
berührt. Die gemessen 50-Hz-Signale zeigen eine Periodendauer von
20 ms, die man mit der Zeitbasis 10 ms/Skt leicht abmessen kann.
Triggerung
Bei
der Beobachtung digitaler Signale benötigt man oft eine definierte
Anfangsbedingung wie z.B. eine steigende oder fallende Flanke. Damit
lassen sich auch seltene Ereignisse untersuchen, weil die Messung erst
im richtigen Moment gestartet wird. Das Beispiel zeigt ein über
eine RS232-Schnittstelle gesendete Bytes 65 (ASCII "A") bei einer
Übertragungsrate von 1200 Baud. Durch die positive Triggerflanke
beginnt die Messung mit dem Starbit des ersten Bytes.
Triggerung auf eine steigende Flanke
Die
Triggerung benötigt zwei zusätzliche Schleifen, um an den
Anfang der gewünschten Flanke zu gelangen. Der folgende Ausschnitt
aus dem Gesamtprogramm zeigt die Triggerung auf eine positive Flanke.
REALTIME wird erst vor Eintritt in die eigentliche Messschleife
aufgerufen, damit das Programm bedienbar bleibt, auch wenn das
Triggerereignis ausbleibt.
While CTS = 1 DoEvents Wend While CTS = 0 DoEvents Wend REALTIME TIMEINIT For n = 1 To 5500 Ch1(n) = CTS While TIMEREAD < (n * 0.02) Wend Next n NORMALTIME Plot
Flankenerkennung während der Messung
Mit
Triggerung bei einer positiven oder negativen Flanke beginnt die
Darstellung immer erst einige Mikrosekunden nach dem Triggerereignis.
Um den wahren Beginn eines Signals zu zeigen, verwendet man die
Vortriggerung. Tatsächlich wird die Messung laufend wiederholt,
bis ein Signal aufgetreten ist. Erst nachträglich wird der
dargestellte Zeitrahmen festgelegt. Die eigentliche Messung ist daher
länger, sodass ein geeigneter Abschnitt an den Anfang kopiert
werden kann.
Alt = CTS Trigger = 0 While Trigger = 0 REALTIME TIMEINIT For n = 1 To 12000 Ch1(n) = CTS If Alt <> Ch1(n) Then Trigger = n While TIMEREAD < (n * 0.02) Wend Next n NORMALTIME DoEvents Wend If Trigger > 100 Then If Trigger > 6000 Then Trigger = 6000 For n = 1 To 5500 Ch1(n) = Ch1(n + Trigger - 100) Next n End If Plot
Vortriggerung
Messung mit Vortriggerung
Erweiterter Messumfang
Das folgende Programm wurde entwickelt, um den
Flash-Download eines Mikrocontrollers zu analysieren. Dabei tritt das Problem
auf, dass einerseits sehr schnelle Zustandswechsel z.B. an der Taktleitung und
der Datenleitung auftreten, andererseits aber auch lange Pausen und lange
Impulse z.B. an der Reset-Leitung. Beides zusammen sprengt die Speichertiefe und
die Darstellungsmöglichkeiten eines normalen Logikanalysators. Damit man
überhaupt eine Übersicht erhält, ist es nötig, Zustandswechsel und Zeitspannen
zu speichern. Damit passen dann schnelle und langsame Vorgänge zusammen in eine
Messung. Die Ausgabe erfolgt in Textform: Laufende Nummer, Zustand aller vier
Leitungen, Zeit in Mikrosekunden seit dem letzten registrierten Zustand und schließlich
alle vier Eingangsleitungen einzeln.
Insgesamt werden 20000 Zustandswechsel erfasst. Nur
die ersten 1000 erscheinen im Textfenster. So hat man schon mal einen ersten
Eindruck. Alle Ereignisse findet man dann in einer Textdatei Ausgabe.txt. Die
entscheidende Frage ist nun, wie schnell die Pegelwechsel sein dürfen. Im Bild
wird ein Rechtecksignal mit ca. 8 kHz beobachtet, das in diesem Fall nur an
einer Leitung anliegt. Für den Test wurde eine echte serielle Schnittstelle mit
WindowsXP verwendet. Die Frequenz wurde immer weiter erhöht, bis ein Zustand im
Schnitt nur noch 10 Mikrosekunden lang anhielt. Hier zeigten sich die ersten
Messfehler. Zwar konnten viele Pegelwechsel im Abstand 10 µs korrekt erfasst
werden, aber manchmal tauchte der Wert 30 µs auf. Das war dann ein Hinweis
darauf, dass ein Wechsel überlesen worden war. Die erreichbare Geschwindigkeit
reichte übrigens nicht für die ursprüngliche Aufgabe. Aber immerhin können nun
komplexe Signale bis zu einer zeitlichen Auflösung von ca. 20 µs verfolgt
werden.
Private Sub Command1_Click() TIMEINIT REALTIME d2 = INPUTS() Dat(0) = d2 Zeit(0) = 0 t2 = TIMEREAD() n = 1 Do d1 = INPUTS() t1 = TIMEREAD() If d1 <> d2 Then Dat(n) = d1 Zeit(n) = t1 - t2 t2 = t1 d2 = d1 n = n + 1 End If Loop Until (n > 19999) Or (t1 > 5000) NORMALTIME
Text2.Text = "" For n = 0 To 1000 t = Round(Zeit(n) * 1000) Text2.Text = Text2.Text + Str$(n) + " " + Str$(Dat(n)) + " " + Str$(t) + " " Text2.Text = Text2.Text + Str$((Dat(n) And 8) / 8) + " " Text2.Text = Text2.Text + Str$((Dat(n) And 4) / 4) + " " Text2.Text = Text2.Text + Str$((Dat(n) And 2) / 2) + " " Text2.Text = Text2.Text + Str$((Dat(n) And 1) / 1) + " " + Chr(13) + Chr(10) Next n DoEvents
Open "Ausgabe.Txt" For Output As #1 For n = 0 To 19999 t = Round(Zeit(n) * 1000) Print #1, Str$(n) + " " + Str$(Dat(n)) + " " + Str$(t) + " "; Print #1, Str$((Dat(n) And 8) / 8) + " "; Print #1, Str$((Dat(n) And 4) / 4) + " "; Print #1, Str$((Dat(n) And 2) / 2) + " "; Print #1, Str$((Dat(n) And 1) / 1) + " " Next n