Logic Analyzer

Über den Beitrag

In diesem Beitrag möchte ich über den 8-Kanal 24 MHz Logic Analyzer und die Software Logic 2 berichten. Nachdem ich schon einiges darüber gehört hatte, bin ich erst kürzlich dazu gekommen, mir das Teil näher anzuschauen – und bin wirklich sehr davon angetan. Insbesondere bei der Fehlersuche und der Analyse von Datenübertragungen halte ich das Gerät für ausgesprochen nützlich.

Der 24 MHz, 8-Kanal Logic Analyzer

Folgendes erwartet euch:

Logic Analyzer – Grundlagen / Eigenschaften

Was macht ein Logic Analyzer? Kurz gesagt: Ein Logic Analyzer prüft in einer bestimmten Frequenz, ob sich ein angeschlossener Kontakt (also z.B. ein Pin oder eine Leitung) auf einem HIGH- oder LOW-Niveau befindet. Man kann ihn sich als ein Oszilloskop vorstellen, welches lediglich die logischen Zustände HIGH und LOW kennt. Die Daten werden über USB gestreamt und durch ein Programm ausgewertet. Es gibt aber auch eigenständige Geräte mit Display und Bedieneinheit. 

Die Messfrequenz des Logic Analyzer muss ein Mehrfaches der Frequenz der zu messenden Signale betragen. Für diesen Beitrag verwende ich einen der gängigen, günstigen Logic Analyzer, die es schon ab 10 Euro bei Amazon oder anderen Online-Shops gibt. Mit seiner Messfrequenz von 24 MHz ist er für die meisten Anwendungen im Bereich der Mikrocontroller ausreichend.

Bezüglich der Logiklevel habe ich variierende Angaben gefunden. Die Grenze, bis zu der LOW Signale sicher als LOW erkannt werden, scheint demnach zwischen 0.6 und 1.0 Volt zu liegen. Für den Beginn des HIGH Bereiches lagen die Angaben zwischen 1.2 und 1.8 Volt. Ob die Geräte tatsächlich unterschiedlich sind oder nur die Angaben der Anbieter, vermag ich nicht zu sagen. Auf jeden Fall sind sie damit für die gängigen 5 und 3.3 Volt basierten Mikrocontroller geeignet.

Für Geräte mit höheren Messfrequenzen müsst ihr erheblich mehr Geld ausgeben. Bei Saleae bekommt ihr Logic Analyzer, die mit 100 oder 500 MHz abtasten, die dann aber auch einige hundert bis über tausend Euro kosten.

Als Software stelle ich Logic 2 von Saleae vor. Ihr könnt das Programm hier herunterladen. Die Installation ist so einfach und unproblematisch, dass ich nicht darauf eingehe. Nach der Installation verbindet ihr den Logic Analyzer mit dem PC und er wird sofort erkannt. Jedenfalls war das bei mir so.

Ein aufmerksamer Leser hat darauf hingewiesen, dass die Lizenzbedingungen es nicht erlauben, Logic 2 mit Geräten anderer Hersteller zu betreiben, obwohl es problemlos funktioniert! Der Hinweis ist recht gut versteckt. Ich möchte zumindest darauf hingewiesen haben. Ihr müsstet euch also entweder einen Logic Analyzer von Saleae zulegen oder eine alternative Software besorgen, um nicht dagegen zu verstoßen.

Logic 2 – erster Überblick

Nachdem ihr Logic 2 installiert habt, verbindet ihr den Logic Analyzer mit dem PC und startet das Programm. Hier erst einmal ein Überblick:

Logic 2 Screen
  1. Logic 2 Fenster: Logic Analyzer connected oder disconnected
  2. Hauptmenü
  3. Zeitachse, mit +/- oder Mausrad skalierbar
  4. Kanäle 0 – 7
  5. Start / Stopp Button
  6. Seitenmenü
  7. Device Settings: Einstellungen für den Logic Analyzer
  8. Analyzer: Aktivierung von Analyseprogramme
  9. Timing Markers, Measurements & Notes: Auswertung von Messungen
  10. Extensions: Installierbare Add-Ons
  11. Kommunikation: hier geht es zu Forum und Support
  12. Alternative zum Hauptmenü
  13. Sessions: sehr praktisch, um zwischen verschiedenen Sitzungen mit unterschiedlichen Einstellungen zu wechseln

Vielleicht ist euch aufgefallen, dass die Kanäle in Logic 2 von 0 bis 7 nummeriert sind. Hingegen sind sie auf dem Logic Analyzer mit 1 bis 8 bezeichnet. Aber es ist einfach nur eine Verschiebung um 1. Kanal 1 des Logic Analyzer ist Kanal 0 in Logic 2, usw.

Looping, Timer und Trigger Messungen mit dem Logic Analyzer

Es gibt drei Methoden, um die Messungen zeitlich zu steuern:

  • Looping: die Messung wird manuell gestartet und läuft endlos, bis sie manuell gestoppt wird. Die Messwerte werden in einem Puffer gespeichert. Wenn der Puffer voll ist, werden die ältesten Werte zugunsten neuer Werte gelöscht.
  • Timer: auch hier startet ihr die Messung manuell, aber legt die Dauer fest.
  • Trigger: bei dieser Methode legt ihr – ähnlich wie bei Interrupts – ein Ereignis fest, durch das die Messung gestartet wird. Das könnte beispielsweise ein LOW-HIGH-Wechsel (steigende Flanke) sein. Die Messdauer könnt ihr frei wählen.

Looping Messung

Als erstes Beispiel schauen wir uns ein konstantes PWM-Signal (Pulsweitenmodulation) an, das mit einer analogWrite() Anweisung erzeugt wird. Mithilfe dieses Signals wird eine LED auf eine bestimmte Helligkeit eingestellt. Als Board habe ich einen Arduino Nano gewählt. Hier der kurze Sketch:

const int analogWritePin = 6;

void setup() {
  pinMode(analogWritePin, OUTPUT);
  analogWrite(analogWritePin, 51);
}

void loop() {}

 

Und nun zur Schaltung. Grundsätzlich braucht man ein gemeinsames GND. Am Logic Analyzer, den ich hier durch die Buchse symbolisiere, stehen zwei GND Pins zur Verfügung. Das PWM Signal erfassen wir mit Pin 1 des Logic Analyzer.

PWM Messung mit dem Logic Analyzer
PWM Messung mit dem Logic Analyzer
Looping Einstellungen

Da das Signal permanent vorhanden ist, können wir die Looping Methode verwenden. Dazu geht ihr im Seitenmenü auf die Device Settings und wählt „Looping“. Als Messfrequenz habe ich 2 MS/s (= 2 Mio. Samples pro Sekunde) eingestellt. Da die PWM Frequenz bei ca. 1 kHz liegt, hätte ich auch einen deutlich niedrigeren Wert wählen können.

Mit „Trim data after stopping“ könnt ihr die erfassten Daten auf einen bestimmen Zeitraum reduzieren.

Der „Glitch filter“ (glitch = Störung) entfernt Störsignale. Glitches machen sich durch Signale mit einer auffällig kurzen Dauer bemerkbar. Wenn so etwas auftritt, dann könnt ihr den Filter für den betreffenden Kanal aktivieren. Dabei könnt ihr einen zeitlichen Grenzwert setzen. Alle Signale mit geringerer Dauer werden herausgefiltert.  

Mit der „Memory buffer size“ stellt ihr ein, wieviel RAM als Pufferspeicher verwendet werden darf. Ist der Puffer voll, werden die jeweils ältesten Daten aus dem Puffer gelöscht.

Nun ist es so weit: Klickt auf den Startknopf und dann – wann immer ihr wollt – auf Stopp. Dann geht mit der Maus auf das Ergebnis von Kanal 0 und stellt mit dem Mausrad die gewünschte Skalierung ein. Haltet ihr die linke Maustaste gedrückt, könnt ihr die Kurve verschieben.

analogWrite / PWM Analyse mit dem Logic Analyzer
analogWrite / PWM Analyse

Wenn ihr mit dem Mauszeiger auf die Ergebniskurve des Kanals 0 geht, bekommt ihr automatisch die Signalabstände, die PWM-Frequenz und den Duty Cycle angezeigt. Letzterer liegt erwartungsgemäß bei 20 Prozent.

Messdaten löschen

Wenn ihr Daten löschen wollt, dann macht einen Rechtsklick an einer Referenzstelle, geht zu „Delete“ und wählt eure Option.

Messdaten des Logic Analyzer löschen
Messdaten des Logic Analyzer löschen

Timer Messung

Die Timermessung bietet sich beispielsweise an, wenn ihr die Anzahl an Ereignissen in einem bestimmten Zeitraum ermitteln wollt.

Die Länge einer Timermessung stellt ihr mit „Stop recording after“ ein. Für das unten abgebildete Ergebnis habe ich die Option „Trim data after recording“ aktiviert und auf 50 ms eingestellt. Die Schaltung und den Sketch habe ich nicht verändert.

Timer Messung mit dem Logic Analyzer
Timer Messung mit dem Logic Analyzer

Trigger Messung

Die Triggermessung eignet sich für Einzelereignisse und insbesondere dann, wenn man nicht genau weiß, wann sie eintreten. Mit „Pattern und Channel“ stellt ihr den Auslöser und den Kanal ein. Der Auslöser kann eine steigende oder fallende Flanke, ein HIGH Puls oder ein LOW Puls sein. Außerdem legt ihr die Dauer der Messung fest.

Trigger Beispiel 1: Taster

Als erstes Beispiel habe ich einen Taster mit dem Logic Analyzer verbunden. Im Normalzustand liefert er ein LOW an Kanal 0, gedrückt liefert er ein HIGH:

Tasterschaltung

Als Trigger habe ich eine steigende Flanke festgelegt. Die Messzeit nach dem Auftreten des Triggersignals ist 5 Sekunden. Dann habe ich noch eingestellt, dass die Datenaufnahme 500 Millisekunden vor dem Triggersignal beginnen soll („Trim pre trigger data“). Während der 5 Sekunden habe ich den Taster ein paar Male betätigt:

Taster

Zugegebenermaßen ist das Beispiel ziemlich sinnlos – aber es zeigt das Prinzip.

Trigger Beispiel 2: HC-SR04

Das nächste Beispiel macht etwas mehr Sinn. Und zwar untersuche ich hier die Vorgänge bei einer Abstandsmessung mit dem HC-SR04. Hier die Schaltung:

Logic Analyzer am HC-SR04
Logic Analyzer am HC-SR04

Die Triggerleitung wird mit Kanal 0, die Echoleitung mit Kanal 1 überwacht.

Hier der Sketch:

int triggerPin = 12;
int echoPin = 11;

void setup(){
  pinMode(triggerPin, OUTPUT);
  pinMode(echoPin, INPUT);
  Serial.begin(9600);
  delay(30);
}

void loop(){
  digitalWrite(triggerPin, HIGH);
  delayMicroseconds(20);
  digitalWrite(triggerPin, LOW);
  unsigned long duration = pulseIn(echoPin, HIGH);
 
  int cmDistance = duration * 0.03432 / 2; 
  Serial.print("Distanz [cm]: ");
  Serial.println(cmDistance);
  
  delay(3000);
}

 

Als Trigger habe ich eine steigende Flanke festgelegt. Das Triggersignal für das HC-SR04 Modul ist also zugleich der Trigger für den Logic Analyzer. So sah dann eine Messung in Logic 2 aus (ca. 20 cm Abstand):

HC-SR04

Man erkennt, wie nach dem kurzen Triggersignal und einer gewissen Latenzzeit der Echopin auf HIGH Niveau geht und dann beim Eintreffen des Echos wieder auf Null. Um die Dauer der Latenz zu ermitteln, habe ich Marker gesetzt. Die Funktion findet ihr im Hauptmenü unter „Measure“. Das Triggersignal ist demnach 22.25 Mikrosekunden lang und die Latenz beträgt 443.75 Mikrosekunden.

Marker

Das lässt sich aber noch etwas übersichtlicher darstellen. Dazu gibt es die Measurements, zu denen ihr über das Linealsymbol im Seitenmenü gelangt. Klickt auf das Plussymbol und dann auf „Add Measurement“. Wenn ihr dann mit der Maus auf die Ergebniskurve zeigt, erscheint eine senkrechte rote Linie, die ihr verschieben könnt und die an Markern und Signalflanken einrastet. Nach einem Linksklick könnt ihr den Messbereich aufziehen. Klingt vielleicht kompliziert, ist aber einfach und intuitiv.

Den Messbereichen könnt ihr Namen geben und sie verschieden einfärben:

Measurements
Measurements

Analyzers

Jetzt kommen wir noch zu einer richtig nützlichen Funktion, den sogenannten Analyzern. Damit könnt ihr die I2C, SPI oder Serial Kommunikation eures Mikrocontrollers mit anderen Bauteilen analysieren.

Ihr aktiviert den Analyzer über das „1F“ Symbol im Seitenmenü. Dann wählt ihr I2C, SPI oder Async Serial. Je nach Auswahl müsst ihr weitere Einstellungen vornehmen.

Analyzer Beispiel 1: Async Serial / SoftwareSerial

Als Erstes schauen wir uns die serielle Kommunikation am Beispiel einer SoftwareSerial Verbindung an. Ladet den folgenden SoftwareSerial Sketch auf euer Board.

#include <SoftwareSerial.h>
SoftwareSerial mySerial(10,11);

void setup() {
  Serial.begin(9600);
  Serial.println("Let's start!");
  mySerial.begin(9600);
}

void loop() { // run over and over
  if (mySerial.available()) {
    Serial.write(mySerial.read());
  }
  if (Serial.available()) {
    mySerial.write(Serial.read());
  }
}

 

Den TX-Pin (hier: Pin 11) verbindet ihr mit dem Logic Analyzer. Die GND Verbindung dürft ihr natürlich auch nicht vergessen.

Jetzt wählt ihr „Async Serial“, woraufhin ein Fenster mit den Details der seriellen Verbindung aufgeht. Stellt den Input Channel ein und die von euch festgelegte Baudrate. Die anderen Einstellungen müssen im Normalfall nicht geändert werden. Zu den Optionen „Show in protocol results table“ und „Stream to terminal“ kommen wir später.

Einstellungen für Async Serial Analyzer
Einstellungen für Async Serial Analyzer

Für mein Beispiel macht die Triggermethode Sinn.

Da TX normalerweise HIGH ist und die Signale LOW, nehmt ihr eine fallende Flanke als Trigger. Das habe ich unten übrigens falsch gemacht, habe es aber dann so gelassen, um zu zeigen, was dann passiert → der Trigger ist nicht am Anfang des Signals.

Startet die Messung und geht in den seriellen Monitor. Dort sendet ihr nun irgendeine Nachricht. Ich habe das gute, alte „Hello World!“ genommen. Der Trigger sollte die Datenaufnahme starten. Nach der von euch eingestellten Zeit stoppt die Messung.

Und jetzt kommt der Clou: Es wird nicht nur das Ergebnis, sondern auch seine Bedeutung angezeigt. Mit einem Rechtsklick auf die Balken oberhalb der Signal erscheint ein Auswahlmenü, in dem ihr zwischen Binär, Dezimal, Hexadezimal und ASCII wählen könnt. So sieht es mit ASCII aus:

Async Serial Analyzer
Async Serial Analyzer

Man erkennt, dass die Übermittlung von „Hello World“ bei einer Baudrate von 9600 circa 12 Millisekunden benötigt. Erwartungsgemäß ist der Vorgang mit 115200 BAUD entsprechend schneller:

Async Serial Analyzer: Einfluss der Baudrate.

Wenn ihr das selbst nachvollziehen wollt, dann vergesst nicht, die Baudrate auch in Logic 2 umzustellen. Das macht ihr im Bereich Analyzers → die drei Punkte hinter „Async Serial“ → Edit. Dort schaltet ihr den Analyzer auch wieder ab. Wenn ihr das vergesst und führt andere Messungen durch, bekommt ihr „Frame Errors“, die sich durch Ausrufezeichen über den Signalen bemerkbar machen.

Analyzer Beispiel 2: I2C

Um den I2C Analyzer auszuprobieren, nehmt ihr irgendein I2C Modul und verbindet es mit eurem Mikrocontroller. Ladet einen passenden Sketch hoch, der für Kommunikation zwischen eurem Mikrocontroller und dem I2C Bauteil sorgt. Ich habe einen INA219 Stromsensor gewählt und einen Sketch, der regelmäßig Messwerte INA219 abfragt.

In Logic 2 wählt ihr den Analyzer I2C. Daraufhin werdet ihr nach den Kanälen für SDA und SCL gefragt.  Falls noch nicht getan, verbindet die SDA / SCL Leitungen mit den gewählten Kanal Pins.

Auswahl der Kanäle für die I2C Analyse

Für die Steuerung der Messung würde ich wieder den Trigger Modus wählen, um die Signale nicht lange in der Aufnahme suchen zu müssen. Da die I2C Leitungen im Grundzustand HIGH sind, bietet sich wieder die fallende Flanke als Auslöser an.

In meinem Beispiel hat das INA219 Modul die I2C Adresse 0x40. Es werden die Register 0x01 und 0x02 ausgelesen. Abfrage und Antwort lassen sich gut verfolgen:

I2C Analyse mit dem Logic Analyzer
I2C Analyse mit dem Logic Analyzer

Hier habe ich die I2C Frequenz mit setWireClock(400000) auf 400 kHz gesetzt:

2C Analyse mit dem Logic Analyzer im Fast Mode (400 kHz)
I2C Analyse im Fast Mode (400 kHz)

Erwartungsgemäß vervierfacht sich die Taktung.

Daten des Logic Analyzer exportieren

Zunächst einmal könnt ihr euch die vom Analyzer ausgewerteten Daten anschauen, sofern ihr die zuvor erwähnten, aber nicht erklärten Haken bei „Show in protocol results table“ und „Stream to terminal“ gesetzt habt. Hier die Daten im Terminal:

I2C Messdaten im Terminal

Und hier die Daten in der Datentabelle:

I2C Messdaten des Logic Analyzer in der Datentabelle
I2C Messdaten in der Datentabelle

Um die Daten zu exportieren, klickt ihr auf die drei Punkte rechts neben „Type to search“. Klickt an, welche Spalten ihr exportieren wollt und geht dann auf „Export Table“.

Optionen für den Daten-Export aus Logic 2
Optionen für den Daten-Export aus Logic 2

Es geht ein weiteres Fenster auf, in dem ihr weitere Optionen wählen könnt:

Weitere Optionen

Jetzt klickt ihr auf „Export“. Ihr wählt einen Dateinamen und ein Verzeichnis für eure „.csv“ Datei und speichert sie ab. Dann könnt ihr die Datei in Excel importieren, um sie beispielsweise statistisch auszuwerten oder Grafiken zu erzeugen:

Import der .csv Datei in Excel
Import der .csv Datei in Excel

Rohdaten exportieren

Alternativ könnt ihr auch unausgewertete Rohdaten exportieren. Diese beinhalten lediglich die Zeit und den Zustand der ausgewählten Kanäle. Ihr erreicht die Funktion über File → Export Data.

Rohdaten Export mit dem Logic Analyzer
Rohdaten-Export

Weitere Anwendungen

433 MHz Signale analysieren

In diesem Beispiel habe ich mit dem Logic Analyzer ein 433 MHz Signal am Datenausgang eines Empfängers erfasst. Als Lieferant des Signals diente eine Fernbedienung für eine Funksteckdose. Die Herausforderung ist dabei, dass der Empfänger ohne „echtes“ Signal einen munteren Datensalat liefert (siehe unten, links von der Triggermarkierung). Hier half es, als Trigger einen LOW Pulse mit einer gewissen Mindestbreite auszuwählen.

433 MHz Signal
433 MHz Signal

IR Signale analysieren

Und zum Abschluss noch ein IR Signal, das ich mit der Fernbedienung meines SAT-Receivers erzeugt und mit einer IR Empfänger-Diode aufgefangen habe:

IR Signal
IR Signal

Hier kann man schön die Struktur des Signals erkennen und könnte das Signal „nachbauen“, um die Fernbedienung zu simulieren.

15 thoughts on “Logic Analyzer

  1. Hallo Wolfgang, bin gerade auf deinen Beitrag gestoßen, gefällt mir! Bin gerade auch beim Einstig mit diesem Analyzer. Vielleicht kannst du mir einen Tipp geben, ich versuche gerade den 1wire Bus anzuzeigen, sobald ich die Masseleitung vom Bus mit Masse des Analyzers verbinde, bekomme ich die Meldung „1 Wire Bus“ kurzgeschlossen. Data kann ich zwar auf einen Analyzer-Kanal legen, aber ohne Masseleitung gibt es da nichts verwertbares – muss ich da noch eine Beschaltung vornehmen, etwa wie ein Spannungsteiler o. ä. ? Danke fürs antworten. Grüße Matthias

    1. Hallo Mathias,

      verwendest du einen DS18B20 (das ist ja die typische 1Wire Anwendung) oder etwas anderes? Hast du vielleicht die Leitung GND (Sensor) – GND (Mikrocontroller) gekappt und nur GND Sensor mit dem Analyzer verbunden? Alle drei müssen dasselbe GND haben. Bei GND musst du auch nichts weiter machen. Wenn du die Datenleitung anzapfst, brauchst du nur einen Spannungsteiler, wenn sonst die maximale Spannung überschreiten würdest.
      Falls das noch nicht weiterhilft, kannst du mir dann noch einmal ganz genau beschreiben, welches Bauteil du nutzt, welchen Microcontroller, welches Pin, usw. Das wird schon!!

      VG, Wolfgang

  2. Hi Wolfgang,
    lieben Dank für den Artikel und die Einführung 🙂
    Bei mir ist das schon ganz schön lange her ~ 30 Jahre, als ich mich im Studium mit Pals und Gals befasst habe. Von daher ein guter „Wiedereinstieg“ in die Materie.
    Danke für Deine Zeit und Mühe, über Deine Erfahrungen zu berichten.
    Und dank auch an die Kommentatoren für weitere nützliche Tipp’s zum Thema Software 🙂
    Bert

  3. Wie Bernhard Nebel schreibt, kann ich ebenfalls die Software von Sigrik empfehlen. Die dekodiertypen sind dort mehr und eine bessere grafische Übersicht ist ebenfalls dort gegeben.

  4. Hallo
    Von Heinz Schreiber sind ein paar sehr nützliche Hinweise dabei. Gerade mit dem Eingangsschutz und wie man es erweiter kann. Sehr gut.
    Danke
    achim

  5. Hallo
    Auf der Seite von sigrok werden verschiedne Versionen angegeben, so für windows oder linux. Was brauche ich für Win10(64)?
    achim

    1. Hallo, ich habe mich nicht damit beschäftigt. Deswegen kann ich die Frage nicht beantworten. Bernhard Nebel (s.u.) hat dazu ja etwas veröffentlicht. Ich würde da mal schauen und ggf. ihm die Frage stellen.

  6. Hallo Bernhard,

    danke für den Hinweis. Ich hatte diese Klausel ihn nicht gefunden und hatte mich auf diesen Hinweis auf den Saleae Seiten verlassen:

    „The software is available free of charge, and can be installed on as many machines as you like. The latest release of the Logic 2 software can be downloaded here!“

    Das haben die gut versteckt…

    VG, Wolfgang

  7. Hallo Wolfgang,

    bei Logic und Logic 2 handelt es sich nicht um „kostenlose Software“. Die Lizenzbedingung lässt einen Gebrauch nur auf LAs zu, die von Saleae produziert wurden: „The Saleae Software may not be operated in conjunction with logic analyzer devices which are not manufactured by Saleae LLC.“

    Es gibt aber Open-Source-Software, die man in Zusammenhang mit den oben beschriebenen LAs einsetzen kann: PulseView, eine GUI für die sigrok-Software: https://sigrok.org/wiki/Downloads. Wie man PulseView benutzt, habe ich in meinem Blog beschrieben: https://hinterm-ziel.de/index.php/de/2021/10/07/logisch/

    1. Hallo Bernhard, hallo Wolfgang, könnt ihr Englisch ?
      Da steht nicht ‚must not‘ = ‚darfst nicht‘ sondern ‚may not‘ = ’sollte nicht (bitte)‘.
      Das ist ein kleiner Unterschied.
      MFG

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert