Forum: Mikrocontroller und Digitale Elektronik Tasterabfrage (3 Taster sollen 3 unterschiedliche Funktionen auslösen)


von Sebastian P. (groteskeader)


Angehängte Dateien:

Lesenswert?

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ß

von Uwe (de0508)


Lesenswert?

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

von Noname (Gast)


Lesenswert?

>dass ich mit einer if...else Schleife arbeite

http://www.if-schleife.de/

:-)

von Sebastian P. (groteskeader)


Lesenswert?

:D

Ok, if-Abfrage.

von olaf (Gast)


Lesenswert?

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

von Sebastian P. (groteskeader)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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
Noch kein Account? Hier anmelden.