Forum: Mikrocontroller und Digitale Elektronik I2C-Expander PCF8574 / PCF8575 - wann kommt der Interrupt?


von erdbär (Gast)


Lesenswert?

hi,


weiß jemand durch zufall aus erfahrung, wann bei diesen i2c-expandern 
der /int GENAU ausgelöst wird. die doku von philips ist da leider nicht 
so schlüssig wie ich finde.
gibt es wirklich bei jeder änderung des zuständes der i/o-ports einen 
INT? bzw. bei welchem ereignis tritt der INT auf (adresse wurde gelesen, 
ACK wurde gesendet...!?)

mfg

von Nitram L. (nitram)


Lesenswert?

Hallo Erdbär,
ändert sich nach dem Lesen ein oder mehrer Pins, so wird ein INT 
ausgelöst...
immer...


nitraM

von erdbär (Gast)


Lesenswert?

und beim schreiben auf den expander (vom master aus gesehen) wird 
definitiv kein INT ausgelöst?

von Markus 8. (markus_8051)


Lesenswert?

Nun, wenn Du eine Pin durch Beschreiben vom Master aus von 0 auf 1 
setzt, und an diesem Pin hängt eine Kapazität dran, dann dauert es einen 
Moment, bis der Pin seinen Pegel wechselt. Das kann der Chip dann schon 
als Pegelwechsel von außen erkennen und einen IRQ auslösen.
Wäre eine interessante Frage, wie lange nach dem beschreiben die 
IRQ-Logik imun gegen Pegelwechsel ist.

Markus_8051

von norad (Gast)


Lesenswert?

@erdbär

>und beim schreiben auf den expander (vom master aus gesehen) wird
>definitiv kein INT ausgelöst?

Ja!

>gibt es wirklich bei jeder änderung des zuständes der i/o-ports einen
>INT? bzw. bei welchem ereignis tritt der INT auf (adresse wurde gelesen,
>ACK wurde gesendet...!?)

Am Expander können die einzelnen I/O seperat als Ein- oder Ausgänge 
benutzt werden.
Ein Pin, das als Eingang Initialisert wurde, löst einen Interrupt aus 
sobald sich dort der Pegel ändert. Bei der Benutzung als Ausgang 
selbstverständlich nicht.

Du musst lediglich, wenn der INT auslöst, mit dem µC den Datensatz 
auslesen
und die entsprechenden Bitstellen auswerten die als Eingänge dienen.
(Ich denke Dir ist klar, dass das INT vom Expander an irgend einen 
Interrupt des µC verbinden musst)

Nach dem lesen wird das INT im Expander zurück gesetzt wenn ich mich 
nicht irre.

Gruß norad



von Markus 8. (markus_8051)


Lesenswert?

@norad:
> Ein Pin, das als Eingang Initialisert wurde, löst einen Interrupt aus
> sobald sich dort der Pegel ändert.

Wie bitteschön initialisierst Du denn einen Pin als Eingang?

Ich glaube, Dir ist das Konzept der I/O-Ports dieser 
I/O-Expander-Bausteine noch nicht ganz klar. Es ist richtig, daß sie 
gemischt als Ein- und Ausgänge benutzt werden können, aber es gibt kein 
Datenrichtungsregister. Von daher ist es auch völliger Quatsch, sie als 
Ein- oder Ausgang konfigurieren zu wollen.
Wie bei den Ports beim 8051 handelt es sich hier um open drain bzw open 
collector Ausgänge. Das heißt, wenn die Ausgänge auf Eins geschaltet 
sind, sind sie hochohmig mit Vcc verbunden und können in diesem Zustand 
AUCH als Eingang fungieren. Demzufolge kann, wenn Du auf einen Pin, der 
vorher low war, nun ein high ausgibst, auch ein IRQ ausgelöst werden. 
Wie das passiert, habe ich oben schon beschrieben.

Markus_8051

von norad (Gast)


Lesenswert?

@Markus

gebe zu ich hab blödsinn geredet kommt davon wenn man nicht vorher ins 
Datenblatt glotzt.


Berichtige:
Im Input Modus wird bei jeder steigenden oder fallenden Flanke ein 
Interrupt ausgelöst. Nach der Zeit tiv ist das Signal /INT gültig.

Der Interruptschaltkreis wird zurückgesetzt oder reaktiviert wenn
anliegende Daten am Port die Originaleinstellungen verändern oder Daten
vom Port gelesen oder geschrieben werden welcher den Interrupt generiert 
hat.

Zurückgesetzt wird wie folgt:-
-Acknowledge Bit im Lesemodus nach der ansteigenden Flanke des SCL 
Signals

-Acknowledge Bit beim Schreiben nach der High-Low übergang des SCl 
Signals

Da heisst es noch das jeder Wechsel an den I/O's der Interrupt 
Detektiert wird nach dem Rückstellen und nach der nächsten ansteigenden 
Flanke des Clock-Signals.

Das Lesen oder Schreiben zu anderen Bausteinen hat keinen einfluss auf 
den Interruptschltkreis.


Für Übersetzungsfehler entschuldige ich mich jetzt schon.

norad



von Igor K. (ziesel)


Lesenswert?

Hallo Leute,
Sorry fürs ausgraben dieses Threads, aber ich finde meine Frage gehört 
genau hier rein und soll kein eigener Thread werden.

Ich frage mich, ob der Interrupt vom PCF8574 auch ohne Mikrocontroller 
und I2C ausgelöst wird. Und zwar habe ich erstmal nur den PCF auf einem 
Breadboard verkabelt, aber die SDA und SCL Leitungen offen gelassen. 
Wenn ich jetzt per Spannungsquelle die Spannung an einem der Ports 
ändere (High / Low), dann müsste doch ein Interrupt ausgelöst werden, 
welchen ich dann auf dem Oszi sehen kann. Da tut sich aber nichts.

Im Datenblatt steht, die Ports haben standardmäßig am Anfang den Zustand 
1, was ja bedeutet sie sind auf Input gestellt.

Meine Frage:
Muss eine erste Kommunikation per I2C stattgefunden haben um überhaupt 
den ersten Interrupt auszulösen, oder geht das auch erstmal ohne 
Mikrocontroller?

Vielen Dank schon mal im Voraus für eure Mühe.

von Falk B. (falk)


Lesenswert?

@  Igor K. (ziesel)

>Ich frage mich, ob der Interrupt vom PCF8574 auch ohne Mikrocontroller
>und I2C ausgelöst wird.

Nur einmal.

> Und zwar habe ich erstmal nur den PCF auf einem
>Breadboard verkabelt, aber die SDA und SCL Leitungen offen gelassen.

Schlecht, dort müssen wenigsten 10K Pull-Ups dran.

>Wenn ich jetzt per Spannungsquelle die Spannung an einem der Ports
>ändere (High / Low), dann müsste doch ein Interrupt ausgelöst werden,

Dort muss auch ein Pull-Up dran.

>welchen ich dann auf dem Oszi sehen kann. Da tut sich aber nichts.

Was siehst du denn?

>Muss eine erste Kommunikation per I2C stattgefunden haben um überhaupt
>den ersten Interrupt auszulösen,

Nein.

von Igor K. (ziesel)


Lesenswert?

@ Falk Brunner

Erstmal vielen Dank für deine prompte Antwort. Ich habe das Problem 
ausmachen können. Ich habe zu kleine Pull-Ups benutzt. 1kOhm war wohl zu 
wenig für die Open Drains. Hier fliegen noch welche mit 5,6k rum. Die 
haben die Veränderung gebracht.

Falk Brunner schrieb:
>>Ich frage mich, ob der Interrupt vom PCF8574 auch ohne Mikrocontroller
>>und I2C ausgelöst wird.
>
> Nur einmal.

Bei mir nicht. Der Interrupt wird immer ausgelöst.Ich hoffe das ist 
richtig so?! Ich habe einen Port per Pull-Up auf High gelegt. Und an den 
Port halte ich dann Masse ran, woraufhin der Interrupt ausgelöst wird, 
und das Potential auch dort auf 0 schießt. Sobald ich die Masse vom 
besagten Port wegnehme kehrt auch der Interrupt Port auf High zurück. 
Und das jedes Mal. Es ist also nicht nur einmalig.

Falk Brunner schrieb:
>> Und zwar habe ich erstmal nur den PCF auf einem
>>Breadboard verkabelt, aber die SDA und SCL Leitungen offen gelassen.
>
> Schlecht, dort müssen wenigsten 10K Pull-Ups dran.

Auch hier kann man die Pull-Ups, zum Testen der Beschaltung, weglassen.

Also, jetzt funktioniert hier erstmal alles. Vielen Dank. Und falls die 
Geschichte mit dem ständig auslösbaren Interrupt verkehrt sein sollte, 
bitte unbedingt bescheid geben. Dann läuft hier scheinbar doch was 
schief.

von Falk B. (falk)


Lesenswert?

@  Igor K. (ziesel)

>Bei mir nicht. Der Interrupt wird immer ausgelöst.Ich hoffe das ist
>richtig so?! Ich habe einen Port per Pull-Up auf High gelegt. Und an den
>Port halte ich dann Masse ran, woraufhin der Interrupt ausgelöst wird,
>und das Potential auch dort auf 0 schießt. Sobald ich die Masse vom
>besagten Port wegnehme kehrt auch der Interrupt Port auf High zurück.
>Und das jedes Mal. Es ist also nicht nur einmalig.

Hmmm, Ok, die Logik dahinter ist wohl nur statisch.

>Auch hier kann man die Pull-Ups, zum Testen der Beschaltung, weglassen.

Würde ich nicht machen. Kostet das soooooo viel Aufwand?

>Also, jetzt funktioniert hier erstmal alles. Vielen Dank. Und falls die
>Geschichte mit dem ständig auslösbaren Interrupt verkehrt sein sollte,
>bitte unbedingt bescheid geben. Dann läuft hier scheinbar doch was
>schief.

Ich denke, das ist OK. Wenn man mal das Schaltbild im Datenblatt 
ansieht, wird der IST-Zustand vom Pin mit dem letzten gelesenen und 
gespeicherten Zustand statisch per XOR verlichen.

"Resetting and reactivating the interrupt circuit is achieved
when data on the port is changed to the original setting or
data is read from or written to the port which has generated
the interrupt."

Beitrag #5606776 wurde von einem Moderator gelöscht.
Beitrag #5606836 wurde von einem Moderator gelöscht.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.