Professional Documents
Culture Documents
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
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.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.
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
1.4. Risultati.
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
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.