Forum: Mikrocontroller und Digitale Elektronik SPI immer gleiche Antwort


von Chris T. (chris0086)


Angehängte Dateien:

Lesenswert?

Hallo Leute,
ich habe ein Problem mit der SPI Übertragung, habe da noch nicht viel 
gemacht.
Also nach einem Reset des Controllers wird vom Slave Chip, ein LIS3DH 
Beschleunigungssensor nach Anforderung der richtige Registerinhalt 
gesendet. Wenn ich jetzt ein anderes Register auslesen will kommt 
trotzdem immer wieder der gleiche Registerinhalt des alten Registers. 
Das stimmt natürlich nicht so.
Weiterhin weis ich nicht genau an welcher Stelle ich den Wechsel von Low 
auf High der CS Leitung rein packe. Die soll ja laut Diagramm im 
Datenblatt(S.22) high werden wenn SCK auch gerade high wird.
Falls wer Zeit hat kann mal jemand über meinen code schauen und den oder 
die bösen Fehler suchen?
Die Kommunikation läuft zum testen einfach so, ich schicke über die 
serielle 3 Bytes, das erste ist die Adresse, das zweite ist der Wert 
welcher eventuell geschrieben werden soll, das dritte Byte gibt an ob 
schreiben, dann 1 oder lesen dann 0.
Verwendeter Controller ist ein Atmega16 mit 8MHz Takt.
1
#include <stdlib.h>
2
#include <avr/io.h>
3
#include <avr/interrupt.h>
4
#include <avr/pgmspace.h>
5
#include <inttypes.h>
6
#include <avr/eeprom.h>
7
#include <string.h>
8
#include <util/delay.h>
9
#include <avr/wdt.h>
10
#include <string.h>
11
#include <stdlib.h>
12
13
/* define CPU frequency in Mhz here if not defined in Makefile */
14
#ifndef F_CPU
15
#define F_CPU 8000000UL
16
#endif
17
18
/* 9600 baud   */
19
#define BAUD1 9600UL          // Baudrate
20
#define UBRR_VAL_UART ((F_CPU+BAUD1*8)/(BAUD1*16)-1)   // clever runden
21
22
#define DDR_SPI      DDRB  // Portrichtungsregister
23
#define DD_MOSI      DDB5
24
#define DD_MISO      DDB6
25
#define DD_SCK      DDB7
26
#define DD_SS      DDB4
27
#define PORT_SPI    PORTB
28
29
#define WHO_AM_I    0x0F
30
uint8_t u8_spi_write_buffer[8];
31
uint8_t u8_spi_read_buffer[8];
32
uint8_t rx_start = 0;
33
uint8_t receive_string[4];
34
volatile uint8_t rxc = 0;
35
void USART_Transmit( char data )
36
{
37
  /* Wait for empty transmit buffer */
38
  while ( !( UCSRA & (1<<UDRE)) )
39
    ;
40
  /* Put data into buffer, sends the data */
41
  UDR = data;
42
}
43
44
45
void uart_puts (char *s)
46
{
47
    while (*s)
48
    {   /* so lange *s != '\0' also ungleich dem "String-Endezeichen(Terminator)" */
49
      USART_Transmit(*s);
50
        s++;
51
    }
52
}
53
54
55
void SPI_MasterInit(void)
56
{
57
  DDR_SPI |= (1<<DD_MOSI) | (1<<DD_SCK) | (1<<DD_SS);
58
  DDR_SPI &= ~(1<<DD_MISO);
59
  SPCR = (1<<SPE) | (1<<MSTR) | (1<<SPR1) |(1<<SPR0) | (1<<CPOL); //SPI einschalten
60
61
}
62
63
64
uint8_t SPI_MasterTransmit(char data)
65
{
66
  SPDR = data;
67
  while(!(SPSR & (1<<SPIF)));
68
  /* Return data register */
69
  return SPDR;
70
}
71
72
73
void SPI_Transmit(uint8_t rw,uint8_t *value,uint8_t max)
74
{
75
76
  uint8_t i;
77
  if(rw) //Schreiben
78
  {
79
    value[0] |= (1<<7);
80
  }
81
  for(i=0;i<max;i++)
82
  {
83
84
    u8_spi_read_buffer[i]=(SPI_MasterTransmit(value[i]));
85
86
  }
87
}
88
89
90
ISR(USART_RXC_vect)
91
{
92
  uint8_t i;
93
  i= rx_start;
94
  receive_string[i] = UDR;
95
  i++;
96
97
  if(i==3)
98
  {
99
    i=0;
100
    rxc=1;
101
  }
102
  rx_start = i;
103
}
104
int main(void)
105
{
106
107
108
  //Timer konfigurieren
109
  //stetige Wertanforderung
110
  TCCR1B |= (1<<CS12) | (1<<CS10); // standard = 9 Sekunden
111
  TCNT1 = 0; //29536; = 5 Sekunden
112
113
  //Timer für Fehleranzeige
114
  TCCR0 |= (1<<CS02) | (1<<CS00);
115
116
    //USART initialisieren
117
118
  //USART0
119
    UBRRH = UBRR_VAL_UART >> 8;
120
    UBRRL = UBRR_VAL_UART& 0xFF;
121
122
    //USART0
123
    UCSRB |= (1<<TXEN);                // UART TX einschalten
124
    UCSRB |= (1<<RXEN);
125
    UCSRB |= (1<<RXCIE);
126
    UCSRC |= (1<<URSEL)|(1<<UCSZ0)| (1<<UCSZ1);    // Asynchron 8N1
127
128
    sei();
129
    USART_Transmit('O');
130
    USART_Transmit('K');
131
132
    DDRC &= ~(1<<PC0);
133
    PORTC |= (1<<PC0);
134
135
  //ChipslesctPin auf Ausgang
136
  DDR_SPI |= (1<<DD_SS);
137
138
  SPI_MasterInit();
139
140
  // x und y Achsen deaktivieren
141
  u8_spi_write_buffer[0] = 0x20;
142
  u8_spi_write_buffer[1] = 0x04;
143
  //SPI_Transmit(u8_spi_write_buffer,2);
144
  //USART_Transmit(u8_spi_read_buffer[0]);
145
  //USART_Transmit(u8_spi_read_buffer[1]);
146
147
while(1)
148
{
149
  if(rxc)
150
  {
151
    u8_spi_write_buffer[0] = receive_string[0];
152
    u8_spi_write_buffer[1] = receive_string[1];
153
154
    PORT_SPI &= ~(1<<DD_SS);
155
156
    SPI_Transmit(receive_string[2],u8_spi_write_buffer,2);
157
158
    USART_Transmit(u8_spi_read_buffer[0]);
159
    USART_Transmit(u8_spi_read_buffer[1]);
160
    USART_Transmit('|');
161
    rxc = 0;
162
  }
163
}
164
165
}
Grüße Christian

von Wolfgang (Gast)


Lesenswert?

Chris T. schrieb:
> Die soll ja laut Diagramm im
> Datenblatt(S.22) high werden wenn SCK auch gerade high wird.

Wahre Gleichzeitigkeit gibt es nicht.

Bei der stiegenden Flanke von SPC müssen die Daten stabil sein. CS muss 
rechtzeitig vor der Übertragung auf Low liegen und geht irgendwann 
danach wieder auf High.

von holger (Gast)


Lesenswert?

>CS muss rechtzeitig vor der Übertragung auf Low liegen und geht irgendwann
>danach wieder auf High

In seinem Programm geht es nie High.

von Nils Z. (nils_z)


Lesenswert?

holger schrieb:
> In seinem Programm geht es nie High.

Was zur Folge hat, dass immer wieder das gleiche Register ausgelesen 
wird, weil die Adresse nur im ersten Byte nach Beginn einer Übertragung 
gesetzt wird. Die Übertragung endet aber erst durch CS auf HIGH, was 
nicht passiert.

von Wolfgang (Gast)


Lesenswert?

Nils Z. schrieb:
> Was zur Folge hat, dass immer wieder das gleiche Register ausgelesen
> wird, weil die Adresse nur im ersten Byte nach Beginn einer Übertragung
> gesetzt wird. Die Übertragung endet aber erst durch CS auf HIGH, was
> nicht passiert.

Ganz so einfach ist das auch nicht. Da gibt es noch das MS Bit.

Seite 23:
"In multiple read/write commands further blocks of 8 clock periods is 
added. When MS bit is ‘0’ the address used to read/write data remains 
the same for every block. When MS bit is ‘1’ the address used to 
read/write data is increased at every block."

von Chris T. (chris0086)


Lesenswert?

Ich habe das jetzt mal so abgeändert das ich nach Übertragung CS wieder 
auf High ziehe:
1
  if(rxc)
2
  {
3
    u8_spi_write_buffer[0] = receive_string[0];
4
    u8_spi_write_buffer[1] = receive_string[1];
5
6
    PORT_SPI &= ~(1<<DD_SS);
7
8
    SPI_Transmit(receive_string[2],u8_spi_write_buffer,2);
9
    PORT_SPI |= (1<<DD_SS);
10
    USART_Transmit(u8_spi_read_buffer[0]);
11
    USART_Transmit(u8_spi_read_buffer[1]);
12
    USART_Transmit('|');
13
    rxc = 0;
14
  }

Jetzt bekomme ich nach der ersten Übertragung (Gesendet 0f 00 00):
FF 33 7C --> Stimmt.
Wenn ich das gleiche aber nochmal sende, erhalte ich dann immer:
FF FF 7C egal welches Register ich anspreche (7C ist der |)

Also so ganz läufts immer noch nicht.

Das MS Bit ist bisher immer 0 da ich ja nur ein Byte lesen will

: Bearbeitet durch User
von Nils Z. (nils_z)


Lesenswert?

Chris T. schrieb:
> Jetzt bekomme ich nach der ersten Übertragung (Gesendet 0f 00 00):
> FF 33 7C --> Stimmt.
> Wenn ich das gleiche aber nochmal sende, erhalte ich dann immer:
> FF FF 7C egal welches Register ich anspreche (7C ist der |)

Kannst du mal mit Oszilloskop oder Logic-Analyser nachsehen, was beim 
zweiten mal auf den Leitungen am Sensor wirklich gesendet / empfangen 
wird? Dann wüsste man, ob der Fehler in deiner Sende- oder in der 
Empfangsroutine zu suchen ist.


Wolfgang schrieb:
> Ganz so einfach ist das auch nicht. Da gibt es noch das MS Bit.
>
> Seite 23:
> "In multiple read/write commands further blocks of 8 clock periods is
> added. When MS bit is ‘0’ the address used to read/write data remains
> the same for every block. When MS bit is ‘1’ the address used to
> read/write data is increased at every block."

Da hast du natürlich recht, ich bin stillschweigend davon ausgegangen, 
dass er das Bit nicht gesetzt hat, weil keine Multibytezugriffe erfolgt 
sind.

von Chris T. (chris0086)


Lesenswert?

Mein toller Logic analyzer clon ist irgendwie stumm und Oszi hab ich 
leider nicht da :(

Hat noch jemand eine Idee?

: Bearbeitet durch User
von Bastian W. (jackfrost)


Lesenswert?

Willsz du beim ersten  Auslesen nur 0F ausgelesen ? Wenn ja warum 
sendest du zwei Dummybytes. Vor allem sind die direkten Register mit der 
nachfolgenden Adresse ja "reserved"

Gruß JackFrost

von Chris T. (chris0086)


Angehängte Dateien:

Lesenswert?

Das dritte Byte diente nur um auszuwählen zwischen lesen und schreiben 
es werden nur zwei Bytes gesendet.
Jetzt hab ich auch meinen Logiganalyzer zum laufen bekommen.
Leider wird schon nichts mehr gesendet, obwohl ich gar nicht viel am 
Code verändert habe.
Hier jetzt mal der aktuelle Code:
1
#include <stdlib.h>
2
#include <avr/io.h>
3
#include <avr/interrupt.h>
4
#include <avr/pgmspace.h>
5
#include <inttypes.h>
6
#include <avr/eeprom.h>
7
#include <string.h>
8
#include <util/delay.h>
9
#include <avr/wdt.h>
10
#include <string.h>
11
#include <stdlib.h>
12
13
/* define CPU frequency in Mhz here if not defined in Makefile */
14
#ifndef F_CPU
15
#define F_CPU 8000000UL
16
#endif
17
18
/* 9600 baud   */
19
#define BAUD1 9600UL          // Baudrate
20
#define UBRR_VAL_UART ((F_CPU+BAUD1*8)/(BAUD1*16)-1)   // clever runden
21
22
#define DDR_SPI      DDRB  // Portrichtungsregister
23
#define DD_MOSI      DDB5
24
#define DD_MISO      DDB6
25
#define DD_SCK      DDB7
26
#define DD_SS      DDB4
27
#define PORT_SPI    PORTB
28
29
#define WHO_AM_I    0x0F
30
uint8_t u8_spi_write_buffer[8];
31
uint8_t u8_spi_read_buffer[8];
32
uint8_t rx_start = 0;
33
uint8_t receive_string[4];
34
volatile uint8_t rxc = 0;
35
void USART_Transmit( char data )
36
{
37
  /* Wait for empty transmit buffer */
38
  while ( !( UCSRA & (1<<UDRE)) )
39
    ;
40
  /* Put data into buffer, sends the data */
41
  UDR = data;
42
}
43
44
45
void uart_puts (char *s)
46
{
47
    while (*s)
48
    {   /* so lange *s != '\0' also ungleich dem "String-Endezeichen(Terminator)" */
49
      USART_Transmit(*s);
50
        s++;
51
    }
52
}
53
54
55
void SPI_MasterInit(void)
56
{
57
  DDR_SPI |= (1<<DD_MOSI) | (1<<DD_SCK) | (1<<DD_SS);
58
  DDR_SPI &= ~(1<<DD_MISO);
59
  SPCR = (1<<SPE) | (1<<MSTR) | (1<<SPR1) |(1<<SPR0) | (1<<CPOL); //SPI einschalten
60
61
}
62
63
64
uint8_t SPI_MasterTransmit(char data)
65
{
66
  SPDR = data;
67
  while(!(SPSR & (1<<SPIF)));
68
  /* Return data register */
69
  return SPDR;
70
}
71
72
73
void SPI_Transmit(uint8_t rw,uint8_t *value,uint8_t max)
74
{
75
76
  uint8_t i;
77
78
  for(i=0;i<max;i++)
79
  {
80
81
    u8_spi_read_buffer[i]=(SPI_MasterTransmit(value[i]));
82
83
  }
84
}
85
86
87
ISR(USART_RXC_vect)
88
{
89
  uint8_t i;
90
  i= rx_start;
91
  receive_string[i] = UDR;
92
  i++;
93
94
  if(i==3)
95
  {
96
    i=0;
97
    rxc=1;
98
  }
99
  rx_start = i;
100
}
101
int main(void)
102
{
103
104
105
  //Timer konfigurieren
106
  //stetige Wertanforderung
107
  TCCR1B |= (1<<CS12) | (1<<CS10); // standard = 9 Sekunden
108
  TCNT1 = 0; //29536; = 5 Sekunden
109
110
  //Timer für Fehleranzeige
111
  TCCR0 |= (1<<CS02) | (1<<CS00);
112
113
    //USART initialisieren
114
115
  //USART0
116
    UBRRH = UBRR_VAL_UART >> 8;
117
    UBRRL = UBRR_VAL_UART& 0xFF;
118
119
    //USART0
120
    UCSRB |= (1<<TXEN);                // UART TX einschalten
121
    UCSRB |= (1<<RXEN);
122
    UCSRB |= (1<<RXCIE);
123
    UCSRC |= (1<<URSEL)|(1<<UCSZ0)| (1<<UCSZ1);    // Asynchron 8N1
124
125
    sei();
126
    USART_Transmit('O');
127
    USART_Transmit('K');
128
129
    DDRC &= ~(1<<PC0);
130
    PORTC |= (1<<PC0);
131
132
  //ChipslesctPin auf Ausgang
133
  DDR_SPI |= (1<<DD_SS);
134
135
  SPI_MasterInit();
136
  PORT_SPI |= (1<<DD_SS);
137
  // x und y Achsen deaktivieren
138
  u8_spi_write_buffer[0] = 0x20;
139
  u8_spi_write_buffer[1] = 0x04;
140
  //SPI_Transmit(u8_spi_write_buffer,2);
141
  //USART_Transmit(u8_spi_read_buffer[0]);
142
  //USART_Transmit(u8_spi_read_buffer[1]);
143
144
while(1)
145
{
146
  if(rxc)
147
  {
148
    u8_spi_write_buffer[0] = receive_string[0];
149
    u8_spi_write_buffer[1] = receive_string[1];
150
151
    PORT_SPI &= ~(1<<DD_SS);
152
153
    SPI_Transmit(receive_string[2],u8_spi_write_buffer,2);
154
    PORT_SPI |= (1<<DD_SS);
155
    USART_Transmit(u8_spi_read_buffer[0]);
156
    USART_Transmit(u8_spi_read_buffer[1]);
157
    USART_Transmit('|');
158
    rxc = 0;
159
  }
160
}
161
162
}

Ich weis jetzt echt nichtmehr weiter :(
Im Anhang die Aufnahme

von Chris T. (chris0086)


Angehängte Dateien:

Lesenswert?

Okay er sendet erstmal wieder hatte bei dem Empfangsarray das volatile 
vergessen.
Aber er empfängt noch nichts...

von David P. (chavotronic)


Angehängte Dateien:

Lesenswert?

Bist du sicher mit dem Protokoll? Auf den ersten Blick sieht es so aus 
als werden die Werte bei steigender Clock Flanke übernommen, scheint bei 
dir nicht so zu sein.

: Bearbeitet durch User
von Chris T. (chris0086)


Lesenswert?

Ja danke für den Hinweis, hab das CPOL Bit mal gelöscht und siehe da, er 
antwortet wie er soll, oh man das war wieder ein Hickhack, da war an 
mehreren Stellen ein kleiner Fehler...

von David P. (chavotronic)


Angehängte Dateien:

Lesenswert?

du hast bestimmt den falschen SPI Mode erwischt.

Edit: Wie ich sehe hat's jetzt geklappt :)

: Bearbeitet durch User
von Chris T. (chris0086)


Lesenswert?

Ich weis ja ich habe jetzt hier schon einige Nerven strapaziert, aber 
ich treibs mal noch ein Stück weiter.

Ich kann die Register lesen und schreiben aber wie müssen die Register 
gesetzt werden damit ich mal einen Beschleunigungswert bekomme?
Also ich schnipse mit dem Finger gegen den Sensor da sollte doch ein 
Wert ungleich 0 mal auszulesen sein...

EDIT: Ok es gibt eine Application note, die wird ich mir erstmal rein 
ziehen.

: Bearbeitet durch User
von Nils Z. (nils_z)


Lesenswert?

Chris T. schrieb:
> Ich kann die Register lesen und schreiben aber wie müssen die Register
> gesetzt werden damit ich mal einen Beschleunigungswert bekomme?

Ich arbeite auch gerade mit dem Sensor, die Aufteilung und Gliederung 
von Datenblatt und Appnote finde ich nicht gelungen, leider sind da auch 
mehrere grobe Fehler drinnen, Register werden unterschiedlich 
bezeichnet. Pass mit den Beispielen in der Appnote auf, da muss man alle 
Werte hinterfragen, die sind nicht immer richtig.

Um vom Sensor Werte zu bekommen, musst du als minimale Konfiguration in 
CTRL_REG1 die Bits ODR3-0 setzen. Default ist 0000 (binär). Im 
Datenblatt steht auf S.29 "0000:50 Hz; ", das ist falsch, sieht man in 
der Tabelle auf S.30. 0000 ist power down, daher kannst du nichts 
auslesen.

Noch ein Beispiel für einen Fehler:
AN3308, S.24: "Write A7h into CTRL_REG1// ODR = 100 Hz"
0xA = 1010 (bin), wieder mit der Tabelle im Datenblatt auf S. 30 
vergleichen, 1010 kommt da für ODR3-0 garnicht vor. Richtig für 100Hz 
wäre 0101 = 0x5. Der gleiche Fehler ist noch öfter in der Appnote, bin 
selbst darüber gestolpert.

Ich behaupte wirklich ungern, dass der Hersteller hier so viele Fehler 
gemacht hat, wenn ich mich geirrt haben sollte, wäre ich dankbar, wenn 
mir jemand zeigt, warum.

von Chris T. (chris0086)


Lesenswert?

Hallo Nils,
danke für die Hinweise :-)
Habe das alles jetzt soweit laufen das ich
einen Interrupt am pin bekomme wenn ein bestimmtes Threshold 
überschritten wurde gemäß Anleitung aus der AP nur die Werte in den 
Register ein wenig abgeändert, da mich nur die Werte für die 
Beschleunigung in Z-Richtung interessieren:
1
Write A7h into CTRL_REG1
2
// Turn on the sensor and enable X, Y, and Z
3
// ODR = 100 Hz
4
2 Write 00h into CTRL_REG2 // High-pass filter disabled
5
3 Write 40h into CTRL_REG3 // Interrupt driven to INT1 pad
6
4 Write 00h into CTRL_REG4 // FS = 2 g
7
5 Write 08h into CTRL_REG5 // Interrupt latched
8
6 Write10h into INT1_THS // Threshold = 250 mg
9
7 Write 00h into INT1_DURATION // Duration = 0
10
8 Write 0Ah into INT1_CFG // Enable XH and YH interrupt generation
11
9 Poll INT1 pad; if INT1=0 then go to 8
12
// Poll RDY/INT pin waiting for the
13
// wake-up event
14
10 Read INT1_SRC
15
// Return the event that has triggered the
16
// interrupt
Kannst du mir sagen wie ich an den größten Wert welche bei Überschreiten 
der Schwelle detektiert wurde?

Wenn ich dann nach dem Interruptregister manuell die Register OUT_1_L 
etc. auslesen bekomme ich da 0 Werte.

Auch hab ich noch nicht geblickt welches Register ich genau auslesen 
muss wenn ich den Wert von der Z-Beschleunigung möchte.

Muss ich da OUT_3_L und OUT_3_H auslesen? Ist dort der Wert für die Z 
Achse gespeichert?

von Chris T. (chris0086)


Angehängte Dateien:

Lesenswert?

So habe das jetzt so angepasst das ich so bald der Interrupt kommt 
direkt das entsprechende Register auslese. Das funktioniert schon mal 
prinzipiell.
Nur wie ich jetzt auf den Beschleunigungswert komme ist mir trotz 
appnote noch schleierhaft. Wie muss man das denn rechnen das man da auf 
den Wert kommt?
Hier erstmal der Code:
1
while(1)
2
{
3
  u8_spi_write_buffer[0] = 0x31;
4
  u8_spi_write_buffer[1] = 0;
5
  SPI_Transmit(receive_string[2],u8_spi_write_buffer,2);
6
7
  if( u8_spi_read_buffer[1] & 0x40)
8
  {
9
    u8_spi_write_buffer[0] = 0x2c;
10
    u8_spi_write_buffer[1] = 0;
11
    u8_spi_write_buffer[2] = 0;
12
    SPI_Transmit(receive_string[2],u8_spi_write_buffer,3);
13
    acceleration_l = u8_spi_read_buffer[1];
14
    acceleration_h = u8_spi_read_buffer[2];
15
    USART_Transmit(acceleration_l);
16
    USART_Transmit(acceleration_h);
17
    USART_Transmit('|');
18
19
  }
20
  _delay_ms(50);
21
}

In der Appnote steht auf Seite 14 dazu eine Tabelle aber ich weis nicht 
wie die da auf den g Wert kommen mit den Zahlen...

von Wolfgang (Gast)


Lesenswert?

Chris T. schrieb:
> In der Appnote steht auf Seite 14 dazu eine Tabelle aber ich weis nicht
> wie die da auf den g Wert kommen mit den Zahlen...

Per Dreisatz und Kalibrierkoeffizienten?

von Chris T. (chris0086)


Lesenswert?

Ich glaub ich habe es, das müssten schon zweierkomplemente sein, da der 
Wert ein INT -Wert ist...
Hab das jetzt so gelöst und erhalte auch Werte welche durchaus stimmen 
könnten.
1
    int16_t g_level;
2
    g_level = (int16_t)(((  acceleration_h) << 8) | acceleration_l);
3
    USART_Transmit('|');
4
    char buffer[10];
5
    itoa(g_level,buffer,10);
6
    uart_puts(buffer);

Kann das passen? BLE ist bei mir 0

: Bearbeitet durch User
von Nils Z. (nils_z)


Lesenswert?

Sorry, habe nicht viel Zeit, daher nur recht knapp:

Um an die Beschleunigungen zu kommen, musst du die Register OUT_Z_L / H 
auslesen (0x2c, 0x2d, aus der Tabelle im Datenblatt auf S.26). Die Werte 
sind im Zweierkomplement (steht auf S.33).
Die Register OUT_x_L/H sind für die zusätzlichen ADC-Kanäle (in der 
Tabelle auf S. 26 steht auch ADC im Namen dabei, die Namen sind leider 
nichtmal im Datenblatt einheitlich :( ).

Die Interpretation der Werte ist in der Appnote auf S.14 halbwegs 
ersichtlich. Der maximale/minimale Wert einer Achse in g ergibt sich 
durch die Full Scale selection (2, 4, 8 oder 16g, Datenblatt S.31).
Der Wert pro digit auch, siehe Tabelle im Datenblatt auf S. 10.

Um die Werte auf Plausibilität zu prüfen, einfach den Sensor in Bezug 
auf die Achse passen hinlegen, dann müsste die Beschleunigung je nach 
Lage +1g, 0g oder -1g sein.

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.