Programmierung Taster
-
Hall Freunde
habe ein Stück Code. Verstehe einiges daran nicht.if (!get_input_bit(IO_INPUT_1)) { // Abfrage S3 Port
delay(20); // Pause Entprellung
if (!get_input_bit(IO_INPUT_1)) { // Abfrage S3 bei loslassen
while (!get_input_bit(IO_INPUT_1))
{ } // ohne klammer geht nicht
mode++; // mode weiterschalten
switch (mode) // Abfrage mode
{
case 1:
IO_LEDS_GREEN_PORT = 0x04; // Green Port auf 0
IO_LEDS_RED_PORT = 0x08; // Red Port auf 1 / 120
break;Bei diesem Stück erfolgt eine Abfrage des Ports mit IO_Input_1. Durch die if while Schleife erfolgt nocj mal die Abfrage bei loslassen. Dazwischen liegt eine Entprellung. Nach der Klammer geht es mit switch weiter und es erfolgt eine Auswertung und Scahlaten der LED. Vorher werden die Variablen definiert, so das das Prg geht. Was ich nicht verstehe ist, wie erfolgt die Übergabe des Speicherinhalts in mode. Ich sehe keine Zuordnung oder Übergabe. Örtliche? Wie geht das mit den Tasten genau? Wie erfolgt eine Zuordnung der Ports mit 0x08?
Sorry, die Sachen sind mir unklar? Konnte auf den Seiten auch keinen klaren Antworten finden. An einigen Stellen wurde auf eine bessere Tastenabfrage hingewiesen.(WIKI) Diese erscheinen mir recht lang. Danke für eure Hilfe
Achim
-
der code kann doch von der logik fast nicht stimmen? da ich solche komischen functionen auch noch nicht gesehen hab gehe ich davon aus das du dir die selbst gemacht hast...
while(1){ if(is_on){ while(is_on); //action after keyrelease } }
-
achim S. schrieb:
Hall Freunde
Sorry, die Sachen sind mir unklar?
Ich glaube schon, ja.
achim S. schrieb:
if (!get_input_bit(IO_INPUT_1)) { // Abfrage S3 Port delay(20); // Pause Entprellung if (!get_input_bit(IO_INPUT_1)) { // Abfrage S3 bei loslassen while (!get_input_bit(IO_INPUT_1)) { } // ohne klammer geht nicht mode++; // mode weiterschalten switch (mode) // Abfrage mode { case 1: IO_LEDS_GREEN_PORT = 0x04; // Green Port auf 0 IO_LEDS_RED_PORT = 0x08; // Red Port auf 1 / 120 break;
Ich verstehe dein Programm leider nicht, oder was du da vor hast. Vor Allem wartest du erstmal 20 Zeiteinheiten, bevor du nochmal genau den gleichen Port abfragst. Das ist keine Entprellung.
Du musst sicher stellen, dass eine gewisse Zeit keine Eingaben ausgewertet werden. Das macht man beim Pollen aber anders:
Endlosschleife Taster Abfragen Wenn Taster gedrückt: gewünschte Aktion durchführen Warten Schleifenende
Besser ist aber, man nutzt einen Timer zum Entprellen. Man kann dann für unterschiedliche Taster verschiedene "Entprellbits" setzen und beim Pollen abfragen.
Deine gewünschte Aktion habe ich nicht verstanden. Willst du zwischen einer angeschlossenen Roten und einer angeschlossenen Grünen LED umschalten? Wenn du den Ausgangsport abfragen kannst (Ist bei einigen Prozessoren nicht direkt möglich), dann fragst du einfach ab, welcher Port gerade aktiv ist. Ansonsten nimmst du dafür Hilfsvariablen:
Wenn Rote LED Rote LED aus Grüne LED an Sonst Grüne LED aus Rote LED an
Welchen Prozessor verwendest du, welchen Compiler? Was funktioniert nicht? Wie ist dein Wissensstand? Welche Seite? Wer hat das Programm wofür geschrieben? Fragen über Fragen...
-
Hallo
eines kann ic dir versichern, diese Prg stammt nicht von mir. Ja es geht. Funktion ist folgende. Es erfolgt eine Abfrage des Ports. Beim drücken des Tasters passiert was. Weiiss selber nicht wie genau deas geht. Dann erfolgt kurze Pause und erneute Abfrage des Taster. Beim drücken passiert gar nichts. Beim loslassen geht es in die switch anweisung. Das ganze wird 3x durchlaufen. Es erfolgt für ein Zeiten das setzen von LEDs auch über ports. Nach Angabe des Entwicklers und Oder Programmiere ist das eine Einfache Abfrage des Taster über Port 1 (bei mir S3). Weiter oben im Prg wird die Variable mode definiert über uint8_t mode. Ich verwende AVR Studio 4 mit updates. Würde mich als Anfänger einstufen. Deshalb frage ich die Götter wie das geht. Die Literatur hilft mir nicht weiter. Die Ports sind vom Herstellervorgegeben und das komplette Prg läuft auf einem Modell und geht wirklich! Bleibt nur wider die Frage wie?
Achim
-
Ich zweifel irgendwie an der Qualität des Codes.
Mal in Pseudocode versuchen nachzuvollziehen, was da gemacht wird:
Wenn der Taster jetzt gedrückt ist, dann Warte 20 Millisekunden Wenn der Taster jetzt gedrückt ist, dann Warte solange der Taster gedrückt ist Schalte in den nächsten Modus Schalte den Ausgangsport entsprechend des Modus
Es funktioniert, ist aber sehr unschön. Änder mal die Entprellzeit auf eine Sekunde oder mehr, dann wirst du sehen, warum. Erweiterbar ist das auch nicht sonderlich.
-
Das ist eigentlich eine sehr gängige, wenn auch einfache Methode, Taster zu entprellen. Sicherlich könnte man das busy-waiting durch einen Timer in Hardware durchführen lassen, aber wenn man diesen nicht spendieren will (oder kann), dann macht man es halt so wie oben. Wenn das dann ein niederpriorer Interrupt ist, ist auch alles gut.
Ein besserer Ansatz wäre natürlich den Taster per AD-Wandler kontinuierlich zu samplen und ein physikalisches Modell des Tasters in SW abzubilden, mit welchem man dann das erwartete Prellen entsprechend matchen kann und somit nicht nur die Zustände an/aus/undefiniert sondern auch an/aus/angeprellt/halb-angeprellt/ausgeprellt/undefiniert/kaputt darstellen kann. Zudem kann man dadurch das sich über Alterung (Oxidation, mechanische Verformung/Ermüdung) ergebende Prellprofil adaptieren um die Wartezeit in SW so gering wie möglich zu halten. Könnte ja passierern, dass wirklich einmal ein Mutant mit einer Reaktionszeit <10ms daherkommt und das Gerät bedient. Der würde ja dann glatt zum Mediamarkt gehen und reklamieren...
-
Hallo Freunde
so blöd wie es klingt, der Code geht. Der mann hat mehr Prg geschrieben. Auch in anderen sprachen und für verschiedene Modelle. Ich habe im Netz gelese, das dieser Code nachteile hat. Kann also ausgehen das erbekannt ist und angewendet wird. Bei der Funktion sehe ich soweit durch das es eine if Schleife ist und diese nur verlassen wird wenn die Taste losgelassen wird. Bleibt dann noch meine Frage vom Anfang. wie erfolgt die Übergabe des Wertes auf mode? mode wird durch ++ gezählt. Es erfolgt also eine Auswertung der Betätigung. Doch wie?
Enttäuscht mich nicht. Möchte nicht über die Funktion diskutieren ob es geht oder nicht. Es geht einfach. Doch wie genau. Tim denke an das ! in der Klammer.
Kennt jemand einen anderen Code für die Abfrage Taster?
Achim
-
Tim schrieb:
Könnte ja passierern, dass wirklich einmal ein Mutant mit einer Reaktionszeit <10ms daherkommt und das Gerät bedient. Der würde ja dann glatt zum Mediamarkt gehen und reklamieren...
Richtig so! Man sollte auch an die Sau (Schnellste anzunehmende User) denken.
Ich habe die Methode ehrlich gesagt noch nie benutzt und auch noch nie in Quellcode gesehen. Aber... naja, man muss ja die Wartezeit nicht auf 1 Sekunde einstellen, daher ist die Methode wohl doch in vielen Fällen ausreichend.
-
achim S. schrieb:
if Schleife
If True or False or Perhaps then loop ... end loop; end if;
achim S. schrieb:
Es erfolgt also eine Auswertung der Betätigung. Doch wie?
Es wird ein Tastendruck abgefragt. Erfolgt der Tastendruck, wird eine Variable "Mode" um eins erhöht, wodurch der Modus geändert wird. "Mode++" fragt also den Taster nicht ab, das Programm erreicht diese Anweisung nur, wenn ein Tastendruck erkannt wird.