Sei sulla pagina 1di 8

RELAZIONE SULLE ESPERIENZE DI LABORATORIO DEL

CORSO DI PROGRAMMAZIONE DI SISTEMI DIGITALI

FABIO DE ROSSI

Contents
1. Esperienza di laboratorio 1 2
1.1. Riferimenti 2
1.2. Scopo dell’esperienza 2
1.3. Discussione 2
1.4. Risultati 4
1.5. Conclusioni 4
1.6. Codice sorgente dei programmi 5
2. Esperienza di laboratorio 2 6
2.1. Riferimenti 6
2.2. Scopo dell’esperienza 6
2.3. Discussione 6
2.4. Risultati 9
2.5. Conclusioni 9
2.6. Codice sorgente dei programmi 9

Date: A.A. 2009/10.


1
2 FABIO DE ROSSI

1. Esperienza di laboratorio 1
1.1. Riferimenti.
Esperienza di laboratorio numero 1
Titolo: Driver LCD
22/04/2010
Fabio De Rossi, Gianluca Conte, Michael Simone Marioli

1.2. Scopo dell’esperienza.


Lo scopo di questa esperienza la creazione di una libreria che consenta di pilotare
il display a cristalli liquidi della scheda Explorer 16 e di un programma di test della
libreria.

1.3. Discussione.
Questa esperienza richiedeva il completamento di tre compiti.
Il Compito 1 richiedeva di capire come funziona il meccanismo di comunicazione
con lo porta parallela e come utilizzare i registri di controllo per manovrare il
display. Infatti, Nella scheda Explorer 16 il display a cristalli liquidi collegato
ad un Controller, il Samsung KSA0032, il quale comunica con il microcontrollore
attraverso la porta parallela (Parallel Master Port, PMP) e pertanto necessario
gestire questa per interfecciarsi con il display. La struttura della PMP visibile in
figura 1. Le caratteristiche principali sono la presenza di 8 bit di comunicazione,
un cammello e un ago. . . . La PMP dispone di 8 registri attraverso i quali possibile
comunicare con essa.

Figure 1. Parallel Master Port


RELAZIONE SULLE ESPERIENZE DI LABORATORIO DEL CORSO DI PROGRAMMAZIONE DI SISTEMI DIGITALI
3

Il Compito 2 richiedeva di realizzare un driver per il display (LCDDriver.c)


seguendo l’interfaccia fornita nel file LCDDriver.h. In questa esperienza la pro-
cedura di inizializzazione della PMP stata fornita anticipatamente, per cui noi
abbiamo scritto soltanto le procdure che utlizzano il display, il cui elenco con rel-
ativi bit di onfigurazione visibile in figura 2. . . . per cui gli unici registri da noi
utilizzati sono . . . ed . . . per la lettura/scrittura di dati nella memoria DDRAM del
display.

Pertanto ogni procedura stata realizzata utilizzando gli opportuni registri. Pas-
siamo ad analizzarle in dettaglio. La procedura lcdisBusy restituisce 1 se il display
occupato, altrimenti restituisce 0. Lo fa semplicemente restituendo il valore del
bit BUSY del registro PMMODE:
1 unsigned char l c d I s B u s y ( void ) {
return ( unsigned char ) PMMODEbits .BUSY;
3 }

.
lcdCommand una procedura basilare, in quanto permette l’invio dei comandi
visibile in figura 2 al display.
1 void lcdCommand ( unsigned char command ) {
// a s p e t t a
3 lcdWaitForNextCommand ( ) ;
// poniamo RS = 0
5 PMADDR = 0 x00 ;
// a s p e t t a
7 lcdWaitForNextCommand ( ) ;
// inviamo comando
9 PMDIN1 = command ;
// a s p e t t a ?
11 }

.
Abbiamo quindi due procedure che sfruttano la precedente; lcdClear ripulisce
lo schermo, mentre lcdGetCursorPosition ritorna la posizione del cursore del
display, effettuando una AND con una maschera che consente di tornare..............
1 void l c d C l e a r ( void ) {
lcdCommand ( 0 x01 ) ;
3 }

5 unsigned char l c d G e t C u r s o r P o s i t i o n ( ) {
lcdCommand ( 0 ) ;
7 msDelay ( 1 ) ;
return (PMDIN1 & 0x7F ) ;
9 }
4 FABIO DE ROSSI

Figure 2. uao

Il Compito 3 infine chiedeva di realizzare un programma di prova (testLCD-


Driver) che visualizzi delle determinate stringhe al fine di testare il funzionamento
della libreria precedentemente realizzata. Fatto

1.4. Risultati.

1.5. Conclusioni. Che bello abbiamo imparato a fare andare il display.

Figure 3. First. Figure 4. Second.


RELAZIONE SULLE ESPERIENZE DI LABORATORIO DEL CORSO DI PROGRAMMAZIONE DI SISTEMI DIGITALI
5

1.6. Codice sorgente dei programmi.


6 FABIO DE ROSSI

2. Esperienza di laboratorio 2
2.1. Riferimenti.
Esperienza di laboratorio numero 2
Titolo: Sensore di Temperatura e Convertitore Analogico Digitale
29/04/2010
Fabio De Rossi, Gianluca Conte, Michael Simone Marioli

2.2. Scopo dell’esperienza.


Lo scopo di questa esperienza di laboratorio usare il convertitore analogico dig-
itale del microcontrollore, il display LCD e il sensore di temperatura della scheda
Explorer 16 per realizzare un termometro con display digitale.
2.3. Discussione.
Questa esperienza richiedeva il completamento di tre compiti.
Il Compito 1 richiedeva di realizzare una funzione adcInit che inizializzi con de-
terminati parametri il convertitore analogico/digitale interno del microcontrollore.
l’ADC bla bla, figura 1 E’ stato sufficiente procedere punto per punto, consultando

Figure 5. Schema a blocchi del convertitore analogico/digitale


RELAZIONE SULLE ESPERIENZE DI LABORATORIO DEL CORSO DI PROGRAMMAZIONE DI SISTEMI DIGITALI
7

il PIC24F Family Reference Manual alla sezione 17 (10-Bit A/D Converter) per
capire in quali registri scrivere e cosa. Qui di seguito il codice prodotto:

1 void a d c I n i t ( ) {

3 TRISB = 0xFFFF ;
AD1CON1 = 0 x0000 ;
5 AD1CON2 = 0 x0000 ;
AD1CON3 = 0 x0601 ;
7 AD1CHS = 0 x0004 ;
AD1PCFG = 0 x0000 ;
9 AD1CSSL = 0 x0004 ;

11 // T u t t i e 16 g l i i n g r e s s i a l c o n v e r t i t o r e devono e s s e r e c o n s i d e r a t i
analogici

13 // I l r i s u l t a t o d e l l a c o n v e r s i o n e d e v e e s s e r e un i n t e r o s e n z a s e gn o
a 10 b i t ;

15 // I l c o n v e r t i t o r e d e v e u s a r e l a m o d a l i t ” a u t o c o v e r t ” ( c i o il
c o n v e r t i t o r e c a l c o l a da s o l o i l
// p e r i o d o d i campionamento ) ;
17 AD1CON1bits . SSRC2 = 1 ;
AD1CON1bits . SSRC1 = 1 ;
19 AD1CON1bits . SSRC0 = 1 ;
//L ’ a t t i v a z i o n e d e l campionamento d e v e e s s e r e manuale ;
21
// I l c o n v e r t i t o r e d e v e non o p e r a r e quando i l p r o c e s s o r e in ” i d l e
mode ” ;
23 AD1CON1bits . ADSIDL = 1 ;

25 // 6 . Le t e n s i o n i d i r i f e r i m e n t o d e l c o n v e r t i t o r e devono e s s e r e Vr+
= AVdd e Vr− = Avss ;
// 7 . I l c o n v e r t i t o r e non d e v e e s e g u i r e l a s c a n s i o n e d e g l i i n g r e s s i ;
27 // 8 . I l c o n v e r t i t o r e d e v e u s a r e un s i n g o l o b u f f e r da 16 campioni ;
// 9 . I l c o n v e r t i t o r e d e v e e s s e r e c o n f i g u r a t o p e r g e n e r a r e un ’
i n t e r r u z i o n e ad o g n i campione ;
29 // 1 0 . I l c o n v e r t i t o r e non d e v e a l t e r n a r e l ’ uso d e i m u l t i p l e x e r A e
B, b e n s u s a r e sempre i l primo d e i due ;
// 1 1 . I l c l o c k d e l c o n v e r t i t o r e d e v e e s s e r e d e r i v a t o da q u e l l o d e l
processore ;
31 // 1 2 . I l p e r i o d o d i c o n v e r s i o n e d i una c i f r a , Tad , d e v e e s s e r e p a r i
a l p e r i o d o d e l c l o c k d e l p r o c e s s o r e Tcy (125 ns ) ;
// 1 3 . I l tempo p e r l a c a r i c a d e l c o n d e n s a t o r e d i misura d e v e e s s e r e
6Tad ;
33 // 1 4 . I l p i n a s s o c i a t o a l s e n s o r e d i t e m p e r a t u r a d e v e e s s e r e l ’
i n g r e s s o p o s i t i v o (CH0+) a l c o n v e r t i t o r e ;
// 1 5 . I l p i n Vr− ( AVss ) d e v e e s s e r e l ’ i n g r e s s o n e g a t i v o (CH0−) a l
convertitore ;
8 FABIO DE ROSSI

35 // 1 6 . Nel r e g i s t r o IEC0 d e v e e s s e r e d i s a b i l i t a t a l ’ i n t e r r u z i o n e d e l
c o n v e r t i t o r e A/D;

37 // s i r i p u l i s c a n o e v e n t u a l i r i c h i e s t e d i i n t e r r u z i o n e d e l
c o n v e r t i t o r e A/D
// p e n d e n t i n e l r e g i s t r o IFS0
39 I F S 0 b i t s . AD1IF = 0 ;
}

.
Il Compito 2 richiedeva di implementare una funzione che prelevi il valore di
tensione quantizzato fornito dall’ADC e lo trasformi in una stringa che possa essere
stampata sul display LCD. Tale problema suddiviso in due parti; la prima con-
siste nel tovare, sfruttando la documentazione disponibile, la funzione inversa che
consenta di trasformare il valore quantizzato nella relativa temperatura espressa
in gradi Celsius in base decimale.
Il codice risultante
// l e t t u r a v a l o r e e c o n v e r s i o n e i n C e l s i u s
2 tmp = convValue ( ) ;
// f o r m u l a p e r f e t t a
4 //tmp −= 1 5 5 ;
// temperatureC = tmp / 3 . 1 ;
6 // f o r m u l a merdosa
temperatureC = ( tmp ∗ 3 . 2 2 − 5 0 0 ) / 1 0 ;
8 temperatureF = temperatureC ∗ 1 . 8 + 3 2 ;

.
La seconda parte del problema invece chiede di visualizzare la temperatura sul
display. Siccome il driver precedentemente realizzato per il display ne consente la
stampa unicamente di una stringa alla volta, stato necessario utilizzare la funzione
sprintf() della libreria stdio.h. Tale funzione permetter infatti di creare un
array di caratteri contenente il testo desiderato.
s p r i n t f ( temp , ”T i n C e l s i u s : %03.1 f ” , temperatureC ) ;

.
Il Compito 3
2.4. Risultati.

2.5. Conclusioni. Che bello abbiamo imparato a fare andare il termometro.

2.6. Codice sorgente dei programmi.