Domande su display LCD1602, I2C e Inline

Salve a tutti,

ho avuto dei problemi per quanto riguarda la libreria del lcd1602 con supporto del PCF8574.

Premetto che uso STM32 Blue Pill usando l'arduino IDE
poiché il forum STM32duino non funziona.

Sta di fatto che i dubbi sono prevalentemente software e generali dalla scheda che uso.

Desideravo sapere se esistesse i codici nativi della libreria LCD I2C da mettere direttamente nel file Main del progetto poiché c'è un contrasto quando devo aggiungere il codice per usare la seconda porta I2C della mia scheda.

Succede che la libreria mi va ad usare la prima porta e non si setta con le impostazioni del file main.

Il codice per il cambio della porta I2C è:

TwoWire WIRE2(2, I2C_FAST_MODE);
#define WIRE2 Wire

tale codice se lo metto dentro la libreria
il tutto funziona sulla seconda porta ma solo il codice interno se uso le funzioni sul Main tali funzioni della libreria Wire non vanno.
Il problema è che non posso usare il codice sia nel Main sia nella libreria mi dà un errore di compilazione.

Quindi ho optato per rendere le funzioni del display direttamente nel Main ovvero straripare i codici dalla libreria per metterli nel Main cosicchè il codice che mi imposta la seconda porta I2C diventa univoco e non ci dovrebbero esserci problemi.

Sta di fatto che ho notato la funzione print nella libreria dell'LCD che utilizza l'istruzione "inline" e l'ho mantenuta uguale ma quando scrivo una stringa sul display non visualizzo niente ma solo se richiamo la stessa funzione con un carattere alla volta

Ho cercato in rete e ho trovato che è un problema noto dipendente dalla libreria o Dalla versione dell'IDE.

Sta di fatto che l'ho risolto con un ciclo "for" dove in base ad un BUFFER scrivo la mia stringa e lui mi esegue l'istruzione in base a quanto il Buffer è stato impostato.

Chiedevo se esiste già qualcuno che ha reso i codici della libreria LCD I2C nativi per metterli direttamente nel codice Main Giusto per vedere se sono più semplici o differenti..

Ed anche per l'istruzione "inline" non ho capito cosa serva e se melgio Mettere void o lasciare inline...

Grazie a tutti !!!

Veramente TUTTE le librerie per Arduino sono fornite in modo "sorgente" ... difatti NON sono le classiche "librerie" che chi lavora con i microcontrollori è abituato ad utilizzare (.o compilati per varie MCU), ma moduli sorgenti ch vengono compilati assieme al programma, quindi ... i sorgenti già li hai, basta che vai a vedere i .h e .cpp che sono nella cartella della libreria e modificare quelli.

Guglielmo

gpb01:
Veramente TUTTE le librerie per Arduino sono fornite in modo "sorgente" ... difatti NON sono le classiche "librerie" che chi lavora con i microcontrollori è abituato ad utilizzare (.o compilati per varie MCU), ma moduli sorgenti ch vengono compilati assieme al programma, quindi ... i sorgenti già li hai, basta che vai a vedere i .h e .cpp che sono nella cartella della libreria e modificare quelli.

Guglielmo

E come mai quando setto la mia seconda porta i2c nel progetto o principale non mi cambia anche quello che c'è dentro la libreria ?
E se faccio l'inverso la libreria con quel codice funziona e le funzioni che usano il Wire nel codice principale non vanno ? se dovrebbe essere tutto un codice dovrebbe funzionare tutto ma non è così

MizzardNet:
E come mai quando setto la mia seconda porta i2c nel progetto o principale non mi cambia anche quello che c'è dentro la libreria ?

E questo cosa c'entra con la tua domanda e ancora ... e che ne so io :smiley:

Tu hai chiesto dove poter mettere le mani, io t'ho detto dove stanno i sorgenti, ora ... studiali ed adattali alle tue esigenze.

Guglielmo

gpb01:
E questo cosa c'entra con la tua domanda e ancora ... e che ne so io :smiley:

Tu hai chiesto dove poter mettere le mani, io t'ho detto dove stanno i sorgenti, ora ... studiali ed adattali alle tue esigenze.

Guglielmo

Sì io ho già fatto quello che mi hai detto certo ma desideravo capire perché straripando il sorgente e mettendolo nel Main funziona e quando è implementato come libreria tali settaggi sul Main non influiscono sulla libreria.

Alla fine per adesso funziona ma non capisco se l'istruzione "inline" la posso lasciare o no.

Cercando in rete è una istruzione che viene eseguita in modo più veloce e dicono che è consigliabile utilizzarla per funzioni che vengono eseguite spesso ma non bisogna esagerare... non capisco dov'è sta il limite di tale istruzione e se crea blocchi di programma o altri contrasti rispetto al "void"

La direttiva inline (che nulla a che vedere con il valore di ritorno di una funzione che può essere void o uno dei tipi riconosciuti), dice al compilatore che, a SUA discrezione, per ragioni di ottimizzazione, invece di trattarla come una funzione che chiami, inserisce proprio le righe della funzione ogni volte che viene appunto richiamata.

Se non hai particolare problematiche di velocità ... non serve, se ci sono piccole funzioni che debbono essere molto veloci, può essere utile ... ::slight_smile:

Guglielmo

P.S.: Nota che è una cosa che NON fa parte dello standard 'C di Kernighan & Ritchie, né dello standard C89 per cui, in vari compilatori, viene implementata come un'estensione. Dal C99 in poi è invece parte del linguaggo.