Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Frase da inviare su un LCD

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[1] Frase da inviare su un LCD

Messaggioda Foto UtenteLesStrato » 21 set 2012, 18:02

Salve a tutti,
sono alle prese cn un mcu dell'atmel, il famoso atmega 8535, mi sto dilettando in diverse applicazioni di base tramite programmazione in assembly; ultimamente stavo cercando di inviare una frase su un lcd alla sua accensione, quindi dopo aver settato dei pin come d'uscita in modo da potervi collegare il display ho iniziato a scrivere il codice sulla frase. Il mio dubbio è questo: se ad esempio il display è un 16x4 e volessi scrivere alla prima riga la parola "hello" e alla seconda riga la parola "world", non so proprio come far capire al programma la funzione di andare a capo.

RCALL H
RCALL E
RCALL L
RCALL L
RCALL O
RCALL VAI_A_CAPO
RCALL W
RCALL O
RCALL R
RCALL L
RCALL D

Quindi definito un registro iniziale (ex: .def TEMP = r16) chiamate le varie etichette su tale registro andrei a caricare la stringhe che rappresenta la lettera deisiderata, il fatto è che non so che istruzione usare sull'etichetta VAI_A_CAPO.

Help me please!!! O_/
Avatar utente
Foto UtenteLesStrato
-13 3
 
Messaggi: 35
Iscritto il: 20 mar 2012, 23:48

2
voti

[2] Re: Frase da inviare su un LCD

Messaggioda Foto Utenterusty » 21 set 2012, 18:11

Prima di tutto devi inizializzare l'LCD, in secondo luogo devi avere sotto mano il suo datasheet, nel quale troverai tutte le informazioni che ti servono per comunicarci. Hai mai usato un LCD? Sai cosa sono le modalita' a 4 ed a 8 bit? Sai che stream di bit possono essere intrerpretati come comandi o come dati a seconda della selezione (RS in genere)?

Purtroppo enza il datasheet dell'LCD non si va da nessuna parte.
Avatar utente
Foto Utenterusty
4.075 2 9 11
Utente disattivato per decisione dell'amministrazione proprietaria del sito
 
Messaggi: 1578
Iscritto il: 25 gen 2009, 13:10

0
voti

[3] Re: Frase da inviare su un LCD

Messaggioda Foto UtenteLesStrato » 22 set 2012, 16:41

Beh grazie è ovvio che senza il datasheet non s va da nessuna parte, ma al di la dell'inizializzazione dell'lcd non mi è stato utile, qui nn s tratta di un problema di comprensione del datasheet o del funzionamento dell'lcd, in generale sto chiedendo come s fa ad andare a capo, dovrebbe essere la stessa cosa su qualunque display, chiedo troppo?
Avatar utente
Foto UtenteLesStrato
-13 3
 
Messaggi: 35
Iscritto il: 20 mar 2012, 23:48

2
voti

[4] Re: Frase da inviare su un LCD

Messaggioda Foto UtenteAjKDAP » 22 set 2012, 17:19

LesStrato ha scritto:qui non s tratta di un problema di comprensione del datasheet o del funzionamento dell'lcd,


Invece si, se si tratta del classico/comune LCD con driver HD44780 leggendo il datasheet avresti capito che ogni riga corrisponde ad una determinata parte di RAM dell'LCD. QUindi se vuoi scrivere nella seconda riga dovrai fornire all'LCD la locazione di memoria ram corretta prima di inviare il dato da scrivere.

Le poche righe di codice che hai scritto sono istruzioni ad alto livello, dove sono quelle a basso livello per comandare l'LCD? le hai scritte te? prese da qualche altro progetto?

Se ce le mostri magari riusciamo ad modificarle per scrivere qualcosa sulla seconda riga.

In ogni caso cerca il datasheet, leggilo e comprendilo :ok:

Ciao
'˙˙˙·٠•● Alberto ●•٠·˙˙˙'
________________________
http://www.ajk.altervista.org
Avatar utente
Foto UtenteAjKDAP
1.255 2 6 9
Expert EY
Expert EY
 
Messaggi: 796
Iscritto il: 17 mag 2006, 0:13
Località: nella coda dei pronti

2
voti

[5] Re: Frase da inviare su un LCD

Messaggioda Foto Utenterusty » 22 set 2012, 17:31

Prima di tutto, se possibile sarebbe utile vedere un prototipo delle "tue" RCALL, in secondo luogo se hai letto il datasheet saprai che la visualizzazione avviene in copia alla DDRAM, dunque cambiando indirizzo in DDRAM cambierai la posizione del cursore.
Prima di tutto devi inviare il comando di function set, per settare la dimensione dei caratteri, il numero di righe, ecc...
Gli indirizzi DDRAM sono settati in OR con il comando 0x80 (DDRAM address set).

(display hitachi 16x4)
Prima riga, prima colonna, 0x80 OR 0x00 (0x80), fino alla sedicesima colonna 0x80 OR 0x0F (0x8F).
Seconda riga, prima colonna, 0x80 OR 0x40 (0xC0), fino alla sedicesima colonna 0x80 OR 0x4F (0xCF).
Terza riga, prima colonna, 0x80 OR 0x10 (0x90), fino alla sedicesima colonna 0x80 OR 0x1F (0x9F).
Quarta riga, prima colonna, 0x80 OR 0x50 (0xD0), fino alla sedicesima colonna 0x80 OR 0x5F (0xDF).

Ora sai che per "andare a capo" devi settare la nuova posizione del cursore, ovvero un nuovo indirizzo in DDRAM, quale indirizzo a seconda della riga ora non è un mistero.
Avatar utente
Foto Utenterusty
4.075 2 9 11
Utente disattivato per decisione dell'amministrazione proprietaria del sito
 
Messaggi: 1578
Iscritto il: 25 gen 2009, 13:10

0
voti

[6] Re: Frase da inviare su un LCD

Messaggioda Foto UtenteLesStrato » 28 set 2012, 0:02

Grazie rusty, ora tutto è + chiaro, ho degli ultimi dubbi però, sul datasheet dell'hitachi controller mi dice che per poter scrivere sull'lcd devo opportunamente settare i pin Rs , R/W , Do,...,D7 ; l'operazione preliminare è la function_set su cui setto dimensione caratteri, numero righe, n°bit dato in input, poi segue il'operazione di dsp on/off ctrl su cui decido se accendere il dspl , il cursore o far lampeggiare questo'ultimo, l'ultima operazione è l'entry_mode_set in cui vado a decidere se incrementare o decrementare la posiz del cursore; finita l'operazione d setup segue la vera e propria scrittura dei caratteri e i miei dubbi sono questo: il mio mcu ha una porta ad 8 bit settata cm d'uscita collegata al bus D0,...,D7 e tramite cui invio le varie stringhe a 8 bit che m rappresentano i singoli caratteri della frase; Rs , R/W ed E sn collegati ai bit meno significativi di un'altra porta a 8 bit del mio mcu ank'essa settata cm d'uscita. Primo dubbio: durante setup e successiva scrittura dati il pin E deve ricevere uno 0 o un 1 logico? Sul datasheet nn ho capito cosa m dice, ma visto ke s tratta del pin d abilitazione avevo pensato ad un 1...Secondo dubbio: detti Pd2,Pd1,Pd0 i 3 bit meno significativi della porta D del mcu su cui sn collegati rispettivamente Rs , R/W ed E, visto ke tale porta è ad 8 bit ma io ne uso solo 3, x inviare la stringa 001, è corretto dire:
ldi r16 , 0bxxxxx001
out PortD , r16
Avatar utente
Foto UtenteLesStrato
-13 3
 
Messaggi: 35
Iscritto il: 20 mar 2012, 23:48

1
voti

[7] Re: Frase da inviare su un LCD

Messaggioda Foto Utenterusty » 28 set 2012, 0:43

LesStrato ha scritto: Primo dubbio: durante setup e successiva scrittura dati il pin E deve ricevere uno 0 o un 1 logico? Sul datasheet non ho capito cosa m dice, ma visto che s tratta del pin d abilitazione avevo pensato ad un 1...


Durante qualsiasi tipo di operazione, che sia un comando o che sia un dato, sia all'inizio che alla fine dell'inizializzazione, devi sempre presentare il dato o il comando alla portD (nel tuo caso) ed eseguire un fronte negativo di EN, infatti il controller Hitachi legge solo nei fronti negativi del segnale EN.
Dunque puoi tenerlo a 1 preventivamente e poi mandarlo a 0, oppure tenerlo a 0 e mandarlo a 1 e a 0, insomma devi creare un fronte negativo sul quale il controller legge e aquisisce il dato/comando.

Esempio, vuoi inviare il comando 0x80 (clear and return home.. mi pare), e la porta C contiene R/W, RS,EN:

.equ EN, 3 ;posizioni del bit in portC
.equ RS, 2
.equ RW,1

cbi PortC, RS
cbi PortC, RW

ldi r16, 0x80
;prepariamo il comando/dato sulla portaD
out portD, r16
;ora il dato è pronto, lo facciamo leggere con uno "strobe" alto/basso di EN

sbi PortC, EN
nop
cbi PortC, EN
; in questo istante l'hitachi legge effettivamente il comando e lo eseguira'

Le tempistiche sono critiche, nel senso che il controller ha bisogno del suo tempo per digerire l'informazione, tempo comunque inferiore a quello richiesto nell'inizializzazione che in ogni caso fai solo una volta all'accensione. Leggi il datasheet non ricordo bene quanto deve essere il tempo, nel caso ti aggiusti, nel senso conoscendo il clock del micro puoi contare per x nop, oppure inserire un delay predefinito con un "dec r16" annidato o settando un timer, questo devi gestirlo come ti viene meglio.

LesStrato ha scritto:Secondo dubbio: detti Pd2,Pd1,Pd0 i 3 bit meno significativi della porta D del mcu su cui sn collegati rispettivamente Rs , R/W ed E, visto che tale porta è ad 8 bit ma io ne uso solo 3, x inviare la stringa 001, è corretto dire:
ldi r16 , 0bxxxxx001
out PortD , r16


Si', non so che assemblatore usi ma non credo gli piacciano le x, molto piu' semplicemente invia un

ldi r16, 0x01

oppure

ldi r16, 1

come vuoi tu.
Avatar utente
Foto Utenterusty
4.075 2 9 11
Utente disattivato per decisione dell'amministrazione proprietaria del sito
 
Messaggi: 1578
Iscritto il: 25 gen 2009, 13:10

0
voti

[8] Re: Frase da inviare su un LCD

Messaggioda Foto UtenteLesStrato » 28 set 2012, 23:48

Grazie 1000 x le preziose informazioni :ok:
x quanto riguarda le tempistiche avevo pensato a qualcosa del genere: fai conto che L'enable è su Pd0 , R/W su Pd1 , Rs su Pd2 , mentre Pb0,...,Pb7 sono su D0,...,D7 dell'LCD , supponiamo di voler inviare il comando di Clear display:

.equ EN = 0
.equ RW = 1
.equ RS = 2
.def data = r16

cbi PortD , RS
cbi PortD , RW
ldi data , 0b00000001
out PortB , data
sbi PortD , EN
RCALL Wait
cbi PortD , EN
RCALL Wait

Wait:
(qua c vorrebbe un'istruzione di contatore di 40 microSecondi
come faccio?)
Avatar utente
Foto UtenteLesStrato
-13 3
 
Messaggi: 35
Iscritto il: 20 mar 2012, 23:48

1
voti

[9] Re: Frase da inviare su un LCD

Messaggioda Foto Utenterusty » 29 set 2012, 11:50

Dipende dalla tua frequenza di clock, e dal metodo che vuoi usare.
La via semplice è contare per cicli, se ad esempio hai un quarzo da 4 MHz, una istruzione da 1 ciclo occupa temporalmente 1/4 10^-6 ,ovvero 4 uS. Quindi 10 nop sono circa 40 uS.
Altro modo è decrementare un registro (DEC = 1 ciclo) e "branchare" finché non è a 0 (BRNE = 2 cicli se vera, 1 se falsa). Quindi supponendo di essere a 1 MHz di clock di sistema, 1 ciclo è pari a 1uS. Carichiamo (LDI altra instruction da 1 ciclo) un valore e decrementiamo finché non siamo a 0x00.

ldi r18, n
loop
dec r18
brne loop

Passeranno circa 3n cicli di clock, se vuoi 40 uS e un ciclo è di 1uS (dipende da quarzo), poniamo n=14 e stiamo sicuri di avere almeno 40uS di ritardo.
Comuque lo strobe EN alto/basso puoi anche farlo da 10-15 uS, tanto per essere sicuri che la linea sia stabile a livello alto prima di abbassarla (a 4 MHz bastano 4 nop e sei tranquillo).

L'inizializzazione, appena accendi il sistema, richiede una sequenza di comandi e tempistiche particolari, puoi seguire il diagramma sottostante per farti un'idea, ma lo strobe EN non ha a che fare con il fatto che l'hitachi ci mette un certo tempo a eseguire un comando, si aspetta semplicemente per stabilizzare il livello di EN sulla linea.

Immagine.jpg
Immagine.jpg (113.49 KiB) Osservato 4610 volte

Dal datasheet hd44780

Come vedi all'inizializzazione non è possibile controllare il BF, quindi si lavora "alla cieca" aspettando un tempo ragionevole perché le operazioni siano finite (wait for more than... ecc..), qui si' che devi aspettare tempi relativamente lunghi, magari aiutandoti con un loop annidato e una RCALL wait_dalay .
Successivamente all'inizializzazione, ogni comando dovrebbe essere seguito da una routine che fa il check del BF (Busy Flag) per vedere se l'hitachi ha effettivamente finito di fare le sue cose. Il BF è il il bit piu' significativo del bus, e si legge assieme all'indirizzo DDRAM che è da 7 bit, l'ottavo è il busy flag. Sia fara' un loop di lettura finché il BF non sara' libero.
Possiamo parlarne poi con piu' calma, la lettura dall'hitachi è leggermente piu' complessa della scrittura, ma sono bazzecole. Per ora fai delle prove con quello che gia' sai, poi vediamo di andare avanti. Se non provi non sbagli e se non sbagli non impari! ;)
Avatar utente
Foto Utenterusty
4.075 2 9 11
Utente disattivato per decisione dell'amministrazione proprietaria del sito
 
Messaggi: 1578
Iscritto il: 25 gen 2009, 13:10

1
voti

[10] Re: Frase da inviare su un LCD

Messaggioda Foto Utenterusty » 29 set 2012, 17:36

Dimenticavo, potresti postare il tuo sorgente completo, riferendoti alle routine che richiami nel primo post?
Inoltre, stai sperimentando con dell'hardware o hai tutto in simulazione su AVR Studio o altro IDE?
Avatar utente
Foto Utenterusty
4.075 2 9 11
Utente disattivato per decisione dell'amministrazione proprietaria del sito
 
Messaggi: 1578
Iscritto il: 25 gen 2009, 13:10

Prossimo

Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 4 ospiti