Forum: Mikrocontroller und Digitale Elektronik Problem mit Timerflags


von Karlheinz Druschel (Gast)


Lesenswert?

Hi Leuts,

mal wieder eine Frage von einem Newbie:
Ich möchte in meinem Programm verschiedene Zeitimpulse zur Verfügung
haben. Dazu benuzue ich den Timer 0. Alle 10 ms wird ein Overflow
aufgerufen.
In dieser Interruptroutine erhöhe ich verschiedene Zählerstände und
gewinne und toggle dabei entsprechende Bits.
Ich habe also im Register TFlags (r16) folgenden Aufbau:
Bit 0 wird alle 10 ms getoggelt
Bit 1 wird alle 100 ms getoggelt
Bit 2 wird alle 500 ms getoggelt
Bit 3 wird alle 1000 ms getoggelt.
Das höhere Nibble möchte ich jetzt so benutzen, dass Bit 4 alle 10 ms,
Bit 5 alle 100 ms ,,... jeweils fuer einen Programmzyklus auf 1 gesetzt
werden.
Am Ende vom Hauptprogramm wird also das höhere Nibble wieder gelöscht.
Nur: wie erzeuge ich diese Impulse ? Im Interrupt selbsr darf es nicht
geschehen, denn dann könnte es ja mitten im Ablauf des Programms eines
der bits gesetzt werden, am Ende wieder gelöscht. Es muss also am
Anfang des Hauptprogramms geschehen.
Aber wie ? Auf Flankenwechsel darf ich nicht anfragen, im ungünstigsten
Fall würde ja kein Flankenwechsel vorkommen (wenn beispielsweise der 10
ms Takt 2 mal wechselt)

Wäre für jeden Hinweis dankbar ...
Greetings
Karlheinz

von Dirk Schnitzler (Gast)


Lesenswert?

Hi Karlheinz!

Ich verstehe ehrlich gesagt deine Frage nicht 100%-ig.
Braucht deine Main-Loop länger als 10ms für einen
Zyklus? Wo liegt das Problem, wenn du am Anfang des
Zyklus deine, im Interrupt bereits gesetzten, Flags
prüfst und die Bits im High-Nibble dementsprechend setzt
und sie vor Wiederholung der Mainloop wieder löschst?

Gruß, Dirk.

von thkais (Gast)


Lesenswert?

Du setzt das entsprechende Bit im Interrupt.
Im Hauptprogramm wird das Bit abgefragt, und der entsprechende
Programmteil nur bei gesetztem Bit ausgeführt. Am Ende dieses
Programmteils wird das Bit gelöscht.

von Karlheinz Druschel (Gast)


Lesenswert?

Hallo Dirk,
natürlich hast du recht. Aber was ist wenn die Main-Loop wirklich
länger als 10 ms braucht ? Dann funzt es nicht, denn dann wird
innerhalb der Mainloop der Interrupt nochmal aufgerufen, das Bit
getoggelt und am Anfang der nächsten Mainloop wird kein Wechsel
erkannt.

Thkais: Das funzt nicht. Denn der Interrupt tritt mit Sicherheit nicht
genau am Anfang der Mainloop auf. D.h., wenn ich im Interrupt ein Bit
setze und am Ende der Mainloop wieder lösche, dann ist es nicht während
eines gesamten Zyklus der Mainloop gesetzt!

von thkais (Gast)


Lesenswert?

Du fragst doch sicherlich innerhalb des Mainloops ab, ob das Flag
gesetzt ist, um entsprechende Aktionen auszuführen. Setze das Flag nur
dann zurück, wenn diese Aktionen ausgeführt wurden, nicht grundsätzlich
am Ende des Mainloops.

von Dirk Schnitzler (Gast)


Lesenswert?

Wenn deine Mainloop länger als der Interruptinterval dauert, dann ist
das Konzept mit den Timeflags in dem Interrupt selbst falsch. Dann ruf´
lieber eine Funktion (z.B. mng_tf()) am Anfang der Mainloop auf und
bearbeite dort deine Toggelflags und das andere Zeugs. Dann brauchst du
im Interrupt nur ein 10ms-Flag zu setzen.

Gruß, Dirk.

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.