-
Hallo Wolf,
ich habe am PCA9555 ein LCD im 8-Bit Modus und ein Tastenkreuz mit 5 Tastern hängen. Bei mir schaut der relevante Teil so aus:
Code:
// PCA9555D: Adresse 0100 000x
// Schreib-Adresse 0x40, Lese-Adresse 0x41
#define PCA9555_wr 0x40
#define PCA9555_rd 0x41
// Konfiguration: Port 1 Bits 3-7 auf Input 0-2 Output
// Port 0 auf Output
// Port 0 Register (Command 0x06) auf 0x00
// Port 1 Register (Command 0x07) auf 0xF8
void init_pca9555(void)
{
i2c_init (); // I2C-Bus initialisieren (Grundzustand)
i2c_start (); // Startbedingung I2C-Bus ausgeben
i2c_schreiben (PCA9555_wr); // Adresse PCA9555
i2c_schreiben (0x06); // Control-Byte 6
i2c_schreiben (0x00); // Direction für Port 0
i2c_schreiben (0xF8 ); // Direction für Port 1
i2c_stop (); // Stoppbedingung I2C-Bus ausgeben
}
// pca9555_read_port1(void)
// Liest 8 Datenbit von Port 1
// P1.3-1.7 => Tastenkreuz
unsigned char pca9555_read_port1(void)
{
unsigned char wert;
i2c_init (); // I2C-Bus initialisieren (Grundzustand)
i2c_start (); // Startbedingung I2C-Bus ausgeben
i2c_schreiben (PCA9555_wr); // Baustein Adresse Schreiben
i2c_schreiben (0x01); // Controll-Byte lese Port 1
i2c_start (); // repeated Startbedingung I2C-Bus ausgeben
i2c_schreiben (PCA9555_rd); // Baustein Adresse lesen
wert = i2c_lesen (0);
i2c_stop (); // Stoppbedingung I2C-Bus ausgeben
return (wert);
}
Beim Schreiben und Lesen auf nachfolgende Register muss nur 1x die Startadresse angegeben werden. Danach inkrementiert der Baustein die Registeradresse automatisch.
gruß
Bernhard
-
Das hilft mir sehr weiter nur die Frage ist welche lib.h du einschließt. Ansonsten war da sehr hilfreich. Auch wenn ich mich einmal nur auf die Ausgänge konzentrieren will
MfG Snow Wolf
-
Hallo,
ich Programmiere mit einem AT89C5131, also 8051-Familie. Auf dem RP6 ist ja ein ATMega128, aber dort gibt es doch auch eine I2C-Lib. Einfach die hier geposteten Funktionen anschauen und den groben Verlauf nachbauen, dann müsste es passen.
Ich habe mal in der Anleitung zum RP6 geschaut (S.107ff). Du musst den dann im Master-Mode initialisieren. Danach wird aus meiner init_PCA9555 zum Beispiel ein Aufruf der Funktion void I2CTWI_transmit3Bytes(uint8_t adr, uint8_t data1, uint8_t data2, uint8_t data3)
Konkret also I2CTWI_transmit3Bytes(PCA9555_wr, 0x06, 0x00, 0xF8 );
Lesen mehrerer Bytes macht die Funktion void I2CTWI_readBytes(uint8_t targetAdr, uint8_t * messageBuffer, uint8_t numberOfBytes);
Für das obige Beispiel muss aber (vermutlich) trotzdem die Schreibadresse des Bausteins eingesetzt werden:
I2CTWI_transmitByte(PCA9555_wr, 0x01); // Adresse auf Register 0x01 setzen
uint8_t Port[1]; // als Array definiert, obwohl nur 1 Byte. Macht die Pointerei einfacher.
I2CTWI_readBytes(PCA9555_wr, Port, 1); // der Pointer Port zeigt auf die Anfangsadresse des Arrays Port[], also auf Port[0]
viel Erfolg
Bernhard
-
Das obige natürlich ohne Gewehr - äh Gewähr :)
tschuessle
B.
-
naja dann werd ich das mal versuchen vl funktioniert es, ich werd das Ergebnis spätestens nächste Woche posten
MfG Snow Wolf