Warum gehen einige Port-Pins, die ich nicht eingeschaltet habe, hoch?

OP #7070170
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?
OP #7070190
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.
Gast #7070194
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
OP #7070222
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?
(Firma: egal) #7070243
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:-)
Gast #7070254
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.
OP #7070266
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
(Firma: egal) #7070314
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...
OP #7070319
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.
Gast #7070335
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?
OP #7070340
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;
Gast #7070373
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
Gast #7070954
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.
OP #7071051
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
Angehängte Dateien:
Gast #7071056
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?
Gast #7071069
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.
Angehängte Dateien:
#7071139
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.
Gast #7071209
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.
Gast #7071247
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.
Beitrag #7071542 wurde von einem Moderator gelöscht.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren