Si può velocizzare la scrittura I2C sull'LCD?

Ciao a tutti

In un progetto sto usando la libreria PCF8574_HD44780_I2C per pilotare un LCD 1602 in I2C. Poiché nel loop (che dura circa 55us) controllo in PWM la luminosità di background di una scala di 17 LED (cioè anziché spegnersi completamente restano accesi all'1% per mostrare la scala) azzerando e ripristinando in blocco le porte, i posizionamenti del cursore e le scritture sull'LCD mi producono due volte al secondo l'azzeramento della luminosità di background per 20ms, tempo che diminuisce se tolgo qualche scrittura.
C'è un modo per velocizzare la scrittura I2C sull'LCD, almeno raddoppiandola?

Grazie
Gianluca

Trovato!
Wire.setClock(400000);
Funziona! :slight_smile:
Per tutte le scritture che devo fare:

  100.000: 22ms
  200.000: 15ms
  400.000: 12ms
  600.000: 11ms
  800.000:  9ms (ma il display non funziona)

Occhio che la velocità 1Mb/s NON è supportata da tutte le periferiche I2C e quindi potrebbe crearti dei problemi ...

Guglielmo

1 Like

Sì, vedo che con 1.000.000 il display non funziona più. Con 400.000, però, già il LED tremola molto meno. Possono funzionare anche valori intermedi come 200.000, 600.000 (finché l'I2C dell'LCD ce la fa) o sono accettati solo alcuni valori standard?
Purtroppo, non so perché, non riesco a far agganciare l'oscilloscopio su Timeout... >:(

Agganciato!
Va bene 400.000.

Grazie, Guglielmo :slight_smile:

Guarda, il valore che passi viene messo nella segunete funzione:

/* 
 * Function twi_setClock
 * Desc     sets twi bit rate
 * Input    Clock Frequency
 * Output   none
 */
void twi_setFrequency(uint32_t frequency)
{
  TWBR = ((F_CPU / frequency) - 16) / 2;
  
  /* twi bit rate formula from atmega128 manual pg 204
  SCL Frequency = CPU Clock Frequency / (16 + (2 * TWBR))
  note: TWBR should be 10 or higher for master mode
  It is 72 for a 16mhz Wiring board with 100kHz TWI */
}

... quindi fai presto a fare i conti e verificare :wink:

Guglielmo

Sì, ho provato e ho visto che varia con continuità, seppure non linearmente perché alcuni tempi devono essere fissi.
Grazie!

Funziona! :slight_smile:
Power Grid Monitor
La frequenza di rete è prelevata da un trasformatore a 12V, limitata con uno zener da 4,3V e squadrata con un inverter a trigger di Schmitt CD40106.