Home › Forum › Le librerie ospitate nel sito › PCF8575 expander digitale I/O i2c a 16bits › PCF8575, buffer write
- Questo topic ha 0 risposte, 1 partecipante ed è stato aggiornato l'ultima volta 1 giorno, 12 ore fa da
riccardo.
-
AutorePost
-
-
29 Dicembre 2025 alle 17:57 #34164
Salve, Le avevo scritto precedentemente rigardo a dei problemi riscontrati utilizzando il PCF su delle matrici di tasti, perchè avevo riscontrato della diafonia.
E’ andata a finire che mi sono reso conto che gli ingressi GPIO variano da tecnologia a tecnologia, ed ho risolto usando direttamente un arduino della famiglia AVR che mi risparmiava un pò di problemi avendo l’impedenza di ingresso più bassa.
Detto questo Le scrivo perchè, se le può essere utile, ho modificato la sua libreria per risparmiare un pò di tempo, utilizzando il PCF come driver esclusivamente per dei sinottici, scrivendo direttamente prima sul buffer i vari bit, e poi inviandolo direttamente
con un solo comando .
E’ utile quando sull’ I2C ci sono anche altri dispositivi, così preparo il buffer del pcf e lo invio una volta sola.
Ho fatto molto con l’ Accetta , spezzando la funzione digital Write in 2 pezzi:
con qusta compilo il buffer pin per pinvoid PCF8575::digitalWriteNtx(uint8_t pin, uint8_t value){ if (value==HIGH){ writeByteBuffered = writeByteBuffered | bit(pin); byteBuffered = writeByteBuffered | bit(pin); }else{ writeByteBuffered = writeByteBuffered & ~bit(pin); byteBuffered = writeByteBuffered & ~bit(pin); } // writeByteBuffered = writeByteBuffered & (~writeMode & byteBuffered); byteBuffered = (writeByteBuffered & writeMode) | (resetInitial & readMode); };e con questa invio il buffer al PCF
bool PCF8575::BufferWr_Ntx(){ _wire->beginTransmission(_address); _wire->write((uint8_t) byteBuffered); _wire->write((uint8_t) (byteBuffered >> 8)); byteBuffered = (writeByteBuffered & writeMode) | (initialBuffer & readMode); // byteBuffered = (writeByteBuffered & writeMode) & (byteBuffered & readMode); DEBUG_PRINTLN("Start end trasmission if stop here check pullup resistor."); // detachInterrupt(); this->transmissionStatus = _wire->endTransmission(); // attachInterrupt(); return this->isLastTransmissionSuccess(); };L’ho fatto giusto con l’accetta, per arrivare al mio scopo.
Se la reputasse utile la protrebbe aggiungere una funzione così alla libreria.
Per me è utile, perchè mi permette di pilotare attuatori e Led in circa 300 micros
che è più che sufficiente, e lasciare libero il bus per i display ed altri apparati su i2c.
Saluti
Riccardo
-
-
AutorePost
- Devi essere connesso per rispondere a questo topic.


