Problem mit Timerflags

Gast #50531
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
Gast
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.
Gast
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.
Gast
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!
Gast
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.
Gast
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 23 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.