PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Adressvergabe beim PCF8574



Duesentrieb
18.03.2011, 06:36
Hallo,

ich möchte PCF8574 als Porterweiterung an einem Mege32 betreiben.
Ist mein erstes Projekt dieer Art.
Nun habe ich Probleme mit der Adressierung.
Die drei Pins des PCF8574 habe ich in den möglichen Varianten mit GND und +5V belegt.
Wo ich bisher nicht durchgestiegen bin ist die Adressierung in Bacom.
Im Datenblatt wird die Hexadresse mit H20 bis H27 angegeben. Die funktionieren aber nicht.

Hat hier jemand einen Rat?

Richard
18.03.2011, 07:43
Hallo,

ich möchte PCF8574 als Porterweiterung an einem Mege32 betreiben.
Ist mein erstes Projekt dieer Art.
Nun habe ich Probleme mit der Adressierung.
Die drei Pins des PCF8574 habe ich in den möglichen Varianten mit GND und +5V belegt.
Wo ich bisher nicht durchgestiegen bin ist die Adressierung in Bacom.
Im Datenblatt wird die Hexadresse mit H20 bis H27 angegeben. Die funktionieren aber nicht.

Hat hier jemand einen Rat?

Du musst das unterste Bit (schreiben/lesen) beachten, die Adresse ist 7 Bit lang, ein Bit wird für lesen/schreiben
gebraucht. Im Datenblatt sollte das zu lesen sein.

Gruß Richard

PicNick
18.03.2011, 08:38
Da ist eine SpeiseKarte

http://www.rn-wissen.de/index.php/I2C_Chip-%C3%9Cbersicht#Adressen_g.C3.A4ngiger_I2C_Chips

Duesentrieb
18.03.2011, 08:39
Hallo Richard,

so richtig weitergeholfen hat mir dein Hinweis leider nicht.
Ich ahbe aus dem RN-Wissen folgendes Beispiel:


$regfile = "M32def.dat" ' the used chip
$crystal = 16000000 ' frequency used
$baud = 9600

Config Scl = Portb.0 ' Ports fuer IIC-Bus, nicht Standard !
Config Sda = Portb.1
' Config I2cdelay = 10 ' je höher der Wert umso langsamer der Bus

I2cinit

Const Pcf_write = &H40 ' Slaveadresse
Const Pcf_read = &H41

' Startausgabe
Print
Print "I2C-Soft Demo mit PCF 8574"
Print

Do
I2cstart
I2cwbyte Pcf_write
I2cwbyte &HAA
I2cstop

Print Err ' Err = 0 -> kein Fehler !

Waitms 500

I2cstart
I2cwbyte Pcf_write
I2cwbyte &H55
I2cstop

Print Err ' Err = 0 -> kein Fehler !

Waitms 500

Loop

End


Hier wird die Slaveadresse mit H40 angegeben.
Wie müsste ich in diesem Beispielfall die drei Adresspins belegen?

Duesentrieb
18.03.2011, 08:57
Hallo PicNick,

da waren wir wohl gleichzeitig mit dem Verfassen einer Antwort beschäftigt :-)

Mit deinem Hinweis habe ich jetzt verstanden dass alle PCF8574 über H40 zum Schreiben erreichbar sind.

Aber nun auch noch einmal die Frage an dich.
Ich habe meinen PCF 8574 mit L-H-L (A0-A1-A2) konfiguriert.
Nun möchte ich alle Ports als auf Higth schalten.
Dafür hätte ich gerne ein Beispiel un es zu verstehen. Kannst du mir das bitte mal zeigen?

Richard
18.03.2011, 09:02
Hallo Richard,

so richtig weitergeholfen hat mir dein Hinweis leider nicht.
Ich ahbe aus dem RN-Wissen folgendes Beispiel:


$regfile = "M32def.dat" ' the used chip
$crystal = 16000000 ' frequency used
$baud = 9600

Config Scl = Portb.0 ' Ports fuer IIC-Bus, nicht Standard !
Config Sda = Portb.1
' Config I2cdelay = 10 ' je höher der Wert umso langsamer der Bus

I2cinit

Const Pcf_write = &H40 ' Slaveadresse
Const Pcf_read = &H41

' Startausgabe
Print
Print "I2C-Soft Demo mit PCF 8574"
Print

Do
I2cstart
I2cwbyte Pcf_write
I2cwbyte &HAA
I2cstop

Print Err ' Err = 0 -> kein Fehler !

Waitms 500

I2cstart
I2cwbyte Pcf_write
I2cwbyte &H55
I2cstop

Print Err ' Err = 0 -> kein Fehler !

Waitms 500

Loop

End


Hier wird die Slaveadresse mit H40 angegeben.
Wie müsste ich in diesem Beispielfall die drei Adresspins belegen?

Dazu muss man den (genauen) Typ pcf8574(x) wissen, es gibt 2 Typen mit jeweils andern Hartware codierten
Adressbereich. mit den 3 frei zu verdratenden kann man den dann noch unterteilen. Der pcf 8574 hat als Basisadresse
$40 der pcf 8574A hat als Basisadresse $70.

Gruß Richard

PicNick
18.03.2011, 09:16
Die Sache mit den I2C Adressen ist im ersten moment tatsächlich verwirrend.
Aber eigentlich einfach:
8 Bit (0-7) stehen insges zur Verfügung
das bit 0 bedeutet Lesen=0 schreiben=1
bits 1-7 stellen die eigentliche addresse dar.
In der Praxis und bei Bascom werden die Bits aber zu einer gesamtzahl zusammengefasst und aber leider auch als Adresse bezeichnet.

Konkret:
Offizielle Adress-range (s.o) H20-H27
das muss man um ein bit nach links schieben (= mal zwei) und dann 1 dazuzählen (f. lesen) oder so lassen (zum schreiben)
also
H40, H42, H44, H46, H48, H4A, H4C oder H4E als Leseadresse
und
H41, H43, H45, H47, H49, H4B, H4D oder H4F als Schreibadresse

deine Pins A0, A1, A2 sind bei dieser adress-schreibung x2 zu nehmen und auf die Basisadresse H40 (=H20 x 2) zu addieren
Bei allen drei High gibt das
7 x 2 = H0E
plus basis H40

H4E das nimmst du im Bascom um vom Expander zu lesen, und
H4F um dorthin zu schreiben

vielleicht etwas weitschweifig :oops:

hilft das ?

Duesentrieb
18.03.2011, 09:48
Super! Das hilft mir auf jeden Fall weiter.
Herzlichen Dank!

Duesentrieb
19.03.2011, 15:53
Hallo,

nun muss ich doch noch einmal fragen. :confused:

Ich habe als Basisadresse die H22 an den drei Pins festgelegt. (L-H-L)
Dazu muss ich nun die H40 zählen um in den Slave zu schreiben (einen Ausgang zu schalten)
So wie ich es verstanden habe lautet nun meine Zieladresse H62.

Wenn ich dies nun im Beipielprogramm eingebe sieht das so aus:


Config Scl = Portb.0 ' Ports fuer IIC-Bus, nicht Standard !
Config Sda = Portb.1
Config I2cdelay = 10 ' je höher der Wert umso langsamer der Bus

I2cinit

Const Pcf_write = &H62 ' Slaveadresse
'Const Pcf_read = &H41

' Startausgabe
Print
Print "I2C-Soft Demo mit PCF 8574"
Print

Do
I2cstart
I2cwbyte Pcf_write
I2cwbyte &HAA
I2cstop
Print Err ' Err = 0 -> kein Fehler !
Waitms 500

I2cstart
I2cwbyte Pcf_write
I2cwbyte &H55
I2cstop

Print Err ' Err = 0 -> kein Fehler !

Waitms 500

LoopWas habe ich jetzt falsch verstanden? Es geht nähmich nichts ](*,)](*,)

Richard
19.03.2011, 16:29
Du kannst mit 3 Bit nicht h 22 einstellen! 111x = 4+2+1 = 7 x zählt nicht lesen/schreibe

Fest verdratet 1000 Deine Verdratung 010 lesen/schrieben 1/0 ergibt...

1000010 = H42 + 1 für Schreiben = H43
1000010 = H42 + 0 für Lesen H42

versuche einmal...

Const Pcf_write = &H43 ' Slaveadresse
Const Pcf_read = &H42


Gruß Richard

PicNick
21.03.2011, 08:13
@Düsentrieb:
Wenn du L-H-L (H02) einstellst mal 2 ---> H04
plus H40 (basis) ---->
H44 als leseadresse
H45 als schreibadresse

Duesentrieb
21.03.2011, 08:24
Hallo,

hab meinen Fehler zwischenzeitlich rausgefunden.
Ich hatte einen PCF8574 AT und und wusste nicht dass dies gleichbedeutend mit dem PCF8574A ist.
Die Basisadresse ist hier die 70.
Den Rest habe ich verstanden, auch wenns nicht so ganz logisch ist

Noch mal Danke an alle! =D>

Michael
21.03.2011, 10:02
Hallo,


H44 als leseadresse
H45 als schreibadresse
ich möchte hier nur anmerken, daß die Leseadresse bei I²C immer ungerade ist, weil da das Lesebit gesetzt ist.
richtig wäre also:
H45 als Leseadresse
H44 als Schreibadresse

Gruß, Michael

Richard
21.03.2011, 11:55
@Düsentrieb:
Wenn du L-H-L (H02) einstellst mal 2 ---> H04
plus H40 (basis) ---->
H44 als leseadresse
H45 als schreibadresse

ich habe auch irrtümlich LHL als H02 gelesen weil ich das schreib/Lese Bit nicht (als Adresse)
mit beachtet habe...muss man aber doch und dann......

10000101 = H45 schreiben
10000100 = H44 lesen

...kommt auch die richtige Adresse heraus. beim A Typ dann halt.
01110101 = H75 schreiben
01110100 = H74 lesen

Wenn mann es so liest braucht man auch nichts mehr * 2 zu nehmen.

Gruß Richard

PicNick
21.03.2011, 13:28
..., daß die Leseadresse bei I²C immer ungerade ist, weil da das Lesebit gesetzt ist,
richtig wäre also:
H45 als Leseadresse
H44 als Schreibadresse

uiuiui :oops: