Guida alla Quinta Esercitazione

Documenti analoghi
Guida alla Settima Esercitazione

Esercitazione su. LCD alfanumerico con controller/driver HD44780

Tutorial Display LCD e PIC

Scopo e agenda dell Unità 6

Componenti e connessioni. Capitolo 3

Rivediamo alcuni concetti fondamentali: note sulla periferica GPIO

Guida alla Quarta Esercitazione

Componenti principali

Componenti principali. Programma cablato. Architettura di Von Neumann. Programma cablato. Cos e un programma? Componenti e connessioni

Detail ELETTRONICA INDUSTRIALE

MANUALE Lanterne di coda con decoder

ISA Input / Output (I/O) Data register Controller

Interfaccia seriale per LM709SW

Esercitazione su. LCD alfanumerico con controller/driver HD44780

C:\ProgrammiC\Dino18\terminal.h

Prime esperienze con la breadboard

L AMBIENTE CODE BLOCKS E L IO

LINEE GUIDA PER LA CONNESSIONE DI MCP PLUS A VIDEOTERMINALI PROFACE SERIE GP

Esercitazione di Reti degli elaboratori

Capitolo 4: Tabelle. y(x) = x 3 ì 2x. Capitolo 4: Tabelle 67. Nota: le tabelle non sono disponibili nel modo di rappresentazione grafica 3D.

LO HAI MAI REALIZZATO CON UN PIC? - I PICMICRO E I DISPLAY GRAFICI (PRIMA

Esercizi per il recupero del debito formativo:

Qualsiasi programma in C++ segue lo schema:

Remotaggio Caricabatterie NG3

Capitolo Tavola e grafico

Informatica per Statistica Riassunto della lezione del 21/10/2011

Sistema Informativo del Turismo

AXF402 BXC404 - BXF202 EXC202 - EXC402 EXF202 - EXF402 FXC202

L AMBIENTE CODE BLOCKS E L IO

Sistemi a microprocessore

Introduzione alla programmazione in linguaggio C

Il protocollo RS Introduzione. 1.2 Lo Standard RS-232

Voglio scrivere un romanzo (parte 2)

Caratteri e stringhe

Debug di un programma

Dispensa 18 CORSO DI PROGRAMMAZIONE A.A CORSO DI LAUREA IN INGEGNERIA E SCIENZE INFORMATICHE CESENA. Laboratori

Esame di INFORMATICA ARCHITETTURA DI VON NEUMANN. Lezione 4 ARCHITETTURA DI VON NEUMANN

Variabili e Istruzioni

#include <stdio.h> /* l esecuzione comincia dalla funzione main */ int main()

La codifica digitale

SOFTWARE DI PROGRAMMAZIONE CENTRALINA D'IRRIGAZIONE HIRIS/COMPACT

EFA Automazione S.r.l. SB3Conf Help V1.00 (01 ITA).doc pag. 1 / 10

I/O INTERATTIVO. scanf: quello che è indispensabile sapere printf: quello che è utile sapere

ESERCIZIO: PROGETTO DI UNA CPU A PIU REGISTRI

Fondamenti di Informatica 2008 corso prof. A. Picariello. Operazioni sui FILE in C++

Lezione 15. L elaboratore Elettronico

Assegnazione di una variabile

Gli Array. Dichiarazione di un array

Sistemi di numerazione

C: panoramica. Violetta Lonati

Lab. Sistemi - Classe 5Bn A. S. 2000/2001 ITIS Primo Levi - Torino AA.AA. STANDARD SERIALE DI COMUNICAZIONE: RS232 Lo standard seriale di

LO HAI MAI REALIZZATO CON UN PIC? - I PICMICRO E I DISPLAY LCD ALFANUMERICI

Acquisizione dati a LABORATORIO - 4 (by Faso Diego)

Manuale di istruzioni per l inserimento dei dati delle SCUOLE CAMPIONE ESAMI DI STATO 2009 PRIMO CICLO PROVA NAZIONALE

Gestione Vaccinazioni Modulo SOLE

Si può scrivere un programma anche utilizzando un editor di testo (Blocco Note, WordPad, ) ricordandosi comunque di salvarlo con l estensione.py.

Introduzione alla programmazione Esercizi risolti

La Back Office Console consente di costruire lo scheletro degli schema.

FUNZIONI. Ivan Lanese

Note su. Display a cristalli liquidi e il controller/driver HD44780

Parte 1: tipi primitivi e istruzioni C

I CARATTERI E LE STRINGHE

Esame di INFORMATICA Lezione 4

Informatica B a.a 2005/06 (Meccanici 4 squadra) PhD. Ing. Michele Folgheraiter

Guida alla Prima Esercitazione

Introduzione all'architettura dei Calcolatori. Maurizio Palesi

Caratteri e stringhe

PASCAL. 05/04/2012 Pascal 1

NB: sono richieste almeno 4 risposte esatte per la correzione delle domande aperte

Calcolatori Elettronici T Ingegneria Informatica A2 - Gestione di una matrice di LED (8x8)

Esercizio 2: Algebra dei Puntatori e Puntatori a Puntatori

Mini-dispensa sui puntatori in C

Corso di programmazione Arduino DI MALVEZZI DAVIDE

Menù principale di Calc

Laboratorio di Informatica I

Pag. 1. Informatica Facoltà di Medicina Veterinaria a.a. 2012/13 prof. Stefano Cagnoni. Architettura del calcolatore (parte II)

Windows. La prima realizzazione di un ambiente grafico si deve alla Apple (1984) per il suo Macintosh. La gestione dei file conserva la logica del DOS

Modulo LCD: interfacciamento e gestione

Domanda: Come posso configurare SmartyCam HD Rev. 2.1/GP HD (d ora in poi SmartyCam) con Solo 2 DL?

L INTERFACCIA GRAFICA DI EXCEL

Ogni CPU è in grado di eseguire un insieme limitato di istruzioni macchina codificate in binario secondo il seguente schema generale.

FUTURA SERVICE S.r.l. Procedura GIMI.NET ver. 3.8 Agosto 2017

Ing. Vincenzo Falanga

Corso di BASCOM (Capitolo 1 5 ) Corso Teorico/Pratico di programmazione in BASCOM Autore: DAMINO Salvatore. D I S P L A Y L C D (3).

Dipartimento Affari Interni e Territoriali Direzione Centrale per i Servizi Demografici INA-SAIA. SSLProxy. Manuale Utente. versione 1.

Laboratorio di Architettura degli Elaboratori A.A. 2016/17 Programmazione Assembly

Sistemi di numerazione

Architettura del Calcolatore

Notazione posizionale. Codifica binaria. Rappresentazioni medianti basi diverse. Multipli del byte

Sistemi di Elaborazione delle Informazioni

EUROPEAN COMPUTER DRIVING LICENCE SYLLABUS VERSIONE 5.0

DISPLAY LCD I2C (PCF8574T) ARDUINO

Somma di numeri binari

Wincc TIA Portal v14

CPU, RAM, ROM e BUS Corso di Abilità Informatiche Laurea in Fisica

Inoltrare un messaggio.

Transcript:

Obiettivi Guida alla Quinta Esercitazione curata da Ilaria Casale Dopo aver svolto questa esercitazione si sarà appreso come: Usare un LCD conoscendo le funzioni utili a visualizzare scritte o numeri; Comprendere come sia possibile far comunicare due apparati mediante tecnica bit-banging. Realizzare alcuni dimostrativi, quali un cronometro che mostri sul display il tempo che scorre con risoluzione di un decimo di secondo. LCD (Liquid Crystal Display) alfanumerico Gli LCD utilizzati si dicono alfanumerici in quanto non sono di tipo grafico, si orientano i vari pixel in modo che appaiano solo numeri o caratteri. Ne esistono di vari tipi, quelli che si utilizzano in questo corso hanno a disposizione due righe da 16 caratteri ciascuna. Per il loro corretto utilizzo è opportuno consultare il datasheet. Nella figura qui sotto è riprodotto l'lcd utilizzato in questa esercitazione. Nella tabella che segue, invece, sono indicate le funzioni dei 16 pin con cui l'lcd potrà essere controllato. I pin del LCD sono numerati da 1 a 16 da sinistra verso destra. Il pin 1 è per il collegamento a massa, il pin 2 è per l alimentazione che deve essere intorno ai 5V. Tra queste due connessioni è presente un terzo terminale, posizionato nel pin 3 utile per regolare il contrasto. Poi vi sono i segnali di controllo: RS è il segnale che ci permette di selezionare il tipo di registro. 1

(L'LCD stesso è pilotato mediante un microcontrollore interno dedicato, a cui devono essere mandati dei comandi, che andranno ad essere memorizzati nel COMAND REGISTER, oppure dei dati, come il codice di un carattere, che andranno a finire sul DATA REGISTER. Questi due registri sono selezionati con il pin 4) R/W per poter leggere o scrivere dati in memoria. In questo corso verrà utilizzato solo in scrittura, quindi viene connesso sempre a massa mandando uno 0 logico. (Nel LCD c è quindi una memoria da 80 byte, più grande dei 32 caratteri che si possono visualizzare) Pin 6, Enable, solo se questo è attivo ciò che si invia viene effettivamente caricato nel data bus. Il DATA BUS è costituito dai pin dal 7 al 14, linee di dati bidirezionali che come già detto in questo corso verranno utilizzate solo in scrittura. Infine i pin 15 e 16 sono rispettivamente l anodo e il catodo del LED per la retroilluminazione del display, a cui vanno applicati 4,2V, cioè, funziona sempre in corrente, ma non è necessario collegare un resistore in serie essendo già al suo interno. Un altra cosa fondamentale da conoscere per utilizzare correttamente un LCD è il set di caratteri che esso è in grado di visualizzare in base alla ROM interna che possiede. La figura che segue indica il set di caratteri presente nella maggior parte degli LCD del tipo usato per le nostre esperienze. 2

Nella parte più a destra sono presenti i caratteri più strani. Sulla sinistra si trovano i caratteri alfanumerici d interesse, di cui solo i numeri e le lettere coincidono con il codice ASCII (si pronuncia come le parole inglesi as key). La tabella indica con le righe i 4 bit meno significativi e con le colonne i più significativi relativi allo specifico carattere. Operazioni di scrittura di dati e comandi Riassumiamo qui di seguito quale sia il protocollo di comunicazione tra i due apparati che abbiamo a disposizione: il microcontrollore LPC1769 e l'lcd. Come già riferito la comunicazione avviene attraverso un bus di tipo parallelo a 8 bit. Il bus di controllo invece è a 3 bit. Quando nel microcontrollore è assente la sezione hardware che implementi il protocollo di comunicazione, è necessario emulare l'interfaccia utilizzando la periferica GPIO. Diversi pin della GPIO saranno usati per inviare (o anche ricevere) le informazioni verso l'apparato di destinazione. Il protocollo di comunicazione viene emulato rispettando la tempistica che il dispositivo di ricezione richiede. La tecnica che viene quindi utilizzata in questi casi è detta 3

bit banging: in definitiva i vari bit vengono "sparati" seguendo i tempi che il protocollo prevede. Lo stato dei bit sarà determinato per via software con il codice che implementiamo nel microcontrollore, senza fare uso di alcuna periferica hardware dedicata. In definitiva, con la GPIO si emulano, per mezzo del microcontrollore, i segnali di controllo e i dati che vogliamo inviare all'apparato di destinazione. Per l'interfacciamwnto dell'lcd avremmo bisogno di 8+3 collegamenti, ma questo numero può essere ridotto. Possiamo infatti comunicare gli 8 bit di dato come due parole da 4 bit ciascuna: mandando prima i 4 bit più significativi della parola e poi gli altri 4 bit meno significativi. A discapito di un tempo di comunicazione doppio, il numero di connessioni si riduce a 7. Inoltre, per ridurre ulteriormente le linee di connessione tra micro e LCD, forzeremo il bit di controllo R/W allo zero logico (il pin 5, relativo a R/W, verrà dunque connesso a massa). In questo modo sarà possibile solo inviare dati all'lcd senza avere la possibilità di ricevere da esso alcuna informazione. Non sarà quindi possibile realizzare un'interfacciamento con handshake (stretta di mano): potremo solo inviare comandi e dati senza che il micro possa avere la possibilità di sapere se la comunicazione è andata a buon fine. La garanzia che la comunicazione possa avvenire senza errori è data dal rispetto dei tempi massimi di esecuzione delle diverse funzioni dell'lcd. Ad esempio, dal datasheet si osserva che per l istruzione di cancellazione dello schermo l LCD impiega 3 ms al massimo. Quindi, se si invia tale comando e poi si inserisce un delay di almeno 3 ms saremo certi che lo schermo è stato cancellato e l'lcd è pronto a ricevere un nuovo comando. In conclusione saranno necessari per controllare LCD solo 6 fili piuttosto che 11. Facciamo un esempio per meglio capire il funzionamento della comunicazione a 4 bit seguendo l'andamento dei segnali indicati nella figura che segue. Se si vuole scrivere nell INSTRUCTION REGISTER, quindi un comando (non un dato), si deve mettere a 0 il pin RS (per selezionare IR, 1 se si volesse Data Register), la linea R/W anch essa bassa (Write) e infine si usa l Enable per sincronizzare la scrittura del dato, una sorta di clock. Quando arriva il fronte negativo di E, ciò che è stato scritto su DB4-DB5-DB6- DB7 (a 4 bit), viene memorizzato dall LCD. La stessa cosa viene effettuata anche una seconda volta al fine di far arrivare anche i 4 bit meno significativi. Si è usato quindi sempre la stessa parte di bus. È proprio questo che permette di risparmiare 4 fili, pur raddoppiando il tempo di comunicazione. 4

5

Schemi Lo schema dei collegamenti è indicato qui sotto. La scelta di P0.23-P0.26 collegati al bus DB4-DB7 è derivata dalla semplificazione che si ha nella connessione del bus a 4 bit. Infatti, i bit DB4, DB5, DB6 e DB7 sono relativi a un codice, cioè un numero. In quanto tale, è fondamentale il peso che ha ciascun bit. Ovviamente, il peso di ogni cifra cresce andando da DB4 a DB7. Per semplificare il codice, è assolutamente necessario che i 4 bit della GPIO che utilizzeremo per scrivere sul bus DB4-DB7 siano allineati e di peso crescente. La soluzione migliore, per evitare l intrecciarsi dei fili per i collegamenti è sfruttare proprio i pin da P0.23 a P0.26, che si trovano sui pin dall'15 al 18 del connettore J2 della scheda LPCXpresso. Per i due segnali (E e R/S) sono stati scelti i pin P0.15 e P0.16, vicini ai precedenti. Ai pin 2 e 1 sono collegati rispettivamente la tensione di alimentazione di 5 V e il terminale di massa. La tensione di regolazione del contrasto è ottenuta inserendo un trimmer da 10 o 20 kω con i terminali estremi collegati rispettivamente a 5 V e a massa. Il terminale centrale va invece connesso al pin 3. Dopo aver acceso la prima volta l'lcd, il cursore del trimmer sarà ruotato finché la scritta che l'lcd dovrebbe presentare non viene letta correttamente. Nella figura riportata qui di seguito è invece indicato un possibile schema dei collegamenti che rispetta quanto indicato nello schema elettrico. 6

7

Esercizio 1 Importare il progetto Lab5a_testLCD per valutare le funzionalità dell'lcd: lanciare ( Resume ) il codice per verificare il corretto funzionamento del sistema; osservare le diverse chiamate a funzione del main per capire cosa fa ciascuna di esse; mettere in pausa l'esecuzione (eventualmente premere Step Return per uscire dalla funzione in cui si è entrati e poter tornare al main); eseguire passo-passo ( Step Into ) almeno una funzione per osservare l'annidamento delle diverse chiamate a funzione. Nella cartella src di tale progetto si trovano i file HD44780.c e HD44780.h relativi a molte funzioni utili per utilizzare questo tipo di LCD. La sigla HD44780 indica il microcontrollore integrato in quaesto tipo di display. Si osserva in particolare il.h, dove sono presenti molte istruzioni già note : Tale valore, in esadecimale, assegnato a EN indica proprio che il bit di Enable è connesso al bit16 della LPCXpresso. Analogamente per RS è stato assegnato un uno alla posizione 15 (per il pin15) Poi si nota che l istruzione che segue è l unione delle precedenti, quindi l unione dei due bit di controllo. Per questo il nome assegnato a tale valore è CTRL_BUS (CONTROL BUS): Segue poi la definizione del DATA BUS, cioè utile a configurare 4 pin come uscite. Ai bit dal 23 al 26 viene assegnato un 1: che corrispondono proprio alle connessioni verso P0.23 - P0.26. Saltando alcune definizioni simili, si osservi la definizione: 8

Quando nel main viene scritto FULL_BUS_CLEAR, il compilatore lo sostituisce proprio con l istruzione corrispondente tra parentesi graffe. Questo è utile per la portabilità. FULL BUS sono i due bit di controllo. CLEAR significa che questi vengono messi a 0. Quindi l istruzione mette nel registro FIOCLR solo quei due bit, 15 e 16 (che stanno a 1) e come già visto per tale registro, un '1' in una certa posizione farà sì che il pin corrispondente, impostato come uscita si porti allo stato basso. Uno '0' invece non ha alcun effetto. Con la seguente istruzione si vuole invece configurare l intero bus (a 6 bit) come uscita. Con FIODIR si sta dicendo alla GPIO di mettere i pin che vanno dal 15 al 23 come uscite. Questo sarà fatto attraverso la definizione: N.B. In C l espressione x = y equivale a x = x y In questo caso l operazione di OR ( ) è utilizzato permetter a 1 solo ed esclusivamente i bit d interesse, senza modificarne altri. Se si mettesse solo = infatti, tutti gli altri pin verrebbero messi a 0, ovvero come ingressi (cambiando così eventuali impostazioni precedenti). Si procede osservando le istruzioni relative agli stati voluti per selezionare un registro o l altro. Tutti i comandi appena elencati, e quelli che seguono, sono ripresi dal datasheet dell LCD. Al microcontrollore di quest ultimo devono arrivare determinati codici e proprio per questo tali comandi sono tutti a 8 bit. Infine si osservano queste due ulteriori definizioni: La prima indica che ogni volta che si scrive NUM_TO_CODE(num), con num pari al dato fornito come singola cifra decimale, il compilare lo tradurrà con num+0x30 (in esadecimale), ovvero num viene trasformato nel corrispondente codice ASCII (si osservi il codice ASCII delle cifre che vanno da 0 a 9, trovando che i codici esadecimale vanno proprio da 0x30 a 0x39). La seconda è utile per fare l operazione inversa, cioè ricavare il valore numero di una singola cifra decimale scritta come codice ASCII della stessa. Tale file prosegue con la dichiarazione di ulteriori funzioni. Tra queste si osservano ora quelle contenute nel file main.c 9

Per prima cosa nella funzione principale si trova l istruzione per l inizializzazione, cioè il reset software, dell LCD: che corrisponde quindi alla traduzione software di quanto indicato col diagramma di flusso fornito dal datasheet. Nel ciclo infinito si osservano le seguenti funzioni: Per cancellare il display, e quindi la sua memoria. La pausa di 5 ms è necessaria per i motivi precedentemente riportati circa i tempi di esecuzioni di tali istruzioni da parte dell'lcd. Per riportare il cursore all inizio della riga, all estremità sinistra. Il cursore non viene visualizzato come impostato nell INIT dell LCD. Pausa di un secondo inserita solo per osservare l'effetto del comando inviato. Infatti non è assolutamente necessaria una pausa così lunga perché il comando venga eseguito. Per scrivere una stringa, partendo dall estremità sinistra, formata dai caratteri tra virgolette. Come indica il simbolo * si sta passando alla funzione un puntatore: l indirizzo della locazione di memoria che contiene il primo elemento di un array di caratteri (elementi a 8 bit), quindi in questo caso di un vettore di 3 elementi (i tre codici ASCII delle lettere L, P e C). A questo punto la funzione autonomamente procede nel prelevare i restanti parametri. Char in C significa 8 bit ed è la lunghezza tipica dei caratteri codificati in ASCII. Il secondo parametro di questa funzione, 0, indica che tale stringa va scritta nella linea 0. (LCD utilizzato ha a disposizione la linea 0 o la linea 1, entrambe di 16 caratteri). Se la stringa supera la lunghezza consentita da una sola riga, tale funzione automaticamente va a capo e continua a scrivere sulla riga successiva. Per scrivere un solo carattere standard, come l 1 in questo caso, che va inserito tra due apici. 10

Ricordare: apici per un carattere (e WriteChar), virgolette per più caratteri (e WriteString) Per scrivere un numero si fornisce in questo caso il codice di questo (7) e come già visto per far ciò è stato definito NUM_TO_CODE(num). Per scrivere due cifre decimali. Quindi il parametro che deve essere fornito è un numero a due cifre. Tale funzione è molto utile ad esempio per orologi le cui cifre vanno di due in due. E importante sapere che il cursore ogni volta che si scrive avanza, quindi se non si da un istruzione opportuna il carattere scritto viene affiancato al precedente, procedendo da sinistra verso destra (sempre in base all'inizializzazione dell'lcd). Perciò fino all'esecuzione delle istruzioni indicate, sul display sarà visualizzata la stringa: LPC1769. Questa rimane per un secondo avendo inserito anche qui una pausa di tale valore. Successivamente si inviano: Per tornare a capo. In questo caso non si cancella, ma si sovrascrive. Per scrivere un numero decimale a n cifre. Tale funzione necessita di due parametri: il numero da visualizzare (in questo caso è stato precedentemente registrato nella variabile dummyval) e, come secondo parametro, il numero di cifre da dover visualizzare. Se ad esempio si vuole visualizzare un numero che varia tra 0 e 1000, si fornice come secondo parametro 4, e la dove ci sono gli 0 non significativi, tale funzione inserisce semplicemente degli spazi. Notare che avendo scritto 8 caratteri, questi si sovrappongono esattamente con quelli visualizzati in precedenza. A questo punto dovrà essere visualizzato sul Display: 12345678. Sarebbe perciò stato superfluo il comando di CLEAR che avrebbe fatto, in questo caso, perdere solo del tempo. Volendo ora visualizzare qualcosa che potrebbe avere una lunghezza inferiore alla scritta precedente, si procede con le istruzioni già viste di CLEAR e RETURN_HOME. 11

Si osservi in particolare l istruzione: Dove 0xDF corrisponde nella tabella dei caratteri al simbolo dei gradi centigradi. 12

Esercizio 2 Copiare e incollare Lab5a_testLCD e rinominare la copia in Lab5b_conta ; impostare TIMER1 per generare un interrupt ogni secondo; inserire nella ISR di TIMER1 l'aggiornamento di una variabile globale secondi che verrà incrementata ogni secondo; dovendo visualizzare sull'lcd il valore di secondi (ricordarsi di portare il cursore a sinistra prima del comando di scrittura del valore): eliminare tutte le funzioni superflue che sono già presenti nel main tranne quella utile a scrivere un valore decimale a più cifre; scrivere nel main il codice che permette di portare il cursore nella posizione iniziale e poi di scrivere il valore della variabile secondi a 4 cifre decimali. Si inizia dichiarando la variabile prima della funzione principale volendo che sia globale: Poi si procede, all interno del main, con l inizializzazione dell LCD e del TIMER1 : Nella ISR (all interno di timer.c) va inserito l incremento della variabile secondi. Essendo questa globale è necessario però inserire all interno di tale file l istruzione: 13

Si può a questo punto definite la funzione di gestione dell interrupt: void TIMER1_IRQHandler (void) con il relativo ciclo di if: Quindi si procede tornando al main, cancellando il display ( ) e scrivendo il ciclo infinito che ha il semplice compito di far visualizzare sull LCD il valore della variabile secondi andando di volta in volta a capo: 14

Esercizio 3: Copiare e incollare il progetto precedente e rinominare la copia in Lab5c_cronometro ; Modificare il codice del progetto precedente in modo da visualizzare sull'lcd il tempo che passa in decimi di secondo nel formato: ####.# Si vuole ottenere l incremento della variabile (ora chiamata decimi) ogni decimo di secondo. Ciò si ottiene modificando l istruzione relativa al match, nell inizializzazione del timer, dividendo per 10 il valore iniziale: All LCD devono arrivare numeri interi. Si considera quindi la parte intera di decimi (che fornisce i secondi), si inserisce il simbolo. e poi l istruzione che traduce in codice il resto della divisione di decimi per 10 (ottenendo appunto i decimi di secondo). In C il simbolo % restituisce il resto della divisione tra i due operandi. 15