Also ich seh irgendwie nicht mehr so ganz durch. Folgendes: ich habe zwei Schalter welche über nen Mega8 jeweils eine Lampe zum Blinken bringen. So... Parallel soll aber noch nen LCD angesteuert werden, wo mit hilfe von Tasten sache ausgewählt werden können --> also ne menüführung etc. Jetzt hab ich mir das alles mal so überlegt und mir ist aufgefallen, dass sobald ich die Lampen blinken lassen will das Display ja nicht funzt, da der Controller mit dem Blinker beschäftigt ist. Erst wenn er damit fertig ist, kann er sich wieder ums LCD kümmern. Wie gesagt, ich steige nicht so richtig dahinter, wie so was funktionieren soll!?? Vielleicht kann mir ja jemand auf die Sprünge helfen. Thomas
für so etwas gibt es interrupts: das eigentliche programm wird in regelmässigen abständen kurz unterbrochen, um eine routine (das blinken) durchzuführen und arbeitet danach da weiter, wo es vorher aufgehört hat
ok, wenn das Blinken nun aber 5 Minuten dauert, wie sieht denn das dann mit dem Hauptprogramm aus? bleibt dies dann auch 5 minuten außerbetrieb? Die schalter nehmen dann je zwei interrupts ein um, sobald ein schalter betätigt wird, das unterprogramm auszuführen. ->OK Wieviele Interrups gibt es? und an kann man diese an jedem I/O Pin initialisieren? Was passiert wenn ich blinke und am LCD durch das Menü zappen will? Fragen über Fragen, aber danke für eure Antworten Thomas
Du musst zuerst einen Timer aktivieren, der dir alle paar Millisekunden einen Interrupt auslöst. In diesem Interrupt kümmerst du dich um deine Blinkerei. Dazu zählst du ein oder zwei Register hoch oder runter und schaltest bei bestimmten "Zählerständen" den Blinkport an oder aus. In diesem Interrupt kümmerst du dich um das Entprellen deiner Tasten. Dazu solltest du mal im WIKI nach "Entprellung" suchen. In der Hauptschleife fragst du dann die Tastenflags (die im Int gesetzt werden) ab, setzt sie zurück und reagierst darauf. Warteschleifen, die nur Rechenzeit vernichten, wird es nicht mehr geben, oder nur in ganz wenigen Sonderfällen. ...
Hi. Du brauchst nur einen Timer. den du dann einschältst, wenn eine taste gedrückt ist. jedesmal wenn der Timer euinen interrupt ausführt, wird die lampe entweder an oder ausgeschalten und dann gehts wieder mit dem normalen programm weiter, bis der timer wieder den interrupt auslöst. also wirst du beim menü zappen nichts von dem blinken mitbekommen (auf dem display jedenfalls nicht).
mmmhh, ich habe mir das alles nochmal durch den Kopf gehen lassen. Aber irgendwie bin ich anscheinend zu doof... Also, Ich aktiviere den Timer und der soll mir immer (ununterbrochen???) einen Interrupt auslösen. Frage: Warum muß denn andauernd ein Interrupt ausgelöst werden, wenn ich doch eingentlich nur dann einen brauche, wenn ich das Blinkprogramm aufrufen will?????? Oder ist das so gemeint, dass, wenn ich den schalter fürs blinken betätige, den Timer einschalte, welcher wiederum einen Interrupt auslöst, welcher zuständig für das blinken ist???!! Und irgendwie raffe ich das nicht, dass das Hauptprogramm von diesem Unterprogramm nicht (bemerkbar) unterbrochen wird??!! Nochmal zu Info: Um zu Blinken nehme ich einen Schalter (kein Taster)!!! Das Display besitzt für die Menüstrucktur Taster (zum Zappen) und es soll zur Statusanzeigen für diverse Sachen dienen (z.b. Batteriestatus, Umdrehungsmesser etc....) Herzlichen dank für eure Mühe Thomas
Der Timer sollte ständig laufen. Der Interrupt erfolgt immer (nur) beim Überlauf des Timers (falls du einen Überlauf-Int nutzt) und dauert nur so lange, bis seine Abarbeitungsroutine (die ISR) fertig ist. Du willst Tasten einlesen... Das geht nicht ohne Entprellung (jedenfalls nicht gut). Und das geht am besten in einem periodisch aufgerufenen Timer-Interrupt. Du willst blinken... Das geht am besten, wenn man in einem periodisch aufgerufenen Timer-Interrupt (mit bekannter und konstanter Aufruf-Frequenz!) eine weitere Variable (Register) hochzählt und bei Erreichen des gewünschten Wertes die gewünschte Schalthandlung auslöst. Manchmal geht Runterzählen und auf 0 prüfen besser, es kommt auf die Situation an. Sieh diese Timer-ISR einfach mal als einen Taktgeber, der viele deiner Aufgaben synchronisieren kann. Du möchtest ein Menü auf einem Display steuern. Dazu wäre es schön, wenn man den ausgewählten Menüpunkt blinken lassen kann. Manche LCDs können das zwar per Hardware, aber oft ist es einfacher, den Text jede volle Sekunde auszugeben und an den Teil des Textes, der blinken soll, eine halbe Sekunde später mit Leerzeichen zu überschreiben. Auch ein Wechsel zwischen Großbuchstaben und Kleinbuchstaben wäre denkbar. Mit einem sowiso vorhandenem Timertakt ist das alles kein Problem, die Timer-ISR setzt in einem speziellen Register jede volle Sekunde ein Flag und eine halbe Sekunde später ein anderes Flag. Diese Flags werden von der Hauptschleife abgefragt und, falls gesetzt, der zugehörige Job erledigt und das Flag wieder gelöscht. Ein frei laufender Timer-Int kann das Programm gewaltig vereinfachen. ...
ok ok ok, Also ist diese Timer-Interrupt Sache nichts anderes als ein Taktgeber. Ich brauch keine umständlichen Schleifen mehr bauen, sondern nehme diesen Interrupttakt um befehle aufzurufen/verwalten. das macht so langsam sinn :-) Danke dir
Ja sicher doch... Warteschleifen gibt es nur noch in Ausnahmefällen. Das meiste lässt sich per Timer-Int synchronisieren. Schau mal hier, da findest du erste Ansätze: http://www.mikrocontroller.net/forum/read-1-164017.html#164207 ...
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.