Homepage Wiki Forum Buy

GNUBLIN embedded GNU/Linux

Open source learning and training plattorm for embedded GNU / Linux
A projects from Hochschule Augsburg and embedded projects GmbH

Project homepage: http://www.gnublin.org
Wiki: http://wiki.gnublin.org
Aktuelle Zeit: Di 26. Sep 2017, 23:40

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: pca9555 Interruptleitung verwenden
BeitragVerfasst: Di 15. Okt 2013, 16:19 
Offline

Registriert: Di 15. Okt 2013, 12:02
Beiträge: 2
Hallo :)
ich bin Anfänger und brauche etwas Schützenhilfe, die Frage/Problem ist daher vielleicht etwas doof:

Also ich habe ein Port Expander PCA9555 bestellt (aber noch nicht da), diesen möchte ich in einem Projekt an einen Raspberry Pie anschließen um zusätzlich GPIOs für mehrere Taster zu haben.
Die Kommunikation läuft also über I2C wobei der Portexpander der Slave ist. Er kann also nicht von selber an den Raspberry (Master) senden, wenn ein Taster betätigt wurde, sondern muss abgefragt werden.

Damit der Raspberry nur abfragen muss wenn auch wirklich ein Taster betätigt wurde will ich eine ISR auf dem Raspberry benutzen. Der PCA 9555 Port expander hat einen Interrupt Output der automatisch auf high geht wenn sich ein Inputpin verändert. Diesen möchte ich als Triggerung für die Raspberry-ISR benutzen. So jetzt kommt gleich die dumme Frage:
Laut Schaltplan des PCA 9555 ist diese Interrupt Output Leitung über einen 10K Wiederstand (R15) mit Masse verbunden. Das verstehe ich nicht, ich vermute das liegt daran das er Open Drain ist (was ich aber nicht genau verstehe was das bedeutet). Ich sehe keinen Pin oder Pad oder etwas anderes im Schaltplan wo ich den Interrupt output and den Raspberry anstecken oder Löten könnte.

Wo und wie muss ich also die Leitung anbringen um den Port expander Interrupt Output mit dem Raspberry zu verbinden?
Muss ich vor dem Widerstand anlöten oder diesen auslöten und dann eine direkte Verbindung herstellen?

Ich bin für jede konstruktive Hilfe dankbar!
Beste Grüße


Nach oben
 Profil  
 
BeitragVerfasst: Do 17. Okt 2013, 04:32 
Offline

Registriert: Di 15. Okt 2013, 12:02
Beiträge: 2
Ich bin noch immer stark an dem Problem interresiert. Da meine weitere Programmierung davon abhängt ob ich einen Interrupt vom Portexpander verwenden kann oder nicht.
Es hat doch sicher schon jemand den Portexpander für seine Projekte verwendet. Weis niemand wie man die Interruptleitung verwendet???
:?: :?:


Nach oben
 Profil  
 
BeitragVerfasst: Fr 1. Nov 2013, 08:24 
Offline
Administrator

Registriert: Sa 7. Apr 2012, 09:18
Beiträge: 251
Eigentlich sollte das nicht so schwer sein? Hast du die IRQ Leitung mal mit einem Interrupt
verbunden und auf Gnublin Seite den Quelltext vorbereitet?

http://wiki.gnublin.org/index.php/GPIO# ... aktivieren

Auf PCA9555:

http://www.nxp.com/documents/data_sheet/PCA9555.pdf

Du brauchst ein Pullup gegen 3V3 (Seite 3 im Datenblatt)

The PCA9555 open-drain interrupt output is activated when any input state differs from its
corresponding input port register state and is used to indicate to the system master that
an input state has changed. The power-on reset sets the registers to their default values
and initializes the device state machine.

Also du solltest immer etwas bekommen, wenn sich an Eingangspins etwas ändert.


Nach oben
 Profil  
 
BeitragVerfasst: Di 25. Nov 2014, 17:51 
Offline

Registriert: So 23. Nov 2014, 15:24
Beiträge: 2
Verzeihung dass ich den Thread nochmal raufhole.

Mich würde eine etwas detaillierte Antwort interessieren, da es mir wohl an dem nötigen Elektrotechnikbackground fehlt.
Ich habe hier das Modul "RAIL_IN_v1.03" und versuche es mit Interrupts in den Betrieb zu nehmen.
Zwar funktioniert das Board in einem Testsetup mit einem Taster als Input mittels Busy Polling, ich würde aber ganz gern epoll nutzen um
die events "sauber" in ein mainloop integrieren zu können.

Konkret benutze ich das gpio-sysfs (modul geladen mit modprobe pca953x cnt=1 addr=0x20) um die Eingänge als GPIO
unter /sys/class/gpio/gpioXY/value auszulesen. Unter diesem Ordner fehlt leider das edge-file was bei normalen GPIO Pins
dazu genutzt werden kann um das Interruptverhalten zu steuern. Scheinbar wird der GPIO Pin nicht als interrupt fähig erkannt.
Wie kann ich ihn dazu überreden? Laut oben stehenden Datenblatt beherrscht der verbaute PCA9555D Interrupts, aber ich konnte
nichts dazu finden wie man diesen auf dem erwähnten Board nutzen kann.

Danke im Voraus für hilfreiche Antworten.


Folgende Wikiseiten hab ich bereits durchforstet:

http://wiki.gnublin.org/index.php/Port_Expander_PCA9555
http://wiki.gnublin.org/index.php/GNUBL ... Rail-Input
http://wiki.gnublin.org/index.php/Aufba ... Rail-Input


Nach oben
 Profil  
 
BeitragVerfasst: Di 25. Nov 2014, 19:13 
Offline

Registriert: Di 26. Jun 2012, 10:27
Beiträge: 172
So einfach geht das nicht.

Die Internen GPIOs sind voll Interrupt fähig und haben auch ein Edge Capture Register. Die Input-, Output-, Direktion-, und Edge-Register hängen direkt am Speicherbus (Memory Mapped I/O).
Theoretisch könnte man als Root direkt auf die Adressen zugreifen, oder man lässt das den Kernel erledigen.

Der pca9555 ist ein Portexpander der per I2C angeschlossen ist. Alles läuft über den I2C Bus und der kann nur Daten senden oder Daten anfordern.
Außerdem besitzt der pca9555 nur ein Direktion- und ein Input-Register.

Der pca9555 hat noch ein Interrupt Ausgang, den könnte man auswerten. Beim GNUBLIN Module-Portexpander ist dieser aber nicht rausgeführt, da müsste man noch ein Kabel anlöten (Am besten an R15).
Der Interrupt sagt aber nur, das sich irgend ein Pin geändert hat, und setzt sich zurück wenn das Input-Register wieder ausgelesen wird.

Ich weiß nicht wie der Kernel-Treiber für den pca9555 gestickt ist, falls er Interrupts unterstütz müsste man beim modprobe-Aufruf mit angeben an welchen IO-Port der Int des PCA angeschossen ist.
Oder es separat auswerten.


Nach oben
 Profil  
 
BeitragVerfasst: Mo 15. Dez 2014, 13:41 
Offline

Registriert: So 23. Nov 2014, 15:24
Beiträge: 2
Kirsch hat geschrieben:
So einfach geht das nicht.


Das stimmte. Leider. :)

Kirsch hat geschrieben:
...

Der pca9555 hat noch ein Interrupt Ausgang, den könnte man auswerten. Beim GNUBLIN Module-Portexpander ist dieser aber nicht rausgeführt, da müsste man noch ein Kabel anlöten (Am besten an R15).
Der Interrupt sagt aber nur, das sich irgend ein Pin geändert hat, und setzt sich zurück wenn das Input-Register wieder ausgelesen wird.


Wir haben tatsächlich das Löten angefangen. Im konkreten Fall wurde die Interruptleiting vom pca9555 chip (INT, Pin 1) auf Pin 11 des Gnublin Connectors weitergeleitet. Pin 11 weil der auf Nachfrage angeblich nicht weiter genutzt wird. Zwischen 3.3V und GPIO Pin 11 auf dem Gnublin haben wir dann einen 330 Ohm Widerstand geklemmt.

Nach dem Laden der Module (wie im wiki beschrieben) kann man GPIO Pin 11 auch (okay, das konnte man natürlich auch vorher) mit echo 'both' > /sys/class/gpio/gpio11/edge auf Interruptfähig schalten. Testweise haben wir dann einen Taster an das Inputboard angeschlossen. Drückte man diesen durch kam dann tatsächlich auch ein Interrupt auf GPIO11 an. Liest man den GPIO Pin des Tasters (bei uns war das 110), wird der Interrupt auch wieder zurückgesetzt. Heureka.

Nachteil der Methode ist natürlich dass man nur ein Interrupt pro Board bekommen kann und dann alle pins darauf selber lesen muss. Für unseren Anwendungsfall aber okay und schonmal eine Verbesserung.

Die Softwareseite sieht übrigens so aus: https://gist.github.com/sahib/2f5343041c7ba3c97db0.

Kirsch hat geschrieben:
Ich weiß nicht wie der Kernel-Treiber für den pca9555 gestickt ist, falls er Interrupts unterstütz müsste man beim modprobe-Aufruf mit angeben an welchen IO-Port der Int des PCA angeschossen ist.


Kann er zmd. laut modinfo pca953x nicht. Ist aber wie oben gesehen nicht zwangsweise notig.


Nach oben
 Profil  
 
BeitragVerfasst: Mo 15. Dez 2014, 14:44 
Offline

Registriert: Di 26. Jun 2012, 10:27
Beiträge: 172
Meine Programme schreibe ich immer in C/C++

Wo immer es geht vermeide ich das Sys-Filesystem (/sys/) und gehe direkt über das Device (/dev/).
Besonders bei Komponenten die eh über einen Bus angebunden sind (I2C/SPI) finde ich es unnötig diese über ein Kernel-Modul laufen zu lassen (also den PCA9555).
Da schicke ich lieber die I2C Kommandos direkt aus meinem Programm.

Den Umweg über ein Kernelmodul lohnt sich nur wenn man z. B. aus Shellscripten darauf zugreifen will. Oder mehrere Anwendungen das Gerät benutzen müssen. Den Kernel die Zugriffssteuerung zu überlassen ist in diesem Fall einfacher, als mehrere Programme über Semaphore oder sonst was zu synchronisieren.


Zieht es mal in Erwägung den pca9555 direkt über /dev/i2c-0 anzusteuern, ist viel weniger aufwand, und man bekommt gleich alle 16 Bits des Expanders auf einmal, als diese einzeln abzufragen/zusetzen.

Ehrlich gesagt weiß ich gar nicht ob es für die GPIOs auf dem Gnublin auch ein /dev-Devise gibt. Muss man in diesen Fall für den Interrupt doch noch über /sys/ gehen.


Man kann beliebig viele Geräte an eine Interruptleitung legen, wird der Interrupt ausgelöst, muss man aber alle Abfragen im herauszufinden welcher gemeint ist. Abmildern könnte man dies über einen zusätzlichen Inerruptcontroller. Man könnte sogar einen pca9555 dafür verwenden, die Voraussetzung ist nur das die Inerruptsignale dauer aktiv sind.


Nach oben
 Profil  
 
BeitragVerfasst: Mo 15. Dez 2014, 14:51 
Offline

Registriert: Di 26. Jun 2012, 10:27
Beiträge: 172
Und doch was, den Widerstand R15 auf dem Modul muss ausgelotet werden, und die Leitung stattdessen über einen 10K Pullup an VCC gelegt werden.

Bei einem Interrupt ziehen die Module das Signal über einen Transistor/Mosfet auf GND (Stichwort "Open-Kollektor-Ausgang").


Nach oben
 Profil  
 
BeitragVerfasst: Do 5. Mai 2016, 05:08 
Offline

Registriert: Sa 12. Sep 2015, 08:42
Beiträge: 24
die Voraussetzung ist nur das die Inerruptsignale dauer aktiv sind.
บาคาร่าออนไลน์


Nach oben
 Profil  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
cron
Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de