PCF8574 an den IO-Warrior anschließen

Dies ist das deutsche Forum für alle Themen um den IO-Warrior. Beiträge bitte nur in Deutsch.

Moderator: Guido Körber

Post Reply
Henning
Posts: 11
Joined: Mon Apr 18, 2005 9:42 pm

PCF8574 an den IO-Warrior anschließen

Post by Henning »

Hallo, ich habe den PCF8574 direkt an den SDA und SCL-Pin des IO-Warrior 40 angeschlossen und außerdem mit der 5V und der GND-Leitung Verbunden, die auf der Experimentierplatine des IO-Warrior ist.
Als Adresse habe ich ihm die 0 gesetzt. Ich habe nun folgendes kleine Testprogramm geschrieben, über das eine LED, die an Datenpin1 des PCF8574 angeschlossen ist, angesteuert werden soll. Eigentlich sollte die LED alle 0,5 Sekunden ein bzw. ausgeschaltet werden, also blinken.

Bei dem PCF8574 handelt es sich um einen Chip des Typs A. Insgesamt sollte sich als Adresse zum Schreiben des Chips also die 112 ergeben.

Trotzdem funktioniert das folgende Programm nicht. Bereits der Aufruf zum Starten des IIC liefert den Wert 0 zurück, wenn ich ihn abfrage. Eigentlich müsste dort doch aber 8 geliefert werden.

Kann ich den PCF8574 evtl. nicht direkt verbinden? Brauche ich noch soetwas wie einen IIC-Controller?

Code: Select all

CHAR buffer[9];
//ReportID
buffer[0] = 1;

//IIC - Aktivieren
buffer[1] = 1;
buffer[2] = 0;
buffer[3] = 0;
buffer[4] = 0;
buffer[5] = 0;
buffer[6] = 0;
buffer[7] = 0;
buffer[8] = 0;
cout << IowKitWrite(p_interface, 1, buffer, sizeof(buffer));
while (true)
{
	if ( buffer[4] == 0 )
	{
		buffer[4] = 255;
	}
	else
	{
		buffer[4] = 0;
	}
	//Message mit 2 Datenbytes
	buffer[1] = 2;
	//Start-Condition + 2 Folgebytes
	buffer[2] = 194;
	buffer[3] = 112;
	//		buffer[4] = 0;
	buffer[5] = 0;
	buffer[6] = 0;
	buffer[7] = 0;
	buffer[8] = 0;
	IowKitWrite(p_interface, 1, buffer, sizeof(buffer));
	
	Sleep(500);
}
Henning
Posts: 11
Joined: Mon Apr 18, 2005 9:42 pm

Post by Henning »

Sorry, das Code-Stück sieht natürlich so aus:

Code: Select all

CHAR buffer[9];
//ReportID
buffer[0] = 1;

//IIC - Aktivieren
buffer[1] = 1;
buffer[2] = 0;
buffer[3] = 0;
buffer[4] = 0;
buffer[5] = 0;
buffer[6] = 0;
buffer[7] = 0;
buffer[8] = 0;
cout << IowKitWrite(p_interface, 1, buffer, sizeof(buffer));
while (true)
{
	if ( buffer[3] == 0 )
	{
		buffer[3] = 255;
	}
	else
	{
		buffer[3] = 0;
	}
	//Message mit 2 Datenbytes
	buffer[0] = 2;
	//Start-Condition + 2 Folgebytes
	buffer[1] = 194;
	buffer[2] = 112;
	buffer[4] = 0;
	buffer[5] = 0;
	buffer[6] = 0;
	buffer[7] = 0;
	buffer[8] = 0;
	IowKitWrite(p_interface, 1, buffer, sizeof(buffer));
	
	Sleep(500);
}
Henning
Posts: 11
Joined: Mon Apr 18, 2005 9:42 pm

Post by Henning »

Oh man, ich war einfach nur zu blöd. Habe es manuell probiert (also durch setzen und löschen der beiden Pins). Da hat es geklappt. Habe mir dann meinen Code noch mal angesehen. Hatte das Array 9 Elemente groß gemacht. Die Nachricht soll ja aber nur 8 Byte groß sein. Jetzt geht alles!
Frank S.
Posts: 29
Joined: Fri Feb 25, 2005 11:53 am

Frage Code

Post by Frank S. »

Hallo Henning.

Kann man den Code denn so übernehmen? Ich wollte auch ein paar Versuche mit dem I2C - Bus machen. Habe bislang aber noch nichts passendes gefunden.

Schöne Grüße
Frank S.
Henning
Posts: 11
Joined: Mon Apr 18, 2005 9:42 pm

Re: Frage Code

Post by Henning »

Frank S. wrote:Kann man den Code denn so übernehmen? Ich wollte auch ein paar Versuche mit dem I2C - Bus machen. Habe bislang aber noch nichts passendes gefunden.
Nein, den Code kann man so nicht übernehmen. Da sind Fehler drin. Ein lauffähiges Code-Beispiel sieht so aus:

Code: Select all

CHAR buffer[8]
//ReportID 
buffer[0] = 1; 

//IIC - Aktivieren 
buffer[1] = 1; 
buffer[2] = 0; 
buffer[3] = 0; 
buffer[4] = 0; 
buffer[5] = 0; 
buffer[6] = 0; 
buffer[7] = 0; 

IowKitWrite(p_interface, 1, buffer, sizeof(buffer)); 

while (true) 
{ 
   if ( buffer[3] == 0 ) 
   { 
      buffer[3] = 255; 
   } 
   else 
   { 
      buffer[3] = 0; 
   } 
   //Message mit 2 Datenbytes 
   buffer[0] = 2; 
   //Start-Condition + 2 Folgebytes + Stop-Condition
   buffer[1] = 194; 
   buffer[2] = 112; 
   //buffer[3] wurde vorher schon belegt
   buffer[4] = 0; 
   buffer[5] = 0; 
   buffer[6] = 0; 
   buffer[7] = 0; 
   IowKitWrite(p_interface, 1, buffer, sizeof(buffer)); 
    
   Sleep(500); 
} 
Das Beispiel setzt abwechselnd alle 500ms alle Eingänge eines PCF8574A auf HIGH bzw. auf LOW.
Soll ein PCF8574 angesprochen werden, muss buffer[2] auf 64 gesetzt werden.
In beiden Fällen sind die Pins A0, A1, A2 an GND. Die gejumperte Chip-Adresse ist also 0.

p_interface ist das Handle auf den IO-Warrior.

Jetzt kann das Code-Beispiel übernommen werden. Wenn man den Start des IO-Warrior davorsetzt ist es lauffähig. Da es in einer Endlosschleife läuft, kann man sich das Schließen der Geräte sparen. Ist unschön programmiert, reicht aber zum ersten Testen des IIC-Bus.
Frank S.
Posts: 29
Joined: Fri Feb 25, 2005 11:53 am

Danke

Post by Frank S. »

Hallo Henning.

Danke für die Antwort. Ich werde es die Tage mal ausprobieren.

Schöne Grüße
Frank S.
Henning
Posts: 11
Joined: Mon Apr 18, 2005 9:42 pm

Post by Henning »

Wer weiß, wie man den PCF8574 am IIC über den IO-Warrior auslesen kann? Am besten wäre ein Beispiel in C++.
Frank S.
Posts: 29
Joined: Fri Feb 25, 2005 11:53 am

PCD 8574P

Post by Frank S. »

Hallo.

Hat der Baustein PCF 8574P eine gesonderte Adresse im I2C - Bus. Mei Frage deshalp, weil es ja auch einen Adressenunterschied zwischen dem PCF 8574 und dem PCF 8574A gibt.

Schöne Grüße
Frank S.
Henning
Posts: 11
Joined: Mon Apr 18, 2005 9:42 pm

Post by Henning »

PCF8574P hat die gleiche Adresse wie der PCF8574. Es gibt auch einen PCF8574AP. Der hat dann die gleiche Adresse wie der PCF8574A. Es gibt aus noch S und T oder ähnliches. Da verhält es sich überall genauso. Wenn vor dem Zusatzbuchstaben noch ein A steht, ist die Adresse die gleiche wie beim PCF8574A. Steht da kein A ist es die Adresse wie beim PCF8574.
spyro
Posts: 23
Joined: Fri Apr 14, 2006 8:13 pm

Post by spyro »

sorry, falsches thema..
10.3.9 iow40 enthusiasmus
Post Reply