Tips für PICs 13: Open Collector

OC Ab und zu ist es sinnvoll, logische Schaltungen mit einem "Open Collector"-Ausgang zu verwenden. PICs haben diese Möglichkeit nicht; es sei denn, man trickst.

Zunächst etwas Prinzipielles: Ein Ausgang eines digitalen Bausteins (IC; hierzu gehören auch Microcontroller und damit PICs) kann 2 verschiedene Zustände einnehmen, High und Low. Die Ausgangsstufe legt entweder die Plus- oder die Minus-Spannung auf den Ausgangs-Pin. Diese Schaltung wird "Totem-Pole" oder "Gegentakt-Endstufe" genannt.
Es gibt jedoch noch einen 3. Zustand, den ein Ausgangs-Pin annehmen kann: den "hochohmigen" oder "offenen" Zustand. In Datenblättern wird eine Endstufe mit diesen 3 Zuständen auch mit "tri-state" (frei übersetzt mit 3-fach-Zustand) bezeichnet. Benötigt wird so etwas bei Bus-Systemen, wo immer nur ein einziger Baustein senden darf, aber alle anderen "zuhören" müssen.
Im Bild sehen Sie links das Prinzip-Schaltbild eines IC mit einer Gegentakt-Endstufe, hier der Einfachheit halber mit komplementären bipolaren Transistoren gezeichnet. Entweder ist der untere Transistor leitend (Low am Ausgang) oder der obere (High am Ausgang). Natürlich muß der jeweils andere Transistor gesperrt werden, sonst gibt es intern einen Kurzschluß.
Sperrt man nun den oberen Transistor ständig, so greift er nicht in die Ausgangsschaltung ein; er ist praktisch nicht vorhanden. Somit wäre dies die Situation in der rechten Schaltung.
Sperrt man nun beide Transistoren, so ist ein hochohmiger Zustand erreicht: die Spannung am Pin wird nicht mehr durch das IC beeinflußt; sondern nur noch, wie im rechten Bild, durch den Widerstand nach +.
Ein praktischer Nutzen: Wir können uns eine Automatik-Schaltung vorstellen, bei der ab und zu per Hand-Taster eingegriffen werden soll. Wenn mit diesem eine bestimmte Leitung auf Masse gelegt werden soll, darf das Automatik-IC diese Leitung nicht mit Gewalt auf High halten wollen: ansonsten gibt es einen Kurzschluß. Da wäre eine Anordnung wie im Bild rechts mit einem Widerstand nach + sehr sinnvoll.

Bei einem PIC ist ein hochohmiger Zustand ebenfalls erreichbar: man muß den Pin nur von "Ausgang" auf "Eingang" umschalten. Die eingangs gestellte Forderung wäre also durch Umschalten von "Ausgang Low" auf "Eingang" realisierbar.

Wir wollen dies an einem Beispiel verdeutlichen:
Bei irgend einem PIC soll der Ausgang PORTA,0 ein OpenCollector-Verhalten bekommen. Dazu schalten wir das Bit 0 im Register PORTA ständig auf 0. (Dieser Wert darf nie verändert werden!) Zwischen diesem Zustand und "hochohmig" schalten wir, indem wir nur das Bit 0 im Register TRISA (= "Tri-state Port A") auf 0 (PORTA,0 ist Ausgang) und 1 (PORTA,0 ist Eingang) hin- und herschalten. Schon fertig!

Sogar den normalerweise nötigen Collector-Widerstand (wir haben ihn im rechten Bild eingezeichnet) können wir innerhalb des PIC erzeugen, wenn ein Wert von ca. 20 kΩ ausreicht. Dazu aktivieren wir den "weak pull-up"-Widerstand an diesem Pin (falls vom Hersteller vorgesehen), indem wir das Bit 0 im Register WPUA (= "weak pull-up Port A") auf 1 setzen, zusätzlich noch das prinzipielle Ermöglichen dieser Funktion (quasi der "Hauptschalter") durch Setzen von Bit 7 (/RAPU) im Register OPTION_REG. Und schon wieder sind wir fertig!
Die Pull-up-Widerstände haben Werte um 20 kΩ und sind nicht bei allen PICs verfügbar und, wenn doch, dort nicht unbedingt an allen Ports. Das Bit 7 in OPTION_REG kann, je nach PIC-Typ, auch andere Namen haben. Dafür gibt es frei verfügbare Datenblätter! Leider nur auf Englisch ...

Wichtig:
Bei diesem Tricksen ist die "Input/Output-Falle" zu beachten, zu der sprut Wichtiges geschrieben hat, dem von unserer Seite nichts hinzuzufügen ist. Wir schlagen vor, grundsätzlich direkt vor dem Umschalten auf Ausgang den Pin noch einmal auf Low zu setzen.
Also, Schalten des Pin 0 von Port A auf Low:

bankselPORTA; Umschalten auf Bank 0, falls nicht schon geschehen (dort ist PORTA erreichbar)
bcfPORTA,0; Ausgang auf Lo setzen, Umgehen der I/O-Falle
bankselTRISA; Umschalten auf Bank 1 (dort ist TRISA erreichbar)
bcfTRISA,0; Pin auf Ausgang schalten (Tri-state löschen)
bankselPORTA; Umschalten auf Bank 0, muß hier nicht unbedingt sein

Schalten des Pin 0 von Port A auf Tri-state:

bankselTRISA; Umschalten auf Bank 1 (dort ist TRISA erreichbar)
bsfTRISA,0; Pin auf Eingang schalten (Tri-state setzen)
bankselPORTA; Umschalten auf Bank 0, muß hier nicht unbedingt sein

Fazit:
Wir haben aus einem Totem-Pole-Ausgang einen Open-Collector-Ausgang gemacht, nur durch ein paar Software-Zeilen.
Das fasziniert so an der Programmiererei ...

aaaber ...
Das Bauteil bleibt natürlich ein PIC. Und der darf auch an seinem OpenCollector-Pin mit einer Spannung von nicht mehr als der Versorgungsspannung (meist 5 Volt) eingespeist werden.
Wer sein Platinen-Layout noch nicht fertig hat (es also noch rechtzeitig bemerkt hat, daß er einen OpenCollector braucht), kann natürlich auch einfach eine Allerweltsdiode in die Ausgangsleitung schalten. Er kommt dann allerdings nicht mehr auf fast 0 Volt herunter, wenn der Ausgang geschaltet wird.
Oder er baut zusätzlich einen MOSFET ein. Dann kann er (je nach Bauteil) beliebig hohe Spannungen und Ströme schalten.

08.05.2017
noch mal: aaaber ...
Test Wir haben's erst beim Testen gemerkt: es ist noch ein Wurm drin!
Wir haben uns ein Testsystem gebaut, um bestimmte Platinen zu testen (Faller-Car-System, Fahrzeugerkennung). Diese Platinen haben 9 Ausgänge, und alle müssen OpenCollector-Verhalten haben. Schlau, wie wir zu sein glaubten, haben wir uns die nebenstehende Schaltung ausgedacht: Ohne PIC ist die Schaltung stromlos, da die Spannungen an den einzelnen Elementen (2 LEDs, 2 Z-Dioden) zusammen weit mehr als 5 Volt ausmachen.
Schaltet der untere PIC-Transistor, leuchtet die obere LED, schaltet der obere Transistor, leuchtet die untere LED, ist OpenCollector, leuchtet keine LED.
So dachten wir.
In diesem Falle leuchteten aber beide LEDs, zwar schwach, aber sie taten es! Die Ursache war, daß am PIC-Pin ein Schwingen auftrat. Wir hatten nämlich durch die Schaltung dem PIC eine Spannung aufgezwungen, die im verbotenen Bereich zwischen High und Low lag. Das hatte er gar nicht gemocht!
Auch da fiel uns schnell eine Lösung ein: wir schalteten bei Stellung "OpenCollector" den Pin nicht auf "Eingang", sondern auf "Analog-Eingang". In dieser Betriebsart verträgt er jede Spannung (in den gesteckten Grenzen). Leider konnten nicht alle betroffenen Pins auf "Analog" geschaltet werden, so daß wir uns etwas ganz anderes haben einfallen lassen müssen. Leider waren die Platinen schon in Serie gefertigt worden, so daß ein neues Design nicht in Frage kam.
Ein kleiner Trost: Dieses Problem trat ja auch nur bei der Testplatine auf; im Anlagenbetrieb konnte es prinzipiell nicht dazu kommen. Also nur die Test-Platine modifizieren ...
Test Nach einigem Nachdenken war auch das schnell getan: Wir spendierten ihr einen Rechteckgenerator (NE555 mit 2 Widerständen und 3 Kondensatoren), dafür fielen aber 18 Z-Dioden weg. Der NE555 schaltet seinen Ausgang, wie nicht anders zu erwarten, zwischen High und Low hin und her, Frequenz ca. 1 kHz. Bei High versucht er, über die gelbe LED Strom in den PIC zu schieben, bei Low Strom über die rote LED zu ziehen. Über die LEDs wird also nun getestet, ob ein Strom in den PIC hineinfließen kann oder von ihm geliefert wird. Beim Status "OpenCollector offen" fließt kein Strom, und beide LEDs bleiben dunkel. Genau das wollten wir ja auch erreichen. Dumm ist nur, daß man fast immer erst an Spannungen denkt und danach an Ströme. Seltsam ...

24.09.2018
und noch ein: aaaber ...
Wir haben's sehr spät gemerkt: Mit der OpenCollector-Funktion haben wir uns was ganz Schlimmes ins Nest geholt. Da kann man sich schnell selbst überlisten, wenn man nicht aufpaßt!
Durch diese Befehle wird neben dem Port-Pin auch das dazugehörige TRIS-Bit verändert. Wenn man also in einem Programm einmal die obigen Funktionen an einem Port-Pin angewendet hat, muß man auch immer dabei bleiben! Während des Programmlaufes ist der Zustand des zugehörigen TRIS-Bits unbestimmt, je nachdem was man als Letztes angestellt hat. Versuchen Sie daher niemals, das betreffende Port-Bein mit bcf/bsf oder mit move-Befehlen zu bearbeiten. Manchmal funktioniert's, manchmal nicht: je nachdem, ob das TRIS-Bit zufällig auf 1 oder 0 steht. Das gibt wundersame Ergebnisse und tagelanges Suchen. Muß nicht sein ...
Um das zu umgehen, müssen wir zum Schalten des Pin 0 von Port A auf High schreiben:

bankselPORTA; Umschalten auf Bank 0, falls nicht schon geschehen (dort ist PORTA erreichbar)
bsfPORTA,0; Ausgang auf Hi setzen, Umgehen der I/O-Falle
bankselTRISA; Umschalten auf Bank 1 (dort ist TRISA erreichbar)
bcfTRISA,0; Pin auf Ausgang schalten (Tri-state löschen)
bankselPORTA; Umschalten auf Bank 0, muß hier nicht unbedingt sein

Somit können wir einem Pin tatsächlich 3 Zustände zuweisen: High, Open, Low.

Für weitere Fragen stehen gern zur Verfügung:
- der MEC; Besichtigung und Fachsimpelei z.B. an unseren "Club-Abenden"
- der Autor: Hans Peter Kastner

Version vom: 25.09.2018; erstellt am: 23.12.2016
Copyright © 2016 - 2018 by Modelleisenbahnclub Castrop-Rauxel 1987 e.V.

Valid HTML 4.01!