User manual

41 42
6.2 I2C Bus und IO Port Baustein
Der Bausteine PCF8574 ist ein sogenannter IO Extender. Der beinhaltet 8 IO Ports, die man als Ausgang aber
auch als Eingang verwenden kann. Den Baustein PCF8574 gibt es in zwei Ausführungen, den PCF8574T (40-4E)
und PCF8574AT (70-7E), dabei haben die beiden einen unterschiedlichen Adressbereich. Nach dem Öffnen des
Deckels, gibt es auf der Oberseite noch einen DIL-Schalter mit dem sich die Unteradresse einstellen lässt.
(40,42,44,46,48,4A,4C,4E). Achtung: Beim Aufsetzen des Deckels auf die Orientierung achten. Das kleine Drei-
eck auf der Oberseite kennzeichnet die entsprechende abgeschrägte Ecke bei der Platine! Wir nutzen bei den
Adressen die 8 Bit Zählweise. Beim I2C werden aber nur 7 Bit verwendet, wobei das untere das Schreibbit ist.
Daher werden die Adressen unten in der Tabelle in zweier Schritten gezählt. Der DIL-Schalter hat 4 Positionen,
wobei bei uns Position 4 unbelegt ist, somit sind bis zu 8 unterschiedliche Stellungen möglich.
Die Ausgänge vom PCF8574 haben aber eine Besonderheit, sie sind quasi bidirectional. Als open drain können
sie recht große Lasten auf 0V ziehen, aber auf high nur mit 100 uA nach +5V. Daher blinken die LEDs in diesem
Beispiel nur schwach. Immer wenn man ein hIgh Signal sendet, wird der Ausgang ganz kurz auf Versorgungs-
Spannungslevel hochgezogen, dann aber der Stromquelle überlassen. Dies ermöglicht einen quasi bidirektiona-
len Betrieb ohne zusätzliches Richtungsregister. Will man die LEDs heller leuchten lassen, muss man eine andere
Beschaltung verwenden.
+
-
9V
1A
+9V
8574AT
SCL
SCL
SDASDA
P0 P1
C PIO
P4 P2 P3 P5
P6 P7
D
ow
n
sid
e
Adr. 70-7E
LED
LED
SCLS DA
+9V
A0
A1
Tx
Rx
PD2
SCLKMOSI
PD3
PD 6
PD 4
PD 5
PD 7
A7
A3
A2
A6
NANO
to
Br ick`R`
3,3V 5V
USB
B0
SS
MISC
B1
C
DIL Schalter:
1234 8574T 8574AT
000x 40h 70h
001x 42h 72h
010x 44h 74h
011x 46h 76h
100x 48h 78h
101x 4Ah 7Ah
110x 4Ch 7Ch
111x 4Eh 7Eh
// DE_13 I2C - IO Port 8574AT und 8574T
#include <Wire.h> // Denitionen laden fuer I2C
#include <avr/pgmspace.h> // weitere Denitionen
// Alle Adressen bei den 8574xx bricks:
#dene i2cIO8574_0 (0x40>>1) // Trick um elegant mit Bytes
#dene i2cIO8574_1 (0x42>>1) // zu arbeiten statt in 7 Bit
#dene i2cIO8574_2 (0x44>>1) // das letzte Bit ist das R/W
#dene i2cIO8574_3 (0x46>>1) // dass von der Arduino
#dene i2cIO8574_4 (0x48>>1) // Bibliothek dazugefuegt wird
#dene i2cIO8574_5 (0x4A>>1) // wir denieren hier alle
#dene i2cIO8574_6 (0x4C>>1) // Bereiche die man mit den
#dene i2cIO8574_7 (0x4E>>1) // Bricks einstellen kann,.
#dene i2cIO8574A_0 (0x70>>1) // Die Serie PCF8474AT
#dene i2cIO8574A_1 (0x72>>1) // beginnt bei Adresse
#dene i2cIO8574A_2 (0x74>>1) // 0x70 = 70 sedezimal
#dene i2cIO8574A_3 (0x76>>1) // 01110000 binaer
#dene i2cIO8574A_4 (0x78>>1) // oder intern 0111000
#dene i2cIO8574A_5 (0x7A>>1) // dabei 0111xxx
#dene i2cIO8574A_6 (0x7C>>1) // mit x fuer die
#dene i2cIO8574A_7 (0x7E>>1) // Dilschalterposition
// ACHTUNG: hier Zuordnung setzen je nach Schalterstellung
#dene myi2cIOadr i2cIO8574A_0 // HIER PASSENDE ADRESSE EINTRAGEN
void setup() {
Wire.begin(); // I2C aktivieren !
}
void loop() {
Wire.beginTransmission(myi2cIOadr);// Startvorgang I2C Adresse
Wire.write(0x55) ; // IO POrts auf 01010101 abwechseln
Wire.endTransmission(); // Stop Kondition setzen bei I2C
delay(100); // 100 ms verzoegern.
Wire.beginTransmission(myi2cIOadr); // Nochmal die Adresse
Wire.write(0xaa) ; // IO POrts auf 10101010 im Wechsel
Wire.endTransmission(); // Stop Kondition setzen
delay(100); // 100 ms verzoegern.
}
Auszug aus dem Phillips Datenblatt zum PCF8574.
Wichtig ist die Logik rechts mit den beiden MOSFETS und
der 100µA Stromquelle, sowie dem einzelnen p-MOSFET der
kurzzeitig beim Setzen der Register auf 1 den Ausgang auf
VDD (=High) setzt
Was passiert? Die LEDs blinken abwechselnd im Sekunden-
takt.
Wenn sie nicht blinken, zuerst die Adress-Einstellungen an
den DIL-Schaltern kontrollieren !