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