Auf dieser Seite wird beschrieben, wie man mit einem Controller und einem MAX232 einen kleinen Datenaufzeichner bastelt, der seine Ergebnisse per serieller Schnittstelle auf den PC überträgt. Bei mir ist dieses Programm schon eine ganze Weile im Einsatz und hat sich als recht nützlich erwiesen. | ||||||||||||||||
Konzeption |
||||||||||||||||
Das Problem besteht oft: eine serielle Übertragung oder
irgendeine Signalfolge scheint nicht richtig übertragen zu
werden. Wenn das Signal in schneller Folge wiederholt werden kann und
kurz genug ist, kann man es noch per Oszilloskop und ein wenig
Bastelei an den Trigger-Einstellungen als stehenden Verlauf auf den
Schirm bringen und so dekodieren. Aber sobald die Pulsfolgen auf den
vielleicht 10cm des Schirms nicht mehr zu unterscheiden sind oder
einer tiefergehenden Analyse bedürfen, ist diese Lösung
komplett überfordert.
Die Anschaffung eines digitalen Oszilloskops mit Speicher und Auslesemöglichkeit ist der naheliegenderweise Schritt - der mangels genügend Kleingeld in der Portokasse oft genug unerschwinglich ist. Aber darum auf eine digitale Aufzeichnungsmöglichkeit verzichten? Nein, das kommt nicht in Frage! Die Hardware-Anforderungen für die hier besprochene kleine Aufzeichnungslösung sind denkbar gering: ein Experimentierboard mit einem 89C2051 und ein MAX232 für die serielle Schnittstelle genügen vollauf. Ein Schaltplan wäre dafür übertrieben: es genügt, TxD des Controllers mit einem Eingang des MAX zu verbinden, dessen Ausgang mit RxD der seriellen Schnittstelle des PC zu verschalten, und das übliche 'Gemüse' anzuschließen, das man für einen MAX232 und einen 89C2051 braucht. Man kann also im Bedarfsfalle auch schnell eine kleine Schaltung 'fliegend' zusammenklemmen. |
Der 8051-kompatible AT89C2051 verfügt nur über 128 Bytes Speicher. Das hört sich kleiner an als es ist: mit einer geeigneten Speicherstruktur lassen sich eine ganze Anzahl Daten aufzeichnen. |
|||||||||||||||
Die Datenstruktur |
||||||||||||||||
Ein Datensatz dieser Datenstruktur besteht aus zwei Teilen: zum einen
aus den Daten, in diesem Programm sind das 2 Bit. Zum anderen
enthält jeder Datensatz einen Zähler, der angibt, wie lange
die Datenbits unverändert an den Inputs anlagen. Um
möglichst wenig Platz zu verschwenden, gibt es diesen
Zähler in den Längen von 5 und 13 Bit. Hatte also das
Muster an den Inputs nur 31 Abfragezyklen Bestand, so wird der
gesamte Datensatz nur 1 Byte lang, anderenfalls werden 2 Byte
benötigt. Ein Bit im ersten Byte erlaubt eine Unterscheidung
zwischen den beiden Datensatztypen.
Der Abfragetakt beträgt 20us. Bei einem Speicherverbrauch des Programms von geschätzten 20 Bytes, von denen der größte Teil für den Stack reserviert ist, bleibt somit Platz für 54 Muster, die nicht länger sind als 163ms, mit einer maximalen Aufnahmedauer von 8.8s. |
Alternativ finden 108 Muster mit einer maximalen Länge von 620us
und einer Gesamtaufnahmedauer von 66ms Platz. Da die
Datensatzlänge nicht feststeht, ist eine optimale
Speicherauslastung sichergestellt. Steht ein Muster länger als
163ms an den Inputs, so wird ein neuer Datensatz angelegt.
|
|||||||||||||||
Das Programm |
||||||||||||||||
Das Programm selbst läuft folgendermaßen ab: zunächst wird in einer Endlosschleife gewartet, bis sich an den Eingängen etwas tut. Wurde eine Veränderung festgestellt, beginnt die eigentliche Aufzeichnung damit, dass der Timer 0 aktiviert wird. Der Timer 0-Interrupt fragt nun periodisch die Eingänge ab. Dabei ergeben sich zwei Möglichkeiten. Haben sich die Zustände der beiden Eingänge P1.7 und P1.6 bzw. des Voltage Comparators an P3.6 nicht geändert, so wird ein Zähler (DPTR) heraufgesetzt. |
Hat sich hingegen der Zustand eines oder beider Eingänge verändert oder ist der Zähler übergelaufen - in den Datensätzen war ja nur Platz für 13 Bit - so wird der Zähler in der oben beschriebenen Weise im Speicher abgelegt und der Speicherzähler R0 heraufgesetzt. Ist der Speicher vollständig gefüllt, so bricht die Aufzeichnung ab, und die gesammelten Daten werden im ASCII-Format lfnd. Nr., Sig.0, Sig.1, Dauer über die serielle Schnittstelle mit 9600 Baud ausgegeben, wo sie von einem Programm am PC im Empfang genommen und ausgewertet werden können. |
|||||||||||||||
|
||||||||||||||||
Auswertung der Daten |
||||||||||||||||
Zur Auswertung der Daten genügt ein kleines Progrämmchen,
das die Daten per serieller Schnittstelle einliest und irgendwie
grafisch präsentiert. Weil die Daten im ASCI-Format
übertragen werden, ist dafür nicht viel Aufwand nötig.
Da das Auswertungsprogramm in TCL/TK geschrieben ist, läuft es unter allen Plattformen, für die ein entsprechender Interpreter vorhanden ist, ohne Änderungen am Code. Also unter Linux und Windows ebensogut wie unter Solaris - sofern mir jemand verrät, wie bei den UltraSparc's die Schnittstellen verschaltet sind :-) Den Interpreter gibt's bei http://dev.scriptics.com. Das Auswertungsprogramm kann hier heruntergeladen werden. |
zurück zum Anfang |