il progetto - Mattia Zeni

Transcript

il progetto - Mattia Zeni
MATTIA ZENI - 130206!
!
PROGETTAZIONE DI SISTEMI ELETTRONICI
-1-
MATTIA ZENI - 130206!
!
PROGETTAZIONE DI SISTEMI ELETTRONICI
INDICE:
PROGETTAZIONE DI UNA SCHEDA ELETTRONICA...................................3
PCB E TECNOLOGIE COSTRUTTIVE...........................................................5
LA SALDATURA..............................................................................................7
SOFTWARE DI SVILUPPO.............................................................................9
!
AGGIUNTA DI COMPONENTI ALLE LIBRERIE..................................11
MICROCONTROLLORI.................................................................................16
IL PROGETTO...................................................................................................
!
DESCRIZIONE DEL FUNZIONAMENTO.............................................19
!
IL PROTOCOLLO DI COMUNICAZIONE I2C......................................20
!
SCHEMA CIRCUITALE........................................................................23
!
DESCRIZIONE DEI COMPONENTI.....................................................24
!
DESIGN DEL PCB................................................................................28
!
FILE GERBER......................................................................................30
!
BILL OF MATERIALS...........................................................................35
PROGRAMMAZIONE PIC.............................................................................36
!
AMBIENTE DI SVILUPPO MPLAB - C18............................................37
!
CODICE C.............................................................................................40
!
!
REGISTRI....................................................................................44
PUNTI CRITICI DELLA PROGETTAZIONE..................................................46
-2-
MATTIA ZENI - 130206!
!
PROGETTAZIONE DI SISTEMI ELETTRONICI
PROGETTAZIONE DI UNA SCHEDA ELETTRONICA:
SIMULAZIONE
PCB
3D VIEW
ELECTRONIC
DESIGN
SCHEMATICO
PCB DESIGN
SIMULAZIONE
CIRCUITALE SPICE
VERIFICA
COMPATIBILIT
A' EM
GENERAZION
E GERBER
FILES
PRODUTTOR
E PCB
PROTOTIPO
SCHEDA
FINALE
OTTIMIZZAZIONE
CERTIFICAZIONI
Lo schema riportato in figura riporta i passi da seguire nella fase di progettazione di
un circuito stampato.
Il primo passo da cui bisogna partire è la raccolta delle specifiche del progetto che
possono nascere da una nostra idea o possono essere fornite da una persona che
ci commissiona la creazione della scheda. Da queste specifiche bisogna disegnare
il circuito elettrico, lo schematico, che deve essere anche simulato per verificare la
presenza di eventuali errori che devono andare corretti. Lo schematico viene
generalmente creato con lʼausilio di opportuni software di simulazione come Spic*e
o nel nostro caso Multisim della National Instruments.
Si passa poi alla creazione della scheda vera e propria, ossia al posizionamento
dei componenti nelle loro dimensioni reali sulla scheda e allo “sbroglio circuitale”,
che è lʼoperazione di posizionamento delle piste di collegamento tra componenti.
Lo sbroglio può essere fatto su una faccia della scheda, su entrambe o anche
usando i cosiddetti inner-layer, ossia degli strati interni al PCB stesso. Il software da
noi utilizzato per compiere queste operazioni è Ultiboard. Anche in questo caso,
come per lo schematico è possibile effettuare delle simulazioni software: una di
queste è il rendering 3D della scheda che consiste in unʼanteprima virtuale 3D di
come diventerà la scheda una volta completata ed è utile per valutare gli ingombri
dei componenti; lʼaltra è una simulazione di compatibilità Elettromagnetica che
serve per valutare la generazione, trasmissione o ricezione non intenzionale di
energia elettromagnetica.
Se le simulazioni hanno esito positivo si può passare alla fase di generazione dei
file Gerber, che sono dei file in formato standard contenenti informazioni sulla
dimensione della scheda, sul posizionamento dei componenti e delle piste, sui fori
e sulle serigrafie, che verranno spediti al produttore per la stampa della scheda.
Se la scheda è molto semplice in genere viene richiesta subito la stampa del
numero di schede necessarie, confidando sul fatto di non aver commesso errori. Se
-3-
MATTIA ZENI - 130206!
!
PROGETTAZIONE DI SISTEMI ELETTRONICI
invece la scheda ha una certa complessità di solito viene richiesta al produttore una
sola copia chiamata prototipo.
Del prototipo di può verificare il funzionamento tramite opportune prove e
misurazioni e se qualcosa non va si può tornare indietro nelle fasi di progettazione
per correggere gli errori. Eʼ di fondamentale importanza trovare gli errori a questo
punto della progettazione perchè se dovessimo mandare sul mercato un prodotto
buggato i costi per risolvere il problema successivamente sarebbero immensi
rispetto a quello che si può spendere in questa fase.
Lʼaltra funzione del prototipo è quella di poter effettuare unʼottimizzazione. Infatti,
se vediamo che tutto funziona come dovrebbe, possiamo occuparci di trovare
soluzioni più economiche per far funzionare allo stesso modo la scheda; se infatti
vediamo di poter risparmiare anche un solo componente da pochi centesimi per
ogni scheda, se consideriamo il gran numero di copie che andremo a produrre
avremo un risparmio notevole. Per farlo si torna indietro fino allo schematico e lo si
analizza (processo di feedback).
Se tutto è stato risolto si commissiona al produttore un gran numero di schede che
andranno poi vendute.
Una cosa ulteriore possono essere le certificazioni (CE, ISO ecc) che sono
obbligatorie nel caso in cui la scheda vada venduta sul mercato.
-4-
MATTIA ZENI - 130206!
!
PROGETTAZIONE DI SISTEMI ELETTRONICI
PCB TECNOLOGIE COSTRUTTIVE:
Il PCB (Printed Circuit Board) è quel componente di un circuito elettronico costituito
da un supporto isolante elettrico e conduttore termico per dissipare il calore
prodotto dai componenti. Il materiale utilizzato è principalmente la vetronite e lo
spessore è tipicamente di 1.6mm. Questo materiale divide 2 o più strati di rame
dallo spessore variabile di 8, 35 o 70um, collegabili tra loro attraverso dei fori detti
VIA.
Sopra il rame viene posto generalmente un ulteriore strato di polimero isolante
chiamato Solder Mask che ha lo scopo di proteggere lo strato sottostante
dallʼossidazione e da possibili cortocircuiti causati da oggetti metallici venuti a
contatto con la scheda o da errate saldature. Può essere di vari colori,
generalmente Verde poichè crea un buon contrasto con il rosso del rame
sottostante, ma può essere anche Blu o Nero. Copre tutta la scheda ad eccezione
dei punti di saldatura dei componenti.
Un altro strato molto importante è quello della Serigrafia, formato da scritte, codici e
sagome dei componenti per facilitare la fase di montaggio.
Le funzioni del PCB sono principalmente 2:
- Dare supporto meccanico in modo da mantenere i componenti ben saldi in una
determinata posizione geometrica.
- Fornire il collegamento elettrico tra i vari componenti.
Esistono due tipologie di montaggio dei componenti su circuito stampato:
- THT, Through Hole Tecnology. Tecnologia che prevede lʼutilizzo di componenti
dotati di lunghi terminali metallici detti reofori da infilare
nei fori posti sulla scheda. La saldatura va fatta sul lato
opposto a quello del montaggio del componente. La
dimensione del circuito è aumentata rispetto alla
tecnologia SMT perchè i componenti sono più grossi e
perchè vengono utilizzati entrambi gli strati per un unico
componente (uno dove poggia e lʼaltro dove va fatta la
saldatura).
- SMT, Surface Mount Technology. Questa tecnologia consente il montaggio
senza la presenza si fori, consentendo quindi di alloggiare il doppio dei
componenti sulla stessa superficie. Inoltre i componenti
sono più piccoli dei corrispondenti in THT rendendo più
difficoltosa la saldatura e la sostituzione. Il numero dei
layer della scheda dipende fortemente dalla
complessità del circuito. I componenti vengono saldati
sul bottom o top layer mentre gli eventuali layer interni
(inner-layer) sono usati solo per i collegamenti
facilitando il processo di routing. I fori che collegano
-5-
MATTIA ZENI - 130206!
!
PROGETTAZIONE DI SISTEMI ELETTRONICI
diversi layer sono chiamati VIA e possono essere:
- VIA Buried: collegamento tra inner-layer
- VIA Blind: collegamento tre uno dei due layer esterni e quelli interni
- VIA Parrthrough: collegamente tra i due layer esterni
-6-
MATTIA ZENI - 130206!
!
PROGETTAZIONE DI SISTEMI ELETTRONICI
LA SALDATURA:
La saldatura a stagno è quellʼoperazione che permette il fissaggio dei componenti
al circuito stampato. In realtà è più corretto parlare di brasatura in elettronica poichè
vengono uniti tra loro materiali diversi, rame e stagno. La procedura consiste nella
fusione nel punto di contatto tra rame e componente, di una lega metallica a filo
che, raffreddandosi, permette la connessione elettrica e meccanica. Una volta
questa lega era composta al 60% di Stagno e al 40% di Piombo (SnPb) e fondeva
a circa 320°. Di recente, in base alla direttiva europea RoHS, la lega è stata
modificata per eliminare il piombo poichè si è scoperto essere nocivo. La nuova
lega è composta da stagno per la maggior parte, rame al 2% e argento allo 0.5%
(SnCuAg) e fonde a temperature più alte, circa 350-400°.
Lo strumento che ci permette di effettuare la saldatura è il saldatore. Per saldature
di precisione è consigliabile dotarsi di una stazione saldante a temperatura
regolabile in modo da poter impostare i 350° e poterli variare in condizioni di
particolare utilizzo. La punta deve essere non superiore al mm di diametro, ancora
meglio se inferiore.
Ci sono poi dei prodotti chimici come il flussante che aiutano le operazioni di
saldatura perchè rende più fluido lo stagno in modo tale da farlo aderire meglio alla
superficie interessata.
Per effettuare una buona saldatura ci sono alcune regole semplici ma importanti:
- La punta del saldatore va posta sulla piazzola in modo da scaldarla a sufficienza
da consentire al filo di stagno di sciogliersi su essa. Non va messo lo stagno
prima sulla punta del saldatore e poi fatto passare sulla piazzola.
-7-
MATTIA ZENI - 130206!
!
PROGETTAZIONE DI SISTEMI ELETTRONICI
- Altra regola è quella di non creare palline nei punti di saldatura ma cercare di
creare uno scivolo tra piazzola e componente. Se si creano delle palline è indice
di una saldatura fredda con troppo stagno.
- Bisogna mantenere la punta sulla piazzola per poco tempo, non è necessario
scaldare troppo la parte per evitare che si rovini il componente e che la saldatura
venga male.
- Tenere la punta sempre pulita, se necessario pulirla in una spugna inumidita.
-8-
MATTIA ZENI - 130206!
!
PROGETTAZIONE DI SISTEMI ELETTRONICI
SOFTWARE DI SVILUPPO:
Il pacchetto software che ci ha permesso di creare la nostra scheda è stato Circuit
Design Suite della National Instruments. I software compresi sono Multisim e
Ultiboard con cui è possibile eseguire tutte le operazioni di progettazione di un
PCB.
Multisim serve per la prima fase del progetto, quella di creazione dello schematico
e della sua simulazione Spice per verificarne la funzionalità desiderata. Eʼ fornito di
una libreria standard dei principali componenti necessari per la creazione di un
circuito elettronico. Se questi non dovessero bastare o se non soddisfano
completamente le esigenze del progettista, il software dispone di una funzionalità
che consente di creare nuovi componenti custom. Per progettare il nostro circuito è
stato necessario utilizzare questa funzione per la maggior parte dei componenti.
Finito lo schematico si può esportare tutto in Ultiboard per realizzare il PCB vero e
proprio (“Transfer” - “Transfer to Ultiboard 10”). Bisogna impostare le dimensioni
della scheda e delle piste e disporre i componenti come si vuole. Anche qui cʼè una
libreria con i footprint di tutti i componenti associati a Multisim e se uno desidera
può crearne di nuovi in base alle proprie esigenze.
Si può effettuare lo sbroglio manualmente, tracciando i collegamenti nei vari layer e
posizionando i VIA, oppure utilizzare la funzione di sbroglio automatico
selezionando nel menu “Autoroute” - “Start/Resume Autorouter”. Questa funzione a
volte non riesce a completare correttamente la procedura ed è necessario
-9-
MATTIA ZENI - 130206!
!
PROGETTAZIONE DI SISTEMI ELETTRONICI
completarla a mano. Per facilitare questa case dal menu sulla sinistra, cliccando su
Layers, ci appare una lista di tutti i layer attivi sulla nostra scheda. Spuntando le
varie voci è possibili mostrare o nascondere il layer desiderato permettendoci di
avere più ordine sullo schermo e lavorare meglio.
Terminata la fase di sbroglio è importante guardare la sezione Design Rule Check
(DRC) in Ultiboard per controllare se sono state rispettate le regole assegnate. Per
esempio la larghezza minima delle piste e la distanza tra una pista e lʼaltra.
A lavoro finito si può vedere il rendering 3D della scheda (“View” - “3D View”), cioè
di come apparirà una volta montati tutti i componenti.
Lʼultimo passaggio è quello di esportare il layout in formato Gerber da inviare al
produttore della scheda che ce la stamperà.
- 10 -
MATTIA ZENI - 130206!
!
PROGETTAZIONE DI SISTEMI ELETTRONICI
AGGIUNTA COMPONENTI ALLE LIBRERIE:
Abbiamo accennato alla funzionalità dei due programmi Multisim e Ultiboard di
consentire allʼutente di aggiungere i propri componenti. Eʼ una funzione molto utile
e lo dimostra il fatto che per la nostra scheda non molto complessa la abbiamo
dovuta usare in quasi tutte le situazioni. Di fondamentale importanza per questa
procedura è lʼavere a disposizione il datasheet del componente che vogliamo
creare da cui dobbiamo prendere le informazioni sulle dimensioni e la disposizione
dei pin.
Cliccando sullʼapposito pulsante nella barra
superiore in Multisim si apre il Wizard per la
creazione dei componenti.
Nella prima schermata bisogna inserire il
Nome che vogliamo assegnare al
componente, spuntare la voce “I will use this
component for both...” e cliccare su next.
Nella schermata successiva bisogna
selezionare il numero di pin che il
nostro componente dovrà avere e
premere “Select a Footprint”. Si aprirà
una finestra in cui potremo scegliere il
footprint che avrà il nostro oggetto in
Ultiboard quando lo esporteremo.
Abbiamo la possibilità di scegliere da un
database molto ampio fornito con il programma.
In alto dobbiamo scegliere se utilizzare il “Master
Database” oppure lo “User Database” che
contiene i componenti creati dallʼutente in
Ultiboard. Possiamo utilizzare il “Filtro” per
togliere degli elementi che non ci interessano
dalla lista. Se invece vogliamo sceglierli
velocemente in base al numero di pin premiamo
il pulsante per ordinarli per numero e scorriamo
la lista. In basso a destra si può vedere la
- 11 -
MATTIA ZENI - 130206!
!
PROGETTAZIONE DI SISTEMI ELETTRONICI
preview di come appare il componente in
Ultiboard. Una volta trovato quello che va
bene alle nostre esigenze premiamo
“Select” e verremo portati ad un altro step
del Wizard dove cʼè la possibilità di
modificare la forma del componente in
Multisim, ossia nello schematico. In alto a
sinistra possiamo vedere una preview e se
non è corretta premiamo “Edit”. Potremo
scegliere di modificare le dimensioni e la
forma del componente tramite la barra nel
menù in alto, oppure decidere come
disporre i pin. Tramite la finestra sotto
invece possiamo modificare le dimensioni
dei nomi e dei numeri dei singoli pin o decidere di mostrarli o nasconderli.
Finita questʼoperazione si chiuderà la finestra e torneremo di nuovo al wizard dove
verranno presentati altri step dove non dovremo modificare niente e infine salvare il
componente.
- 12 -
MATTIA ZENI - 130206!
!
PROGETTAZIONE DI SISTEMI ELETTRONICI
Anche in Ultiboard è possibile aggiungere componenti in maniera abbastanza
semplice.
Clicchiamo sul bottone nella barra di
menù che ci consente di avviare il “Part
Wizard”. Si aprirà una finestra nella
quale dovremo innanzitutto scegliere la
tecnologia di montaggio che dovrà
avere il componente che stiamo
creando: THT o SMT. Le procedure per
le due tipologie sono praticamente
identiche, quindi descriverò solamente
quella THT. Lʼunica differenza è che
invece che fornire al programma la
dimensione dei fori sarà necessario
fornire la dimensione dei pads di
collegamento. Una volta scelta quella di
cui abbiamo bisogno premiamo “Next”.
Nella finestra successiva dobbiamo
s c e g l i e r e i l “ P a c k a g e Ty p e ” d e l
componente. che sostanzialmente
definisce la disposizione dei pin. Se non
ne siamo a conoscenza possiamo
sicuramente trovare questʼinformazione
nel datasheet oppure aiutarci con la
preview che il Wizard ci fornisce sulla
destra per ogni package.
Nello step successivo dobbiamo
indicare le dimensioni esterne del
componente, quindi lungo X, Y e Z (con
- 13 -
MATTIA ZENI - 130206!
!
PROGETTAZIONE DI SISTEMI ELETTRONICI
la voce 3D-Heigh). 3D-offset invece
indica la distanza che il componente
deve avere dalla board. La parte “Circle
pin indicator” ci permette di variare la
dimensione del cerchio presente sopra
certi componenti, non è indispensabile ai
fini della nostra analisi quindi si può
anche lasciare con i parametri di default.
Con la schermata seguente cominciamo
a modificare i pin del componente.
Possiamo definirne il diametro e la
forma (Round, Square ecc).
Successivamente possiamo scegliere il
numero dei pin e la loro disposizione,
ossia la distanza fra i pin delle 2 bancate
oppure la distanza fra pin adiacenti.
Passiamo infine allʼassegnazione dei
numeri dei pin secondo 2 ordini
preimpostati dal software.
Un aspetto molto importante di cui bisogna tenere conto è che questi ultimi passi
sui pin vengono effettuati indipendentemente su tutti i pin del dispositivo. Se,
quindi, il nostro dispositivo non ha pin disposti tutti allo stesso modo o se i pin non
hanno la stessa dimensione, non possiamo crearli dal Wizard. O meglio possiamo
creare il componente con la procedura appena descritta ma poi dobbiamo
modificarlo manualmente.
Clicchiamo quindi sullʼicona del “Database Manager” nel menu in alto, selezioniamo
il componente desiderato e clicchiamo sullʼicona “Edit”. Ora possiamo modificare la
dimensione dei singoli fori semplicemente facendo doppio click su ognuno, oppure
spostarli trascinandoli o per essere più precisi inserire la posizione che devono
avere sulla scheda sempre facendo doppio click sul foro da spostare.
Ogni pin avrà un numero (disposizione dei numeri scelta nel Wizard) e in questa
fase, se la disposizione non coincide con quella riportata sul datasheet, bisogna
- 14 -
MATTIA ZENI - 130206!
!
PROGETTAZIONE DI SISTEMI ELETTRONICI
fare molta attenzione a spostare i pin nella posizione giusta perchè se si invertono i
poi la scheda non potrà funzionare.
- 15 -
MATTIA ZENI - 130206!
!
PROGETTAZIONE DI SISTEMI ELETTRONICI
IL MICROCONTROLLORE PIC:
SENSORI
MICROCONTROLLORE
ATTUATORI
ALIMENTAZIONE
COMUNICAZIONE
TIMERS
ADC
RAM
8 BIT
DAC
REGISTRI
14 BIT
PWM
PROGRAM
MEMORY
ALU
COMP
UART
I2C
CAN
ENC
Un Microcontrollore discende strutturalmente da un microprocessore da cui eredita
la capacità di elaborare informazioni. Presenta però delle sostanziali differenze
rispetto ad un normale microprocessore, infatti il microcontrollore è un sistema a
microprocessore completo, integrato in un solo chip, progettato per ottenere la
massima autosufficienza funzionale ed ottimizzare il rapporto prezzo-prestazioni
- 16 -
MATTIA ZENI - 130206!
!
PROGETTAZIONE DI SISTEMI ELETTRONICI
per una specifica applicazione, a differenza, ad esempio, dei microprocessori
impiegati nei personal computer, adatti per un uso più generale.
Si tratta di microcontrollori RISC (Reduced Instruction-Set Computer) con
architettura Hardvard. Questo tipo di struttura dispone di due bus interni, uno per
lʼaccesso alla data memory (RAM) e uno per lʼaccesso alla program memory; la
profondità dei due bus è rispettivamente di 8 e 14 bit. La presenza di bus separati
permette prestazioni migliori rispetto allʼarchitettura classica chiamata di VonNeumann, in quanto il caricamento delle istruzioni avviene mediante un bus
dedicato, quindi istruzione e operandi vengono caricati entrambi con un solo
accesso ai bus, con un solo ciclo di macchina (altrimenti sarebbero necessari più
accessi allʼunico bus condiviso).
La loro capacità di calcolo è molto limitata e di solito eseguono lo stesso
programma (firmware) per tutta la durata del loro funzionamento. L'esecuzione
delle istruzioni è scandita da un segnale di clock, cioè un'onda quadra a frequenza
costante generata dai timer interni allʼunità stessa o tramite un oscillatore esterno,
in generale un quarzo che fornisce maggior precisione di un RC.
Comprendono la CPU che esegue un certo numero di istruzioni precaricate (RISC)
(e ognuna impiega 4 cicli di clock tranne alcune particolari che ne richiedono 8), un
certo quantitativo di memoria RAM e memoria ROM (può essere PROM, EPROM,
EEPROM o FlashROM) e una serie di interfacce di I/O standard, fra cui molto
spesso bus (I2C,SPI,CAN,LIN). Le periferiche integrate sono la vera forza di questi
dispositivi: si possono avere convertitori ADC e convertitori DAC multicanale, timer/
counters, USART, numerose porte esterne bidirezionali bufferizzate, comparatori,
PWM.
Descriviamo ora in maniera un pò più dettagliata le periferiche e il loro
funzionamento:
- MEMORIA: in generale è divisa in PROGRAM MEMORY, DATA MEMORY e
EEPROM. La Program Memory (ROM) è dove risiede il firmware che viene
eseguito dal microcontrollore; è di tipo flash e può essere riscritta un certo numero
di volte. La Data Memory invece è la RAM, ossia quellʼarea destinata ai dati come
variabili, costanti e risorse di sistema come possono esserlo alcuni registri.
Quando viene tolta lʼalimentazione questa memoria si cancella, i dati in essa
contenuti sono volatili. La Eeprom infine contiene i dati da conservare a lungo
termine, come valori massimi/minimi registrati, costanti ecc. Anche se viene tolta
lʼalimentazione i dati rimangono salvati.
- TIMER: sempre presenti, anche più per device e vengono utilizzati per generare
ritardi finiti o per la misurazione dʼintervalli di tempo.
- PORTE: costituiscono le periferiche di base per le comunicazioni da e per
lʼesterno. Possono essere configurate come ingressi o uscite digitali tramite gli
appositi registri TRIS e PORT.
- 17 -
MATTIA ZENI - 130206!
!
PROGETTAZIONE DI SISTEMI ELETTRONICI
- ADC: ad alcune porte del PIC è possibile applicare, oltre che un normale segnale
digitale, anche un ingresso analogico che, tramite la periferica ADC, viene
quantizzato e convertito in digitale. La risoluzione tipica è di 10 bit.
- PWM: permette, utilizzando un timer, di generare un segnale di comando PWM.
- COMUNICAZIONE: sono delle periferiche che consentono lʼinterfacciamento del
PIC verso altri dispositivi attraverso dei protocolli di comunicazione standard (I2C,
CAN, USB, UART ecc).
Le periferiche, per poter funzionare, devono essere correttamente configurate
tramite degli appositi registri. Si tratta di locazioni di memoria di 1byte (solitamente)
in cui ad ogni bit è associato un significato specifico.
Ogni registro ha un nome riservato e l'elenco dei registri con la loro funzione è
presente nei data-sheet.
- 18 -
MATTIA ZENI - 130206!
!
PROGETTAZIONE DI SISTEMI ELETTRONICI
IL PROGETTO:
Il nostro progetto è unʼestensione di quello presentato durante il corso. In
particolare ci siamo soffermati su una delle applicazioni disponibili per la scheda, il
joystick. Esso risultava abbastanza limitato poichè essendo presente un solo
potenziometro era possibile spostarsi lungo una sola direzione alla volta,
cambiandola premendo uno dei due pulsanti. La nostra idea è quella di creare un
joystick/mouse per computer vero e proprio, con la possibilità di muoversi
liberamente in entrambe le direzioni X e Y e addirittura anche nella terza
dimensione Z se fosse necessario, un pò come il controller del Nintendo Wii.
Per fare questo abbiamo modificato la scheda togliendo quei componenti di cui non
avevamo bisogno e aggiungendone altri.
Quelli che abbiamo rimosso sono il
riferimento di tensione, che in ogni caso
da questʼanno non sarebbe stato presente
nemmeno sulla scheda di base poiché viene
utilizzato quello interno al Microcontrollore;
gli altri componenti rimossi sono il buzzer, il
sensore di temperatura e infine il
potenziometro.
Sono stati aggiunti invece lʼaccelerometro
digitale a 3 assi MMA7455L (foto sopra) e il
circuito per alimentarlo costituito da un
LP2985 che verranno esposti in seguito.
- 19 -
MATTIA ZENI - 130206!
!
PROGETTAZIONE DI SISTEMI ELETTRONICI
IL PROTOCOLLO I2C:
Uno sguardo dʼinsieme:
Il protocollo I2C è stato ideato da Philips nel 1980 e specifica tutta una serie di
regole e convenzioni per la comunicazione fra dispositivi collegati ad un bus
costituito da due linee (più una terza che è la massa comune).
La particolarità di questo protocollo è data dal fatto che è possibile collegare sullo
stesso bus un numero elevato di periferiche, ognuna individuata da un proprio
indirizzo a 7 bit. Unʼaltra importante caratteristica è la scalabilità, ossia la possibilità
di togliere o aggiungere nuovi componenti e quindi nuove funzionalità al proprio
sistema senza modificare lʼhardware esistente.
Per quanto riguarda la velocità di trasmissione, le prime versioni del 1980
consentivano di raggiungere i 100Kbit/s, poi alzata a 400Kbit/s, fino ai 3.4Mbit/s del
1998.
Ci sono due tipi di periferiche I2C che possono interagire sul bus: il master e lo
slave.
Il Master è colui che dirige la comunicazione, colui che la inizia e la termina e colui
che invia il segnale di clock agli altri dispositivi. Lo slave invece risponde solamente
alle richieste del master.
Specifiche elettriche:
Abbiamo detto che il bus è costituito da due linee
bidirezionali: SDA (Serial Data) e SCL (Serial
Clock).
SDA è utilizzata per il transito dei dati in formato ad
8 bit mentre SCL è utilizzata per trasmettere il
clock necessario per sincronizzare la trasmissione.
Queste due linee devono essere implementate per
mezzo di uscite open collector quindi è necessario
usare una resistenza di pull-up per ogni linea.
Quindi se inutilizzate le linee sono a livello logico
alto.
Il numero di dispositivi collegabili e la lunghezza della linea dipendono dalla
capacità totale di questʼultima relazionata alla velocità di trasmissione dei dati.
Infatti allʼaumentare della capacità in un circuito RC (resistenze di pull-up e il cavo)
aumenta anche il tempo di salita, ossia il tempo che impiega il segnale a passare
dal livello logico basso a quello alto. Questo tempo influenza direttamente la
velocità di trasmissione, infatti più essa aumenta più il tempo deve diminuire.
Quindi il protocollo I2C detta una serie di specifiche elettriche che sono soddisfatte
per capacità di linea inferiori ai 400pF.
- 20 -
MATTIA ZENI - 130206!
!
PROGETTAZIONE DI SISTEMI ELETTRONICI
Queste limitazioni fanno si che il protocollo I2C sia usato per collegare dispositivi
sulla stessa board come nel nostro caso o al massimo a pochi metri di distanza.
Esistono tuttavia dei circuiti integrati come il P82B96 che permettono di
raggiungere distane molto maggiori.
Comunicazione sul bus:
Abbiamo detto che solamente i master possono avviare una comunicazione I2C. Le
fasi che devono essere seguite sono:
- Il master controlla se le linee SDA e SCL non sono attive, ovvero sono poste
ambedue a livello logico alto
- Se il bus è libero invia il messaggio che fa capire alla altre periferiche che il bus è
ora occupato (segnale di start). Le altre periferiche si mettono quindi in ascolto per
comprendere con chi il master ha intenzione di comunicare.
- Il master provvede allʼinvio del segnale di sincronizzazione sulla linea SCL, che
sarà rappresentato da unʼonda quadra.
- Il master invia lʼindirizzo della periferica con la quale vuole dialogare.
- Segnala poi se la comunicazione che vuole intraprendere verso la periferica è di
lettura o scrittura.
- Attende la risposta da parte della periferica che ha lʼindirizzo coincidente a quello
che transita sul bus. Se nessuna periferica risponde il master libera il bus.
- Dopo il riconoscimento della periferica il master inizia lo scambio dei dati che
avviene inviando pacchetti di 8 bit (1 byte). Ad ogni pacchetto si deve attendere il
segnale ACK che avvisa dellʼavvenuta ricezione.
- Quando la trasmissione è terminata il master libera il bus inviando un segnale di
stop.
Il segnale di start consiste nel portare la linea
SDA a livello logico basso quando SCL è a
livello alto. Dopo questa transizione di SDA il
Master invia il segnale di sincronizzazione per
le altre periferiche (SCL). Quando SDA non
viene utilizzata per inviare il bit di start o stop,
assume valore valido solo se la linea SCL nel
momento della transizione è a livello basso.
Cioè non sono ammesse transizioni di livello
per SDA durante il livello alto della linea SCL se non da parte del master per un
nuovo bit di start o di stop.
Gli indirizzi delle periferiche connesse al bus sono tipicamente di 7 bit (di recente
anche a 10 bit). I bit dellʼindirizzo vengono
inviati dal bit più significativo al bit meno
significativo. Per completare il pacchetto a
8 bit viene aggiunto 1 bit che indica se si
- 21 -
MATTIA ZENI - 130206!
!
PROGETTAZIONE DI SISTEMI ELETTRONICI
vuole leggere (1) o scrivere (0) dalla periferica identificata dallʼindirizzo. Lʼinvio di
questo pacchetto avviene grazie ad otto transizioni da livello alto a basso, della
linea SCL.
Al nono impulso il master aspetta una risposta di un bit da parte della periferica che
ha chiamato. La risposta consiste nel mantenere a livello basso la linea SDA per
una durata di un ciclo SCL.
Dopo lʼavvenuto riconoscimento avviene lo scambio di dati. Se si vuole leggere un
dato da un registro dellʼaccelerometro per esempio, si deve scrivere dei byte
presso la periferica per impostare lʼindirizzo che si vuole leggere e poi di potrà
effettivamente leggere il byte. Ad ogni invio di un byte sarà necessario un ACK. In
particolare se è il master che invia un byte allo slave si aspetta, dopo lʼottavo bit, un
bit basso sulla linea SDA. Viceversa se è lo slave che invia, si aspetta un bit alto
dopo lʼinvio del byte. La mancanza di ACK determina un errore di comunicazione.
Quando la comunicazione è terminata, il
master libera il bus inviando la sequenza di
stop. Questa consiste nella transizione dal
livello basso ad alto della linea SDA quando la
linea SCL è alta.
Se il master dovesse effettuare unʼaltra
comunicazione con un altro slave, invece che
perdere il diritto a trasmettere, può inviare
unʼaltra sequenza di start. Il vecchio slave
automaticamente capirà che la comunicazione con lui è terminata.
- 22 -
MATTIA ZENI - 130206!
!
PROGETTAZIONE DI SISTEMI ELETTRONICI
SCHEMA CIRCUITALE:
- 23 -
MATTIA ZENI - 130206!
!
PROGETTAZIONE DI SISTEMI ELETTRONICI
DESCRIZIONE DEI COMPONENTI:
Come possiamo intravedere dallo schematico le diverse parti del circuito che
verranno di seguito illustrate, non sono fisicamente collegate tra loro. Vengono
utilizzati dei collegamenti virtuali per avere più ordine e permettere una più facile
lettura da parte dellʼutente. Questi collegamenti vengono realizzati utilizzando le
net: se due net hanno lo stesso nome indica che sono collegate.
Nel nostro circuito ci sono delle parti che sono indispensabili al funzionamento del
circuito stesso, come il PicMicro, lʼoscillatore (anche se cʼè la possibilità di
ometterlo per sfruttare quello interno al Pic) e lʼalimentazione. Con queste parti il
Microcontrollore potrebbe già eseguire qualsiasi operazione gli viene data
programmandolo. Cominceremo a descrivere proprio queste per poi passare alle
altre.
Microcontrollore:
Il Microcontrollore PIC è sicuramente il cuore di tutta la scheda. Per questo
progetto è stato scelto il PIC18F14K50 poiché tra le sue numerose caratteristiche
ha il supporto hardware per lʼUSB. Il condensatore di by-pass C5 posto
sullʼalimentazione serve per eliminare i disturbi in prossimità del PIC. La resistenza
di pull-up R11 posta su USB D+ serve per comunicare al PC la velocità della
periferica. Eʼ presente anche un quarzo esterno XTAL1 con 2 condensatori C6 e C7
per fornire un clock molto preciso al PIC; ci sarebbe la possibilità di omettere questi
ultimi tre componenti e utilizzare il riferimento di clock interno al Microcontrollore
stesso ma visto che stiamo utilizzando una connessione USB cʼè la necessità di un
elevata precisione.
Alimentazione e USB:
La connessione USB presente sulla scheda oltre che per permettere la
comunicazione con il PC con i firmware che sono stati creati, consente anche di
programmare il PIC tramite una coppia di software che gira sia sul PIC, il
bootloader, che sul PC. Lʼaltra fondamentale funzione è quella di alimentare il
circuito stesso a 5v.
LʼUSB presenta 4 pin come possiamo vedere dallo schematico. Uno dedicato alla
massa, due sono il bus di dati D+ e D- e lʼultimo è lʼalimentazione +5v. Su questo
ultimo PIN sono posti dei componenti che nel complesso costituiscono un filtro
passa basso. Lʼinduttanza ha il compito di mantenere una corrente il più possibile
costante annullando eventuali picchi che potrebbero andare a danneggiare la
scheda. I due condensatori servono per assorbire ripple e disturbi provocati
dallʼHardware del PC che è un ambiente molto rumoroso.
Accelerometro 3D:
Il nostro progetto differisce da quello degli altri per la presenza di un accelerometro
digitale. In particolare è stato scelto il MMA7455L a 3 assi in modo da poter
- 24 -
MATTIA ZENI - 130206!
!
PROGETTAZIONE DI SISTEMI ELETTRONICI
tracciare le accelerazioni (e quindi la posizione) in 3 dimensioni. Essendo di tipo
digitale e non analogico, non utilizziamo il convertitore ADC interno al PIC per
interpretare i dati ma utilizziamo il connettore di espansione I2C.
Nella figura sopra vediamo come è stato inserito lʼaccelerometro nel nostro circuito.
I pin 1 e 6 sono lʼalimentazione e vanno quindi collegati direttamente a Vdd, nel
nostro caso 3.3v. Vengono utilizzate le due coppie di condensatori da 10uF e 0.1uF
per assorbire eventuali ripple o disturbi presenti sullʼalimentazione.
I pin 2, 3, 5, 10 e 11 sono collegati a massa; in particolare il 3 e il 10 non hanno
alcuna funzione e nel datasheet è consigliato di collegarli e non lasciarli flottanti.
Il pin 4 serve per definire il bit 0 dellʼindirizzo I2C che lʼaccelerometro avrà sul bus e
può essere posto a massa, diventando quindi 0 o a Vdd diventando 1. Questa
variazione dellʼindirizzo viene resa possibile poiché potremmo avere 2 dispositivi
identici sullo stesso bus e se non avessimo la possibilità di selezionare lʼindirizzo,
non potremmo utilizzarli entrambi. Nel nostro caso, non avendo particolari
esigenze, abbiamo deciso di collegarlo a massa.
Il pin 7 serve per scegliere quale protocollo di comunicazione digitale vogliamo
utilizzare, se SPI (0) o I2C (1). Noi, dovendo scegliere I2C, abbiamo posto il pin a
Vdd.
I pin 8 e 9 sono dedicati agli interrupt. Il Microcontrollore per consumare meno può
essere messo in sleep-mode e per risvegliarlo è necessario un evento interrupt
- 25 -
MATTIA ZENI - 130206!
!
PROGETTAZIONE DI SISTEMI ELETTRONICI
scatenato da un dispositivo esterno come il nostro accelerometro. Abbiamo
utilizzato solo il pin 8 che va collegato al pin RC0 sul Pic.
Il pin 12 serve per il protocollo SPI, quindi non è collegato.
I pin 13 e 14 sono quelli dedicati al protocollo I2C. In particolare il 13 è la linea SDA
per il transito dei dati e il 14 è SCL, il clock generato dal master (il nostro
Microcontrollore). Come detto durante la descrizione del protocollo I2C queste due
linee devono essere dotate di resistenza di pull-up.
Alimentazione accelerometro:
Come possiamo vedere dal datasheet, il MMA7455L funziona con un range di
tensioni compreso tra 2.4v e 3.6v. Non è quindi possibile utilizzare la tensione TTL
5v fornita dallʼUSB ma bisogna convertirli ad una tensione più bassa, in particolare
abbiamo scelto i 3.3v. Per realizzare questo abbassamento di tensione abbiamo 2
strade: utilizzare un regolatore di tensione lineare LP2985 oppure un regolatore
di tensione di tipo switching TPS62205.
Nel regolatore lineare la tensione viene abbassata tramite dissipazione, quindi
questo tipo di componente può scaldare notevolmente. Ne deriva che lʼefficienza è
molto bassa.
Il regolatore di tipo switching invece è molto più efficiente di quello lineare, si può
raggiungere anche un 95%. La tensione desiderata in uscita viene creata tramite
un segnale PWM (Pulse With Modulation) che è unʼonda quadra a frequenza fissa
ma duty-cycle variabile (rapporto tra il periodo in cui lʼonda ha valore alto e basso).
La tensione in uscita è una frazione di quella in ingresso dipendente dal duty-cycle,
pertanto è possibile ottenere in uscita valori di tensione compresi tra 0v, fino a Vin
(duty-cycle rispettivamente di 0% o 100%).
Diciamo che la prima soluzione ha come vantaggio la semplicità e il basso costo
mentre la seconda ha come vantaggio lʼefficienza a discapito della complessità e
del costo maggiore. Solitamente vengono usati regolatori di tipo switching in quelle
applicazioni in cui la differenza fra le due soluzioni è notevole in termini di sprechi.
Nel nostro caso, visto le basse correnti in gioco, la potenza sprecata dal regolatore
lineare non è tale da giustificare la spesa per uno switching quindi abbiamo scelto il
LP2985. I condensatori anche qui servono per assorbire ripple e disturbi che
possono transitare sullʼalimentazione in ingresso al componente e sulla tensione
fornita in uscita.
Interruttori:
Nella nostra scheda sono presenti due interruttori per ricreare il tasto destro e
sinistro del mouse. Il circuitino per realizzarli è molto semplice: il pulsante chiude il
circuito composto da una resistore da 150Kohm più un condensatore da 100nF che
serve a stabilizzare la tensione in uscita.
- 26 -
MATTIA ZENI - 130206!
!
PROGETTAZIONE DI SISTEMI ELETTRONICI
Porta di programmazione ICSP:
La nostra scheda è dotata anche di una porta a 5 pin per programmare il
Microcontrollore solo la prima volta, tramite un opportuno programmatore PicKit 2.
Durante questa fase viene caricato nella prima locazione di memoria il bootloader,
un particolare firmware che, tramite una serie di comandi decisi in fase di
programmazione (nel nostro caso bisogna tenere premuto un tasto durante la fase
di alimentazione), permette di effettuare tutte le successive riprogrammazioni
tramite la porta USB di cui la scheda è dotata.
Test Point:
Nella scheda sono stati implementati tre punti chiamati test-point nei quali, tramite i
puntali di un multimetro, è possibile verificare che le tensioni utilizzate dai vari
componenti siano effettivamente quelle desiderate. In particolare noi abbiamo
scelto +5V che è lʼalimentazione del Microcontrollore, +3.3V che è lʼalimentazione
dellʼaccelerometro e GND che è la massa comune a tutti i dispositivi montati sulla
scheda.
- 27 -
MATTIA ZENI - 130206!
!
PROGETTAZIONE DI SISTEMI ELETTRONICI
DESIGN DEL PCB:
Terminato lo schematico si passa alla progettazione vera e propria del PCB con
Ultiboard. Da Multisim andiamo nella voce del menu “Transfer” e selezioniamo
“Transfer to Ultiboard...”.
Si aprirà così Ultiboard con la sagoma si una board e i footprint che abbiamo
assegnato ai nostri componenti. Come vediamo vengono posti tutti in fila nella
parte superiore della scheda e sarà nostro compito posizionarli nella posizione
corretta.
Il primissimo passaggio da fare è quello di selezionare nel menu a discesa in alto il
Board Outline Layer e fare doppio click sul bordo della scheda (in giallo) per
poterne impostare le dimensioni. Infatti così come ci viene presentata, la scheda ha
delle impostazioni di default che a noi non vanno bene. Impostiamo quindi 74 x 35
mm.
Ora dobbiamo semplicemente prendere i singoli componenti e disporli sulla board
in base alle nostre esigenze. Ci sarebbe anche la funzione di auto-posizionamento
ma è meglio farlo manualmente poichè il software cerca solamente di occupare il
minor spazio possibile.
I componenti vanno poi collegati con la procedura di routing. Anche in questo caso
lo si può far fare in automatico al programma o decidere di farlo manualmente
tracciando le singoli piste (consigliato).
- 28 -
MATTIA ZENI - 130206!
!
PROGETTAZIONE DI SISTEMI ELETTRONICI
Ed ecco il rendering 3D della scheda finita fatto direttamente dal software Ultiboard.
La parte superiore TOP:
E quella inferiore BOTTOM:
- 29 -
MATTIA ZENI - 130206!
!
PROGETTAZIONE DI SISTEMI ELETTRONICI
FILE GERBER:
Lʼultima fase è quella di generazione dei file Gerber che dovranno poi essere
spediti al produttore di schede. Il risultato dellʼesportazione per il nostro progetto è
la seguente:
Copper TOP
Copper BOTTOM
- 30 -
MATTIA ZENI - 130206!
!
PROGETTAZIONE DI SISTEMI ELETTRONICI
Serigrafia
Solder Mask TOP
- 31 -
MATTIA ZENI - 130206!
!
PROGETTAZIONE DI SISTEMI ELETTRONICI
Solder Mask BOTTOM
Il materiale protettivo verrà posto dove NON ci sono i simboli nelle due immagini
della Solder Mask, sul bianco praticamente.
Abbiamo fatto anche il file Gerber per i fori. Qui sotto vediamo la tabella nella quale
vengono riportati tutti i fori presenti sulla scheda con le dimensioni, la forma e la
quantità:
- 32 -
MATTIA ZENI - 130206!
!
PROGETTAZIONE DI SISTEMI ELETTRONICI
Infine presentiamo lʼimmagine riassuntiva con tutti i Gerber sovrapposti:
Siccome molti footprint non erano presenti in Ultiboard abbiamo dovuto crearli da
zero (procedura descritta sopra). Abbiamo quindi preso le informazioni dal
- 33 -
MATTIA ZENI - 130206!
!
PROGETTAZIONE DI SISTEMI ELETTRONICI
datasheet di ogni componente e le abbiamo inserite nel programma. Prima di
mandare le schede in stampa è bene però verificare che i footprint combacino
realmente con i componenti reali altrimenti poi è molto difficile correggere un errore
del genere. Abbiamo stampato quindi la Solder Mask Top e Bottom su un foglio di
carta con dimensione del 100% e abbiamo verificato che i pin dei componenti
combaciassero perfettamente. Come vediamo dalla foto è tutto corretto e possiamo
procedere allʼinvio dei Gerber al produttore.
- 34 -
MATTIA ZENI - 130206!
!
PROGETTAZIONE DI SISTEMI ELETTRONICI
BILLS OF MATERIALS:
La Bills of Materials è la “lista delle spesa” dei componenti utilizzati per creare la
scheda. Viene riportata una breve descrizione, lʼidentificativo del componente sul
circuito, la quantità, il codice Farnell e il prezzo.
Description
ID
Quantità
Codice Farnell
Prezzo
Unitario €
Prezzo
€
Inductor, 1mH
L1
1
1174052
0,24
0,24
Capacitor, 100nF
C1, C5, C9, C12, C13,
C14, C17, C18
7
1740614
0,032
0,224
Capacitor, 470nF
C8
1
1327682
0,197
0,197
Capacitor, 10uF
C2, C15, C16
3
1759136
0,043
0,129
Capacitor, 4.7uF
C19
1
1719419
0,029
0,029
Capacitor, 22pF
C6, C7
2
1759057
0,009
0,018
Resistor, 470ohm
R5, R6
2
1692528
0,019
0,038
Resistor, 4.7Kohm
R12, R13
2
1469807
0,033
0,066
Resistor, 150Kohm
R4, R8, R11
3
9331824
0,015
0,045
PIC18F14K50
U2
1
1648501
2,59
2,59
MMA7455L, accel.
U1
1
1605506
5,73
5,73
LP2985
U4
1
1053672
1,13
1,13
Led Red, 3mm
DL1
1
1780709
0,32
0,32
Led Green, 3mm
DL2
1
1780710
0,36
0,36
Quarzo, 6Mhz
XTAL1
1
1640865
1,66
1,66
USB, Type B
J1
1
1421766
1,98
1,98
Espansione, I2C
J4
1
-
-
-
Espansione, ICSP
J2
1
-
-
-
Pulsanti
SW1, SW2
2
1555982
0,117
0,234
TOT
33
- 35 -
14,99
MATTIA ZENI - 130206!
!
PROGETTAZIONE DI SISTEMI ELETTRONICI
PROGRAMMAZIONE PIC:
Abbiamo già accennato al fatto che solitamente i Microcontrollori PIC eseguono lo
stesso programma (firmware) per tutta la durata del loro funzionamento.
La programmazione del firmware è la parte conclusiva del processo di
progettazione della scheda. Una volta che il PIC viene messo in condizione di
operare, ossia gli vengono forniti tutti i collegamenti elettrici necessari, deve essere
programmato per eseguire un certo numero di istruzioni.
La programmazione viene fatta tramite dei compilatori appositi che generano il
file .hex in codice macchina da scrivere direttamente sul PIC con lʼausilio del
programmatore. Si possono utilizzare diversi linguaggi, quello predefinito e più
potente è sicuramente lʼassembler, mentre noi abbiamo deciso di utilizzare C che è
sicuramente più intuitivo e consente di effettuare anche operazioni abbastanza
complesse con poche righe di codice.
- 36 -
MATTIA ZENI - 130206!
!
PROGETTAZIONE DI SISTEMI ELETTRONICI
AMBIENTE DI SVILUPPO MPLAB - C18:
L'ambiente di sviluppo è un software che permette di creare e sviluppare
programmi con estrema facilità. Integra le funzionalità di:
- Editor di testo, che riconosce il linguaggio utilizzato evidenziando le keyword e
semplificando il posizionamento delle parentesi.
- Dispone di un compilatore che può essere invocato direttamente cliccando
sull'icona "build".
- La maggior parte degli ambienti di sviluppo offrono anche la possibilità di
debuggare il codice .
- Per concludere, gli ambienti più sofisticati offrono la possibilità di conoscere in
tempo reale lo stato di occupazione della memoria.
MPLAB-IDE è un ambiente di sviluppo proprietario della Microchip che integra tutte
le funzionalità di un ambiente classico, fornendo in più la possibilità di essere
collegato tramite programmatore al dispositivo "target" consentendo la
programmazione senza dover rimuovere il PIC dalla sua sede.
Supporta in modalità nativa l'assembler di tutte le famiglie di PIC ed è possibile
integrare nel software il compilatore C18, sempre della Microchip, per poter
programmare in C.
Cʼè la possibilità di utilizzare anche altri compilatori C come CCS, HI-TECH C ecc.
È sufficiente specificare nella fase di creazione di un nuovo progetto quale
compilatore si desidera utilizzare e indicarne in percorso dʼinstallazione.
C18 è molto indicato alla programmazione dei PIC perché sono disponibili un vasto
numero di librerie pre-compilate, fornite dalla Microchip stessa, con una dettagliata
guida che spiega ogni funzione, in modo da permettere allo sviluppatore di
dedicarsi con più attenzione al proprio firmware senza pensare ai dettagli.
Noi in particolare abbiamo usato le librerie per lʼinterfaccia USB e quelle per lʼI2C.
Vediamo brevemente come si fa a creare un nuovo progetto:
Una volta aperto Mplab, andiamo su “Project” - “Project Wizard” nella barra dei
menù. Come prima cosa il software ci fa scegliere il nome del PIC che andiamo ad
utilizzare. È un passo fondamentale perché, a seconda del microcontrollore
selezionato, il programma si imposta in maniera differente: per esempio viene
caricato automaticamente nel progetto il file .lkr (file linker che contiene
informazioni su come legare, connettere i file oggetto e librerie); oppure è possibile
verificare attraverso unʼinterfaccia grafica come sono stati configurati tramite codice
i registri del PIC (“Configure” - “Configuration Bits”).
- 37 -
MATTIA ZENI - 130206!
!
PROGETTAZIONE DI SISTEMI ELETTRONICI
Nella schermata successiva bisogna specificare il compilatore che si vuole
utilizzare, nel nostro caso C18, ed indicheremo il percorso dei file che ci viene
richiesto. Poi basta inserire il nome del progetto e il percorso di salvataggio.
- 38 -
MATTIA ZENI - 130206!
!
PROGETTAZIONE DI SISTEMI ELETTRONICI
Lʼambiente di sviluppo a progetto creato apparirà come nella seguente figura:
Nel riquadro di sinistra vediamo tutti i file che appartengono al progetto divisi per
tipo: i file .c e gli header .h.
Nella schermata centrale invece abbiamo lʼeditor di testo dove possiamo modificare
i file che compongono il progetto. Una volta terminato il codice possiamo compilare
selezionando “Project” - “Build all”.
Nella parte sotto invece cʼè una finestra “Output” dove viene riportato il log del
compilatore con eventuali errori.
- 39 -
MATTIA ZENI - 130206!
!
PROGETTAZIONE DI SISTEMI ELETTRONICI
CODICE C:
Questa è la parte di codice che più ci interessa. Ci sarebbero da descrivere anche
tutte le funzioni che consentono di inviare i dati attraverso lʼUSB o le funzioni
dellʼaccelerometro ma, visto che il corso è di progettazione hardware, lʼidea era
quella di dare solo una rapida panoramica di come funziona il firmware senza
entrare nei dettagli.
void JoystickTask(void)
{
!
int pot;
!
int i;
!
int u_read_val_x, u_read_val_y;
//!
int u_read_val_z;
!
BOOL send_reset = FALSE;
In questa prima parte del codice vengono dichiarate tutte le variabili necessarie al
programma, in particolare, pot è quella in cui viene riportato il valore della lettura
del potenziometro mentre in u_read_val_x/y/z vengono memorizzati i valori dei 3
assi dellʼaccelerometro.
MMA_settings(MMA_MODE_MEASURE | MMA_GLVL_2G | MMA_SELF_TEST_OFF |
MMA_DATA_READY_NOT_OUT);
Questa funzione va a scrivere nel registro numero 16, Mode Control Register.
Stabilisce il modo di funzionamento dellʼaccelerometro, in questo caso lo mette in
modalità misura, stabilisce che la sensibilità di misura deve essere 2g (sono
disponibili 2g,4g,8g) e disabilita il test, usato per verificare lʼintegrità della parte
meccanica ed elettrica.
i = 0xFF;
//255
while (!MMA_data_ready())
{
!
Delay1KTCYx(1);
i--;
- 40 -
MATTIA ZENI - 130206!
!
!
if (!i) // evita loop infiniti
!
{
PROGETTAZIONE DI SISTEMI ELETTRONICI
!
!
M M A _ s e t t i n g s ( M M A _ M O D E _ S TA N D B Y | M M A _ G LV L _ 2 G |
MMA_SELF_TEST_OFF | MMA_DATA_READY_NOT_OUT);
!
!
Delay100TCYx(10);
!
!
return;
!
}
}
Questa parte verifica che non ci sia un dato pronto per essere letto nellʼapposito
registro numero 9, Statur Register tramite la funzione MMA_data_ready(). Finchè
non è presente mette lʼaccelerometro in Standby per risparmiare energia.
!
u_read_val_x = MMA_get_x_axis_8b();
!
u_read_val_y = MMA_get_y_axis_8b();
//!
u_read_val_z = MMA_get_z_axis_8b();
!
MMA_settings(MMA_MODE_STANDBY | MMA_GLVL_2G | MMA_SELF_TEST_OFF |
MMA_DATA_READY_NOT_OUT);
Se il dato è presente invece lo legge dai registri appositi tramite le funzioni
MMA_get, in particolare il numero 0 per la X, 2 per la Y e 4 per la Z. La funzione
finale serve per mettere lʼaccelerometro in standby.
pot = ReadPOT();
if (old_pot != pot)
{
!
old_pot = pot;
}
Viene letto il valore del potenziometro tramite la funzione ReadPOT() e viene
salvato nella variabile pot. Il ciclo serve per rilevare la presenza di cambiamenti
nella posizione del potenziometro.
!
- 41 -
MATTIA ZENI - 130206!
!
PROGETTAZIONE DI SISTEMI ELETTRONICI
ToSendDataBuffer[0] = (int)((pot / 4) - 0x80);
ToSendDataBuffer[1] = (int)((u_read_val_x / 4) - 0x80);
ToSendDataBuffer[2] = (int)((u_read_val_y / 4) - 0x80);
ToSendDataBuffer[] è un vettore che serve per inviare i dati sullʼUSB. Noi ne
modifichiamo solamente i prima 4 valori (da 0 a 3). In particolare il valore [0] è
quello assegnato al Throttle sul joystick, che assegnamo quindi al potenziometro.
[1] è lo spostamento del cursorse lungo lʼasse X quindi lo associamo alla lettura
dellʼasse X dellʼaccelerometro. [2] vale lo stesso discorso di [1] ma per lʼasse Y. Il
[3] infine viene presentato in seguito e indica i pulsanti.
while (SwitchUpIsPressed()
{
!
ToSendDataBuffer[3] = 0x01;
!
send_reset = TRUE;
}
while (SwitchDownIsPressed())
{
!
ToSendDataBuffer[3] = 0x02;
!
send_reset = TRUE;
}
Dei cicli che individuano quando i pulsanti sono premuti e indicano nella posizione
3 del vettore ToSendDataBuffer quale pulsante è premuto.
USBInHandle = HIDTxPacket(HID_EP, (BYTE *)&ToSendDataBuffer[0], 4);
Funzione della libreria USB che invia i dati al PC. Come preannunciato vediamo
che invia proprio il vettore ToSendDataBuffer, in particolare viene indicata lʼarea di
memoria dove inizia il vettore e quante celle successive deve inviare, nel nostro
caso 4 (i primi 4 elementi del vettore, da 0 a 3).
- 42 -
MATTIA ZENI - 130206!
!
PROGETTAZIONE DI SISTEMI ELETTRONICI
if (send_reset)
{
!
Delay10KTCYx(120);!// delay 250 ms
!
ToSendDataBuffer[3] = 0x00;
!
USBInHandle = HIDTxPacket(HID_EP, (BYTE *)&ToSendDataBuffer[0], 4);
}
}
Questo ciclo posto alla fine resetta il valore del pulsante, in particolare premendo
uno dei 2 abbiamo detto che il vettore ToSendDataBuffer in posizione 3 assume il
valore corispondente, se non ci fosse questo ciclo è come se rimarrebbe sempre
premuto.
ANSELHbits.ANS10 =0;
Molto importante è questʼimpostazione dei bit di configurazione. Infatti questo PIN,
RB4, è impostato di default come ingresso analogico (nel registro ANSELH, bit
ANS10 = 1). Se non viene modificato, in ingresso viene visto dal controllore sempre
un valore logico alto. Infatti in uscita era già impostato digitale e sullʼoscilloscopio
vedevamo correttamente le forme dʼonda dellʼI2C ma il Joystick non funzionava.
- 43 -
MATTIA ZENI - 130206!
!
PROGETTAZIONE DI SISTEMI ELETTRONICI
REGISTRI:
Durante la programmazione del PIC abbiamo incontrato la necessità di dover
impostare alcuni registri. È unʼoperazione molto semplice ma che la prima volta può
presentare qualche difficoltà.
I registri sono locazioni di memoria da 1 byte, in cui ad ogni bit è assegnato un
significato specifico, che servono a configurare le varie periferiche hardware
presenti nel microcontrollore.
Tutti i registri sono presenti nel datasheet del PIC dove sono spiegate le funzioni
dei singoli bit e dove è indicato quali bit sono solo in lettura o in scrittura/lettura.
Prendiamo per esempio il registro ADCON0, che fa parte della periferica ADC
(Analog-to-digital converter). Cercandolo sul datasheet troviamo tutte le
informazioni necessarie alla sua configurazione:
- Intanto vediamo che solo i primi 6 bit (0-6) sono utilizzati. In altri casi può
essere che tutti i bit siano utilizzati.
- Tutti i bit sono sia leggibili che scrivibili.
- Di default sono tutti impostati a zero.
- Passiamo alla descrizione dei singoli bit:
o Il bit 0 ADON se impostato ad 1 abilita la conversione A/D altrimenti la
periferica è spenta, non avviene conversione, e non cʼè consumo di
corrente.
o Il bit 1 quando a 1 indica che la conversione è ancora in progresso,
quindi mettendo un ciclo su questo bit non si rischia di leggere il valore
a conversione in corso. A 0 indica conversione terminata.
o I bit da 2 a 5 indicano quale canale analogico si vuole utilizzare, la
tabella dei valori da inserire è riportata sul datasheet.
Adesso passiamo allʼassegnazione dei valori dei registri nella fase di
programmazione. Esistono 3 modi per assegnare i valori ai registri:
- Possiamo farlo in esadecimale, quindi per esempio, ADCON0 = 0xC0 dove
0x indica che il valore successivo è in esadecimale. Per capire che valore in
binario abbiamo scritto si fa così:
o In esadecimale si conta 1 2 3 4 5 6 7 8 9 A B C D E F che convertite in
decimale sono da 1 a 15. Per convertire è più comodo passare per il
sistema decimale. La prima cifra dopo 0x rappresenta la posizione 161
mentre la seconda 160. Bisogna moltiplicare questi ultimi 2 per il valore
corrispondente presente nelle 2 posizioni dopo 0x. Per esempio 0xC0
- 44 -
MATTIA ZENI - 130206!
!
PROGETTAZIONE DI SISTEMI ELETTRONICI
bisogna fare C*161+0160. Siccome C in decimale vale 12 in totale
abbiamo 16*12+0*16=192 in decimale.
o A questo punto convertiamo il valore decimale in binario e troveremo
gli 8 bit da assegnare al registro.
-
-
Lʼalternativa è assegnare i valori direttamente in binario. Per farlo si usa la
sintassi ADCON0 = 0b10101010 dove 0b appunto indicano la “modalità”
binaria.
Oppure si può fare lʼassegnazione bit per bit usando nome_registro.nome_bit
= valore quindi per esempio ADCON0.ADON = 1.
- 45 -
MATTIA ZENI - 130206!
!
PROGETTAZIONE DI SISTEMI ELETTRONICI
PUNTI CRITICI DELLA PROGETTAZIONE:
Scritto il firmware sulla scheda, lʼaccelerometro sembrava non funzionare. Allora
abbiamo verificato il codice, e cambiato la parte inerente il timing. È stato
necessario modificare lʼimpostazione dei Delay_ nella libreria I2C. Infatti quelli
presenti non erano adatti al clock impostato sulla nostra scheda. Abbiamo verificato
sul datasheet nella sezione Oscillator Module la frequenza di lavoro della CPU
partendo dal nostro quarzo esterno di 6Mhz. La frequenza risultante, venendo
moltiplicata per 4 è di 24Mhz, ma essendo necessari 4 passi per effettuare un
operazione, le singole operazioni hanno frequenza di 6Mhz.
Dopo questa modifica cʼera ancora qualche problema, ma non trovando errori
evidenti nel codice abbiamo collegato le linee allʼoscilloscopio per verificarne il
funzionamento. Si vedeva chiaramente il transito dei dati, questo vuol dire che la
comunicazione sulle due linee avveniva correttamente. Lʼunico problema poteva
essere la lettura dei dati da parte del pic. Infatti, il pin assegnato alla linea SDA
coincideva anche con uno degli ingressi analogici del Microcontrollore e aveva di
default la funzione di lettura di un segnale analogico e per questo il dato veniva
visto sempre alto. Come spiegato nella parte del codice è stato sufficiente
modificare il registro opportuno.
- 46 -
MATTIA ZENI - 130206!
!
PROGETTAZIONE DI SISTEMI ELETTRONICI
Lʼoscilloscopio quindi ci ha permesso di visualizzare la comunicazione sulle due
linee.
La prima immagine mostra un aspetto fondamentale che ci ha permesso di capire
che la comunicazione avveniva correttamente: la presenza dellʼACK, quellʼimpulso
che invia lo slave al master nel momento in cui ha ricevuto il messaggio. In
particolare il master rilascia la linea, facendola diventare alta (per il pull-up) e lo
slave appena la vede alta la riabbassa.
In questa seconda immagine vediamo i 3 blocchi di 8 bit che rappresentano le
istruzioni del master. Dopo il bit di start viene inviato il primo byte che contiene
lʼindirizzo del dispositivo slave e se siamo il lettura o scrittura, il secondo contiene
lʼindirizzo del registro, mentre il terzo contiene lʼinformazione da scrivere, se
necessario. Il master invia una richiesta e poi attende, controllando lʼapposito
registro (inviando cioè altre richieste di lettura) quando il dato è pronto per la
lettura.
Il risultato finale è stato molto positivo, il Joystick risulta molto preciso, anche per
quanto riguarda la posizione di equilibrio che coincide proprio con 0,0.
- 47 -