Hallo,

ich verwende den Code von RN (https://www.roboternetz.de/wissen/in...08_mit_avr-gcc) um mit dem Sensor zu kommunizieren.

Nun habe ich ihn leicht geändert, um die Werte im ANN-Modus zu bekommen:
Code:
void SRF08_messung_starten(void)
{
   if(srf08_ready())
   {
      i2c_start(SRF08_adress+I2C_WRITE);
      i2c_write(0x01);//Gainregister
      i2c_write(SRF08_gainvalue);//Gain setzen
      i2c_write(SRF08_rangevalue);
   
      i2c_rep_start(SRF08_adress+I2C_WRITE);
      i2c_write(0x00);//Befehlsregister wählen      
      i2c_write(0x54);//Messung (ANN) starten, Ergebnis in cm
      
      i2c_stop();
   }
}
Wenn ich die Daten auslesen möchte, bekomme ich mit diesem Code zwar die richtigen Werte vom Register 0x02 und 0x03, jedoch die "ANN"-Werte ab (einschließlich) Register 0x04 sind immer 0xFF. Egal wie nah das Objekt ist:
Code:
void srf08_auslesen(void)
{
   if(srf08_ready())
   {
      i2c_start(SRF08_adress+I2C_WRITE);
      i2c_write(0x01);//Ergebnisregister Lichtsensor wählen
      i2c_rep_start(SRF08_adress+I2C_READ);
            
      SRF08_light= i2c_readAck();
      SRF08_messwert = ((i2c_readAck())<<8); //highbyte
      SRF08_messwert += (i2c_readNak());  //lowbyte
      SRF08_ANN_value[0] = i2c_readAck(); // reg 0x04     !!! hier steht leider immer 0xFF. Auch wenn der Abstand < 35cm ist
        SRF08_ANN_value[1] = i2c_readAck(); // reg 0x05
   SRF08_ANN_value[2] = i2c_readAck(); // reg 0x06
        SRF08_ANN_value[3] = i2c_readAck(); // reg 0x07
        SRF08_ANN_value[4] = i2c_readAck(); // reg 0x08
        SRF08_ANN_value[5] = i2c_readAck(); // reg 0x09
        SRF08_ANN_value[6] = i2c_readAck(); // reg 0x10
        SRF08_ANN_value[7] = i2c_readAck(); // reg 0x11
        SRF08_ANN_value[8] = i2c_readAck(); // reg 0x12
        SRF08_ANN_value[9] = i2c_readAck(); // reg 0x13
        SRF08_ANN_value[10] = i2c_readAck();// reg 0x14
        SRF08_ANN_value[11] = i2c_readAck();// reg 0x15
        SRF08_ANN_value[12] = i2c_readAck();// reg 0x16
        SRF08_ANN_value[13] = i2c_readAck();// reg 0x17
        SRF08_ANN_value[14] = i2c_readAck();// reg 0x18
        SRF08_ANN_value[15] = i2c_readAck();// reg 0x19
        SRF08_ANN_value[16] = i2c_readAck();// reg 0x20
        SRF08_ANN_value[17] = i2c_readAck();// reg 0x21
      i2c_stop();
   }
}
Wenn ich nachfolgenden Code verwende, bekomme ich zwar (beim ersten Durchlauf) die richtigen Werte, jedoch macht der Sensor keine weitere Messungen mehr bis der Mikrocontroller resetet wurde:
Code:
void srf08_auslesen(void)
{
    if(srf08_ready())
   {
      i2c_start(SRF08_adress+I2C_WRITE);
      i2c_write(0x01);//Ergebnisregister Lichtsensor wählen
      i2c_rep_start(SRF08_adress+I2C_READ);
            
      SRF08_light= i2c_readAck();
      // SRF08_messwert = ((i2c_readAck())<<8); //highbyte   // auskommentiert
      // SRF08_messwert += (i2c_readNak());  //lowbyte       // auskommentiert
      SRF08_ANN_value[0] = i2c_readAck(); // reg 0x02     !!! hier steht das highbyte
           SRF08_ANN_value[1] = i2c_readAck(); // reg 0x03     !!! hier steht das lowbyte
      SRF08_ANN_value[2] = i2c_readAck(); // reg 0x04     !!! hier steht richtiger weise 0, wenn Abstand < 35cm ist
              SRF08_ANN_value[3] = i2c_readAck(); // reg 0x05
              SRF08_ANN_value[4] = i2c_readAck(); // reg 0x06
              SRF08_ANN_value[5] = i2c_readAck(); // reg 0x07
              SRF08_ANN_value[6] = i2c_readAck(); // reg 0x08
              SRF08_ANN_value[7] = i2c_readAck(); // reg 0x09
              SRF08_ANN_value[8] = i2c_readAck(); // reg 0x10
              SRF08_ANN_value[9] = i2c_readAck(); // reg 0x11
              SRF08_ANN_value[10] = i2c_readAck();// reg 0x12
              SRF08_ANN_value[11] = i2c_readAck();// reg 0x13
              SRF08_ANN_value[12] = i2c_readAck();// reg 0x14
              SRF08_ANN_value[13] = i2c_readAck();// reg 0x15
              SRF08_ANN_value[14] = i2c_readAck();// reg 0x16
              SRF08_ANN_value[15] = i2c_readAck();// reg 0x17
              SRF08_ANN_value[16] = i2c_readAck();// reg 0x18
              SRF08_ANN_value[17] = i2c_readAck();// reg 0x19
      i2c_stop();
   }
}
Was ich nicht verstehe ist, dass die beiden Varianten eigentlich die absolut gleichen Ergebnisse liefern müssten. Keine von beide ist für eine durchgehende Messung verwendbar.
Ich bin nun schon sehr lange am rum rätsel und hoffe ihr könnt mir helfen.