Newsgroup: it.hobby.elettronica.digitale
Titolo: AVR, LCD hd44780 ed errore di visualizzazione

Ciao.
Ieri ho lasciato acceso per qualche ora un prototipo a lavorare da solo 
(ATmega168 e LCD 16x2 HD44780 compatibile pilotato a 4 bit).
 
Quando sono tornato a casa ho agito sui controlli del prototipo per 
verificare che funzionasse tutto e, dopo qualche interazione, il display 
ha iniziato a "dare i simboli":
 
http://tinypic.com/r/9sxdfr/6
 
 
La logica funzionava, ma la visualizzazione era disturbata :) Dopo un 
po' ho spento, tolto il display, pigiato meglio l'AVR nello zoccolo, 
riacceso: non e' rimasto attivo per 8 ore, ma dopo un paio d'ore e con 
interazione umana non dava errori di visualizzazione.
 
Il mio codice fa uso di due interrupt, uno a suo uso e consumo per 
scatenare una azione ogni X di inattivita' (ma sono 30 eventi TIMER), 
l'altro esterno ed asincrono. Entrambe le ISR agiscono su un flag o 
variabile con INCR/DECR.
 
 
Provo a sottoporre alla vostra esperienza una domanda generica, per 
imparare. Un errore di visualizzazione come quello mostrato 
nell'immagine, puo' essere causato da un interrupt che capita nel mezzo 
dell'invio dei dati al display? Le mie chiamate all'LCD disabilitano e 
riabilitano gli interrupt, ma potrei averne dimenticata qualcuna.
O potrebbe essere un baco del display? (esistono?) :-)
 
Grazie,
PaoloC
 


Nessuno qui sa cosa faccia il tuo programma e in che modo un interrupt possa 
disturbare,a occhio direi che se il tuo interrupt non altera nessuna delle 
variabili inerenti ai sdati-comandi display anche se questi restano in 
sospeso non dovrebbe cambiare niente(non sono sicuro al 100%).
Sicuro che lo stato dei pin segnali-dati inerenti al display non venga 
alterato durante l'interrupt?
Dovresti fare in modo che il difetto salti fuori non dopo ore e quando vuole 
ma in modo collegato a un punto ben preciso del programma,circoscrivere il 
campo sempre di piů fino a che il difetto ti salta fuori sempre e solo per 
una certa particolare condizione,e poi ci ragioni sopra. 
 
 

 alterato durante l'interrupt?
 
In effetti, anche se non vengono toccate variabili/valori della porta di pilotaggio del display, può darsi che l'interrupt durante le operazioni di accesso al "bus" lento alteri le tempistiche e quindi crei malfunzionamenti. 
In realtà, questo mi è successo qualche anno fa cambiando fornitore (da Varitronix ad un cinese) di display equipaggiati con quel controller. Dovetti appunto fare sì che durante le 2-3 righe in cui si accedeva al bus del display gli irq fossero disabilitati.

 In effetti, anche se non vengono toccate variabili/valori della porta di pilotaggio del display,
puň darsi che l'interrupt durante le operazioni di accesso al "bus" 
lento alteri le tempistiche e quindi crei malfunzionamenti.
 
Oppure potrebbero, se causano problemi di concorrenza, sporcare memoria 
a caso e quindi inviare al display dati sbagliati.
 
Se gli irq usano le porte di i/o potrebbero generare race conditions 
anche lě.
 
Insomma, senza vedere il codice non si puň dire per certo, ma problemi 
casuali di questo tipo sono sempre causati da circostanze simili: 
problemi di concorrenza con irq; puntatori in giro; fine dello stack, etc...
 
-- 
  _|/ Francesco Sacchi - Develer S.r.l.
   |\
http://www.develer.com/
 - 
http://www.bertos.org/
 

 etc...
 
A parte il problema hardware di chip inserito male nello zoccolo, temo 
la mia inesperienza nell'identificare quegli errori tipo fine dello 
stack e puntatori. Il codice è semplice ma gli daro' un'occhiata su 
carta per essere sicuro.
 
Il display è un cinese compatibile che potrebbe essere piu' sensibile a 
pause sulla comunicazione. Sicuramente ha un tempo di risposta visivo 
sensibilmente piu' lento di altri. Riguardero' anche il datasheet con un 
occhio alle temporizzazioni.
 
I 6 pin di controllo dell'LCD non sono condivisi con altro, se non in 
modo passivo con il connettore per l'ISP. Ma non c'era nulla di collegato.
 
Grazie per le dritte,
PaoloC

> Insomma, senza vedere il codice non si può dire per certo
 
lo usi col busy flag o solo con dei ritardi? 
 
 

> lo usi col busy flag o solo con dei ritardi?
 
Non capivo. Ho letto il datasheet del hd44780, ho letto il manuale della 
libreria che uso e la risposta e': con i ritardi. :-)
 
Dovrei usare una libreria diversa e collegare un pin in piu' al micro 
per usare il busy flag.
 
Per ora il problema non si è più presentato, quindi propendo per un 
problemino hardware. Comunque una scorsa al codice non guasta.
 
Ciao.
Paolo
 

 ha scritto nel messaggio 
news:jogggb$car$1...@mophus.csi.it...

sto pensando se lasciando inalterate le corrette funzioni dei vari pin che 
vanno all'LCD ci possa essere un caso in cui un interrupt,lasciando in 
sospeso una sequenza per l'LCD e riprendendola,possa darti degli errori 
sulla visualizzazione.
Così a memoria direi di no,non mi pare che ci siano dei "Tmax" stringenti 
superati i quali avviene qualcosa di sbagliato 
 
 


 
Ciao,
Pier.
 
www.piergm.com