Forum: Mikrocontroller und Digitale Elektronik Hilfestellung


von Thomas Leist (Gast)


Lesenswert?

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

von Tobi (Gast)


Lesenswert?

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

von ...HanneS... (Gast)


Lesenswert?

Dabei könnte ein Timer dein Freund sein.

...

von Thomas Leist (Gast)


Lesenswert?

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

von ...HanneS... (Gast)


Lesenswert?

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.

...

von Simon (Gast)


Lesenswert?

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).

von Thomas Leist (Gast)


Lesenswert?

ok ok,

jetzt hab ichs glaub verstanden!

Danke schön

von Thomas Leist (Gast)


Lesenswert?

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

von ...HanneS... (Gast)


Lesenswert?

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.

...

von Thomas Leist (Gast)


Lesenswert?

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

von ...HanneS... (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.