Stand: 18/11/2019

Logicanalyzer

Angeregt durch https://www.avrfreaks.net/projects/lola (1) aus dem Jahr 2002 habe ich einen kleinen Logikanalysator entwickelt, der bei vergleichbaren Eigenschaften mit deutlich geringerem Hardware Aufwand realisierbar ist, da es heute leistungsfähigere Mikrocontroller gibt.

Statt des externen 2K SRAM zur Speicherung der eingelesenen Signalpegel wird der interne Speicher eines ATmega328 genutzt. 2000 Byte dienen als Messwertspeicher, die restlichen 48 Byte stehen der Assembler Firmware für Stack etc. zur Verfügung. Mit Abtastraten von 1µs bis 16ms sind Signale bis ca. 500kHz möglich aber auch "Langzeitmessungen" bis 32s.

Die Bedienerführung im PC übernimmt ein Delphi Programm, das per RS232 Interface mit dem µC verbunden ist; dieses wird über einen RS232 zu USB Konverter betrieben. Es sind nicht alle Funktionen aus (1) implementiert, aber bei Bedarf kann man eigene Ideen umsetzen, denn die Quelltexte von Firmware und Benutzerinterface stehen zum Download bereit.

Derzeitiger Funktionsumfang:
- 14 Abtastintervalle 1µs ... 16ms
- Wählbares Bitmuster als Triggerbedingung
- Test-Modus erzeugt Binärmuster im SRAM des µC: Minimaler Hardwaretest
- 2 frei positionierbare Marker zur Messung von Zeitdifferenzen mit Frequenzausgabe
- Binär & ASCII Darstellung der Bitmuster unter den Markern
- Grafische Darstellung des dem Bitmuster entsprechenden Analogwertes
- Ausgabe des Triggerzeitpunkts (rote Linie)
- Zoom- und Scroll Funktion
- Speichern und Laden von Messungen
- RS232 Parameter: 19200Bd/8/N/1, COM1-99 wählbar

Hardware & GUI mit Testausgabe

Die Signalabtastung erfolgt Timer gesteuert in festen Zeitintervallen. Bei einer µC Taktfrequenz von 16MHz und 1µs (1MHz) Abtastrate stehen zur Auswertung eines Samples nur 16 µC Zyklen zur Verfügung. Eine Implementierung ohne Interrupts ist hier von Vorteil, da das Speichern & Laden des Statusregisters ebenso entfällt wie die RETI Instruktion, die alleine 4 µC Zyklen beansprucht. Für brauchbare Ergebnisse der Zeit- und Frequenzmessung sollte die Abtastung mit wenigstens der 5-fachen Frequenz des Eingangssignals erfolgen. Nachfolgendes Bild zeigt die Messung eines symmetrischen 500kHz Signals, das trotz der Abtastung mit nur 1µs (1MHz) einen gleichförmigen Verlauf aufweist.

 

Da für die schnelleren Signalabtastungen nur wenige µC Taktzyklen zur Verfügung stehen, erfolgt die Prüfung der Triggerbedingung erst im PC Programm durch Analyse des Speicherinhalts. Nach dem Start einer Messung werden zunächst 2000 Samples mit den gewählten Intervallen im SRAM des µC gespeichert. Erst danach wird der SRAM Inhalt per RS232 an den PC übertragen. Dort wird das Speicherabbild nach dem erstmaligen Auftreten der Triggerbedingung durchsucht.

Die Hardware ist denkbar einfach: Der ATmega328 wird mit einem 16MHz Quarz getaktet, womit nur noch Port D 8 Signaleingänge für die Messungen bereitstellt; diese sind mit externen Pull down Widerständen versehen; daher müssen ungenutzte Signaleingänge in der Triggermaske mit 0 spezifiziert werden. Zudem stehen PD0 & PD1 nicht als USART Interface (RxD, TxD) zur Verfügung. Die RS232 Übertragung erfolgt hier gemäß Atmel Application Note 305 per Bit Bang über die frei wählbaren Pins PC0 & PC1. 2 LED dienen zur Statusanzeige: Grüne LED => Messung läuft, rote LED => RS232 Übertragung des µC Puffers zum PC. Auch das Delphi Benutzerinterface weist einen entsprechenden Indikator auf. Es wurde mit Delphi3 erstellt, benötigt keine Installation und kommt ohne zusätzliche Komponenten aus.

In einem nächsten Schritt habe ich die in (1) beschriebene Architektur mit externem RAM und externem Adresszähler zwar beibehalten, diese jedoch so abgeändert, dass der µC während der Messung nur noch den Takt für den Adresszähler erzeugt. Das Einlesen der Signale erfolgt nun weitgehend ohne Zutun des µC per Hardware. Statt des D-FlipFlops an den Eingängen in (1) wird ein Buspuffer verwendet, der nur zu Beginn der Messung aufgeschaltet wird, und der nicht bei jeder Abtastung getaktet werden muss. Hiermit sind immerhin Abtastraten von bis zu 12MHz möglich - dem 12-fachen Wert des obigen Designs! Zur Aufnahme der Messwerte dient hier ein 16kByte RAM. Die Grundversion nutzt nur die ersten 4kByte, die der 12 Bit Adresszähler direkt ansteuert. Die beiden zusätzlichen Adressbits können aber vom µC gesteuert werden.

Das PC Benutzerinterface nutzt das gleiche Verfahren wie oben, es müssen nur einige Konstanten geändert werden. Meinen 2-lagigen Platinenentwurf hierzu habe ich diesmal extern fertigen lassen. Näheres auf Anfrage.

Die bestückte Musterplatine

Messung eines 2MHz Signals mit 12MHz Abtastrate