http://tomasella.altervista.org/it/elettronica/microcontrollori/LCD3310_16LF84A.html

Display LCD del nokia 3310 comandato da un PIC16LF84A

Questo progetto è la naturale prosecuzione, anche se a vari anni di distanza, del precedente e più semplice firmware per il controllo di display testuali. Infatti questo progetto si propone di impiegare un comune microcontrollore della Microchip, quale il PIC16LF84A, per controllare i display grafici montati sui modelli di cellulari 3310 e 3330 prodotti dalla Nokia. In particolare, in modo analogo al precedente progetto, sono state scritte delle routine in codice assembly adatte ad instaurare una corretta ed efficiente comunicazione con il display.

Considerazioni

La mia filosofia di progetto è innanzitutto quella di creare delle cose che in qualche modo possano risultare utili spendendo il meno possibile. Partendo da questa semplice considerazione è naturale che si cerchi di sfruttare quello che l'ambiente domestico può offrire e a casa mia ho notato che ci sono dei vecchi cellulari non più funzionanti. Quelli della Nokia sono certamente fra i cellulari più diffusi e quindi ho pensato di utilizzare il display più semplice che avevo. Per questo motivo la mia attenzione è caduta sul display del mio vecchio Nokia 3310 (lo stesso tipo di display è montato anche nei Nokia 3330). Sono sicuro che anche voi potreste riuscire facilmente a reperirne qualcuno a casa vostra o fra gli amici. Questo display, conosciuto con la sigla LPH7779, è monocromatico ed ha una risoluzione di 48 righe per 84 colonne. Internamente ha un chip prodotto dalla Philips siglato PCD8544 del quale metto a disposizione il datasheet.

foto del montaggio del circuito su breadboard

Per quanto riguarda il microcontrollore da utilizzare ne volevo uno che potesse essere il più semplice possibile per potermi concentrare solamente sul display, e quindi non c'è niente di meglio del classico PIC16F84. Questo però ammette una tensione di alimentazione compresa fra 4,5V e 5,5V, mentre il display ammette una tensione di alimentazione compresa fra 2,7V e 3,3V, perciò i due non sono compatibili. Per questo motivo ho scelto il PIC16LF84A che ha le stesse cartteristiche del PIC16F84, ma con range di tensione di alimentazione estesa al range 2÷5,5V.

Circuito

schema di collegamento del PIC16LF84A con il display grafico del nokia 3310

Lo schema elettrico è molto semplice. Microcontrollore e display sono entrambi alimentati a 3V, ad esempio con una batteria tipo CR2032 oppure 2 batterie AA o AAA in serie vanno benissimo perché il circuito complessivamente non consuma più di 1mA. Sconsiglio di alimentare il circuito con tensioni maggiori di 3,3V, non tanto perché il display potrebbe bruciarsi, quanto invece perché il display diventa più "lento" e per funzionare si dovrebbe rallentare di molto la comunicazione. Questo porterebbe a dover impiegare vari secondi per poter visualizzare un'intera immagine sullo schermo, cosa che non è tollerabile per la maggior parte delle applicazioni, oltre a non essere carino da vedere.

Il microcontrollore comunica con il display tramite cinque pin, ovvero i primi cinque del PORTB, ma è possibile modificare questa impostazione e selezionare un pin qualsiasi per ognuno dei cinque necessari. La comunicazione avviene in modo seriale, spedendo per primo il bit più significativo. Le routine, così come sono state scritte, rispettano le tempistiche di comunicazione fino ad una frequenza di clock di 16MHz, mentre se si intendesse utilizzare un quarzo a frequenza maggiore potrebbe esssere necessario inserire dei ritardi per aumentare la durata dei cicli di clock relativi alla comunicazione.

Il display, per la generazione delle tensioni necessarie al pilotaggio dei cristalli liquidi, necessita di aver collegato un condensatore da almeno 1uF al proprio pin 7. Il suo pinout è illustrato nella figura seguente:

pinout del display grafico del nokia 3310

Firmware

Per ora ho potuto completare tre firmware differenti come esempio, ma ce n'è per lo meno un altro in cantiere che, data la complessità richiesta e le mie limitate conoscenze, non so se riuscirò a portare a termine.

Il display, come detto in precedenza, presenta una risoluzione di 84 colonne per 48 righe. Queste ultime sono suddivise in sei gruppi da otto righe ciascuno, in modo tale che i primi otto pixel della prima colonna corrispondono agli otto bit del byte contenuto nella locazione x=0, y=0 della memoria interna al display. I primi otto pixel della seconda colonna corrispondono al byte contenuto nella locazione x=1, y=0 e così via, mentre i pixel dal nono al quindicesimo della prima colonna corrispondono al byte contenuto nella locazione x=0, y=1. Il pixel più in alto corrisponde al bit meno significativo del byte, mentre quello più in basso corrisponde al bit più significativo.

Primo esempio
immagine del display con la versione 1.0 del firmware

Il primo esempio (eccovi il codice assembly e il codice macchina) contiene le routine per l'inizializzazione del display, per l'invio di dati e comandi e per la cancellazione del display, quindi scrive sul display la parola "ciao!". Analizzando più in dettaglio le singole routine possiamo vedere che quella principale è quella chiamata LCDsendByte, la quale provvede all'invio di un byte (che gli sarà passato come parametro nel registro di lavoro W) verso il display, avendo cura di rispettare la sequenza corretta e le tempistiche richieste. Tale routine è richiamata da altre due routine, che sono LCDsendCommand e LCDsendData, le quali semplicemente impostano il bit che determina se il byte inviato è da considerarsi come dato o come comando, quindi inviano il byte desiderato. La routine LCDinit si occupa dell'inizializzazione del display, impostando il contrasto desiderato, selezionando la modalità di visualizzazione adatta e infine rendendo attiva la locazione x=0, y=0. LCDreset naturalmente resetta le impostazioni del display, ma non la memoria che contiene lo stato (acceso o spento) dei pixel. Infine la routine LCDclear "pulisce" lo schermo, ovvero spegne (o, se si sta impiegando la modalità invertita, accende) tutti i pixel impostando a 0 tutti i bit relativi.

Riguardo al contrasto del display ho scelto un valore intermedio che potesse adattarsi alla maggior parte dei display. Per i miei due display va molto bene, ma nel caso aveste la necessità di modificarlo avete due modi per farlo. Il primo è modificare il codice assembly (file .asm), andando alla quarta riga della routine LCDinit e cambiando il valore 0xC0 con un valore compreso fra 0x80 e 0xFF, quindi ricompilando il codice con MPLAB. Il secondo è di modificare allo stesso modo il codice macchina (file .hex) con notepad o WinPic correggendo il valore C0 evidenziato nelle figure seguenti.

regolazione del contrasto con notepad   regolazione del contrasto con WinPic
Secondo esempio

Il secondo codice (eccovi il codice assembly e il codice macchina) di esempio visualizza sul display un'intera immagine. Dato che il microcontrollore che uso ha poca memoria EEPROM, sono costretto a dover usare la memoria programma per ospitare l'informazione relativa allo stato dei pixel, che possono essere accesi o spenti. Di fatto ho realizzato sei "look-up table" (una per riga logica), ognuna delle quali contiene gli 84 byte che descrivono lo stato delle relative sei righe del display.

immagine del display con la versione 1.1 del firmware

Naturalmente avrei anche potuto realizzare solamente 2 look-up table, una per le prime tre righe del display e l'altra per le ultime tre. Questo mi avrebbe permesso di risparmiare alcune istruzioni e quindi di guadagnare un po' di memoria programma. Ho preferito lasciare così il programma perché credo che in questo modo possa risultare più comprensibile.

Terzo esempio

Il terzo programma (eccovi il codice assembly e il codice macchina) visualizza sul display una semplice immagine animata (scarica il filmato in formato avi). In effetti si tratta semplicemente di un'evoluzione del codice precedente, al quale ho aggiunto delle righe che modificano una parte dell'immagine, dato che la scarsa disponibilità di memoria del PIC16LF84A non permette di memorizzare due immagini complete che si possano alternare. In sostanza per prima cosa viene visualizzata l'immagine base, che è la stessa del programma precedente. Successivamente il microcontrollore esegue un ciclo infinito in cui prima viene modificata solo la parte dell'immagine relativa alla mano per far si che si chiuda, poi viene nuovamente visualizzata l'immagine originale ripristinando però solo la parte della mano che era stata modificata, poiché la restante parte dell'immagine rimane invariata.

note sulla realizzazione di un semplice connettore per il display

Suppongo che anche voi, come è capitato a me, vi stiate chiedendo come realizzare facilmente un connettore che vi permetta di fare delle prove con il display, quindi cerco di raccontarvi cosa ho fatto io per costruirmelo. Prendete un ritaglio di basetta ramata monofaccia di larghezza 40 millimetri e altezza qualsiasi purché maggiore di 10 mm. Appoggiate su un tavolo la basetta in senso orizzontale e con il lato ramato verso l'alto, disegnate un puntino a 26 mm di distanza dal bordo sinistro e a 7 mm dal bordo superiore, quindi forate in corrispondenza del puntino con una punta da trapano di 2 mm di diametro. Ora noterete che sul retro del display del nokia c'è un piccolo pezzettino cilindrico di plastica che sporge verso il retro.

foto del retro del display che mostra il connettore

Fate combaciare il retro del display (il lato dove ci sono i contatti) alla basetta, facendo entrare questo pezzettino di plastica all'interno del foro appena fatto e premete leggermente il display contro la basetta mantenendo il più possibile orizzontale la basetta e verticale il display. In questo modo i contatti del display, appoggiandosi alla basetta, lasceranno un leggero segno sul rame, certamente visibile in controluce, che vi farà da "stampo". Con la matita tracciate delle linee esattamente a metà tra un segno e l'altro, quindi con un taglierino incidete il rame in modo da creare delle piccole piazzole di rame in corrispondenza dei segni, ciascuno elettricamente isolato dagli altri. Fatto ciò prendete 10-20 cm di cavo flat (tipo quello dati dei floppy) a 8 poli e spellate gli ultimi 8 mm di un lato cercando di non rovinare i fili. Ora sadate i fili della piattina alle piazzole di rame appena realizzate, evitando di creare cortocircuiti fra di esse (controllate con un tester). Siccome i fili della piattina sono molto deboli e potrebbero rompersi con il tempo, è consigliabile incollare la piattina al retro della basetta, rendendo così più robusto il connettore. In questo modo avete completato il vostro connettore e potrete collegarlo facilmente ai vostri circuiti. Naturalmente per far aderire il display al connettore dovrete utilizzare delle mollette o qualcosa di simile.

foto del connettore   foto del retro del connettore


torna all'inizio     Stampa



Progetti creati nel giugno del 2009.

Ultimo aggiornamento avvenuto il 27/06/2009.

Valid HTML 4.01 Transitional    Valid CSS