INA219 programmazione in XC8

6 Anni 7 Mesi fa #6 da Carlo_C
Risposta da Carlo_C al topic INA219 programmazione in XC8
Scusatemi la calibrazione è cosi:

void INA219_Calibration(){
I2C1_start_bit ();
I2C1_write_byte (0x40);
I2C1_write_byte (0x05);
I2C1_write_byte((0x17C& 0xFF00) >> 8 );
I2C1_write_byte (0x17C& 0xFF00);
I2C1_stop_bit ();
}

Carlo

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • Carlo_C
  • New Member
  • New Member
Di più
6 Anni 7 Mesi fa #7 da Carlo_C
Risposta da Carlo_C al topic INA219 programmazione in XC8
Scusatemi il codice corretto è il seguente No funziona ancora :

La funzione che viene richiamata dalla main è LIV_VOLT();

void INA219_Reset(){

I2C1_start_bit ();
I2C1_write_byte (0x40);
I2C1_write_byte (0x00);
I2C1_write_byte ((0x399F& 0xFF00) >>8 );
I2C1_write_byte (0x399F& 0xFF00);
I2C1_stop_bit ();
}
void INA219_Calibration(){
I2C1_start_bit ();
I2C1_write_byte (0x40);
I2C1_write_byte (0x05);
I2C1_write_byte((0x17C& 0xFF00) >> 8 );
I2C1_write_byte(0x17C& 0xFF00);
I2C1_stop_bit ();
}
uint16_t INA219_Read(uint16_t temp){

unsigned int8_t DataM;
unsigned int8_t DataL;
unsigned int16_t ret_val;

I2C1_start_bit ();
I2C1_write_byte (0x40);
while( SSPCON2bits.ACKEN );
I2C1_write_byte(temp);
while( SSPCON2bits.ACKEN );
I2C1_stop_bit ();

I2C1_start_bit ();
I2C1_write_byte (0x41);
while( SSPCON2bits.ACKEN );

DataL=Read_I2C_Data();
DataM=Read_I2C_Data();


I2C1_stop_bit ();

ret_val = DataM << 8 | DataL ;

return (int16_t)(ret_val);
}

void LIV_VOLT(){
TBAT=0;
CBAT_RIL=0;

INA219_Reset(); //SETTAGGIO PARAMETRI DEFAULT
INA219_Calibration();//imposto la calibrazione

VBAT_ACQ = INA219_Read(0x02); //TENSIONE RILEVATA
CBAT_ACQ = INA219_Read(0x04);//RILEVO CORRENTE ASSORBITA

}


unsigned int Read_I2C_Data(void)
{
PIR1bits.SSPIF=0;
SSPCON2bits.RCEN=1;
while(!PIR1bits.SSPIF);
while ( SSPCON2bits.RCEN );
return (SSPBUF);
}

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • Carlo_C
  • New Member
  • New Member
Di più
6 Anni 7 Mesi fa #8 da Carlo_C
Risposta da Carlo_C al topic INA219 programmazione in XC8
Ciao a tutti,

Ho risolto :) ... il problema era nell'address e i comandi a 16Bit che non passavano corretti poi ho usato una funzione diversa per la lettura e scrittura I2C.
di seguito le funzioni corrette ... ovviamente sono configurate per l'esigenze del mio progetto la tensione a 4 cifre e la corrente in mA.

La sequenza è:

Prima bisogna Resettare l'INA219 (INA219_Reset).
Poi prima di leggere la Corrente (INA219_Read(0x04); ) bisogna fare la calibrazione. (INA219_Calibration).
Poi la lettura del dato es. per la tensione (INA219_Read(0x02); ).

Ovviamente è migliorabile e parametrizzabile ma io avevo l'esigenza di utilizzare il minimo di word di programma.
Grazie a tutti.
Carlo

void main(void)
{
    I2C_Init(_XTAL_FREQ,100000); // Avvio I2C a 100mhz slow
    __delay_ms(4);

    INA219_Reset();

    while (1)
    {

    VBAT_ACQ = INA219_Read(0x02); //TENSIONE RILEVATA
    INA219_Calibration();
    CBAT_RIL = INA219_Read(0x04); //CORRENTE RILEVATA

    VBAT_ACQ = VBAT_ACQ >>3; //SPOSTO A DESTRA DI 3 BIT D3-D0
    VBAT_RIL = VBAT_ACQ * 4; //RISULTATO A 4 CIFRE 5 Volt -- 5000

    }
    }


    void INA219_Reset(){
    INA219_Address();
    I2C_Data (0x00);
    I2C_Data (0x39);
    I2C_Data (0x9F);
    I2C_StopBit();
    }
    void INA219_Calibration(){
    INA219_Address();
    I2C_Data (0x05);
    I2C_Data (0x01); // valore impostato da me per il mio progetto Byte M
    I2C_Data (0x7C); // valore impostato da me per il mio progetto Byte L
    I2C_StopBit();
    }
    uint16_t INA219_Read(uint8_t temp){

    unsigned int8_t DataM;
    unsigned int8_t DataL;
    unsigned int16_t ret_val;

    INA219_Address();
    I2C_Data(temp);
    I2C_StopBit();
    I2C_StartBit();
    I2C_Data (0x81);
    DataM = I2C_Read(1);
    DataL = I2C_Read(1);
    I2C_StopBit();

    ret_val = DataM << 8 | DataL ;
    return (int16_t)(ret_val);
    }

    void INA219_Address(){
    I2C_StartBit();
    I2C_Data (0x80);
    }

    \\******************** Funzioni I2C *********************************************

    void I2C_Init(const unsigned long a,const unsigned long b)
    {
    SSPCON1 = 0b00101000;
    //SSPCON1 = 0x28;
    SSPCON2 = 0;
    SSPADD = (a/(4*b))-1;
    SSPSTAT = 0;
    TRISC3 = 1;
    TRISC4 = 1;
    }
    void I2C_Wait()
    {
    while ((SSPSTAT & 0x04) || (SSPCON2 & 0x1F));
    }
    void I2C_StartBit()
    {
    I2C_Wait();
    SEN = 1;
    while (SEN == 1);
    }
    void I2C_StopBit()
    {
    I2C_Wait();
    PEN = 1;
    while (PEN == 1);
    }

    void I2C_Data(unsigned d)
    /*void Send_I2C_Data(uint16_t data)*/
    {
    I2C_Wait();
    SSPBUF = d;
    while (BF == 1);
    }

    uint16_t I2C_Read(unsigned short int a)
    {
    uint16_t p;
    I2C_Wait();
    RCEN = 1;
    I2C_Wait();
    p = SSPBUF;
    I2C_Wait();
    ACKDT = (a) ? 0 : 1;
    ACKEN = 1;
    return p;

    }

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • Carlo_C
  • New Member
  • New Member
Di più
6 Anni 7 Mesi fa #9 da Mauro Laurenti
Risposta da Mauro Laurenti al topic INA219 programmazione in XC8
Molto bene,

grazie per aver condiviso il codice.

Saluti,

Mauro

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • Mauro Laurenti
  • Avatar di Mauro Laurenti
  • Moderator
  • Moderator
Di più
4 Anni 11 Mesi fa #10 da deiv92
Risposta da deiv92 al topic INA219 programmazione in XC8
Ciao, sto cercando anch'io di usare questo INA219, ma con scarsi risultati. Ho provato a copiare il tuo codice postato nell'ultimo post ma MPLABX mi da errore su questa funzione "uint16_t". Non riesco a capire cosa serva. Sono un novellino coi pic e chiedo scusa in anticipo se ho chiesto una banalità.

Davide

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • deiv92
  • Visitatori
  • Visitatori
Moderatori: Mauro LaurentiPinnaStefAMatteo Garia

Registrati al sito

Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.

Registrati al sito LaurTec.

Login