PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] PIC 18F2550 I²C Kommunikation XC8 Compiler



simon161718
23.01.2017, 18:54
Hallo zusammen. Ich versuche gerade eine I2C Kommunikation aufzubauen. Leider klappt es noch nicht wirklich :-(

Ich habe das Programm daraufhin im Debug Modus laufen gelassen.
Irgendwas stimmt mit dem I2C_Read Befehl nicht. Er hängt sich in einer
while-Schleife auf und macht an diesem Punkt nicht weiter bzw er verbleibt in der while schlife (SSPSTATbits.BF), er empfängt anscheinend keine Daten. Habt
ihr eine Ahnung wodrann das liegen könnte?


Wem es hilft dem habe ich außerdem noch meinen Quellcode beigefügt.


void INIT_I2C(void){
OpenI2C(MASTER, SLEW_OFF);
SSPADD = 19;
}




unsigned int TEST = 0x0000;
unsigned char LSB = 0x00, MSB = 0x00;



while(1)

{



StartI2C(); // Start condition I2C on bus
IdleI2C();

WriteI2C(0x95); // addresses the chip + 1 LESEN
IdleI2C();
// AckI2C();



LSB = ReadI2C(); // read the value from the SLAVE and store in TEST variable.
IdleI2C();
// AckI2C();
MSB = ReadI2C();
IdleI2C();


// NotAckI2C(); // Not Acknowledge condition. This will signal the SLAVE that reading data has completed.
IdleI2C();

StopI2C(); // Stop condition I2C on bus


TEST = MSB << 8 | LSB;

MSB=0x00;
LSB=0x00;
}

Klebwax
23.01.2017, 19:21
Du macht es einem nicht leicht, dir zu helfen. Die vielen überflüssigen Leerzeilen zwingen einen zum dauernden Scrollen, wenn man den Code lesen will. Die fehlenden Einrückungen machen es auch nicht leichter.

Der Code ist auch nicht vollständig. Funktionen wie WriteI2C() etc kann ich nicht finden. Ich weiß also nicht, was sie macht und kann daher keinen Fehler suchen. Der Name ist auch schlecht gewählt, das I von I2C liest man leicht als kleines l. Write_I2C() oder I2C_WRITE() wäre besser. Dann kann man leicht alle I2C Funktionen mit "I2C_" suchen.

MfG Klebwax

Unregistriert
23.01.2017, 20:05
Du macht es einem nicht leicht, dir zu helfen. Die vielen überflüssigen Leerzeilen zwingen einen zum dauernden Scrollen, wenn man den Code lesen will. Die fehlenden Einrückungen machen es auch nicht leichter.

Der Code ist auch nicht vollständig. Funktionen wie WriteI2C() etc kann ich nicht finden. Ich weiß also nicht, was sie macht und kann daher keinen Fehler suchen. Der Name ist auch schlecht gewählt, das I von I2C liest man leicht als kleines l. Write_I2C() oder I2C_WRITE() wäre besser. Dann kann man leicht alle I2C Funktionen mit "I2C_" suchen.

MfG Klebwax

Hi Klebwax,

sorry für den unübersichtlichen Code...

Den Write_I2C() Befehl findest du direkt unter der Start-Bedingung :-)
Dort spreche ich die Slave Adresse an.


Bis dahin klappt auch alles, aber sobald es ans lesen geht, stop der Debugger in der besagten While-Schleife...

Klebwax
23.01.2017, 21:08
Den Write_I2C() Befehl findest du direkt unter der Start-Bedingung :-)
Dort spreche ich die Slave Adresse an.

Dort sehe ich nur, daß die Funktion aufgerufen wird. Die Funktion selbst (in C das ist kein Befehl sondern eine Funktion) kann ich nicht finden, die anderen Funktionen, die I2C betreffen, ebenfalls nicht. Aus der C Standard Library sind sie nicht, die kennt kein I2C.

MfG Klebwax

Unregistriert
23.01.2017, 22:17
Die Funktionen sind aus der plib.h, also der peripheral libary von microchip. Dort sind die ganzen I2C Funktionen hinterlegt

Klebwax
24.01.2017, 01:01
Die Funktionen sind aus der plib.h, also der peripheral libary von microchip. Dort sind die ganzen I2C Funktionen hinterlegt

Ich hab zwar schon ein paar mal I2C und vieles mehr mit PICs gemacht, aber die Peripheral Library noch nie benutzt. Sorry

MfG Klebwax

Unregistriert
24.01.2017, 18:02
Die Funktionen sind aus der plib.h, also der peripheral libary von microchip. Dort sind die ganzen I2C Funktionen hinterlegt

richtig :-)

Weißt du, wie es dazu kommen kann, dass ich in dieser (SSPSTATbits.BF) Schleife hängen bleibe?

Peter(TOO)
03.02.2017, 17:40
Hallo,




void INIT_I2C(void)
{
OpenI2C(MASTER, SLEW_OFF);
SSPADD = 19;
}

unsigned int TEST = 0x0000;
unsigned char LSB = 0x00, MSB = 0x00;

while(1)
{
StartI2C(); // Start condition I2C on bus
IdleI2C();

WriteI2C(0x95); // addresses the chip + 1 LESEN
IdleI2C();
// AckI2C();

LSB = ReadI2C(); // read the value from the SLAVE and store in TEST variable.
IdleI2C();
// AckI2C();
MSB = ReadI2C();
IdleI2C();


// NotAckI2C(); // Not Acknowledge condition. This will signal the SLAVE that reading data has completed.
IdleI2C();

StopI2C(); // Stop condition I2C on bus

TEST = MSB << 8 | LSB;

MSB=0x00;
LSB=0x00;
}



Da fehlt doch was oder es ist etwas zu viel?

MfG Peter(TOO)