Forum: Mikrocontroller und Digitale Elektronik IRQHandler beim STM32F4 mit Drehimpulsgeber


von Kagegan (Gast)


Angehängte Dateien:

Lesenswert?

Moin moin an alle,
ich hab eine Frage bezüglich des IRQHandler beim STM32F4 mit 
angeschlossenem Drehgeber.
Und zwar sobald ich das Programm auf dem Board starte und es debuggen 
will springt er immer in EXTI3_IRQHandler obwohl ich den Drehimpulsgeber 
nicht bewege. Meine Frage ist, ob eventuell mir jemand ein Tipp geben 
kann wie ich den Fehler behandeln soll.
An sich habe ich alles so programmiert und verkabelt wie es sein sollte.
Den Quellcode für den InterruptController hab ich in den Anhang gestellt 
hoffe es lässt sich ohne weiteres öffnen.
Mfg
Kagegan

von W.S. (Gast)


Lesenswert?

Tja, das ist eben immer so, wenn die Anfangs-Konditionen entsprechend 
sind, also welche Flanke, statisch oder auf Flanke reagieren usw. Ich 
lese jetz tnicht das Manual für dich, da mußt du schon selber 
reingucken.

W.S.

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Wer will denn da auf Schaltkontaktflanken enn IRQ werfen?
Ganz schlechte Idee, macht man nicht!
Denn Taster prellen.
https://www.mikrocontroller.net/articles/Drehgeber

von Philipp J. (kagegan)


Lesenswert?

Mw E. schrieb:
> Wer will denn da auf Schaltkontaktflanken enn IRQ werfen?
> Ganz schlechte Idee, macht man nicht!

Mein Prof will auf den Schaltkontaktflanken nen IRQ haben. Ich könnte 
auch über nen Timerinterrupt die Auswertung machen aber das ist nicht 
gefragt und leider auch nicht mein Problem. Naja schönen Abend noch ;)

von Belch (Gast)


Lesenswert?

Philipp J. schrieb:

> Mein Prof will auf den Schaltkontaktflanken nen IRQ haben.

Ob das stimmt?

von aSma>> (Gast)


Lesenswert?

Belch schrieb:
> Ob das stimmt?

Jedenfalls, Timer hat der STM32F4 genug an Bord.

1
in .h
2
/*GLOBALES*/
3
static volatile int count;
4
static volatile int8_t direction;    // 1 order -1
5
static int direct;

Du musst dich entscheiden, entweder global oder static. Wo werden die 
Variablen initialisiert?

Irgendwo hast du zweimal diegleiche nvic Prio verteilt. K.A, ob das so 
geht.

mfg

von Philipp J. (kagegan)


Lesenswert?

Also Problem ist gelöst..
Und zwar fehlte beim Routing der Pins die negation.
Vorher:
1
SYSCFG ->EXTICR[0] &= (0xf << (4*pin1));
Nachher
1
SYSCFG ->EXTICR[0] &= ~(0xf << (4*pin1));

Danke an euch für die Hilfe, hätte ich nie ohne euch geschafft :)
und ja der prof wollte den interrupt über die Flanken, Timer wäre zwar 
ehr richtig aber ich muss mich ja an die richtlinien meines Prof 
halten...
Auf jeden Fall schönen Abend noch

von W.S. (Gast)


Lesenswert?

Philipp J. schrieb:
> und ja der prof wollte den interrupt über die Flanken, Timer wäre zwar
> ehr richtig aber ich muss mich ja an die richtlinien meines Prof
> halten...

Unsinn. Du dünkst dich schlauer als dein Professor, aber du bist es 
nicht.

Du solltest eher darüber nachdenken, was eigentlich dir zu begreifen 
ansteht.

Das Öffnen und Schließen eines der beiden Drehgeberkontakte ist ein 
Ereignis, was dir sagt, daß der Drehgeber bewegt wurde. Die 
Richtungs-Information hingegen bekommt man aus dem Zustand des anderen 
Signals zum Änderungszeitpunkt des ersteren Signals. Normalerweise 
ändert dieses zweite Signal seinen Zustand direkt im Rastpunkt (also 
möglicht weit weg von den Umschaltpunkten des ersteren Signals), 
weswegen das simple Abtasten im festen Timer-Raster eben grundfalsch 
ist, da man dann zwar das Ereignis als solches erkennen kann (wie bei 
einem Taster), aber nicht mehr die Richtungsinformation bekommt, da 
diese nur eine gewisse Zeit nach dem Ereignis zur Verfügung steht. Man 
müßte sehr häufig pollen, um das Abtasttheorem zu beachten und keinen 
Unfug zu dekodieren.

Kapiert?

Was tut man also?
1. die Signale konditionieren, also vom Rauschen befreien, was hier 
heißt, sie vom Prellen zu befreien - und zwar analog, da du ja wohl 
gelernt hast, daß man eine digitale Signalverarbeitung nur dann sauber 
praktizieren kann, wenn höhere Frequenzen als 1/2 Abtastrate nicht mehr 
vorkommen.
2. die zuvor analog konditionierten Signale ins Digitale übersetzen 
(sprich an einen Eingang legen, der signaltheoretisch als 1 Bit Wandler 
daherkommt)
3. diese digitalen signale auswerten. Da man den Zustand des zweiten 
Signals direkt nach dem Zustandwechsel des ersten Signals benötigt, 
kommt da eben nur der Interrupt auf den Zustandwechsel des ersten 
Signals in Frage. Alles Andere ist Pfusch, weil es sinnlos Rechenzeit 
verbraucht.

Hast du auch dieses jetzt verstanden?

Nochmal zum Mitschreiben: zuerst konditionieren, dann wandeln, dann 
auswerten.

W.S.

von Klaus (Gast)


Lesenswert?

W.S. schrieb:
> 1. die Signale konditionieren, also vom Rauschen befreien, was hier
> heißt, sie vom Prellen zu befreien - und zwar analog,

Ach da ist ja wieder der Handelsreisende in Kondensatoren. Sind deine 
Umsätze so zusammengebrochen, daß du hier Werbung für den Einsatz von 
deinen Kondensatoren machen mußt? Hast du auch die passenden 
Drehkondensatoren im Angebot, die man bei alternden Kontakten nachregeln 
kann?

MfG Klaus

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.