Forum: Mikrocontroller und Digitale Elektronik STM32 TIM_ICPolarity nachträglich ermitteln?


von Hans (Gast)


Lesenswert?

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?

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


Lesenswert?

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.

von Hans (Gast)


Lesenswert?

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.

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


Lesenswert?

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