C 64
Naturwissenschaft

Der C 64 als Meßboy

Ein kleiner Hardware-Zusatz, der für unter 10 Mark zu haben ist, macht aus Ihrem C64 ein Kapazitäts- und Widerstandsmeßgerät, das einen Vergleich mit professionellen Geräten nicht zu scheuen braucht. Der Meßbereich reicht von einigen pF bis hin zu einigen mF.

Jeder Elektronikbastler kennt das Problem: in der Bauteilekiste liegen etliche undefinierbare Kondensatoren mit exotischen Aufschriften, wie zum Beispiel 22000 F oder 20j. Woher soll man mit Sicherheit sagen können, ob das herausgefischte Exemplar auch die richtige Zehnerpotenz besitzt? Zwar gibt schon die Bauteilgröße einen Anhaltspunkt, ob Pikofarad, Nanofarad oder gar Mikrofarad gemeint sind, doch man verschätzt sich leicht, weil oft auch die zulässige Spannung nicht klar angegeben ist. So entsteht der Wunsch, die Bauteile nachmessen zu können, doch Kapazitätsmeßgeräte sind nicht billig, und so lohnt sich eine Anschaffung in den meisten Fällen nicht.

Der hier vorgestellte Meßzusatz ermöglicht aber, den C 64 zu einem Kapazitäts- und Widerstandsmeßgerät aufzuwerten. Mit wenig Aufwand erhält man ein System mit automatischer Meßbereichsumschaltung über mehr als neun Zehnerpotenzen und zehn ständig anzeigenden Meßwertspeichern, einer Ausstattung also, die auch bei den teuren Profigeräten ihresgleichen sucht.

Funktion durch Händeschütteln

Das Funktionsprinzip ist genial einfach. Ein ganz normales TTL-Monoflop aus der 74XX-Reihe dient als Zeitgeber. Es antwortet auf einen Low-High-Sprung am Eingang mit einem Ausgangsimpuls, dessen Länge weitgehend unabhängig von Betriebsspannung und Temperatur ist, also nur noch von den Werten des Widerstands und des Kondensators bestimmt wird. Mit einem Umschalter kann man wahlweise den Widerstand oder den Kondensator fest einstellen und das jeweils andere Bauelement über die Abgreifklemmen messen.

Die gesamte übrige Hardware ist bereits im C64 eingebaut. Dank der Schnittstellenbausteine VIA 6526 hat man nämlich die Möglichkeit, über den User-Port die Impulsdauer zu messen, um sie dann auf den gesuchten Wert umzurechnen. Die Aktionen werden dabei über die sogenannten Handshake-Leitungen am User-Port koordiniert, wie im Zeitablaufdiagramm (Bild 1) deutlich zu sehen ist.

Bild 1. Zeitdiagramm der Handshake-Leitungen am User-Port

Durch einen Schreib- oder Lesebefehl auf die Port-Adresse 56577 wird der Meßimpuls ausgelöst. Das geschieht in dem abgedruckten Programm (Listing 1) in Zeile 3300. DerC64 signalisiert das am User-Port selbständig dadurch, daßPC2 für die Dauer eines Taktes Low wird. Wenn diese Leitung wieder auf High geht, löst das den Impuls am Monoflop-Ausgang Q aus, der gleichzeitig mit den Anschlüssen CNT2 und Flag2 verbunden ist. Wie die Tabelle »Kontrollregister« (Bild 2) zeigt, wurde der VIA-Baustein so programmiert, daß er mit dem Systemtakt abwärts zählt, solange der Eingang CNT2 High-Pegel führt. Dabei zählt Timer B Unterläufe von Timer A. Das bedeutet, Timer A wird mit einem bestimmten Wert geladen (Zeilen 3200 und 3210) und zählt von dort aus abwärts. Erreicht er die Stellung 0, dann wird der Inhalt des Timers B um eins erniedrigt, Timer A wird wieder mit dem vorgegebenen Startwert geladen, und der Vorgang wiederholt sich.

Kontrollregister 14 (TimerA) Adresse 56590 Inhalt 193:
Bit 0: 1 Timer A Start
Bit 1: 0 Keine Signalisierung an PB6
Bit 2: 0 (Beliebig)
Bit 3: 0 Timer A zählt fortlaufend vom Ausgangswert auf 0
Bit 4: 0 Unbedingtes Laden ausgeschaltet
Bit 5: 0 Timer A zählt Systemtakte
Bit 6: 1 (Serieller Port auf Eingang)
Bit 7: 1 (Echtzeituhrtrigger 50Hz)
Kontrollregister 15 (TimerB) Adresse 56591 Inhalt 121:
Bit 0: 1 Timer B Start
Bit 1: 0 Keine Signalisierung des Unterlaufs an PB7
Bit 2: 0 (Beliebig)
Bit 3: 1 Timer zählt nur einmal auf 0
Bit 4: 1 Unbedingtes Laden eingeschaltet
Bit 5: 1 Timer B zählt Unterläufe von Timer A
Bit 6: 1 falls CNT2 = 1 ist
Bit 7: 0 (Uhrzeit)
Bild 2. Werte der Kontrollregister zur Zeitmessung mit den Timern des C64

Errechnung des Meßwertes und Bereichsumschaltung

Die fallende Flanke am User-Port-Eingang setzt das Bit 4 im Register 56589 (Flag-Interrupt-Bit), das vom Programm abgefragt werden kann (Zeile4040). Es signalisiert somit das Ende des Monoflop-Taktes und die Gültigkeit des Timerinhalts. Beim Auslesen wird dieses Bit selbständig wieder gelöscht.

Das Programm liest nun den Timer aus (2 Byte!), multipliziert ihn mit der Taktzeit und berechnet mit der Formel aus Bild 3 den gesuchten Wert. Für den Meßbereich Pikofarad und Nanofarad (B=0) erfolgt diese Rechnung in Zeile 5020. Sollte die zu messende Zeit die Timerkapazität überschreiten, so steht nach der Messung eine 0 in der Variablen und es wird in Zeile 5030 automatisch auf den Meßbereich Mikrofarad (B=1) umgeschaltet.

\[ \begin{aligned} T &= 0,7 \, R \, C \\[6pt] C &= \frac{T}{0,7 \, R} \\[6pt] R &= \frac{T}{0,7 \, C} \end{aligned} \] \[ \text{R in Ohm,} \quad \text{C in Farad,} \quad \text{T in Sekunden} \]
Bild 3. Berechnung der Impulsdauer

Hierbei wird das Highbyte des Timers A in Zeile 3210 nun mit 5 geladen, so daß längere Zeiten gemessen werden können. Die Umrechnung erfolgt jetzt in Zeile 6000. Falls die gemessene Zeit einen bestimmten Grenzwert unterschreitet, schaltet das Programm in Zeile 5035 wieder zurück in den Bereich 0.

Um genaue Ergebnisse zu gewährleisten, muß sichergestellt werden, daß nach einer Messung immer eine Erholzeit verstreicht, die mindestens 75% der Impulsdauer betragen soll. Diese Forderung ist normalerweise bereits durch die Programmlaufzeit erfüllt. Lediglich im Bereich Mikrofarad können längere Meßzeiten auftreten, die bei großen Kapazitäten nicht zu unterschätzen sind. Bei 1000 Mikrofarad beträgt die Impulsdauer bereits 27,3 Sekunden. Daher wird in Zeile 6020 eine angepaßte Warteschleife durchlaufen, die auch die Menüfunktionen zugänglich macht.

Aufbau und Inbetriebnahme

Die kleine Zusatzschaltung (Bild 4) kann auch von weniger Geübten leicht auf einer Lochrasterplatte aufgebaut werden. Alle Teile (Bild 5) sind handelsüblich und der gesamte Kostenaufwand liegt weit unter 10 Mark.

Bild 4. Schaltplan zum »Meßboy«
1 Monoflop SN 74121
1 Widerstand 3,3 kΩ
1 Meßwiderstand 39 kΩ ±1%
1 Kondensator 0,22 Mikrofarad
1 Stecker zum Anschluß an den User-Port des C 64, zum Beispiel Cardcon-Stecker Nummer 251-12-50-170 von TRW
1 Lochrasterplatte
1 Schalter 2x um
Bild 5. Stückliste zum »Meßboy«

Um den Anzeigefehler möglichst klein zu halten, sollte für den 39 Kiloohm-Meßwiderstand eine Ausführung mit kleiner Toleranz gewählt werden (±1% oder kleiner).

Den Festkondensator für die Widerstandsmessung kann man messen, indem man in Stellung »C« und »Kondensatormeßgerät« die mit»-« bezeichnete Klemme mit dem Anschluß des Kondensators verbindet, der am Umschalter liegt. Der angezeigte Wert wird in Zeile 7050 eingetragen. War die Anzeige beispielsweise 211 Nanofarad, dann muß die Zeile lauten:

7050 W=(65535-(PEEK(56582)+PEEK(56583)*256))*1.02e-6/(.7*211e-9)

Das Meßgerät ist nun geeicht und betriebsfertig.

Es sollte selbstverständlich sein, daß der Zusatz bei eingeschaltetem Computer weder aufgesteckt noch abgezogen wird.

Beim Starten des Programms wird zuerst das Kapazitätsmeßgerät aktiviert. Dazu muß man den Schalter auf der Zusatzplatine in Stellung »C« bringen. Auf der linken Bildschirmhälfte erscheinen die numerierten Speicherplätze, rechts leuchtet der Meßwert. Um die Benutzung zu erleichtern, erscheinen am unteren Bildrand alle verfügbaren Funktionen. Man kann sie durch Drücken des Anfangsbuchstabens anwählen.

Mit »S« gefolgt von einer Ziffer, wird der angezeigte Wert in den entsprechenden Speicher übernommen.

»L« löscht alle gespeicherten Einträge,
»W« oder »R« schalten um auf Widerstandsmessung, »K« oder »C« wieder zurück zur Kapazitätsmessung. Gelegentlich kann es beim Wechsel von Meßobjekten vorkommen, daß das Gerät nicht mehr reagiert. Hier hilft es, mit »I« einen Impuls von Hand auszulösen. Mit »Q« kann man das Programm verlassen.

Der Meßbereich des Systems reicht bei der angegebenen Dimensionierung von derGrößenordnung der Kabelkapazität bis zu einigen tausend Mikrofarad.

Im Ohm-Meßbereich überdeckt es jedoch nur die Werte von etwa 100 Ohm bis ungefähr 150 kΩ.

Die Belegung des User-Ports und eine Variablenliste finden Sie in Bild 6 und 7.

(Uwe Gerlach/ah)
A$ Eingabestring von der Tastatur (ein Zeichen)
W$ Anzuzeigender oder zu speichernder Wert (mit Einheit)
B
Bereich: 0 = Kondensatormessung kleiner 500 Nanofarad
1 = Kondensatormessung größer 500 Nanofarad
2 = Widerstandsmessung
H High-Byte Timer A (0 im Bereich 0, 5 im Bereich 1)
I Indexvariable in Schleifen
W Errechneter Meßwert
Feld W$(1..10) gespeicherte Meßwerte
Bild 7. Variablenliste zum Programm »Meßboy«
Bild 6. Anschlußbezeichnungen des User-Ports
100 rem   **************************
110 rem   *                        *
120 rem   *     c/r-messgeraet     *
130 rem   *                        *
140 rem   *                        *
150 rem   *  von  uwe gerlach      *
160 rem   *       bruehlstr. 23    *
170 rem   *                        *
180 rem   *       6440 bebra 1     *
190 rem   *                        *
200 rem   *                        *
210 rem   *       april 1985       *
220 rem   *                        *
230 rem   **************************
250 :
1000 poke53280,0: poke53281,0: rem farbe
1010 print "{clr}{wht}Widerstands-  und  Kapazitaetsmessgeraet{gry2}";chr$(14):print:print
1400 print"{home}":print:print:print:print,," Kapazitaetsmessung"
1420 b=0
1430 print:print:print,," Bitte den Schalter"
1440 print,,"  am Messzusatz in"
1450 print,,"    Stellung 'C'"
1460 print,,"      bringen !"
1490 goto 8110
1500 print"{home}":print:print:print:print,," Widerstandsmessung"
1520 b=2
1530 print:print:print,," Bitte den Schalter"
1540 print,,"  am Messzusatz in"
1550 print,,"    Stellung 'R'"
1590 goto 1460
1592 :
1999 rem*********************
2000 rem  anzeige und menue
2001 rem*********************
2010 poke211,21: poke214,17: sys 58732: rem  kursorpositionierung
2020 print"{wht}";w$;"{gry2}": rem aktueller wert
2030 gosub 9030
2998 :
2999 rem*******************************
3000 rem  i/o-baustein initialisieren
3001 rem*******************************
3010 h=0
3060 if b=1 then h=5: rem fuer > 500nf
3100 poke 56590,193: rem kontrollreg. a
3110 poke 56591,121: rem kontrollreg. b
3200 poke 56580,0:   rem timer a low
3210 poke 56581,h:   rem timer a high
3220 poke 56582,255: rem timer b low
3230 poke 56583,255: rem timer b high
3240 :
3300 poke 56577,0: rem impuls ausloesen
3998 :
3999 rem*******************************
4000 rem  warten auf flag-interrupt-bit
4001 rem*******************************
4040 if (peek(56589) and 16)>0 then 4090
4050 gosub 9030: goto 4040: rem  menue
4090 if b=2 then 7000: rem widerstdmsg.
4998 :
4999 rem**********************
5000 rem  kapazitaetsmessung
5001 rem**********************
5020 w=(65535-(peek(56582)+peek(56583)*256))*1.02e-6/(.7*39000)
5030 if w=0 and b=0 then b=1: goto 3000
5035 if w<3e-10 and b=1 then b=0: goto 3000
5050 if b=1 then 6000: rem messbereich
5070 if w<1e-9 then w$=left$(str$(w*1e12)+"      ",6)+" Pikofarad ": goto 2000
5080 if w<1e-6 then w$=left$(str$(w*1e9)+"       ",6)+" Nanofarad ": goto 2000
6000 w=(65535-(peek(56582)+peek(56583)*256))*5*256*1.02e-6/(.7*39000)
6010 w$=left$(str$(w*1e6)+"      ",6)+" Mikrofarad"
6020 for i=0 to w*1e6:gosub 9030: next i
6050 goto 2000
6998 :
6999 rem**********************
7000 rem  widerstandsmessung
7001 rem**********************
7050 w=(65535-(peek(56582)+peek(56583)*256))*1.02e-6/(.7*220e-9)
7070 w$="  "+left$(str$(int(w))+"      ",7)+" Ohm    "
7100 goto2000
7998 :
7999 rem********************
8000 rem  messwertspeicher
8001 rem********************
8050 get a$: if a$="" then 8050
8060 if val(a$)<0 or val(a$)>9 then 8110
8070 w$(val(a$))=w$
8110 poke 211,0: poke 214,2: sys 58732: rem  kursorpositionierung
8120 for i=0 to 9
8130 : print i; w$(i): print
8140 next i
8210 print "Speichern  Loeschen  Widerstandsmessung"
8220 print "Kapazitaetsmessung Impulsausloesen Quit"
8490 goto 2000
8498 :
8499 rem**************************
8500 rem  loeschen der speicher:
8501 rem**************************
8510 for i=0 to 9: w$(i)="                 ": next i
8520 goto 8110
8998 :
9000 rem****************
9010 rem   hauptmenue
9020 rem****************
9030 get a$
9040 if a$="s" then 8000
9050 if a$="l" then 8500
9060 if a$="q" then print"{clr}": end
9070 if a$="k" or a$="c" then 1400
9080 if a$="w" or a$="r" then 1500
9090 if a$="i" then 2000
9095 return
Listing 1. Softwareteil zum »Meßboy«. Bitte beachten Sie die Eingabehinweise auf Seite 6.
PDF Diesen Artikel als PDF herunterladen
Mastodon Diesen Artikel auf Mastodon teilen
← Vorheriger ArtikelNächster Artikel →