Domanda

Ho uno schermo LCD HD44780 e sto usando la libreria LiquidCrystal fornita con il pacchetto di sviluppo Arduino. Tuttavia, non è affidabile. Ho notato alcuni problemi con esso, e invece di essere guidato dall'interruzione, dorme solo finché lo sviluppatore pensa che il chip dovrebbe richiedere l'esecuzione dell'operazione.

Dai fogli delle specifiche, il flag BUSY verrà impostato mentre è in esecuzione, il che significa che è possibile essere guidati dall'interruzione.

Qualcuno sa di una libreria che lo fa effettivamente e richiede tutti gli 8 bit per essere collegato o posso tenerlo a 4 pin?

È stato utile?

Soluzione

Non credo che tu abbia bisogno di un interrupt per questo. Guardando LiquidCrystal.cpp nella distribuzione di Arduino, devi solo cambiare il codice LiquidCrystal :: write4bits , LiquidCrystal :: write8bits e LiquidCrystal :: pulseEnable . I primi due metodi dovrebbero iniziare monitorando la linea occupata (BD7) prima di scrivere i dati e l'ultimo sarebbe modificato per rimuovere la pausa 100us.

Penso che il motivo per cui ciò non sia stato fatto nel codice predefinito sia che molti utenti di questi LCD collegano semplicemente R / W a terra, quindi il display è sempre in modalità di scrittura, rendendo impossibile la lettura del segnale BUSY. Tuttavia, questo viene passato nella libreria impostando _rw_pin su -1, quindi il codice di impulso e scrittura può usare condizionalmente il pin r / w come modo di rilevare occupato come ottimizzazione della velocità.

Altri suggerimenti

È possibile utilizzare 8 bit su tre pin; hai solo bisogno di un registro a scorrimento. Sto usando un HEF4094BP di mouser.com (la spedizione costerà più del chip reale)

lo schema di cablaggio e le modifiche al codice per il registro a scorrimento sono qui: http: // www. arduino.cc/playground/Code/LCD3wires

Qualche tempo fa ho modificato la libreria LiquidCrystal per supportare il flag di occupato. Si noti che la vera operazione guidata da interrupt è non possibile - per ogni lettura è necessario attivare due volte la riga E . Pertanto sarà necessario eseguire il polling della bandiera occupata.

Poi ho scoperto alcuni benchmark, che il polling della bandiera di occupato è più lento rispetto al semplice attendere la maggior parte dei comandi. (L'eccezione sono i comandi 'clear' e 'home'). Il motivo era che il passaggio dalla modalità di lettura a quella di scrittura richiede passaggi aggiuntivi come 8 chiamate aggiuntive a digitaWrite e 8 chiamate aggiuntive a pinMode . Anche con gli Arduinos a 16 MHz questo è più lento della semplice attesa di 100 secondi.

Successivamente ho scritto una libreria che manipola i registri dei pin direttamente e in modalità bulk - tutti gli 8 pin con un accesso al registro. Dopo di che ero nel campo da baseball per ottenere qualche beneficio dal sondaggio.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top