Forum: Mikrocontroller und Digitale Elektronik Button EXTI nicht zuverlässig STM32


von Larry (Gast)


Lesenswert?

Hallo,

ich habe am STM32F429 Board an Pin PB4 einen Schalter angeschlossen der 
über einen Interrupt eine Funktion ausführen soll.

Besagt Funktion befindet sich in
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){
funktion();
HAL_GPIO_TogglePin(...);
}

Zum Testen toggle ich eine der USER-LEDs am Board. Jetzt ist es so, dass 
der Interrupt teilweise mehrfach ausgeführt wird oder erst garnicht 
stattfindet. Im NVIC ist der EXTI4 aktiviert, sonst würde sich ja 
garnichts tun. Der Schalter ist auch ordentlich entprellt und der 
Interne Pull-Up des STM32 auch aktiviert, weil der Schalter eine 
fallende Flanke verursacht, die auch zum triggern des Interrups 
konfiguriert ist.

Ist das so wie ich es mache nicht eigentlich in Ordnung?

Direkt am Nachbarpin wird ein PWM-Signal ausgegeben. Könnte das da 
gewissermaßen reinstreuen? Wäre doch eigentlich komisch. Verwende aber 
vielleicht mal zum Ausprobieren einen anderen PIN.

Hat jemand eine Idee woran es liegen könnte?

Danke!

von Jan K. (jan_k)


Lesenswert?

Der Knopf klingelt bzw prellt. Siehe 
https://www.mikrocontroller.net/articles/Entprellung

Nein, so wie du es gemacht hast reicht es leider nicht aus, siehe 
Artikel.

Edit: Tut mir Leid, du hast geschrieben, er sei entprellt. In Hardware? 
Gibts Oszi Bilder?

: Bearbeitet durch User
von Larry (Gast)


Angehängte Dateien:

Lesenswert?

Jan K. schrieb:
> Edit: Tut mir Leid, du hast geschrieben, er sei entprellt. In Hardware?
> Gibts Oszi Bilder?

Genau, er ist hardwareseitig entprellt. Mit was für Kondensatoren weiß 
ich leider nicht.

Die fallende Flanke sieht man im Anhang. 1µs/DIV und 1V/DIV...

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Larry schrieb:
> Der Schalter ist auch ordentlich entprellt und der Interne Pull-Up des
> STM32 auch aktiviert,

Larry schrieb:
> Die fallende Flanke sieht man im Anhang. 1µs/DIV und 1V/DIV...

Ich wusste gar nicht, dass man mit einem internen STM32-Pullup den Pegel 
am Schalter bis auf 5V heben kann...

von Larry (Gast)


Lesenswert?

Frank M. schrieb:
> Ich wusste gar nicht, dass man mit einem internen STM32-Pullup den Pegel
> am Schalter bis auf 5V heben kann...

Oh.. der Schalter hat denke ich auch einen Pullup... Ich steh gerade auf 
dem Schlauch... brauche ich den internen Pullup überhaupt oder ist das 
eher hinderlich?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Larry schrieb:
> Oh.. der Schalter hat denke ich auch einen Pullup... Ich steh gerade auf
> dem Schlauch... brauche ich den internen Pullup überhaupt oder ist das
> eher hinderlich?

Dein interner Pullup treibt mit 3,3V gegen die 5V - nicht schlimm, wenn 
der Schalter tatsächlich nur über einen hochohmigen Widerstand an 5V 
hängt und nicht über einen Draht. Ich würde den Pullup jedoch besser 
abschalten.

Wie wärs mal mit einem Schaltplan? Warum hängt der Taster/Schalter an 5V 
und nicht 3,3V? Wie sieht die Innenbeschaltung Deines Tasters/Schalters 
aus?

PB4 hat übrigens auch eine JTAG-Funktion, nämlich NJTRST.

Deinen Code zu sehen wäre auch nicht von Nachteil...

: Bearbeitet durch Moderator
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Frank M. schrieb:
> Dein interner Pullup treibt mit 3,3V gegen die 5V - nicht schlimm
Mich wundert, dass da überhaupt 5V am Portpin zusammenkommen. Ich hätte 
da wegen irgendwelchen Schutzdioden eher auf 3,5..4V getippt. Könnte 
natürlich auch sein, dass über eine solche Schutzdiode die Vcc des 
gesamten Controllers bei unbetätigter Taste auf unerlaubte 4,7V 
angehoben wird (weil der Taster nämlich eigentlich gar kein Taster ist, 
sondern irgendeine elektronische Schaltung, die locker 20mA ausgeben 
kann...).

Larry schrieb:
> Oh.. der Schalter hat denke ich auch einen Pullup...
Welcher Taster ist das denn, der da einen eingebauten Pullup hat? Dafür 
muss der Taster ja 3 Anschlüsse haben...

> Ich steh gerade auf dem Schlauch...
Schaltpläne mit Bauteilnamen und Batueeilbezeichnungen sind echt total 
gut, um zu kapieren, was man da wie verschaltet hat.

> brauche ich den internen Pullup überhaupt oder ist das
> eher hinderlich?
Du brauchst im Prinzip den externen Pullup nicht.

: Bearbeitet durch Moderator
von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Lothar M. schrieb:
> Mich wundert, dass da überhaupt 5V am Portpin zusammenkommen.

Vielleicht handelt es sich gar um einen Umschalter. Der TO spricht auch 
immer von einem "Schalter" und nicht von einem "Taster".

Einen manuell zu betätigenden Schalter über einen Interrupt auszuwerten 
hat sowieso etwas von Kanonen auf Spatzen.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Frank M. schrieb:
> Der TO spricht auch immer von einem "Schalter" und nicht von einem "Taster"
Dann kann man sich den Pullup komplett sparen.
Trotzdem ist es keine gute Idee, an einen 3V3 Controller 5V anzulegen... 
;-)

Larry schrieb:
> einen Schalter angeschlossen der über einen Interrupt
Einen mechanischen Taster oder Schalter schließen nur Anfänger und 
Profis an eine Interruptleitung an. Die Einen, weil sie wissen, was sie 
tun. Die Anderen weil sie es nicht wissen.

: Bearbeitet durch Moderator
von Theor (Gast)


Lesenswert?

Prellzeiten sind m.M.n. in der Regel deutlich länger als einige 
Mikrosekunden; eher 10ms. Also Faktor 10.000. Wie sehen die Messungen in 
diesem Maßstab aus?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Lothar M. schrieb:
> Trotzdem ist es keine gute Idee, an einen 3V3 Controller 5V anzulegen...
> ;-)

Die meisten Pins des STM32 sind 5V-tolerant. Dazu gehört auch PB4 eines 
STM32F4xx.

von Gebhard R. (Firma: Raich Gerätebau & Entwicklung) (geb)


Lesenswert?

Ich würde mal statt dem Taster ein Rechtecksignal an den Pin legen, und 
in der Interruptroutine einen weiteren Pin toggeln.Diesen dann mit einem 
Oszilloskope beobachten. Dann siehst du, ob das Problem vom Taster oder 
von deiner Software herrührt.

Grüsse

von Mike J. (linuxmint_user)


Lesenswert?

Larry schrieb:
> Direkt am Nachbarpin wird ein PWM-Signal ausgegeben.

Versuche doch einfach mal den Pin mit einem eigenen Tiefpass (100nF + 
100kOhm) zu entprellen. Die kapazitive Kopplung der Leiterbahnen 
zueinander wird deutlich geringer sein als 100nF.

Vielleicht ist deine Verdrahtung auch sehr weitläufig, so dass du dir 
Magnetfelder von Leuchtstoffröhren einfängst.

Zeig mal deinen Aufbau!

Larry schrieb:
> Genau, er ist hardwareseitig entprellt. Mit was für Kondensatoren weiß
> ich leider nicht.
>
> Die fallende Flanke sieht man im Anhang. 1µs/DIV und 1V/DIV...

Mit einer Hardware-Entprellung würdest du nicht solche Flanken sehen 
können.
Ein Taster prellt immer, es sei denn er ist ein Leitgummi-Taster. Bei 
deinem Oszi-Bild bin ich daher sehr skeptisch.

von Stefan F. (Gast)


Lesenswert?

PB4 ist 5V tolerant.

Wenn du mit Flanken arbeitest, ist es wichtig, während der 
Initialisierung und in der ISR das entsprechende Bit im Register EXT->PR 
mit 1 zu beschreiben, um dem Status zurückzusetzen. Ansonsten wird die 
nächste Flanke nicht erkannt.

Prüfe mal, ob das in deinem Code bzw. der HAL enthalten ist. Wenn es bei 
der Initialisierung fehlt, funktioniert die ISR manchmal gar nicht.

Wenn der Interrupt bei einem Tastendruck trotz Entprellung mehrfach 
ausgeführt wird, dann hast du vermutlich vergessen, die 
Flankentriggerung im Register EXTI->FTSR einzuschalten, so dass der 
Interrupt auf Pegel triggert.

von Wolfgang (Gast)


Lesenswert?

Larry schrieb:
> Genau, er ist hardwareseitig entprellt. Mit was für Kondensatoren weiß
> ich leider nicht.
>
> Die fallende Flanke sieht man im Anhang. 1µs/DIV und 1V/DIV...

Ich kenne überhaupt keinen Schalter, der auf Zeitskalen von 10µs prellt.

Wie willst du mit dieser Zeitbasis vom Oszi feststellen können, ob deine 
Entprellung funktioniert?

von Peter D. (peda)


Lesenswert?

Larry schrieb:
> Ist das so wie ich es mache nicht eigentlich in Ordnung?

Nein. Tasten entprellen und Flanke erkennen macht man im Timerinterrupt.
Externe Interrupts nimmt man nur, um alle möglichen Störungen 
einzufangen, bzw. für wirklich eilige Sachen (µs-Bereich).

von RH (Gast)


Lesenswert?

erstmal Entschuldigung für die späte Antwort und danke für die 
zahlreichen Kommentare...

Also es handelt sich um irgendeinen China Encoder mit Taster verbaut. 
Die Bezeichnung "Schalter" war inkorrekt das stimmt!

Ich kann morgen nochmal mit einer gröberen Zeitauflösung aufzeichnen und 
schauen obs wirklich nicht prellt. Wie schließe ich einen Taster denn am 
besten an?

von Mike J. (linuxmint_user)


Lesenswert?

RH schrieb:
> Wie schließe ich einen Taster denn am besten an?

1. Tasterpin nach GND
2. Tasterpin an einen PullUp (10-100kOhm) nach Vcc, einen Widerstand 
(100k) zum GPIO-Pin des Controllers, direkt am Controller dann noch 
einen Kondensator (10-100nF) an den I/O-Pin gegen GND geschaltet.

von Peter D. (peda)


Lesenswert?

RH schrieb:
> Ich kann morgen nochmal mit einer gröberen Zeitauflösung aufzeichnen und
> schauen obs wirklich nicht prellt.

Spar Dir die Zeit, es gibt super funktionierende Entprell-Libs mit 
lächerlich geringem Ressorcenverbrauch.

von Larry (Gast)


Lesenswert?

Peter D. schrieb:
> Spar Dir die Zeit, es gibt super funktionierende Entprell-Libs mit
> lächerlich geringem Ressorcenverbrauch.

Wahrscheinlich sowas wie der hier verwendete Treiber oder?
Werd ich mir mal anschauen!

von Larry (Gast)


Lesenswert?


von Jan K. (jan_k)


Lesenswert?

Die libs gibts im bereits im ersten Post erwähnten Artikel: 
https://www.mikrocontroller.net/articles/Entprellung

Peda D. (der Author) hat sich auch hier bereits zu Wort gemeldet :)

: Bearbeitet durch User
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.