BlackTuareg
21.06.2006, 10:32
Servus Leute!
Bin hier grad dabei einen SRF08 ueber I2C anzusteuern. Klappt soweit auch. Nur hab ich zwei Fragen:
Um alle Werte auslesen zu kønnen mach ich folgendes:
for (i=0; i<=34; i++)
{
SendStart();
SendSLAW();
SendByte(i);
unsigned int val=0;
SendStart();
SendSLAR();
unsigned char tmp1=TWDR;
SendSLAR();
unsigned char high=TWDR;
val=(TWDR<<8);
SendStop();
i++;
SendStart();
SendSLAW();
SendByte(i);
//SendByte(0x0);
SendStart();
SendSLAR();
unsigned char tmp2=TWDR;
SendSLAR();
val|=TWDR;
SendStop();
sprintf(num,"Distance %u: %u (%x %x) [tmp:%x %x]\n", i, val,high,TWDR,tmp1,tmp2);
USART_TransmitStr(num);
}
1) Das Komisch daran ist, dass ich zweimal den SLA+R schicken muss, TWDR nach dem ersten ist immer e1, nach dem 2. aber der gewuenschte Wert. Laut Datenblatt des EEPROMs muesste aber doch einmal reichen?
2) Ausserdem scheinen immer die Bits 0x06 im High-Byte der ersten Messung aktiviert (Version?). Das passiert aber nur wenn ich i bei 2 beginnen lasse (um nicht Version und Licht auszulesen). Beginnt die Schleife bei 0 funktioniert alles einwandfrei?
Das ganze verwirrt mich...
Viele Gruesse,
BlackTuareg
(Sebi war leider nicht mehr frei :-) )
Ausgabe:
(Distance [i] )
>>Starting measurement...
>>Reading measurement...
Distance 3: 1627 (>>6<< 5b) [tmp:e1 e1]
Distance 5: 183 (0 b7) [tmp:e1 e1]
Distance 7: 248 (0 f8 ) [tmp:e1 e1]
Distance 9: 313 (1 39) [tmp:e1 e1]
Distance 11: 378 (1 7a) [tmp:e1 e1]
Distance 13: 443 (1 bb) [tmp:e1 e1]
Distance 15: 508 (1 fc) [tmp:e1 e1]
Distance 17: 572 (2 3c) [tmp:e1 e1]
Distance 19: 637 (2 7d) [tmp:e1 e1]
Distance 21: 701 (2 bd) [tmp:e1 e1]
Distance 23: 778 (3 a) [tmp:e1 e1]
Distance 25: 874 (3 6a) [tmp:e1 e1]
Distance 27: 940 (3 ac) [tmp:e1 e1]
Distance 29: 0 (0 0) [tmp:e1 e1]
Distance 31: 0 (0 0) [tmp:e1 e1]
Distance 33: 0 (0 0) [tmp:e1 e1]
Distance 35: 0 (0 0) [tmp:e1 e1]
Bin hier grad dabei einen SRF08 ueber I2C anzusteuern. Klappt soweit auch. Nur hab ich zwei Fragen:
Um alle Werte auslesen zu kønnen mach ich folgendes:
for (i=0; i<=34; i++)
{
SendStart();
SendSLAW();
SendByte(i);
unsigned int val=0;
SendStart();
SendSLAR();
unsigned char tmp1=TWDR;
SendSLAR();
unsigned char high=TWDR;
val=(TWDR<<8);
SendStop();
i++;
SendStart();
SendSLAW();
SendByte(i);
//SendByte(0x0);
SendStart();
SendSLAR();
unsigned char tmp2=TWDR;
SendSLAR();
val|=TWDR;
SendStop();
sprintf(num,"Distance %u: %u (%x %x) [tmp:%x %x]\n", i, val,high,TWDR,tmp1,tmp2);
USART_TransmitStr(num);
}
1) Das Komisch daran ist, dass ich zweimal den SLA+R schicken muss, TWDR nach dem ersten ist immer e1, nach dem 2. aber der gewuenschte Wert. Laut Datenblatt des EEPROMs muesste aber doch einmal reichen?
2) Ausserdem scheinen immer die Bits 0x06 im High-Byte der ersten Messung aktiviert (Version?). Das passiert aber nur wenn ich i bei 2 beginnen lasse (um nicht Version und Licht auszulesen). Beginnt die Schleife bei 0 funktioniert alles einwandfrei?
Das ganze verwirrt mich...
Viele Gruesse,
BlackTuareg
(Sebi war leider nicht mehr frei :-) )
Ausgabe:
(Distance [i] )
>>Starting measurement...
>>Reading measurement...
Distance 3: 1627 (>>6<< 5b) [tmp:e1 e1]
Distance 5: 183 (0 b7) [tmp:e1 e1]
Distance 7: 248 (0 f8 ) [tmp:e1 e1]
Distance 9: 313 (1 39) [tmp:e1 e1]
Distance 11: 378 (1 7a) [tmp:e1 e1]
Distance 13: 443 (1 bb) [tmp:e1 e1]
Distance 15: 508 (1 fc) [tmp:e1 e1]
Distance 17: 572 (2 3c) [tmp:e1 e1]
Distance 19: 637 (2 7d) [tmp:e1 e1]
Distance 21: 701 (2 bd) [tmp:e1 e1]
Distance 23: 778 (3 a) [tmp:e1 e1]
Distance 25: 874 (3 6a) [tmp:e1 e1]
Distance 27: 940 (3 ac) [tmp:e1 e1]
Distance 29: 0 (0 0) [tmp:e1 e1]
Distance 31: 0 (0 0) [tmp:e1 e1]
Distance 33: 0 (0 0) [tmp:e1 e1]
Distance 35: 0 (0 0) [tmp:e1 e1]