Forum: Mikrocontroller und Digitale Elektronik Beschleunigungssensor BMA020 funktioniert nicht


von Silvio F. (silvio_f)


Lesenswert?

Guten Tag,

Ich habe ein Beschleunigungssensor BMA020 von ELV und möchte die Daten 
über I2C und meinem MYAVR MK2 Board mit Atmega 8 auslesen.

Zu Testzwecken haben ich versucht mit diesem Code die Funktion des BMA 
zu überprüfen.
1
' compiler steuerung
2
$regfile = "m8def.dat"
3
$crystal = 1000000
4
$framesize = 64
5
$swstack = 64
6
$hwstack = 64
7
$baud = 9600
8
$lib "i2c_twi.lbx"
9
'
10
' hardware konfigurieren
11
' - taster
12
Config Pinb.6 = Input
13
Portb.6 = 1
14
Config Pinb.7 = Input
15
Portb.7 = 1
16
Config Pind.5 = Input
17
Portd.5 = 1
18
Taster1 Alias Pinb.6
19
Taster2 Alias Pinb.7
20
Taster3 Alias Pind.5
21
' - leds
22
Config Portd.7 = Output
23
Config Portd.6 = Output
24
Config Portb.0 = Output
25
Led_gl Alias Portd.7
26
Led_rt Alias Portd.6
27
Led_gr Alias Portb.0
28
' - i2c
29
Config Twi = 400000
30
Config Scl = Portc.5
31
Config Sda = Portc.4
32
'
33
' variablen dimensionieren
34
Dim V(6) As Byte
35
Dim Ax As Integer At V(1) Overlay
36
Dim Ay As Integer At V(3) Overlay
37
Dim Az As Integer At V(5) Overlay
38
Dim Acc_cntr As Byte
39
Dim I As Byte
40
Dim Acc_range As Byte
41
Dim D2g As Single
42
Dim S As Single
43
'
44
' konstanten
45
Const Acc_w = &H70
46
Const Acc_r = &H71
47
'
48
' subs
49
Declare Sub Set_acc_range(byval Range As Byte)
50
'
51
' hauptprogramm
52
Print "acc test!"
53
Wait 1
54
'
55
I2cinit
56
'
57
Call Set_acc_range(0)
58
' messbereich:
59
' Set_acc_range(0) -> +/- 2g (default)
60
' Set_acc_range(1) -> +/- 4g
61
' Set_acc_range(2) -> +/- 8g
62
'
63
Do
64
   I2cstart
65
   '
66
   ' sensor adressieren
67
   I2cwbyte Acc_w
68
   '
69
   ' acc datenregister adressieren
70
   I2cwbyte &H02
71
   '
72
   I2cstop
73
   '
74
   I2cstart
75
   '
76
   ' daten lesen
77
   I2cwbyte Acc_r
78
   '
79
   For I = 1 To 5
80
      I2crbyte V(i) , Ack
81
   Next I
82
   I2crbyte V(6) , Nack
83
   '
84
   I2cstop
85
   '
86
   ' format konvertieren
87
   Ax = Ax / 64
88
   Ay = Ay / 64
89
   Az = Az / 64
90
   '
91
   ' in beschleunigungen umrechnen & ausgeben
92
   S = Ax * D2g
93
   Print "a(x)= " ; S ;
94
   S = Ay * D2g
95
   Print "  a(y)= " ; S ;
96
   S = Az * D2g
97
   Print "  a(z)= " ; S
98
   '
99
   Toggle Led_rt
100
   Waitms 10
101
   '
102
Loop
103
'
104
End
105
'
106
Sub Set_acc_range(byval Range As Byte)
107
   I2cstart
108
   '
109
   ' sensor adressieren
110
   I2cwbyte Acc_w
111
   '
112
   ' kontrollregister adressieren
113
   I2cwbyte &H14
114
   '
115
   I2cstop
116
   '
117
   I2cstart                                                 '
118
   ' kontrollregister lesen
119
   I2cwbyte Acc_r
120
   I2crbyte Acc_cntr , Nack
121
   '
122
   I2cstop
123
   '
124
   ' kontrollregister manipulieren
125
   Acc_cntr.3 = Range.0
126
   Acc_cntr.4 = Range.1
127
   '
128
   I2cstart
129
   '
130
   ' kontrollregister zurückschreiben
131
   I2cwbyte Acc_w
132
   I2cwbyte &H14
133
   I2cwbyte Acc_cntr
134
   '
135
   I2cstop
136
   '
137
   ' umrechnungsfaktor neu berechnen
138
   D2g = 2 ^ Range
139
   D2g = D2g * 2
140
   D2g = D2g / 512
141
   '
142
End Sub



-das erste Problem:
1
Config Twi = 400000
 (diese Zeile lässt sich nicht kompileren)

-wenn cih die zeile weglasse läuft das programm bis zu
1
I2crbyte Acc_cntr , Nack
 in der Funktion Sub Set_acc_range(byval Range As Byte).

Er kann also das Nack nicht vom Sensor empfangen. Wenn ich den Sensor 
aus dem Steckbrett raus ziehe, läuft das Programm bis zum ende und die 
rote LED blinkt.

Hat jemand eine Idee? oder einen C-Code mit dem ich es probieren könnte?

von Michael S. (Gast)


Lesenswert?

Hallo,

die Aussage, dass der BMA020 nicht funktioniert, halte ich für sehr 
mutig.
Selten stellt die Hardware das Problem dar.

> -das erste Problem:
>
> Config Twi = 400000
>
> (diese Zeile lässt sich nicht kompileren)

Wenn sich eine Zeile schon nicht kompilieren läßt, dann solltest Du 
zuerst die Ursache dafür suchen.
Aus dem Stegreif fällt mir ein:
TWBR muss >= 10 sein, dass bedeutet, dass der ATMEGA 8 mit mindestens 
16MHz getaktet sein muss.

Es könnte aber auch ein Syntaxfehler vorliegen (mit Bascom kenne ich 
mich nicht mehr aus).

> Er kann also das Nack nicht vom Sensor empfangen.

Ein NACK ist das Fehlen/Ausbleiben eines ACK.
Der Slave, der adressiert wurde, zieht nicht aktiv SDA auf gnd.
Ursache könnte sein: die Adresse ist ungültig.
Oder die ganze Kommunikation funktioniert grundsätzlich noch nicht.

Im Zweifelsfalle würde ich so vorgehen:
Ein 0x70 an den BMA020 senden, wenn kein ACK zurückkommt, dann nach den 
Ursachen suchen.
Vielleicht frisst Bascom auch die 7-Bit TWI-Adresse (versuchs mal mit 56 
dezimal).

Oder was ich in solchen Fällen gerne mache:
Einen PCF8574 anschließen und mit ihm verfizieren, dass das TWI-Modul 
auf dem Master, die Verkabelung und Terminierung korrekt funktionieren.

mfg

Michael S.

von MWS (Gast)


Lesenswert?

Stell den µC-Clock auf 8MHz, trag's im Programm ein, 400kHz TWI aus 1MHz 
µC geht nicht. Das NACK zum Schluss ist ok, vorher muss ACK verwendet 
werden. Du kannst die erfolgreiche Ausführung jedes I2C-Befehls über die 
Variable ERR überprüfen. Stell sicher, daß die Anschlüsse am Modul 
passend beschaltet sind und die Bascom-Version aktuell ist.

von Silvio (Gast)


Lesenswert?

Hi, danke für die Antwort, also mit dem kompilieren hat jetzt dank der 
8MHz geklappt.

Wie meinst du das mit dem Ack? Was soll ich da schreiben?
Und wie funktioniert das mit err überprüfen?

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.