- 3D-Druck Einstieg und Tipps         
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 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)

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    07.04.2015
    Beiträge
    899
    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);

  3. #3
    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)

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    07.04.2015
    Beiträge
    899
    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.

  5. #5
    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!


  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    07.04.2015
    Beiträge
    899
    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.

  7. #7
    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.

  8. #8
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.214
    Nachtrag:

    Was noch zu den AS7265x Sensoren zu sagen wäre ist, das Sie schnelle Abfragen auf dem I2C Bus nicht mögen.
    In der Arduino lib sind vermutlich dehalb auch sehr viele Zeitschleifen eingefügt.
    Manchmal hägen sich die Module dermassen auf, das auch ein Softwarereset nichts mehr hilft.

    In der endgültigen Version werd Ich wohl den Reset Pin ansteuern um da wieder raus zu kommen.

    Die Abfrage eines Moduls dauert im Besten Fall bei mir 1/2 Sekunde für die 18 möglichen Wellenlängen.

    Ob das mit der seriellen Schnittstelle besser geht hab Ich nicht getestet.

Ä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
  •  

Solar Speicher und Akkus Tests