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 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:
Beim Schreiben und Lesen auf nachfolgende Register muss nur 1x die Startadresse angegeben werden. Danach inkrementiert der Baustein die Registeradresse automatisch.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); }
gruß
Bernhard
Geändert von BASTIUniversal (25.04.2011 um 15:49 Uhr) Grund: Code-Box eingefügt
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
Geändert von Snow Wolf (23.04.2011 um 23:14 Uhr)
Lesezeichen