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 ;)
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.
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.
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
ich habe nur das Problem, dass der Timer bereits im Encoder-Mode arbeitet, was laut CubeMx wohl den Slave-Mode ausschließt
leonhh schrieb: > dass der Timer bereits im Encoder-Mode > arbeitet Wenn der Timer bereits läuft, warum/wie willst du ihn erneut einschalten?
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.