Forum: Mikrocontroller und Digitale Elektronik Externer Interrupt


von Richard W. (richard00)


Lesenswert?

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;
  }
}

von m.n. (Gast)


Lesenswert?

Du mußt den Taster zuvor entprellen.
Aber da werden Dir hier schon einige Leute sagen, wie man es undebingt 
machen muß ;-)

von Richard W. (richard00)


Lesenswert?

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
von W.S. (Gast)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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
von Richard W. (richard00)


Lesenswert?

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
Noch kein Account? Hier anmelden.