Forum: Mikrocontroller und Digitale Elektronik Warum gehen einige Port-Pins, die ich nicht eingeschaltet habe, hoch?


You were forwarded to this site from EmbDev.net. Back to EmbDev.net
von Max M. (koeltrad)


Lesenswert?

STM32F407
Ich habe nur Pin 12 von Port D für die Ausgabe aktiviert.
Aber gleichzeitig werden andere Pins eingeschaltet, immer auf 
unterschiedliche Weise.
Manchmal schalten sich zwei Pins ein, manchmal schaltet sich ein anderer 
Pin ein.
Ich habe diese Pins nicht eingeschaltet, aber sie geben einen hohen 
Signalpegel.
Vielleicht sollten unbenutzte Pins abgeschaltet werden, ist das eine Art 
Nebeneffekt?

von Flip B. (frickelfreak)


Lesenswert?

zeile 42

von Sebastian R. (sebastian_r569)


Lesenswert?

Kommt drauf an.

Auf deine Hardware, auf deine Firmware, vielleicht auch auf's Wetter.

von Max M. (koeltrad)


Lesenswert?

Mein Code
int main(void)
{
  RCC->AHB1ENR|=RCC_AHB1ENR_GPIODEN;
  GPIOD->MODER|= 1<<24;
HAL_SYSTICK_Config(SystemCoreClock);
 while (1)
 {
   GPIOD->ODR|=1<<12;
   HAL_Delay(1);
   GPIOD->ODR&=~(1<<12);
   HAL_Delay(1);
 }
}
Pin 5 von Port D gibt immer 3 Volt aus. Geprüft mit einem Multimeter
Dies ist im GPIOD_IDR-Register ersichtlich
Pin 5 im GPIOD_IDR-Register ist immer eingeschaltet.

von Sebastian (Gast)


Lesenswert?

Max M. schrieb:
> Mein Code
> int main(void)
> {
> RCC->AHB1ENR|=RCC_AHB1ENR_GPIODEN;
> GPIOD->MODER|= 1<<24;
> HAL_SYSTICK_Config(SystemCoreClock);
> while (1)
> {
> GPIOD->ODR|=1<<12;
> HAL_Delay(1);
> GPIOD->ODR&=~(1<<12);
> HAL_Delay(1);
> }
> }
> Pin 5 von Port D gibt immer 3 Volt aus. Geprüft mit einem Multimeter
> Dies ist im GPIOD_IDR-Register ersichtlich
> Pin 5 im GPIOD_IDR-Register ist immer eingeschaltet.

Statische Elektrizität? Was passiert wenn du den Port über 10k mit GND 
verbindest?

LG, Sebastian

von Max M. (koeltrad)


Lesenswert?

Sebastian schrieb:
> Was passiert wenn du den Port über 10k mit GND
> verbindest?
LD8 beginnt zu leuchten
USB LD8: red LED indicates an over-current from VBUS of CN5 and is 
connected to the
I/O PD5 of the STM32F407VGT6.
Aber im GPIOD_IDR-Register werden nur die Pins aktiviert, die ich 
aktiviert habe. Das heißt, der Fehler verschwindet.
---------------
Davor war Pin 5 im GPIOD_IDR-Register aktiviert, an Pin 5 von Port D 
waren 3 Volt, im GPIOD_ODR-Register war alles korrekt.
---------------
Ja, wenn ich Pin 5 mit Masse verbinde, dann hat das GPIOD_IDR-Register 
von Pin 5 einen Wert von Null.
Aber warum erscheinen an Pin 5 des GPIOD 3 Volt?

: Bearbeitet durch User
von Max M. (koeltrad)


Lesenswert?

IDR:  1 0000 0010 0000
ODR:  1 0000 0000 0000

von Irgend W. (Firma: egal) (irgendwer)


Lesenswert?

Max M. schrieb:
> Aber warum erscheinen an Pin 5 des GPIOD 3 Volt?
Weil dein Messgerät viel zu Hochohmig ist um hier was vernünftiges zu 
messen.
Dazu noch einen offenen/hochohmigen Eingangspin der überhaupt nicht auf 
einem definierten Pegel liegt und die Fehlmessung ist perfekt.

Passenden pull-down dran und schon ist Ruhe und du kannst Messen oder 
auch den Pin in der Software abfragen und bekommst einen stabilen 
zustand. Offenen/unbeschaltete Input-Pins sind immer ein guter 
Ausgangspunkt für lustige Effekte:-)

von (prx) A. K. (prx)


Lesenswert?

Max M. schrieb:
> Mein Code

NB: Portpins sollte man über das BSRR ansteuern, nicht das ODR.

von Manfred (Gast)


Lesenswert?

Max M. schrieb:
> Ich habe nur Pin 12 von Port D für die Ausgabe aktiviert.
> Aber gleichzeitig werden andere Pins eingeschaltet, immer auf
> unterschiedliche Weise.
> Manchmal schalten sich zwei Pins ein, manchmal schaltet sich ein anderer
> Pin ein.

Der µC kann nicht wissen, dass Du keine Ahnung hast.

Generell, immer, ohne Ausnahme, gehören am Anfang des Programmes alle 
Ports in einen definierten Zustand gesetzt.

von Max M. (koeltrad)


Lesenswert?

(prx) A. K. schrieb:
> NB: Portpins sollte man über das BSRR ansteuern, nicht das ODR.
Dies sind nahezu identische Register.
ODR - Output Data Register;
BSRR - Bit Set Reset Register--hier kann das Bit verändert werden, ohne 
dass man vorher lesen muss.

von Max M. (koeltrad)


Lesenswert?

Sebastian schrieb:
> Was passiert wenn du den Port über 10k mit GND
> verbindest?
Irgend W. schrieb:
>Weil dein Messgerät viel zu Hochohmig ist um hier was vernünftiges zu
>messen.
Wenn es statische Elektrizität wäre, glaube ich nicht, dass LD8 zu 
leuchten beginnen würde, wenn ich Pin 5 über einen 10-kΩ-Widerstand mit 
Masse verbinde. LD8: red LED indicates an over-current from VBUS

: Bearbeitet durch User
von (prx) A. K. (prx)


Lesenswert?

Max M. schrieb:
> BSRR - Bit Set Reset Register--hier kann das Bit verändert werden, ohne
> dass man vorher lesen muss.

Vor allem aber ist diese Aktion atomar.

von (prx) A. K. (prx)


Lesenswert?

Manfred schrieb:
> Generell, immer, ohne Ausnahme, gehören am Anfang des Programmes alle
> Ports in einen definierten Zustand gesetzt.

Den haben sie ab Reset doch schon.

von Max M. (koeltrad)


Lesenswert?

Manfred schrieb:
> Generell, immer, ohne Ausnahme, gehören am Anfang des Programmes alle
> Ports in einen definierten Zustand gesetzt.
Setze ich so nicht alle Pins von Port D auf Null?
GPIOD->MODER&=0UL;
GPIOD->IDR&=0UL;
Danach bleibt Pin 5 immer noch eingeschaltet, Pin 5 von Port D bleibt 3 
Volt.
IDR:  0000 0000 0010 0000

: Bearbeitet durch User
von Irgend W. (Firma: egal) (irgendwer)


Lesenswert?

Max M. schrieb:
> Danach bleibt Pin 5 immer noch eingeschaltet
Da ist garnichts "Eingeschaltet", du stellst alles auf "Input" und IDR 
zeigt dir beliebigen Scheißdreck an den dein Radioempfänger gerade 
einfängt. Schalt wenigstens mal die internen pull-downs ein 
(GPIOx_PUPDR) wenn du überall Null haben willst und die Pins extern 
nicht vernünftig beschaltet sind.

So ein Blick in das Handbuch Kap. "7.3 GPIO functional description" wäre 
sicher nicht verkehrt...

von Max M. (koeltrad)


Lesenswert?

Irgend W. schrieb:
> du stellst alles auf "Input" und IDR
> zeigt dir beliebigen Scheißdreck an den dein Radioempfänger gerade
> einfängt.
Ich versuche diesen Effekt loszuwerden.

GPIOD->PUPDR|=0x800UL; Ich habe es ganz am Anfang versucht.
Dies ist der Pull-Down für Pin 5.
In dem Fall beträgt die Spannung an Pin 5 nicht 3 Volt, sondern 1,5 
Volt.

Vollständiger Code:
RCC->AHB1ENR|=RCC_AHB1ENR_GPIODEN;
GPIOD->MODER&=0UL;
GPIOD->IDR&=0UL;
GPIOD->PUPDR|=0x800UL;
----------------------------
IDR Register: 0000 0000 0010 0000
An Pin 5 == 1,5 Volt
Und beginnt ein wenig LD8 zu leuchten
LD8: red LED indicates an over-current from VBUS
Ist das normal?

Der Wert des Pull-Down-Widerstands beträgt etwa 10 kOhm.
Oder sind 1,5 Volt beim Pull Down normal?

Wenn dies der Fall ist, fängt Pin 5 von Port D die Störung auf und 
schaltet sich ein, und 1,5 Volt sind genug Spannung, um sie nicht als 
logische 1 wahrzunehmen.
Ich mochte den Wert des IDR-Registers nicht, der nicht der Realität 
entsprach.

: Bearbeitet durch User
von Max M. (koeltrad)


Lesenswert?

Wenn Pin 5 per Software auf 0 gesetzt ist, Pin 5 aber aufgrund einer 
Störung auf 1 gesetzt ist, wie kann ich dann Pin 5 als Eingang 
verwenden, wenn er nicht abgeschaltet werden kann? Pin 5 mit dem 
PUPDR-Register ein- und auszuschalten?

: Bearbeitet durch User
von Max M. (koeltrad)


Lesenswert?

Max M. schrieb:
> und 1,5 Volt sind genug Spannung, um sie nicht als
> logische 1 wahrzunehmen.
Hier lag ich falsch.
1,5 Volt reichen aus, um Pin 5 in eine logische 1 umzuwandeln.
Das IDR-Register sieht doch so aus:
IDR Register: 0000 0000 0010 0000

: Bearbeitet durch User
von PittyJ (Gast)


Lesenswert?

Wo ist der Vorteil wenn man zum löschen
GPIOD->MODER &= 0UL;
nimmt und nicht
GPIOD->MODER = 0UL;

Ich hätte die letztere reine Zweisung genommen. Aber vielleicht habe ich 
ja einen Trick übersehen?

von Max M. (koeltrad)


Lesenswert?

PittyJ schrieb:
> Aber vielleicht habe ich
> ja einen Trick übersehen?
))In diesem Fall ist es GPIOD->MODER &= 0UL; und das ist GPIOD->MODER = 
0UL; gleich.
Es gab hier GPIOD->MODER &= 0UL;  einen anderen Ausdruck: etwa so 
GPIOD->MODER &= ~(1<<12);
 Ich habe vergessen & zu löschen
So a==0;
int a = 0b11111111111;
a&=0;
Und so auch a==0;
int a = 0b11111111111;
a=0;

: Bearbeitet durch User
von Fpgakuechle K. (Gast)


Lesenswert?

Das ist eher ein Hard, denn ein Softwarethema. Also nur mit source, ohne 
Schaltplanschnipsel ist die Betrachtung nicht vollständig.

Klassischerweise spricht man hier nicht vom Einschalten, sondern vom 
Tristate (Hochohmig). Der verhält sich wie die ein in der Luft hängendes 
Kabel vom Multimeter, da kann auch je nach Potential eine Spannung 
angezeigt werden. um solches Fehlermessungen auszuschliessen könnte 
dieses Pin mit 100k gegen Masse geschaltete werden.

bei tristate stellt sih auch die Frage nach internen/externenen PullUps 
resp. downs.

Erst wenn das geklärt ist, kann man über per LatchUp, ESD o.ä. 
kaputtgeschossenen Pins spekkulieren.

Beitrag "Tri-State-Eingang abfragen"
https://www-user.tu-chemnitz.de/~heha/hsn/chm/ATmegaX8.chm/14.htm

von Jim M. (turboj)


Lesenswert?

Ich gebe auch zu Bedenken das der STM32 Startup Code vor dem Sprung nach 
main() einen Aufruf von SystemInit()  macht.

D.h. HAL kann da Hardware wie GPIO Ports oder UARTs initialisieren ohne 
das Code in main() aufgerufen wird.

von Stefan F. (Gast)


Lesenswert?

Max, was genau meinst du mit "Einschalten"?

Jeder digitale Pin kann folgende Zustände haben:

Ausgang HIGH
Ausgang LOW

Eingang HIGH
Eingang LOW

Eingang undefiniert

Der letzte Status sollte vermieden werden, weil er Fehlfunktionen (bis 
hin zum Latch-Up) auslösen kann. Bei Batteriebetrieb stört auch ohne 
Latch-Up bereits die erhöhte Stromaufnahme.

Unter ein-/aus-geschaltet verstehe ich die Versorgung des Ports mit 
Takt. Das ist nämlich das Einzige, was man da ein- bzw aus-schalten 
kann, und zwar über die GPIOIEN Bits in den RCC...ENR Registern.

von Max M. (koeltrad)


Lesenswert?

Stefan ⛄ F. schrieb:
> Eingang HIGH
Im GPIOD-> IDR-Register meinte ich mit dem Wort "eingeschaltet", wenn 
der Bitstatus 1 ist.
Ok, heißt also anders: Eingang HIGH

von Max M. (koeltrad)


Angehängte Dateien:

Lesenswert?

Pin PD5 ist über einen 47-kΩ-Widerstand mit einer 3-Volt-Stromversorgung 
verbunden.
In meinem PD-Board ist dies wahrscheinlich ein reservierter Pin für die 
Überspannungserkennung.
Ich weiß noch nicht, wie ich es benutzen soll.
https://www.st.com/content/ccc/resource/technical/layouts_and_diagrams/schematic_pack/group1/83/aa/1d/e9/d8/3e/40/a6/MB997-F407VGT6-C01_Schematic/files/MB997-F407VGT6-C01_Schematic.pdf/jcr:content/translations/en.MB997-F407VGT6-C01_Schematic.pdf

von Stefan F. (Gast)


Lesenswert?

Max M. schrieb:
> Pin PD5 ist über einen 47-kΩ-Widerstand mit einer 3-Volt-Stromversorgung
> verbunden.

Na dann ist ja klar, wo der HIGH Pegel her kommt. Works as designed.

> Ich weiß noch nicht, wie ich es benutzen soll.

Was willst du denn mit dem Pin anstellen? kannst du keinen anderen 
freien Pin verwenden?

von Max M. (koeltrad)


Lesenswert?

Stefan ⛄ F. schrieb:
> Was willst du denn mit dem Pin anstellen?
Ich fange gerade an, STM32 zu lernen. Ich versuche zu verstehen, wie 
alles funktioniert.
Ich habe nicht verstanden, warum an Pin 5 ein High-Pegel anliegt, obwohl 
ich ihn nicht gesetzt habe und auch Pull-Down nicht geholfen hat.
Jetzt ist alles klar.

: Bearbeitet durch User
von Stefan F. (Gast)


Angehängte Dateien:

Lesenswert?

Generell sollte man sich schon mit dem Schaltplan des Discovery Boardes 
vertraut machen, das man zu benutzen gedenkt. Nur weil da 100 Pins 
heraus geführt sind, heißt das nicht, das alle 100 auch frei verwendbar 
sind. Eigentlich ist das auch klar im Manual dokumentiert.

Diversen Diskussionen nach ist der Power Switch empfindlich. Vielleicht 
hast du ihn mal kurzgeschlossen oder überlastet.

von Ralf D. (doeblitz)


Lesenswert?

Stefan ⛄ F. schrieb:
[...]
> Diversen Diskussionen nach ist der Power Switch empfindlich. Vielleicht
> hast du ihn mal kurzgeschlossen oder überlastet.

Da ist kein Defekt notwendig um die Messergebnisse zu erklären.

Ohne Pulldown wird PD5 über 47k auf 3V3 gezogen -> High.

Mit 10k Pulldown fließt Strom über die rote LED und den 680R (parallel 
zu den 47k Pullup). Damit ergibt sich dann 3V3 abzüglich der 
Flussspannung der LED an PD5, da dürften 1V5 gut passen.

Also alles working as designed.

von Max M. (koeltrad)


Angehängte Dateien:

Lesenswert?

Woanders fällt es ab ca. 1 Volt.
2.255-1.5==0,755Volt
Vermutlich am Innenwiderstand des Netzteils.

: Bearbeitet durch User
von Sebastian (Gast)


Lesenswert?

Ich schätze der NFAULT-Ausgang ist Open Collector, darum der 47k. Im 
Fehlerfall geht der Ausgang auf GND, die rote LED geht an, und PD5 geht 
LOW. Oder?

LG, Sebastian

von Stefan F. (Gast)


Lesenswert?

Ralf D. schrieb:
> Da ist kein Defekt notwendig um die Messergebnisse zu erklären.

Ich hatte darauf hingewiesen, weil er meinte dass die Overcurrent LED 
unerwartet aufleuchtet. Hatt dabei vergessen, dass er das selbst durch 
den 10kΩ Widerstand bewirkte. Deine Erklärung ist völlig richtig.

> Also alles working as designed.

von Stefan F. (Gast)


Lesenswert?

Sebastian schrieb:
> Ich schätze der NFAULT-Ausgang ist Open Collector, darum der 47k.

Offenbar ja.

von Max M. (koeltrad)


Lesenswert?

Max M. schrieb:
> Vermutlich am Innenwiderstand des Netzteils.
An der LED LD8 fallen 1,6 Volt ab.
Geprüft mit einem Multimeter.

von Manfred (Gast)


Lesenswert?

(prx) A. K. schrieb:
> Manfred schrieb:
>> Generell, immer, ohne Ausnahme, gehören am Anfang des Programmes alle
>> Ports in einen definierten Zustand gesetzt.
> Den haben sie ab Reset doch schon.

Der Zustand mag durchaus definiert sein, aber er wird ziemlich sicher 
nicht der sein, den meine Schaltungsumgebung braucht.

Irgend W. schrieb:
>> Danach bleibt Pin 5 immer noch eingeschaltet
> Da ist garnichts "Eingeschaltet", du stellst alles auf "Input" und IDR
> zeigt dir beliebigen Scheißdreck an den dein Radioempfänger gerade
> einfängt.

Aus diesem Grund setzt man unbeschaltete Anschlüsse als Ausgang.

von Fpgakuechle K. (Gast)


Lesenswert?

Manfred schrieb:

> Aus diesem Grund setzt man unbeschaltete Anschlüsse als Ausgang.

Nein, auf tristate.
Oder abzwicken,
oder ...
Beitrag "Unbenutzte AVR-Pins wie beschalten (EMV)?"

Beitrag #7071542 wurde von einem Moderator gelöscht.
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.