Hallo Elektroniker,
bastel seit ein paar Tagen mit einem PIC4550 und dem I/O-Expander
MCP23008 von Microchip rum. Ich verwende den I2C-Bus zum ersten Mal und
habe prompt ein Problem:
Wenn ich einen Output-Pin setzen möchte und dazu in das OLAT-Register
schreibe, so schreibt er zwar ins OLAT, übernimmt den Wert von dort aber
nicht ins GPIO-Register.
Sämtliche Pins sind als Output konfiguriert über IODIR-Register = 0x00.
Desweiteren sieht mein I2CSendByte-Code (programmiert mit dem
C18-Compiler) folgendermaßen aus:
1 | void i2cSendByteNEW(unsigned char addressModule, unsigned char addressReg, unsigned char data)
|
2 | {
|
3 | PIR1bits.SSPIF = 0; //SSPIF Bit löschen
|
4 | SSPCON2bits.SEN = 1; //Bus übernehmen
|
5 | while(!PIR1bits.SSPIF); //Warten bis Bus übernommen
|
6 | PIR1bits.SSPIF = 0; //SSPIF zurücksetzen
|
7 | SSPBUF = (addressModule&0xFE); //Adresse des MCP23008
|
8 |
|
9 | while(SSPCON2bits.ACKSTAT); //Wait for ACK
|
10 | PIR1bits.SSPIF = 0; //SSPIF Bit löschen
|
11 | SSPBUF = addressReg; //Adresse des Registers
|
12 | while(SSPCON2bits.ACKSTAT); //Wait for ACK
|
13 | PIR1bits.SSPIF = 0;
|
14 | SSPBUF = data; //Byte Senden
|
15 | while(SSPCON2bits.ACKSTAT); //Wait for ACK
|
16 | PIR1bits.SSPIF = 0;
|
17 | SSPCON2bits.PEN = 1; //Bus freigeben
|
18 | while(!PIR1bits.SSPIF);
|
19 | PIR1bits.SSPIF = 0; //SSPIF zurücksetzen
|
20 | }//End i2cSendByteNEW
|
Interessant ist, wie gesagt, dass korrekt gesendet wird (wenn ich OLAT
auslese stimmts), dies aber nicht auf GPIO übertragen wird.
Für Hinweise auf Fehler wäre ich sehr dankbar!
Vielen Dank für die Mühe
MfG
Patrick