Timer Input capture kann m.W. auf "TIM_ICPolarity_Rising", "TIM_ICPolarity_Falling", "TIM_ICPolarity_BothEdge" eingestellt werden. Ist es bei "TIM_ICPolarity_BothEdge" möglich, im Interrupt herauszufinden, welche Flanke ihn ausgelöst hat? Gibt es evtl. ein Zwischenregister oder bleibt nur, den Pinstatus einzulesen?
Hans schrieb: > oder bleibt nur, den Pinstatus einzulesen? Was wäre daran so schlimm? Ich tue das auch, weil ich den Hallsensoren, die den IRQ auslösen, nicht so recht über den Weg trauen kann (Starke Magnetfelder) und deswegen im Interrupt nach einem winzigen Delay nochmal nachschaue, ob sie nun wirklich low sind.
Matthias Sch. schrieb: > Was wäre daran so schlimm? Es ist zwar unwahrscheinlich anders, aber: man kann nicht sicher sein, dass der eingelesene Zustand der auslösenden Flanke entspricht.
Hans schrieb: > Es ist zwar unwahrscheinlich anders, aber: man kann nicht sicher sein, > dass der eingelesene Zustand der auslösenden Flanke entspricht. Wie meinst du das? In der o.a. Sensorplausibilitätsprüfung klappt das immer, denn die Flanke hat ja auf jeden Fall den Interrupt ausgelöst, muss also da gewesen sein. Der STM32F100 jedenfalls findet daran nichts ungewöhnlich:
1 | // es gibt noch 2 andere IRQ Lines, hier mal nur eine
|
2 | void EXTI0_IRQHandler(void) |
3 | {
|
4 | if(EXTI_GetITStatus(HALL1_EXTI_LINE) != RESET) |
5 | {
|
6 | /* Clear the EXTI line pending bit */
|
7 | EXTI_ClearITPendingBit(HALL1_EXTI_LINE); |
8 | HallIRQ(); |
9 | }
|
10 | }
|
11 | // hier werden Events aller 3 Sensoren behandelt
|
12 | void HallIRQ() { |
13 | EXTI_ClearFlag(EXTI_Line0 | EXTI_Line1 | EXTI_Line2); |
14 | volatile uint16_t hall = GetHall(); |
15 | // spurious trap - this routine should only be fired if we have a
|
16 | // valid sensor change
|
17 | if (lastHall != hall ) { |
18 | // hier passieren motorspezifische Dinge
|
19 | }
|
20 | // und hier das nochmalige Abfragen der IRQ Lines
|
21 | uint16_t GetHall(void) { |
22 | volatile uint16_t hall; |
23 | hall = HALL_GPIO_PORT->IDR & HALLMASK; |
24 | // wieder die tollen Dinge meiner Motorcontrol
|
25 | }
|
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.