Pages: [1] 2   Go Down
Author Topic: LCD 20x4 scrive a righe alterne  (Read 1656 times)
0 Members and 1 Guest are viewing this topic.
Lamezia Terme
Offline Offline
Shannon Member
****
Karma: 569
Posts: 12571
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ho collegato ad Arduino un LCD 20x4, usando la libreria standard LiquidCrystal.h, con la seguende riga di impostazione:
LiquidCrystal lcd(A5, A4, 5, 4, 3, 2);
A5 e A4 sono necessità. Subito dopo li ho impostati come
pinMode(A5, OUTPUT);
pinMode(A4, OUTPUT);
Poi invio una serie di frasi in sequenza ed il display me le mostra ordinate ma esse vengono scritte nell'ordine:
1
3
2
4
NON ci sono comandi di posizionamento del cursore; in pratica scrive la prima frase nella riga 1 (ok), scrive la 2a frase nella riga 3, scrive la 3a frase nella riga 2, scrive la frase finale nella riga 4.; alla fine la videata è sballata.
Avete idea di cosa possa essere successo?
i collegamenti dovrebbero essere corretti secondo il datasheet, le frasi si leggono bene, solo che sono "mischiate" di posizione.
« Last Edit: October 25, 2011, 11:29:34 am by menniti » Logged

Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

Milano, Italy
Offline Offline
Faraday Member
**
Karma: 11
Posts: 3091
Sideralis Arduino!
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Strano, questo era un problema che avevo avuto anche io nelle vecchie versioni della liquidcrystal.
C'e' anche una spiegazione tecnica, qui: http://web.alfredstate.edu/weimandn/lcd/lcd_addressing/lcd_addressing_index.html ma non possiedo la soluzione per le nuove versioni della libreria, che non dovrebbe avere questo difetto.
F
Logged

Federico - Sideralis
Arduino &C: http://www.sideralis.org
Foto: http://blackman.amicofigo.com

Lamezia Terme
Offline Offline
Shannon Member
****
Karma: 569
Posts: 12571
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Strano, questo era un problema che avevo avuto anche io nelle vecchie versioni della liquidcrystal.
C'e' anche una spiegazione tecnica, qui: http://web.alfredstate.edu/weimandn/lcd/lcd_addressing/lcd_addressing_index.html ma non possiedo la soluzione per le nuove versioni della libreria, che non dovrebbe avere questo difetto.
F
Grazie. Io sto usando quella in dotazione alla 0022 di Arduino, ce n'è una più aggiornata?
Forse mi conviene scaricarla dal Playground?
grazie ancora.
Logged

Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

Lamezia Terme
Offline Offline
Shannon Member
****
Karma: 569
Posts: 12571
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

In realtà sembra che non ci sia una libreria che ha risolto questo problema, quindi bisogna ricorrere a dei trucchetti; dopo aver avuto alcune ottime indicazioni da Leo, che mi hanno chiarito diveri dubbi, ho provato a ragionare in termini di "codice", anche perché ho l'aggravante che il display mostra delle stringhe che il micro riceve via seriale da un altro micro.
Quindi ho pensato di gestire il problema della sequenza 1-3-2-4 cambiando la posizione delle stringhe, risolto.
mi resta però da cancellare l'LCD ogni tanto, quindi ho inserito un carattere speciale all'inizio della frase della nuova schermata, che viene intercettato dal micro ricevente e mi dà un clear, risolto anche questo.
Ora voglio provare ad usare lo stesso sistema per gestire le coordinate di inizio frase, se uso un carattere speciale per ogni coppia 0,0 - 0,1 - 0,2 - 0,3 posso dire all'LCD DOVE mettere la frase, da provare, che ne dite? Qualcuno ha idee, suggerimenti, soluzioni?
Logged

Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

Lamezia Terme
Offline Offline
Shannon Member
****
Karma: 569
Posts: 12571
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

MI aiuto da solo, fintanto che qualche anima buona non decida di passare da queste parti.
Ho scaricato, via sito di gioblu, una libreria liquidcrystal440.h, dovrebbe servire per usare LCD 40x4, chissà che non abbiano risolto.

L'altra cosa, cercando su Internet, che ho letto in un paio di siti, è che il display 20x4 necessita del collegamento a 8 bit, ma nessuno spiega perché.

Almeno mi sono procurato due prove da fare, la manipolazione software funziona abbastanza bene ma è estremamente problematica.

Altre informazioni utili?
Logged

Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

Global Moderator
Italy
Online Online
Brattain Member
*****
Karma: 329
Posts: 22777
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Il link ad 8 bit io so che serve solo a dimezzare la velocità di trasmissione. Questa cosa che risolva il problema della scrittura a righe alterne non la sapevo.

Comunque resta un problema non problema, secondo me. Io so che la riga è lunga X caratteri, non mando una stringa più lunga di X caratteri  smiley-grin
Logged


Lamezia Terme
Offline Offline
Shannon Member
****
Karma: 569
Posts: 12571
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Il link ad 8 bit io so che serve solo a dimezzare la velocità di trasmissione. Questa cosa che risolva il problema della scrittura a righe alterne non la sapevo.
non c'è scritto che lo risolve, ma usano la frase "DEVE essere gestito a 8 bit", quindi ho dedotto, più che altro sperato, che potesse essere una possibilità.
Quote
Comunque resta un problema non problema, secondo me. Io so che la riga è lunga X caratteri, non mando una stringa più lunga di X caratteri  smiley-grin
Ma io ho (poi ho fatto modifiche estreme, ma restiamo sul problema iniziale) un menu con sei righe, e non c'è verso di farglielo vedere come sei stringhe, ho provato anche a spegnere la seriale dopo ogni riga, ma niente, ricomincia da dove ha lasciato, quindi se non risolvo con questi due ultimi accorgimenti mi devo rassegnare ai "caratteri speciali" e tante righe di programmazione smiley-eek-blue
Logged

Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

Global Moderator
Italy
Online Online
Brattain Member
*****
Karma: 329
Posts: 22777
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Te l'ho spiegato, un LCD non lavora come un editor di testo.
Devi usare il cursore: devi posizionare sempre il cursore nel punto in cui vuoi andare poi a far apparire il tuo testo, fosse anche la riga successiva.

lcd.Cursor(x,y);
lcd.Print(stringa);
lcd.Cursor(x,y);
lcd.Print(stringa);
ecc...

Considera che la posizione del cursore viene aggiornata in automatico per cui anche se scrivi un solo carattere, il cursore viene spostato. E' invisibile ma c'è: se lo rendi visibile, vedrai che va sempre a posizionarsi alla fine di quello che viene spedito in stampa. A meno che, ovviamente, che tu non lo sposti fisicamente da un'altra parte.
Logged


Lamezia Terme
Offline Offline
Shannon Member
****
Karma: 569
Posts: 12571
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Sì ma il fatto è che la stringa arriva dall'altro micro, mentre il cursore lo posso impostare solo in locale, ecco perché ho fatto ricorso ai caratteri "speciali", così in base al carattere gli dò la posizione; solo che con "§" non mi funzionava, poi sono dovuto rientrare a casa  smiley-sad, mentre con ^ sono riuscito a pilotare il "clear"
Logged

Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

Global Moderator
Italy
Online Online
Brattain Member
*****
Karma: 329
Posts: 22777
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

0x00
0x01
0x02
...
usa i primi valori di un byte come comandi.
Logged


Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 129
Posts: 9468
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

L'altra cosa, cercando su Internet, che ho letto in un paio di siti, è che il display 20x4 necessita del collegamento a 8 bit, ma nessuno spiega perché.

Assolutamente falso, il modo a 4 bit è previsto dal controller per far risparmiare pin di connessione, è perfettamente identico al modo a 8 bit con la differenza che li scrivi 4 per volta in due operazioni distinte.
La questione righe sfalsate dipende da come viene gestita la memoria caratteri, 80 byte, dal controller in funzione della geometria del display, questo vuol dire che la memoria non è lineare con la posizione del carattere sul display.
Normalmente la memoria caratteri è divisa in due banchi da 40 byte che rappresentano due righe, previste di default dal controller, da 40 caratteri e questo è l'unico caso in cui scrivendo di continuo i caratteri vanno nelle corrette posizioni sempre, con tutte le altre geometrie è necessario controllare da software la posizione del cursore e spostarlo sulla nuova riga, ovvero farlo puntare sulla corretta cella di memoria, quando necessario.
Logged

Lamezia Terme
Offline Offline
Shannon Member
****
Karma: 569
Posts: 12571
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

L'altra cosa, cercando su Internet, che ho letto in un paio di siti, è che il display 20x4 necessita del collegamento a 8 bit, ma nessuno spiega perché.

Assolutamente falso, il modo a 4 bit è previsto dal controller per far risparmiare pin di connessione, è perfettamente identico al modo a 8 bit con la differenza che li scrivi 4 per volta in due operazioni distinte.
La questione righe sfalsate dipende da come viene gestita la memoria caratteri, 80 byte, dal controller in funzione della geometria del display, questo vuol dire che la memoria non è lineare con la posizione del carattere sul display.
Normalmente la memoria caratteri è divisa in due banchi da 40 byte che rappresentano due righe, previste di default dal controller, da 40 caratteri e questo è l'unico caso in cui scrivendo di continuo i caratteri vanno nelle corrette posizioni sempre, con tutte le altre geometrie è necessario controllare da software la posizione del cursore e spostarlo sulla nuova riga, ovvero farlo puntare sulla corretta cella di memoria, quando necessario.

OK, comunque NON ho letto che risolveva il problema, più che altro era una speranza, in effetti con 4 bit funziona ed è anche velocissimo, quindi devo per forza usare il sistema di caratteri speciali per settare il puntatore; alla fine si tratta di una quindicina di comunicazioni, un po' di pazienza e risolvo.

0x00
0x01
0x02
...
usa i primi valori di un byte come comandi.
Questo metodo forse mi incasina la vita perché lui mi restituisce i valori dei fuse in questa forma, ecco perché avevo scartato i numeri. Comunque l'importante era verificare che dialogassero correttamente e questo c'è smiley-lol e la cosa ottima è che posso usare il connettore seriale, già previsto per eventuali convertitori USB-seriali esterni, anche per questa scheda aggiuntiva. Per il resto prima sviluppo il firmware definitivo per la versione seriale e poi ne creo una versione specifica per l'LCD. Riprendo se continuo ad avere difficoltà con i "caratteri speciali".
Grazie ragazzi!
Logged

Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

Global Moderator
Italy
Online Online
Brattain Member
*****
Karma: 329
Posts: 22777
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ma devi instaurare un protocollo di trasmissione, altrimenti non ne esci.
0x00 può essere benissimo un comando come un dato, è solo la posizione in cui lo leggi che gli fa assumere il giusto significato.
Logged


Lamezia Terme
Offline Offline
Shannon Member
****
Karma: 569
Posts: 12571
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ma devi instaurare un protocollo di trasmissione, altrimenti non ne esci.
0x00 può essere benissimo un comando come un dato, è solo la posizione in cui lo leggi che gli fa assumere il giusto significato.

Azz Leo, mi vuoi far passare la vecchiaia a fare questa cosa, ogni volta che uso un "if" devo aprire il reference per la sintassi e tu vuoi farmi costruire un protocollo? 4 caratteri significa che sul 328 i/o devo realizzarmi un buffer, controllare che prima ci sia una carattere "normale" altrimenti potrebbe essere un valore di fuse; il valore di fuse lo farei pecedere da uno spazio così farei la distinzione; praticamente se la serie di caratteri che mi arriva è:
00x0agemta questo è un carattere di controllo, se invece mi arriva 00x0 esuf_h è un valore di fuse. Potrei anche farcela, in realtà a me servono solo 5 caratteri:
clear, 1a, 2a, 3a, 4a riga, sempre in posizione 0; se mi riconoscesse cose come ^ & % $ £ mi semplificherei la vita, basta mandarli prima della stringa.
Credo di dover mettere dei ritardi dopo questi caratteri, anche con 4 bit la trasmissione è velocissima, forse era questo il problema ieri, non faceva a tempo ad eseguire il posizionamento che già gli arrivava la stringa. smiley-roll
Logged

Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

Global Moderator
Italy
Online Online
Brattain Member
*****
Karma: 329
Posts: 22777
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Non puoi metterti a leggere sulla seriale "a caso", se salti il byte di comando, non sai più a che cosa si riferiscono i byte successivi né quanti byte devi leggere ecc...

Prendiamo come dati per inizio e fine trasmissioni rispettivamente 0xAA e 0x55 (non sono scelti a caso, sono 10101010b e 01010101b). Immaginiamo che vuoi pulire l'LCD:
0xAA
0x00 -> comando di clear
0x55

Adesso vuoi scrivere a 2,5:
0xAA
0x01 -> comando di posizionamento del cursore
0x02 -> X
0x05 -> Y
0x55

Adesso vuoi scrivere CIAO
0xAA
0x02 -> comando di scrittura del testo: qui si mette in ascolto fino all'arrivo del carattere di fine trasmissione
0x43 -> C
0x49 -> I
0x41 -> A
0x4F -> O
0x55

Come vedi hai delle situazioni in cui ti servono solo 3 byte, altre (l'ultimo caso) in cui non sai a priori quanti caratteri arriveranno. Se "pensi" con campi di grandezza predefinita, tagli fuori dei byte.
Logged


Pages: [1] 2   Go Up
Jump to: