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