Ich möchte den HMC5883L Kompass Sensor mit meinem PIC24FJ64GA002 über I2C ansteuern. Ich habe gesehen, dass es von Microchip mit dem XC16 Compiler eine I2C Library mitbringt, nur habe ich leider nicht verstanden wie ich sie anwende. Hat jemand zufällig einen Beispielcode oder weiß wo ich einen finde der die Anwendung dieser Lib zeigt? Vielen Dank Max
Hier findest du die nötigen Beispiele: http://www.microchip.com/CodeExamplesByFunc.aspx An den Post angehängt habe ich meine eigene I2C Implementierung sowie die Ansteuerung des Magnetsensors für einen PIC24FJ256GB108.
Ich habe mit der Lib von Microchip einen Code geschrieben, der aber leider nicht funktioniert:
1 | StartI2C1(); //Send the Start Bit |
2 | IdleI2C1(); //Wait to complete |
3 | |
4 | MasterWriteI2C1(HMC5883L_Address_Write); //transmit write command |
5 | IdleI2C1(); |
6 | MasterWriteI2C1(0x0A); |
7 | IdleI2C1(); |
8 | |
9 | RestartI2C1(); |
10 | IdleI2C1(); |
11 | MasterWriteI2C1(HMC5883L_Address_Write); //transmit write command |
12 | IdleI2C1(); |
13 | |
14 | readbuf=MasterReadI2C1(); |
15 | NotAckI2C1(); |
16 | StopI2C1(); //Send the Stop condition |
17 | IdleI2C1(); //Wait to complete |
18 | LATB=readbuf; |
Ich versuche das "Identification Register A", in dem 0x48 stehen sollte, auszulesen, der µC gibt mir aber immer 0x5C aus. Hat jemand eine Ahnung woran das liegen könnte?
:
Bearbeitet durch User
Solltest beim dritten MasterWriteI2C1 vielleicht ein Lesebefehl anstatt Schreibbefehl senden?!
Frank M. schrieb: > Solltest beim dritten MasterWriteI2C1 vielleicht ein Lesebefehl > anstatt > Schreibbefehl senden?! Nein, nach dem Repeated-Start kommt erstmal wieder die Bus-Adresse. Was allerdings richtig zu setzen (oder zu löschen) wäre, ist das Write-Bit beim ersten Schreib-Zugriff (oder eben beim 3., man sieht ja leider nicht wie "HMC5883L_Address_Write" definiert ist) :) Andernfalls wird die interne Schreib-/Leseadresse nicht auf die gewünschte 0x0A gesetzt. Ich würde übrigens empfehlen die I²C-Sachen selbst zu schreiben, die Makros/Funktionen von Microchip sind furchtbar und zusätzlich auch noch blocking...
:
Bearbeitet durch User
Michael H. schrieb: > Frank M. schrieb: >> Solltest beim dritten MasterWriteI2C1 vielleicht ein Lesebefehl >> anstatt >> Schreibbefehl senden?! > > Nein, nach dem Repeated-Start kommt erstmal wieder die Bus-Adresse. Was > allerdings richtig zu setzen (oder zu löschen) wäre, ist das Write-Bit > beim ersten Schreib-Zugriff (oder eben beim 3., man sieht ja leider > nicht wie "HMC5883L_Address_Write" definiert ist) :) Naja, das meinte ich auch mit Lesebefehl senden (MasterWriteI2C1(HMC5883L_Address_Read), sofern definiert), aber stimmt war blöd und missverständlich von mir ausgedrückt.
Ich hatte "HMC5883L_Address_Read" und dabei ist der oben genannte Fehler aufgetreten, ich habe es nur für was anderes geändert und vergessen es vor dem Posten zurückzuändern.
Naja, aber wir wissen immernoch nicht was du denn damit definiert hast... Da hier eine potenzielle Fehlerquelle liegt, wäre es nicht verkehrt uns mal zu sagen was hinter der Variablen/dem Makro steckt ;)
Ebenso wissen wir nicht wie du den I2C Bus initialisiert hast. Woher weisst du dass 0x5C ausgegeben werden? Hast du die Variable mal direkt über den Debugger ausgelesen?
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.