Eine Bitte um Hilfe

Ernst

Mitglied
4 Okt 2009
59
8
8
nähe Regensburg
Sprachen
Zuerst einen netten Gruß an alle. Ich habe mich mit dem I2C:Bus beschäftigt. Zuerst habe ich bei meinem WIN-Avr die Vorlage für den Temperaturfühler LM75 geladen und den Sensor angeschlossen. Die Temperatur wird auf dem Display angezeigt wenn man davon absieht das weder negative Temperaturen noch die Nachkommastelle Angezeigt wird. Ich habe das Programm verbessert so dass 16 statt 8 Bit ausgelesen, umgerechnet und die Temperatur mit Minusvorzeichen und Nachkommastelle korrekt angezeigt werden. Klappt also super. Dann habe ich mir zwei EEProm ST 24C256 BN6 gekauft auf eine Platine montiert, mittels Pins die Adresse verschieden codiert und ein Programm dazu geschrieben. So konnte ich verschiedene Texte für mein 2X16 Display speichern und auch wieder einlesen und korrekt anzeigen. Klappte super. Ich habe mir dann das Kompassmodul https://www.amazon.de/Demarkt-HMC5883L-drei-Achsen-Magnetfeld-elektronischer-Kompass/dp/B06Y2HFN6X
gekauft und versucht es nach der PDF Vorlage anzusprechen. Jedoch ich bekomme keine Daten von Lage des Sensors zurück. Das einzige was ich zurückbekomme ist der letzte Befehl den ich an den Sensor sende. Ich habe in meinem Programm einen freien Port als Ausgang konfiguriert an dem Leds angeschlossen sind. So das immer eine weitere Led leuchtet wenn beispielsweise der Sensor mit seiner Adresse angesprochen wird und sein OK zurück gibt. So bringe ich alles Leds zum Leuchten bis auf die eine wo er die Positionsdaten zurück senden sollte. Da scheint er nicht zu antworten und es erschein am Display nur der letzte Befehl die ich ihm geschickt habe. Mir geht es vorerst nicht darum um Abgleich und so weiter sondern nur das ich überhaupt mal Positionsdaten zurück bekomme. Ich wäre um einen Tipp oder Denkanstoß sehr dankbar.
Gruß Ernst
Hier der Ausschnitt aus dem PDF Dokument nach dem ich den Sensor anspreche



OPERATIONAL EXAMPLES

The HMC5883L has a fairly quick stabilization time from no voltage to stable and ready for data retrieval. The nominal 56 milli-seconds with the factory default single measurement mode means that the six bytes of magnetic data registers (DXRA, DXRB, DZRA, DZRB, DYRA, and DYRB) are filled with a valid first measurement.

To change the measurement mode to continuous measurement mode, after the power-up time send the three bytes:

0x3C 0x02 0x00

This writes the 00 into the second register or mode register to switch from single to continuous measurement mode setting. With the data rate at the factory default of 15Hz updates, a 67 milli-second typical delay should be allowed by the I2C master before querying the HMC5883L data registers for new measurements. To clock out the new data, send:

0x3D, and clock out DXRA, DXRB, DZRA, DZRB, DYRA, and DYRB located in registers 3 through 8. The HMC5883L will automatically re-point back to register 3 for the next 0x3D query. All six data registers must be read properly before new data can be placed in any of these data registers.

Below is an example of a (power-on) initialization process for “continuous-measurement mode”:

1. Write CRA (00) – send 0x3C 0x00 0x70 (8-average, 15 Hz default, normal measurement)

2. Write CRB (01) – send 0x3C 0x01 0xA0 (Gain=5, or any other desired gain)

3. Write Mode (02) – send 0x3C 0x02 0x00 (Continuous-measurement mode)

4. Wait 6 ms or monitor status register or DRDY hardware interrupt pin

5. Loop



Send 0x3D 0x06 (Read all 6 bytes. If gain is changed then this data set is using previous gain)

Convert three 16-bit 2’s compliment hex values to decimal values and assign to X, Z, Y, respectively.

Send 0x3C 0x03 (point to first data register 03)

Wait about 67 ms (if 15 Hz rate) or monitor status register or DRDY hardware interrupt pin

End_loop
 

Janiiix3

Aktives Mitglied
28 Sep 2013
1.323
10
38
Hannover
Sprachen
ANSI C, C#
Hallo @Ernst,

das hört sich erstmal nach einem "Protokollfehler" deinerseits an. Leider hast Du weder Quellcode noch eine Sprache angegeben in der Du programmierst ( oder habe ich es überlesen? ).

Meist haben die Chips ein "ID Register" ( wie dieser auch. 0x10..0x12 )

- An der Adresse "0x10" solltest Du das ASCII 'H' Zeichen auslesen können.
- Die Adresse "0x11" enthält ebenfalls ein ASCII Zeichen, hier sollte eine '4' kommen.
- Letzte Adresse "0x12" eine '3'.

Hast Du das schon probiert? Bevor man irgendwelche AD Werte versucht zu empfangen.

Ansonsten müsste das Kommunikations-Protokoll wie folgt aussehen ( Byteweise! ):

Byte Wert
[0] I2C Slave Adresse
[1] Slave Register Adresse
[2] Slave Register Wert

Und die start bzw. stop Bedingungen müssen beachtet werden, dass sollte jedoch schon klappen ( sonst hättest Du andere Teilnehmer nicht testen können ).
 
Zuletzt bearbeitet:

Ernst

Mitglied
4 Okt 2009
59
8
8
nähe Regensburg
Sprachen
Grüßt euch

Zuerst möchte ich für die schnelle Antwort danken. Ich schreibe meine Programme in Assembler. Ich glaube auch das es an den Start und Stopp Bedingungen liegt warum es nicht klappt. Ich habe halt einfach das Programm vom LM75 umgeschrieben. Es gibt in diesem Programm Unterprogramme wie Start, Senden, Lesen, Stopp. Ich denke mal das die korrekt sind da ich diese Unterprogramme im Original auf für meine EEProm`s nutze und das klappt auch. Mir geht es darum wie und wann muss ich die Start -und Stoppbefehle senden. Ich habe es so gemacht.

Parameter vom Sensor setzen

Start senden (als Master anmelden)

Adresse senden (0x1E) Sensor Adresse

Schreiben senden (0x3C) schreiben

Daten senden ´ (0x00) Register A auswählen

Daten senden (0x70) 8-Mittelwert, 15 Hz Standard, normale Messung

Stopp

Start (als Master anmelden)

Adresse senden (0x1E) Sensor Adresse

Schreiben senden (0x3C) schreiben

Daten senden ´ (0x01) Register B auswählen

Daten senden ´ (0xA0 )Verstärkung auswählen

Stopp

Start (als Master anmelden)

Adresse senden (0x1E) Sensor Adresse

Schreiben senden (0x3C) schreiben

Daten senden ´ (0x02) Mode Register

Daten senden (0x00) Parameter dauernd messen

Stopp

Anweisungen zum Daten lesen senden

Start senden (als Master anmelden)

Adresse senden (0x1E) Sensor Adresse

Schreiben senden (0x3C) Hier sollte 0x0D stehen bekomme aber dann keine OK Meldung vom Sensor zurück, Ich vermute hier den Start / Stopp Fehler

Daten senden ´ (0x06) alle 6 Bytes lesen

Schreiben senden (0x3C) schreiben

Daten senden ´ (0x03) Zeiger auf erstes Datenregister 03

Daten lesen X MSB Register

Daten lesen X LSB Register

Daten lesen Z MSB Register

Daten lesen Z LSB Register

Daten lesen Y MSB Register

Daten lesen Y LSB Register

Stopp

Schleife zum Programmanfang
 

Janiiix3

Aktives Mitglied
28 Sep 2013
1.323
10
38
Hannover
Sprachen
ANSI C, C#
Assembler ist jetzt nicht so meins.
Da könnten Dir @TommyB oder @LotadaC weiterhelfen.
 

Dirk

Administrator
Teammitglied
28 Jan 2007
4.292
141
63
Mittelhessen, Giessen
Sprachen
ANSI C, C++, C#, Java, Kotlin, Pascal, Assembler, PHP
Hallo Ernst,

nach START musst du die I2C Adresse um ein Bit nach links geschoben mit dem Bit 0 für R/W senden.

Du machst das in deinen Beispielen "doppelt".

Du sendest nach START die 7Bit I2C Adresse 0x1E (ohne R/W Bit) und danach entweder die Schreibadresse 0x3C oder die Readadresse 0x3D.
Dies ist so nicht richtig.
Der HMC5883L wird also erst gar nicht adressiert.

Für schreiben machst du zum Beispiel folgendes:

START
0x3C
...
STOP


Dirk :ciao:
 

Ernst

Mitglied
4 Okt 2009
59
8
8
nähe Regensburg
Sprachen
Grüßt euch
1000 Mal Danke das war der Denkanstoß. Ich habe gedacht ein Bit zu 1E ist dann 1F das habe ich nicht gewusst dass man das Bit hinten dran hängen muss. Ich habe gedacht zuerst die Adresse 1E senden und dann 3D oder 3C fürs Lesen bzw. Schreiben senden. Ich kann es bis zum Wochenende nicht ausprobieren aber ich denke dass es jetzt funktioniert. Nochmals danke.

Gruß Ernst
 

Ernst

Mitglied
4 Okt 2009
59
8
8
nähe Regensburg
Sprachen
Grüßt euch
leider hat es nicht geklappt. Ich vermute mal das es am Chip liegt. Das der andere Register oder Dialekt spricht. Hier die Aufschrift auf den Chip
D8
5883
7006

Ich habe das Programm schon zig mal geändert und den Chip in aller Denkbarer weise angesprochen bevor ich euch um Hilfe gebeten habe. Leider habe ich immer noch keinen Erfolg damit. Wenn ich ihn mit 3D anspreche kommen nach dem "lesen" nur 3D zurück oder das Programm bleibt stecken.
Falls es jemand interessiert hier der Programmausschnitt fürs Schreiben und fürs Lesen. Die Unterprogramme den Bus als Master ansprechen, starten, schreiben, lesen funktionieren beim Temperatursensor und beim externen EEprom super also glaube ich nicht das es daran liegt.
Hier das Programm fürs Schreiben
rcall twiInitMaster

push r16
rcall twiStart ; TWI starten
ldi r16,0x3c ;select schreiben Register
clr r15 ; kein ACKN
rcall twiWriteByte ; Daten schreiben
ldi r16,0x02;Register 2
clr r15 ; kein ACKN
rcall twiWriteByte ; Daten schreiben
ldi r16,0x00;dauernde Messung
clr r15 ; kein ACKN
rcall twiWriteByte ; Daten schreiben
clr r15 ; kein ACKN
pop r16
rcall twiStopp
ret
Hier das Programm zum lesen

push r15
rcall twiStart ; TWI starten
ldi r16,0x3c ;select schreiben Register
clr r15 ; kein ACKN
rcall twiWriteByte ; Daten schreiben
ldi r16,0x03 ;select schreiben Register
clr r15 ; kein ACKN
rcall twiWriteByte ; Daten schreiben
rcall twiStart ; TWI starten
ldi r16,0x3d ;select schreiben Register
com r15 ; TWEA = acknowledge = TWI-Datenanforderung
rcall twiWriteByte ; Daten schreiben
rcall twiStart
;ldi r16,0x06 ;select schreiben Register
com r15; TWEA = acknowledge = TWI-Datenanforderung
rcall twiWriteByte ; Daten schreiben
clr r15 ; kein ACKN
rcall twiReadByte
mov r17,r16; hier sollten die Daten für Data Output X MSB Register sein
clr r15 ; kein ACKN
rcall twiReadByte
mov r18,r16; hier sollten die Daten für Data Output X LSB Register sein
clr r15 ; kein ACKN
rcall twiReadByte
mov r19,r16; hier sollten die Daten für Data Output Z MSB Register sein
clr r15 ; kein ACKN
rcall twiReadByte
mov r20,r16; hier sollten die Daten für Data Output Z LSB Register sein
clr r15 ; kein ACKN
rcall twiReadByte
mov r21,r16; hier sollten die Daten für Data Output Y MSB Register sein
clr r15 ; kein ACKN
rcall twiReadByte
mov r22,r16; hier sollten die Daten für Data Output Y LSB Register sein
rcall twiStopp
pop r15
ret
 
Zuletzt bearbeitet:

dino03

Aktives Mitglied
27 Okt 2008
6.722
16
38
Sprachen
BascomAVR, Assembler
Hi Ernst,

Grüßt euch
leider hat es nicht geklappt. Ich vermute mal das es am Chip liegt. Das der andere Register oder Dialekt spricht. Hier die Aufschrift auf den Chip
D8
5883
schreib dir doch mal nen Programm, das alle I2C-Adressen durchtestet. Also immer in einer Schleife ...

Adresse = 0
-- Schleifenanfang
I2Cstart
I2Cwrite <Adresse>
Wenn Ack vom Baustein kommt, Adresse auf LCD oder Seriell anzeigen
I2Cstop
Adresse +1
-- Schleifenende

Dann kannst du sehen ob der Baustein überhaupt auf irgendwas reagiert.

Das kann man auch machen, wenn man auf nem RasPI die I2C-Hilfsprogramme/Bibliotheken installiert. Dort gibt es auch nen Suchprogramm. Das zeigt dann im Terminal eine Tabelle mit den gefundenen aktiven Adressen an.

Gruß
Dino
 

Dirk

Administrator
Teammitglied
28 Jan 2007
4.292
141
63
Mittelhessen, Giessen
Sprachen
ANSI C, C++, C#, Java, Kotlin, Pascal, Assembler, PHP
Hallo Ernst,

stell vielleicht auch nochmal ein Beispielcode in das Forum, wie du auf den Baustein zugreifst, ruhig auch in Assembler.

Dirk :ciao:
 

Ernst

Mitglied
4 Okt 2009
59
8
8
nähe Regensburg
Sprachen
Grüßt euch
Zuerst ein Danke für eure Hilfe
Ich habe das Programm das Dino mir geraten hat so geschrieben
mainloop: wdr
ldi r31,0
loop:
wdr
push r15
rcall twiStart
mov r16,r31
clr r15
rcall twiWriteByte
mov r28,r31 ;r28 Register für LCD Anzeige
rcall twiStopp
pop r15
rcall Aufbereitung ;LCD Anzeige
inc r31
rjmp loop
Da stoppt das Programm bei 0B00011011 was bedeuten würde das die gefundene Adresse 1B ist. Sehe ich das richtig so?
Gruß Ernst
 

dino03

Aktives Mitglied
27 Okt 2008
6.722
16
38
Sprachen
BascomAVR, Assembler
Hallo Ernst,

Da stoppt das Programm bei 0B00011011 was bedeuten würde das die gefundene Adresse 1B ist. Sehe ich das richtig so?
demnach wäre das nach dieser Info (Adressierung) ... https://rn-wissen.de/wiki/index.php/I2C
also 0001 101 und Read .... hmmm ... theoretisch hätte der Chip sich bei 0001 1010 auch melden müssen (das wäre dann Write gewesen). Da das letzte Bit zwischen Read (1) und Write (0) umschaltet, hat ein Baustein eigentlich immer zwei 8Bit-Adressen (aber nur eine 7Bit-Adresse plus angehängtem R/W-Bit).

Gruß
Dino
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)