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?