- Messaggi: 6
- Ringraziamenti ricevuti 0
INA219 programmazione in XC8
6 Anni 7 Mesi fa #1
da Carlo_C
INA219 programmazione in XC8 è stato creato da Carlo_C
Ciao a tutti,
Mi sto picchiando nella configurazione e lettura dei dati di questo rilevatore di corrente della texas, volevo sapere se qualcuno ha mai avuto esperienza con questo componente.
Ho cercato di usare la libreria di LaurTec 4.0.5 modulo I2C, ma avevo provato anche altre soluzioni il microchip che uso è:
PIC16F1938 con display OLED SSD1306 sempre in I2C questo funziona ma quando devo inizializzare l'INA219 non riesco a configurarlo, penso sia perché l'indirizzo per fare il reset è 0x399F.
questa è la funzione che richiamo :
void INA219_Reset(){
I2C1_start_bit ();
I2C1_write_byte (0x40);
I2C1_write_byte (0x00);
I2C1_write_byte(0x399F);
I2C1_stop_bit ();
}
grazie mille
Carlo
Mi sto picchiando nella configurazione e lettura dei dati di questo rilevatore di corrente della texas, volevo sapere se qualcuno ha mai avuto esperienza con questo componente.
Ho cercato di usare la libreria di LaurTec 4.0.5 modulo I2C, ma avevo provato anche altre soluzioni il microchip che uso è:
PIC16F1938 con display OLED SSD1306 sempre in I2C questo funziona ma quando devo inizializzare l'INA219 non riesco a configurarlo, penso sia perché l'indirizzo per fare il reset è 0x399F.
questa è la funzione che richiamo :
void INA219_Reset(){
I2C1_start_bit ();
I2C1_write_byte (0x40);
I2C1_write_byte (0x00);
I2C1_write_byte(0x399F);
I2C1_stop_bit ();
}
grazie mille
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 #2
da Mauro Laurenti
Risposta da Mauro Laurenti al topic INA219 programmazione in XC8
Salve Carlo,
non ho letto il datasheet dell'INA219 per cui non conosco i relativi comandi/protocollo, ma in ogni modo l'istruzione I2C1_write_byte(0x399F); non è corretta. La funzione invia solo un byte e non puoi scrivere 0x399F. A seconda del protocollo devi scrivere due byte separati/assieme ma uno dopo l'altro.
Per esempio puoi vedere anche la funzione EEPROM I2C con indirizzo a due byte, al fine di vedere come si inviano due byte consecutivi.
Sto rileggendo un progetto di un utente che ha fatto un Amperometro digitale facendo uso proprio dell'INA219. Spero presto di pubblicarlo.
...comunque te la caverai prima.
Saluti,
Mauro
non ho letto il datasheet dell'INA219 per cui non conosco i relativi comandi/protocollo, ma in ogni modo l'istruzione I2C1_write_byte(0x399F); non è corretta. La funzione invia solo un byte e non puoi scrivere 0x399F. A seconda del protocollo devi scrivere due byte separati/assieme ma uno dopo l'altro.
Per esempio puoi vedere anche la funzione EEPROM I2C con indirizzo a due byte, al fine di vedere come si inviano due byte consecutivi.
Sto rileggendo un progetto di un utente che ha fatto un Amperometro digitale facendo uso proprio dell'INA219. Spero presto di pubblicarlo.
...comunque te la caverai prima.
Saluti,
Mauro
Ringraziano per il messaggio: Carlo_C
Si prega Accedi o Crea un account a partecipare alla conversazione.
6 Anni 7 Mesi fa #3
da Carlo_C
Risposta da Carlo_C al topic INA219 programmazione in XC8
Grazie Mauro,
Intendevi così...
void INA219_Reset(){
I2C1_start_bit ();
I2C1_write_byte (0x40); //address INA219
I2C1_write_byte (0x00); //config
I2C1_write_byte ((0x399F& 0xFF00)>>8 ); //reset
I2C1_write_byte (0x399F& 0xFF00);
I2C1_stop_bit ();
}
Mi riesci a dare una dritta anche per la lettura del dato, sostanzialmente inviando 0x02 ritorna la tensione e 0x04 la corrente può ritornare il dato da 9bit a 12bit, ma questi li ho già configurati
.
In allegato ho inserito la parte della configurazione del datasheet.
Mi servirebbe sapere la sequenza dei comandi per leggere il dato dal componente via I2C, perché ho già fatto delle prove ma non riesco a ottenere il valore.
mille grazie
Carlo
Intendevi così...
void INA219_Reset(){
I2C1_start_bit ();
I2C1_write_byte (0x40); //address INA219
I2C1_write_byte (0x00); //config
I2C1_write_byte ((0x399F& 0xFF00)>>8 ); //reset
I2C1_write_byte (0x399F& 0xFF00);
I2C1_stop_bit ();
}
Mi riesci a dare una dritta anche per la lettura del dato, sostanzialmente inviando 0x02 ritorna la tensione e 0x04 la corrente può ritornare il dato da 9bit a 12bit, ma questi li ho già configurati
.
In allegato ho inserito la parte della configurazione del datasheet.
Mi servirebbe sapere la sequenza dei comandi per leggere il dato dal componente via I2C, perché ho già fatto delle prove ma non riesco a ottenere il valore.
mille grazie
Carlo
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 #4
da elpablito
Risposta da elpablito al topic INA219 programmazione in XC8
sa vai qui trovi le librerie per arduino così vedi le varie sequenze
github.com/adafruit/Adafruit_INA219
Ciao Paolo
github.com/adafruit/Adafruit_INA219
Ciao Paolo
Si prega Accedi o Crea un account a partecipare alla conversazione.
- elpablito
- Platinum Member
Riduci
Di più
- Messaggi: 353
- Ringraziamenti ricevuti 8
6 Anni 7 Mesi fa #5
da Carlo_C
Risposta da Carlo_C al topic INA219 programmazione in XC8
Grazie Paolo,
le librerie Arduino le ho viste ma il mio problema non è sulla sequenza dell'INA219 ma l'invio dei comandi I2C nello specifico nella parte di lettura del dato dal componente.
Queste sono le funzioni che ho provato ad usare:
la sequenza è RESET-CALIBRAZIONE e poi REGISTRO LETTURA TENSIONE 0x02 o CORRENTE 0x04 ecc. ti allego le funzioni se mi dite se seno corrette come sequenza I2C. (come lettura non ho usato quella della libreria di Mauro perchè non sono sicura vada bene per questo utilizzo).
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 & 0xFF),0);
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 ();
Send_I2C_StartBit();
I2C1_write_byte (0x41);
while( SSPCON2bits.ACKEN );
DataL=Read_I2C_Data();
DataM=Read_I2C_Data();
Send_I2C_NAK();
Send_I2C_StopBit();
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);
}
Secondo te sono corrette ?
grazie
Carlo
le librerie Arduino le ho viste ma il mio problema non è sulla sequenza dell'INA219 ma l'invio dei comandi I2C nello specifico nella parte di lettura del dato dal componente.
Queste sono le funzioni che ho provato ad usare:
la sequenza è RESET-CALIBRAZIONE e poi REGISTRO LETTURA TENSIONE 0x02 o CORRENTE 0x04 ecc. ti allego le funzioni se mi dite se seno corrette come sequenza I2C. (come lettura non ho usato quella della libreria di Mauro perchè non sono sicura vada bene per questo utilizzo).
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 & 0xFF),0);
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 ();
Send_I2C_StartBit();
I2C1_write_byte (0x41);
while( SSPCON2bits.ACKEN );
DataL=Read_I2C_Data();
DataM=Read_I2C_Data();
Send_I2C_NAK();
Send_I2C_StopBit();
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);
}
Secondo te sono corrette ?
grazie
Carlo
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
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.