Tja. Wenn ich dieses Detail nur kapieren würde.... Dann werd ich das Ganze mal wieder hervorholen.
Im Internet hatte ich folgende Anleitung gefunden:Mein Code lautet (und ich bin sicher, dass ich damit die Anleitung NICHT realisiert habe (sorry):Code:Busy Test geht so: 1. Start senden 2. Adresse + W senden 3. ACK lesen 4. if ACK gehe zu 7. 5. Stop senden 6. gehe zu 1. 7. Stop senden Endemit i2c_readAck/~Nak laut PFleuryCode:cli(); tmr1 = 0; sei(); // Timer 1 starten // i2c_start (Sadd + I2C_WRITE); // Starte Slave lesen i2c_write ( 0x00 ); // write address = dieses Byte soll gelesen werden i2c_stop(); // i2c_start (Sadd + I2C_READ); // Slave bereit zum Lesen? lobyte = i2c_readNak(); // Byte lesen... NAK i2c_stop(); // cli(); Timer1 = tmr1; sei(); uputs0 ("\r\t## Timer1 = "); uputs0u ( Timer1 ); uputs0 ("\r\tlobyte = "); uputs0u ( lobyte );mit dem Ergebnis:Code:/************************************************************************* Read one byte from the I2C device, request more data from device Return: byte read from I2C device *************************************************************************/ unsigned char i2c_readAck(void) { TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWEA); while(!(TWCR & (1<<TWINT))); return TWDR; }/* i2c_readAck */ /************************************************************************* Read one byte from the I2C device, read is followed by a stop condition Return: byte read from I2C device *************************************************************************/ unsigned char i2c_readNak(void) { TWCR = (1<<TWINT) | (1<<TWEN); while(!(TWCR & (1<<TWINT))); return TWDR; }/* i2c_readNak */
Das Ergebnis bedeutet, dass ich a) mehr als zwischen 100 µs und 150 µs fürs abarbeiten gebraucht habe und dass b) das gelesene Byte die ominöse 6 ist. Der Fall a) würde bedeuten, dass die zum Lesen vom SRF02 benötigten 75 ms (MILLI !) nicht erreicht wurden. In < 150 µs läuft der Schall ganz grob 5 cm, der Sensor hat aber rund 2 m bis zum Echo . . .Code:## Timer1 = 2 lobyte = 6
Daher bitte ich um weitere Hilfe, danke.
Nachtrag/Erklärung: Wieso steht daWeil sich der controller aufhängt, wenn ich ein i2c_readAck(); reinschreibe (ich hab ja geschrieben, dass ich das nicht kapiere :-/ )Code:lobyte = i2c_readNak(); // Byte lesen... NAK







Zitieren

Lesezeichen