Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

leggere sensore AS7263

Progetti, interfacciamento, discussioni varie su questa piattaforma.

Moderatori: Foto UtenteMassimoB, Foto UtenteWALTERmwp, Foto Utentexyz

0
voti

[1] leggere sensore AS7263

Messaggioda Foto Utentestefa24 » 18 ott 2018, 13:45

Ciao
Cerco un aiuto per leggere questo sensore AS7263.
Qui sotto il codice per leggere i valori dei registri.
Il mio problema è che molti valori sono pari a 0.
Leggendo il datasheet vedo che dovrei leggere dei registri virtuali ma non capisco cosa intende.
Codice: Seleziona tutto
/*
  I2C comunication
  to read from registers
  i2c_read_regAS7263

  CS pin 3v3
  SDA pin SDA +10k to 3v3
  SDO pin GND
  SCL pin SCL +10k to 3v3
  3v3 VCC
  GND GND
*//*
#define AS72XX_Device_Type       (0x00)    // HW_Version Device Type
#define AS72XX_HW_Version        (0x01)    // HW_Version HW_Version
#define AS72XX_FW_Version_m      (0x02)    // FW_Version minor
#define AS72XX_FW_Version_M      (0x03)    // FW_Version major
#define AS72XX_Control_Setup     (0x04)    // Control_Setup
#define AS72XX_INT_T             (0x05)    // INT_T
#define AS72XX_Device_Temp       (0x06)    // Device_Temp
#define AS72XX_LED_Control       (0x07)    // LED Control

#define AS72XX_R_High            (0x08)    // R_High
#define AS72XX_R_Low             (0x09)    // R_Low

#define AS72XX_S_High            (0x0A)    // S_High
#define AS72XX_S_Low             (0x0B)    // S_Low

#define AS72XX_T_High            (0x0C)    // T_High
#define AS72XX_T_Low             (0x0D)    // T_Low

#define AS72XX_U_High            (0x0E)    // U_High
#define AS72XX_U_Low             (0x0F)    // U_Low

#define AS72XX_V_High            (0x10)    // V_High
#define AS72XX_V_Low             (0x11)    // V_Low

#define AS72XX_W_High            (0x12)    // W_High
#define AS72XX_W_Low             (0x13)    // W_Low

#define AS72XX_R_Cal_1           (0x14)    // R_Cal
#define AS72XX_R_Cal_2           (0x15)    // R_Cal
#define AS72XX_R_Cal_3           (0x16)    // R_Cal
#define AS72XX_R_Cal_4           (0x17)    // R_Cal

#define AS72XX_S_Cal_1           (0x18)    // S_Cal
#define AS72XX_S_Cal_2           (0x19)    // S_Cal
#define AS72XX_S_Cal_3           (0x1A)    // S_Cal
#define AS72XX_S_Cal_4           (0x1B)   // S_Cal

#define AS72XX_T_Cal_1           (0x1C)    // T_Cal
#define AS72XX_T_Cal_2           (0x1D)    // T_Cal
#define AS72XX_T_Cal_3           (0x1E)    // T_Cal
#define AS72XX_T_Cal_4           (0x1F)    // T_Cal

#define AS72XX_U_Cal_1           (0x20)    // U_Cal
#define AS72XX_U_Cal_2           (0x21)    // U_Cal
#define AS72XX_U_Cal_3           (0x22)    // U_Cal
#define AS72XX_U_Cal_4           (0x23)    // U_Cal

#define AS72XX_V_Cal_1           (0x24)    // V_Cal
#define AS72XX_V_Cal_2           (0x25)    // V_Cal
#define AS72XX_V_Cal_3           (0x26)    // V_Cal
#define AS72XX_V_Cal_4           (0x27)    // V_Cal

#define AS72XX_W_Cal_1           (0x28)    // W_Cal
#define AS72XX_W_Cal_2           (0x29)    // W_Cal
#define AS72XX_W_Cal_3           (0x2A)    // W_Cal
#define AS72XX_W_Cal_4           (0x2B)    // W_Cal
*/

#define AS72XX_SLAVE_TX_VALID     0x02
#define AS72XX_SLAVE_RX_VALID     0x01
#define AS72XX_SLAVE_STATUS_REG   0x00
#define AS72XX_SLAVE_WRITE_REG    0x01
#define AS72XX_SLAVE_READ_REG     0x02



//44 registrers
/*=========================================================================*/
#include <Wire.h>

//#define DEVICE (0x49)//ADXL345 device address
#define DEVICE (0x3F)//ADXL345 device address
//#define TO_READ (44)//num of bytes-1 we are going to read each time
#define TO_READ (5)//num of bytes-1 we are going to read each time
byte buff[TO_READ];    //n bytes buffer for saving data read from the device

char* reg[] =
{
/*  "AS72XX_Device_Type",
  "AS72XX_HW_Version",
  "AS72XX_FW_Version_m",
  "AS72XX_FW_Version_M",
  "AS72XX_Control_Setup",
  "AS72XX_INT_T",
  "AS72XX_Device_Temp",
  "AS72XX_LED Control",

  "AS72XX_R_High",
  "AS72XX_R_Low",

  "AS72XX_S_High",
  "AS72XX_S_Low",

  "AS72XX_T_High",
  "AS72XX_T_Low",

  "AS72XX_U_High",
  "AS72XX_U_Low",

  "AS72XX_V_High",
  "AS72XX_V_Low",

  "AS72XX_W_High",
  "AS72XX_W_Low",

  "AS72XX_R_Cal_1",
  "AS72XX_R_Cal_2",
  "AS72XX_R_Cal_3",
  "AS72XX_R_Cal_4",

  "AS72XX_S_Cal_1",
  "AS72XX_S_Cal_2",
  "AS72XX_S_Cal_3",
  "AS72XX_S_Cal_4",

  "AS72XX_T_Cal_1",
  "AS72XX_T_Cal_2",
  "AS72XX_T_Cal_3",
  "AS72XX_T_Cal_4",

  "AS72XX_U_Cal_1",
  "AS72XX_U_Cal_2",
  "AS72XX_U_Cal_3",
  "AS72XX_U_Cal_4",

  "AS72XX_V_Cal_1",
  "AS72XX_V_Cal_2",
  "AS72XX_V_Cal_3",
  "AS72XX_V_Cal_4",

  "AS72XX_W_Cal_1",
  "AS72XX_W_Cal_2",
  "AS72XX_W_Cal_3",
  "AS72XX_W_Cal_4"*/

"AS72XX_SLAVE_TX_VALID",
"AS72XX_SLAVE_RX_VALID",
"AS72XX_SLAVE_STATUS_REG",
"AS72XX_SLAVE_WRITE_REG",
"AS72XX_SLAVE_READ_REG"
};

byte reg_[] =
{
/*  AS72XX_Device_Type,
  AS72XX_HW_Version,
  AS72XX_FW_Version_m,
  AS72XX_FW_Version_M,
  AS72XX_Control_Setup,
  AS72XX_INT_T,
  AS72XX_Device_Temp,
  AS72XX_LED_Control,

  AS72XX_R_High,
  AS72XX_R_Low,

  AS72XX_S_High,
  AS72XX_S_Low,

  AS72XX_T_High,
  AS72XX_T_Low,

  AS72XX_U_High,
  AS72XX_U_Low,

  AS72XX_V_High,
  AS72XX_V_Low,

  AS72XX_W_High,
  AS72XX_W_Low,

  AS72XX_R_Cal_1,
  AS72XX_R_Cal_2,
  AS72XX_R_Cal_3,
  AS72XX_R_Cal_4,

  AS72XX_S_Cal_1,
  AS72XX_S_Cal_2,
  AS72XX_S_Cal_3,
  AS72XX_S_Cal_4,

  AS72XX_T_Cal_1,
  AS72XX_T_Cal_2,
  AS72XX_T_Cal_3,
  AS72XX_T_Cal_4,

  AS72XX_U_Cal_1,
  AS72XX_U_Cal_2,
  AS72XX_U_Cal_3,
  AS72XX_U_Cal_4,

  AS72XX_V_Cal_1,
  AS72XX_V_Cal_2,
  AS72XX_V_Cal_3,
  AS72XX_V_Cal_4,

  AS72XX_W_Cal_1,
  AS72XX_W_Cal_2,
  AS72XX_W_Cal_3,
  AS72XX_W_Cal_4*/

AS72XX_SLAVE_TX_VALID,
AS72XX_SLAVE_RX_VALID,
AS72XX_SLAVE_STATUS_REG,
AS72XX_SLAVE_WRITE_REG,
AS72XX_SLAVE_READ_REG

 
};

void setup()
{
  Wire.begin();        // join i2c bus (address optional for master)
  Serial.begin(9600);  // start serial for output
  //Turning on the sensor

//  writeTo(DEVICE, reg_[7], 0x08); //enter in standby mode to configure
}

void loop()
{
  Serial.println("START/////////////////////////////////////////");
  for (int k = 0; k < TO_READ; k++)
  {
    readFrom(DEVICE, reg_, TO_READ, buff); //read the acceleration data from the ADXL345
    Serial.println(reg[k]);
    Serial.print(k);

    Serial.print('\t');

    Serial.print("0x");
    Serial.print(reg_[k], HEX);

    Serial.print('\t');

    Serial.print(buff[k], BIN);

    Serial.println();
    delay(100);//It appears that delay is needed in order not to clog the port
  }
  delay(100);//It appears that delay is needed in order not to clog the port
}//fine loop

///////////////////////////////////////////////////////////////////////////////////
void readFrom(int device, byte address, int num, byte buff[])
{
  Wire.beginTransmission(device); //start transmission to device
  Wire.write(address);        //sends address to read from
  Wire.endTransmission(); //end transmission

  Wire.beginTransmission(device); //start transmission to device (initiate again)
  Wire.requestFrom(device, num);    // request TO_READ bytes from device

  int i = 0;
  while (Wire.available())   //device may send less than requested (abnormal)
  {
    buff[i] = Wire.read(); // receive a byte
    i++;
  }
  Wire.endTransmission(); //end transmission
}

/////////////////////////////////////////////////////////////////////////////
void writeTo(int device, byte address, byte val)
{
  Wire.beginTransmission(device); //start transmission to device
  Wire.write(address);        // send register address
  Wire.write(val);        // send value to write
  Wire.endTransmission(); //end transmission
}


Allegati
AS7263_DS000476_1-00.pdf
(950.46 KiB) Scaricato 17 volte
Avatar utente
Foto Utentestefa24
8 1 4
New entry
New entry
 
Messaggi: 77
Iscritto il: 12 mag 2011, 9:43

0
voti

[2] Re: leggere sensore AS7263

Messaggioda Foto Utentebiget » 21 ott 2018, 14:08

Se usi lo sketch di un accelerometro misto ad altro mi sorprenderi di piu se funzionasse


Il tuo spettrometro ha una bella seriale che ti semplifica la vita se comunque preferisci i2csegui le linee guida https://learn.sparkfun.com/tutorials/as726x-nirvi
Avatar utente
Foto Utentebiget
1.130 3 7
CRU - Account cancellato su Richiesta utente
 
Messaggi: 464
Iscritto il: 16 dic 2016, 19:47

0
voti

[3] Re: leggere sensore AS7263

Messaggioda Foto Utentestefa24 » 22 ott 2018, 17:05

Grazie
avevo già visto quella pagina
ma non volevo passare attraverso le librerie, ho letto in giro e ho letto che ci possono essere errori.
Comunque trascurando questo, nel datasheet si parla di registri virtuali, e non capisco cosa siano.
Ho già lavorato con I2C e se non fosse per questi registri virtuali non penso avrei problemi.
Aggiungo chele istruzioni:
Codice: Seleziona tutto
sensor.takeMeasurements();
  sensor.printMeasurements();//Prints out all measurements (calibrated)

non produce risultati
mentre le istruzioni:
Codice: Seleziona tutto
  sensor.takeMeasurementsWithBulb();
  sensor.printMeasurements();

produce risultati e studiandomi le librerie non capisco il perché.
Mi studio la seriale
Comunque grazie
Avatar utente
Foto Utentestefa24
8 1 4
New entry
New entry
 
Messaggi: 77
Iscritto il: 12 mag 2011, 9:43

0
voti

[4] Re: leggere sensore AS7263

Messaggioda Foto Utenteluxinterior » 22 ott 2018, 17:26

ho letto velocemente il datasheet che hai allegato
rigistri virtuali significa che tu tutti i registri di configurazione del dispositivo li vedi solo tramite tre registri
che sono indirizziati come
0x00 sola lettura dello stato del dispositivo
0x01 registro per inviare dati (write)
0x02 registro per lettura dati (read)

non è semplicissima da usare la porta I2C devi continuament econtrollare lo stato dei registri per capire se puoi inviare o leggere un dato. Io seguirei il consiglio di biget e cercheri di utilizzare la porta seriale.

COmunque se vuoi inssitere su I2c ci sono due registre HW version e Fw version di cui conosci il contenuto (almeno parziale) prima di implementare altre cose io verificherei la comunicaizone leggendo quei due registri
Avatar utente
Foto Utenteluxinterior
2.249 2 4 8
Expert EY
Expert EY
 
Messaggi: 1259
Iscritto il: 6 gen 2016, 17:48

0
voti

[5] Re: leggere sensore AS7263

Messaggioda Foto Utentestefa24 » 22 ott 2018, 17:54

Grazie lo avevo intuito ma non capivo cosa fare con questa spiegazione la cosa è un po più chiara, si io vorrei insistere con I2C, che non mi sembra male.
Alimento il sensore con 3.3 Vdc quali sono i lielli di tensione per la seriale?

cosa vado a leggere se
Codice: Seleziona tutto
0x00 sola lettura dello stato del dispositivo

ma è anche con:
Codice: Seleziona tutto
0x00 e 0x01 sono gli indirizzi della versione hardware (da datasheet)
Avatar utente
Foto Utentestefa24
8 1 4
New entry
New entry
 
Messaggi: 77
Iscritto il: 12 mag 2011, 9:43

0
voti

[6] Re: leggere sensore AS7263

Messaggioda Foto Utenteluxinterior » 22 ott 2018, 19:21

tabella pagina 18 con 0x00 leggi lo stato dei bit TX_VALID e RX_VALID che devi sempre controllare prima di proseguire con prossimo byte
Da quello che capisco io devi inviare
1) I2C address = 1001 001x (x=0write x= 1 read)
2) I2C wirtual register address (settando a 1 MSB dell'indrizzo se accedi in scrittura al registro quindi |0x80 per la scrittura)
3) I2C virtual register data letto /scritto
Prima di fare il passo successivo devi sempre controllare TX_VALID e RX_VALID leggendo il registro 0x00 lo status register

Secondo me devi fare delle operazioni I2C di singolo byte
leggi stato
scrivi nel write l'indrizzo del registro virtuale
leggi stato
leggi o scrivi dal registro data corrispondente il byte data
leggi stato
e via avanti per ogni byte che devi modificare
un pelo allucinante secondo me
Avatar utente
Foto Utenteluxinterior
2.249 2 4 8
Expert EY
Expert EY
 
Messaggi: 1259
Iscritto il: 6 gen 2016, 17:48

0
voti

[7] Re: leggere sensore AS7263

Messaggioda Foto Utentebiget » 22 ott 2018, 19:52

La withBulb usa come illuminazione il led integrato nella board (ovvio che se tu usi una scheda diversa il risultato cambia) l altra suppone che usi una tua fonte di illuminazionein quella board l uso dell una o l altra fonte va comunicato settando il jumper relativo e anche il codice ne tiene conto

Se non ti fidi delle librerie (in tal senso dovresti riscriverti anche wire xd )le studi e ne derivi il tuo codice :)
sempre meglio della macedonia del punto 1
Avatar utente
Foto Utentebiget
1.130 3 7
CRU - Account cancellato su Richiesta utente
 
Messaggi: 464
Iscritto il: 16 dic 2016, 19:47

0
voti

[8] Re: leggere sensore AS7263

Messaggioda Foto Utentestefa24 » 23 ott 2018, 8:46

Grazie a tutti per il supporto mi metto al lavoro
Grazie ancora
Avatar utente
Foto Utentestefa24
8 1 4
New entry
New entry
 
Messaggi: 77
Iscritto il: 12 mag 2011, 9:43


Torna a Arduino

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite