Logic Analyzer

Der Pragmatische Architekt  –  0 Kommentare
Fehler aufspüren und Abläufe verstehen

Bei komplexen Schaltungen können durchaus Fehler auftreten. Oder zumindest Verhaltensweisen, die schwer zu durchdringen sind. Gerade beim Umgang mit Bussystemen wie I²C, SPI, 1-Wire oder Async Serial ist es demzufolge hilfreich, die Signalflüsse visuell nachzuvollziehen. Mit einem geeigneten Werkzeug steht dem nichts im Wege. Nützlich sind sie jedenfalls allemal, auch wenn es nur darum gehen sollte, ein bisschen Mäuschen zu spielen, um das ein oder andere Bussystem besser zu verstehen.

Messen

Multimeter und Oszilloskope sind nur wenig hilfreich, wenn es darum geht, digitale Vorgänge zu beobachten. Zu diesem Zweck gibt es stattdessen die sogenannten Logic Analyzer. Ein professionelles Instrument kann schon einmal mehrere Tausend Euro kosten. Für die Hobbynutzung ist das ein klares No-Go.

Zum Glück existieren auch deutlich günstigere Geräte. Ein verbreitetes Beispiel ist die Produktfamilie von Saleae. Erhältlich sind dort die Systeme Logic 4, Logic 8, Logic Pro 8, und Logic Pro 16. Das von mir benutzte Gerät ist ein Logic 8 zu einem Preis von rund 200 €. Das Logic Pro 16 gibt es hingegen für knapp 600 €. Die Sampling-Raten der preisgünstigen Logic Analyzer bewegen sich im Rahmen von 24 MHz. In der Pro-Familie des Herstellers liegt die Frequenz dank USB 3.0 bei 100 MHz.

Beispiel für einen preisgünstigen Logic Analyzer (Bild: adafruit.com)

Die Software zu den Logic-Produkten läuft unter Windows, Linux und Mac OS. Sie können Sie über die Download-Seite bekommen und im Simulationsmodus ausprobieren.

Hinweis: Unter dem Suchbegriff "Saleae" gibt es bei unterschiedlichen Verkaufsportalen ebenfalls Logic Analyzer für Preise ab rund 15 Euro. Diese lassen sich mit derselben Software betreiben, sind also Nachbauten, gleichen den Saleae-Produkten aber rein äußerlich nicht. Sie können sich also für ein Taschengeld mit einem Klon ausstatten. Die Originale sind allerdings wesentlich hochwertiger gebaut und mit Zubehör ausgestattet. Unterstützen Sie lieber das junge Team von Saleae als Produktpiraten.

PWM visualisieren

Ein hübsches Beispiel zum Einstieg in die Arbeit mit Logic Analyzern ist das Thema PWM (Pulsweitenmodulation).

Wir wollen eine LED dimmen, sodass sie zunächst immer heller wird und danach immer dunkler, bevor der Prozess wieder von vorne losgeht.

Wir verwenden dazu folgende Schaltung:

Arduino Uno: Kontinuierliches Dimmen einer an Pin 9 angeschlossenen LED über PWM. Das Signal wird vom Logic Analyzer ge-sampled

Den Anschluss für Kanal 0 des Logic Analyzers verbinden wir mit dem an die LED übermittelten PWM-Signal von Digitalausgang 9 des Arduino. GND des Logic Analyzers verbinden wir mit GND des Arduino-Boards.

Der eigentliche Sketch ist sehr einfach gestrickt:

//////////////////////////////////////////////////////
//
// LED per PWM nach oben und unten dimmen
//
//////////////////////////////////////////////////////


int REDLED = 9; // hier befindet sich eine LED
int brightness = 0; // mit dieser Helligkeit
int fadeAmount = 5; // Grad der Helligkeitsänderung


void setup() {
pinMode(REDLED, OUTPUT);
}

void loop() {
// Helligkeit für LED setzen:
analogWrite(REDLED, brightness);

// heller oder dunkler je nach Vorzeichen von fadeAmount:
brightness = brightness + fadeAmount;

// Am Rand des Helligkeitsspektrums kehren
// wir die Veränderung der Helligkeit um

if (brightness == 0 || brightness == 255) {
fadeAmount = -fadeAmount ;
}
delay(20); // etwas Pause lassen
}

Dieser Sketch läuft auf dem Arduino und sorgt für fortlaufendes Dimmen der LED an Port 9. Wenn alles geklappt habt, kann nun die Arbeit mit dem Logic Analyzer folgen.

Dazu starten wir die Software des Instruments. Als Trigger können wir zum Beispiel eine aufsteigende Flanke einstellen. Das geschieht am Kanal 0 des Messinstruments, über den wir das pulsierende Signal abgreifen.

Verschiedene Trigger-Optionen definieren, wann der Logic Analyzer mit dem Sampling startet

Für unser Beispiel empfiehlt sich allerdings eher die dritte Option Π (Trigger mit positiver Pulsweite).

Starten Sie nun das Sampling durch Betätigen der grünen Schaltfläche.

Anfangs ist aus großer Flughöhe zu erkennen, wie die Rechteckssignale bezüglich des sogenannten Duty-Cycle variieren. Sie wechseln kontinuierlich zwischen 0 % (LED dunkel) und 100 % (LED hell).

Wir sehen deutlich, dass der Duty-Cycle des PWM-Signals ständig zwischen 100% zu 0% verläuft.

Durch das Betätigen des Maus-Scrollrads können wir in die Signale hineinzoomen. Außerdem können wir mit der Rechts- und Linkspfeiltaste den gewünschten Zeitausschnitt einstellen. Wir sehen einen Zeitausschnitt, bei dem der Duty Cycle rund 75 % beträgt.

Im gewählten Abschnitt beim Herein"zoomen" sehen wir Rechtecksimpulse mit ca. 75% Duty Cycle

Auf diese Weise entsteht ein tiefgreifendes Verständnis darüber, was es mit der Pulsweitenmodulation (PWM) tatsächlich auf sich hat.

Beispiel I2C-LCD

Um die etwas ausgefeiltere Arbeit mit einem Logic Analyzer zu illustrieren, verwenden wir einen Arduino in Kombination mit einem über I2C angeschlossenen LCD.

Als Sketch kommt folgendes simples Programm zum Einsatz, das die zwei Zeilen des LCD betextet:

// Notwendig sind die Bibliotheken
// Wire und LiquidCrystal_I2C

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

// LCD hat IIC Adresse 0x27
LiquidCrystal_I2C lcd(0x27,16,2);
void setup()
{
lcd.init(); // initialisieren
lcd.backlight(); // Hintergrundbeleuchtung an
}


void loop()
{
lcd.setCursor(0,0); // An den Anfang der ersten Zeile
lcd.print("Heise Developer"); // Ausgabe erster Teil
lcd.setCursor(0,1); // An den Anfang der ersten Zeile
lcd.print("Blog"); // Ausgabe zweiter Teil
}

Starten wir nun die Software des Logic Analyzers. Wir wählen Kanal 0 (Anschluss an Datenkanal SDA von I2C) und Kanal 1 (Anschluss an Taktkanal SCL des I2C). Für Kanal 0 stellen wir als Trigger eine aufsteigende Signal-Flanke ein. Nach Start des Logic Analyzers über die grüne Schaltfläche (Start) wartet der Analyzer bis sich am SDA-Kanal eine aufsteigende Signalflanke ergibt, bevor die Samples ausgelesen werden.

Im folgenden Screenshot sehen sie das daraus resultierende Bild:

4 MHz Sampling von Kanal 0 (SDA) und 1 (SCL)

Für die Messhardware spielt es keine Rolle, dass wir es mit einem I2C-Bus zu tun haben. Sie behandelt die Signale unabhängig von der zugrundeliegenden Semantik beziehungsweise den verwendeten Protokollen. Eigentlich könnte die Software eines Logic Analyzers hier wesentlich hilfreicher agieren. Genau das ist selbst für schlichte Logic Analyzer Standard.

Wir teilen dem Messgerät im Menü Analyzers mit, dass wir es mit dem I2C-Bus zu tun haben:

Logic Analyszer unterstützen in der Regel eine ganze Reihe von Bussen bzw. Kommunikationsprotokollen

Danach lassen sich sogar Protokollereignisse wie ACK/NACK über eine Liste selektieren und im Signalverlauf anspringen.

Visualisierung der Kanäle 0 und 1 bei I2C-Modus

Auf diese Weise sind die Protokollereignisse auf dem I2C-Bus sehr gut nachvollziehbar.

Scan the Bus

Im obigen Beispiel haben wir als I2C-Adresse des LCD 0x27 spezifiziert. Was aber, wenn uns diese Adresse unbekannt ist? In einem früheren Beitrag über LCD-Displays haben wir bereits ein Scanprogramm kennengelernt, das alle am I2C-Bus angeschlossenen Geräte erkennt. Das wollen wir nun mit einem simplen Sketch plus Logic Analyzer nachbauen. Die Schaltung aus dem vorherigen Beispiel behalten wir bei.

  • Zur Vorbereitung stellen wir als Trigger von Kanal 0 (SDA) wie vorher den positiven Puls ein ( Π ).
  • Am Kanal 1 wählen wir Channel required high ( ¯ ).
  • Im rechten Menü der Logikanalysesoftware beim Menüpunkt Analyzers hatten wir für den LCD-Ansteuerungssketch I2C hinzugefügt.
    • Drücken Sie das Symbol * auf dem I2C-Tab, worauf ein Pop-up-Menü erscheint.
    • Am unteren Rand dieses Menüs selektieren Sie Hex als Datenausgabeformat.
    • Ganz oben im Pop-up-Menü klicken Sie nun noch auf Edit Settings. Im daraufhin erscheinenden Pop-up-Menü stellen Sie in der Address-Display-Auswahlbox 7 bit, address bits only ein.

Als Sketch für unsere Analyse verwenden wir wiederum ein sehr simples Programm. Es durchläuft lediglich die möglichen I2C-Adressen und versucht mit jeder Adresse einen Kommunikationsaufbau.

#include <Wire.h> 

void setup() {
Wire.begin();
for (byte i = 8; i < 120; i++)
{
Wire.beginTransmission (i);
if (Wire.endTransmission () == 0) {}
}
}

void loop() {}

Durch Betätigen der grünen Starttaste in der Bedienoberfläche der Logikanalyse-Software startet der Analysevorgang. Zunächst passiert nichts, weil keine Trigger vorliegen. Erst beim Start des Sketches über die Arduino IDE kommt Bewegung ins Spiel, da er die entsprechenden Trigger auslöst, wodurch unmittelbar das Datensampling der Logikanalyse anläuft.

Auf dem Bildschirm dürften Sie anschließend in etwa folgendes Bild sehen. Ich habe die Zeitleiste zu diesem Zweck bereits auf den interessanten Bereich ( Adressen 0x26 bis 0x28 ) eingestellt.

Ausschnitt aus dem Signalfluss des I2C-Scans
  • Im Signalverlauf für 0x26 ist unter anderem ein NAK (Not-Acknowledgement) zu erkennen. An dieser Adresse befindet sich folglich kein Gerät.
  • Bei 0x27 treffen wir gleich auf zwei Besonderheiten: Zum einen erfolgt hier eine Rückmeldung von Acknowledgement (ACK), zum anderen ist am Ende ein Signal-Spike zu erkennen. Hier hat der Scan eindeutig ein Gerät gefunden.
  • Im Falle von Adresse 0x28 folgt wiederum ein NAK-Paket, was "tote Hose" an dieser Adresse bedeutet.

Insgesamt haben wir daher – wenig überraschend – als einziges I2C-Gerät das LCD an Adresse 0x27 entdeckt.

Was nun?

Am besten ist es, vergangene Projekte wieder aus der Schublade zu holen, um sie nochmals mit dem Logic Analyzer zu durchleuchten. Wir hatten schließlich in der Serie bereits 1-Wire, SPI und Async Serial adressiert. Die Aha-Effekte sind garantiert und vertiefen das Verständnis. Zusätzlich lernen Sie als Nebeneffekt ein so essenzielles Messinstrument wie den Logic Analyzer schätzen.

Kann es etwas mehr sein?

Ein Nachteil der preisgünstigen Geräte vom Kaliber des Saleae Logic ist deren mangelnde Flexibilität. So wäre es interessant, dem Instrument wesentlich genauere Trigger-Möglichkeiten zu vermitteln. Etwa ein regelmäßiges Sampling, wenn auf dem Kanal ein gewisses Signal erkannt wurde oder andere Bedingungen eingetreten sind. Auch ein automatisiertes Sampling wäre auf diese Weise möglich.

Die gute Nachricht lautet, dass Saleae für seine Lösungen sowohl ein SDK als auch die Automatisierung über eine Socket API anbietet. Ein Anwendungsgebiet für das Protokollanalyse-SDK besteht zum Beispiel im Bereitstellen eigener Protokollanalysekomponenten. Mit Hilfe der Socket API lässt sich die Software aus C# oder Python heraus fernsteuern beziehungsweise automatisieren.

Zusammenfassung

Der Elektronikmarkt bietet Hobbyisten ein breites Sortiment von Messgeräten. Für den IoT-Maker ist zumindest ein Logic Analyzers angeraten. Den gibt es bereits für Preise ab rund 100 €, wobei es sich wohlgemerkt um keine Instrumente handelt, die sich ein Profi für das eigene Labor anschaffen würde. Andererseits handelt es sich auch nicht um Spielzeuge. Gerade für Fehlersuchen oder Analysen von Schaltungen empfiehlt sich der Erwerb entsprechender Hardware. Das vorgestellte Instrument von Saleae sollte nur als Beispiel dienen. Daneben gibt es auch noch eine breite Palette weiterer Logic Analyzer mit sehr gutem Preis-/Leistungsverhältnis. Ein kleineres bis mittleres Investment lohnt sich in jedem Fall, weil die vermeintlichen Schnäppchen aus China oft mehr Frust als Spaß bereiten.

Wem günstig immer noch zu teuer ist, kann sich natürlich auch an den Bau eines eigenen Messgeräts wagen – auf Basis eines Arduino versteht sich.

Referenz

Wer einmal das Innenleben eines Saleae Logic 8 inklusive der Nachteile und Vorteile kennenlernen will, sei auf den EEVblog verwiesen. Eine entsprechende Video-Episode zu diesem Thema setzt freilich Englisch voraus. Dieser Blog gehört jedoch zu meinen persönlichen Highlights unter den Elektronikblogs, weshalb ich ihn der Makerin auch unabhängig vom heutigen Thema wärmstens ans Herz legen möchte.