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!
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
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...
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...
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?
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
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
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.
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
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?
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.
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
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.
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.
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?
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).
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?
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.
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.
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!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.