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
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
@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
@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
@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
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.
@ 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.
@ 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.
@ 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."