Forum: Mikrocontroller und Digitale Elektronik 3 Achsen MEMS Beschleunigungs Sensorkit


von Andre R. (debugwire)


Lesenswert?

Hallo zusammen,

ich habe ein STEVAL MKI087V1 und würde gern wissen, wie man den 
konfiguriert.
Im Datenblatt findet man nur die Pinbelegung.

Ich bin neu auf dem Gebiet und Programmiere erst seit 3 Monaten ATmegas.

von Heiko J. (heiko_j)


Lesenswert?

Andre R. schrieb:
> Hallo zusammen,
>
> ich habe ein STEVAL MKI087V1 und würde gern wissen, wie man den
> konfiguriert.
> Im Datenblatt findet man nur die Pinbelegung.
>
> Ich bin neu auf dem Gebiet und Programmiere erst seit 3 Monaten ATmegas.
Also ich hab dank google ca.25 sec gebraucht :-)

Was ist das STEVAL MKI087V1 ?
Antwort: Ein Breakout für den LIS331DL
http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/DATA_BRIEF/CD00272379.pdf

Wie bewege ich den LIS331DL zur mitarbeit ?
http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/DATASHEET/CD00172345.pdf

Wie bastel ich den an meinen ATmega ?
Per I²C oder SPI. Und wer I²C kennt nimmt SPI :-) Zumal ja SPI für den 
ATmega wie gemacht ist ;-)

http://www.mikrocontroller.net/articles/Serial_Peripheral_Interface
http://www.mikrocontroller.net/articles/I2C


Gruß Heiko

von debugwire (Gast)


Lesenswert?

Danke Heiko.

Laut STmicroeldctronics benötigt man noch ein weiteres Board für das 
beschreiben der Register.

Unter user manuals die Unico software.
http://www.st.com/internet/evalboard/product/250478.jsp

Es muss doch aber auch ohne irgendwie gehn, da wenn man später den 
Sensor auf ne Platine packt man ja kein USB-Port mehr zur verfügung hat.

von friedrich (Gast)


Lesenswert?

Hallo debugwire,

schau Dir doch mal das Dtenblatt des LIS331 an, dann wirst Du 
efststellen daß der eine ... Schnittstelle hat. Die kannst Du an Deinem 
Board ja zugreifen.

Grüße

von debugwire (Gast)


Lesenswert?

Meinst du die SPI Schnittstelle?

von friedrich (Gast)


Lesenswert?

Hallo debugwire,

Bingo. Jetzt musst Du nur noch diese Schnittstelle auf dem Board 
identifizieren - welche Pins sind das?
Tip:

Heiko hat weiter oben schon den Link dazu gepostet:
>Was ist das STEVAL MKI087V1 ?
>Antwort: Ein Breakout für den LIS331DL
>http://www.st.com/internet/com/TECHNICAL_RESOURCES...

Und dann noch die Pins mit Deinem Controllerboard verbinden.

Was ist daran schwer?

Grüße

von friedrich (Gast)


Lesenswert?

Hallo Debugwire,

hab mir mal Deinen anderen Thread angesehen. Dort schreibst Du:

>grundsätzlich möchte ich gern das Sensor Evaluierung Board STEVAL
MKI087V1 von STmicroelectronics mit einem ATmega per SPI auslesen und
weiterverarbeiten.

Also weisst Du schon wie das geht. Was meinst Du mit "Konfigurieren" und 
was wilst Du eigentlich machen?

Das Datenblatt sagt zum Thema unter dem Abschnitt 7 Register description 
sehr schön:
"The device contains a set of registers which are used to control its 
behavior and to retrieve acceleration data. The registers address, made 
of 7 bits, is used to identify them and to write the data through serial 
interface."

Jetzt klar?

von Arthur (Gast)


Lesenswert?

In dem Fall würde ich Dir eher zu was "fertigerem" raten damit Du Dich 
durch Selbstschulung ins Thema einarbeiten kannst.

Atmel hat für die Xplain kits auch Sensor-boards entwickelt, und liefert 
dazu die Software im neuen Atmel Studio 6, fertige Projekte und Treiber.

http://www.atmel.com/products/microcontrollers/avr/sensors_xplain.aspx

Die Sensorplatinen sind kompatibel mit folgenden Kits:

http://www.atmel.com/products/microcontrollers/avr/xplain.aspx

Ich hab an einem halben Tag die ganze Software begriffen, und hatte wo 
ich abspicken konnte.

von debugwire (Gast)


Lesenswert?

Hallo friedrich,

danke für deine schnelle Antwort.
Die SPI pins habe ich gefunden, versteh aber nicht, wie ich auf die 
Register zugreifen kann ohne die unico software.
Ich habe schonmal eine SPI Kommunikation zwischen 2 ATmega hergestellt 
und dort müssen Master und Slave aufeinander abgestimmt sein.
Ich verstehe nicht wie das beim STEVAL gehen soll.

von debugwire (Gast)


Lesenswert?

Hallo Arthur,

danke für den Tip.
Leider kann ich deine ATMMEL variante nicht anschaffen aus 
kostengründen.
Es muss mit meinem STEVAL geschehen.

von friedrich (Gast)


Lesenswert?

Hallo debugwire,

Bei jedem Mikrocontroller gibt es eine Beschreibung des Funktionsblockes 
SPI . Dort musst Du Dich einlesen wie Du als Master ein entsprechendes 
Kommando absetzen kannst. Dann liest Du den LIS nach, der ist Slave. Da 
du Dies schon gemacht hast (zumindest bei 2 ATMegas) solltest Du damit 
keine Probleme haben.

Oder wo hakt es?

Grüße

von gszdt (Gast)


Lesenswert?

>Laut STmicroeldctronics benötigt man noch ein weiteres Board für das
>beschreiben der Register.

Nein.

Das wird vermutlich nur benötigt, wenn
man den Sensor zu Evalzwecken am PC betreiben will.

>Es muss mit meinem STEVAL geschehen.

Wo ist das Problem?

SPI Write ist in 5.2.2 des Datenblatts beschrieben.
CTRL_REGx in 7.2, 7.3.

Sonst noch was?

von debugwire (Gast)


Lesenswert?

Wie beschreibe ich z.B. das Register CTRL_REGx?
Ich hab eine SPI Schnittstelle welche auf Pins rausgeführt ist.
Wenn der CS Pin auf High gesetzt wird arbeitet der Sensor im I²C Mode 
und wenn nicht dann in SPI?
Der Sensor hat nur die 4 SPI/I²C Pins  und Vdd, Gnd, Vd_IO.

von Heiko J. (heiko_j)


Lesenswert?

debugwire schrieb:
> Wie beschreibe ich z.B. das Register CTRL_REGx?
> Ich hab eine SPI Schnittstelle welche auf Pins rausgeführt ist.
> Wenn der CS Pin auf High gesetzt wird arbeitet der Sensor im I²C Mode
> und wenn nicht dann in SPI?
> Der Sensor hat nur die 4 SPI/I²C Pins  und Vdd, Gnd, Vd_IO.
Uiuiui. Ich glaube Du solltest Dir mal im Web ein paar Grundlagen über 
SPI und SPI mit dem ATmega anlesen und dann im Anschluss nochmal das 
Datenblatt des LIS durchlesen. Ich weis sonst wirklich nicht wie Ich Dir 
das an sonsten erklären könnte.


Gruß Heiko

von debugwire (Gast)


Lesenswert?

Hallo Heiko,

ich habe das Kit folgendermaßen angeschlossen.
MOSI->SDO
MISO->SDA
SS->CS
SCK->SCL

Es stut sich nix.
Wie schon erwähnt weiss ich immer noch nicht, wie ich bits in den Kit 
registern setzen oder löschen kann, da ich nicht weiß, wie ich drauf 
zugreife.
Das ist mein Hauptproblem.

von gszdt (Gast)


Lesenswert?

>Es stut sich nix.

Bitte genauer!
Was heisst das?
Was tust Du, mit welcher software?
Was erwartest Du?

Die Verdrahtung muss für 4-Wire Mode so sein:

MOSI  > SDA/SDI/SDO
MISO  > SDO/SA0
SS    > CS                 SPI chip select
SCK   > SCL/SPC            SPI clock

mit den Namen aus Section 5 des Datenblatts.
Ich hoffe Du hast die Namen auf der AVR Seite
richtig, ich kenne ihn nicht so genau.
4-Wire ist der Default Mode und deshalb zu bevorzugen.
Möglicherweise kann der AVR sowieso nur 4-Wire.

>Wie schon erwähnt weiss ich immer noch nicht, wie ich bits in den Kit
>registern setzen oder löschen kann,

Das habe ich Dir schon mal erklärt:

SPI Write ist in 5.2.2 des Datenblatts beschrieben.
CTRL_REGx in 7.2, 7.3.

Sonst noch was?

Datenblatt bitte auch lesen, nicht nur weinen!

von gszdt (Gast)


Lesenswert?

Noch was:

Bei SPI gibt es 4 Modes, die sich
in der Clock-Phase, d.h. in der aktiven Clock-Flanke
und im inaktive Clock Pegel unterscheiden.

Das muss natürlich auch zusammenpassen.

von debugwire (Gast)


Lesenswert?

@ gszdt:

Ich habe mit AVR Studio 5 ein SPI Transmit Programm zum Übertragen von 
Zeichenketten auf den µC (Master) geschrieben. Den µC habe ich mit dem 
Sensorkit dann so verbunden, wie du gesagt hast. D.h. also ohne 
Konfigurierung habe ich dieses getan, da ich das mit den Sensorregistern 
einfach noch nicht verstanden habe.
D.h. also ich habe versucht mit Werkseinstellungen des Kits alles zu 
betreiben. Leider ohne Erfolg.

Diese Programm läuft bei meiner damaligen Anwendung  SPI_µC1 sendet 
Zeichenkette an SPI_µC2 und µC2 gibt es dann per UART aus.
D.h. am Anfang der Kette steht ein Array und am Ende der Kette kann ich 
die Daten am Tx-Pin der UART mit dem Oszi messen.

Der µC kennt nur 4-wire SPI.

von Uwe (Gast)


Lesenswert?

> D.h. also ohne Konfigurierung habe ich dieses getan, da ich das mit den
> Sensorregistern einfach noch nicht verstanden habe.
Mußt du aber !
> Leider ohne Erfolg.
Wenn du nicht verstehst was du machsts, wundert dich das wirklich ?
Ließ doch mal im Datenblatt des Atmega das Kapitel über SPI !
Guck dir mal die Timingdiagramme im zusammenhang mit den 
unterschiedlichen Konfigurationsmöglichkleiten an ! z.B. CPOL usw. wo 
ist das LSB und wo das MSB im Timingdiagram. Was bedeutet das ?
Dann guck dir mal das Datnblatt wom Beschleunigungssensor an und die 
Timingdiagramme.
Klingelts ?

von debugwire (Gast)


Lesenswert?

Noch zum letzten Beitrag 2.Absatz:

Ich habe also mein SPIreceive Programm des µC2 genommen, die SlaveInit 
gegen eine MasterInit ausgetauscht und darauf gehofft, dass der µC Daten 
vom Sensorkit empfängt. Leider nicht der Fall.

von debugwire (Gast)


Lesenswert?

Hallo Uwe,

ich vermute, dass ich damals bei meinem Zeichenübertragungsprogramm mit 
etwas Glück die Sache zum laufen bekommen hatte und somit der Meinung 
war SPI verstanden zu haben.

von debugwire (Gast)


Lesenswert?

Andererseits sind es trotzdem für mich 2 verschiedene Welten.
Den µC beschreibe ich über DebugWire mit AVR Studio 5, in dem ich alle 
Register beschreiben kann, da sie ja in der <avr/io.h> drin sind.

Beim Sensorkit habe ich nur meine 4 SPI Pins, ein Datenblatt mit 
Registern, aber keine Software.
Da liegt mein Verständnisproblem.

von spess53 (Gast)


Lesenswert?

Hi

>Beim Sensorkit habe ich nur meine 4 SPI Pins, ein Datenblatt mit
>Registern...

Es gibt auch noch eine Application Note:

http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/APPLICATION_NOTE/CD00215823.pdf

>..., aber keine Software. Da liegt mein Verständnisproblem.

Das Schreiben der notwendigen Software nennt man programmieren. Dazu 
muss man sich allerdings vorher intensiv mit den verfügbaren 
Informationsquellen beschäftigen.

MfG Spess

von debugwire (Gast)


Lesenswert?

Danke Spess

von debugwire (Gast)


Lesenswert?

@ Spess

ich verstehe immer noch nicht, wie man die Register beschreibt.
Dort steht detailiert schrittweise erklärt wie man den Code aufbauen 
muss.
Wie aber bekomm ich den Code in das Board über die SPI?

Z.B.: Kapitel 9.2.1 deiner Application Note

1 read STATUS_REG
2 if STATUS_REG(3)=0 then goto 1
3 if STATUS_REG(7)=1 then some data have been overwritten
4 read OUTX
5 read OUTY
6 read OUTZ
7 data processing
8 goto 1

von Karl H. (kbuchegg)


Lesenswert?

debugwire schrieb:
> @ Spess
>
> ich verstehe immer noch nicht, wie man die Register beschreibt.
> Dort steht detailiert schrittweise erklärt wie man den Code aufbauen
> muss.
> Wie aber bekomm ich den Code in das Board über die SPI?

Indem du dem AtMega mitteilst, dass er gefälligst ein Byte über seine 
SPI Schnittstelle rausblasen soll.
Welches Byte? Na das, welches du vorher ermittelts hast, in dem zb 
drinnen steht, welches Register (in Form einer Registeradresse, die 
Namen sind nur für dich, für die Elektronik hat einfach alles, jedes 
einzelne Register, eine Adresse - also eine Zahl) du auslesen willst.

http://www.mikrocontroller.net/articles/Serial_Peripheral_Interface

Aus dem ST Datenblatt ermittelst da WAS (den Inhalt der Bytes) du 
übertragen willst. Das Atmel Datenblatt (bzw. diverse Application Notes 
und/oder Tuorien) sagen dir, WIE man auf dem AtMega die Bytes rausbläst.

Das ist ganz einfach eine Trennung in Transportmittel und Inhalt.
In der Bedienungsanleitung zu deinem Auto steht, wie du dein Auto in 
Betrieb nimmst. Im Reiseführer steht, was es am Ort XYZ alles zu sehen 
gibt und wie man da hinkommt. Willst du mit deinem Auto nach XYZ fahren, 
dann musst du beides kombinieren, da die Anweisungen im Reiseführer eben 
nicht für dein spezielles Auto gelten. Dafür steht wiederrum in deiner 
Autobeschreibung nicht konkret drinnen, was es im Dom zu XYZ alles zu 
sehen gibt.
Und zusätzlich wäre dann ein allgemeines Verständnis von Strassenkarten 
und wie man die liest, nicht verkehrt. Bei dir wäre das: Wie 
funktioniert eigentlich SPI grundsätzlich?

Gewöhn dich daran, dass du Informationen aus mehreren Quellen 
zusammentragen musst. Das ist täglich Brot aller Programmierer und 
irgendwann musst du damit anfangen. Du spielst jetzt mit den großen 
Jungs.

von debugwire (Gast)


Lesenswert?

Danke Karl Heinz.

Ist das dann nur in Assembler bzw. inline-Assembler möglich?
C wäre mir lieber.

von spess53 (Gast)


Lesenswert?

Hi

>Ist das dann nur in Assembler bzw. inline-Assembler möglich?
>C wäre mir lieber.

SPI kannst du in jeder Sprache benutzen. Beispielcode für Assembler und 
C steht in jedem AVR-Datenblatt.

MfG Spess

von Uwe (Gast)


Lesenswert?

Du Sendest über SPI 2 BYten also 16 Bit, dabei bedeuten die Bits das was 
dort im Datenblatt steht.
Ab Seite 20 im Datenblatt ist doch alles beschrieben :

bit 0: RW bit. When 0, the data DI(7:0) is written into the device. When 
1, the data DO(7:0)from the device is read. In latter case, the chip 
will drive SDO at the start of bit 8.

bit 1: MS bit. When 0, the address will remain unchanged in multiple 
read/write commands.
When 1, the address will be auto incremented in multiple read/write 
commands.

bit 2-7: address AD(5:0). This is the address field of the indexed 
register.

bit 8-15: data DI(7:0) (write mode). This is the data that will be 
written into the device (MSb first).

bit 8-15: data DO(7:0) (read mode). This is the data that will be read 
from the device (MSb first).

In multiple read/write commands further blocks of 8 clock periods will 
be 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 incremented at every block.

von Karl H. (kbuchegg)


Lesenswert?

debugwire schrieb:
> Danke Karl Heinz.
>
> Ist das dann nur in Assembler bzw. inline-Assembler möglich?
> C wäre mir lieber.

Das geht in C genauso.
Ist doch nur ein paar Register am AVR beschreiben um die SPI 
Schnittstelle zu konfiguerieren bzw. um dann die Bytes wegzuschicken.

Ob du in Assembler die Bytes in die Register schaufelst oder das einen 
C-Compiler machen lässt, ist dem µC völlig wurscht.

Nur: Es ist dein Bier, die Dinge in die Register zu schaufeln. Ein "READ 
STATUS REGISTER" wirst du in C nun mal nicht finden. Da musst du dir 
schon erst mal ansehen, wie man auf einem Mega per SPI die Bytes 
rausschaufelt und welche BIts in dem Byte gesetzt werden müssen, damit 
der Sensor das als 'Auslesen des Status Registers' interpretiert und das 
Byte zurückschickt.

Das Studium anderer SPI-Beispiele kann da ganz hilfreich sein um zu 
sehen, wie die technische Seite des Transportes abläuft. Beispiele dazu 
gibt es genug. Goggle mit "atmega spi".

Da zb.
http://www.ermicro.com/blog/?p=1050
Runterscrollen zu "Microchip MCP23S17 SPI I/O Expander" und dort die SPI 
Read und Write Routinen mal studieren bzw. überhaupt die komplette 
Seite.

Und dann nochmal im ST Datanblatt
http://ftp.equilibrium-wow.de/cgi-bin/nph-proxy.cgi/30/http/www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/DATASHEET/CD00172345.pdf
ab Seite 18 den SPI Transfer studieren. Und holla, da gibt es 
Gemeinsamkeiten! Der Byteaufbau ist anders und die Adresse wird anders 
angegeben, aber sooooo grossmächtig unterschiedlich ist das Prinzip 
nicht.


Wie gesagt: Lulu-Tante war gestern. Du bist jetzt bei den Großen. Und da 
werden die Dinge nun mal anstrengender und man muss verstehen was man 
tut. Routenbeschreibung alla Navi ist was für Weicher. Wir nehmen die 
Strassenkarte, die wir aus mehreren Quellen erst noch zusammensetzen.

von debugwire (Gast)


Lesenswert?

Danke Uwe, danke Karl Heinz

von debugwire (Gast)


Lesenswert?

Hallo zusammen,

hab jetzt ein Programm geschrieben welches einfach nur den Sensor 
aktivieren soll. Mehr erstmal nicht.
Leider funktioniert es nicht. Beim Debuggen hängt er beim Datenbyte und 
es kommt zu keiner Transmission complete.

Sprich in der MasterTransmit():


SPDR = data ;            // Start transmission of data (register)
  while(!(SPSR & (1<<SPIF)))    // Wait for transmission complete

Woran liegt das?

Kurz zum Programm:
Ich übergebe der MasterTransmit 2 Parameter.
1. Adresse des Sensorregisters
2. Registerinhalt




1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <stdio.h>
4
#include <stdlib.h>
5
#include <util/delay.h>
6
7
#define F_CPU 100000UL      
8
9
//SPI Registers
10
#define DDR_SPI     DDRB
11
#define DD_SS       DDB2
12
#define DD_MOSI     DDB3
13
#define DD_MISO     DDB4
14
#define DD_SCK      DDB5
15
 
16
//USART baudrate and presscaler
17
#define BAUDRATE 115200                
18
#define BAUD_PRESCALLER (((F_CPU / (BAUDRATE * 16UL))) - 1)  
19
20
21
//STEVAL Register adresses
22
#define CTRL_REG1    0x20
23
#define CTRL_REG2    0x21
24
#define CTRL_REG3    0x22
25
#define CTRL_REG4    0x23
26
27
#define HP_FILTER_RESET    0x25
28
29
#define REFERENCE    0x26
30
31
#define STATUS_REG    0x27
32
33
#define OUTZ      0x2D
34
35
36
37
38
void SPI_MasterInit(void)
39
{  
40
  DDR_SPI = (1<<DD_MOSI)|(1<<DD_SCK)|(1<<DD_SS);    //Set MOSI and SCK output, all others input 
41
  SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR1)|(1<<SPR0);    /* Modus 0,Enable SPI, Master, set clock rate fck/128  */ 
42
}
43
44
void SPI_MasterTransmit(uint8_t adress, uint8_t data)
45
{  
46
  DDR_SPI &= ~(1<<DD_SS);      //activate SS pin          
47
   
48
  SPDR = adress ;          // Start transmission of adress 
49
  while(!(SPSR & (1<<SPIF)))    // Wait for transmission complete 
50
    ;
51
  SPDR = data ;            // Start transmission of data (register)
52
  while(!(SPSR & (1<<SPIF)))    // Wait for transmission complete 
53
    ;
54
  
55
  DDR_SPI |= (1<<DD_SS);      //deactivate SS pin        
56
}
57
58
uint8_t SPI_MasterReceive(uint8_t adress, uint8_t data)
59
{    
60
  DDR_SPI &= ~(1<<DD_SS);      //activate SS pin          
61
      
62
  SPDR = adress | 0x80;        // Start transmission of adress  and read protocol (+0x80)
63
  while(!(SPSR & (1<<SPIF)))      /* Wait for reception complete */
64
  ;    
65
  
66
  SPDR = 0;              //send dummy for reading data
67
  while(!(SPSR & (1<<SPIF)))      /* Wait for reception complete */
68
  ;
69
  
70
  DDR_SPI |= (1<<DD_SS);        //deactivate SS pin      
71
  
72
  return SPDR ;            /* Return Data Register */  
73
}
74
75
int main(void) 
76
{      
77
  SPI_MasterInit();  //SPI initialization
78
79
  SPI_MasterTransmit(CTRL_REG1, 0x47);  //write protocol, CTR_REG    
80
  
81
82
  return 0;
83
}

von debugwire (Gast)


Lesenswert?

Noch zum Programm:

Ich habe es an folgendes Programm angelehnt:      File Name    : 
mcp23s17.c

http://www.ermicro.com/blog/?p=1050

von debugwire (Gast)


Lesenswert?

Hab jetzt den Fehler.
Es lag am Cipselect aktivieren.
Wenn ich das auskommentiere kann ich durchdebuggen.

Hat irgendjemand eine Ahnung warum?

von JTAGice3 (Gast)


Lesenswert?

Problem gelöst

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.