Allgemeines
Initialisierung
Eingänge
Ausgänge
Beispiele
für Eingangsbeschaltungen
Beispiele
für Ausgangsbeschaltungen
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.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
16F676 |
|
(nur 6 Pins) |
|||
|
16F62x |
|
|
|
|
|
|
16F876 |
|
|
|
|
|
|
|
|
|
|
|
|
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.
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
Es gibt zwei unterschiedliche Arten von Eingangspins:
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.
Es gibt zwei unterschiedliche Arten von Ausgangspins:
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 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:
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:
|
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: |
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
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. |
|
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). |
|
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. LL-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. |
|
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. |
Autor: sprut
erstellt: 29.08.2002
letzte Änderung: 23.08.2011