mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Problem mit Timerflags


Autor: Karlheinz Druschel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Dirk Schnitzler (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: thkais (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karlheinz Druschel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: thkais (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Dirk Schnitzler (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.