PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Verhalten unkonfigurierter GPIO-Pins



Donevan
16.02.2017, 23:47
Hallo zusammen,

was genau passiert mit noch nicht per Software als Ein- oder Ausgang konfigurierten Pins? Nehmen wir an, dass ich einen beliebigen GPIO "ignoriere" und ihn weder als In- oder Output festlege, welchen Zustand nimmt er dann an? Ist er hochohmig? Ist er über einen Widerstand (Pull-Up oder Pull-Down) mit der Spannungsversorgung verbunden oder geht er direkt gegen Plus/Minus?

Manchen mag die Frage doof erscheinen, aber ich frage deshalb nach, weil ich vorhin meinen Arduino abgeschossen und den Pi dazu gebracht habe, sich allmählich in die Tischplatte zu brennen bzw. selbst einzuschmelzen, als ich die beiden über einen Pegelwandler (5V zu 3,3V; bidirektional) an SDA und SCL verbunden habe. Nun suche ich nach der Ursache. Außerdem war der 3v3-Pin des Arduino mit einem GPIO am Pi verbunden. Hab alles angeschlossen, dann einen Testsketch auf den Arduino hochgeladen, bis der irgendwann offline war. Wollte als nächstes die Software auf den Pi laden und ausprobieren, doch der war zu dem Zeitpunkt schon längst dahin.. Alle GPIOs waren auf einmal HIGH und die CPU defekt (Kurzschlussstrom am Spannungsregler - ca. 6 Ampere, mehr lässt das Ding nicht durch). Alle Spannungen haben gepasst, am Pegelwandler und am Micro-USB des Pis. Daran kann es also nicht gelegen haben, weshalb ich schwer die GPIOs im Verdacht habe. Der Arduino jedenfalls war ab dem Reset nach dem Upload hinüber, der Pi köchelte da schon lange.

Im Prinzip möchte ich gerne wissen, was passiert wenn ich 3,3V auf einen GPIO schalte, der noch nicht per Software als Eingang festgelegt wurde. Außerdem wüsste ich gerne, ob ich einen Vorwiderstand am GPIO verwenden muss (in Reihe geschaltet, nicht gegen Plus oder Minus, Google führt einen nämlich nur zu Pull-Ups /-Downs). Bei einem konfigurierten Pin hatte es bisher auch ohne funktioniert, damals über einen Optokoppler mit 3,3V. Mich würde auch wundern wenn ein Kurzschluss entstünde weil der Controller gerade an einem Pin lauscht.

Für eine kurze Auskunft wäre ich euch super dankbar :) Solche Details finde ich nämlich nicht im Internet. Vielleicht benutze ich auch nur die falschen Schlagwörter.

Liebe Grüße,
Don

i_make_it
17.02.2017, 06:44
Moin,

Bei Eleketronik ist Wärme die Folge vom elektrischer Leistung.
Die Leistung ist Volt mal Ampere.

Da die GPIOs au 3,3V liegen ist da wohl ein zu großer Strom geflossen.

Wenn man sich mal die Spezifikationen der GPIOs ansieht, dann weis man mit wieviel mA die belastet werden dürfen und vieviel sie einzen und in Summe liefern können ohne kaputt zu gehen.
Hast Du nur SDA und 3,3V verbunden, oder auch GND?
das wäre dann ja das gemeinsame Bezugspotential, auf das sich 5V und 3,3V beziehen.
Am besten mal Fotos und eine Skizze/Schaltplan Deines Aufbaus posten. Dann kann man vermutlich eher sagen ob und wo da Fehler im Aufbau stecken.

Hab jetzt keine Raspi Doku zur Hand, aber bei den meisten Kontrollern wird nach dem Einschalten/Reset erst mal alles als Eingang beschaltet. Damit wird sichergestellt, das nicht unkontrolliert Schaltzustände nach außen gehen und in angeschlossenen Schaltungen Schäden verursachen.

Ich persönlich würde allerdings keine Versorgungsspannung direkt an einen GPIO Pin hängen. Da dort im Fehlerfall ein Schaden durch den großen Strom der geliefert werden kann, vorprogrammiert ist.

Peter(TOO)
17.02.2017, 07:05
Hallo Don,

Die Frage ist nicht einfach zu beantworten!

Grundsätzlich schaltet die CPU nach einem Reset alle GPIOs auf Eingang. Dies damit keine Kurzschlüsse mit externen Ausgängen entstehen können, die CPU hat ja keine Ahnung was an Peripherie angeschlossen ist.
Im Allgemeinen sind dabei die eingebauten Pull-Ups aktiv, sodass ein definierter Pegel an einem unbeschalteten Pin ansteht.

So, du hast nun aber einen Arduino.
Dieser hat ein Betriebssystem und dieses kann dann mit den Pins anstellen, was es will!
Da musst du in der Dokumentation nachschlagen, welcher Pin wie eingestellt wird, bevor dein Programm läuft. Das Problem beim Arduino ist, dass nicht alle Pins frei verfügbar sind, sondern auf dem Board verwendet werden.

Grundsätzlich ist es immer eine gute Idee Serien-Widerstände zu verwenden um den maximalen Strom zu begrenzen.
besonders wenn du einen Pi mit einem Arduino koppelst, kannst du nicht immer garantieren, dass beide gleichzeitig stromlos sind. Ist nur einer eingeschaltet kann ein Ausgang über die Eingangsschutzschaltung des anderen die "Stromversorgung zu übernehmen". Das mag aber die Schutzschaltung nicht wirklich, wenn der Strom so über 10-20mA (genauer Werte stehen im Datenblatt) steigt.

Ein anderes Problem ist dann die Möglichkeit, dass ein Latch-Up ausgelöst wird, wenn der Eingangspegel höher als die Versorgungsspannung ist. Den fall hat man, wenn man 3.3V Logik mit 5V-pegeln ansteuert.

Die Eingangsschaltung erzeugt einen parasitären Thyristor, welcher dann die Versorgungs-Spannung kurz schliesst. Da kommen die 6A schon hin!
https://de.wikipedia.org/wiki/Latch-Up-Effekt

MfG Peter(TOO)

Donevan
17.02.2017, 16:19
Hallo,

danke für eure Antworten! :)

Ich habe von damals als ich im Handbuch für den Pi gelesen habe noch 16mA Maximalstrom pro GPIO und 50mA für alle GPIOs im Kopf. Ich hätte ja noch eingesehen, wenn die beim Einschalten des Arduino überschritten worden wären, weil ich dem Transistor für den Arduino keinen MOSFET-Treiber oder Vorwiderstand vorgeschaltet habe. Wenn aber alle GPIOs beim Start als Eingang festgelegt werden, hätte der gar nicht aktiviert gewesen sein können. Der ursprüngliche Plan war nämlich, dass der Pi den Arduino später zuschaltet, wenn er bereit ist und dann prüft, ob der Arduino online ist. Da war mir die einfachste Möglichkeit, den Arduino-3v3-Pin zu nehmen. Ob das diesen "Latch-Up" ausgelöst hat? Eine Alternative wüsste ich zu der Methode jedenfalls nicht. Optokoppler möchte ich nicht nehmen wegen des Stromverbrauchs, mir fällt dann nur noch ein kleiner Transistor ein. Der Kleinste den ich zumindest bei Reichelt finden konnte ist der 2N7000, doch selbst der schafft noch mehr Leistung (200mA wenn ich die richtige Zahl noch im Kopf habe) als der Arduino.

Das mit den Serienwiderständen werde ich jedenfalls beherzigen, kann nicht alle paar Wochen alles abschießen das irgendwie mit angeschlossen ist, da ginge der ganze Spaß verloren ... Gibt es dafür einen Widerstandswert, der zu empfehlen ist? Oder geht man vom Höchsten aus das möglich ist, damit am Ende gerade noch so viel Spannung übrig bleibt, dass ein logisches HIGH sicher erkannt wird (z.B. 1,0V anstelle 3,3V am GPIO-Eingang, der Rest fällt am Widerstand ab)? Dann würde ich mich nochmal durch die Datenblätter graben, wäre ja ein verlässlicher Ansatz. Allein das von der CPU des Arduino ist über 300 Seiten lang ^^

Den Schaltplan hänge ich mal wie gewünscht hier an, hab nochmal alle relevanten Bauteile zusammengeschnippelt und alles rausgekürzt, das momentan noch ein Entwurf und nicht verbaut ist. Gestern Nacht fehlte mir dafür doch noch die Zeit am Ende ... Weil es recht chaotisch ist, kurz erklärt: Ein Schalter aktiviert einen MOSFET. Dieser schenkt dem Pi seine Masse, aber auch den Spannungsreglern (5V und 3,3V). Am GPIO4 des Pis hängt ein weiterer MOSFET, der den Arduino aktivieren soll. Kein Vorwiderstand zur Zeit, aber ein Pull-Down von 1MOhm gegen Masse. Ist besagter Transistor aktiv, bekommt auch der Arduino seinen Minuspol und startet (+13,8V direkt vom Akku bzw. Netzteil). GPIO3 geht über den Pegelwandler an SCL und GPIO2 an SDA. GPIO14 ist mit dem 3,3V-Pin des Arduino verbunden.
Aber bitte nicht erschrecken - viele Schaltzeichen sind nicht normgerecht, sondern Marke Eigenbau (z.B. für den Pegelwandler und die Transistoren).

32422

Wenn hier kein kapitaler Fehler vorliegt, möchte ich wenigstens nicht ausschließen, dass der GPIO-Controller von früheren Feldversuchen und andauerndem Rumprobieren einen Knacks weg hatte und diese Vorschädigung eine Kettenreaktion ausgelöst mit besagtem Latch-Up als Endergebnis, als vom Arduino 3,3V angelegt wurden..

Grüße,
Don


_________
Edit: Ich weiß nicht, wieso das Bild auf einmal so klein ist... sollte eigentlich doppelt so groß sein und nicht nur 800px

HaWe
17.02.2017, 17:41
hallo,
ich bin mir nicht sicher, ob die allgemeinen gesammelten Vermutungen oben so unbedingt stimmen. Ich kann mir zumindest vorstellen (genaueres und verlässlicheres ist mir leider nicht erinnerlich) , dass beim Pi beim Booten zunächst default-mäßig zum Schutz der GPIOs alles auf input-pullup oder input-pulldown eingestellt wird.

edit, update:
es stimmt tatsächlich, ein paar sind input-pullup, die Mehrzal input-pulldown:


All the GPIO are set as inputs at power-up and all the accessible GPIO have fixed pulls set (some high, most low) at the same time.
(von joan stammt die pigpio-API).

d.h., gegen 3.3V sind sie dadurch kurzschlussfest; niemals aber sind deutlich höhere externe Spannungen an den Pins erlaubt, selbst 5V sind schon schädlich.

Peter(TOO)
17.02.2017, 18:03
Hallo Don,

Weil es recht chaotisch ist, kurz erklärt: Ein Schalter aktiviert einen MOSFET. Dieser schenkt dem Pi seine Masse, aber auch den Spannungsreglern (5V und 3,3V).
Eine sehr gute Methode einen Rauchgenerator zu bauen! :(

Wenn ich das richtig gelesen habe, hast du etwas um die 13V auf den Eingängen des Pi! Der Pi mach das ganz und gar nicht!

Zwischen +13V und GND hast du eine Menge Diodenstrecken, Widerstände usw.

Schliesse beim Arduino nur mal die 13V an und miss dann zwischen den Pins am Arduino und GND die Spannung.

Du musst die positive Spannung schalten und GND fest verbinden!

MfG Peter(TOO)

Donevan
21.02.2017, 19:25
Hallo!


Du musst die positive Spannung schalten und GND fest verbinden!

Das war ursprünglich so. Da wusste ich aber nicht, dass ich mit einem N-FET aber "nur" Masse schalten kann, ging also nur mit Drain/Source vertauscht und ca. 2,5V sind am Transistor verschwunden. Das hat so zwar auch funktioniert, aber war offenbar falsch, so wie ich das verstanden habe. Hatte das dann kurzerhand umgelötet, weil ich hier zig N-FETs rumliegen habe und keinen einzigen P-FET und nicht schon wieder Wochen warten wollte bis ich mir welche bestellen kann.

In der Theorie zumindest hätte es (eigentlich) funktionieren können. Der Pi hat kein Minus, zu dem der Strom (technisch) fließen kann. Der 5V-Regler bekommt auch erst dann die Masse, weshalb Plus vorher auch nicht vorhanden ist.

Den (defekten) Arduino hab ich mal gemessen. Die Spannungen sind 5,03V bzw. 3,35V bei 13,84V Eingang. Die analogen bzw. PWM- und digitalen Pins sind alle bei 0V, die TX/RX schwanken zwischen 3,7V und 2,5V und SDA/SCL sind konstant 5V.

Grüße,
Don

Peter(TOO)
22.02.2017, 02:28
Hallo Don,

In der Theorie zumindest hätte es (eigentlich) funktionieren können. Der Pi hat kein Minus, zu dem der Strom (technisch) fließen kann. Der 5V-Regler bekommt auch erst dann die Masse, weshalb Plus vorher auch nicht vorhanden ist.

Den (defekten) Arduino hab ich mal gemessen. Die Spannungen sind 5,03V bzw. 3,35V bei 13,84V Eingang. Die analogen bzw. PWM- und digitalen Pins sind alle bei 0V, die TX/RX schwanken zwischen 3,7V und 2,5V und SDA/SCL sind konstant 5V.

Einfach mal am Arduino NUR die 13V anschliessen! Also einen EINZELNEN Draht.

Dann misst du mit dem DVM die Spannung zwischen z.B. einem GPIO-Pin und GND des Netzteils.

Deine Theorie zum 5V-Regler ist falsch! Da fliessen zumindest Leckströme.