C Code Problem mit GPIO

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo zusammen,
    ich bin gerade etwas am rumexperimentieren mit den gpios und wiringpi.
    Das ganze will ich in c realisieren.
    Was ich zurzeit versuch ist folgendes.

    Ich hab einen Taster auf einen Port geschalten. Sobald ich den Taster betätige soll "hallo" kommen. Allerdings nur ein einziges mal. Wenn ich den Taster wieder los lasse, passiert nichts. Erneutes betätigen gibt mir wieder "hallo" aus. Ich habe soweit alles eingebunden und auch deklariert.
    Mit meinem Code gibt er es allerdings nicht aus.

    Er gibt mir hier nicht "hello" aus.
    Wenn ich allerdings on=1 entferne so das er die If-Schleife immer abarbeiten kann, dann funktioniert es zwar mit dem Ausgeben, allerdings gibt er es dann mehrere male aus.
    Dann habe ich es noch auf meinem PC mit Visual Studio versucht. Dort kann ich natürlich keine Eingänge einlesen. Da setzte ich eben über die Tastatur. Dort funktioniert es allerdings.

  • Hallo Marcel,

    ohne Schaltung wird es schwierig zu analysieren, was Deine Software anstellen soll.

    Je nach dem, ob Du einen Pull-Up oder Pull-Down-Widerstand eingebaut hast, erhältst Du beim Tasten eine 1 oder eine 0.

    Als ersten Versuch würde ich mal die beiden Zeilen if (digitalRead(3) vertauschen:

    Mit ein wenig Glück hat es schon daran gelegen.

    Bei einigen GPIO-Libraries hast Du die Möglichkeit, mit einem Befehl die Bedeutung der Impulse umzukehren. Dann würde Dein Programm nur mit einem Zusatzbefehl funktionieren.

    Beste Grüsse

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Einmal editiert, zuletzt von Andreas (31. Juli 2014 um 14:58)


  • ....Eigentlich solle es ja so schon passen vom Aufbau her.


    eigentlich :lol:
    ne OK, der Aufbau ist brauchbar nur was versprichst du dir von einem Luftwiderstand ?

    1,8MegaOhm ist etwas viel, hast du eine ungefähre Vorstellung was das bedeutet ?

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • Hallo Marcel,,

    schau mal hier rein.

    Dort habe ich eine Schaltung aufgebaut und mit einem Programm den Status der GPIO-Pins abgefragt und entsprechende Aktionen angestossen.

    Ich kann mich erinnen, mit einem 10 - 11 kOhm Widerstand und einem zweiten von 300 bis 600 Ohm gearbeitet zu haben.

    Bei Deiner Schaltung wäre der 3V (soll wohl 3V3 heissen, oder?) mit GPIO23 kurzgeschlossen, wenn Du den Taster betätigst. Der wenige Strom, der über 1M8 abfliesst, ist berechenbar, aber geradezu vernachlässigbar.

    jar: Hält der GPIO-Pin das aus? Meiner Meinung nach nicht wirklich.

    Hmm, wenn ich nicht wirklich weiss, was ich tue, dann stecke ich die Schaltung auf einem Steckbrett zusammen, versorge das Teil mit 2x 1,5 V-Batterien, um das Steckbrett mit 3V zu versorgen und messe die Ströme. Nur wenn die Ströme "Raspi-kompatibel" sind, schliesse ich den Raspberry Pi an :thumbs1: - ansonsten gehe ich in mich und grüble weiter :s.

    Anderenfalls ist der Pi hi... =(


    Beste Grüsse

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    2 Mal editiert, zuletzt von Andreas (8. Oktober 2017 um 17:58)

  • Tach ...

    hmm ... sieht auf den ersten Blick ganz brauchbar aus.
    Zunächt stellt sich mir die Frage: was ist "off" ??
    na gut, nehmen wir einen int mit dem Wert 0 an.

    Sollte funktionieren. Ich hoffe ich hab' jetzt keinen Denkfehler eingebaut.
    Ich glaube, der Fehler war der fehlende Zeilenvorschub, damit die Ausgabe auch erfolgt und nicht gepuffert wird.
    Wenn Du den Taster oft genug betätigt hättest, wäre irgendwann wohl auch eine Kette "hello" ausgegeben worden.
    //EDIT:
    Zur Schaltung haben schon andere, kluge Menschen was gesagt ... "Luftwiderstand", finde ich, ist eine niedliche Umschreibung :) ...

    Ganz wichtig! Hatte ich jetzt im Eifer des Gefechts vergessen: dem RPi Luft zum Atmen lassen ;) ... mit delay()


    cheers,
    -ds-


  • jar: Hält der GPIO-Pin das aus? Meiner Meinung nach nicht wirklich.
    Andreas

    solange wir hier reden hält der das aus, aber was meintest du wirklich ?

    ob der GPIO Adaptionen von Unwissenden aushält ? Wie hier schon vorgekommen kann das GPIO und damit PIs töten.

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • solange wir hier reden hält der das aus, aber was meintest du wirklich ?

    ob der GPIO Adaptionen von Unwissenden aushält ? Wie hier schon vorgekommen kann das GPIO und damit PIs töten.

    Hallo Jar,

    klar, wenn wir nur reden und niemand auf den Taster haut, ist die Welt in Ordnung.:angel:

    Was ich befürchte, wenn denn mal jemand auf den Taster drückt, dann fliesst ja der Strom wegen des 1M8 quasi ungehindert über den GPIO ab. Möglicherweise / wahrscheinlicherweise mehr als das Teil auszuhalten imstande ist.

    Meiner Meinung nach fehlt da ein Widerstand zwischen Taster und GPIO, der einen Kurzschluss verhindert (da der 1M8 ja überdimensioniert ist).

    Beste Grüsse

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.


  • Hallo Jar,
    Was ich befürchte, wenn denn mal jemand auf den Taster drückt, dann fliesst ja der Strom wegen des 1M8 quasi ungehindert über den GPIO ab. Möglicherweise / wahrscheinlicherweise mehr als das Teil auszuhalten imstande ist.

    also genauer,

    "Normalerweise" passiert nix, der GPIO als in ist hochohmig !
    Da fliesst kein zerstörerischer Strom wenn der Taster nach 3,3V gedrückt wird.

    Was passieren kann, der PIN wurde von irgend jemanden falsch auf Ausgang geschaltet, egal ob Programmierfehler oder Amok laufende Software und der PIN ist low ! wenn dann jemand den Taster drückt wäre das ein Kurzschluß der den GPIO Pin und oder PI töten kann.

    Taster ungebremst nach high 3,3 V ist nie ne gute Idee.
    Besser ist immer, Vorwiderstand nach 3,3V an GPIO und Abfrage auf Taster nach GND -> low -> 0.

    1. wird der Strom von 3,3V durch einen Widerstand begrenzt -> 3,3k (1mA) bis 10k (0,3mA)
    2. kann falsche Software keinen Schaden dort anrichten.

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • Hallo Jar,

    das schreibe ich doch die ganze Zeit: Sicherer ist ein Widerstand zwischen GPIO und 3V3. Dann kann die Software sich mal daneben benehmen, ohne dass die Hardware einen Schaden nimmt.

    Beste Grüsse

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.


  • Hallo Jar,

    das schreibe ich doch die ganze Zeit: Sicherer ist ein Widerstand zwischen GPIO und 3V3.

    wo habe ich dir widersprochen ? :s

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • dreamshader
    Danke für den Code. So funktioniert es nun.
    Ohman sagt blos das ganze ging nicht, weil ich \n nicht hatte?
    Wenn ich das an deinem Code entferne, wird es auch nicht ausgebgen. Sobald es wieder dran ist funktioniert es...:/

    Was mich jetzt aber noch interessiert ist das mit dem Luftwiderstand ;)
    Ich war/bin der Meinung, dass so ein Pull down Widerstand funktioniert. Ich ziehe doch den Eingang auf Masse runter. Und damit ich kein Kurzschluss hab, wenn der Taster betätigt ist, habe ich mein Widerstand drin.

    Dann habe ich beim Schalter noch einen 33K Widerstand in Reihe geschalten. Schlagt mich mich jetzt weil ich wieder so einen großen Wert hab. Aber ich hab mal wieder nur widerstände bis 470 Ohm und dann wieder so gewaltig große. Aber der Taster lässt sich so zumindest noch betätigen. Somit kann es ja nicht schaden.

    Einmal editiert, zuletzt von marcel (31. Juli 2014 um 19:36)


  • Was mich jetzt aber noch interessiert ist das mit dem Luftwiderstand ;)
    Ich war/bin der Meinung, dass so ein Pull down Widerstand funktioniert. Ich ziehe doch den Eingang auf Masse runter.

    tust du das mit 1,8M Ohm ? mit welchem Strom bitte ?

    Jeder Huster in der Zuleitung, jeder vorbeilaufende der ein kleines Feld induziert lässt diesen "low" Pegel hüpfen ;)

    definiert als low kann man das bei 1,8 M Ohm wirklich nicht nennen ! Da kannst du gleich die Leitung offen lassen :lol: (1,8µA ist wirklich leicht zu überlisten)

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • Hi Marcel,


    dreamshader
    Danke für den Code. So funktioniert es nun.
    Ohman sagt blos das ganze ging nicht, weil ich \n nicht hatte?
    ...

    auch ;) ...
    Ganz wichtig und bitte für die Zukunft beachten: delay() einbauen, sonst rast das Programm mit annähernd 100% CPU Last und andere Prozesse haben kaum eine Chance, etwas Zeit abzubekommen. Mit anderen Worten: Dein ganzes System wird sehr, sehr träge ...
    Zudem hattest Du zwei Abfragen drin ... sollte man auch nicht machen. Ein read() reicht - sonst unterschlägst Du evtl. mal eine Eingabe.

    cheers,
    -ds-

Jetzt mitmachen!

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