Analoger Meßwert rein — analoger Stellwert raus
In diesem Beitrag wird eine einfache Anordnung für den Commodore 64 beschrieben, bei der ohne Umschalten ein Analogsignal eingegeben und ein Analogstellwert ausgegeben werden kann.
Für einen regeltechnischen Versuch wurde eine Anordnung gebaut, bei der über eine dauernd mit dem Computer verbundene Meßleitung ein analoges Meßsignal aufgenommen, im Computer verarbeitet und über die 8-Bit-Datenleitung des Userports und einen 8-Bit-D-A-Wandler wieder ein analoges Stellsignal als Antwort ausgegeben werden kann (siehe Bild)
Diese Anordnung dürfte auch für viele Bastelzwecke sehr interessant sein. Für den Analogeingang wurde mit dem IC LM311 ein Spannungs-Frequenzwandler gebaut. Die Frequenz des erzeugten Rechtecksignals wurde über eine einadrige Schirmleitung mit Ader auf PIN6 = CNT-2 des Userports und Schirm auf PIN1 = GND zur Frequenzmessung eingegeben. Diese Anwendung ist prinzipiell in [1] beschrieben, allerdings mit dem kleinen Schönheitsfehler, daß die Sache so nicht funktioniert. Trotzdem ist das erwähnte Buch sehr empfehlenswert wegen seiner Vielfalt und Verständlichkeit. Im folgenden wird zunächst ein funktionsfähiges Programm gezeigt und anschließend werden wesentliche Verbesserungen unter Verwendung einer Assembler-Routine geschildert. Ein Studium der Literatur [1 bis 4] zeigt, daß für eine einfache Frequenzmessung bis hinauf zu etwas mehr als 20 kHz der im CIA 6526 (Complex Interface-Adapter-IC) eingebaute Zähler und die Systemuhr Tl als Zeitbasis in Frage kommen. Wer einen Rechteckgenerator zur Hand hat, kann dies auch gleich (TTL-Pegel 5 V einstellen) mal ausprobieren! Geben sie das folgende Basic-Programm ein und schließen Sie den Generator — wie beschrieben — an CNT-2 an.
Es wurden folgende Adressen verwendet
Dez. 56590 Hex DD0E Kontrollregister für Zähler 1
Dez. 56580 Hex DD04 Zähler 1 Low-Byte T1L
Dez. 56581 Hex DD05 Zähler 1 High-Byte T1H
In Zeile 100 wird das Kontrollregister für den Zähler 1 so programmiert, daß dieser in der gewünschten Art arbeitet und zunächst im STOP-Zustand ist. In Zeile 110 wird der Zähler mit HB = 255 und LB = 255 geladen; er hat die Eigenschaft, diese zwei Byte nach dem Start herunterzuzählen (Dez. 65535 bis 0). Der Zähler kann nun aber nicht, wie in [1] erwähnt, mit dem Setzen des High-Byte von T1 (T1H) gestartet werden, sondern durch den Befehl Poke 56590, 241, bei dem Bit 0 im Kontrollregister auf 1 = START gesetzt wird. Die Tl-Uhr wird bei diesem Programm »im Vorübergehen« gelesen, die beiden IF Abfragen geben den Start- und den Auslesebefehl für den Zähler.
Im Kontrollregister haben nur Bit 0 und 5 wichtige Funktionen:
11110001 = Dez. 241 → Zähler Start
11110000 = Dez. 240 → Zähler Stop
Die anderen Bits sind als »Dauermaske« aufzufassen.
Das Basicprogramm zeigt jedoch leider bei der praktischen Anwendung Anzeigeschwankungen von etwa 2 Prozent und manchmal weit darüber. Schuld daran ist sicher die Programmsprache Basic, welche zum Beispiel aufgrund von zu langsamen Bearbeitungszeiten des Basic-Interpreters in den IF Abfragen ziemliche Fehler in der Zeitbasis zu verursachen scheint. Gelegentlich kommt die ganze Messung aber auch noch stärker »aus dem Tritt«. Geht man dazu über, die Uhr Tl nicht »im Vorübergehen« abzulesen, dann kann man schon eine etwas bessere Genauigkeit erreichen.
In diesem Programm wird in Zeile 120/130 durch EinPOKEn von 0 in die drei TI-Register 160, 161, 162 die Uhr Tl jedesmal neu gestartet, wobei Register 162 des »schnellsten Rädchens« zuletzt genullt wird. Hierdurch entfällt die erste IF Schleife des Starts. Benützt wird im Prinzip nur Regsiter 162, in welchem die Uhr von 0 bis 255 in Schritten von 1/60 s (Jiffies) läuft. Die beiden anderen Register werden nur zur Sicherheit genullt.
Ausgehend von diesem Programm wurde das folgende Assembler-Programm geschrieben, das im Prinzip den gleichen Ablauf hat, bei dem aber die Startbefehle für Zähler und Uhr Tl sowie der Stop-Befehl für den Zähler und vor allem die Zeitabfrage und das Ablesen »blitzschnell« ablaufen:
Nach einmaligem RUN-Lauf kann dieses Programm immer mit SYS 49152 aufgerufen werden, der Basiclader kann dann gelöscht werden (vorher natürlich speichern!). Das Programm arbeitet einen Durchlauf des Meßzyklus ab und kehrt dann nach Basic zurück, zuvor hat es jedoch HB und LB des Zählers, T1H und T1L, nach Adresse Dez 781 und 782 abgelegt. Aus diesem »Briefkasten« können die Werte mit PEEK geholt werden. Als Beispiel ein Miniprogramm zur dauernden Frequenzanzeige in Hz:
Mit diesem Programm wurde eine Genauigkeit von deutlich besser als 1 Prozent erhalten. Versuche zeigten, daß selbst im praktischen Betrieb mit einem Spannungs-Frequenzwandler die Meßdauer ohne Verschlechterung des Ergebnisses auf 30 x 1/60 s + 0,5 s verkürzt werden kann. Dies kann man im Basiclader dadurch bewerkstelligen, daß in Zeile 130 die Zahl 60 in 30 geändert wird.
Bei der praktischen Anwendung wurde entsprechend [1] beziehungsweise nach Angaben des Herstellers [5] mit dem IC LM 331 folgender Spannungs-Frequenzwandler gebaut:
Die Schaltung funktioniert sehr gut und recht genau! Für die »Stellenwertausgabe« wurde mit dem 8-Bit-D-A-Wandler ZN428 folgende Schaltung aufgebaut:
Die Ausgabe über den Userport erfolgt mit Hilfe folgender Befehle:
Poke 56579, 255 (Datenleitungen PB0 bis PB7 auf Ausgabe)
Poke 56577, x (x = Dez.-Wert der Ausgabe)
Der Wandler erzeugt dann eine zu x proportionale Spannung.
Dem Nachteil einer V/f-Wandler-Zeit von ≈ 0,5 s steht der Vorteil gegenüber, daß keine Ein-Ausgabeleitungs-Umschaltung erforderlich ist, die Signale stehen stetig am Port zur Verfügung. Eine mehrkanalige Ausführung des Eingangs durch Multiplexen ist denkbar. Beim Ausgang ist dies sicher etwas schwieriger.
(Dr. Ernst Breitz/rg)Literatur
[1] Anderson A., Kullbjer A.: »Messen, steuern, regeln mit dem VC 20 und Commdore 64«, Haller-Verlag, Saarbrücken
[2] Angerhausen, Brückmann, Englisch, Gerits, »64 intern«, Data-Becker, Düsseldorf
[3] Floegel E., »Hardware-Erweiterungen für Commodore 64«, Hofacker-Verlag, Holzkirchen
[4] Brückmann, »Der Commodore 64 und der Rest der Welt«; Data-Becker, Düsseldorf
[5] National-Semiconductor, Daten-Blatt zu LM 131/231/331