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