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 -