Tips für PICs 13: Open Collector
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:
banksel | PORTA | ; Umschalten auf Bank 0, falls nicht schon geschehen (dort ist PORTA erreichbar) | |
bcf | PORTA,0 | ; Ausgang auf Lo setzen, Umgehen der I/O-Falle | |
banksel | TRISA | ; Umschalten auf Bank 1 (dort ist TRISA erreichbar) | |
bcf | TRISA,0 | ; Pin auf Ausgang schalten (Tri-state löschen) | |
banksel | PORTA | ; Umschalten auf Bank 0, muß hier nicht unbedingt sein |
Schalten des Pin 0 von Port A auf Tri-state:
banksel | TRISA | ; Umschalten auf Bank 1 (dort ist TRISA erreichbar) | |
bsf | TRISA,0 | ; Pin auf Eingang schalten (Tri-state setzen) | |
banksel | PORTA | ; 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 ...
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 ...
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:
banksel | PORTA | ; Umschalten auf Bank 0, falls nicht schon geschehen (dort ist PORTA erreichbar) | |
bsf | PORTA,0 | ; Ausgang auf Hi setzen, Umgehen der I/O-Falle | |
banksel | TRISA | ; Umschalten auf Bank 1 (dort ist TRISA erreichbar) | |
bcf | TRISA,0 | ; Pin auf Ausgang schalten (Tri-state löschen) | |
banksel | PORTA | ; 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.