Kleines Problem mit ioctl und I2C Interface

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo,

    ich habe ein kleines Problem mit dem Befehl ioctl() bezogen auf das I2C Interface meines Raspberry Pi B+. Mein Ziel ist es mit Hilfe eines digitalen Portexpanders MCP23008 acht Relais ein- und auszuschalten. Um das I2C Interface anzusprechen habe ich mir die Seite "hertaville.com" angeschaut und nutze die dort vorgestellten Quelltexte. Allerdings in C und nicht in C++. Das aber sollte aus meiner Sicht nicht das Problem darstellen.

    Der Ablauf, um ein Relais einzuschalten ist wie folgt :

    1. Schritt : Auslesen des GPIO Registers des MCP, um zu prüfen, ob das Relais bereits angezogen ist (bzw. ob es angezogen sein sollte)

    2. Schritt : Ist der Ausgangszustand des entsprechenden Pins 'high', so verlasse ich die Funktion.

    3. Schritt : Logisches hinzufügen (oder-Verknüpfung) des zu schaltenden Relais damit ich nicht die anderen nicht ungewollt wieder ausschalte und zurückschreiben des neuen Sollwertes auf den MCP. Das gewünschte Relais zieht an.

    4. Schritt : Erneutes Auslesen des GPIO Registers des MCP's, um zu prüfen, ob der Sollwert auch tatsächlich beim MCP angekommen ist. Eine hardwareseitige Prüfung habe ich nicht eingeplant, soll auch so bleiben.

    Der Ablauf nochmals mit Beispielweren :

    0. Ausgangszustand : Relais 1 ist angezogen, alle anderen sind abgefallen

    1. Schritt : Relais 2 soll anziehen (Istwert ist 1)

    2. Schritt : Relais 2 ist noch nicht angezogen, also KEIN Rücksprung sondern weiter verfahren mit der Funktion

    3. Schritt : Anpassen und Schreiben des Sollwertes (Sollwert ist jetzt 1+2=3)

    4. Schritt : erneutes Auslesen des Istwertes (Istwert = 1)

    Der Istwert im Schritt 4 müsste aber 3 sein. Die Frage stellt sich also, warum ist der Istwert 1? Meine Vermutung geht in die Richtung "Puffer leeren". Ich weiß, dass im Ablauf unter Linux (vielleicht auch unter Windows) bestimmte Funktionen erst ausgeführt werden, wenn der "Puffer" gefüllt ist. Dieses Problem kann beispielsweise bei der Programmierung von Prozessen auftreten, wenn man 'cout()' aufruft um etwas auf der Konsole auszugeben.

    Meine Frage ist : Geht mein Gedanke in die richtige Richtung? Oder habe ich grundlegend etwas missachtet bzw. nicht verstanden?

    Ich hoffe, ich konnte den Programmablauf gut genug erklären. Falls nicht bin ich natürlich gerne bereite, offene Fragen zu beantworten.

    Vielen Dank im Voraus


    lg Torsten

  • Hi,
    wo ist der Code, um den es geht?
    Ohne den bleibt alles Spekulatius (ok, wir haben Vorweihnachtszeit, trotzdem keine gute Idee in Hinsicht auf Dein Problem).
    Und nein ... ich werde mir nicht irgendwo irgendwelchen Code anschauen/downloaden ... ich hätte da schon gerne Deinen ...
    cu,
    -ds-

  • Hallo,

    sorry, dass ich mich so spät melde. Ich bin heute erst aus dem Urlaub zurück gekommen. Also, die Funktion um die es geht sieht folgendermaßen aus :

    Für den Fall der Fälle habe ich mal alle Dateien in ein Archiv gepackt (siehe Anhang).

  • Und das ist wirklich GENAU SO in der Vorlage ??

    Weil ich das auch brauchen koennte, habe ich kurz im Internet
    gesucht. Der erste Beispielcode sah aber schon ganz anders aus ...

    Wenn ich diesen Code hier so ansehe, dann glaube ich, dass ein
    C-Anfaenger ihn vermurkst hat.

    Ab ins Internet und sauberen Code suchen !

    Einmal editiert, zuletzt von Tell (8. Dezember 2014 um 08:40)

  • Hallo Tell,

    also 1:1 habe ich den Quelltext nicht übernommen. Variablen habe ich einen neuen bzw. vollständigeren Namen gegeben. Kommentare und if-Anweisungen habe ich auch hinzugefügt. Die prinzipielle Struktur, vor allem des Befehls ioctl(), ist geglieben. Ich denke nicht, dass meine Änderungen eine Auswirkung auf die Funktionsweise haben - denn es funktioniert ja. Sollte ich dennoch etwas übersehen haben, lasse ich mich natürlich eines Besseren belehren ;)

    Kannst du mir bitte mal den (deinen) Link zukommen lassen? Ich würde mir das mal anschauen wollen. Vielleicht hilft mir das bei der Fehlersuche?


    lg Torsten

  • Also mit dem Vergleich des originalen Quelltextes stelle ich fest, dass es dort auch so gemacht wurde. Kurze Information dazu. Das Auslesen des GPIO Regisgers (0x09) des MCP23008 bewirkt, dass die Zustände der acht Pins als Antwort zurück kommen. Da ich im Aufruf der Funktion ein "unsigned char" zu stehen habe, sollte das aus meiner Sicht korrekt sein.

    Wie ich bereits weiter oben schrieb, lese ich auch die Zustände aus - mehr oder weniger richtig. Wirklich korrekt ist die Antwort des MCP's ja erst mit einem Erneuten Aufruf des Programms, egal ob ich den selben Sollwert nochmals sende oder ihn identisch lasse.


    lg Torsten

  • Hallo,

    es gibt gute Neuigkeiten, den Fehler habe ich gefunden. Es lag nicht an der Funktion selbst, sondern an der Parameterübergabe. Der Hinweis mit der Zeigerproblematik hat mich quasi darauf gestoßen. Vielen Dank soweit :)

    Die Sache mit den anderen Möglichkeiten schaue ich mir mal genauer an, auch dafür danke :)


    lg Torsten

Jetzt mitmachen!

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