PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [gelöst]I2C mit PCF8574 funktioniert nicht



ASUR0
26.12.2010, 16:06
Hallo Leute,

ich versuche nun seit zwei Tagen, eine Porterweiterung(PCF8574) über I2C anzusteuern, aber es will einfach nicht klappen.
Da ich es über die Liniensensorenpin's laufen lasse, muss ich I2C emulieren. Ich verwende den Code aus der AsuroLib i2c.h und i2c.c

Hardware:Pin 3 ist SDA und Pin 2 ist SCL. Jeweils mit 4,7k Pull-Up. Verbunden mit dem PCF. Ich habe alles nachgemessen: Verbindung zum Asuro steht, Strom da. Habe auch zwei LED's an SDA und SCL angeschlossen: blinken, funkt.

Software: Ich habe die Lib an folgender Stelle geändert:

//Meine Pins
#define SDA 3
#define SCL 2

#define NOP asm volatile("nop") /*<! No Operation */
#define QDEL Msleep(50) /*<! 1/4 Delay */
#define HDEL QDEL; QDEL /*<! 1/2 Delay */

Bei QDEL habe ich Msleep(50) geschrieben, damit der Bus nicht so schnell ist.
Der Rest ist gleich geblieben.

Mein Programm (Ausschnitt)

InitI2C();
unsigned char val = 0;
while(1)
{
StatusLED(GREEN);
StartI2C(0);
WriteI2C(val);
StopI2C();
StatusLED(RED);
Msleep(1000);
}

Als Adresse habe ich 0x00, damit er auf jedem Fall anspricht.
Da val = 0, sollte der PCF mit allen Pins auf LOW gehen, passiert aber nicht.

Vielen Dank schon mal im voraus

Gruß
ASUR0

Richard
26.12.2010, 16:29
Zum schreiben muss die Adresse 1 ,3,5,7....
sein zum Lesen 0,2,4,6,8....

I²C hat 7 Adressbits 0..128 das 8. Bit legt die schreib/Leserichtung fest. ungerade Adressen "schreiben", gerade Adressen "lesen".

Gruß Richard

Feuerring
27.12.2010, 01:47
>> Als Adresse habe ich 0x00, damit er auf jedem Fall anspricht.

mögliche Adressen des PCF8574 (A) je nach Beschaltung der A0-A2 ...



BIT --------7--6--5--4---3--2--1--0
PCF8574 = 0 1 0 0 A2 A1 A0 RW
40 / 42 / 44 / 46 / 48 / 4A / 4C / 4E (WRITE)
41 / 43 / 45 / 47 / 49 / 4B / 4D / 4F (READ)

BIT --------7--6--5--4---3--2--1--0
PCF8574A = 0 1 1 1 A2 A1 A0 RW
70 / 72 / 74 / 76 / 78 / 7A / 7C / 7E (WRITE)
71 / 73 / 75 / 77 / 79 / 7B / 7D / 7F (READ)

Gruss Ralf

ASUR0
27.12.2010, 09:05
Zum schreiben muss die Adresse 1 ,3,5,7....
sein zum Lesen 0,2,4,6,8....

Soweit ich weiß ist das genau anders herum: Read = 1, Write = 0



mögliche Adressen des PCF8574 (A) je nach Beschaltung der A0-A2 ...


Ich habe den PCF8574AP, alle Adresspins auf GND, d.h. meine Adresse zum schreiben lautet 0b01110000.

Die habe ich jetzt ausprobiert und, was für ein Wunder, es klappt!

Nun ist die Frage: Warum funktioniert der general call nicht? Darauf müsste der PCF doch auch ansprechen, oder?

Feuerring
27.12.2010, 12:11
Hallo ASUR0,

PCF8574A A0=0 / A1=0 / A2=0 == Basisadresse (70h)

das R/W Bit ist wie folgt zu setzen:

0 = Write = 70h
1 = Read = 71h

siehe auch hier:
http://www.best-microcontroller-projects.com/i2c-tutorial.html

Gruss Ralf

Feuerring
29.12.2010, 02:50
@ASUR0

gelöst ? ... woran hat es denn gelegen ?

Richard
29.12.2010, 03:05
Zum schreiben muss die Adresse 1 ,3,5,7....
sein zum Lesen 0,2,4,6,8....

Soweit ich weiß ist das genau anders herum: Read = 1, Write = 0


Schääääähm, Du hast Recht. Dumm wenn man nicht einmal Abschreiben kann. :-(

Gruß Richard

ASUR0
30.12.2010, 23:03
@Feuering
general call funktioniert nicht, man muss die "echte" Adresse verwenden.