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.
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.
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 ... ;-)
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.
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?
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.
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
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.
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! :-)
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
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.
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. :)
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.
Sorry, Torsten, ich hatte Deinen Wissenstand falsch eingeschätzt. Der Link auf das Einsteiger-Tutorium sollte eine Hilfe, keine Beleidigung sein.
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.