Brauche Hilfe bei BMA020

wtp

Neues Mitglied
29. Mai 2010
8
0
0
Sprachen
Hallo allerseits! Ich bin neu in dem Forum und hoffe hier Hilfe zu finden!

Ich versuche gerade vergeblich über I2C einen BMA020 (welcher sich auf dem Print von ELV befindet) auszulesen und finde einfach keinen Fehler! Ich bekomme im Terminal immer nur 255 ausgegeben und die Werte ändern sich einfach nicht!

Ich arbeite mit BASCOM (hab ich auch erst neu begonnen) und einem Atmega88 auf einenm Experimentierboard.

Ich hoffe auf Hilfe!

grüsse Robert

Hier der Code:

$regfile = "m88def.dat"
$crystal = 8000000
$baud = 19200
$hwstack = 40
$swstack = 40
$framesize = 40


Config Scl = Portc.1
Config Sda = Portc.0
Config I2cdelay = 10


Dim Ax As Integer
Dim Bx As Integer
Dim Ay As Integer
Dim By As Integer
Dim Az As Integer
Dim Bz As Integer

I2cinit

I2cstart

I2cwbyte &H70
I2cwbyte &H15
I2cwbyte &B10000000

I2cstop


Delay

I2cstart

I2cwbyte &H70
I2cwbyte &H14
I2cwbyte &B00100

I2cstop

Delay



start:

do
I2cstart

I2cwbyte &H70
I2cwbyte &H02

I2cstop

I2cstart

I2cwbyte &H71
I2crbyte Ax , Nack
I2crbyte Bx , Nack
I2crbyte Ay , Nack
I2crbyte By , Nack
I2crbyte Az , Nack
I2crbyte Bz , Ack

I2cstop

Delay

print bx
print by
print bz

loop

end
 
Hi Robert,

Ich versuche gerade vergeblich über I2C einen BMA020 (welcher sich auf dem Print von ELV befindet) auszulesen und finde einfach keinen Fehler! Ich bekomme im Terminal immer nur 255 ausgegeben und die Werte ändern sich einfach nicht!

Ich arbeite mit BASCOM (hab ich auch erst neu begonnen) und einem Atmega88 auf einenm Experimentierboard.
:confused: Sorry, aber was ist ein BMA020 ? Ich hab das Ding als Datenblatt
und auch bei ELV nicht gefunden. Hast du da nähere Angaben ? Links ?
Datenblätter ?

Gruß
Dino
 
Hallo,

@Dino:
Das ist ein 3-Achsen-Beschleunigungssensor von Bosch. Sagt zumindest Tante Google und spuckt auch gleich ein Datenblatt mit aus: http://dkc3.digikey.com/PDF/Marketing/Bosch_BMA020.pdf

@Robert:
Setz doch einfach hinter das erste I2cwbyte &H70 mal ein Print Err. Wenn da etwas anderes als 0 kommt, dann funktioniert die Kommunikation nicht. Dann wäre die Beschaltung nicht richtig.
Wenn du Code postest, empfiehlt es sich, das Ganze in Code-Tags zu setzen. Findest du in der Symbolleiste unter #:
Code:
I2cwbyte &H70
Print Err
 
@StevieL: Danke für den Tipp, hat aber leider nix gebracht! Die Werte ändern sich nach wie vor nicht! immer nur 255...

Mir ist gerade aufgefallen dass wenn ich an den Leitungen wo mein Sensor angeschlossen ist nur offene Leitungen (ohne irgendeiner externen Beschaltung) sich die Werte ändern wenn ich die Leitungen berühre!!??
 
Es wird immer nur 255 ausgegeben, sonst nichts! Err = 0 hat er auch nicht geschrieben!
 
Hallo zusammen,

ich glaube, hier ist der Zeitpunkt an dem Nummer5 immer sagt "Mehr Input!" :D

Ich hoffe mal das der Sensor fehlerfrei funktioniert. Nicht das wir mal wieder an
einem Problem in der Software suchen das nachher in der Hardware steckt ...
(siehe Luftdruckmessung mit MS5534/MS5540) :eek:

Als erstes würde ich bei der Fehlersuche mal ne Ausgabemöglichkeit an den
Atmel setzen. Ob jetzt LCD, UART zum PC, ... was auch immer. Damit man
möglichst viele Infos vom internen Programmablauf und den einzelnen
Schritten im Programm sehen kann. Dann kann man die einen nach dem anderen
auf Funktion überprüfen.

Der vollständige Quellcode für nen zwischenzeitlichen Abgleich der Aktivitäten
wär glaube ich auch nötig. Damit man sieht was sich in der Zwischenzeit
geändert hat.

Ich hab zwar noch nicht viel mit I2C gemacht aber was mir aufgefallen ist
sind die ganzen NAKs die du beim Byte-Lesen dem Slave übergibst. Bricht
das den Lesevorgang nicht ab ? Normalerweise sendet man ein NAK doch nur
am Schluß der Aktion. Also zuerst die Adresse, dann das Kommando und dann
liest man so lange bis man keine Lust mehr hat oder die Anzahl der Bytes für
das Kommando erreicht ist.

Kommuniziert der Atmel überhaupt vernünftig mit dem Sensor ? Wird er
überhaupt angesprochen ? Meldet er sich überhaupt irgendwie ? Und wenn
es nur ne Fehlermeldung ist ?

Nicht das wir hier nur das Potential auf dem Bus lesen, das durch die PullUps
erzeugt wird. Das wäre nämlich High (Vcc) und würde auch die 255 erklären.

Also mal alles kontrollieren und nachsehen ob das überhaupt irgendwie
miteinander spricht.

Gruß
Dino
 
Hallo Dino,

darum meine Nachfrage! Wenn Robert uns mal verrät, welchen Wert die ERR-Variable denn nun tatsächlich annimmt, wissen wir, ob die Kommunikation funktioniert oder ob es hardwaremäßig ein Problem gibt. Vorher braucht man eigentlich noch keine weiteren Ausgaben einbauen.
 
ERR ist auch 255!
Wie es aussieht findet überhaupt keine Kommunikation statt!
Die Beschaltung ist aber meinermeinung nach richtig bzw. genau nach Datenblatt! Also pull ups am Sensor aktiviert, gleiches Masse- Potenzial usw.
 
Hi,

ERR ist auch 255!
Wie es aussieht findet überhaupt keine Kommunikation statt!
Die Beschaltung ist aber meinermeinung nach richtig bzw. genau nach Datenblatt! Also pull ups am Sensor aktiviert, gleiches Masse- Potenzial usw.
Datenblatt vom Sensor oder Datenblatt von der ELV-Platine ?
Leider ist über die Beschaltung der Platine garnix auf der Seite von ELV zu
finden :(
Allerdings sind ein paar interessante Infos zu lesen ...
Das sehr kompakte Sensor-Modul ist mit einem digitalen 3-Achsen-MEMS-Beschleunigungssensor BMA020 von Bosch Sensortec bestückt und stellt für die einfache Einbindung in eigene Applikationen einen 2,5-V-Spannungswandler sowie fünf Pegelwandler bereit.

Der Beschleunigungssensor erzeugt zwischen 25 und 1500 Mal pro Sekunde Messdaten in einem frei wählbaren Bereich von ±2 g, ±4 g oder ±8 g. Das winzige Modul ist einfach per Rasterleis*te auf eine Platine der Applikation, z. B. Mikroprozessor-Anwendung, aufsteckbar, die Kommunikation erfolgt wahlweise über I2C oder SPI (3/4 wire). Alle digitalen Ein- und Ausgänge sind mit bidirektionalen Pegelwandlern ausgestattet, so dass das Modul direkt an Schaltungen in einem weiten Spannungsbereich von +2,5 bis +6 V betrieben werden kann. Der weite Eingangsspannungsbereich ermöglicht die einfache Versorgung in unterschiedlichsten Schaltungskonfigurationen, ob 3 V, 3,3 V oder 5 V.
BMA020_I2C.png
Laut Datenblatt vom Bausteine braucht man ja für I2C nicht so viel,
SDA,SCL (der I2C-Bus) , INT für evtl Interrupts und noch ein paar
Versorgungsanschlüsse die aber evtl direkt auf der Platine bereits
irgendwie angeschlossen sind.

Bei ELV gibt es folgende Pins ...
UIn ----- CSB
Enable ----- SCK
UPullup ----- SDI
INT ----- SDO
GND ----- GND

Diesen Enable gibts beim IC nicht. Also muß der irgendwo in der ELV-Platine
was machen. Schaltet der evtl die Pegelwandler frei ? Hast du irgendwelche
Infos direkt über diese ELV-Platine ? Ich tippe mal das die Wandler alle
abgeschaltet sind weil der Pin nicht angeschlossen ist. Damit ist dann
natürlich auch nix mit Kommunikation. Also mal direkt auf der Hardwareebene
Fehler suchen und nicht so auf das Datenblatt des Hersteller versteifen.
ELV hat da was drum rum gestrickt. Auf diese Beschaltung des ICs kommt
es jetzt an.

Gruß
Dino
 
Hi,

so .. mal sehen was die da so gebasttelt haben ...

Datenblatt von ELV! (hab mich auch nach dem gerichtet!)
Ich habs mal eingescannt ist scheinbar wirklch nirgendwo online!
Enable ist zum ausschalten des Sensors! Angeschlossen hab ich laut Bild Nr 7 (ohne Int)

Hier erstmal das Datenblatt des Spannungsreglers zu dem auch das Enable geht ..
Anhang anzeigen TS9001K_LowDropOut-VoltageRegulator.pdf
Gedankengang anhand der Datenblätter und des Schaltplans von ELV ...

=> Man schaltet also die gesamte Spannungsversorgung ab wenn der Enable
auf GND gelegt wird. Da er auf der Platine über R1 (1M) auf +UIn (max 7V)
gezogen wird ist der Regler also standardmäßig angeschaltet. Paßt also.
=> In den Datenleitungen arbeiten n-Ch-MOSFETs (IRLML2402) als
Pegelwandler ... ( Datenblatt : Anhang anzeigen IRLML2402_n-Ch-MOSFET.pdf )
=> Jumper 1 muß offen bleiben damit man extern mit anderer Spannung als
der internen 2,5V arbeiten kann.
=> INT ist ein Ausgang und kann erst einmal vernachlässigt werden.
=> SDO muß auf GND gelegt werden.
=> SDI und SCK kommen an den I2C-Bus (SDA und SCL)
=> CSB muß auf +UIn genauso wie Upullup.

Genauso wie in Bild 7 - also so wie du es ja anscheinend angeschlossen hast.

Im Datenblatt steht folgendes ...
4.2.1 I2C protocol:
The BMA020 I2C slave address is coded on 7 bits (0111000b=38h) fixed by a
metal option. Thus I2C write address is 01110000b (=70h), read address is
01110001b (=71h).

Hast du dir schon mal im BMA020-Datenblatt die Seiten 34+35 angesehen
wo der Ablauf auf dem I2C-Bus zu sehen ist? Benutzt du die richtige Adresse?

Schieb doch mal dein aktuelles Proggi in #-CodeTags hier rein damit man
da mal drübersehen kann. Evtl steckt da ja irgendwo der Wurm drin ...
Sonst fällt mir im Moment auch nichts ein.

Evtl irgendwo ein blöder Fehler ? Modul falsch angeschlossen ? 180° gedreht
oder gespiegelt angeschlossen (Oberseite/Unterseite , Links/Rechts , ...)
Irgendwo nen Wackelkontakt ? Photo vom Aufbau auf dem man evtl nen Fehler
erkennt ? SDA und SCL vertauscht ?

Nimm dir doch einfach mal 2 PNP-Transistoren (BC557 oder so) und schalte die
Basis von denen jeweils über 22k an die Leitungen SDA und SCL und dann schalte
doch mal LEDs damit (Vorwiderstand!). Dann kannst du hochohmig am Bus sehen
ob sich was tut. PNP aus dem Grund weil der Bus im Ruhezustand auf +5V ist und
man ja Aktivität sehen möchte (als wenn der Bus nach GND geht). Wenn da nix
blinkt ist was oberfaul. Wenn dir unklar ist wie ich das meine dann frag einfach
nochmal. Dann mach ich nen Schaltplan. (Grad keine Lust zum malen ;) )

Noch was ... hast du in Bascom schon mal versucht die Sequenz auf Seite 7
vom Datenblatt nachzustellen ? s70 02 s71 06 p und dann 6 Bytes lesen ?
Versuch doch mal was bekanntes das funktionieren sollte. Bei dir im Proggi
von Beitrag #1 sind ganz andere Sequenzen drin.

Gruß
Dino
 
I2C Aktivitäts-Anzeige

Hi,

I2C-Activity.png
also hier sicherheitshalber mal nen Schaltplan. Entweder die linke Version mit
2x PNP oder die rechte mit 2x P-MOSFET bauen und an den Bus hängen.
dann sollten die LEDs flackern wenn Aktivität da ist (also der Bus auf GND
geht).

Die Version mit P-MOSFET ist zu bevorzugen weil sie den Bus sehr wenig
belastet. Aber notfalls tuen es auch die PNPs. Dann sollte man aber über
zwei PullUps mit 3,3k oder 4,7k am Bus nachdenken damit einem der Basisstrom
nicht die Pegel am Bus durcheinanderbringt.

Gruß
Dino
 
So, sorry für die lange Schreibpause, hatte ein "wenig" viel zu tun die letzten Wochen!

Code:
$regfile = "m88def.dat"
$crystal = 8000000
$baud = 19200
$hwstack = 40
$swstack = 40
$framesize = 40


Config Scl = Portc.1
Config Sda = Portc.0
Config I2cdelay = 10


Dim Ax As Integer
Dim Bx As Integer
Dim Ay As Integer
Dim By As Integer
Dim Az As Integer
Dim Bz As Integer

I2cinit

I2cstart

I2cwbyte &H70
I2cwbyte &H15
I2cwbyte &B10000000

I2cstop


Delay

I2cstart

I2cwbyte &H70
I2cwbyte &H14
I2cwbyte &B00100

I2cstop

Delay



start:

do
I2cstart

I2cwbyte &H70
I2cwbyte &H02

I2cstop

I2cstart

I2cwbyte &H71
I2crbyte Ax , Nack
I2crbyte Bx , Nack
I2crbyte Ay , Nack
I2crbyte By , Nack
I2crbyte Az , Nack
I2crbyte Bz , Ack

I2cstop

Delay

print bx
print by
print bz

loop

end

Ich werd mir mal zur Sicherheit einen 2. Sensor bestellen um sicherzugehen dass die Hardware nichts hat und mal die LED Testschaltung aufbauen (danke hierfür!!)

grüsse Robert
 
I2cstart
I2cwbyte &H71
I2crbyte Ax , Nack
I2crbyte Bx , Nack
I2crbyte Ay , Nack
I2crbyte By , Nack
I2crbyte Az , Nack
I2crbyte Bz , Ack
I2cstop

ich habe noch nicht mit I2C gearbeitet, aber ich hätte das jetzt eher so erwartet:

I2cstart
I2cwbyte &H71
I2crbyte Ax , Ack
I2crbyte Bx , Ack
I2crbyte Ay , Ack
I2crbyte By , Ack
I2crbyte Az , Ack
I2crbyte Bz , Nack
I2cstop

HBA
 
ich habe noch nicht mit I2C gearbeitet, aber ich hätte das jetzt eher so erwartet:

I2cstart
I2cwbyte &H71
I2crbyte Ax , Ack
I2crbyte Bx , Ack
I2crbyte Ay , Ack
I2crbyte By , Ack
I2crbyte Az , Ack
I2crbyte Bz , Nack
I2cstop

HBA


Laut Seite 35 Figure 16 im Datenblatt sollte es so stimmen wie ich es geschrieben habe!?
 
Hallo Robert,
also ich lese auf Seite 35 in der Figure 16 (Datasheet Version 1.1 vom 14.1.2008), dass zwischen allen Reads ein ACK steht. Vor dem finalen Stop steht dann ein NACK.
Oder sieht das bei dir anders aus?
Aber wie gesagt, ich habe selber noch nichts damit gemacht, also lass dich von mir nicht zu sehr verwirren, falls ich daneben liege.

HBA
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)