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
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.
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.
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!
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.