Elaborato Ambrosino Gaia n46001116

Scuola Politecnica e delle Scienze di Base
Corso di Laurea in Ingegneria Informatica
Elaborato finale in Misure per l'Automazione e la Produzione Industriale
Interfacciamento di un PIC18F4620 con
LCD grafico
Anno Accademico 2013/2014
Candidato:
Gaia Ambrosino
matr. N46/1116
Indice
Indice ......................................................................................................................... III
Introduzione ................................................................................................................. 4
Capitolo 1: Strumentazione e ambiente di sviluppo .................................................... 5
1.1 MPLAB .............................................................................................................. 5
1.2 Proteus Professional 7 ........................................................................................ 5
1.2.1 Componenti................................................................................................. 6
1.3 PIC18F4620 ....................................................................................................... 7
1.4 Termometro TC74 e I2C .................................................................................... 8
1.5 Pulsanti............................................................................................................... 9
1.6 LCD.................................................................................................................. 10
Capitolo 2: LCD ......................................................................................................... 11
2.1 Inizializzazione ................................................................................................ 11
2.2 Funzioni Text Area .......................................................................................... 13
2.3 Funzioni Graphic Area ..................................................................................... 14
2.4 CharacterGenerator RAM ................................................................................ 17
Capitolo 3: Funzioni e main....................................................................................... 19
3.1 Figure geometriche .......................................................................................... 19
3.1.1 Rettangolo ................................................................................................. 19
3.1.2 Quadrato.................................................................................................... 20
3.2 Misura temperatura .......................................................................................... 20
3.2.1 MisuraTemperatura1 ................................................................................. 21
3.2.2 MisuraTemperatura2 ................................................................................. 22
3.3 Disegna segnale ............................................................................................... 23
3.4 Main ................................................................................................................. 25
Capitolo 4: Casi d’uso, interazione con l’utente ........................................................ 27
4.1 Casi d’uso: misuraTemperatura1 ................................................................ 27
4.2 Casi d’uso: disegnaQuadrato ....................................................................... 29
4.3 Altre visualizzazioni .................................................................................... 30
Conclusioni ................................................................................................................ 31
Bibliografia ................................................................................................................ 32
Introduzione
Il termine ‘Liquid Crystal Display’ deriva dal comportamento di alcuni cristalli
i quali, sotto una determinata tensione, si compongono andando a comportarsi
come un liquido, pur mantenendo proprietà e struttura di un cristallo solido.
Sono presenti sul mercato display di grandezze che possono variare da pochi
millimetri fino ad arrivare a un numero elevato di pollici 0.
Lo scopo di questo elaborato è descrivere i metodi e le procedure usati per
l’interfacciamento di un PIC18F4620 con l’LCD grafico LM4229, di risoluzione
240x128 pixel, gestito internamente dal controllore Toshiba T6963C.
I software impiegati per la realizzazione del progetto sono stati MPLAB per lo
sviluppo del software, Proteus per la progettazione e simulazione dello schema
circuitale, e l’applicazione Image2Code per la trasformazione delle immagini,
da un formato raster in stringhe di byte.
Verranno successivamente illustrate alcune applicazioni pratiche:

Composizione e visualizzazione di figure geometriche

Acquisizione e visualizzazione grafica e testuale della temperatura

Acquisizione e visualizzazione tipo oscilloscopio di un segnale variabile
4
Capitolo 1: Strumentazione e ambiente di sviluppo
In questo capitolo verranno esaminati singolarmente gli strumenti utilizzati per
la realizzazione dell’intero progetto.
1.1 MPLAB
MPLAB, Integrated Development Environment (IDE1), fornito dalla casa
produttrice Microchip, permette la definizione e la realizzazione di software
scritto in Assembly o in linguaggio C per la quale sono realizzati vari
compilatori.
Avendo utilizzato un PIC della famiglia 18, per il progetto è stato impiegato il
compilatore C18.
1.2 Proteus Professional 7
Proteus è un ambiente software che permette l’emulazione di circuiti
fisicamente realizzabili, consentendo lo studio del loro comportamento. Questo
software è stato utile per la creazione dello schema circuitale del progetto.
Successivamente saranno descritti i componenti del circuito.
1
Un IDE è un software che agevola la scrittura di un programma e il suo codice sorgente. Un IDE può
fare da supporto per il debugging, per lo sviluppo del codice, per la correzione di errori fatti in fase di
scrittura del codice [2].
5
Figura 1: schema circuitale per il controllo dell’LCD
Il circuito simulato si compone di un microcontrollore PIC18F4620, di un LCD
LM4229, di un sensore con output I2C e di un’interfaccia di input a pulsanti. Per la
simulazione sono stati inoltre utilizzati un generatore di forma d’onda arbitraria e un
oscilloscopio per confronto.
1.2.1 Componenti

PIC18F4620 utilizzato per l’interfacciamento con l’LCD, il quale visualizza i
risultati delle operazioni e misurazioni effettuate.

Termometro TC74 che comunica via I2C la misura della temperatura. Questo
termometro è collegato con il PIC tramite i pin RC3 e RC4.

I2C protocollo di comunicazione seriale che controlla la comunicazione tra un
Master e uno (o più) Slave. In questo caso il Master è rappresentato dal
PIC18F4620 e lo Slave è rappresentato dal termometro TC74.

Generatore di forma d’onda tramite il quale, durante l’esecuzione, può essere
impostata manualmente la frequenza e l’ampiezza dell’onda. Il valore di
ampiezza massimo che può essere riprodotto sull’ LCD è di 5V, oltre il quale si
può notare una saturazione.

Oscilloscopio per esaminare la forma d’onda generata.

Pulsanti per interagire con il sistema.

LCD LM4229, display grafico opportunamente programmato.
6
1.3 PIC18F4620
Il PIC18F4620 è un microcontrollore; rappresenta un sistema che comprende
diversi moduli come ad esempio memorie, periferiche, CPU, clock, timer, ADC.
È possibile valutare le caratteristiche del PIC utilizzato [3]:
Figura 2: classificazione PIC
Possiamo distinguere due tipi di memoria:

Program Memory; memoria flash, non volatile di capacità 26 Kbyte
(1024*64 = 65536 byte).

Data Memory; memoria RAM, volatile, che memorizza dati e variabili per
un massimo di 4096 byte.
L’oscillatore può essere interno o esterno. Per il progetto è stato utilizzato
l’oscillatore interno. Ogni istruzione viene eseguita in quattro colpi di clock [4].
Nello schema di Figura1 si può osservare che, per il collegamento tra i
dispositivi esterni e il PIC, vengono utilizzate alcune porte. Queste sono:
PORTA, PORTB, PORTC, PORTD, PORTE che, tramite i registri TRIS,
coordinano il flusso di dati da e verso il PIC (l’input e l’output). In particolare:
PORTA è collegata al generatore di forme d’onda, è una porta configurata
analogica e quindi per la manipolazione dei dati si necessita una conversione
analogico-digitale che viene fatta tramite SAR2.
PORTB è collegata ai pulsanti (questa porta comprende alcuni pin che di default
sono configurati analogici, tramite il registro ADCON1 sono state digitalizzate).
PORTC gestisce i pin di configurazione e di controllo dell’LCD.
PORTD utilizzato per la comunicazione di dati da e verso l’LCD.
PORTE dove è stato utilizzato un solo pin per l’alimentazione del dispositivo.
2
SAR (Successive Approximation Register) utilizza un comparatore e un convertitore digitaleanalogico. Per ogni passo operativo, viene fatto un confronto con un determinato numero di bit,
ponendoli a uno, a partire dal MSB.
7
1.4 Termometro TC74 e I2C
Questo termometro comunica via I2C la misura eseguita fornendo in uscita un
valore numerico della temperatura che fornisce un intervallo di valori che va da
-65° (0b10111111) a 127° (0b01111111) misurati [5].
Si interfaccia con il PIC tramite i pin RC3 ed RC4, rispettivamente utilizzati
come il Serial Clock, linea unidirezionale, che gestisce la temporizzazione da e
verso il TC74, e il Serial Data, linea bidirezionale, che gestisce il trasporto dei
dati; entrambe le linee sono connesse agli ingressi del TC74.
Il protocollo di comunicazione impiegato è l’I2C (comunicazione su bus) che
connette un Master e uno Slave: il PIC è il Master, dato che il TC74 funziona
solo in modalità Slave. La trasmissione viene fatta in maniera sincrona a partire
da un colpo di clock generato dal Master. Vengono quindi costruite due
procedure per la configurazione e l’acquisizione della temperatura:

TRISC3 = 1 e TRISC4 = 1 fanno si che
siano inizialmente impostati i pin RC3 e
RC4 (i pin SCLK e SDA) come input.

Viene impostato il registro SSPCON1:
o
Bit 7-6: questi bit si configurano in
maniera automatica quando ci sono anomalie nel protocollo di
trasmissione
o
Bit 5: SSPEN = 1 abilita la periferica
o
Bit 4: CKP = 0 bit non utilizzato in modalità Master
o
Bit 3-0: determinano la modalità di utilizzo del dispositivo, in questo
caso SSPM3-SSPM0 = 1000. Il clock della comunicazione tra Master
Fosc
e Slave si ottiene come 𝑐𝑙𝑜𝑐𝑘 = 4∗(SSPADD+1). Per trasformare la
frequenza da 4MHz a 100kHz del clock del PIC si sceglie il bit
SSPADD = 9 del registro SSPSTAT.

Con SMP = 1 del registro SSPSTAT viene scelta la modalità di I2C a
100MHz.

Con CKE = 1 abilita SMSBus come input (bus di trasporto dei dati)
8
Per quanto riguarda l’acquisizione della temperatura viene effettuata la #define
della variabile idleI2C che verrà successivamente utilizzata. Questa variabile è
usata per indicare lo stato di idle, cioè se la comunicazione è libera oppure no.
Ricordando che il TC74 usa modalità di indirizzamento a 7 bit (7 bit per
l’indirizzo, 1 bit indica se leggere o scrivere) è stata implementata la funzione
di acquisizione che segue una specifica procedura:
Il processo di acquisizione utilizza il protocollo di comunicazione sincrono
effettuando un controllo sui bit del registro SSPSTAT tramite l’istruzione
while(!idleI2C) mettendosi in attesa.

SEN = 1, inizio una condizione di start

SSPBUF = 0b10011010, 7 bit di indirizzo
del termometro e ultimo bit per la scrittura

SSPBUF = cmd, (alla quale verrà passato
0x00) invio richiesta di temperatura

RSEN = 1, condizione di restart

SSPBUF = 0b10011011, 7 bit di indirizzo
del termometro e ultimo bit per la lettura

RCEN = 1, abilito ricezione temperatura

result = SSPBUF, lettura del risultato

ACKDT
=
1,
ACKEN
=
1,
determinazione NACK e invio

PEN = 1, fine comunicazione
1.5 Pulsanti
I pulsanti sono stati inizializzati nel
programma con delle #define in modo da
facilitarne l’utilizzo.
Successivamente saranno utilizzati nel main per l’interfacciamento con l’utente.
9
1.6 LCD
Parte fondamentale dell’elaborato è l’LCD LM4229 pilotato dal controllore
T6963 Toshiba tramite determinate istruzioni dettate da una particolare
convenzione di interfacciamento. Questo controllore comunica tramite bus con
un microcontrollore che definisce le operazioni da compiere.
Tra le caratteristiche del controllore T6963 si possono distinguere parametri
settati esclusivamente in maniera hardware dai collegamenti sulla PCB3, altri
invece configurabili dall’utente.
È possibile classificare il controller utilizzato andando a considerare le seguenti
caratteristiche:


Livello hardware
o
128 righe e 30 colonne del display
o
8x8 bit per la dimensione del font dei caratteri
o
8 linee parallele di comunicazione D7-D0.
Livello software
o
128 caratteri di default nella ROM (memoria interna)
o
Stanziamento di area di testo, area grafica e Character Generator
o
RAM (CG-RAM) fino a 64kB,
o
Capacità di utilizzo contemporaneo della text e graphic area [6].
PCB ‘printed circuit board’ è il circuito stampato sulla quale sono posizionati i componenti
elettronici collegati tra loro in modo da formare dei veri e propri circuiti elettrici.
3
10
Capitolo 2: LCD
In questo capitolo verranno esposti e considerati nello specifico tutti i passaggi
implementativi che sono stati sviluppati al fine di raggiungere l’obiettivo
preposto, quale l’interfacciamento con l’LCD grafico.
Questo tipo di LCD è composto da una matrice di pixel, come già detto, di
grandezza 240x128 pixel.
2.1 Inizializzazione
Per inizializzare l’LCD è stata definita comunica(char dc, char sl, int port), una
funzione generica che gestisce la configurazione di più pin (quali C/D, /WR,
D0-D7).
Alla funzione viene passato il carattere che
può essere ‘d’ o ‘c’ (dato o comando), ‘s’
o ‘l’ (scrittura o lettura) e infine ‘port’ che
rappresenta l’indirizzo per il settaggio del
PORTD, collegato alle porte dati D7-D0
dello schermo. Lo scopo è quello di
agevolare la scrittura dell’inizializzazione
dell’LCD compattando il codice.
Questa procedura è stata quindi utilizzata
per scrivere la funzione inizializzaLCD( ).
11
Importante, in questa fase, è stata l’organizzazione della memoria suddivisa, come
mostrato in figura in text area, graphic area e CG-RAM area, dal momento che,
un’errata gestione della stessa, causa la sovrapposizione e una conseguente
visualizzazione a schermo indesiderata. [7]
Figura 3: mappa della memoria
Per quanto riguarda le istruzioni dell’LCD, ci sono vari modi per comunicarle;
alcune istruzioni richiedono l’invio di due byte ‘dato’ e un byte ‘comando’, altre
richiedono l’invio di un byte ‘dato’ e uno ‘comando’, infine altre, che richiedono
solamente l’invio di un byte ‘comando’.
Per esempio l’istruzione MODE SET dell’LCD richiede l’invio del solo
comando, istruzioni come SET TEXT AREA o SET GRAPHIC AREA, richiedono
i due byte dati e il byte comando.
Viene inizialmente fatto un reset del pin
/RST aspettando un tempo necessario per
l’attivazione dello schermo.
L’inizializzazione dell’LCD deve avvenire
quindi effettuando le seguenti operazioni:

MODE SET: CGROM mode, OR
mode. Sta a significare che è stato
impostato il funzionamento memoria
interna OR memoria esterna
12

TEXT HOME, TEXT AREA: 0x0000 è l’indirizzo iniziale dell’area text
la cui dimensione è 0x001E che rappresenta proprio le 30 colonne dello
schermo

GRAPHIC HOME, GRAPHIC AREA: 0x0780 è l’indirizzo iniziale
dell’area graphic, tale che non si sovrapponga all’area text, la cui
dimensione è ancora 0x001E

DISPLAY MODE: text on graphic on, attiva entrambe le aree
2.2 Funzioni Text Area
Sono state implementate le funzioni per la gestione della Text Area. [8]
Questa funzione riceve in ingresso un indirizzo
esadecimale in due byte (del tipo 0x0000) che
viene scomposto tramite TH&0xFF che effettua
un AND bit a bit (tra l’indirizzo di ingresso in 16
bit e l’indirizzo 0xFF composto da 8 bit posti a 0 e 8 bit posti a 1, in modo da
selezionare l’LSB4), l’istruzione successiva effettua uno shift a destra andando a
selezionare l’MSB5, in generale questa funzione imposta il cursore sullo
schermo nel punto definito dall’indirizzo.
La funzione scriviCarattere(int a) utilizza il comando datawrite autoincrement
che setta il parametro a ed effettua un incremento automatico dell’indirizzo.
La funzione scriviStringa(char * stringa) utilizza, per una stringa, la procedura
precedentemente mostrata (scriviCarattere), andando a scrivere carattere per
4
5
Least Significant Byte, Byte meno significativo
Most Significant Byte, Byte più significativo
13
carattere un’intera stringa. Avvalendosi della funzione trasformaAscii(int ascii)
è stato risolto il problema legato al fatto che l’LCD non utilizza la codifica ascii.
2.3 Funzioni Graphic Area
Con l’obiettivo di poter visualizzare forme geometriche e immagini, avvalendosi
di funzioni elementari, è stata sviluppata la funzione che illumina un solo bit
dell’intero schermo (cioè lo pone a ‘1’): scriviPunto(int x, int y).
Questa funzione riceve in ingresso coordinate (x,y) che vanno a ricoprire l’intero
spazio della matrice dell’LCD, quindi, l’intervallo di valori plausibili da dare in
ingresso: per la coordinata x è 0-239, per la coordinata y è 0-127.
È stata impostata la variabile
indirizzo
in
modo
da
posizionarsi nel punto (x,y)
esatto.
Dato che la graphic area ha
un indirizzo di partenza
0x0780,
considerando
le
coordinate in input della
funzione, è stato sommato ad esso il numero di colonna x/0x08 e di riga y*0x1E.
Si può quindi illustrare la struttura dell’LCD in questo modo
Figura 4: struttura dell'LCD
14
Dalla Figura4 si può notare che l’LCD è rappresentato da una matrice 240x128
pixel; ogni carattere è definito da 8x8 pixel e quindi si possono distinguere 16
righe e 30 colonne.
In particolare l’equazione indirizzo = (y*0x1E + (int)(x/0x08) + 0x0780) calcola
l’indirizzo del pixel da ‘illuminare’:

y*0x1E (dove y, scelta tra 0-127, moltiplica 0x1E, cioè la misura della
larghezza di una riga) seleziona una riga dell’LCD.
Figura 5: selezione riga

x/08 (dove x, scelta tra 0-239, viene divisa per nil numero di pixel di ogni
carattere, cioè 8 pixel) seleziona una colonna dell’LCD.
Figura 6: selezione colonna
Una volta calcolato l’indirizzo generale, questo, viene usato come input per le
istruzioni che posizionano l’address pointer set, (le stesse istruzioni utilizzate per
15
la funzione impostaAddress(int a)), cioè l’istruzione che seleziona l’indirizzo
della text area, stabilendo una posizione apparentemente imprecisa.
Figura 7: selezione byte di riga
Si procede dunque in modo più particolare prendendo l’esatto pixel di colonna.
Viene quindi calcolato il pixel da illuminare come setbit = 0x07- (x%0x08) che
sarà l’input dell’istruzione successiva Comunica(‘c’,’s’,setbit|0xF8) effettuando
l’OR bit a bit con il comando dell’istruzione bit set (0b11111000). Lo stesso
blocco è stato utilizzato per la funzione cancellaPunto(int x, int y), l’unica
diversità è nella sostituzione dell’istruzione bit set con bit reset (0b11110000).
Figura 8: seleziona singolo bit
16
L’utilizzo della graphic area permette di visualizzare su schermo delle immagini
convertite in stringhe di byte.
Un esempio di questa funzionalità è stato
mostrato nella funzione disegnaTermometro( )
nel quale è stata convertita un immagine di
grandezza 240x80 pixel in una stringa di byte e
quindi inserita in un vettore. Il vettore è stato dichiarato, per questa immagine,
di 2400 elementi ((240x80)/8 = 2400, dove 8 è il numero di bit per carattere).
Per raffigurare il termometro è stato impostato come indirizzo di partenza
l’indirizzo 0x0D20 corrispondente alla riga 6 della graphic area. I comandi
Comunica('c','s',0xB0) e Comunica('c','s',0xB2) rappresentano rispettivamente i
comandi set autowrite e reset autowrite, il primo (set autowrite) abilita la
scrittura in modalità ‘autowrite’, cioè, impostato un indirizzo, scrive i dati in
locazioni di memoria contigue (effettua un avanzamento dell’indirizzo
automaticamente), il secondo (reset autowrite) disabilita questa impostazione.
2.4 CharacterGenerator RAM
L’LCD in questione permette di definire nuovi caratteri e memorizzarli nella
memoria esterna chiamata CG-RAM i cui indirizzi possono essere memorizzati
a partire dall’indirizzo successivo all’ultimo carattere della
CG-ROM, cioè
l’indirizzo 0x80.
È stata implementata una funzione di inizializzazione e una funzione di scrittura
su questa memoria di nuovi caratteri.
In questa funzione è stato definito l’indirizzo
iniziale della CG-RAM.
La memoria dedicata all’area CG-RAM, come
già detto ha la grandezza di 64kB (suddivisa in
32 spazi da 2kB), quindi i possibili indirizzi
vanno da 0x0000 a 0xFFFF. Dato che il valore
dell’offset è legato alla determinazione dell’area
di memoria CG-RAM da utilizzare, tramite una
combinazione del valore dei pin del controllore
17
T6963 (da ad15 a ad0), si sceglie un valore di offset adeguato all’intervallo di
memoria scelto. Per memorizzare i nuovi caratteri si è optato per l’intervallo che
va dall’indirizzo 0xE000 a 0xE7FF (prendendo lo spazio di 2kB), di
conseguenza si è selezionato come valore di offset 00011100 (si nota
dall’immagine l’indirizzo 0x001C) i cui ultimi cinque bit hanno determinano
l’intervallo di memoria scelto.
Fatto questo, è stato necessario collocarsi all’indirizzo 0xE400, che segna la fine
dei caratteri base della memoria interna (CG-ROM); ora sarà possibile
memorizzare i nuovi caratteri a partire da questo indirizzo.
L’altra funzione implementata
fa in modo da andare a
memorizzare
suddividendolo
un
in
carattere,
8
byte
(rappresentato da una matrice
8x8 pixel), nella CG-RAM a
partire da 0xE400.
Viene ricevuto in ingresso
l’indirizzo nella quale si vuole
memorizzare il carattere, a partire da 0x80 (primo indirizzo libero), e si somma
con 0xE400.
Un esempio di composizioni di caratteri è presente nel main del programma,
dove sono stati costruiti 22 caratteri speciali successivamente impiegati [9].
Per
esempio
memorizzato
il
carattere
nell’indirizzo
0x80 ha questa struttura:
Figura 9: rappresentazione carattere
Si può quindi evincere la strutturazione del carattere. [10]
18
Capitolo 3: Funzioni e main
Una volta implementate le funzioni base per la gestione della memoria e
l’interfacciamento con l’LCD sono state create delle procedure tali da interagire
con l’utente. Il codice sviluppato comprende funzioni di acquisizione e
visualizzazione della temperatura misurata tramite protocollo I 2C, funzioni di
composizione di figure geometriche e funzione di acquisizione di segnale
tramite un generatore di segnali.
3.1 Figure geometriche
Saranno qui illustrate le funzioni per la composizione di figure geometriche,
quali rettangolo e quadrato.
3.1.1 Rettangolo
Questa funzione riceve in ingresso le coordinate di due vertici opposti del
rettangolo; questo è stato fatto per ottimizzare il codice in modo che con questi
due punti si avesse accesso a tutte le coordinate per la composizione della figura
geometrica.
19
Si può notare che, tramite la funzione scriviPunto(int x, int y), inserita nei cicli
for, sono state generate le linee considerando x, le colonne, e y le righe.
In particolare, il primo ciclo parte dal valore del parametro colonna1 per poi
fermarsi a colonna4, quindi con scriviPunto(i,riga1) dove l’indice di colonna è
un numero che va da colonna1 a colonna4 e l’indice di riga è un valore costante
(su riga1), si può rappresentare il tratto orizzontale superiore del rettangolo. Lo
stesso procedimento è stato applicato per gli altri tre lati del rettangolo.
Inoltre, la stessa funzione è stata utilizzata per cancellaRettangolo(int colonna1,
int riga1, int colonna4, int riga4) che al posto di illuminare il pixel, lo spegne.
3.1.2 Quadrato
Dato che è una figura che
ha tutti i lati uguali, la
funzione che disegna il
quadrato riceve come
parametri di ingresso una
sola coordinata (x,y) e la
distanza, che servirà a
disegnare i lati. Basterà
quindi prendere come
riferimento i punti del
piano riga1, colonna1, riga1+distanza, colonna1+distanza.
3.2 Misura temperatura
Sono state implementate due diverse funzioni per misurare la temperatura.
Il termometro è stato rappresentato dunque in due modi differenti: il primo è
stato costruito tramite la composizione di righe e caratteri, l’altro invece è stato
costruito tramite la funzione disegna Termometro( ) precedentemente illustrata.
Per semplificare la comprensione del codice, questo verrà suddiviso in più
sezioni.
20
3.2.1 MisuraTemperatura1
Questa funzione riceve in
ingresso il parametro bool
che, successivamente, in un
ciclo while, verrà utilizzato
per
stabilire
la
fine
dell’acquisizione. Sono state dichiarate due variabili: temp e temporaneo che
serviranno per effettuare un confronto tra la temperatura misurata e il valore di
temperatura precedente, per ottenere il gap di temperatura necessario per la
rappresentazione grafica.
Successivamente viene fatta un’acquisizione impostando così le due variabili a
quel valore misurato.
Da qui si può quindi illustrare come viene costruita la barra della temperatura
dove il suo punto di partenza sarà il punto di coordinata x = 71, che raggiungerà
la tacca di grado 0 dopo 19 pixel, con altezza pari a 13 pixel e quindi coordinata
y che va dalla posizione 83 alla posizione 95. L’incremento di un grado segnerà
un aumento di 3 pixel sullo schermo. L’algoritmo funziona in questo modo:
viene fatta un’acquisizione della temperatura; se il valore appena misurato è
uguale a quello precedente, allora verrà mantenuta la posizione, altrimenti, se il
valore misurato è minore di quello precedente, saranno cancellati il numero di
pixel pari alla differenza tra le due misurazioni. Invece, se la temperatura
misurata è maggiore di quella precedente, sarà aggiunto un numero di pixel pari
alla differenza delle due misurazioni.
Quindi sarà posto temporaneo = temp per aggiornarne il valore.
21
Il
funzionamento
funzione
e
l’acquisizione
della
quindi
della
temperatura saranno arrestati
nel momento in cui sarà
premuto
il
pulsante
‘TERMINA’, tramite il quale
la variabile bool verrà posta al
valore basso tale da terminare
il ciclo while.
Infine si può notare che è stata richiamata la funzione scriviGradi(temp) che
mostra a video il valore, della temperatura in Kelvin, gradi centigradi, gradi
Fahrenheit, gradi Rankine, gradi Reaumur, calcolandoli in questo modo (tenendo
conto che temp rappresenta i gradi centigradi) [11]:

faren = (temp*1.8 +32);

kelvin = ((faren+459.67)/1.8);

rank = (kelvin*1.8);

ream = ((faren-32)/2.25);
3.2.2 MisuraTemperatura2
Questa procedura utilizza anch’essa la funzione scriviGradi(temp) effettuando
una medesima misurazione della temperatura e stabilisce la terminazione tramite
il pulsante ‘TERMINA’.
La differenza tra queste due funzioni è la rappresentazione del termometro.
Il termometro è stato disegnato con due linee
continue laterali della larghezza di tutto lo schermo
(240 pixel) e distanza l’una dall’altra di 8 pixel; ogni
grado è rappresentato da 5 pixel di altezza e 8 pixel
di larghezza e per disegnare le tacche dei gradi, sono
state definite delle piccole righe verticali li dove
l’indice di colonna fosse un multiplo di 8 (q%8==0).
22
All’esterno delle righe laterali sono stati scritti
i numeri da 0 a 30, considerando che i numeri
da 10 a 30 sono caratteri speciali scritti nella
CG-RAM.
Il funzionamento è leggermente diverso: per
ogni
lettura della
temperatura, vengono
cancellate tutte le righe dei gradi e vengono
riscritte andando a rappresentare la nuova
misurazione. Anche qui sono state utilizzate le
due variabili temp e temporaneo. Se le due
temperature sono uguali, si mantiene la
precedente rappresentazione, se sono diverse,
vengono cancellati i segni precedenti e viene
impostato temporaneo = temp in modo da
visualizzare
successivamente
la
nuova
temperatura. Tra un grado e l’altro viene lasciato lo spazio di 1 pixel per avere
una migliore visualizzazione grafica.
3.3 Disegna segnale
L’ultima funzione implementata è disegna Segnale( ). Questa funzione preleva
in tempo reale il campione e lo visualizza. Prima di effettuare il ciclo vengono
inizializzati i registri dell’ADC: ADCON0, ADCON1, ADCON2.


ADCON0 = 0x00
o
Bit 7 – 6: letti come 0
o
Bit 5 – 2: seleziona il channel (in questo caso AN0  0000)
o
Bit 1: A/D idle
o
Bit 0: conversione A/D è disabilitata
ADCON1 = 0b00001110
o
Bit 7 – 6: letti come 0
o
Bit 5: valore di riferimento VSS
o
Bit 4: tensione di riferimento VDD
o
Bit 3 – 0: imposta tutte le porte digitali e la porta AN0 come analogica
23

ADCON2 = 0b00010100
o
Bit 7: giustificato a sinistra
o
Bit 6: letto come 0
o
Bit 5 - 3: considera 4 Tad (tempo di acquisizione)
o
Bit 2 – 0: considera Fosc/4 (clock di conversione A/D)
Dopo aver impostato questi parametri viene attivato il modulo A/D con
ADCON0bits.ADON = 0x01.
Per descrivere il segnale è stato utilizzato un ciclo nel quale è stato inserito un
blocco di acquisizione. Il ciclo acquisisce 240 campioni che è proprio il numero
di pixel colonna dell’LCD.
Viene abilitata la conversione e si aspetta fino
a quando questa non è disponibile.
L’acquisizione A/D avviene su 10 bit, 8 bit del
registro ADRESH e 2 bit del registro ADRESL
prelevando complessivamente un intervallo di codici (che va da 0 a 1023)6.
Per questa acquisizione viene prelevato solamente il valore dal registro
ADRESH che viene assegnato alla variabile acquisizione; prendendo il
campione dal registro ADRESH il range di valori sarà rappresentato quindi dagli
8 bit in modo da avere un intervallo che va da 00000000 a 11111111, in binario,
cioè da 0 a 255 in decimale. Per riuscire a visualizzare il valore a video del
segnale acquisito, questo è stato dimezzato (0 – 127) dato che il numero di pixel
riga sono rappresentati proprio dal quell’intervallo di valori.
Per ogni punto messo a video sarà cancellato il punto precedente memorizzato
nel vettore vect[i].
6
0 – 1023 rappresenta l’intervallo di tensione 0 – 5V
24
Per l’onda quadra è stato
aggiunto un blocco atto alla
visualizzazione
della
discontinuità. È stata utilizzata
la variabile a per fare in modo
che si potesse disegnare una
sola riga, tra livello alto e
livello basso, del segnale. Se i
valori acquisiti sono differenti,
allora viene disegnata la riga
verticale.
Nel prossimo capitolo saranno illustrate tutte le funzioni.
3.4 Main
Si può dividere il main in due categorie: la parte di inizializzazione e la parte di
elaborazione.
Per l’inizializzazione vengono impostati TRISB = 0b11111111 data la necessità
di avere input dai pulsanti, TRISC = 0 e TRISD = 0 per impostare le porte come
output. Viene richiamata la funzione inizializzaLCD( ), InizializzaCGRam( ),
ConfigI2C( ), per effettuare una configurazione iniziale dell’LCD. Vengono
scritti i 22 caratteri sulla CG-RAM.
Per quanto riguarda il codice, avendo preventivamente definito il valore dei
pulsanti associandoli ai pin di PORTB, è stato necessario impostare il registro
ADCON1 al valore 0x0F in modo che tutte le porte passassero da analogiche
(impostazione di default) a digitali.
L’interazione con l’utente consiste nell’aspettare che venga premuto un pulsante
tra RETTANGOLO, QUADRATO, TERMOMETRO1, TERMOMETRO2,
SEGNALE.
25
Se il pulsante è ‘RETTANGOLO’ o ‘QUADRATO’, per visualizzare la forma
geometrica in punti casuali dello schermo ogni volta che viene premuto il
suddetto pulsante, è stata utilizzata la funzione rand( ) della libreria stdlib.h, in
modo da passare parametri plausibili alle due funzioni. Le funzioni di
temperatura e acquisizione di segnale vengono richiamate nel momento in cui
vengono sollecitati i relativi pulsanti.
Per terminare ogni visualizzazione si aspetta che venga premuto il pulsante
‘TERMINA’.
26
Capitolo 4: Casi d’uso, interazione con l’utente
L’utente ha la possibilità di interagire con il sistema visualizzando quindi la
temperatura, il segnale generato e le forme geometriche; a tale scopo, ha la
possibilità di premere uno dei pulsanti a disposizione tra RETTANGOLO,
QUADRATO, TERMOMETRO1, TERMOMETRO2, SEGNALE.
Come esempio è stata rappresentata questa interazione considerando uno schema
dei casi d’uso riguardante la visualizzazione della temperatura e uno schema
riguardante la rappresentazione di una figura geometrica.
4.1 Casi d’uso: misuraTemperatura1
Figura 10: casi d'uso1
Questo schema rappresenta la simulazione di interazione dell’utente con il
progetto.
In particolare si sta descrivendo l’interazione con TERMOMETRO1. Una volta
che l’utente ha premuto questo tasto, il sistema entra in un loop in cui viene fatta
un’acquisizione e una successiva visualizzazione della temperatura.
27
Si esegue il progetto:
Figura 11: schermata iniziale
L’utente preme il pulsante
e a video compare il termometro e la
temperatura misurata. Nella figura sotto una misura con temperatura di 30°C
Figura 12: schermata temp30
Successivamente la temperatura del TC74 viene aumentata
Figura 13: schermata temp43
Infine la temperatura del TC74 viene diminuita
Figura 14: schermata temp8
Questa visualizzazione terminerà nel momento in cui verrà premuto il tasto
‘TERMINA’ dove si ritornerà alla schermata iniziale, quindi alla scelta della
funzione con il quale interagire.
28
4.2 Casi d’uso: disegnaQuadrato
Figura 15: casi d'uso2
Stesso discorso viene fatto per la funzione disegnaQuadrato: dopo la
visualizzazione della schermata iniziale, l’utente preme il tasto ‘QUADRATO’
e compare la schermata: ogni volta che viene premuto ‘TERMINA’ e poi
nuovamente ‘QUADRATO’ verrà generato un quadrato con dimensione e
posizione diverse.
Figura 16: quadrato1
Figura 17: quadrato2
Figura 18: quadrato3
29
4.3 Altre visualizzazioni
Si riportano le visualizzazioni delle altre funzioni considerando che il
diagramma dei casi d’uso è lo stesso:
Figura 15: segnale triangolare
Figura 16: segnale rettangolare
Figura 19: segnale sinusoidale
Si può notare che il segnale viene cancellato e visualizzato in tempo reale.
Figura 17: rettangolo
Figura18: termometro2
30
Conclusioni
In questo elaborato, l’utilizzo di un LCD grafico, seppur impiegato tramite una
simulazione, ha permesso di visualizzare l’esecuzione di diverse funzionalità.
Tali
funzionalità
sono
state
elaborate,
mediante
un
PIC18F4620
opportunamente programmato, avvalendosi di dispositivi di varia natura, quali,
termometri, generatori di forma d’onda e pulsanti.
Si può quindi parlare di versatilità nell’utilizzo di questo strumento.
31
Bibliografia
[1] Wikipedia, Schermo a Cristalli Liquidi
http://it.wikipedia.org/wiki/Schermo_a_cristalli_liquidi
[2] Wikipedia, Integraded Development Environment
http://it.wikipedia.org/wiki/Integrated_development_environment
[3] micro.deis.unibo.it/~romani/Dida01/lezioni/microcontrollori_v2.pdf
[4] Data Sheet PIC18F2525/2620/4525/4620 Data Sheet
[5] TC74 Data Sheet
[6] Application Notes for the T6963C LCD Graphics Controller Chip
http://www.lcd-module.de/eng/pdf/zubehoer/t6963.pdf
[7] http://www.ccsinfo.com/forum/viewtopic.php?t=51413
[8] http://read.pudn.com/downloads197/sourcecode/others/927463/T6963CCS/t69
63.c__.htm
[9] Interfacing and set-up of Toshiba T6963C
https://www.sparkfun.com/datasheets/LCD/Monochrome/AN-029Toshiba_T6963C.pdf
[10] T6963 Data Sheet
https://www.sparkfun.com/datasheets/LCD/Monochrome/DatasheetT6963C.pdf
[11] Wikipedia calcolo temperatura http://it.wikipedia.org/wiki/Grado_Fahrenheit
32