Die Nutzung der I/O-Pins (Ports)


zurück zu Input/Output , PIC-Grundlagen , PIC-Prozessoren , Elektronik , Homepage

Allgemeines
Initialisierung
Eingänge
Ausgänge
Beispiele für Eingangsbeschaltungen
Beispiele für Ausgangsbeschaltungen


Allgemeines

Die einfachste I/O-Funktion des PIC verkörpern die Ports (PortA ... PortE). Sie stellen jeweils bis zu 8 digitale Leitungen bereit, die als digitaler Eingang oder digitaler Ausgang funktionieren können.
Wieviele Ports ein PIC besitzt, hängt von der Zahl der zur Verfügung stehenden Anschlusspins, also von der Gehäusegröße ab.
 

Gehäuse
Typ (Beispel)
Port A
Port B
Port C
Port D
Port E
8-Pin Gehäuse
12F6xx
 X
 
 
 
 
14-Pin Gehäuse
16F630
16F676
X
 
X
(nur 6 Pins)
   
18-Pin Gehäuse
16F84
16F62x
 X
X
 
 
 
28-Pin Gehäuse
16F873
16F876
 X
X
 
 
40-Pin Gehäuse
16F877
 X
 X

Mit Ausnahme des Port A besitzen alle Ports jeweils 8 Pins. Eine Ausnahme machen die 16F630/676 mit einem 6-Pin-Port-C
Das Port A besitzt je nach PIC-Typ 5 Pins, 6 Pins (12F6xx) oder 8 Pins (16F62x).

Einige Pins stehen nicht exclusiv für die Ports zur Verfügung, sondern können auch anderen Funktionen wie z.B. seriellen Ein-/Ausgängen zugewiesen werden.

Jedes Port-Pin kann sowohl als Eingang wie auch als Ausgang initialisiert werden. Das erfolgt durch das Setzen von Bits in den TRISx-Registern. Jedes Port besitzt ein eigenes TRISx-Register, in diesem Register ist jedem Port-Pin ein Bit zugeordnet. Steht dieses Bit auf 1, dann ist daszugehörige Pin ein Eingang. Steht das Bit aber auf 0, dann ist das Pin ein Ausgang. Nach einem Reset oder nach dem Einschalten, sind die TRISx-Register auf 0xFF gesetzt, womit alle Port-Pins zunächst Eingänge sind.

Das setzen von Ausgangspins auf High (1) oder Low-Level (0) erfolgt durch Beschreiben der PORTx-Register. Jedes Port besitzt ein eigenes PORTx-Register, in diesem Register ist jedem Port-Pin ein Bit zugeordnet. Ist ein Port-Pin als Ausgang initialisiert, dann führt es den Pegel des zugehörigen Bits im PORTx-Register.

Das Abfragen von Eingangs-Port-Pins erfolgt durch Lesen der PORTx-Register. Dabei werden die an den Port-Pins anliegenden elektrischen Pegel (High/Low) in die zugehörigen Bits der PORTx-Register kopiert. Als Ausgang initialisierte Pins lesen dabei ihre eigenen Ausgangspegel, die verändern sich also im PORTx-Register nicht.
 

nach oben

Initialisierung

Beim Einschalten der Betriebsspannung (Power-On-Reset) oder beim Reset (MCLR=0) werden alle Bits der TRIS-Register auf den Wert 1 gesetzt. Damit sind alle I/O-Ports automatisch als Eingang konfiguriert.

Eine Besonderheit stellen Pins da, die neben der Port-I/O-Funktion auch als analoge Inputs benutzt werden können (z.B. Port A & Port E beim 16F87x oder 16F62x). Diese Pins werden beim Reset als analoge Eingänge initialisiert, und können als digital I/O erst benutzt werden, wenn sie von analog auf digital umgestellt wurden.

Dies erfolgt bei den 16F87x durch Setzen der Bits PCFG3...PCFG0 im Register ADCON1 (Adresse 0x9F). In Detail ist das am Beispiel des 16F87x  hier beschrieben.
PICs mit Comparator schalten anstelle des ADC den Comparatoreingänge auf die zugehörigen Pins. Das Lässt sich im Register CMCON ändern. Der kleine PIC12F675, der mit Comparator und ADC ausgestattet ist, schaltet beides zu. Das muss dann in CMCON und ANSEL geändert werden.

; PIC16F87x alle ADC-Eingänge auf digital I/O umschalten
    BSF      STATUS, RP0       ; auf Bank 1 umschalten
    BCF      ADCON1, PCFG3     ; PCFG3=0
    BSF      ADCON1, PCFG2     ; PCFG2=1
    BSF      ADCON1, PCFG1     ; PCFG1=1
    BCF      ADCON1, PCFG0     ; PCFG0=0
    BCF      STATUS, RP0       ; auf Bank 0 zurückschalten

; PIC16F628 alle Comparatoreingänge auf Digital umschalten
; alles in der Bank 0
    BSF      CMCON, CM0
    BSF      CMCON, CM1
    BSF      CMCON, CM2

; PIC12F629 alle Comparatoreingänge auf Digital umschalten
; alles in der Bank 0
    BSF      CMCON, CM0
    BSF      CMCON, CM1
    BSF      CMCON, CM2

; PIC12F675 alle Comparator-/ADC-Eingänge auf Digital umschalten
; beginnt in der Bank 0
    BSF      CMCON, CM0         ; GP0,1 von Comparator auf digital
    BSF      CMCON, CM1
    BSF      CMCON, CM2
    BSF      STATUS, RP0        ; Bank 1
    CLRF     ANSEL              ; GP0,1,2,4 von ADC auf digital
    BCF      STATUS, RP0        ; Bank0
 
 

Um den Eingangspegel an einem als Eingang initialisiertem Pin zu lesen, greift man einfach auf das zugehörige PORTx-Register zu. Daraufhin wird das gesamte Port (also alle zugehörigen Pins) eingelesen, ihre digitalen Werte in das PORTx-Register geschrieben, und dieser Wert an das Programm weitergegeben.

; Einlesen des Port B in das Akkuregister W
    MOVFW     PORTB           ; Port B lesen und nach W kopieren

Auch der Zugriff auf ein einzelnes Bit eines PORTx-Registers führt zum Einlesen des gesamten Ports in das PORTx-Register, was aber unproblematisch ist.

; Abfrage des Pins 0 des Ports B (RB0)
    BTFSC     PORTB, 0        ; Port B Pin 0 lesen
    GOTO      RB0istHigh      ; Sprung fall RB0 High ist
    GOTO      RB0istLow       ; Sprung fall RB0 Low ist

Um ein Pin eines Ports als Ausgang zu nutzen, muss es erst als Ausgang initialisiert werden, wozu das zugehörige Bit im TRISx-Register dieses Ports auf '0' gesetzt werden muss. Danach kann High und Low durch setzen und löschen des zugehörigen PORTx-Bits ausgegeben werden.

; Pins 0 des Ports A (RA0) und das gesamte PortB auf Ausgang konfigurieren
    BSF      STATUS, RP0       ; auf Bank 1 umschalten
    BCF      TRISA, 0          ; RA0 auf Ausgang einstellen
    CLRF     TRISB             ; Port B auf Ausgang umschalten
    BCF      STATUS, RP0       ; auf Bank 0 zurückschalten
    BSF      PORTA, 0          ; High-Pegel an RA0 ausgeben
    MOVLW    0x0F
    MOVWF    PORTB             ; RB0..RB3: High-Pegel, RB4..RB7: Low-Pegel
 

nach oben


Eingänge

Es gibt zwei unterschiedliche Arten von Eingangspins:

Für viele PIC16F (z.B. 16F87x, 16F628, 16F84) gilt:
- Die Ports C, D und E haben Schmitt-Trigger Eingänge.
- Die Ports A und B haben TTL-Eingänge mit Ausnahme des Pins 4 von Port A (RA4), welches ebenfalls ein Schmitt-Trigger Eingang ist.

In jedem Fall sollte man aber das Datenblatt seine PIC-Typs studieren, um zu prüfen, welche Eingangstypen ein spezieller PIC besitzt.

 
TTL-Eingang TTL-Eingang
Ein TTL-Eingang erkennt eine Spannung unter 16% der Betriebsspannung (<0,8V bei Vdd=5V) als Low-Pegel und eine Spannung über ca. 40% der Betriebsspannung (>2,0V bei Vdd=5V) als High Pegel. Der Bereich dazwischen ist nicht definiert. In der Realität sind die Eingänge nicht ganz so pingelig, aber die oben angegebenen Werte sind die vom Hersteller garantierten.

So ein Eingang eignet sich nur zum Einlesen sauberer digitaler Pegel.

TTL-Eingang
              mit pull-up TTL-Eingang mit Pull-Up Widerstand
Bei einigen Ports kann man einen zusätzlichen Pull-Up-Widerstand aktivieren. Dieser garantiert, das ein offener Eingang auf definiertem High-Pegel liegt. Das ist z.B. beim Anschluss einfacher Schalter oder Taster hilfreich.

Alle Pins von Ports B besitzen solche Pull-Up-Widerstände, die mit dem Steuerbit RBPU geneinsam ein- ('0') oder ausgeschaltet ('1') werden können.

Beim 12F6xx besitzen alle I/O-Pins außer GP3 Pull-Up-Widerstände, die aber individuell über Steuerbits ein- oder ausgeschaltet werden können.

ST-Eingang Schmitt-Trigger-Eingang (ST)
Der ST-Eingang schaltet auf Low-Pegel um, wenn die Eingangsspannung unter 20% der Betriebsspannung (<1V) fällt. Steigt die Eingangsspannung dann wieder über 80% der Betriebsspannung (>4V), schaltet der Eingang wieder auf High-Pegel. Bei Schwankungen zwischen diesen beiden Schwellwerten, behält der Eingang seinen alten Wert bei. Es gibt also keinen verbotenen Bereich.

ST-Eingänge eignen sich gut, um Eingangssignale zu verarbeiten, die keine perfekten TTL-Pegel haben, sondern sich stetig (und nicht Sprunghaft) ändern. Ein ST-Eingang kann z.B. mit einer verrauschten sinusförmigen Spannung gespeist werden, die er in saubere High und Low-Signale wandelt. Ein normaler TTL-Eingang würde im verbotenen Spannungsbereich zwischen 0,8V und 2,0V undefinierte, und vielleicht sogar unstabile Werte liefern.

Schutzdioden
IO-Pins des vieler PICs (z.B. 16F62x, 16F87xA und 12F6xx) besitzen Schutzdioden nach Vdd und Vss, die Über- und Unterspannungen an den Pins verhinden sollen.

nach oben


Ausgänge

Es gibt zwei unterschiedliche Arten von Ausgangspins:

Die Ports B, C, D und E haben TTL-Ausgänge.
Das Port A hat auch TTL-Ausgänge, mit Ausnahme des Pins 4 von Port A (RA4), welches einen Open Drain-Ausgang hat.
 
Natürlich sind in den PICs die Ausgänge mit Logikgattern und MOSFETs aufgebaut, aber zur vereinfachten Darstellung benutze ich Stromlaufpläne mit Schaltern. Die Widerstände sind die Innenwiderstände der Porttreiber. Die Erläuterung dazu folgt weiter unten.

Port A (außer RA4), Ports B, C, D, E
Der TTL-Ausgang kann sein Ausgangspin sauber auf Vdd (+5V) wie auch auf Vss (0V) legen. Der jeweilige Pegel wird vom zugehörigen Bit im PORTx-Register bestimmt. Die Belastbarkeit eines einzelnen Pins beträgt dabei für den 16F84 25 mA (Low-Pegel) bzw. 20 mA (High-Pegel). Alle anderen Flash-PICs erlauben 25mA bei beiden Pegeln.

Mit dem zugehörigen Bit im TRISx-Register kann die Ausgangsfunktion abgeschaltet werden.

Pin RA4
Der Open-Drain-Ausgang kann sein Ausgangspin nur sauber auf Vss (0V) ziehen. Das erfolgt, wenn das zugehörigen Bit im PORTx-Register den Wert 0 hat. Die Belastbarkeit des Pins beträgt dabei 25 mA.

Liegt das PORTx-Bit dagegen auf 1, dann wird der Ausgangspegel nur durch die externe Beschaltung bestimmt.

Der Vorteil dieser Beschaltung ist ein erhöhter zulässiger Spannungspegel am Pin von max. 8,5V. Außerdem lassen sich Open-Drain-Ausgänge bedenkenlos parallel schalten.

Mit dem zugehörigen Bit im TRISx-Register kann die Ausgangsfunktion abgeschaltet werden.

Die Belastbarkeit eines einzelnen Pins beträgt für den 16F84 25 mA (Low-Pegel) bzw. 20 mA (High-Pegel). Alle anderen Flash-PICs erlauben 25mA bei beiden Pegeln.

Der Gesamtstrom aller Pins darf aber eine Summe nicht überschreiten, die von PIC zu PIC etwas verschieden ist:

Innenwiderstände
High-Ausgangsspannung bei Laststrom Die Ausgangstreiber des PIC sind aus MOSFETS aufgebaut, und können theoretisch von Vss bis Vdd treiben. Allerdings wird der  Ausgangspegel stark durch die recht  hohen Innenwiderständer der MOSFETs beeinflusst. 
Generell kann man sagen, dass ein PIC besser ein Signal auf Low (Vss, Masse) ziehen kann, als auf High (Vdd, +5V). 

Die nebenstehende Grafik entstammt dem Datenblatt des PIC16F84, gilt aber im Prinzip für alle PICs.

Zu sehen ist die typische Ausgangsspannung an einem Output-Pin bei High-Pegel (1) wenn der Pin Strom treiben muss. Ohne Belastung erreicht die Spannung die erwarteten 5V. Bei 10 mA Last sind es aber nur noch 4,2V und bei 20 mA nur noch 3,2V.

Der Innenwiderstand des Pins beträgt dabei ca. 80 .. 90 Ohm.

Beispiel
Ein 5V-DIL-Relais mit einem Spulenwiderstand von 200 Ohm soll vom PIC direkt geschaltet  werden. Ein Ende der Relaisspule wird mit Vss (Masse, 0V) verbunden. Das andere Ende an das PIC-I/O-Pin angeschlossen. Ein High-Pegel am Pin soll das Relais schalten lassen.
Wird das Pin auf High gesetzt, stellt sich ein Strom von 17 mA ein und die Spannung am Pin  beträgt 3,5V. Das ist für viele Relais nicht ausreichend.
 

Diese Grafik zeigt die Spannung an einem I/O-Pin an, das versucht Low-Pegel auszugeben, aber extern mit (z.B. einem Hochziehwiderstand) belastet ist. Der Pegel sieht viel besser aus, als beim High-Diagramm.

Der Innenwiderstand des Pins beträgt nun nur ca. 33 Ohm.

Beispiel:
Ein 5V-DIL-Relais mit einem Spulenwiderstand von 200 Ohm soll vom PIC direkt geschaltet  werden. Ein Ende der Relaisspule wird mit Vdd (5V) verbunden. Das andere Ende an das PIC-I/O-Pin angeschlossen. Ein Low-Pegel am Pin soll das Relais schalten lassen.
Wird das Pin auf Low gesetzt, stellt sich ein Strom von 21 mA ein und die Spannung am Pin  beträgt 0,7V. Über der Relaisspule liegen also 4,3V an.  Das ist deutlich mehr als im vorigen Beispiel, und für viele DIL-Relais ausreichend.

Low-Ausgangsspannung bei Laststrom
nach oben

Beispiele für Eingangsbeschaltungen
Es folgen einige einfache Eingangsbeschaltungen für I/O-Portpins.
 
Die einfachste Signalquelle für ein Input-Pin ist ein Umschalter, der das Pin mit 0V oder 5V verbindet. 

Falls ein Entprellen des Schalters nötig ist, dann erfolgt das hier (wie auch beiden weiteren Schalter-Beispielen) am Besten per Software.

Kostensparend ist der Einsatz eines einfachen Schließers oder Öffners anstelle des teureren Umschalters. In diesem Fall wird aber der Einsatz eines Hochziehwiderstandes (pull-up) nötig. Dieser sorgt bei offenem Schalter für den High-Pegel. 

Der Wert des Widerstandes ist unkritisch (1k ... 100k). 

Einige Portpins (z.B. das gesamte Port B) besitzen interne Hochziehwiderstände, die per Software eingeschaltet werden können. Das erspart den externen Widerstand.

Ein praktisches Beispiel für Schalter mit Hochziehwiderständen ist die Taster-Testplatine.

Anstelle des Hochziehwiderstandes kann auch ein Runterziehwiderstand (pull-down) verwendet werden, wenn der Schalter mit +5V verbunden wird.
Der Schmitt-Trigger-Eingang RA4 kann wie ein normaler TTL-Eingang beschaltet werden, er bietet aber darüberhinaus auch die Möglichkeit nicht TTL-konforme Signalpegel zu verarbeiten.

Im nebenstehenden Beispiel soll ein Ablauf im Programm mit der 50 Hz Netzfrequenz synchronisiert werden (z.B. im Rahmen einer Phasenanschnittsteuerung o.ä.). Eine 9V-Wechselspannung wird über einen Vorwiderstand und 2 Shottkydioden in eine Spannung verwandelt, die zwischen 0V und 5V pendelt. Der ST-Eingang wandelt das Signal in saubere High und Low Werte um. Die Dioden dienen dem Eingang als Schutz vor Überspannung, der Widerstand schützt seinerseits die Dioden vor Überstrom.

Die meisten Pins besitzen interne Klemmdioden, die genau den Dioden in dieser Schaltung entsprechen. Deshalb können die externen Dioden oft entfallen. Der Widerstand ist aber in jedem Fall nötig, um den Strom durch die Klemmdioden zu begrenzen (<< 20mA).

Wie sich eine große Anzahl von Tasten mit wenigen Pins ansteuern lässt, ist hier beschrieben

nach oben


Beispiele für Ausgangsbeschaltungen

Im Folgenden werden einige Beispiele für Ausgangsbeschaltungen aufgezeigt.
 
Ein PIC-Ausgang kann einen Strom von 20 ... 25 mA bereitstellen. Das reicht aus, um kleinere Lasten direkt zu treiben.

Im nebenstehenden Bild sind zwei Möglichkeiten für den Anschluss von Leuchtdioden gezeigt. D1 leuchtet auf, wenn RB4 Hig-Pegel führt, D2 leuchtet wenn RB6 Low-Pegel hat. Die Größe des Vorwiderstandes hängt von der gewünschten Leuchtstärke ab. Bei 1 Kiloohm fließen durch eine LED ca. 3,5 mA, was normalerweise ausreicht. Bei Bedarf kann der Widerstand bis auf ca. 220 Ohm verringert werden (15 mA). Moderne low-current-LEDs sind für 2 .. 4 mA ausgelegt, normale Standard-Typen benötigen höhere Ströme (10 .. 15 mA).

Die Werte gelten für rote (und in etwa auch für gelbe und grüne) LEDs. Blaue LEDs benötigen eine höhere Flussspannung. Hier müssen Widerstandswerte entsprechend den technischen Daten der LEDs festgelegt werden, die Widerstände fallen hier relativ klein aus.

Wie sich eine große Anzahl von LEDs mit wenigen Pins ansteuern lässt, ist hier beschrieben.

Um ein Relais anzusteuern reichen die max. 25 mA eines Pins meist nicht aus. 5V-Relais haben normalerweise Spulenwiderstände von 180 Ohm und darunter.

Eine Notlösung ist das Parallelschalten von Ausgängen. Damit lassen sich durchaus 100 mA erzeugen, es wird aber eine große Disziplin beim Programmieren erwartet. Alle zusammengeschalteten Pins müssen immer den gleichen Pegel führen, ansonsten werden einzelne Pins überlastet.
Die grauen Dioden dienen nur dem Schutz der Pins vor Programmierfehlern, und können von selbstbewussten Bastlern weggelassen werden. Die schwarze Diode (anti-parallel zum Relais) schützt den PIC vor den Induktionsspitzen hoher Spannung, die beim Abschalten des Relais auftreten.

Der elegantere und sicherere Weg zum Ansteuern niederohmiger Lasten ist ein Transistorverstärker. Ein Billigtyp wie der BC337 eignet sich schon, um Lasten bis zu 500 mA anzusteuern. Der Wert des Widerstands hängt vom nötigen Schaltstrom ab. Mit 1 Kiloohm ist man auf der sicheren Seite, wird nur ein Schaltstrom von 100 mA benötigt, darf der Widerstand auch auf 4,7 kOhm anwachsen.

Die Diode ist für den Schutz des Transistors nötig. Einige  Relais besitzen integrierte Schutzdioden. Bei denen ist darauf zu achten, dass sie richtig herum angeschlossen werden. 

Ein praktisches Beispiel für eine Relaisansteuerung ist die Relais-Testplatine.

Soll der PIC einen Verbraucher ansteuern, der eine höhere Spannung als Vdd benötigt, lässt sich auch das mit einem Transistorverstärker bewältigen.
Im gezeigten Beispiel sollte der Lastwiderstand groß genug sein, um den pnp-Transistor nicht zu überlasten (>100 Ohm).
Ausgang mit FET
Müssen Verbraucher geschaltet werden, die große Ströme erfordern, so bietet sich ein Feldeffekttransistor (FET) an. Ein Leistungs-N-FET benötigt an seinem Eingang fast keinen Steuerstrom, er kann aber mehrere Ampere schalten.

Aber nicht jeder N-FET eignet sich als PIC-Ausgangstreiber. Viele N-FETs benötigen eine Steuerspannung von deutlich mehr als 5V, der PIC kann aber nur 5V liefern. Es gibt für diese Anwendung aber spezielle logic-level-FETs (LL-FET) wie den in der nebenstehenden Schaltung zu sehenden IRLZ34N (Reichelt: 0,43 Euro). Mit einer Steuerspannung von z.B. 4V hat er einen Innenwiderstand von 60 Milliohm und wird bei 3A Schaltstrom ohne Kühlkörper nur gut handwarm.
Ein teurerer SUP75N03-04 (Nessel: 1,90 Euro) hat bei 4,5V Schaltspannung nur 6 Milliohm Innenwiderstand, und schaltet ungekühlt problemlos 10A.

L
L-FETs vertragen keine extrem hohen Spannungen. Oft sind es nur 20V (was aber oft auch reicht), der IRLZ34N ist mit 55V schon fast eine Ausnahme, der SUP75N03-04 schafft 30V.

Wie man sieht, kann ein PIC-Pin mit Hilfe eines guten FETs einige hunder Watt schalten.
SSR-Ansteuerung
Neben mechanischen Relais werden zum Schalten von Wechselspannungen immer öfter Halbleiterrelais (Solid-State-Relais = SSR) eingesetzt. Diese bieten oft eine hohe hohe Ausgangsstromstärke, hohe Spannungsfestigkeit und eine galvanische Trennung vom Steuerstromkreis.
Wird im nebenstehenden Beispiel ein SSR vom populären Typ S202SE2 verwendet (Reichelt: 3,20 € ), dann lassen sich Lasten von bis zu 400W bei 230VAC schalten. Wird der S202SE2 mit einem Kühlkörper versehen (Isolierung beachten !), kann er bis zu 8A schalten.
Die LED zeigt den aktuellen Zustand des SSR an, und ist für die Funktion des SSR nicht zwingend erforderlich.

Ein praktisches Beispiel für eine SSR-Ansteuerung ist die SSR-Testplatine.

Beim Umgang mit Netzspannung ist höchste Vorsicht geboten. Teile des Layouts, die Anschlussklemmen sowie die metallischen Teile an der Oberseite der SSR führen Netzspannung!

Zusätzliche Tipps für dei Beschaltung von SSR-Ausgängen findet man hier.

nach oben

zurück zu Input/Output , PIC-Grundlagen , PIC-Prozessoren , Elektronik , Homepage

Autor: sprut
erstellt: 29.08.2002
letzte Änderung: 23.08.2011