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.


Anmelden zum Antworten