Forum: Mikrocontroller und Digitale Elektronik PIC24FJ, XC16 I2C


von Max H. (hartl192)


Lesenswert?

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

von Frank M. (frank_m35)


Angehängte Dateien:

Lesenswert?

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.

von Max H. (hartl192)


Lesenswert?

Wow, das ging schnell. Werde mit dem Code mal ansehen.
Danke

von Max H. (hartl192)


Lesenswert?

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
von Frank M. (frank_m35)


Lesenswert?

Solltest beim dritten MasterWriteI2C1 vielleicht ein Lesebefehl anstatt 
Schreibbefehl senden?!

von Michael H. (morph1)


Lesenswert?

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
von Frank M. (frank_m35)


Lesenswert?

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.

von Max H. (hartl192)


Lesenswert?

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.

von Michael H. (morph1)


Lesenswert?

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 ;)

von Frank M. (frank_m35)


Lesenswert?

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
Noch kein Account? Hier anmelden.