Forum: Mikrocontroller und Digitale Elektronik Menüsteuerung ohne Ruckler


von Alexander S. (theredx)


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

von Sven P. (Gast)


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

von micha (Gast)


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.

von Peter D. (peda)


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

von Falk B. (falk)


Lesenswert?


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.