benutzen

Um den ioProz als Interface (engl. für Schnittstelle zur Außenwelt) benutzen zu können, muss man ihn passend ansteuern. 

Vorarbeiten am PC

Vorarbeiten an der Excel-Mappe

Verkabelung

Programmrumpf

Ein- und Ausgabe von digitalen Signalen

Zeitliche Abläufe

Einlesen von Analogwerten (zukünftig)

Präzisionszeitmessungen (zukünftig)

 

 

Vorarbeiten am PC

nach oben

 

Vorarbeiten an der Excel-Mappe

nach oben

 

Verkabelung

PC und ioProz tauschen Daten über ein Kabel aus. Dafür muss eine freie serielle Schnittstelle (z.B. COM 1 oder COM 2) des PCs mit einem ungekreuzten RS232-Kabel an die ioProz-Platine angeschlossen werden; RS232 ist die internationale genormte Bezeichnung für diese Form der seriellen Schnittstelle; seriell bedeutet, dass die Daten zeitlich hintereinander (und nicht parallel, d.h. zeitgleich über mehrere Drähte) übertragen werden. Übrigens: die Übertragung eines Befehles dauert bei 38400 Bits pro Sekunde ca. 0,25 Millisekunden. 

Alternativ kann statt dem seriellen Kabel auch ein USB-Konverter verwendet werden. Die Treiber für den günstigen Konverter mit Prolific-Chips gibt es hier

nach oben

 

Programmrumpf

Um den Kontakt zwischen PC und ioProz auch softwareseitig in Gang zu setzen, sind folgende  Schritte zu erledigen:

Im Kopfteil des Programmtextes muss folgender Objekt-Verweis deklariert werden:

Dim p1 as ioProz      'Das Objekt, über das der Prozessor angesprochen 
                      'werden soll, soll z.B. p1 heißen. 

Über den Verweis kann das Objekt im Folgenden immer angesprochen werden. Zunächst muss es aber in der Sub UserForm_Initialize() erzeugt werden. 

Set p1 = New ioProz   'Jetzt wird das Objekt erzeugt und heißt p1.

Die ioTrix.dll muss nun erfahren, an welcher seriellen Schnittstelle der ioProz hängt. Dies geschieht z.B. auch in der Sub UserForm_Initialize():

p1.ioProzPort 2       'Der Kontakt zum ioProz wird z.B. an der  
                      'seriellen Schnittstelle 2 (COM2) eröffnet. 

Ab jetzt können Daten ausgetauscht werden.

nach oben

 

Ein- und Ausgabe von digitalen Signalen

Vom PC aus wird der ioProz über sogenannte Register angesprochen. Ein Register kann man sich vorstellen als eine Schublade, die einen Namen und einen Inhalt hat (ein Mathelehrer würde sagen: es ist eine Variable). Das einzige, was man vom PC aus mit einem Register machen kann, ist, eine Zahl hinein schreiben (Befehl ioWrite) oder eine Zahl auslesen (Befehl ioRead). Den ganzen Rest erledigt der ioProz selbsttätig.

Hier die wichtigsten Register und ihre Bedeutung in einer Übersicht:

Name des Registers

Input/Output aus Sicht des PCs

Übersetzung / Bedeutung

DDRB

Output

Data Direction Register B; hier wird für jedes einzelne Bit in Port B bestimmt, ob es für eine Eingabe oder eine Ausgabe verwendet werden soll. Beispiel: Der binäre Zahlenwert 001011 (dezimal: 8+2+1=11) wählt die Pins PB0, PB1 und PB3 als Ausgang, den Rest als Eingang.

DDRC

Output

Data Direction Register C, entsprechend für Port C

DDRD

Output

Data Direction Register D, entsprechend für Port D. Die Werte für PD0 und PD1 werden vom ioProz ignoriert.

PORTB

Output

Port B Ausgabe-Register. Hier wird angegeben, ob ein bestimmter Ausgang an (+5V, engl. „high“) oder aus (0V, engl. „low“) sein soll. Beispiel, passend zum Fall oben: Der binäre Zahlenwert 000010 (dezimal: 2) schaltet die Ausgänge PB0 und PB3 low und den Ausgang PB1 high.

PORTC

Output

Port C Ausgabe-Register, entsprechend

PORTD

Output

Port D Ausgabe-Register, entsprechend

PINB

Input

Port B Eingabe-Register. Hier wird abgefragt, welche Pins von Port B high sind und welche low. Beispiel, passend zu den beiden Fällen oben: Falls an PB2 von außen +5V anliegen, liefert das Lesen des Registers binär 000110 (dezimal: 4+2=6), denn PB2 und PB1 sind beide high. Falls PB2 auf low liegt, ergibt sich statt dessen 000010. Das Register unterscheidet also nicht, ob ein Input-Pin oder ein Output-Pin auf high bzw. low liegt und liefert immer alle aktuellen Zustände an allen Pins.

PINC

Input

Port C Eingabe-Register.

PIND

Input

Port D Eingabe-Register.

Um das Beispiel von oben (siehe Registerübersicht) zu programmieren, muss an passender Stelle im Programm eingefügt werden:

p1.ioWrite DDRB, 11        '=001011 Datenrichtung festlegen  
p1.ioWrite PORTB, 2        '=000010 PB0 und PB3 low, PB1 high setzen
Inputwert = p1.ioRead PINB ' Den Zustand des Ports B abfragen

Wem das praktischer erscheint, kann die erste Zeile auch so formulieren:

p1.ioBitWrite DDRB, 0, 1  
p1.ioBitWrite DDRB, 1, 1  
p1.ioBitWrite DDRB, 2, 0  
p1.ioBitWrite DDRB, 3, 1  


nach oben

 

Zeitliche Abläufe

Zur Steuerung zeitlicher Abläufe braucht man eine Stoppuhr. Weil die Timerfunktion in Visual Basic so unbefriedigend ist, stellt die ioTrix.dll eine verbesserte Alternative zur Verfügung: das Objekt SystemTimer. Es basiert auf dem sogenannten Performance-Counter, der eine hardware-gestützte Zeitmessung darstellt, die direkt im Prozessor des PCs stattfindet. Die zeitliche Auflösung des Performance-Counters ist besser als eine Mikrosekunde. Diese Auflösung wird im SystemTimer wegen verschiedener Verzögerungen innerhalb von Windows leider nicht voll erreicht, liegt aber normalerweise (wenn Windows nichts anderes zu tun hat) bei unter 20 Mikrosekunden. Ein Demo für die Vorgehensweise bei Zeitsteuerungen ist diese Stoppuhr, die direkt von Excel/VBA aus gestartet werden kann.

Weil SystemTimer ein Objekt ist, können bei Bedarf mehrere von ihnen verwendet werden, was z.B. dann sehr praktisch ist, wenn der eine Timer stehen soll, während der andere läuft. Die entsprechend erweiterte Stoppuhr zeigt nebenbei noch, wie man vom Basic aus direkt in ein Excel-Blatt schreibt.

nach oben