Forum: Mikrocontroller und Digitale Elektronik LSM6DSL Gyro+Accelerometer, Gyro gibt keine Werte aus.


von J. T. (chaoskind)


Angehängte Dateien:

Lesenswert?

MoinMoin,

kennt jemand von euch zufällig den LSM6DSL von STM? Ein 
Gyro/Accelerometer. Ich hab den auf dem IKS01A2-Sensorbord. Das 
Accelerometer macht klaglos was soll. Aber das Gyro liefert mir nur beim 
ersten Auslesen einen Satz Werte für X-, Y- und Z-Achse, nach jedem 
Reset die selben. Ich vermute, dass ich irgendwie die falschen Register 
auslese, da sich die Werte auch nicht ändern, wenn ich FULL_SCALE(den 
Messbereich) ändere. Würde nur einmal ein Wert ausgelesen werden, sollte 
der sich ja mit dem Messbereich ändern... Auf der anderen Seite wäre es 
schon komisch, wenn die Register im Datenblatt falsch angegeben wären. 
Die Register von Gyro und Accelerometer liegen direkt hintereinander 
weg.

Die "Initialisierung" vom Accerometer besteht nur darin das CTRL1_XL 
Register  zu setzen. Das mach ich auf 0b10001100 und ich kann mir die 
Werte abholen, kein FIFO kein ganix... Beim Gyro klappt das aber einfach 
nicht. Die Controlregister gehen auf Seite54 im angehängten Datenblatt 
los. Dabei ist mir auch aufgefallen, dass auf Seite 55 in Table46 bei 
FS_XL steht, 00 = 2g, 01 = 16g, 10 = 4g, 11 = 8g ist. Alle anderen Werte 
die mir begegnet sind, sind in anständig aufsteigernder Reihenfolge. 
Dass kommt mir irgendwie quer Beet vor...

Der Forumssuche scheint der LSM6DSL völlig unbekannt zu sein, auch 
Google konnte mir nicht recht weiterhelfen, dass förderte lediglich 
jemanden zu Tage, der Probleme hatte, eine Achse des Gyros in den FIFO 
zu bekommen....

Meine Init sieht vom LSM6 sieht folgendermaßen aus:
1
Send_Buffer[0] = CTRL1_ACCEL;
2
  Send_Buffer[1] = HighPerfomance2g;
3
  HAL_I2C_Master_Transmit(&hi2c1, LSM6DSL_Adr, &Send_Buffer[0], Size, I2C_Timeout);
4
5
  Send_Buffer[0] = CTRL2_GYRO;
6
  Send_Buffer[1] = HighPerformance500dps;
7
  HAL_I2C_Master_Transmit(&hi2c1, LSM6DSL_Adr, &Send_Buffer[0], Size, I2C_Timeout);
8
9
  Send_Buffer[0] = CTRL7_G;
10
  Send_Buffer[1] = HPF_En;
11
  HAL_I2C_Master_Transmit(&hi2c1, LSM6DSL_Adr, &Send_Buffer[0], Size, I2C_Timeout);
12
13
  Send_Buffer[0] = CTRL4_C;
14
  Send_Buffer[1] = DRDY_MASK;
15
  HAL_I2C_Master_Transmit(&hi2c1, LSM6DSL_Adr, &Send_Buffer[0], Size, I2C_Timeout);

ausgelesen wird mit:
1
    HAL_I2C_Mem_Read(&hi2c1, LSM6DSL_Adr, ACCEL_X_REG_L, 1, &Recieve_Buffer[0], 2, I2C_Timeout);
2
    Accel_X = Recieve_Buffer[0] | (Recieve_Buffer[1] << 8);
3
    HAL_I2C_Mem_Read(&hi2c1, LSM6DSL_Adr, ACCEL_Y_REG_L, 1, &Recieve_Buffer[0], 2, I2C_Timeout);
4
    Accel_Y = Recieve_Buffer[0] + (Recieve_Buffer[1] << 8);
5
    HAL_I2C_Mem_Read(&hi2c1, LSM6DSL_Adr, ACCEL_Z_REG_L, 1, &Recieve_Buffer[0], 2, I2C_Timeout);
6
    Accel_Z = Recieve_Buffer[0] + (Recieve_Buffer[1] << 8);
7
8
    HAL_I2C_Mem_Read(&hi2c1, LSM6DSL_Adr, GYRO_X_REG_L, 1, &Recieve_Buffer[0], 2, I2C_Timeout);
9
    Gyro_X = Recieve_Buffer[0] | (Recieve_Buffer[1] << 8);
10
    HAL_I2C_Mem_Read(&hi2c1, LSM6DSL_Adr, GYRO_Y_REG_L, 1, &Recieve_Buffer[0], 2, I2C_Timeout);
11
    Gyro_Y = Recieve_Buffer[0] + (Recieve_Buffer[1] << 8);
12
    HAL_I2C_Mem_Read(&hi2c1, LSM6DSL_Adr, GYRO_Z_REG_L, 1, &Recieve_Buffer[0], 2, I2C_Timeout);
13
    Gyro_Z = Recieve_Buffer[0] + (Recieve_Buffer[1] << 8);

und meine defines sehen so aus:
1
#define LSM6DSL_Adr    0xD6
2
3
#define CTRL1_ACCEL    0x10
4
  #define HighPerfomance8g  0b10001100
5
  #define HighPerfomance4g  0b10001000
6
  #define HighPerfomance16g  0b10000100
7
  #define HighPerfomance2g  0b10000000
8
9
#define CTRL2_GYRO    0x11
10
  #define HighPerformance2000dps  0b10001100
11
  #define HighPerformance1000dps  0b10001000
12
  #define HighPerformance500dps  0b10000100
13
  #define HighPerformance250dps  0b10000000
14
15
#define CTRL3_C      0x12
16
  #define SW_RESET      0b00000101
17
18
#define CTRL4_C      0x13
19
  #define DRDY_MASK      0b00001000
20
21
#define CTRL7_G      0x16
22
  #define  HPF_En    0b01000000
23
24
#define STATUS_REG     0x1E
25
#define TEMP_REG_L     0x20
26
#define TEMP_REG_H     0x21
27
#define GYRO_X_REG_L   0x22
28
#define GYRO_X_REG_H  0x23
29
#define GYRO_Y_REG_L  0x24
30
#define GYRO_Y_REG_H  0x25
31
#define GYRO_Z_REG_L  0x26
32
#define GYRO_Z_REG_H  0x27
33
#define ACCEL_X_REG_L  0x28
34
#define ACCEL_X_REG_H  0x29
35
#define ACCEL_Y_REG_L  0x2A
36
#define ACCEL_Y_REG_H  0x2B
37
#define ACCEL_Z_REG_L  0x2C
38
#define ACCEL_Z_REG_H  0x2D

Kann jemand irgendwas dazu sagen, wieso die Reihenfolge der 
Messbereichsbits in Table 46 so durcheinander ist und ob das so sein 
soll? Und vor allem etwas hilfreiches zu dem Problem, dass mir das 
Gyroskop seine Werte verweigert?

MfG Chaos

von J. T. (chaoskind)


Lesenswert?

P.S.

Die Achswerte vom Gyro sind übrigens 4 für die X-, 0 für die Y- und 1024 
für die Z-Achse, falls das weiterhelfen sollte. Und die Werte sind 
jeweils 16bittig.

von J. T. (chaoskind)


Lesenswert?

Ich hab mir nun eine Funktion geschrieben, die einfach alle Register, 
die mit 8 Bit möglich sind, 2 mal im Abstand von einer Sekunde abfragt 
und dass dann auf unterschiedliche Werte vergleicht. (Während  der 
Abfrage schüttel ich das ganze Gebilde wild hin und her, dass möglichst 
unterschiedliche Werte rauskommen sollten).

Dabei bekomme ich die 6 Register vom Accelerometer (X-,Y- und Z- je High 
und Lowbyte) diese liegen wie im Datasheet angegeben von 0x28 - 0x2D. 
Dann bekomme ich noch einen 6er Satz Register ausgegeben, diese liegen 
von 0xA8 - 0xAD. Jedoch bekomme  ich aus diesen Registern die selben 
Werte wie aus den Accelerometer-Registern aus dem Datenblatt.

Laut Datenblatt sollten über 0x75 eigentlich gar keine Register mehr 
kommen...

Weiß denn wirklich niemand was zu diesem Chip?

von J. T. (chaoskind)


Lesenswert?

Es darf auch gern jemand was sagen, der den Chip nicht kennt, aber 
trotzdem eine Vermutung hat, was ich falsch mache....

von Jedi Knight (Gast)


Lesenswert?

J. T. schrieb:
> Es darf auch gern jemand was sagen, der den Chip nicht kennt, aber
> trotzdem eine Vermutung hat, was ich falsch mache....

Poste doch mal die Registerwerte (zusammen mit der Adresse).

J. T. schrieb:
> Ich hab mir nun eine Funktion geschrieben, die einfach alle Register,
> die mit 8 Bit möglich sind, 2 mal im Abstand von einer Sekunde abfragt

von J. T. (chaoskind)


Lesenswert?

Jedi Knight schrieb:
> Poste doch mal die Registerwerte (zusammen mit der Adresse).

J. T. schrieb:
> Dabei bekomme ich die 6 Register vom Accelerometer (X-,Y- und Z- je High
> und Lowbyte) diese liegen wie im Datasheet angegeben von 0x28 - 0x2D.

Die Werte sind je nachdem in welche Richtung ich es halte, 
unterschiedlich. Halte ich es waagerecht, bekomme ich 1g auf der Z-Achse 
und 0 auf den anderen.

J. T. schrieb:
> Dann bekomme ich noch einen 6er Satz Register ausgegeben, diese liegen
> von 0xA8 - 0xAD.

Wie gesagt, die Werte sind immer die selben wie in den 0x28-0x2D. Aber 
natürlich jedesmal anders, da die ich vermutlich nicht bei jeder Messung 
in die gleiche Richtung halte.

Alle anderen Register verändern sich zwischen den Messungen nicht.

von Jedi Knight (Gast)


Lesenswert?

J. T. schrieb:
> Wie gesagt, die Werte sind immer die selben wie in den 0x28-0x2D. Aber
> natürlich jedesmal anders, da die ich vermutlich nicht bei jeder Messung
> in die gleiche Richtung halte.

Ich kann dir nicht folgen. Ich kann den Satz nicht verstehen.

von J. T. (chaoskind)


Lesenswert?

Naja. Ich lese 2mal alle Register von 0x00 bis 0xFF ein, und Speicher 
die Werte weg, während ich die Messplattform bewege, damit dann auch 
unterschiedliche Werte in den Registern landen, die für die Drehraten- 
und Beschleunigungswerte da sein sollten.

Die einzigen Register mit Änderungen sind die 6 vom Accel und dann 
nochmal ein 6er Satz Register, der aber jedes mal die selben Werte wie 
die Accel-Werte hat. Die Adresse dieser Extra-Register ist die Adresse 
vom Accel-Reg + 0x60....

von Jedi Knight (Gast)


Lesenswert?

Könnte der Grund hier liegen?

> 5.1 Operating modes
> In the LSM6DSL, the accelerometer and the gyroscope can be
> turned on/off independently of each other and are allowed
> to have different ODRs and power modes.
> The LSM6DSL has three operating modes available:
>  only accelerometer active and gyroscope in power-down
>  only gyroscope active and accelerometer in power-down
>  both accelerometer and gyroscope sensors active with independent ODR

von Jedi Knight (Gast)


Lesenswert?

Seite 31

von Michel M. (elec-deniel)


Lesenswert?

IKS01A2 LSM6DSL & GitHu enthält keine Beispiele ?

: Bearbeitet durch User
von J. T. (chaoskind)


Lesenswert?

Jedi Knight schrieb:
> Ich kann dir nicht folgen. Ich kann den Satz nicht verstehen.

Nunja, meine Funktion sucht nach unterschiedlichen Werten in den 
Registern.

Jedi Knight schrieb:
>> 5.1 Operating modes
>> In the LSM6DSL, the accelerometer and the gyroscope can be
>> turned on/off independently of each other and are allowed
>> to have different ODRs and power modes.
>> The LSM6DSL has three operating modes available:
>>  only accelerometer active and gyroscope in power-down
>>  only gyroscope active and accelerometer in power-down
>>  both accelerometer and gyroscope sensors active with independent ODR

Das hab ich, meine ich zumindest, hiermit abgehandelt:

J. T. schrieb:
> Send_Buffer[0] = CTRL1_ACCEL;
>   Send_Buffer[1] = HighPerfomance2g;
>   HAL_I2C_Master_Transmit(&hi2c1, LSM6DSL_Adr, &Send_Buffer[0], Size,
> I2C_Timeout);
>
>   Send_Buffer[0] = CTRL2_GYRO;
>   Send_Buffer[1] = HighPerformance500dps;
>   HAL_I2C_Master_Transmit(&hi2c1, LSM6DSL_Adr, &Send_Buffer[0], Size,
> I2C_Timeout);
>
>   Send_Buffer[0] = CTRL7_G;
>   Send_Buffer[1] = HPF_En;
>   HAL_I2C_Master_Transmit(&hi2c1, LSM6DSL_Adr, &Send_Buffer[0], Size,
> I2C_Timeout);
>
>   Send_Buffer[0] = CTRL4_C;
>   Send_Buffer[1] = DRDY_MASK;
>   HAL_I2C_Master_Transmit(&hi2c1, LSM6DSL_Adr, &Send_Buffer[0], Size,
> I2C_Timeout);

Michel M. schrieb:
> IKS01A2 LSM6DSL & GitHu enthält keine Beispiele ?

Ich hatte, wenn ich mich recht entsinne nach "LSM6DSL no Gyro Data" 
gesucht. Da hatte ich lediglich jemanden gefunden, der Probleme damit 
hatte, eine Achse vom Gyro in den FIFO zu bekommen...

Aber deinen Suchbegriff werd ich direkt nochmal versuchen.

von J. T. (chaoskind)


Lesenswert?

@Jedi Knight:

Ja gerade nochmal nachgeschaut. Mit CTRL1_XL (bzw ich habs bei mir 
irgendwie CTRL_Accel genannt) aktiviert man dass Accelerometer und mit 
CTRL2_G das Gyro...

Wie wahrscheinlich ist es denn, dass das Gyro einfach defekt ist?

von Michel M. (elec-deniel)


Lesenswert?


von J. T. (chaoskind)


Lesenswert?

Michel M. schrieb:
> ... mal unter Self-test ...... Ergebnis ?!

Da kommen die Werte fürs Gyro unverändert wie im Startpost genannt. 4, 
0, 1024. Keine Änderung.

Ich bin mir aber auch nicht sicher, das mit dem Selftest richtig 
verstanden zu haben...

Ist das richtig, dass der eine Selftest einfach ein positives und der 
andere Selftest einfach ein negatives Offset zufügt?

Also Register auslesen, dann selftest wählen, nochmal Register auslesen. 
Dann sollte ich, solang ich nichts bewegt habe, den selben Wert wie beim 
ersten auslesen +- Offset?

von J. T. (chaoskind)


Lesenswert?

Ich hab nun den Selftest mal gemäß der AN nachprogrammiert. (das 5-fach 
Auslesen und Durchschnitt bilden hab ich weggelassen, da ich eh im 
Singlestep durchgehe. Ich habs auch einmal mit probiert, nur um 
sicherzugehen, dass es keinen Unterschied macht).

Ich bekomme immer noch statische Werte, aber die Z-Achse hat sich im 
Vergleich zu meinen vorherigen Versuchen geändert, ich vermute aufgrund 
der anderen FullScale-Einstellung im Selftest.

Ich bekomme nun 4, 0, 1792. Unabhängig davon ob ich den Selftest nun 
aktiviert habe oder nicht...

So sieht der Selftest aus
1
void LSM6_Selftest(void)
2
{
3
  int16_t Gyro_X = 0;
4
  int16_t Gyro_Y = 0;
5
  int16_t Gyro_Z = 0;
6
  int16_t Accel_X = 0;
7
  int16_t Accel_Y = 0;
8
  int16_t Accel_Z = 0;
9
10
  Send_Buffer[0] = 0x10;
11
  Send_Buffer[1] = 0x00;
12
  HAL_I2C_Master_Transmit(&hi2c1, LSM6DSL_Adr, &Send_Buffer[0], 2, I2C_Timeout);
13
14
  Send_Buffer[0] = 0x11;
15
  Send_Buffer[1] = 0x5C;
16
  HAL_I2C_Master_Transmit(&hi2c1, LSM6DSL_Adr, &Send_Buffer[0], 2, I2C_Timeout);
17
18
  Send_Buffer[0] = 0x12;
19
  Send_Buffer[1] = 0x44;
20
  HAL_I2C_Master_Transmit(&hi2c1, LSM6DSL_Adr, &Send_Buffer[0], 2, I2C_Timeout);
21
22
  Send_Buffer[0] = 0x13;
23
  Send_Buffer[1] = 0x00;
24
  HAL_I2C_Master_Transmit(&hi2c1, LSM6DSL_Adr, &Send_Buffer[0], 2, I2C_Timeout);
25
26
  Send_Buffer[0] = 0x14;
27
  Send_Buffer[1] = 0x00;
28
  HAL_I2C_Master_Transmit(&hi2c1, LSM6DSL_Adr, &Send_Buffer[0], 2, I2C_Timeout);
29
30
  Send_Buffer[0] = 0x15;
31
  Send_Buffer[1] = 0x00;
32
  HAL_I2C_Master_Transmit(&hi2c1, LSM6DSL_Adr, &Send_Buffer[0], 2, I2C_Timeout);
33
34
  Send_Buffer[0] = 0x16;
35
  Send_Buffer[1] = 0x00;
36
  HAL_I2C_Master_Transmit(&hi2c1, LSM6DSL_Adr, &Send_Buffer[0], 2, I2C_Timeout);
37
38
  Send_Buffer[0] = 0x17;
39
  Send_Buffer[1] = 0x00;
40
  HAL_I2C_Master_Transmit(&hi2c1, LSM6DSL_Adr, &Send_Buffer[0], 2, I2C_Timeout);
41
42
  Send_Buffer[0] = 0x18;
43
  Send_Buffer[1] = 0x00;
44
  HAL_I2C_Master_Transmit(&hi2c1, LSM6DSL_Adr, &Send_Buffer[0], 2, I2C_Timeout);
45
46
  Send_Buffer[0] = 0x19;
47
  Send_Buffer[1] = 0x00;
48
  HAL_I2C_Master_Transmit(&hi2c1, LSM6DSL_Adr, &Send_Buffer[0], 2, I2C_Timeout);
49
50
  HAL_I2C_Mem_Read(&hi2c1, LSM6DSL_Adr, GYRO_X_REG_L, 1, &Recieve_Buffer[0], 2, I2C_Timeout);
51
  Gyro_X = Recieve_Buffer[0] | (Recieve_Buffer[1] << 8);
52
  HAL_I2C_Mem_Read(&hi2c1, LSM6DSL_Adr, GYRO_Y_REG_L, 1, &Recieve_Buffer[0], 2, I2C_Timeout);
53
  Gyro_Y = Recieve_Buffer[0] | (Recieve_Buffer[1] << 8);
54
  HAL_I2C_Mem_Read(&hi2c1, LSM6DSL_Adr, GYRO_Z_REG_L, 1, &Recieve_Buffer[0], 2, I2C_Timeout);
55
  Gyro_Z = Recieve_Buffer[0] | (Recieve_Buffer[1] << 8);
56
57
  Send_Buffer[0] = 0x14;
58
  Send_Buffer[1] = 0x04;
59
  HAL_I2C_Master_Transmit(&hi2c1, LSM6DSL_Adr, &Send_Buffer[0], 2, I2C_Timeout);
60
61
  HAL_Delay(50);
62
63
  HAL_I2C_Mem_Read(&hi2c1, LSM6DSL_Adr, GYRO_X_REG_L, 1, &Recieve_Buffer[0], 2, I2C_Timeout);
64
  Gyro_X = Recieve_Buffer[0] | (Recieve_Buffer[1] << 8);
65
  HAL_I2C_Mem_Read(&hi2c1, LSM6DSL_Adr, GYRO_Y_REG_L, 1, &Recieve_Buffer[0], 2, I2C_Timeout);
66
  Gyro_Y = Recieve_Buffer[0] | (Recieve_Buffer[1] << 8);
67
  HAL_I2C_Mem_Read(&hi2c1, LSM6DSL_Adr, GYRO_Z_REG_L, 1, &Recieve_Buffer[0], 2, I2C_Timeout);
68
  Gyro_Z = Recieve_Buffer[0] | (Recieve_Buffer[1] << 8);
69
70
  Send_Buffer[0] = 0x14;
71
  Send_Buffer[1] = 0x00;
72
  HAL_I2C_Master_Transmit(&hi2c1, LSM6DSL_Adr, &Send_Buffer[0], 2, I2C_Timeout);
73
}

von Jedi Knight (Gast)


Lesenswert?

J. T. schrieb:

> Wie wahrscheinlich ist es denn, dass das Gyro einfach defekt ist?

Habe ich auch schon oft gedacht. Im Endeffekt war der Fehler (fast) 
immer bei mir.

Das Problem an der Sache ist und bleibt China & Co. Nicht umsonst ist 
BOSCH einer der größeten Chip-Hersteller der Welt geworden. Eigenbedarf 
lautet der Grund, denn die (teilw. auch gefährlichen) Hardwarefakes 
toppen alles, was sich das menschliche Gehirn ausdenken kann, um Welten. 
Ist heute leider so und daher kann es durchaus sein, wenn du ins Klo 
gegriffen hast. Kauf halt ein neues. Neues Spiel, neues Glück. Oder 
neues Pech ;)

von Jedi Knight (Gast)


Lesenswert?

@J. T.
ok, bleib dran. Irgendwann läuft es, du wirst sehen.
Ich beobachte, bin auch interessiert.
Wünsche viel Erfolg :-)

von J. T. (chaoskind)


Lesenswert?

Jedi Knight schrieb:
> Habe ich auch schon oft gedacht. Im Endeffekt war der Fehler (fast)
> immer bei mir

Ja das kenn ich nur zu gut :D

Aber dass ich nen Fake bekommen habe, kann ich mir fast nicht 
vorstellen. Dieses IKS01a2 Sensorboard hab ich auf ner Hands-On-Session 
direkt von STM abgegriffen.

Dank dir für die Durchhalteparolen, aber langsam bin ich am Ende mit 
meinem Latein....

von Michel M. (elec-deniel)


Lesenswert?


: Bearbeitet durch User
von J. T. (chaoskind)


Lesenswert?

Michel M. schrieb:
> versucht ?
> https://community.st.com/s/question/0D50X00009XkXheSAF/lsm6dsl-faulty-reading

Das scheint der zu sein, den ich per Googlesuche gefunden hatte. Der hat 
ja nur Probleme mit der Z-Achse vom Gyro gehabt, was vermutlich 
irgendwie mit Timestamps und dem FIFO zu tun hatte. Aber der Thread 
endet auch mitten im Thema...

Bei mir ändern sich die Gyrowerte einfach nicht. Egal um welche Achse 
ich das Bord wie schnell drehe.

von Jedi Knight (Gast)


Lesenswert?

J. T. schrieb:

> Bei mir ändern sich die Gyrowerte einfach nicht. Egal um welche Achse
> ich das Bord wie schnell drehe.

Geh das Datenblatt noch mal in Ruhe durch und vergleiche mit dem 
Programm, ob alles korrekt enabled ist. Meist ist es ja nur eine winzige 
Kleinigkeit, die man übersehen, oder der man nicht genügend Beachtung 
geschenkt hat. Ich hätte ja mitgesucht, aber bei über 100 Seiten mit 
meinem schlechten Englisch tut mir der Kopf nur beim Drandenken schon 
weh, sorry ;)

von Jedi Knight (Gast)


Lesenswert?

..und die Umsetzung Logik-Physik. Es gibt Register/Ports, wo nach CLR 1 
drin steht, und nach SET steht 0 drin. Oder so ähnlich. Oder der 
aktuelle Inhalt wird mit PORTBIT=1 getogglet. Irgendwas in dieser 
Richtung, was man nicht sieht, weil man nicht damit rechnet, dass es 
sowas geben kann.

Sorry, wenn ich keine Details bzw. keine konkreten Lösungsvorschläge 
nennen kann.

von Jedi Knight (Gast)


Lesenswert?

Variablenüberprüfung, ob der Type stimmt, fällt mir noch ein.

Gibt es bei der Umsetzung der defines unerkannte Typisierungsfehler?

uint8_t, wo uint16_t sein sollte. Compiler schluckt es, Programm läuft. 
Aber nicht richtig.

Das sind alles Dinge, die mir schon passiert sind, und wo man sich einen 
wolf sucht, obwohl man den Fehler manchmal direkt vor den Augen hat.

von J. T. (chaoskind)


Lesenswert?

Jedi Knight schrieb:
> Geh das Datenblatt noch mal in Ruhe durch und vergleiche mit dem
> Programm, ob alles korrekt enabled ist. Meist ist es ja nur eine winzige
> Kleinigkeit, die man übersehen,

Ja richtig, dass ist es meistens auch bei mir. Nur kommt bei mir 
erschwerend eine fiese "Betriebsblindheit" dazu. Umso öfter ich alles 
nochmal  durchgegangen bin, ohne einen Fehler zu finden, umso geringer 
wird die Wahrschenlichkeit, dass ich ihn beim nächsten mal finde :D. Und 
ich bin es nun schon einige Male durchgegangen...

Jedi Knight schrieb:
> ..und die Umsetzung Logik-Physik. Es gibt Register/Ports, wo nach CLR 1
> drin steht, und nach SET steht 0 drin. Oder so ähnlich. Oder der
> aktuelle Inhalt wird mit PORTBIT=1 getogglet

Ja sowas kenn ich auch noch von den Atmegas... Aber alle Register die 
ich anfasse erwähnen mit keinem Wort etwas davon, dass sie "umgedreht" 
sind.

Jedi Knight schrieb:
> Sorry, wenn ich keine Details bzw. keine konkreten Lösungsvorschläge
> nennen kann.

Brauchst dich doch nicht entschuldigen. Ich freu mich schon darüber, 
dass du versuchst zu helfen.

Jedi Knight schrieb:
> Variablenüberprüfung, ob der Type stimmt, fällt mir noch ein.

Laut Datenblatt werden die Werte über 2 8-bit Breite Register als 16-bit 
Wert ausgegeben. Im 2er Komplement. --> int16_t. Das klappt ja auch 
wunderbar beim Accelerometer.

Jedi Knight schrieb:
> Gibt es bei der Umsetzung der defines unerkannte Typisierungsfehler?

Es wird ohne Warnungen kompiliert. (nur ein paar unused-variable 
Warnungen)

Jedi Knight schrieb:
> Das sind alles Dinge, die mir schon passiert sind, und wo man sich einen
> wolf sucht, obwohl man den Fehler manchmal direkt vor den Augen hat.

Ja wie gesagt, dass kenn ich nur zu gut. Gerne mach ich mal ein "<" 
statt eines ">" oder sowas, und da kann man sich echt blöd dran suchen.

von Michel M. (elec-deniel)


Lesenswert?


von J. T. (chaoskind)


Lesenswert?

Michel M. schrieb:
> https://microsoft.github.io/azure-iot-developer-kit/docs/apis/lsm6dsl/#readreg
> ...* vielleicht  Untersch. zw Reg u. Data ?!

Ich benutze die HAL_I2C zum Auslesen, der will auch einen Pointer sehen, 
wo er die Daten aus den Registern hinschmeißen soll. Ich übergebe der 
Funktion einach die Adresse meiner X- Y- und Z-Variablen. Und wie 
gesagt, beim Accelerometer klappt ja alles wunderbar...

: Bearbeitet durch User
von Jedi Knight (Gast)


Lesenswert?

J. T. schrieb:
> Laut Datenblatt werden die Werte über 2 8-bit Breite Register als 16-bit
> Wert ausgegeben. Im 2er Komplement. --> int16_t.

Allignment-Verschiedenheit ?

int16_t => uint16_t ?

"2er Komplement" ist auch ein üblicher Verdächtiger


***
bals weiß ich nichts mehr

von J. T. (chaoskind)


Angehängte Dateien:

Lesenswert?

Ich hab nun von den Beispielen die bei X-CUBE-MEMS dabei sind, das 
DataLogTerminal aufgespielt. Dabei bin ich nach Seite 10/11 im 
verlinkten PDF vorgegangen. Aber irgendwie findet die PC GUI keinen 
COM-Port...

Dann hab ich mal HyperTerm angeschmissen, das findet aber auch keinen 
COM-Port...

Ich werd mal schauen, ob ich im Quelltext vom Beispiel etwas finden 
kann. Evtl wird die UART ja nicht richtig initialisiert.

von J. T. (chaoskind)


Lesenswert?

Der COM-Port wird nun gefunden. Nachdem ich den ST-LINK Firmware-Update 
wie im PDF gemacht hatte, war es Version 33.irgendwas.

Ich hab dann nochmal die STM32 ST-Link Utility Software benutzt, und 
konnte auf Version 32.irgendwas "updaten". Seit dem wird der COM-Port 
wieder gefunden.

Aber diese Unicleo-GUI sagt "Expansion Board: Unknown   Firmware 
Version: Unknown"

von J. T. (chaoskind)


Lesenswert?

Jedi Knight schrieb:
> Allignment-Verschiedenheit ?
>
> int16_t => uint16_t ?
>
> "2er Komplement" ist auch ein üblicher Verdächtiger

Gestern gar nicht mehr gesehen, dass du noch was geschrieben hattest.

Ich denke, dass mit dem 2er Komplement hab ich richtig umgesetzt. Wie 
gesagt, die Werte vom Accelerometer sind total plausibel. Halte ich das 
Bord waaagerecht, hab ich 0g, 0g, 1g,  halte ich es überkopf bekomme ich 
0g, 0g, -1g.

Nur auf dem Gyro bekomme ich drehgeschwindigkeitsunabhängig statische 
Werte...

Und da der Selftest auch nichts an den Werten ändert, gehe ich langsam 
davon aus, dass das Gyro tatsächlich kaputt ist.

=(

von J. T. (chaoskind)


Lesenswert?

J. T. schrieb:
> Aber diese Unicleo-GUI sagt "Expansion Board: Unknown   Firmware
> Version: Unknown"

Okay wenn man dann das DataLogExtended statt dem nicht extendedetem 
DataLog nimmt, dann wird das Bord auch gefunden.

Aber irgendwie kann ich so überhaupt gar nichts auslesen. Es gibt 
Buttons zum Register auslesen und setzen. Aber es tut sich nichts, egal 
ob ich im Play-Modus oder im gestopt bin.

Ich hab auch nochmal mit HyperTerm auf den COM-Port geschaut. Da kommt 
quasi nichts. Nachdem ein paar mal planlos auf den Reset- und den 
Userbutton gedrückt hab, kam aufeinmal "C0 A0 C2 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 A4 C5"

Hmm. Also wenn ich einmal auf Reset drücke und dann den User-Button 
drücke, kommen drei Werte über den COM-Port. Die scheinen mir aber 
irgendwie ziemlich zufällig. Aber nachdem ich nun ein paar mal öfter 
gedrückt habe, wiederholen sich einige Werte. Es sieht grad wie folgt 
aus: "C7 19 ED     C8 A4 C5    88 94 ED   C7 19 ED     A4 CD C6     A0 
C2 C8    B4 CD C0    A0 C1 88     94 ED C0    A0 C3"...

von Pete K. (pete77)


Lesenswert?

J. T. schrieb:
> HAL_I2C_Mem_Read(&hi2c1, LSM6DSL_Adr, GYRO_X_REG_L, 1,
> &Recieve_Buffer[0], 2, I2C_Timeout);

Die HAL-Funktionen geben auch einen Status zurück. Für eine Fehlersuche 
schlage ich vor, diesen Status auch auszuwerten.

P.S.: Es heisst "Receive"

: Bearbeitet durch User
von J. T. (chaoskind)


Lesenswert?

Pete K. schrieb:
> Die HAL-Funktionen geben auch einen Status zurück. Für eine Fehlersuche
> schlage ich vor, diesen Status auch auszuwerten.


Aber damit würde ich doch lediglich erfahren, ob die I2C-Funktionalität 
Fehler hat. Die läuft aber, sonst hätte ich doch gar keinen Zugriff auf 
die ganzen Sensoren?

Mich wunder nun nur, dass das Beispiel von ST so gar nichts ausgiebt. 
Angeblich soll mans nur kompilieren und laufen lassen und bekommt dann 
Werte in dieser GUI


>
> P.S.: Es heisst "Receive"

Ist geändert:D

von Jedi Knight (Gast)


Lesenswert?

@ chaos Ich habe mit diesen Sensoren noch nie zu tun und kenne nur grob 
die Basics. Darf ich mal was fragen, statt zu googeln? Wieso eigentlich 
6 Achsen? Ich hätte angenommen, auf 3 kann man alles nötige abbilden? 
Natürlich täusche ich mich, aber welches sind denn die 6 Achsen?

von J. T. (chaoskind)


Lesenswert?

Jedi Knight schrieb:
> Wieso eigentlich
> 6 Achsen? Ich hätte angenommen, auf 3 kann man alles nötige abbilden?
> Natürlich täusche ich mich, aber welches sind denn die 6 Achsen?

Weil du 3 Achsen vom Accelerometer und 3 Achsen vom Gyroskop hast. Die 
zeigen zwar jeweils in die selben Richtungen, sind aber irgendwie auch 
unabhängig voneinander. Auf diesem Bord ist auch noch ein drei achsiger 
Magnetsensor, so dass das ganze vom Marketing vermutlich als 9-axes-IMU 
oder so ähnliche aufgeschwatzt wird.

Beitrag #5716900 wurde vom Autor gelöscht.
von Jedi Knight (Gast)


Lesenswert?

Gibts was neues ?

von J. T. (chaoskind)


Lesenswert?

Nein leider niccht. Nun ist am Nucleo auch noch, vermutlich, der 
Spannungsregler durchgebrannt. Meine letzte Meinung ist aber immer noch, 
dass das Gyro kaputt ist... Ich habs erstmal zur Seite gelegt.

Sollte sich nochmal was tun, werde ich aber hier berichten.

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.