www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Hilfestellung


Autor: Thomas Leist (Gast)
Datum:

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

Autor: Tobi (Gast)
Datum:

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

Autor: ...HanneS... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dabei könnte ein Timer dein Freund sein.

...

Autor: Thomas Leist (Gast)
Datum:

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

Autor: ...HanneS... (Gast)
Datum:

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

...

Autor: Simon (Gast)
Datum:

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

Autor: Thomas Leist (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok ok,

jetzt hab ichs glaub verstanden!

Danke schön

Autor: Thomas Leist (Gast)
Datum:

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

Autor: ...HanneS... (Gast)
Datum:

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

...

Autor: Thomas Leist (Gast)
Datum:

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

Autor: ...HanneS... (Gast)
Datum:

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

...

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.