Hallo,
falls es noch für jemanden von Interesse ist: ich habe die I2C-Kommunikation mit dem Sensormodul mal in Bascom implementiert. Hier ist ein Beispielcode:
Code:
' kleines beispielprogramm zum auslesen des bma020
' malte ahlers 2010
' weitere infos auf malteahlers.de
'
'
' compiler steuerung
$regfile = "m8def.dat"
$crystal = 1000000
$framesize = 64
$swstack = 64
$hwstack = 64
$baud = 9600
$lib "i2c_twi.lbx"
'
' hardware konfigurieren
' - taster
Config Pinb.6 = Input
Portb.6 = 1
Config Pinb.7 = Input
Portb.7 = 1
Config Pind.5 = Input
Portd.5 = 1
Taster1 Alias Pinb.6
Taster2 Alias Pinb.7
Taster3 Alias Pind.5
' - leds
Config Portd.7 = Output
Config Portd.6 = Output
Config Portb.0 = Output
Led_gl Alias Portd.7
Led_rt Alias Portd.6
Led_gr Alias Portb.0
' - I2C
Config Scl = Portc.5
Config Sda = Portc.4
'
' variablen dimensionieren
Dim V(6) As Byte
Dim Ax As Integer At V(1) Overlay
Dim Ay As Integer At V(3) Overlay
Dim Az As Integer At V(5) Overlay
Dim Acc_cntr As Byte
Dim I As Byte
Dim Acc_range As Byte
Dim D2g As Single
Dim S As Single
'
' konstanten
Const Acc_w = &H70
Const Acc_r = &H71
'
' subs
Declare Sub Set_acc_range(byval Range As Byte)
'
' hauptprogramm
Print "acc test!"
Wait 1
'
I2cinit
'
Call Set_acc_range(0)
' messbereich:
' Set_acc_range(0) -> +/- 2g (default)
' Set_acc_range(1) -> +/- 4g
' Set_acc_range(2) -> +/- 8g
'
Do
I2cstart
'
' sensor adressieren
I2cwbyte Acc_w
'
' acc datenregister adressieren
I2cwbyte &H02
'
I2cstop
'
I2cstart
'
' daten lesen
I2cwbyte Acc_r
'
For I = 1 To 5
I2crbyte V(i) , Ack
Next I
I2crbyte V(6) , Nack
'
I2cstop
'
' format konvertieren
Ax = Ax / 64
Ay = Ay / 64
Az = Az / 64
'
' in beschleunigungen umrechnen & ausgeben
S = Ax * D2g
Print "a(x)= " ; S ;
S = Ay * D2g
Print " a(y)= " ; S ;
S = Az * D2g
Print " a(z)= " ; S
'
Toggle Led_rt
Waitms 10
'
Loop
'
End
'
Sub Set_acc_range(byval Range As Byte)
I2cstart
'
' sensor adressieren
I2cwbyte Acc_w
'
' kontrollregister adressieren
I2cwbyte &H14
'
I2cstop
'
I2cstart
' kontrollregister lesen
I2cwbyte Acc_r
I2crbyte Acc_cntr , Nack
'
I2cstop
'
' kontrollregister manipulieren
Acc_cntr.3 = Range.0
Acc_cntr.4 = Range.1
'
I2cstart
'
' kontrollregister zurückschreiben
I2cwbyte Acc_w
I2cwbyte &H14
I2cwbyte Acc_cntr
'
I2cstop
'
' umrechnungsfaktor neu berechnen
D2g = 2 ^ Range
D2g = D2g * 2
D2g = D2g / 512
'
End Sub
Ich habe auf meiner Homepage noch ein paar zusätzliche Informationen zu dem Programm hinterlegt. Hier kann man nachlesen, wenn man mag: http://www.mtahlers.de/index.php?opt...d=32&Itemid=69
Gruß
Malte
Lesezeichen