Forum: Mikrocontroller und Digitale Elektronik Timer-Interrupt mit anderem Interrupt starten (STM-Board)


von leonhh (Gast)


Lesenswert?

Hallo,

also es geht um ein STM32F4-Board. Ich möchte dass ein Timer-Interrupt 
erst dann ausgelöst wird, wenn ein High-Pegel an einem Eingang erkannt 
wird und anschließend immer weiter läuft unabhängig davon, ob das Signal 
wieder auf High geht. Also einfach nur ein einmaliger Startschuss.

Ich habe mir das so vorgestellt, dass ich in der Main.c-Datei eine 
globale Variable var=0 einführe und mit dem externen Interrupt des 
Signals diese Variable auf 1 setze.
Dann würde ich in der Callback-Funktion des Timer-Interrupts einfach die 
if-Bedingung mit var==1 UND-verknüpfen...

Wäre das so in Ordnung oder gibt es noch bessere Möglichkeiten. Ich habe 
mal irgendwo gelesen, dass man globale Variablen vermeiden sollte ;)

von Peter D. (peda)


Lesenswert?

leonhh schrieb:
> Dann würde ich in der Callback-Funktion des Timer-Interrupts einfach die
> if-Bedingung mit var==1 UND-verknüpfen...

Warum so kompliziert?
Der externe Interrupt setzt einfach das Run-Bit des Timers.

von Dr. Sommer (Gast)


Lesenswert?

Der Timer kann sich auch komplett selbstständig starten, wenn eine 
steigende Flanke ankommt ("Slave Mode"). Dadurch hast du nur eine sehr 
kurze Latenz zwischen Flanke und Start des Timers und die Software wird 
nicht beeinflusst. Lies im Datenblatt nach, wie das geht.

von TM F. (p_richner)


Lesenswert?

Wie @Peter D. bereits geschrieben hat in Pseudo-Code:
1
ISR(INTERRUPT_ext)
2
{
3
    enable_timer = 1;
4
}
5
6
ISR(timer)
7
{
8
    ....
9
}

Dies wird einfach bei jedem Intterupt ausgeführt. Hat keinen Einfluss 
auf die Funktion, benötigt nur ein paar Taktzyklen mehr.

MfG

: Bearbeitet durch User
von leonhh (Gast)


Lesenswert?

ich habe nur das Problem, dass der Timer bereits im Encoder-Mode 
arbeitet, was laut CubeMx wohl den Slave-Mode ausschließt

von TM F. (p_richner)


Lesenswert?

leonhh schrieb:
> dass der Timer bereits im Encoder-Mode
> arbeitet

Wenn der Timer bereits läuft, warum/wie willst du ihn erneut 
einschalten?

von leonhh (Gast)


Lesenswert?

ich habe doch bereits geschrieben, dass der Timer erst dann laufen soll, 
wenn das Signal anliegt..der läuft dann eben im Encoder-Modus, weil er 
bestimmte Aufgaben zu erledigen hat.

von Peter D. (peda)


Lesenswert?

leonhh schrieb:
> weil er
> bestimmte Aufgaben zu erledigen hat.

Welche denn?
Oft ist es besser, wenn man beschreibt, wozu das Ganze gut sein soll, 
d.h. was die eigentliche Aufgabe ist. Dann wird einem nicht eingeweihten 
Leser das Problem viel klarer.
Anhand eines Teils eines Lösungswegs läßt sich nur schwer auf die 
Aufgabe zurück schließen.

: Bearbeitet durch User
von leonhh (Gast)


Lesenswert?

Der Timer, der im Encoder-Modus läuft, fungiert als Zähler von zwei 
Quadratursignalen bzw. deren Änderungen. (Auslesung von Drehsensor, 
Encoder-Funktion ist genau für diese Anwendung vorgesehen). Dieser 
Drehsensor hat aber noch ein weiteres Signal, das nur einmal pro 
Umdrehung kommt.. und erst wenn dieses Signal zum ersten Mal 
durchgelaufen ist, soll der Zähler staten

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.