Hallo, ich benutze das STM32 Nucleo Board und möchte nun per Taster einen externen Interrupt auslösen. Dabei soll eine LED AN bzw. AUS gehen. Ich benutze nur ein Taster und genau da ist mein Problem. Die LED soll bei der ersten fallenden Flanke AN gehen und bei der zweiten fallenden Flanke AUS gehen. Wenn ich den Taster einmal drücke, dann löst es das erste Interrupt aus und es kommt zu einem Ereignis. Bleibt das Signal dann im LOW-Zustand, wenn ich den Taster loslasse? Hier ist mein Code. Ich hab es nun soweit, dass ich beim ersten mal drücken der Taste die LED's leuchten. Aber irgendwie schaffe ich es nicht einen zweiten Interrupt auszulösen. Habt ihr da vielleicht paar nützliche Tipps für mich? Danke. #include "stm32f0xx.h" int main(void) { __disable_irq(); RCC->AHBENR |= 0x40000; RCC->AHBENR |= 0x20000; RCC->APB2ENR |= 1; GPIOB->MODER |= 0x55; SYSCFG->EXTICR[2] = 0; EXTI->IMR |= 0x0400; EXTI->FTSR |= 0x0400; NVIC_EnableIRQ(EXTI4_15_IRQn); __enable_irq(); while (1){} } void EXTI4_15_IRQHandler(void) { if(EXTI->PR == 0x0400) { GPIOB->BSRR = 0x0f; EXTI->PR = 0x0400; } }
Du mußt den Taster zuvor entprellen. Aber da werden Dir hier schon einige Leute sagen, wie man es undebingt machen muß ;-)
m.n. schrieb: > Du mußt den Taster zuvor entprellen. Der Taster ist auf dem Board schon integriert. Muss ich das dann trotzdem entprellen? Ich dachte das entprellen ist für Taster gedacht, die man selbst in die Schaltung bzw. Board einbindet.
:
Bearbeitet durch User
Richard W. schrieb: > Der Taster ist auf dem Board schon integriert. Und? Das heißt doch noch lange nicht, daß auf dem Board auch eine Entprellung vorhanden ist. Also schau auf den Stromlaufplan zum Board und entscheide dann selber, was da ist und was du tun mußt. Und ja, das Thema "Tastenentprellung" ist hier schon 1000 mal hitzig diskutiert worden. Tenor: Tasten in der ISR der Systemuhr abfragen+behandeln, Drehgeber analog entprellen und per Flanken-Interrupt behandeln. Der Geschwindigkeitsunterschied macht's. Nochwas: Sowas wie " __disable_irq();" scheint mir von der Atmel-AVR Fraktion her zu kommen. Sowas braucht man bei den ARM im allgemeinen und Cortex im besonderen normalerweise nicht. Also gewöhne es dir erst garnicht an, mit so etwas in deiner Firmware herumzuwerfen. Abgesehen davon ist das Problem des Tasten-Entprellens eine gute Übung für das logische Denken und eigentlich völlig unabhängig von Hardware und Programmiersprache. Also formuliere dir erstmal dein Tastenentprellen mit Stift auf Papier und bedenke dabei, daß selbst ein paar Millisekunden, die wir als Menschen kaum spüren, für den µC bei seinen 72 MHz Takt wie eine halbe Ewigkeit aussehen. W.S.
Richard W. schrieb: > Der Taster ist auf dem Board schon integriert. Dem Taster ist es wurscht, ob er schon drauf ist oder nachträglich rangepappt wird. Der externe Interrupt ist das Problemkind. Er reagiert auf Störungen jeglicher Art. Willst Du ihn unbedingt verwenden, brauchst Du eine externe Entprellung/Entstörung. Ohne den externen Interrupt nimmt man bequem eine bewährte Entprell-Lib und gut is. Typisch benutzt eine Entprell-Lib einen Timerinterrupt oder den Systick. Und nein, ein Delay ist niemals nicht eine Entprellung.
:
Bearbeitet durch User
Ok, danke für eure Hilfe. Ich werde es mal versuchen, ob ich das Problem gelöst bekomme. Eine Idee hätte ich schon mal. Schönen Tag euch allen noch!
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.