Forum: Mikrocontroller und Digitale Elektronik Open-Collector an Mikrocontroller


von Ted K. (ted1405)


Lesenswert?

Hallo allerseits.

Im Moment beschäftige ich mich damit, einen ATMega mit einem 
PS2-Anschluss für eine Maus zu versehen. Dabei bin ich über die sehr 
hilfreiche Dokumentation unter 
http://www.computer-engineering.org/ps2protocol gestoßen, eine deutsche 
Übersetzung findet sich wiederum unter http://www.marjorie.de/.

In einer Randbemerkung zur Elektrik heißt es dort:

>Hinweis: In meinen Beispielen habe ich ein paar Tricks benutzt, um ein
>Open-Collector-Interface mit PIC-Microcontrollern zu implementieren.
Ich benutze den selben Port als Eingang und Ausgang
>und verwende die internen Pull-Up-Widerstände des PICs anstelle von externen
>Widerständen. Eine Leitung wird auf Low gezogen, indem man den entsprechenden
>Port als Ausgang setzt und logisch 0 ausgibt. Den hochohmigen Zustand erreicht
>man, indem der Port als Eingang geschaltet wird. Mit den eingebauten
>Schutzdioden und dem hohen Stromtreibervermögen der PICs, denke ich,
>kann man das durchaus so machen.

Da leider kein dazu passende Zeichnung vorhanden ist, frage ich mich, 
WIE er die Beschaltung hierzu vorgenommen hat?

Klar wäre es möglich, ganz auf zusätzliche Bauteile zu verzichten und 
nur zwischen "Eingang + Pullup" und "Ausgang + Low" umzuschalten, 
allerdings würde ein versehendliches Schalten von "Ausgang + High" dann 
wahlweise den Mikrocontroller oder die Gegenseite rösten. Wie könnte 
eine Beschaltung aussehen, dass auch bei einer falschen Ansteuerung 
keine Bauteile in Gefahr sind?

Schon mal Danke für eure Antworten,
Gruß,
Torsten.

von Markus W. (Firma: guloshop.de) (m-w)


Lesenswert?

Hallo!

Ich hab zwar nicht ganz verstanden, was du vorhast (hab mich nicht 
reingedacht), aber ein Open-Collector-Ausgang lässt sich bei einem 
TTL-Ausgang leicht dadurch herstellen, dass man an den Ausgang eine 
Diode anschließt (Kathode zum Ausgang, Anode wird der neue Ausgang). An 
den "neuen Ausgang" sollte dann ein Pull-Up-Widerstand nach VCC 
angeschlossen werden.

von Ted K. (ted1405)


Lesenswert?

Hallo Markus,

danke soweit, das ist mir soweit bewusst. Diese Schaltung ist so auch in 
der genannten Dokumentation abgebildet. Ein zweiter Pin übernimmt dann 
die Funktion des Signaleingangs.

Mir geht es allerdings darum, dass der Autor schreibt er würde einen 
einzelnen Pin des Mikrocontrollers gleichzeitig als Ausgang und Eingang 
benutzen. Und da irgendwie immer zu wenig Pins vorhanden sind, käme mir 
die Lösung dafür doch sehr entgegen ... ;-)

von B. L. (b8limer)


Lesenswert?

Torsten K. schrieb:
> In einer Randbemerkung zur Elektrik heißt es dort:
>
>>Hinweis: In meinen Beispielen habe ich ein paar Tricks benutzt, um ein
>>Open-Collector-Interface mit PIC-Microcontrollern zu implementieren.
> Ich benutze den selben Port als Eingang und Ausgang
>>und verwende die internen Pull-Up-Widerstände des PICs anstelle von externen
>>Widerständen. Eine Leitung wird auf Low gezogen, indem man den entsprechenden
>>Port als Ausgang setzt und logisch 0 ausgibt. Den hochohmigen Zustand erreicht
>>man, indem der Port als Eingang geschaltet wird. Mit den eingebauten
>>Schutzdioden und dem hohen Stromtreibervermögen der PICs, denke ich,
>>kann man das durchaus so machen.
>
> Da leider kein dazu passende Zeichnung vorhanden ist, frage ich mich,
> WIE er die Beschaltung hierzu vorgenommen hat?

Dafür braucht es auch keine Schutzschaltung - das ist halt DIY-Style 
wird funktionieren, vielleich auch viele Jahre. Sauber ist es mit 
Sicherheit nicht. Eine Schutzbeschaltung ist nicht realisiert. Zuerst 
meint er wohl den selben Pin und nicht Port als Eingang und Ausgang. 
Die PICs haben interne Pullupwiderstände (-> Datenblatt!!) und natürlich 
ist jeder eingang mit Eingangsschutzdioden ausgestattet (-> 
Datenblatt!!)

Im übrigen heißt es (seit die Transistoren nicht mehr als bipolar 
sondern als MOSFETs auf dem Substrat ausgelegt werden) open drain.

von Ted K. (ted1405)


Lesenswert?

Hallo B.,

B. Limer schrieb:
> Dafür braucht es auch keine Schutzschaltung - das ist halt DIY-Style
> wird funktionieren, vielleich auch viele Jahre. Sauber ist es mit
> Sicherheit nicht.

Ok. Das heißt, Du gehst davon aus, daß er keinerlei Beschaltung 
realisiert hat, sondern tatsächlich kurzerhand den open drain direkt an 
den Mikrocontroller legt?
Das wäre dann das, was ich zu vermeiden versuche, da es auch mir 
unsauber vorkommt, selbst wenn es funktionieren mag.

> Zuerst meint er wohl den selben Pin und nicht Port als Eingang und Ausgang.

Richtig. War ein Orginalzitat der Übersetzung und dort steht irrtümlich 
"Port". Hatte ich gar nicht bemerkt, sondern unbewusst direkt an "Pin" 
gedacht.

> Die PICs haben interne Pullupwiderstände (-> Datenblatt!!) und natürlich
> ist jeder eingang mit Eingangsschutzdioden ausgestattet (->
> Datenblatt!!)

Das weiß ich. Wie oben geschrieben: es wäre zwar als Direktanschluss 
möglich, aber ich würde mich dabei unwohl fühlen, da unsauber.

> Im übrigen heißt es (seit die Transistoren nicht mehr als bipolar
> sondern als MOSFETs auf dem Substrat ausgelegt werden) open drain.

lächel
Sorry - auch hier habe ich kurzerhand die Begriffe aus der Doku 
verwendet ohne zu wissen, dass es hier einen zeitgemäßeren Begriff gibt. 
;-)


Aber zurück zur Kernfrage ...
Wie könnte dann eine saubere Schaltung aussehen, mit welcher eine open 
drain-Verbindung mit nur einem einzigen Pin am Mikrocontroller für einen 
Aus- und Eingang gleichzeitig realisiert werden kann?

von Bussard (Gast)


Lesenswert?

Dazu brauchts keine große Beschaltung:

als Ausgang: der Pin wird als Ausgang programmiert, je nachdem, was du 
ausgibst, wird halt low- oder high-Pegel ausgegeben

als Eingang: der gleiche Pin als Eingang programmiert, dazu den internen 
Widerstand aktiviert ("schaltet" eine  etwa 10kOhm-Widerstand vom 
Eingang nach Plus) ergibt einen Eingang, der ohne weitere Beschaltung 
vom Widerstand auf high-Pegel gezogen wird, von außen kannst du einen 
npn-Transistor mit dem Kollektor am Eingang, Emitter an Masse und die 
Basis über einen Vorwiderstand (~1kOhm) anschließen (OC-Ansteuerung). 
Die Ansteuerung über den Transistor invertiert, high-Pegel an der Basis 
ergibt low am Kollektor.

Bei der wechselseitigen Nutzung eines Pins als Ein- oder Ausgang mußt du 
nur darauf achten, daß der Transistor gesperrt ist (low an Basis), wenn 
der Pin Ausgang sein soll (weil ja sonst der Transistor den Pin fest auf 
low schaltet.

von Klaus (Gast)


Lesenswert?

Einfacher:

Der Pullup am Pin wird aktiviert. Hat erst mal nichts mit Input oder 
Output zu tun.

Wenn man ein Low ausgeben will, wird der Pin auf 0 und auf Ausgang 
gesetzt. Will man ein High ausgeben, wird der Pin auf Input gesetzt und 
der Pullup erzeugt das High. Will man lesen, Pin auf Input und lesen.

Daran ist nichts unsauber, unmoralisch oder unethisch. Alle Ports an 
einem 8051 und an vielen IO-Bausteinen funktionieren so.

MfG Klaus

von gaast (Gast)


Lesenswert?

Torsten K. schrieb:
> Ok. Das heißt, Du gehst davon aus, daß er keinerlei Beschaltung
> realisiert hat, sondern tatsächlich kurzerhand den open drain direkt an
> den Mikrocontroller legt?
> Das wäre dann das, was ich zu vermeiden versuche, da es auch mir
> unsauber vorkommt, selbst wenn es funktionieren mag.

Weil? Sollte kein Problem sein, an der exakt einen Stelle, an der im 
Programm der Pinzustand geändert wird, keinen Mist zu bauen, und 
Portpins haben eher selten die Angewohnheit, ihren Zustand wild zu 
ändern. Ansonsten wurde die Diodenschaltung oder der externe Transistor 
für besonders panische Menschen bereits genannt.

von Ted K. (ted1405)


Lesenswert?

Danke Dir, Klaus.

Damit bin ich dann wieder beim "direkt an den MC anschließen", was dann 
aber bei einer falschen Ansteuerung ggf. ein Abrauchen zur Folge haben 
kann.

Mir ging es darum, eine Beschaltung zu finden, mit welcher sich diese 
Gefahr nicht ergibt. Sprich, dass es kein Bauteil zerstört, falls der 
Pin einmal irrtümlich auf Ausgang und High geschaltet werden sollte.

Aber zumindest beruhigt es mich dann doch, wenn genau das häufiger so 
realisiert wird. Dann heißt's halt beim Programmieren höllisch 
aufpassen.

Danke nochmal an alle, die geantwortet haben!
:-)


P.S. ... @gaast:
> [...]Portpins haben eher selten die Angewohnheit,
> ihren Zustand wild zu ändern.

... da kennst Du meinen Programmierstil aber schlecht. ;)
Nein - Scherz beiseite: z.B. aus einer Unachtsamkeit heraus mal ein 
falsches Programm auf den Controller zu werfen kann jedem passieren und 
ich fänd' es schade, dann zum Lötkolben greifen zu müssen.

> Ansonsten wurde die Diodenschaltung oder der externe Transistor
> für besonders panische Menschen bereits genannt.

Jepp!
:-)

von Gert (Gast)


Lesenswert?

Lies dir einmal unter http://et-tutorials.de/mikrocontroller unter Teil2 
die Folge 4 durch.

von Klaus (Gast)


Lesenswert?

Torsten K. schrieb:
> falsches Programm auf den Controller zu werfen kann jedem passieren und
> ich fänd' es schade, dann zum Lötkolben greifen zu müssen.

Wie oft ist dir das schon passiert? Ist es dir schon mal wirklich 
gelungen einen Portpin durch einen anderen Portpin kaput zu kriegen? 
Oder waren es nicht immer echte Treiber oder Versorgungspins?

MfG Klaus

von Ted K. (ted1405)


Lesenswert?

Gert schrieb:
> Lies dir einmal unter http://et-tutorials.de/mikrocontroller unter Teil2
> die Folge 4 durch.

Gert ...
ich bin weder Anfänger noch blöd - 30 Jahre Programmiererfahrung, davon 
gut 10 Jahre beruflich sowie 10 Jahre Programmiererfahrung in Assembler 
auf unterschiedlichen Prozessoren sprechen für sich. Hinzu kommen 3 
funktionierende Atmel-Lösungen - sowohl in Assembler als auch C - welche 
unter anderem eine Motorsteuerung, LCD-Ansteuerung, 
DMS-Signalauswertung, Ansteuerung einer Matrixtastatur, LAN-Anbindung, 
Strommessung und anderen Spielereien enthalten.

Zudem habe ich bereits in meinem ersten Beitrag durchblicken lassen, 
dass mir DIESE Vorgehensweise bekannt und verständlich ist (siehe -> 
"Klar wäre es möglich, ganz auf zusätzliche Bauteile zu verzichten und 
nur zwischen "Eingang + Pullup" und "Ausgang + Low" umzuschalten"). 
Gesucht hätte ich eine gute/sichere Lösung, einen einzelnen Pin als Ein- 
und Ausgang zu verwenden, ohne dabei bei einem Programmierfehler o.Ä. 
Bauteile zu riskieren. Im Prinzip habe ich sie hier in den Antworten 
auch gefunden.

Falls Dein Beitrag als Reaktion/Scherz auf mein "... da kennst Du meinen 
Programmierstil aber schlecht. ;)" gemeint gewesen sein sollte, hätte 
ich mich über einen Smiley Deinerseits gefreut - das hätte mir eine 
Minute sinnlose Sucherei nach neuen Informationen unter dem von Dir 
genannten Link erspaart.

Danke dennoch.
Grüßle,
Torsten.

von Ted K. (ted1405)


Lesenswert?

Klaus schrieb:
> Torsten K. schrieb:
>> falsches Programm auf den Controller zu werfen kann jedem passieren und
>> ich fänd' es schade, dann zum Lötkolben greifen zu müssen.
>
> Wie oft ist dir das schon passiert? Ist es dir schon mal *wirklich*
> gelungen einen Portpin durch einen anderen Portpin kaput zu kriegen?
> Oder waren es nicht immer echte Treiber oder Versorgungspins?

:-)

Noch gar nicht. Allerdings hatte ich jüngst versehentlich ein falsches 
Programm auf eine Schaltung übertragen, was mich kurzzeitig etwas ins 
Schwitzen brachte. Es blieb zum Glück ohne Folgen.

Sehr gut möglich, dass ich da etwas paranoid bin. ;)

Aber ich vertrau einfach mal drauf, keinen solchen Fehler zu machen und 
hänge die PS2-Leitungen dann mal direkt an den ATmega. Wird schon gut 
gehen. :)

von Andreas B. (andreas_b77)


Lesenswert?

So ein PS/2 Projekt habe ich auch gerade vor mir liegen. Nur bei den 
Pull-Ups habe ich externe 10k genommen, denn der interne der ATmegas ist 
um einiges hochohmiger. Die 10k ergeben auf jeden Fall ein schönes 
Signal.

Die Beschreibung der Maus- und Tastaturprotokolle auf 
computer-engineering.org mit all den Kommandos ist sehr gut, bei der 
Beschreibung der grundsätzlichen Signalisierung sind aber ein paar 
dubiose Aussagen drin:

> Data sent from the device to the host is read on the falling edge of the
> clock signal; data sent from the host to the device is read on the rising
> edge.

Das ist der einzige Ort im Netz, wo ich eine derartige Aussage finden 
konnte. Und warum sollte das auch so sein, das ergibt keinen Sinn. Ich 
hab mein Programm jedenfalls so aufgebaut, dass neue Daten nach der 
steigenden Flanke auf Clock angelegt werden und bei Clock = low stabil 
sind.

> If you're designing a keyboard, mouse, or host emulator, you should
> modify/sample the Data line in the middle of each cell.  I.e.  15 - 25
> microseconds after the appropriate clock transition.

Das ergibt nun auch gar keinen Sinn. Wenn das Protokoll so definiert 
ist, dass an der fallenden Flanke abgetastet wird, dann macht man das 
auch. Da die Daten bei Clock = low stabil bleiben, hat man da noch etwas 
Reserve wenn etwa der Controller noch etwas in einem anderen Interrupt 
erledigt. Aber dann absichtlich noch eine Pause nach der Flanke 
einlegen? Da verbrennt man doch nur die eigene Zeit-Reserve ohne Grund 
und Zweck.

von Gert (Gast)


Lesenswert?

Sorry, Torsten, ich hatte Deinen Wissenstand falsch eingeschätzt.
Der Link auf das Einsteiger-Tutorium sollte eine Hilfe, keine 
Beleidigung sein.

von Ted K. (ted1405)


Lesenswert?

@Gert
Okay, kann passieren. Ich hatte es auch nicht als Beleidigung 
aufgefasst, sondern mich über die Einschätzung geärgert - so schlimm 
habe ich mich doch hoffentlich nicht ausgedrückt als dass ich so 
missverständlich gewesen sein kann?

Na jedenfalls danke ich Dir für Deinen Nachtrag. Es gibt im Netz leider 
wirklich nicht viele die auch mal eine Entschuldigung schreiben wenn 
etwas daneben ging. Schön, dass es doch noch Ausnahmen gibt!
:-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.