[C/C++] Pull Down Button Input

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo, ich beschäftige mich noch nicht allzulange mit Schaltungen, Dem PI und insbesondere mit C/C++.
    Aber nun zum Problem. Ich habe eine Schaltung die wie folgt ausschaut.

    vrxwccuy.png

    Ich möchte nuneigentlich ganz einfach mit einem C programm abgreifen ob der Pin auf HIGH steht oder eben nicht. Das ganze funktioniert mit folgendem Code auch ganz gut. Ich benutze übrigends wiringPi in der aktuellsten version.

    Code
    for (;;)
    {
     if(digitalRead(0) == HIGH) {
      printf("Pressed!\n");
     }
    }

    nun ist das aber recht suboptimal wenn mein eine aktion durchführen möchte da diese aktion natürlich wie das printf solange immer wieder ausgeführt wird bis der pin 0(wiringPi numerierung,eigentlich 17) auf low steht. Nun habe ich den code soweit angepasst das er wie folgt ausschaut.

    Rein von der Logik her... zumindest meiner :) sollte nun eigentlich nur einmal die aktion ausgeführt werden pro druckphase thes buttons.

    Also entweder ich habe einen denkfehler oder irgendetwas stimmt mit dem code nicht.
    Sollte mir jemand helfen können wäre ich sehr dankbar.

  • Wenn du die Taste länger drückst, wirst du feststellen, das der Code ca. 4 bis 5 mal ausgeführt wird und danach nicht mehr. Diese Phämonen hängt mit dem sogenannten Prellen des Tasters zusammen.
    Ein Taster ist eben kein ideales Bauelement was nach dem Drücken den Kontakt sofort herstellt, sondern der Kontakt oeffnet und schliest sich einige Male bis dann als Endzustand hergestellt wird.

    MfG Turbotoni

  • nein das ist eben nicht der fall... :D solange ich drauf drücke 3 oder 10 sec solange gibt er das "pressed" aus im ersten beispiel. im 2ten gibt er garnichts aus

    ich wäre natürlich für alternativvorschläge dankbar. im endeffekt möchte ich einen code nach druck auf den taster einmal pro druck ausführen

    BASIC für den PI -> Tutorial

    Einmal editiert, zuletzt von ruohki (16. November 2013 um 14:05)

  • Brauchst Ja Nur in Der schleife vom 1 Beispiel reinschreiben if High goto pressed und darin dann den Befehl/ Funktion Die er ausgeben soll sollte nix sein bleibt er in Der Abfrage schleife ... Die Frage is Nur Wie sehr durch Die Funktion Der Prozessor ausgelastet wird ...

  • wenn ich im ersten beispiel einen code oder goto oder whatever hinzufüge führt er den solange aus wie der pin HIGH ist und das ist solange wie der knopf gedrückt ist. Ich will aber das der code pro druck egal wie lange nur einmal ausgeführt wird und das sollte bsp 2 eigentlich tun aber es passiert halt garnichts im 2ten beispiel

    Edit: Hmm mir ist aber grad eine idee gekommen durch deinen post.


    kanns leider nicht testen da mein pi nicht bei mir ist :/ die limitierung währe in dem beispiel halt das anderer code der in de rschleife läuft wie etwa das updaten eiens lcd oder was auch immer still steht und halt auch nur ein button erkannt werden kann

    BASIC für den PI -> Tutorial

    Einmal editiert, zuletzt von ruohki (16. November 2013 um 15:19)


  • ... if High goto pressed...

    Moin beinander,

    ein goto in C ... Junge, Junge, wer hat Euch das beigebracht :irre:

    Zu Deinem Problem mit dem Taster:
    Ich würde das über eine ISR mit pigpio oder wiringPi lösen.
    Sobald eine ansteigende Flanke aniiegt, löst dieser Zustand einen Interrupt aus, in den Du Dich mit Deiner Routine einhängst (Taste gedrück).
    Mit einer zweiten Interrupt Service Routine fängst Du die fallende Flanke ab (Taste gelöst).


    cheers,
    -ds-

  • Moin beinander,

    ein goto in C ... Junge, Junge, wer hat Euch das beigebracht :irre:

    Zu Deinem Problem mit dem Taster:
    Ich würde das über eine ISR mit pigpio oder wiringPi lösen.
    Sobald eine ansteigende Flanke aniiegt, löst dieser Zustand einen Interrupt aus, in den Du Dich mit Deiner Routine einhängst (Taste gedrück).
    Mit einer zweiten Interrupt Service Routine fängst Du die fallende Flanke ab (Taste gelöst).


    cheers,
    -ds-

    was ist denn eine "ISR"?
    edit... hat sich geklärt ich bin dämlich :)

    BASIC für den PI -> Tutorial

    Einmal editiert, zuletzt von ruohki (16. November 2013 um 17:15)


  • Naja is the hard way Aber in Der Schule anno 2003 hats geklappt, iwo zuhause hab i noch Die Orange c fiebel rumliegen und eben nicht bei Der Hand sonst wäre ich hilfreicher am weg

    hab bisl in der wiringpi doku rumgeschnuppert da gibts direkt support dafür uuuund asynchrone threads die man zum abfangen nutzen kann

  • Sooooooo nach einiger Zeit komme ich nun endlich zum Testen.

    Ich habe mich nicht an Interrupts gemacht sondern den FreeBasic Port auf meinen Raspi gezogen und wiringPi in FreeBasic nutzbar gemacht. Und nun der Knaller: der Code nach Basic konvertiert funktioniert genau wie erwartet, in C keine Chance :S....

    Naja da mir eh Basic sympathischer ist und freebasic ja auch quasi den gcc/gas nutzt werde ich wohl dabei bleiben bevor ich mir jetzt extra zum PI programmieren C/C++ reindresche ^^.

    Wer interessiert ist an einem PI/FB/wPi Tutorial der möge sich melden.

    Trotzdem nochmal danke für die Lösungsansätze

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!