mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik BMA020 Beschleunigungssensor über SPI auslesen


Autor: Tobi W. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe folgenden Beschleunigungssensor: 
http://www.elv.de/output/controller.aspx?cid=74&de...

Jetzt möchte ich die Beschleunigung in z-Richtung mit einem ATMega644 
über SPI auslesen.

MOSI <=> SDI
MISO <=> SDO
SCK <=> SCK
SS <=> CSB
VCC <=> UIN
VCC <=> UPullup
GND <=> GND


Dazu habe ich das SPI initialisiert;
DDR_SPI |= (1<<DD_MOSI)|(1<<DD_SCK)|(1<<DD_SS);
SPCR = (1<<SPE)|(1<<MSTR)|(1<<CPOL)|(1<<CPHA); // (1<<CPOL)|(1<<CPHA); BMA020 Datenblatt Seite 23


und in einer Endlosschleife sollen die höchsten 8 Bit der Beschleunigung 
in z-Richtung auf einem Display ausgegeben werden. Dazu muss Adresse 7 
ausgelesen werden (DB Seite 9 und 24)
while(1)
  {
    PORT_SPI &=~ (1<<DD_SS);      // Aktiviere Sensor
    
    SPI_MasterTransmit((1<<7)|(0x07));  // Adresse 7 ansprechen (lesen)
    SPI_MasterTransmit(0);        // Dummy Daten rüberschicken um Adresse 7 auszulesen
    
    
    itoa(SPDR,string,10);  // Gebe empfangenes Byte auf Display aus
    LCDSetCursorPos(0,0);
    LCDWrite(string);
    
    itoa(i++,string,10);  // Überprüfe ob while-Schleife durchlaufen wird
    LCDSetCursorPos(1,0);
    LCDWrite(string);
    
    
    PORT_SPI |= (1<<DD_SS);      // Deaktiviere Sensor
    
    wait_ms(10);
  }


Leider kommt immer wieder nur eine 0 an. Kann mir jemand helfen und 
sagen wo der Fehler ist? Danke.

Autor: Tobi W. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Problem schein unabhängig vom Sensor zu sein. Auch wenn ich einen 
ATMega8 als Slave benutze werden die Schleifen nicht weiter 
durchgezählt.


Laut SPI Spezifikation kann der Slave den Master ausbremsen, wenn der 
Slave mit dem Takt nicht hinterherkommt. Das wird wohl der Grund sein 
warum er in der 2. Schleife stehen bleibt (sowohl beim Sensor als auch 
bei Atmega als Slave).

Hier der Code für die Verbindung zum ATMega:
void SPI_MasterInit(void)
{
  /* Set MOSI and SCK output, all others input */
  DDR_SPI |= (1<<DD_MOSI)|(1<<DD_SCK);
  /* Enable SPI, Master, set clock rate fck/16 */
  SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
}

void SPI_MasterTransmit(char cData)
{
  /* Start transmission */
  SPDR = cData;
  /* Wait for transmission complete */
  while(!(SPSR & (1<<SPIF)))
    SPSR &=~ (1<<SPIF);
}

int main(void)
{
  char string[20];
  uint16_t i=0;

  LCDInit();
  SPI_MasterInit();
  DDRB |= (1<<DD_SS);  // SlaveSelect ist ein Ausgang
  

  while(1)
  {
    PORT_SPI &=~ (1<<DD_SS);  // Aktiviere Slave
    
    SPI_MasterTransmit(0);    // Sende Dummy Byte um Daten des Slave zu erhalten
    
    
    itoa(SPDR,string,10);    // Gebe Daten auf dem Display aus    
    LCDSetCursorPos(0,0);
    LCDWrite(string);
    
    
    itoa(i++,string,10);    // Zähle Schleifendurchläufe
    LCDSetCursorPos(1,0);
    LCDWrite(string);
    
    
    PORT_SPI |= (1<<DD_SS);      // Deaktiviere Sensor
    
  }
  return 0;
}


Slave:
void SPI_SlaveInit(void)
{
  /* Set MISO output, all others input */
  DDR_SPI = (1<<DD_MISO);
  /* Enable SPI */
  SPCR = (1<<SPE);
}

char SPI_SlaveReceive(void)
{
  /* Wait for reception complete */
  while(!(SPSR & (1<<SPIF)))
    SPSR&=~(1<<SPIF);
  /* Return Data Register */
  return SPDR;
}
int main(void) 
{  
  SPI_SlaveInit();
  while(1)
  {
    SPI_SlaveReceive();
    SPDR=20;
  }
  return 0;
}

Autor: Werner B. (werner-b)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das bekannte Kürzel: RTFM

It is not possible to read-out only MSB bytes if shadow_dis=0, an LSB 
byte must first be read out. To be able to read out only MSB byte, 
shadow_dis must be written to 1.

3.1.6 Shadow_dis

BMA020 provides the possibility to block the update of data MSB while 
LSB are read out. This avoids a potential mixing of LSB and MSB of 
successive conversion cycles. When this bit (address 15h, bit 3) is at 
1, the blocking procedure for MSB is not realized and MSB only reading 
is possible.

Autor: Michael Maier (koenig_deluxe)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich beschäftige mich momentan auch zwangsläufig mit dem BMA020. Verwende 
einen Atmega8, ausgelesen werden soll auch über SPI.

Bedeutet der letzte Beitrag also, dass der oben stehende Quellcode nicht 
funktioniert da shadow_dis nicht auf 1 gesetzt wird?

Hab den Quellcode nämlich in mein uC geladen auf dem STK500 und über 
Flachbandkabel den Sensor am PORTB angeschlossen. Ausgeben wollte ich 
die Daten direkt auf den LEDs des STK500. Und es hat sich nichts getan! 
Konnte noch überhaupt keine Daten auslesen. Werde also bei gelegenheit 
das shadow_dis Bit auf 1 setzen und es erneut probieren. Bin da aber 
eher pesimistisch. Bei erneutem Fehlversuch werd ich hier mal mein 
Quellcode reinstellen.

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich weiß das ist schon ein sehr altes Thema, aber habe ein ähnliches 
Problem, wollte fragen ob du evtl deinen Code einstellen könntest mit 
dem du das Auslesen geschafft hast.

Vielen Dank schon mal im voraus

Gruß Michael

Autor: Johannes S. (killertomate)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Abend,

ich möchte mich Michael bei der Bitte anschließen:
wenn jemand zur Ansteuerung des BMA020 über SPI Quellcode hat, der 
funktioniert, wäre ich sehr dankbar.

Das Problem bei mir ist, dass ich den Protokollablauf wohl nicht richtig 
verstehe, aber auch Angst habe, meinen Chip zu zerstören :(

Viele Grüße
Johannes

Autor: PittyJ (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>>Das Problem bei mir ist, dass ich den Protokollablauf wohl nicht richtig
>>verstehe, aber auch Angst habe, meinen Chip zu zerstören :(

Das geht?
So rein mit dem SPI-Protokoll kann ich den Chip kaputt machen?

Wieder was gelernt.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.