USB-20-µs-Logikanalysator        

 
Elektronik-Labor  Literatur  Projekte  Lernpakete  Mikrocontroller



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

End Sub


Download: Alle drei VB-Projekte : Logger.zip




Elektronik-Labor  Literatur  Projekte  Lernpakete  Mikrocontroller