PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PCF8574 I2C ansteuerung



raid_ox
26.01.2007, 22:15
Hallo, ich hab grad mal eine I2C Porterweiterung zusammengelötet nach der Anleitung von m.a.r.v.i.n

Und die testprogramm mit I2Cmaster funktioniert prima.

nun weiß ich nicht genau, wie man die einzelne neue ports benutzen kann.

Vielen Dank für euere Hilfe

raid_ox
27.01.2007, 14:13
:cry: warum hilft mir keiner :cry: :cry:

raid_ox
27.01.2007, 14:17
ich hab versuch:
[nachdem verbindung hergestellt worden ist]
i2c_write(0x02);
i2c_write(0x01);
i2c_stop();

es gibt aber kein veränderung. Alle ports sind immer noch auf high gestellt aber mit sehr niedrigerem ampere. :(

Yossarian
27.01.2007, 14:56
Hallo
wahrscheinlich solltest Du ersteinmal genauer formulieren wo Dein Problem liegt.
Wenn die Ausgänge auf high liegen, wird ein Konstantstrom von 100µA geliefert.Nur für eine Taktlänge wird für schnelles Umschalten ein größerer Strom bereitgestellt.
Steht im Datenblatt.

Mit freundlichen Grüßen
Benno

raid_ox
27.01.2007, 15:06
erstmal vielen dank für die Antwort.

Das problem ist, dass ich bisher überhaupt keine ahnung über i²c habe. Und ich will eigentlich nur wissen, wie man die ports auf hi oder low umschalten kann. Ich werde gleich mal die datenblatt lesen.

gruß

raid_ox
27.01.2007, 16:11
uff,

ich hab den Datenblatt durchgelesen und probiert was da abgebildet wird (mit diese p3):

------------------------------------------------
i2c_start(Dev8574+I2C_WRITE);
i2c_write(0b00001000);
i2c_write(0b00000000);
i2c_stop();
------------------------------------------------

ich bekomme zwar "acknowledgement from slave", aber port3 ist immer noch auf hi gesetzt (ich will es auf low umpolen) :(

ich weis nicht mehr was ich machen soll :(

wenn jemand schon mal mit diesem ding beschäftigt hat, bitte gib mir nen beispiel code.

danke, gruß

raid

m.a.r.v.i.n
27.01.2007, 17:00
Hi,

im AsuroWiki ist doch ein Beispielcode dabei. Dabei wird einfach ein Zähler über alle Ports ausgegeben und alle halbe Sekunde um 1 erhöht.
Probiers mal damit.

http://www.asurowiki.de/pmwiki/uploads/Main/i2cmaster.zip

raid_ox
27.01.2007, 17:04
ich hab damit schon probiert, aber leider sind alle ports immer hi, ist das vllt ein baufehler? aber die transmission ist erfolgreich. hmmmm.....

m.a.r.v.i.n
27.01.2007, 17:52
Hi,

das heist zumindest, das der I2C Chip richtig adressiert ist und auch brav antwortet. Warum die Ausgänge nicht funktionieren, bleibt mir ein Rätsel. Die mit i2c_write geschriebene Date sollte an den Ports anliegen, eigentlich ganz einfach.

raid_ox
27.01.2007, 17:55
hi m.a.r.v.i.n,

wie funktioniert diese erweiterung eigentlich bei dir?
einfach i2c_write([port-bits]) oder wie? und du schreibst 0 für low und 1 für high ?

raid_ox
27.01.2007, 18:02
noch eins: was soll ich eigentlich mit A0-A2 machen? weil obwohl ich eine von denen rausnehme, gibt es keine veränderung (auch mit dem antwort und so). Ist das nicht komisch? eigentlich sind diese ports für addressing wichtig oder?

m.a.r.v.i.n
27.01.2007, 18:38
Hi,

ja, 0 ist LOW und 1 ist HIGH.
Die Adresspins müssen alle auf LOW (Jumper gesetzt) sein, damit der PCF8574 mit seiner Basisadresse angesprochen wird. D.H. der I2C Chip wird doch nicht richtig angesprochen.

Hast du evtl. eine PCF8574AP?
Der hat nämlich eine andere Basisadresse, als der PCF8574P.

Sind die I2C Abschlußwiderstände R1 und R2 dran?
Auf dem Foto im AsuroWiki fehlen diese. Ich hatte diese Widerstände auf eine 2x3polige Buchsenleiste gelötet, zum Aufstecken auf die I2C Erweiterung.

raid_ox
28.01.2007, 18:27
nee, ich hab PCF8574P.

ich glaube das liegt daran, dass ich vergessen habe eine pullup resistor zu verbinden. Ich hab zwar noch nicht daran weitergearbeitet, aber danke für die Antwort, ich melde mich wieder wenn ich es gemacht habe.

Gruß

raid

damaltor
31.01.2007, 18:26
so, muss nochmal nachfragen:

man schreibt einfach die portbits, und der rest geht von allein?

also wenn ich 0b00001111 (=15 oder 0x0F) schreibe, dann sind die ersten 4 pins low und die zweiten 4 pins high? und das sind die ports P0 bis P7 in der zeichnung oder?

dann: wofür sind A1,A2,A3? die müssen immer gesetzt sein, sofern nicht mehrere slaves angeschlossen werden oder?

und noch: wenn ich den jumper bei int0 setze, dann wird ein interrupt ausgelöst, wen WAS passiert? sehe ich das richtig, dass int0 solang wie der jumper gesetzt ist, über R3 mit vcc verbunden ist? wenn ja warum?

welche zeichnung stimmt, die der platine oder die des schaltplans?

auf dem bild der platinenoberseite kommt R1 doppelt vor und R7 fehlt. vermute ich richtig, dass R7 unten links bei R8 und R9 hin müsste?

wie lese ich den aktuellen status der pins aus? also wie kann ich erkennen, ob an einem pin (von aussen, zB einem taster) spannung anliegt oder nicht?

was passiert, wenn ich den pin low geschaltet habe und dann zB mit einem taster spannung drauf leite? kurzschluss oder gar nichts?

vielen dank für eure hilfe, ich hab die teile bestellt und komm nicht damit klar =/

=)

m.a.r.v.i.n
31.01.2007, 19:45
man schreibt einfach die portbits, und der rest geht von allein?

richtig.



also wenn ich 0b00001111 (=15 oder 0x0F) schreibe, dann sind die ersten 4 pins low und die zweiten 4 pins high? und das sind die ports P0 bis P7 in der zeichnung oder?

So ist es.



dann: wofür sind A1,A2,A3? die müssen immer gesetzt sein, sofern nicht mehrere slaves angeschlossen werden oder?

Damit legt man die Adresse des I2C Chips fest. Durch unterschiedliche Adresse lassen sich theoretisch bis zu 8 I2C Chips an einem I2C Bus betreiben. Das entspricht den I2C Adressen 0x40..0x47.
Man kann auch die Jumper und Pullup Widerstände R7..R9 weglassen, und die Pins 1..3 vom PCF8574 auf Masse legen. Dann wird der I2C Chip unter seiner Basisadresse 0x40 angesprochen.



und noch: wenn ich den jumper bei int0 setze, dann wird ein interrupt ausgelöst, wen WAS passiert? sehe ich das richtig, dass int0 solang wie der jumper gesetzt ist, über R3 mit vcc verbunden ist? wenn ja warum?

Betreibt man I2C Chip im Input Mode, so löst eine Flankenänderung an einem der Eingangspins einen Interrupt aus. R3 ist ein Pullup für die Interrupt Leitung. INT ist ein open collector Ausgang.



welche zeichnung stimmt, die der platine oder die des schaltplans?

Mit Ausnahme von dem doppelten R1 im Layout sollten beide Pläne übereinstimmen.



auf dem bild der platinenoberseite kommt R1 doppelt vor und R7 fehlt. vermute ich richtig, dass R7 unten links bei R8 und R9 hin müsste?

richtig. Das ist noch ein Fehler im Layoutplan.



wie lese ich den aktuellen status der pins aus? also wie kann ich erkennen, ob an einem pin (von aussen, zB einem taster) spannung anliegt oder nicht?


So würde ein Beispiel zum Lesen aussehen:


while(1)
{
ret = i2c_start(Dev8574+I2C_READ); // set device address and read mode
if ( ret )
{
/* failed to issue start condition, possibly no device found */
i2c_stop();
StatusLED(RED);
}
else
{
/* issuing start condition ok, device accessible */
val=i2c_read(0); // read value, only one Byte with nak
i2c_stop(); // set stop conditon = release bus
PrintInt(val) // print out value
StatusLED(GREEN);
}
Msleep(500); // wait a 1/2 second




was passiert, wenn ich den pin low geschaltet habe und dann zB mit einem taster spannung drauf leite? kurzschluss oder gar nichts?

Ein Mischbetrieb Input und Output am gleichen I2C Chip sollte man vermeiden, sonst peng, puff! Es sei denn, man weiss was man tut (beim Schreiben auf die Eingangspins HIGH ausgeben, nicht LOW). Oder man macht die Schaltung entsprechend robust.

damaltor
31.01.2007, 19:57
super, vielen dank. dann kann das alles ja nicht so schwer werden... =)

damaltor
01.02.2007, 10:06
ok, wenn ich einen baustein zum lesen nutzen will, dann schreibe ich auf alle ports ein HIGH und stelle danach um auf i2c_read, oder?

reichen die 100 µA (steht weiter oben) zur dierekten ansteuerung einer LED? bestimmt nich wa...

Tido
01.02.2007, 10:25
Hallo,

wird ein bißchen zu wenig sein.
Aber bei Einsatz einer LowCurrent-LED sollte ein PullUp-Widerstand von 1,5K funktionieren.

Tido

damaltor
01.02.2007, 10:36
also den port des I2C an die LED, und VCC über den Widerstand auch an die LED? oder wie meinst du das?

Tido
01.02.2007, 11:04
also den port des I2C an die LED, und VCC über den Widerstand auch an die LED? oder wie meinst du das?

Ja, den PullUp von VCC an die Anode der LED und damit auch gleichzeitig an den Port des 8574. Dann wird bei Port=High die LED über den PullUp (1,2K; habe Uf der LED vergessen :-b ) mit ca. 2,75mA betrieben. Die Kathode der LED natürlich nach Masse. Bei Port=Low zieht dieser die Anode der LED auf 0V, allerdings fließen dann ständig 3mA unsinnig über der PullUp nach Masse.

MfG
Tido

damaltor
01.02.2007, 11:07
hmm.. damit könnte man ja leben... ich glaub ich probiers erstmal einfach so ob der strom nicht reicht, und wenn nicht dann mach ich noch die R-brücke dazu...

damaltor
02.02.2007, 10:14
[quote=damaltor]
dann: wofür sind A1,A2,A3? die müssen immer gesetzt sein, sofern nicht mehrere slaves angeschlossen werden oder?

Damit legt man die Adresse des I2C Chips fest. Durch unterschiedliche Adresse lassen sich theoretisch bis zu 8 I2C Chips an einem I2C Bus betreiben. Das entspricht den I2C Adressen 0x40..0x47.
Man kann auch die Jumper und Pullup Widerstände R7..R9 weglassen, und die Pins 1..3 vom PCF8574 auf Masse legen. Dann wird der I2C Chip unter seiner Basisadresse 0x40 angesprochen.


Einfach alle drei Pins auf masse, und dann ist die Adresse 0x40? oder müssen dann trotzdem widerstände dazwischen?

m.a.r.v.i.n
02.02.2007, 10:27
Hi,



Man kann auch die Jumper und Pullup Widerstände R7..R9 weglassen, und die Pins 1..3 vom PCF8574 auf Masse legen.


steht doch da, dann kann man die Widerstände weglassen.

damaltor
02.02.2007, 11:16
ok, warum sind sie dann da? schliesslich könnte man sie ja dann auch ganz weglassen, denn ob nun jumper dazwischen sind oder man sie direkt an masse anschliesst, sollte dann doch egal sein...

m.a.r.v.i.n
02.02.2007, 11:34
Hi,

die Jumper und Pullups sind nur notwendig, wenn man mehrere I2C Erweiterungen anschliessen möchte. Dann braucht jedes Modul seine eigene Adresse.

Da du auch nach Anschlussmöglichkeit von LEDs und Tastern gefragt hast hierzu mal zwei Beispiele:
http://www.goblack.de/desy/digitalt/l_modelle/i2c-lcd-tast/index.html
http://www.woe.onlinehome.de/projekte.htm#i2cio

Die entsprechende Schaltpläne dazu:
http://www.goblack.de/desy/digitalt/l_modelle/i2c-lcd-tast/schaltplan.html
http://www.woe.onlinehome.de/proj_gif/i2c_io.gif

damaltor
02.02.2007, 13:47
super, vielen dank. die platine funktioniert, ich hab noch ein paar 1k widerstände gefunden und mitsamt den jumpern eingelötet. das i2cmaster testprogramm läuft einwandfrei durch, und laut multi liegt an den richtigen ports die richtige spannung an.
danke dir nochmal!

damaltor
02.02.2007, 14:00
Zum Thema 100µA:

Hallo,

wird ein bißchen zu wenig sein.
Aber bei Einsatz einer LowCurrent-LED sollte ein PullUp-Widerstand von 1,5K funktionieren.

Tido

Hab grad in den Links von m.a.r.v.i.n gelesen, dass man die led eigentlich nur anders rum anschliessen muss - also an vcc und an den PCF. wenn der low hat, dann leuchtets... eine unglaublich geile idee, da wäre ich in 100 jahren nicht drauf gekommen. =)

Tido
02.02.2007, 14:19
Hallo damaltor,

das ist klar, da der 8574 bei High nur 100uA liefert, bei Low hingegen 20mA schalten kann. Natürlich funktioniert es, die LED zwischen +5V und Port zu schalten, allerdings ist dann die Logik invertiert (0=An, 1=Aus).

damaltor
02.02.2007, 14:23
naj, daran kann man sich ja gewöhnen... dafür ist halt nicht dauerhaft ein stromverbraucher dabei, und man spart sich jede komplizierte lösung mit transistoren oder ähnlichem...
bin erst mal froh, dass es funktioniert. bastle grade an eine 7segment-anzeige, die sollte sich damit ja ansteuern lassen.

Cruser12
17.06.2010, 23:14
Hey an alle,
hab schon in zig threads reingeschrieben, aber keinen interresierts?!

kann mal bitte jmd. ein prog posten, welches alle Pins einliest???????
!!!!!!!!!

Cruser12

damaltor
17.06.2010, 23:19
Erstens: warum spamst du andere threads voll?
Zweitens: wie kommst du darauf, dass andere Leute für dich die Arbeit machen?

Eröffne einen thread, und bitte um Hilfe. Stelle dein Problem dar und zeige, wo du nicht weiterkommst. Gib an was du bereits gemacht und probiert hast und wo Fehler auftreten.

Wenn du erwartest dass sich einfach jemand hinsetzt und für dich Programme schreibt, dann hast du gelitten - solche Fragen interessieren wirklich niemand.

Kampi
18.06.2010, 07:26
@Cruser

Wenn man bei Google einfach ganz banal "Ansteuerung eines PCF8574 in Bascom" eingibt kommt man zu einem richtig richtig richtig tollen pdf was einem erklärt wie das I²C Protokoll funktioniert und wo auch ein kleines Beispielprogramm für 2 I²C Bausteine drin steht.