GPIO Einlesen

  • Hallo liebe Pi Freunde.
    Ich bastel nun schon einige zeit mit meinem Pi rum und versuche derzeit Pegel an einem Pin einzulesen. Das setzten der Pins ist mir ohne Probleme gelungen. Ich nutze de bcm2835.h und die entsprechenden Beispielprogramme. Blink.c läuft wie gesagt ohne Probleme. Leider passiert bei event.c nichts :(
    Ich habe bis jetzt den Pin mit Masse und mit 5V verbunden aber keine Reaktion. Jetzt habe ich hier im Forum gelesern, dass die Pins nicht mehr als 3,3V vertragen. Bei der Variante über die virtuellen Dateien hat das einlesen eines 5V Pegels am GPIO 17 (Pin11) aber problemlos funktioniert.


    Hat jemand ähnliche Erfahrungen gemacht und kennt eine Lösung?
    Über Tips und Trick wäre ich sehr dankbar.
    mfg Hansen

  • Wenn Du die IOs mit mehr als 3,3Volt beschaltest machst Du den Pi über kurz oder lang sicher kaputt.


    Wenn Du Dir die event.c mal ansiehst, siehst Du , daß GPIO15 auf Eingang geschaltet wird.

    Code
    bcm2835_gpio_fsel(PIN, BCM2835_GPIO_FSEL_INPT)


    Danach wird der Pullup-Widerstand eingeschaltet

    Code
    bcm2835_gpio_set_pud(PIN, BCM2835_GPIO_PUD_UP);


    Jetzt liegt immer ein Highpegel an dem Pin an.
    Danach wird der Pin so eingestellt, daß er einen Low-Pegel erkennt.

    Code
    bcm2835_gpio_len(PIN);


    Das heißt, wenn Du den Pin jetzt mit GND verbindest wird das Event ausgelöst, auf das

    Code
    if (bcm2835_gpio_eds(PIN))


    wartet und Du bekommst die Ausgabe.

    Code
    printf("low event detect for pin 15\n");


    Edit: Unsinn mit falscher Pin-Nummerierung gelöscht.

    Edited once, last by orb ().

  • orb
    Danke für die schnelle Antwort. Da ich eine kleine Blingeberschaltung am GPIO17 (P11) hab, hab ich die Änderung wie von dir bschrieben schon von vornherein vorgenommen. Ich werde es gleich noch mal an 3,3V und vielleicht nen anderen Pin probieren.


    Hab jetzt einfach mal auf


    Code
    #define PIN RPI_GPIO_P1_16


    geändert und GPIO 23 hochohmig mit GND verbunden. Leider wird kein Lowpegel gemeldet. Ich hab das Pin auch vorher noch nie verwendet.
    Übersetzten lässt sich das Programm ohne Probleme.


    Nachtrag:


    wenn ich die Zeile

    Code
    // bcm2835_set_debug(1);


    auskommentiere wird fotlaufen eine Adresse angezeigt die ändert sich abwechseln zwischen 20003008 und 20003004,
    wenn ich nun besagtes Pin mit Masse verbinde hält die Anzeige an. Wenn ich das Pin wieder los lasse werden wieder fortlaufend die beiden Adressen abwechselnd angezeigt.


    Kann sich vielleicht ein versierter Pi-Fuchs einen Reim darauf machen?

    Edited once, last by Hansen ().

  • Hochohmig mit GND verbinden macht keinen Sinn, Du mußt gegen den Pullup-Widerstand ankommen. Dafür ist ein Stück Draht die beste Lösung.
    Wenn Du den Debug-Eintrag aktivierst soll das Programm garnicht mehr auf die IOs reagieren.


    Ich hab heute leider keine Zeit das zu testen, ich werd es mir morgen mal ansehen.

  • Das Problem hochohmig ist mir auch aufgefallen, so dass ich auch die Variante "Draht" ausprobiert habe. Zur absoluten Sicherheit hab ich wärend des Draht anstecken und absteckens die Spannung am Pin mit dem Oszi überprüft. Die wechselt auch zwischen 3.3V und 0V.
    Jetzt ist mir beim durchmessen der anderen Pins aufgefallen, dass manche, obwohl nicht aktiviert, auch einen 3.3V Pegel hatten andere aber nicht (Ich weiß das es mehrere 3.3V Spannungspinns gibt, ich meine an den GPIO's). Finde ich merkwürdig.


    Gruß Hansen

  • Du hast bei vielen Pins noch zusätzliche Funktionen die sie übernehmen können. Je nach System das Du einsetzt sind die schon aktiviert.
    [Blocked Image: http://orb-soft.de/temp/gpio.png]
    GPIO 0 und 1 (P1-3 und 5) werden als I2C-Bus benutzt, im Raspbian werden die Module standardmäßig nicht geladen
    GPIO 15 und 15 (P1-8 und 10) werden als serielle Schnittstelle benutzt (/dev/ttyAMA0) und sind in jedem System aktiv
    GPIO 7,8, 9,10 und 11 (P1-19, 21-24 und 25) werden als SPI-Bus benutzt, im Raspbian werden die Module standardmäßig nicht geladen
    GPIO 4 (P1-7) wird vom OneWire-Bus benutzt, die Module mußt Du auch erst laden.
    Wenn Du zum Beispiel das System von Lady Ada benutzt sind alle Zusatzfunktionen aktiv.

  • So hab jetzt mal die Pegel an den Pins 11,13,15,16,18 und 22 vor dem Starten des Programms (event.c) gemessen.
    Das solten ja die Pins sein, die keine Zusätzliche Funktion haben (laut GPIO Cheat Sheet). Die hatten alle einen Pegel von 0V.
    Wenn ich das Programm starte haben Pin 11,16,18 und 22 eine Pegel von 0.15V. Pin 13 hat 0V und Pin 15 hat 3.3V , wird also offensichtlich durch Pull-Up auf 3.3V gezogen. Die Initialisierung scheint also zu funktionieren. Leider reagiert das Programm nicht auf 0V am Pin 15.


    Nachtrag:
    Mir ist gerade aufgefallen, dass ich wenn der entsprechende Pin auf Masse gelegt wird das Programm auch nicht beenden kann (mit strg+C). Erst wenn ich die Verbindung zur Masse entferne wird das Programm beendet.
    Ich arbeite mit dem Pi auschließlich über Konsole mit Putty. Normalerweise sollte das ja keine Relevanz haben aber man weiß ja nie.


    Nachtrag2:
    Hab jetzt fast alle Pins mal durch. Jetzt ist mir folgendes aufgefallen. Wenn ich den entsprechenden Pin auf Masse lege reagiert der Pi überhaupt nicht mehr, auch wenn das Programm garnicht läuft. Erst nach lösen der Verbindung tut sich wieder etwas (nimmt der Pi Eingaben entgegen)
    Das ist doch sehr merkwürdig, oder?

    Edited once, last by Hansen ().

  • So liebes Forum, da offensichtlich kein anderer Raspberrynutzer ein ähnliches Problem hat bzw. hatte und ich mir zwischenzeitlich selber helfen konnte, schließe ich das Thema.


    Noch kurz zu meinen Erkenntnissen:


    1. Es lag nicht speziel an meinem pi. Das selbe problem trat auch mit einem anderen auf.
    2. Es liegt höchst wahrscheinlich an der Funktion

    Code
    bcm2835_gpio_len();


    sobald diese einkommtiert wird bleibt der pi bei ziehen des Pins auf Masse hängen.


    3. Ich habe jetzt das Programm input.c als Basis genommmen und kann so Impulse an einem Pin bis ca 100Hz genau einlesen. Das heißt bei 100 Hz bekommt er von 10100 Impulsen 10074 mit und bei 1kHz von 1100 Impulsen noch 523. Den prozentualen Fehler kann sich ja jeder selber ausrechnen.
    Viele Grüße Hansen