Forum: Mikrocontroller und Digitale Elektronik Interrupt bei STM32F103C8


von Thomas G. (Firma: Frickelhauptquartier) (taximan)


Lesenswert?

Moin,
wie kann es sein, dass der erste Interrupt funktioniert, der zweite 
jedoch nicht?

volatile byte B5=0,B4=0; // ohne volatile selbes Ergebnis
...
pinMode(PB5, INPUT_PULLDOWN); // DATUM
attachInterrupt(digitalPinToInterrupt(PB5),B5Pressed,RISING);
pinMode(PA15, INPUT_PULLDOWN); // ALARM1
attachInterrupt(digitalPinToInterrupt(PA15),B4Pressed,RISING);
...
if(B5==1)dispdatesun();
if(B4==1){Serial.print("AL1:");...}
...
void B5Pressed(){
  B5=1;
}

void B4Pressed(){
  B4=1;
}
Ich habe auch schon die Pins B3 und B4 ausprobiert, selbes Ergebnis.

Edith hat gerade herausgefunden: an PA6 funktioniert es, aber warum?

: Bearbeitet durch User
von Wastl (hartundweichware)


Lesenswert?

Thomas G. schrieb:
> wie kann es sein, dass der erste Interrupt funktioniert, der zweite
> jedoch nicht?

Vermutlich weil du ein Interrupt Flag nicht löschst nachdem
ein Interrupt aufgetreten ist. Ob du das machst oder nicht
ist allerdings aus deinen wilden Code-Fragmenten nicht zu
erkennen.

von Thomas G. (Firma: Frickelhauptquartier) (taximan)


Lesenswert?

Wäre mir neu, dass das gemacht werden muss.

von Obelix X. (obelix)


Lesenswert?

@Thomas: Wenn du Code postest, schau dir mal die Infos zu Formatierung 
an, stehen direkt über dem Eingabefeld für deinen Beitrag.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Thomas G. schrieb:
> Wäre mir neu, dass das gemacht werden muss.

Gab sogar mal einen Beitrag hier dazu. Es betrifft auf jeden Fall IRQs, 
die  über GPIO ausgelöst werden. Erst den Request löschen, dann im 
Interrupt weitermachen. Ist aber easy für dich, das einfach mal 
auszuprobieren. Selbst löschen tut der STM32 den Request nämlich sowieso 
nicht.

: Bearbeitet durch User
von Wastl (hartundweichware)


Lesenswert?

Thomas G. schrieb:
> Wäre mir neu, dass das gemacht werden muss.

Könnte ein Ansatz zu Beratungsresistenz sein.

von Rahul D. (rahul)


Lesenswert?

Matthias S. schrieb:
> Selbst löschen tut der STM32 den Request nämlich sowieso nicht.

Vielleicht erledigt das der Arduino-Wrapper (*)
Dazu müsste man sich den Quellcode der Funktion mal angucken.


(*) Für mich ist das ein Wrapper; kein eigener c++-Dialekt, was manche 
gerne behaupten.

von Sherlock 🕵🏽‍♂️ (rubbel-die-katz)


Lesenswert?

Thomas G. schrieb:
> wie kann es sein, dass der erste Interrupt funktioniert, der zweite
> jedoch nicht?

Die Frage ist nicht eindeutig. Meinst du mit "der zweite" dass am 
zweiten Eingang PA15 (auch PB3 und PB4)

a) gar kein Tastendruck erkannt wird
oder
b) nach dem Reset nur der erste Tastendruck erkannt wird?

Handelt es sich um ein Blue-Pill Board? Dann liegt es sich mit hoher 
Wahrscheinlichkeit an einer schlechten Fälschung. Probleme mit 
Interrupts wurde da schon öfter berichtet.

Wastl schrieb:
> Vermutlich weil du ein Interrupt Flag nicht löschst nachdem
> ein Interrupt aufgetreten ist.

Daran liegt es nicht, darum kümmert sich das Framework.

: 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.