www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Menüsteuerung ohne Ruckler


Autor: Alexander Schmidt (theredx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

Ich Arbeite gerade an einer Menüsteuerung für eine Haussteuerung die 
Dinge einstellen kann wie zum Beispiel Licht, Heizung, Fenster die 
Hausüberwachung.
Ich Arbeite mit einem Atemga2561 und einem Display3000.
Außerdem benutze ich Bascom zum erstellen des Menüs.
Mein Problem ist nicht die Erstellung des Menüs an sich, sondern die 
auftretenden Schwierigkeiten wenn ich zum Beispiel die Uhrzeit, Datum 
und die aktuelle Raumtemperatur auf dem Display ausgeben möchte, aber 
auch gleichzeitig immer auf Eingaben des Nutzers warte. Dabei kommt es 
zu wie ich es nenne "Verschluckern". Da der µC noch dabei ist die 
Uhrzeit auf das Display zu Schreiben kann er nicht gleichzeitig schauen 
ob Eingaben getätigt werden. Daher muss man Manchmal etwas auf den 
Tasten bleiben damit die Befehle verarbeitet werden.(Wenn man zu kurz 
drück kann auch mal gar nichts Passieren)
Mein erster Gedanke war es, um dem entgegen zu wirken, die Eingaben der 
Steuerung über einen Timer/Counter laufen zu lassen und die Menüelemente 
in der Hauptschleife aufbauen zu lassen. Allerdings ist es mir bisher 
noch nicht gelungen dies zu Realisieren, da ich nicht weiß wie ich die 
beiden dann wieder zusammen führen kann ohne am ende wieder denselben 
Effekt zu haben.
Kann sein, das ich das jetzt nicht so gut rüber gebracht und ihr euch 
frag was ich von euch will darum meine Frage.
Ist das mit dem Timer/Counter ne gute Idee oder haut das nicht hin?
Wenn nicht, wie könnte man es sonst machen?

Mit Freundlichen Grüßen

The Red X

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Fang die Eingaben (wie auch immer geartet) mit Interrupts ab, um eine 
globale Flagge zu setzen. Die kannst du dann in aller Ruhe in der 
Hauptschleife abfragen (und danach auch dort wieder löschen).

Autor: micha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Doch, denke Deine Ideen gehen in die Richtige Richtung. In der 
Hauptschleife ein Flag, welches Dir anzeigt ob das Display neu 
gezeichnet werden muss. Wenn ja dann "Neuzeichnen" aufrufen und das Flag 
zurück setzen. Alles andere über Timer (Uhrzeit) und Interrupts 
(Tasten). Dabei die jeweiligen Interrupt-Funktionen so kurz wie möglich, 
NIEMALS im Interrupt Zeit vertrödeln und Display direkt beschreiben/Auf 
Tasten warten ec.

Eingabetaste X gedrückt --> Tastenzähler für X erhöhen, Display-Flag 
setzen
Timer/Uhrzeit --> Änderung speichern --> Dispalyflag

Wenn Du ein mehrzeiliges Menu hast, kann man z.B. bei der Uhrzeit 
jeweils nur den sich änderenden Teil scheiben.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alexander Schmidt wrote:

> Mein Problem ist nicht die Erstellung des Menüs an sich, sondern die
> auftretenden Schwierigkeiten wenn ich zum Beispiel die Uhrzeit, Datum
> und die aktuelle Raumtemperatur auf dem Display ausgeben möchte, aber
> auch gleichzeitig immer auf Eingaben des Nutzers warte. Dabei kommt es
> zu wie ich es nenne "Verschluckern". Da der µC noch dabei ist die
> Uhrzeit auf das Display zu Schreiben kann er nicht gleichzeitig schauen
> ob Eingaben getätigt werden.

Warum denn nicht?

Kann ich mir überhaupt nicht vorstellen, meine AVRs drehen meistens nur 
Däumchen.
Ich benutze zwar keine Grafikdisplays, aber ne Textausgabe sollte dort 
auch nur wenige ms dauern.


Du solltest vielleicht erstmal analysieren, wo die ganze Rechenzeit 
verbraten wird, denn davon hast Du beim AVR mindestens 10-mal mehr als 
reichlich.

Und dann die Tasks, welche die großen Zeitdiebe sind, entweder nur so 
oft aufrufen wie nötig oder wenn sie Delays beinhalten, diese Delays 
über Timer machen und die freiwerdende Rechenzeit der Mainloop 
zurückgeben.

Es hat sich außerdem bewährt, das Tastenentprellen und Druck erkennen im 
Timerinterrupt (~10ms) zu machen. In der Codesammlung ist ne effiziente 
8-Tastenroutine.

Es ist weiterum oft sinnvoll, die Displayausgabe auch im Timerinterrupt 
zu machen, damit es nicht zu oft geschieht und der Bediener es überhaupt 
ablesen kann.

Wichtig ist es, die einzelnen Aufgaben zu unterteilen und nicht wie an 
einer Schnur hintereinander aufzureihen (Spaghetticode).
Und dann in der gerade benötigten Reihenfolge und in einem sinnvollen 
Zeitintervall aufzurufen.

Ich würde für größere Projekte auch C vorschlagen, da man damit 
effizienter programmieren kann (strukturiert, schnell, codesparend).


Peter

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

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.