Hallo liebe MC-Mitglieder, folgendes Problem stellt sich mir gerade: ich habe auf meinem Board 3 Taster, 1 Temperatursensor (DS1621),1 RealtimeClock (DS1338) und ein LC-Display. Ich möchte in meinem Programm eine Abfrage einbauen, welcher Taster gedrückt wird. Taster 1 soll die Funktion "Temperatur anzeigen" ausführen, Taster 2 soll "Uhrzeit anzeigen" starten und Taster 3 soll es ermöglichen, den RTC-Baustein einmalig zu beschreiben. Ich bin gerade am rätseln, wie ich eine Abfrage schreibe, welcher Taster gedrückt wurde und wie ich dann in die entsprechende Schleife wechsle. Den aktuellen Programmcode findet ihr im Anhang. Bisher sieht mein Programmablauf so aus, dass das LC-Display erst alle 3 Optionen anzeigt (parallel dazu leuchten die LEDs neben den entsprechenden Tastern) und dann in eine Schleife wechselt, in der das Programm darauf wartet, dass ein Taster gedrückt wird. Ich habe nur das Problem, dass ich mit einer if...else Schleife arbeite, in dieser Schleife dann auf dem LC-Display "Bitte Auswahl treffen" erscheint, aber diese Schleife nur verlassen wird, wenn Taster 1 gedrückt wird. Dann springt das Programm automatisch zum Vorgang der Temperaturerfassung und Anzeige. Vielleicht hat hier der ein oder andere eine Anregung oder einen Tip, der mich weiterbringt. Es soll möglich sein, während der Anzeige "Bitte Auswahl treffen", eben einen Taster nach Wunsch zu drücken und dann in eine entsprechende Schleife zu wechseln (Nicht wundern, dass bisher nur die Temperatur erfasst und angezeigt wird. Die anderen Funktionen möchte ich schreiben, wenn die Auswahl funktioniert). Vielen Dank schonmal und Gruß
Sebastian, bitte such dir mal andere Programm heraus und schaue nach, wie das gemacht wird. Die Idee ist: nur auf Eregnisse zu reagieren und dann dieses Ereignis in der while(TRUE) { /*code */ } Schleife ab zu arbeiten. Hier wird nicht gewartet und ALLE Aufgaben deines Programms werden hier realisiert ! Alles andere, wie z.B. die Tastenerkennung läuft per Interrupt. Siehe dazu die PeDa Tastenentprellung und Erkennung ! Link: [1] Beitrag "Re: Taste auswerten" Beispielprogramm [2] http://www.mikrocontroller.net/attachment/107805/c-src-110422-1.zip
...ohne deinen code gelesen zu haben: tasterauswertung: taster per interrupt entsprechendes flag in einem "tastenregister" setzen lassen programmverzweigung: sprungtabelle anlegen, programm-id's zuordnen und ins hauptprogramm nur die auswertung des id-registers legen. es kann dann aus jedem unterprogramm in jedes andere "geswitcht" werden, in dem man das id-register vor verlassen entsprechend setzt.... somit kann auf jedes ereignis optimal reagiert werden, es wird übersichtlich und selbst interruptroutinen können so die unterprogramme durch manipulation des id-registers steuern... klingt erst einmal wie mit kanonen auf spatzen schießen, aber diese struktur kann man halt universell bei kleinen als auch bei großen projekten anwenden. ....ansonsten kann man in deinem fall bei nur drei tasten natürlich den starren weg einer statischen abfrage gehen, aber wenn noch ein paar funktionen hinzu kommen, wirds schnell verworren...
Erstmal Danke für die Antwort. Muss mich mal in die Interrupts einarbeiten. :) Habe mich entschieden, die dritte Taste wegzulassen, da es Unsinn ist, eine Uhrzeit bei Bedarf auf den RTC zu schreiben. Das muss separat gemacht werden, da ich ja das aktuelle Datum brauche. Soll heißen: vor Start der Platine schreibe ich einmal mit einem extra Programm die Uhrzeit auf den RTC, danach übernimmt sowieso die Batterie und ich brauche nur einen Taster, der die Funktion "Datum auslesen" auslöst.
Sebastian P. schrieb: > Ich bin gerade am rätseln, wie ich eine Abfrage schreibe, welcher Taster > gedrückt wurde und wie ich dann in die entsprechende Schleife wechsle. Für Tastenabfragen und Entprellung gibt es hier schon reichlich Threads. Bitte nicht alles vorgekaut haben wollen, sondern erstmal selber suchen. Schleife ist ganz schlecht, das deutet auf Sackgassenprogrammierung hin. Die Tasten ändern nur eine Zustandsvariable und diese entscheidet dann, was in der Mainloop gemacht wird. D.h. die Mainloop ist die einzige länger (ewig) dauernde Schleife im gesamten Programm. Sebastian P. schrieb: > Den aktuellen Programmcode findet ihr im Anhang. *.txt ist keine gültige Source-Erweiterung. Poste das *.c oder *.asm oder bei mehreren Sourcefiles zippe sie. 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.