- Messaggi: 6
- Ringraziamenti ricevuti 0
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
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
- Autore della discussione
- New Member
Riduci
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);
}
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
- Autore della discussione
- New Member
Riduci
Di più
- Messaggi: 6
- Ringraziamenti ricevuti 0
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)
{
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
- Autore della discussione
- New Member
Riduci
Di più
- Messaggi: 6
- Ringraziamenti ricevuti 0
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
grazie per aver condiviso il codice.
Saluti,
Mauro
Si prega Accedi o Crea un account a partecipare alla conversazione.
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
Davide
Si prega Accedi o Crea un account a partecipare alla conversazione.
- deiv92
- Visitatori
Moderatori: Mauro Laurenti, Pinna, StefA, Matteo Garia
Registrati al sito
Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.