- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 10 von 15

Thema: Ansteuerung eines SparkFun AS7265x Triad Sensors

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    07.04.2015
    Beiträge
    898
    Dieses enthielt aber leider den Wert 0x80, der aber nirgends dokumentiert ist.
    Der Wert 0x01, 0x02 oder 0x03 wurde erwartet.
    Meine bescheidene Ansicht nach einem Blick in den Pseudocode im DB des Sensors,...
    Code:
    while (1) 
    {
       // Read slave I²C status to see if the write buffer is ready.
       status = i2cm_read(I2C_AS72XX_SLAVE_STATUS_REG);
       if ((status & I2C_AS72XX_SLAVE_TX_VALID) == 0)
         // No inbound TX pending at slave. Okay to write now.
         break ;
    }
    ...dass das oberste Bit in Status offensichtlich nicht verwendet wird. Stattdessen werden die beiden Flags im Statusregister einzeln als Bits ausmaskiert. Eine 0 gibt dabei an, dass Du auf das Read-, bzw. Write-Register zugreifen darfst (weil der Sensor da nicht gerade busy ist).
    Vereinfacht:
    0x81, 0x82, oder 0x83 sind also böse, da musst Du auf irgendwas warten.
    0x80 ist gut, dann darfst Du weitermachen.


    P.S.: Code als Zitat sieht grauselig aus. Über die "Erweitert"-Schaltfläche unten kannst Du ein Code-Tag einfügen.

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.214
    0x81, 0x82, oder 0x83 sind also böse, da musst Du auf irgendwas warten.
    0x80 ist gut, dann darfst Du weitermachen.
    Das die beiden Bits ausmaskiert werden ist mir schon klar.
    Was seltsam ist: Auch nach mehreren Versuchen taucht da niemals ein Wert in den unteren 2 Bytes auf.
    Obwohl der Chip eigentlich was zu tun haben müsste.
    Ich hab auch schon versucht die "Firmware Version Bytes" abzurufen, aber da kommt immer nur der Wert 0x00 zurück.
    Dann hab Ich versucht die LED's zu aktivieren, aber auch das klappt nicht.
    Irgendwie bin Ich ratlos!

    P.S.
    Das mit dem Code TAG hab Ich auch noch mal geändert!
    Geändert von wkrug (18.09.2024 um 13:19 Uhr)

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    07.04.2015
    Beiträge
    898
    Aaaahahaha, dann kann man's auch lesen!

    Da gibst Du dem Sensor z.B. nicht an, wohin er die Adresse des virtuellen Registers schreiben soll
    Code:
    //Send Data to virtual Register
        TWI_Buffer[0]=(virtualReg | 0x80);
        //Send 1 Bytes
        FEHLER = twi0_send(AS7265_adr,TWI_Buffer,0x01);
    Besser wäre wahrscheinlich:
    Code:
    //Send virtual address to write register
        TWI_Buffer[0]=0x01;  // Address write register
        TWI_Buffer[1]=(virtualReg | 0x80); // data written to Write register
        FEHLER = twi0_send(AS7265_adr,TWI_Buffer,0x02);

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.214
    Mit dem fehlenden Schreib Befehl hattest Du eindeutig Recht.
    Das Auslesen der Sensorwerte klappt nun auch, alledings erscheinen mir diese nicht plausibel.
    Aber da werd Ich auch noch drauf kommen.

    Allerdings verstehe Ich nicht, warum Sparkfun die Ansteuerung so verkompliziert hat.
    Es können ja maximal nur 2 Werte geschrieben, bzw. 2 Werte gelesen werden.
    Hätte man das über eine Adresse und jeweils 2 Bytes gelöst, wäre die Ansteuerung wesentlich einfacher und die Schreib bzw. Lesebefehle könnten nicht aus dem Takt kommen.
    Geändert von wkrug (21.09.2024 um 07:23 Uhr)

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    07.04.2015
    Beiträge
    898
    Aber da werd Ich auch noch drauf kommen.
    Dieser Sensor scheint auch so ein Exemplar mit Code statt Doku zu sein. Das wird jetzt immer häufiger.
    Im Git (https://github.com/sparkfun/SparkFun...rary/tree/main) bekommst Du dafür recht einfache Beispiele.

    Das ist zwar alles Arduino, aber den eigentlichen Knoten (das TWI-Handling) hast Du ja jetzt mit dem Lesen/Schreiben der virtuellen Register zumindest grob gelöst.

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.214
    Die Lösung fand sich in der Datenblattsammlung von AMS ( OSRAM ).
    Dort sind auch die einzelnen Sequenzen zum Lesen und Schreiben beschrieben.
    Sparkfun hat da anscheinend abgekupfert, aber nicht wirklich gut.
    Was noch zu sagen wäre: Nach der Auswahl des Chips und der Sequenz zum Sampeln aller 6 Werte eines Chips ist eine Delay Zeit von ( Samplezyklen * 2,8 * 1,5ms ) einzufügen, sonst werden nur 0x00 oder falsche Werte ausgelesen.
    Bei mir funktioniert es nun so einigermassen!


  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    07.04.2015
    Beiträge
    898
    Hmmm?!?

    Das ist aber nicht die ominöse Delay-Konstante aus dem Quellcode?
    Code:
    #define AS7265X_POLLING_DELAY 5 //Amount of ms to wait between checking for virtual register changes
    Haben die so ziemlich in jede Registerzugriffsroutine mit einem Delay() reingeknallt.

  8. #8
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.214
    Das ist aber nicht die ominöse Delay-Konstante aus dem Quellcode?
    Nein, diese Polling Konstante wird in der while(1) schleife beim Auslesen des Status Registers benutzt um den Prozess zu verlangsamen.
    Ich hab da "_delay_ms(AS7265X_POLLING_DELAY);" draus gemacht.
    Beim Auslesen der Sensorwerte müssen die Anzahl der gewünschten Samples * 2,8 und dann noch mal 1,5 ( also *4,2 ) in ms genommen werden.
    Ich hab's der Einfachheit halber gleich mal 5 genommen.
    Die Sequenz zum Auslesen der 3 Sensoren sieht dann so aus:
    Code:
    void getchanneltop(void)
    {
        uint8_t pointer = 0;
        uint8_t buffer = 0;
        //Readout Data
        selectDevice(AS72651_NIR);
        setMeasurementMode(AS7265X_MEASUREMENT_MODE_6CHAN_ONE_SHOT); //One-shot reading of VBGYOR
        _delay_ms(AS7265X_INTERGRATION_TIME*5);
        for(uint8_t i=0x08;i<0x14;i+=2)  //Für i hab Ich dann gleich die richtigen Register Adressen benutzt.
        {
            //selectDevice(AS72651_NIR);
            buffer=i2m_AS72xx_topread(i);
            Top_read[pointer]=buffer;
            Top_read[pointer]=(Top_read[pointer]<<8);
            buffer=i2m_AS72xx_topread(i+1);
            Top_read[pointer]|=buffer;
            pointer++;
        }
        //Readout Data
        selectDevice(AS72652_VISIBLE);
        setMeasurementMode(AS7265X_MEASUREMENT_MODE_6CHAN_ONE_SHOT); //One-shot reading
        _delay_ms(AS7265X_INTERGRATION_TIME*5);
        for(uint8_t i=0x08;i<0x14;i+=2)
        {
            //selectDevice(AS72652_VISIBLE);
            buffer=i2m_AS72xx_topread(i);
            Top_read[pointer]=buffer;
            Top_read[pointer]=(Top_read[pointer]<<8);
            buffer=i2m_AS72xx_topread(i+1);
            Top_read[pointer]|=buffer;
            pointer++;
        }
        //Readout Data
        selectDevice(AS72653_UV);
        setMeasurementMode(AS7265X_MEASUREMENT_MODE_6CHAN_ONE_SHOT); //One-shot reading
        _delay_ms(AS7265X_INTERGRATION_TIME*5);
        for(uint8_t i=0x08;i<0x14;i+=2)
        {
            //selectDevice(AS72653_UV);
            buffer=i2m_AS72xx_topread(i);
            Top_read[pointer]=buffer;
            Top_read[pointer]=(Top_read[pointer]<<8);
            buffer=i2m_AS72xx_topread(i+1);
            Top_read[pointer]|=buffer;
            pointer++;
        }
    
    }
    Das Ganze war schon ein längerer Kampf.
    Was immer noch passiert ist, das der Sensor ab und zu kein ACK auf dem I2C bus sendet, aber da hab Ich dann Zeitschleifen rein gemacht, damit der Controller nicht blockiert wird.
    Watchdog wäre auch ein Alternative gewesen, allerdings würde der Controller die komplette Initialisierung durchlaufen und das wollte Ich vermeiden.

Ähnliche Themen

  1. Normalisierung von Daten eines Beschl.sensors
    Von Snaper im Forum Sensoren / Sensorik
    Antworten: 8
    Letzter Beitrag: 05.08.2011, 19:22
  2. Genauigkeit eines Sensors
    Von Student123 im Forum Sensoren / Sensorik
    Antworten: 8
    Letzter Beitrag: 04.08.2011, 15:03
  3. Wie berechne ich die Temperatur eines NTC Sensors ?
    Von Shadow992 im Forum Sensoren / Sensorik
    Antworten: 7
    Letzter Beitrag: 27.05.2010, 15:41
  4. Antworten: 13
    Letzter Beitrag: 18.02.2006, 17:19
  5. Anschluss eines Sensors an einen PCF8574
    Von batti112 im Forum Elektronik
    Antworten: 6
    Letzter Beitrag: 16.03.2005, 02:01

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen