Hi,
ich habe ein ISR-08 ultraschall Modul, dass ich über TWI steuere.
das klappt alles soweit ganz gut.
Allerdings sendet mir der Sensor beim auslesen immer Daten bginnend mit
Adresse 0x00, obwohl ich vorher eine Startadresse angebe.
Wäre schön wenn mir jemand helfen könnte.
ist ein ATMEGA 1284 P
programmiert wird mit AVR-Studio 5, geschrieben mit einem AVR-Dragon
Hier mal der Code
Das Senden der Startbedingung erfolgt auserhalb der ISR. die letzten
cases stehen nur da, weil ich weitere Daten empfangen habe um an die
Daten zu kommen die mich interessieren.
das Auslesen sollte bei Adresse 0x02 starten, fängt aber immer bei 0x00
an.
Beim schreiben des Befehls zum Messen wird das ausgewählte Register
beschrieben. Wenn ich einen Wert != 0x00 angebe wird keine Messung
gestartet
Die ISR
(das man das mit einer Sprungtabelle schöner machen könnte ist mir klar,
geht erstmal darum dass es funktioniert)
1 | ISR (TWI_vect)
|
2 | {
|
3 | switch (TWI_Statuszahler)
|
4 | {
|
5 | //Bestätigung Startbedingung erwartet/schreiben der Adresse schreibend
|
6 | case 1:
|
7 | if (TWICheckTWSR(0x08))
|
8 | {
|
9 | TWIProblem();
|
10 | }
|
11 | else
|
12 | {
|
13 | TWISendByte(TWIAdresse_1);//Adresse schreibend
|
14 | }
|
15 | break;
|
16 |
|
17 | //prüfen ob Adresse/W übertragen und ACK empfangen/senden des Registers
|
18 | case 2:
|
19 | if (TWICheckTWSR(0x18))
|
20 | {
|
21 | TWIProblem();
|
22 | }
|
23 | else
|
24 | {
|
25 | TWISendByte(0x00);
|
26 | }
|
27 | break;
|
28 |
|
29 | //Prüfen ob Daten übertragen und ACK empfangen/Sende des Startbefehls, Messung in cm
|
30 | case 3:
|
31 | if (TWICheckTWSR(0x28))
|
32 | {
|
33 | TWIProblem();
|
34 | }
|
35 | else
|
36 | {
|
37 | TWISendByte(0x51);
|
38 | }
|
39 | break;
|
40 |
|
41 | //Senden des Stoppbefehls
|
42 | case 4:
|
43 | TWISendStopp();
|
44 | US_Messunggestartet = 1;
|
45 | break;
|
46 |
|
47 | //Prüfen ob start gesendet /übertragen der Adresse/W um das High-Register aus zu wählen
|
48 | case 5:
|
49 | if (TWICheckTWSR(0x08))
|
50 | {
|
51 | TWIProblem();
|
52 | }
|
53 | else
|
54 | {
|
55 | TWISendByte(TWIAdresse_1);//Adresse schreibend
|
56 | }
|
57 | break;
|
58 |
|
59 | //Prüfen ob Adresse/W gesendet und ACK empfangen / auswählen des Registers
|
60 | case 6:
|
61 | if (TWICheckTWSR(0x18))
|
62 | {
|
63 | TWIProblem();
|
64 | }
|
65 | else
|
66 | {
|
67 | TWISendByte(0x02);
|
68 | }
|
69 | break;
|
70 |
|
71 | //Prüfen ob Daten gesendet ACK empfangen / Neustart senden
|
72 | case 7:
|
73 | if (TWICheckTWSR(0x28))
|
74 | {
|
75 | TWIProblem();
|
76 | }
|
77 | else
|
78 | {
|
79 | TWISendStart();
|
80 | }
|
81 | break;
|
82 |
|
83 | //Prüfen ob Neustart übertragen / Adresse_R senden
|
84 | case 8:
|
85 | if (TWICheckTWSR(0x10))
|
86 | {
|
87 | TWIProblem();
|
88 | }
|
89 | else
|
90 | {
|
91 | TWISendByte((TWIAdresse_1 + 1));
|
92 | }
|
93 | break;
|
94 |
|
95 | //Prüfen ob Adresse_R übertragen / Empfang starten
|
96 | case 9:
|
97 | if (TWICheckTWSR(0x40))
|
98 | {
|
99 | TWIProblem();
|
100 | }
|
101 | else
|
102 | {
|
103 | US_Messung[1] = TWIReadByte();
|
104 | TWISendACK();
|
105 | }
|
106 | break;
|
107 |
|
108 | //Prüfen ob Daten Empfangen && ACK gesendet // Daten auslesen und ACK senden
|
109 |
|
110 | case 10:
|
111 | if (TWICheckTWSR(0x50))
|
112 | {
|
113 | TWIProblem();
|
114 | }
|
115 | else
|
116 | {
|
117 | //US_Messung[1] = TWIReadByte();
|
118 | TWISendACK();
|
119 |
|
120 | }
|
121 | break;
|
122 | case 11:
|
123 | if (TWICheckTWSR(0x50))
|
124 | {
|
125 | TWIProblem();
|
126 | }
|
127 | else
|
128 | {
|
129 | //US_Messung[1] = TWIReadByte();
|
130 | TWISendACK();
|
131 |
|
132 | }
|
133 | break;
|
134 |
|
135 | case 12:
|
136 | if (TWICheckTWSR(0x50))
|
137 | {
|
138 | TWIProblem();
|
139 | }
|
140 | else
|
141 | {
|
142 | //US_Messung[1] = TWIReadByte();
|
143 | TWISendNack();
|
144 |
|
145 | }
|
146 | break;
|
147 |
|
148 | break;
|
149 | case 13:
|
150 | TWISendStopp();
|
151 | TWI_Statuszahler = 0;
|
152 | FlagUsMessungLauft = 0;
|
153 | }
|
154 |
|
155 | }
|
die Funktionen
1 | void TWISendByte(uint8_t Byte)
|
2 | {
|
3 | TWDR = Byte;
|
4 | TWCR = (1<<TWINT) | (1<<TWEN)|(1 << TWIE);
|
5 | TWI_Statuszahler++;
|
6 | }
|
7 |
|
8 | void TWISendStopp(void)
|
9 | {
|
10 | TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO);
|
11 | }
|
12 |
|
13 | void TWIProblem(void)
|
14 | {
|
15 | TWISendStopp();
|
16 | TWI_Statuszahler = 0;
|
17 | FlagUsMessungLauft = 0;
|
18 | UsZeitZahler = 0;
|
19 |
|
20 | }
|
21 |
|
22 | void TWISendStart(void)
|
23 | {
|
24 | TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN)|(1 << TWIE);//Start auf TWI
|
25 | TWI_Statuszahler++;
|
26 | }
|
27 |
|
28 | uint8_t TWIReadByte(void)
|
29 | {
|
30 | return TWDR;
|
31 | }
|
32 |
|
33 | uint8_t TWICheckTWSR(uint8_t BitSoll)
|
34 | {
|
35 | if((TWSR & 0xF8) != BitSoll){return 1;}
|
36 | else {return 0;}
|
37 | }
|
38 |
|
39 | void TWISendACK (void)
|
40 | {
|
41 | TWCR = (1 << TWINT)|(1 << TWEA)|(1 << TWEN)|(1 << TWIE);
|
42 | TWI_Statuszahler++;
|
43 | }
|
44 |
|
45 | void TWISendNack (void)
|
46 | {
|
47 | TWCR = (1 << TWINT)|(1 << TWEN)|(1 << TWIE);
|
48 | TWI_Statuszahler++;
|
49 | }
|