I/O Schnittstellen Module
Mit I/O Schnittstellen Modulen kann man elektrische Einrichtungen überwachen und steuern. Da PC's keine herkömmlichen Parallel-Ports mehr haben, stelle ich hier Ersatz mit alternativen Schnittstellen vor. Der Zugriff auf die I/O Ports erfolgt über textbasierte Standardprotokolle, was ohne spezielle Treiber mit jeder beliebigen Programmiersprache auf jedem Betriebssystem funktioniert.Ich habe drei Varianten von diesem Projekt:
Befehlssatz
Alle drei Varianten werden mit Text-Kommandos gesteuert, zum Bespiel: oPA3,1Die Befehle bestehen jeweils aus einem Buchstaben, gefolgt von dem gewünschten Pin oder Port. Bei Schreibzugriffen folgt dahinter ein Komma oder "=" Zeichen und dann der Wert.
- input: Digitale Eingabe
- output: Digitale Ausgabe
- direction: Datenrichtung konfigurieren
- pull-up: Widerstände konfigurieren
- analog: Einen analogen Eingang lesen
- reference: Die analoge Referenz konfigurieren
Die ersten vier Befehle können sich wahlweise auf einen einzelnen Pin, einen ganzen Port oder alle Ports beziehen:
- PA3 spricht den gleichnamigen einzelnen Pin an. Der Wert ist binär.
- PA spricht den ganzen Port A an. Der Wert ist eine 8-Bit Hexadezimalzahl. Die Ports der AVR Mikrocontroller heissen PA, PB, PC, usw.
- ohne Port-Angabe spricht man alle Ports auf einmal an. Je nach Größe des Mikrocontrollers ist der Wert eine 32-Bit Hexadezimalzahl (entsprechend der Ports DDCCBBAA) oder eine 64-Bit Hexadezimalzahl (entsprechend der Ports HHGGFFEEDDCCBBAA).
Digitale Eingabe
Standardmäßig sind alle I/O Pins als Eingang konfiguriert. Mit dem input Befehl fragt man den Zustand digitaler Pins ab. Beispiel für einen einzelnen Pin:
Befehl: iPA7
Antwort: PA7=1
Beispiel für den ganzen Port A (8-Bit):
Befehl: iPA
Antwort: PA=E7
Beispiel für vier Ports auf einmal (32-Bit):
Befehl: i
Antwort: i=00FF01E7
Die Hexadezimalzahl bezieht sich auf die vier Ports DDCCBBAA. Bei größeren Mikrocontrollern ist sie doppelt so lang und bezieht sich auf die Ports HHGGFFEEDDCCBBAA.
Mit dem pull-up Befehl kann man die internen Pull-Up Widerstände einschalten. Beispiele:
Befehl: pPA7,1
Antwort: Ok
Befehl: pPA,FF
Antwort: Ok
Befehl: pP,FFFFFF
Antwort: Ok
Auf Pins, die als Ausgang konfiguriert sind, hat der pull-up Befehl keine Auswirkung. Der input liefert bei Ausgängen den aktuellen Zustand der Pins.
Digitale Ausgabe
Zuerst muss man die gewünschten I/O Pins mit dem direction Befehl als Ausgang konfigurieren, danach kann man sie mit dem output Befehl auf HIGH und LOW setzen. Beispiel für einen einzelnen Pin:
Befehl: dPA4,1
Antwort: Ok
Befehl: oPA4,1
Antwort: Ok
Befehl: oPA4,0
Antwort: Ok
Beispiel für den ganzen Port A (8-Bit):
Befehl: dPA,FF
Antwort: Ok
Befehl: oPA,FF
Antwort: Ok
Befehl: oPA,00
Antwort: Ok
Beispiel für vier Ports auf einmal (32-Bit):
Befehl: d,FFFFFFFF
Antwort: Ok
Befehl: o,FFFFFFFF
Antwort: Ok
Befehl: o,00000000
Antwort: Ok
Die Hexadezimalzahl bezieht sich je nach Länge auf die Ports DDCCBBAA oder HHGGFFEEDDCCBBAA. Auf Pins, die als Eingang konfiguriert sind, hat der output Befehl keine Auswirkung.
Analoge Eingabe
Das folgende Beispiel liest den analogen Eingang 3 mit dem analog Befehl ein:
Befehl: a3
Antwort: ADC3=01A3
Das Ergebnis ist eine 16-Bit Hexadezimalzahl, entsprechend dem Messwert des ADC.
Je nach Mikrocontroller sind unterschiedliche Referenz-Spannungen einstellbar. Sie legt die höchste messbare Spannung fest.
- Xmega: INT1V1, AREFA, AREFB, INTVCC2
- ATmega: VCC1, EXT, 1.1V, 2.56V
Befehl: r2.56V
Antwort: Ok
- Standardvorgabe des Mikrocontrollers
- das ist die Versorgunsgspannung an VCC geteilt durch 1.6
Erweiterte Eingänge
Mit Hilfe von Schieberegistern kann man die Anzahl der Eingänge erweitern. Diese zusätzlichen Eingänge nenne ich "Port X". Sie können mit dem input Befehl abgefragt werden. Je nach Anzahl der Schieberegister antwortet der Befehl mit unterschiedlich langen Hexadezimalzahlen (8-32 Bits). Beispiel für 16 Bits:
Befehl: iPX
Antwort: PX=25CF
Beispiel zur Abfrage eines einzelnen Eingangs X9:
Befehl: iPX9
Antwort: PX9=1
Erweiterte Ausgänge
Mit Hilfe von Schieberegistern kann man die Anzahl der Ausgänge erweitern. Diese zusätzlichen Ausgänge nenne ich "Port Y". Sie können mit dem output Befehl beschrieben werden. Je nach Anzahl der Schieberegister erwartet der Befehl unterschiedlich lange Hexadezimalzahlen (8-32 Bits). Beispiel für 24 Bits:
Befehl: oPY,FFFFFF
Antwort: Ok
Beispiel zum Ändern eines einzelnen Ausgangs Y0:
Befehl: oPY0,1
Antwort: Ok
Alternative Zahlenformate
Hexadezimale Zahlen dürfen wahlweise mit kleinen und großen Buchstaben geschrieben werden.
Für binäre Zahlen kann man alternativ zu 0 und 1 auch diese Buchstaben in klein und groß verwenden:
low | high |
input | output |
disabled | enabled |