INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
SPI BMA020
02.01.2016, 02:46 (Dieser Beitrag wurde zuletzt bearbeitet: 02.01.2016 09:03 von Bitklopfer.)
Beitrag #1
SPI BMA020
Hi ich bemühe mich den G-Sensor BMA020 über SPI (4-Wire) auszulesen.
Ich wollte alle Standard-Einstellung lassen und nur mal paar Werte auslesen und hab mich durchs Datenblatt

http://stefanfrings.de/mindstorms/BMA020.pdf
gearbeitet.

Natürlich bekomme ich auf allen 3-Achsen nur 0er zurück.
Aufgrund der Angaben zum Auslesen auf Seite 26 (siehe Bild, Multiple Reading) habe ich gedacht dieser Code würde reichen:

Code:
//Datasheet:http://stefanfrings.de/mindstorms/BMA020.pdf
//Circuit

//BMA020 - Arduino Uno
//Uin -- 5V
//CSB ----- 10
//SCK ------ 13
//SDI ----- 11
//SDO ---- 12
//GND------GND


# include <SPI.h>
const int chipSelectPin = 10; //ss
const byte READ =0B10000010; //page 26
void setup() {
Serial.begin(9600);
SPI.setClockDivider(SPI_CLOCK_DIV2);
SPI.setDataMode(SPI_MODE3);
SPI.setBitOrder(MSBFIRST);
SPI.begin();
pinMode(chipSelectPin,OUTPUT);
digitalWrite(chipSelectPin, HIGH);
delay(100);
}
void loop() {
digitalWrite(chipSelectPin, LOW);
SPI.transfer(READ); // Command to Read //(0x80) Register 2 (0x02) multiple reading
byte xl = SPI.transfer(0); // Read register 2
byte xh = SPI.transfer(0); // Read register 3
byte yl = SPI.transfer(0); // Read register 4
byte yh = SPI.transfer(0); // Read register 5
byte zl = SPI.transfer(0); // Read register 6
byte zh = SPI.transfer(0); // Read register 7
digitalWrite(chipSelectPin,HIGH);
unsigned short x = int (xh << 2) | (xl >> 6);
unsigned short y = int (yh << 2) | (yl >> 6);
unsigned short z = int (zh << 2) | (zl >> 6);
Serial.print("x = ");
Serial.println(x,DEC);
Serial.print("y = ");
Serial.println(y,DEC);
Serial.print("z = ");
Serial.println(z,DEC);
delay(80);
}

For a complete readout of 10 bit acceleration data from all axes the sensor IC provides the option to use an automatic incremented read command to read more than one byte (multiple read). This
is activated when the serial enable pin CSB (chip select) stays active low after the read out of a data register. Thus, read out of data LSB will also cause read out of MSB if the CSB stays low for further 8 cycles of system clock.

Kann man die Bytes in der Loop-Schleife ab SPI.transfer(READ) so auslesen?

Ich habe mehrere Sensoren probiert und die Bytes einzeln binär ausgeben lassen, immer nur 0er.

Vielen Dank und LG

edit by Mod => Code Tag lgbk


Angehängte Datei(en) Thumbnail(s)
   
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
02.01.2016, 09:24
Beitrag #2
RE: SPI BMA020
Moin,
also der Sensor hat ja einige Konfigurationsregister...möglicherweise muß man da erst mal was initialisieren das der seine Arbeit aufnimmt.
Und hast du mal die die x,y,z Register dir ausgeben lassen ohne sie vorher per Shift Befehl zu verändern ? Weil da habe ich gerade ungeprüfte Zweifel ob die Daten so richtig zusammengesetzt werden. Und btw. ersetze mal bitte short durch int weil short benutzt hier kein Mensch und ist nichts anderes als int.
lgbk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
02.01.2016, 15:47 (Dieser Beitrag wurde zuletzt bearbeitet: 02.01.2016 20:24 von Bitklopfer.)
Beitrag #3
RE: SPI BMA020
Hallo Bitklopfer,

(02.01.2016 09:24)Bitklopfer schrieb:  also der Sensor hat ja einige Konfigurationsregister...möglicherweise muß man da erst mal was initialisieren das der seine Arbeit aufnimmt.

Standard Einstellungen sind +/-2g und 4-Wire. Ich hab den Sensor geschafft über I²C auszulesen, da musste auch nichts konfiguriert werden.

Und hast du mal die die x,y,z Register dir ausgeben lassen ohne sie vorher per Shift Befehl zu verändern ?

Ja, das hab ich schon im vorherigen Post erwähnt, alles 0er...


Weil da habe ich gerade ungeprüfte Zweifel ob die Daten so richtig zusammengesetzt werden.
...
lgbk


Müssten sie, 8 bit MSB + 2 bit LSB = 10Bit, habe das über I²C probiert und die Werte waren sinnvoll, getestet an der Erdbeschleunigung/Achse.

Auf Quotenregeln bitte achten. lgbk
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
02.01.2016, 16:28
Beitrag #4
RE: SPI BMA020
Moin,

CPU short int
8 bit 16 16
16 bit 16 16
32 bit 16 32
64 bit 16 32


Gruesse

Nicht denken,...
...nachdenken... Rolleyes
http://capsicum-felicitas.de.tl
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
02.01.2016, 17:25
Beitrag #5
RE: SPI BMA020
(02.01.2016 16:28)Hilgi schrieb:  Moin,

CPU short int
8 bit 16 16
16 bit 16 16
32 bit 16 32
64 bit 16 32


Gruesse

Ja gut, wie ich die Bits schiebe kann ich mir ja überlegen sobald mir der Sensor irgendwelche Werte ausspuckt.. Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
02.01.2016, 20:30
Beitrag #6
RE: SPI BMA020
(02.01.2016 17:25)Erbsenhirn schrieb:  ....

Ja gut, wie ich die Bits schiebe kann ich mir ja überlegen sobald mir der Sensor irgendwelche Werte ausspuckt.. Big Grin

...was mir noch aufgefallen ist...im Datenblatt reden sie was von 16 Bit Eingabe...
mit:
Code:
SPI.transfer(READ); // Command to Read //(0x80) Register 2 (0x02) multiple reading
schiebst du aber nur 8 Bit raus...versuch doch mal einen Zweiten Wert hinterherzuschicken mit einem weiteren SPI.transfer Befehl....Inhalt siehe Datenblatt falls da was hinterlegt ist.
Bei I2C schickt man ja die Adresse vom System aus schon mit...bei SPI muß man das dann von Hand machen.
lgbk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
02.01.2016, 21:35 (Dieser Beitrag wurde zuletzt bearbeitet: 02.01.2016 22:40 von Erbsenhirn.)
Beitrag #7
RE: SPI BMA020
(02.01.2016 20:30)Bitklopfer schrieb:  
(02.01.2016 17:25)Erbsenhirn schrieb:  ....

Ja gut, wie ich die Bits schiebe kann ich mir ja überlegen sobald mir der Sensor irgendwelche Werte ausspuckt.. Big Grin

...was mir noch aufgefallen ist...im Datenblatt reden sie was von 16 Bit Eingabe...
mit:
Code:
SPI.transfer(READ); // Command to Read //(0x80) Register 2 (0x02) multiple reading
schiebst du aber nur 8 Bit raus...versuch doch mal einen Zweiten Wert hinterherzuschicken mit einem weiteren SPI.transfer Befehl....Inhalt siehe Datenblatt falls da was hinterlegt ist.
Bei I2C schickt man ja die Adresse vom System aus schon mit...bei SPI muß man das dann von Hand machen.
lgbk

Hi, danke für deinen Beitrag. Das 16 bit protokoll hab ich auch schon bemerkt.. aber wusste nichts damit anzufangen, ich werde mich nochmal hinsetzten und durschauen und meld mich dann, danke.

(02.01.2016 21:35)Erbsenhirn schrieb:  
(02.01.2016 20:30)Bitklopfer schrieb:  
(02.01.2016 17:25)Erbsenhirn schrieb:  ....

Ja gut, wie ich die Bits schiebe kann ich mir ja überlegen sobald mir der Sensor irgendwelche Werte ausspuckt.. Big Grin

...was mir noch aufgefallen ist...im Datenblatt reden sie was von 16 Bit Eingabe...
mit:
Code:
SPI.transfer(READ); // Command to Read //(0x80) Register 2 (0x02) multiple reading
schiebst du aber nur 8 Bit raus...versuch doch mal einen Zweiten Wert hinterherzuschicken mit einem weiteren SPI.transfer Befehl....Inhalt siehe Datenblatt falls da was hinterlegt ist.
Bei I2C schickt man ja die Adresse vom System aus schon mit...bei SPI muß man das dann von Hand machen.
lgbk

Hi, danke für deinen Beitrag. Das 16 bit protokoll hab ich auch schon bemerkt.. aber wusste nichts damit anzufangen, ich werde mich nochmal hinsetzten und durschauen und meld mich dann, danke.


Zum schreiben, braucht man das 16 Bit Protokoll, 1 RW, 7 Adress & 8 Data. Zum Auslesen sind es doch nur die 8 Bit. So verstehe ich das Datenblatt (siehe Bild)

(02.01.2016 21:35)Erbsenhirn schrieb:  
(02.01.2016 20:30)Bitklopfer schrieb:  
(02.01.2016 17:25)Erbsenhirn schrieb:  ....

Ja gut, wie ich die Bits schiebe kann ich mir ja überlegen sobald mir der Sensor irgendwelche Werte ausspuckt.. Big Grin

...was mir noch aufgefallen ist...im Datenblatt reden sie was von 16 Bit Eingabe...
mit:
Code:
SPI.transfer(READ); // Command to Read //(0x80) Register 2 (0x02) multiple reading
schiebst du aber nur 8 Bit raus...versuch doch mal einen Zweiten Wert hinterherzuschicken mit einem weiteren SPI.transfer Befehl....Inhalt siehe Datenblatt falls da was hinterlegt ist.
Bei I2C schickt man ja die Adresse vom System aus schon mit...bei SPI muß man das dann von Hand machen.
lgbk

Hi, danke für deinen Beitrag. Das 16 bit protokoll hab ich auch schon bemerkt.. aber wusste nichts damit anzufangen, ich werde mich nochmal hinsetzten und durschauen und meld mich dann, danke.

Es heißt ja aber 16bit Protokoll, davon 1R/W, 7Address + 8 Databyte. Beim Lesen ist es nur ein Byte. Denk so einfach ist das auslesen nicht. Ich schau mir jetzt Leseregister von SPI genauer an.


Angehängte Datei(en) Thumbnail(s)
       
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
02.01.2016, 23:13
Beitrag #8
RE: SPI BMA020
(02.01.2016 21:35)Erbsenhirn schrieb:  ...
Es heißt ja aber 16bit Protokoll, davon 1R/W, 7Address + 8 Databyte. Beim Lesen ist es nur ein Byte. Denk so einfach ist das auslesen nicht. Ich schau mir jetzt Leseregister von SPI genauer an.

genau das meinte ich...aber wenn du SPI.transfer() aufrufst werden nur 8 Bit übertragen.
füge doch einfach nach dem
SPI.transfer(READ); // ein
SPI.transfer(0);
ein.
lgbk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste