Achim M. schrieb:
> 1. Die Interruptquelle prellt. Da kannst du nur Hardware-Filter dagegen
> einsetzen.
Die Interruptquelle prellt nicht. Wenn ich eine volle Umdrehung fahre,
dann wird die ISR auch 16 mal ausgeführt.
Lothar M. schrieb:
> Micha J. schrieb:
>> habe zur Positionsbestimmung 4 Sensoren
> Welche denn? Gibt es dazu eine Typbezeichnung oder ein Datenblatt?
Es handelt sich um den TLE4905
https://www.infineon.com/cms/en/product/sensor/magnetic-sensors/magnetic-position-sensors/hall-switches/tle4905l/
Peter D. schrieb:
> Sind die Pins floatend, dann kann alles mögliche passieren. Die Pins
> müssen immer mit gültigem Pegel gespeist werden. Sind da Kontakte oder
> Open-Drain Quellen dran, muß ein Pullup/-down angeschlossen oder enabled
> werden.
Die Hallsensoren werden als Input mit Pullup initialisiert, damit sie
nicht floaten. Ein Interrupt wird bei einer negativen Flanke
ausgewertet.
GPIO_Init(GPIOB, GPIO_PIN_0, GPIO_MODE_IN_PU_IT)
EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOB, EXTI_SENSITIVITY_FALL_ONLY);
Ich habe eine neue Abbildung hinzugefügt. Die Interrupts werden auch
nicht niemals gleichzeitig getriggert. D.h. dass ich mir quasi nur das
zu änderne Bit anschauen brauche.
Der Tipp von Peter D. hat mir geholfen, dass ich den alten Werte
speichern muss und einen Vergleich mit den neuen Wert durchführe. Mit
XOR kann ich das Bit sehen, welches gewechselt hat. Dann überprüfe,
welches Bit sich geändert hat.
1 | INTERRUPT_HANDLER(EXTI_PORTB_IRQHandler, 4)
|
2 | {
|
3 | /* In order to detect unexpected events during development,
|
4 | it is recommended to set a breakpoint on the following instruction.
|
5 | */
|
6 | hall1 = (uint8_t)GPIOB->IDR& 0xF;
|
7 |
|
8 | switch(hall1^hall_alt) //
|
9 | {
|
10 | case 0x1: h1_counter++; break; // Pin0
|
11 | case 0x2: h2_counter++; break; // Pin1
|
12 | case 0x4: h3_counter++; break; // Pin2
|
13 | case 0x8: h4_counter++; break; // Pin3
|
14 | default: break;
|
15 | }
|
16 |
|
17 | counter_IT++; // ISR Counter nur zu Testzwecken
|
18 | hall_alt = hall1; // alter Wert wird gespeichert
|
19 | }
|
Jetzt habe ich trotzdem ein eigenartiges Verhalten. Bei den ersten zwei
Hallsensoren zählt er 4 fallende Flanken, aber bei h3_counter und
h4_counter nur 2. Außerdem nach x-Versuchen (ca. 5-6 mal) zählt er
völlig falsch und hat falsche Werte und dann die richtigen für h1_ und
h2_counter.
Viele Grüße
Michael