26
Simone Buso - Microcontrollori e DSP - Lezione 22 1 Lezione 22 Sommario Microcontrollori PIC: organizzazione e architettura. Il PIC 16F877A. Esempio di sviluppo di un voltmetro con il PIC 16F877A. Simulazione del codice con MPSIM Realizzazione della scheda e test sperimentale. Simone Buso - Microcontrollori e DSP - Lezione 22 2 Lezione 22 Materiale di riferimento 1. J. B. Peatman, “Embedded Design with the PIC18F452 Microcontroller", Prentice - Hall, 2003. 2. Datasheet del microcontrollore PIC18Fxxx, disponibile sul sito web del corso in formato pdf. 3. Datasheet del microcontrollore PIC16Fxxx, disponibile sul sito web del corso in formato pdf.

Lezione 22 - Università degli studi di Padovastatic.gest.unipd.it/~buso/mc_&_DSP_Lezioni/Lezione_22_(2_x_pagina).pdf · L’indirizzo a 7 bit interno alla pagina è invece incluso

  • Upload
    others

  • View
    4

  • Download
    0

Embed Size (px)

Citation preview

1

Simone Buso - Microcontrollori e DSP - Lezione 22 1

Lezione 22Sommario• Microcontrollori PIC: organizzazione e

architettura.• Il PIC 16F877A.• Esempio di sviluppo di un voltmetro con il

PIC 16F877A.• Simulazione del codice con MPSIM• Realizzazione della scheda e test

sperimentale.

Simone Buso - Microcontrollori e DSP - Lezione 22 2

Lezione 22Materiale di riferimento1. J. B. Peatman, “Embedded Design with the

PIC18F452 Microcontroller", Prentice - Hall, 2003.

2. Datasheet del microcontrollore PIC18Fxxx,disponibile sul sito web del corso in formato pdf.

3. Datasheet del microcontrollore PIC16Fxxx,disponibile sul sito web del corso in formato pdf.

2

Simone Buso - Microcontrollori e DSP - Lezione 22 3

Microcontrollori PICSi tratta di una famiglia molto larga di mC a 8 bit, prodotti da Microchip Technology.Recentemente, Microchip ha proposto sul mercato anche un prodotto a 16 bit,denominato dsPIC, con caratteristiche più adatte alle applicazioni di signal-processing.Il suo core business rimane comunque quello dei mC a 8 bit, per i quali detiene una quota dominante del mercato.I diversi prodotti si caratterizzano per costi molto contenuti (pochi dollari per unità, su larga scala) e estrema robustezza.

Simone Buso - Microcontrollori e DSP - Lezione 22 4

Microcontrollori PICI diversi mC della serie PIC si sono evoluti nel tempo attorno alla stessa organizzazione di base. Si diversificano per repertorio di istruzioni, disponibilità di memoria, presenza di unità periferiche e loro caratteristiche,numero di pin, tipi di package.Il core presenta sempre una organizzazionedi tipo Harvard, con memoria dati e memoria istruzioni distinte.L’architettura è di tipo RISC, con un numero di istruzioni variabile (di solito una trentina),ma che può arrivare fino a 75 (PIC18Fxxx).

3

Simone Buso - Microcontrollori e DSP - Lezione 22 5

Microcontrollori PICIn tutti i PIC il controllo è di tipo multiciclo. Le istruzioni vengono lette, decodificate e eseguite in 4 cicli di clock.La durata di un instruction cycle (IC) è cioè pari a 4 periodi dell’oscillatore esterno (la cui frequenza di solito è ≤ 20 MHz). Quasi tutte le istruzioni richiedono un solo ciclo, ossia per quasi tutte le istruzioni NC = 4.Se una istruzione richiede la modifica del program counter (e.g. salto o diramazione) viene eseguita in due cicli (i.e. NC = 8).

Simone Buso - Microcontrollori e DSP - Lezione 22 6

Microcontrollori PICNella serie 18, il controllo del processore prevede una pipeline a 2 stadi. Durante la fase di fetch di una istruzione, la precedente viene eseguita. Ciascuno stadio della pipeline opera in un IC, che è ancoralungo 4 cicli di clock. Se non ci sono conflitti nella pipeline, e.g. dovuti a istruzioni di salto oppure a istruzioni che richiedono due fasi di fetch (perché occupano due word), in ogni IC avviene il completamento di una istruzione. Gli eventuali conflitti vengono risolti comunque ricorrendo a cicli di stallo.

4

Simone Buso - Microcontrollori e DSP - Lezione 22 7

Microcontrollori PICL’introduzione della pipeline nella serie 18 ha permesso di raddoppiare la frequenza massima dell’oscillatore esterno, portandola fino 40 MHz, senza dover modificare i circuiti logici (perché una istruzione richiede ora 8 cicli di clock per essere letta e eseguita, cioè lo stesso tempo di prima).Tuttavia, siccome un IC dura 4 cicli di clock e, in assenza di conflitti, si completa una istruzione per IC, la pipeline garantisce una velocità massima di esecuzione di 10 MIPS, pari al doppio della serie 16.

Simone Buso - Microcontrollori e DSP - Lezione 22 8

Microcontrollori PICCaratteristica peculiare di tutti i PIC è la presenza di un solo registro denominato WREG.Questo fatto, che può sembrare allarmante,non è di fatto una limitazione perché i PIC permettono di gestire ogni locazione della memoria dati come se fosse un registro vero e proprio.Chiaramente, la memoria dati è, almeno in parte, di elevata qualità (SRAM interna con tempi di accesso molto bassi) in modo da non penalizzare le prestazioni.

5

Simone Buso - Microcontrollori e DSP - Lezione 22 9

Microcontrollori PICIn generale, i mC PIC dispongono di diversi tipi di memoria. Oltre alla SRAM interna, è spesso disponibile una certa quantità di memoria EEPROM (sempre interna: 64, 128, … 1024 byte), destinata alla memorizzazione dei dati e una memoria Flash per il programma (variabile da 4 a 65 kword).E’ interessante osservare che queste memorie, che sarebbero di tipo ROM, possono in realtà essere scritte o cancellate (a blocchi) anche durante il normale funzionamento del mC,grazie a circuiti a pompa di carica integrati.

Simone Buso - Microcontrollori e DSP - Lezione 22 10

Microcontrollori PICL’indirizzamento dei dati può avvenire secondo tre modalità:1. literal (a valori costanti);2. diretto;3. indiretto.

Il primo tipo è usato per operare su valori costanti, che vengono ospitati all’interno della stessa IW (⇒ limitazioni).Ad esempio, l’istruzione:

movlw 5sposta il numero 5 nel registro WREG.

6

Simone Buso - Microcontrollori e DSP - Lezione 22 11

Microcontrollori PICL’indirizzamento diretto avviene invece includendo nella IW l’indirizzo del dato da usare. Nella serie 18 è un valore su 8 bit.Per superare l’ovvia limitazione data dal poter raggiungere solo 255 locazioni, la memoria dati è suddivisa in più banchi di 255 locazioni, e esiste un registro apposito denominato BSR(Bank Select Register), che individua il banco corrente.In ogni banco, nella metà inferiore, si ritrovano i registri speciali (SFRs), mentre la parte alta è a disposizione del programmatore.

Simone Buso - Microcontrollori e DSP - Lezione 22 12

Microcontrollori PICL’indirizzamento indiretto avviene sfruttando degli appositi registri, denominati FSRx che svolgono la funzione di puntatori. Su questi registri apposite istruzioni (e.g. lfsr) caricano gli indirizzi dei dati sui quali operare.Le istruzioni che operano sui registri FSR sono poi caratterizzate dal suffisso f, come ad esempio:

movf POSTINC1, Wche sposta il dato puntato da FSR1 in WREG e poi incrementa il valore contenuto in FSR1.

7

Simone Buso - Microcontrollori e DSP - Lezione 22 13

Microcontrollori PICLa memoria programmi prevede alcuni indirizzi riservati, ad esempio (sempre nella serie 18):1. 0x0000, per il vettore di reset;2. 0x0008, per il vettore delle interruzioni

ad elevata priorità;3. 0x0018, per il vettore delle interruzioni

a bassa priorità.Il primo è l’indirizzo caricato nel PC dopo ogni evento di reset, che può a sua volta essere dovuto a diverse ragioni: alimentazione del mC, watchdog, brown-out, stack overflow,…

Simone Buso - Microcontrollori e DSP - Lezione 22 14

Microcontrollori PICIl sistema delle interruzioni prevede un numero elevato di sorgenti (fino a 17 nella serie 18), ciascuna configurabile in alta o bassa priorità (serie 18). Le interruzioni a alta priorità possono interrompere le ISR delle interruzioni a bassa priorità (nesting).Quando interviene una IR di bassa priorità le altre sorgenti a bassa priorità vengono temporaneamente mascherate. Lo stesso accade se interviene un IR di alta priorità.Il salvataggio del contesto è parzialmente automatico (i.e. solo alcuni registri chiave).

8

Simone Buso - Microcontrollori e DSP - Lezione 22 15

Microcontrollori PICLa gestione del vettore delle eccezioni è molto semplice. Di solito è sufficiente premettere al proprio codice un blocco di istruzioni del tipo:

org 0x0000; direttiva all’assemblatoregoto Main; istruzione di saltoorg 0x0008goto HiPriISRorg 0x0018goto LoPriISR

Main: …

Simone Buso - Microcontrollori e DSP - Lezione 22 16

Microcontrollori PICIl repertorio delle istruzioni è piuttosto vasto, specialmente nella serie 18. Sono disponibili istruzioni per il movimento dei dati (e.g. movf Num, W), per le operazioni aritmetiche e logiche (e.g. addlw 5), per la manipolazione dei bit (e.g. bcf f,b), istruzioni di salto, etc….Oltre alle istruzioni principali sono disponibili istruzioni che incorporano condizioni (e.g. btfss f, b) per il controllo del flusso.Le serie più semplici hanno repertori meno ricchi (e.g. la serie 16 ha solo 35 istruzioni).

9

Simone Buso - Microcontrollori e DSP - Lezione 22 17

Progetto di un voltmetro digitaleVogliamo usare il PIC16F877A per misurare una tensione variabile, mostrandone il valore,in mV, su un display a 7 segmenti con 4 cifre.Si può supporre che la tensione da misurare sia derivata dalla stessa tensione di alimentazione (VCC = 5 V) tramite partitore resistivo e sia quindi variabile tra 0 e 5000 mV.Inoltre, si può supporre che il mC sia pilotato da un oscillatore al quarzo dalla frequenza di 20 MHz. Internamente, questo si traduce in un instruction cycle di 200 ns.

Simone Buso - Microcontrollori e DSP - Lezione 22 18

Progetto di un voltmetro digitaleUna possibile organizzazione per il voltmetro può essere la seguente.• La tensione viene acquisita dal

convertitore A/D del mC, e la lettura viene convertita in mV.

• Il valore così ottenuto viene trasformato in una sequenza di cifre decimali(rappresentate secondo la codifica BCD).

• Infine, la sequenza di cifre viene visualizzata sul display, che è pilotato da una porta di uscita del mC.

10

Simone Buso - Microcontrollori e DSP - Lezione 22 19

Progetto di un voltmetro digitaleLe periferiche coinvolte nella realizzazione del voltmetro sono:1. il convertitore A/D;2. il timer.

La funzione dell’ADC è quella di acquisire il valore di tensione da visualizzare.Il timer invece viene usato per la gestione del display a 7 segmenti. E’ infatti necessario “rinfrescare”, ad una frequenza opportuna, ciascuna cifra visualizzata, in modo da garantire sia una lettura stabile che l’aggiornamento del valore visualizzato.

Simone Buso - Microcontrollori e DSP - Lezione 22 20

PIC 16F877ALe caratteristiche principali del PIC 16F877Asono:1. memoria programmi FLASH: 8 kword;2. memoria dati interna: 368 byte (SRAM);3. memoria dati esterna: EEPROM 256 byte;4. 15 sorgenti di interrupt;5. fino a 33 linee di I/O (su 5 porte);6. 3 timer e 2 moduli CAPCOM/PWM;7. 1 USART, 1 PSP, I2C;8. Convertitore A/D a 8 canali e 10 bit.

11

Simone Buso - Microcontrollori e DSP - Lezione 22 21

PIC 16F877AOrganizzazione della memoria programmi nel PIC 16F877A.Il PC ha 13 bit, quindi lo spazio indirizzabileva dagli indirizzi 0x0000 (indirizzo di reset) a 0x1FFF (8 kword appunto). L’indirizzo 0x0004 è riservato alle IR. Ogni locazione ha 14 bit.

Simone Buso - Microcontrollori e DSP - Lezione 22 22

PIC 16F877ALa memoria dati è indirizzata a banchi di 127locazioni (la metà rispetto alla serie 18). La selezione del banco avviene agendo su due bit del registro di stato detti RP0 e RP1(rispettivamente status[5] e status[6]). L’indirizzo a 7 bit interno alla pagina è invece incluso nell’opcode delle istruzioni che si avvalgono di indirizzamento diretto, o nell’FSRper quelle che usano l’indirizzamento indiretto. In quest’ultimo caso, il banco viene individuato da un bit del registro di stato, detto IRP, (status[7]) + l’ottavo bit del registro FSR.

12

Simone Buso - Microcontrollori e DSP - Lezione 22 23

PIC 16F877A

Indirizzamento dei dati diretto e indiretto

Simone Buso - Microcontrollori e DSP - Lezione 22 24

PIC 16F877AOrganizzazione della memoria dati (SRAM) nel PIC 16F877A.Sono presenti 4 banchidi 127 locazioni a 8 bit. Lo spazio indirizzabile non è continuo (i byte utili sono solo 368).Molte locazioni corrispondono a registri speciali, altre sono a disposizione del programmatore.

13

Simone Buso - Microcontrollori e DSP - Lezione 22 25

PIC 16F877A: ADCIl microcontrollore in uso dispone di un ADC a 10 bit capace di gestire fino a 8 canali di ingresso. Dal foglio tecnico del PIC apprendiamo che il convertitore si controlla configurando i due registri denominati ADCON0 e ADCON1.Il primo registro gestisce il funzionamento del convertitore, il secondo configura i canali di ingresso. Insieme concorrono a definire la velocità di conversione.Il convertitore è di tipo SAR: richiede 12 cicli del suo clock per produrre il dato.

Simone Buso - Microcontrollori e DSP - Lezione 22 26

PIC 16F877A: ADCNella nostra ipotetica organizzazione, la conversione della tensione di ingresso può avvenire a frequenza relativamente bassa.L’unico vincolo di temporizzazione che abbiamo è infatti quello di garantire un aggiornamento della visualizzazione a frequenza sufficiente(i.e. non inferiore a 20 Hz, altrimenti le cifre potebbero “sfarfallare”).Tuttavia, a valle della conversione AD sono necessarie diverse elaborazioni. E’ quindi opportuno che questa duri il meno possibile.

14

Simone Buso - Microcontrollori e DSP - Lezione 22 27

PIC 16F877A: ADCDal foglio tecnico del PIC apprendiamo che, alla frequenza dell’oscillatore esterno di 20 MHz, la più alta frequenza di clock ammessa per l’ADC è 1/32 della prima.Infatti, per produrre risultati corretti e ripetibili, è necessario che l’ADC disponga di almeno 1.6 µs per ogni bit del dato.La divisione della frequenza per 32 si ottiene fissando ADCON1[6] = 0 e ADCON0[7:6] = 10.

Simone Buso - Microcontrollori e DSP - Lezione 22 28

La configurazione dell’ADC si completa definendo il numero di ingressi attivi e la loro connessione alla porta di I/O del mC, associata all’ADC.Ponendo ADCON1[3:0]=1110, si configurano i bit della porta dell’ADC abilitando solo la connessione del pin AN0. Gli altri pin della porta rimangono disponibili come I/O digitali.La selezione del canale di ingresso avviene invece impostando i bit ADCON0[5:3] a 000. Verrà convertito sempre e solo il canale AN0.

PIC 16F877A: ADC

15

Simone Buso - Microcontrollori e DSP - Lezione 22 29

Infine, la scelta di ADCON1[7] = 1 comporta la giustificazione a destra del risultato della conversione e quella di ADCON0[0] = 1, attiva di fatto il convertitore AD. Le configurazioni finali dei registri dell’ADC sono:

PIC 16F877A: ADC

ADCON0 = 100000012

ADCON1 = 100011102

0 0 0 0 0 0 x x x x x x x x x xADRESH ADRESL

Formato del risultato.

Simone Buso - Microcontrollori e DSP - Lezione 22 30

PIC 16F877A: TimerPer gestire la temporizzazione del display possiamo usare uno dei timer (e.g. TIMER1) del mC in modalità “compare”.Il modo più semplice di procedere è fissare un intervallo di conteggio pari al periodo di rinfresco stabilito, diviso per il numero di cifre del display.In questo modo, ad ogni interruzione,corrispondente alla condizione di “compare”, potremo intervenire sul display riscrivendo la cifra corrente.

16

Simone Buso - Microcontrollori e DSP - Lezione 22 31

PIC 16F877A: Timer

Schema a blocchi dell’unità TIMER1. E’ presente un registro di prescale e uno di conteggio a 16 bit. Il modulo di “compare” interagisce con il contatore del timer.

Simone Buso - Microcontrollori e DSP - Lezione 22 32

PIC 16F877A: Compare

Schema a blocchi dell’unità “Compare”.Quando il comparatore binario scatta, è possibile agire su un pin di I/O del mC, oppure semplicemente generare una IR.

Registro di “compare”

Registro del timer

17

Simone Buso - Microcontrollori e DSP - Lezione 22 33

Una volta completata la scrittura delle quattro cifre, possiamo abilitare una nuova acquisizioneda parte del convertitore AD e procedere alla generazione delle nuove cifre, che saranno poi trasferite sul display.Supponendo di voler operare ad almeno 50 Hz(quindi con 50 conversioni al secondo), possiamo ipotizzare un valore per il registro di prescale e uno per il registro di compare.Ad esempio i seguenti valori: 280510 per il registro di “compare” e 810 per quello di prescale, generano un interruzione ogni 4.5 ms.

PIC 16F877A: Timer

Simone Buso - Microcontrollori e DSP - Lezione 22 34

PIC 16F877A: Timer

Dal datasheet del mC, apprendiamo che la configurazione del TIMER1 avviene tramite il registro T1CON. La sequenza di configurazione che scegliamo è la seguente:

T1CON = 00110001

che attiva il timer e fissa a 8 il fattore di prescale. Inoltre seleziona il clock interno e tiene spento l’oscillatore locale.

18

Simone Buso - Microcontrollori e DSP - Lezione 22 35

PIC 16F877A: Compare

Dal datasheet del mC, apprendiamo che la configurazione del modulo di “compare”avviene tramite il registro CCP1CON. La sequenza di configurazione che scegliamo è la seguente:

CCP1CON = 00001010

che seleziona la modalità “compare”, e imposta la generazione di un interrupt ogni volta che il comparatore binario scatta.

Simone Buso - Microcontrollori e DSP - Lezione 22 36

PIC 16F877A: InterruzioniIl vettore delle interruzioni del mC in esame è molto semplice. È composto infatti dalla sola locazione 0x0004. Qui dovremo collocare la nostra routine di servizio.Ogni volta che il timer segnalerà la fine del conteggio provvederemo ad aggiornare la cifra corrente.Una volta aggiornata la quarta cifra, attiveremo l’ADC per ottenere un nuovo valore e daremo corso alle varie conversioni richieste per la visualizzazione.

19

Simone Buso - Microcontrollori e DSP - Lezione 22 37

Programma voltmetro: flowchartMain:

<Configurazioni>

Loop: GOTO Loop

CMP IR< Aggiorno cifra corrente>

<Ultima cifra?>

No

<Imposto porta di uscita><Ritorno>

<Attivo ADC>

<Converto in mV>

<Converto in BCD><Ritorno>

Dato pronto

<Imposto porta di uscita>

Simone Buso - Microcontrollori e DSP - Lezione 22 38

Visualizzazione cifreLa visualizzazione della lettura del nostro voltmetro è affidata ad un display a sette segmenti a 4 cifre. Si tratta di una matrice di LED a profilo rettangolare che permette la visualizzazione di cifre decimali.Il pilotaggio di ciascuna cifra può essere fatto con una delle porte di uscita del mC, ciascun pin delle quali è in grado di erogare fino a 25 mA, (attenzione però al limite massimo di potenza!).Per pilotare il display dovremo poi creare una tabella che, data la cifra da visualizzare, indichi quali sono i LED da accendere.

20

Simone Buso - Microcontrollori e DSP - Lezione 22 39

Visualizzazione cifre

Pilotaggio di una cifra del display con una porta del mC.

Impostando un “1” su un bit della porta si ottiene l’accensione del segmento corrispondente del display. La cifra è selezionata accendendo un transistore BJT, attraverso un’altra portadel mC.

Simone Buso - Microcontrollori e DSP - Lezione 22 40

Visualizzazione cifre

Schematico del circuito per il voltmetro digitale.

21

Simone Buso - Microcontrollori e DSP - Lezione 22 41

Voltmetro: routine di conversioneQuando il convertitore AD, dopo circa 20 µsdall’attivazione, ci fornisce il nuovo valoredella tensione di ingresso, dobbiamo “tradurlo” in mV.L’FSR del convertitore AD è di 5 V, quindi il risultato della conversione a 10 bit è espresso in 1024-esimi di 5 V. Per riportarlo in mV dobbiamo quindi operare la seguente trasformazione:

Valore in mV =ADRES1024

·5000

Simone Buso - Microcontrollori e DSP - Lezione 22 42

Voltmetro: routine di conversioneNaturalmente, conviene semplificarel’espressione del rapporto di trasformazione ottenendo:

50001024

=625128

A questo punto, è essenziale che la moltiplicazione sia eseguita prima della divisione, per non ridurre drasticamente la risoluzione della nostra misura.Il nostro mC però, non è dotato di istruzioni di moltiplicazione!

22

Simone Buso - Microcontrollori e DSP - Lezione 22 43

Voltmetro: routine di conversioneLa moltiplicazione può essere realizzata in almeno due modi:1. scrivendo una routine di moltiplicazione

basata su un algoritmo del tipo di quelli visti nella lezione 5.

2. ricorrendo ad una particolare sequenza di operazioni di shift e somme.

La seconda via è percorribile solo perché il nostro moltiplicatore è costante (è e sarà sempre il numero 625). La prima soluzione è invece generica e si adatta anche a moltiplicare valori variabili (più onerosa).

Simone Buso - Microcontrollori e DSP - Lezione 22 44

Voltmetro: routine di conversioneNel codice del programma voltmetro, è stata scelta la prima via. Qui analizziamo invece la via alternativa:

625 = 512 + 64 + 32 + 16 + 1

La moltiplicazione per 625 si ottiene quindi sommando il moltiplicando a se stesso dopo uno shift a sinistra di 4 bit, poi di nuovo, dopo un ulteriore shift a sinistra, poi di nuovo, dopo un ulteriore shift a sinistra, infine ancora, dopo uno shift a sinistra di altri 3 bit.

23

Simone Buso - Microcontrollori e DSP - Lezione 22 45

Voltmetro: routine di conversioneQuesto tipo di moltiplicazione si presta molto bene a quei mC che siano dotati di un barrel shifter, come per esempio quelli basati sull’ARM7. Per i PIC, che hanno uno shifter elementare, sono più convenienti altre soluzioni. Ad esempio, con l’ARM7, la moltiplicazione in questione sarebbe stata:

ADD r1,r0,r0, LSL #4ADD r1,r1,r0, LSL #5ADD r1,r1,r0, LSL #6ADD r1,r1,r0, LSL #9

Simone Buso - Microcontrollori e DSP - Lezione 22 46

Voltmetro: routine di conversioneUn fatto cui prestare attenzione è che il risultato della conversione AD è fornito su 10 bit e quindi su due byte. Tutte le operazioni di trasformazione finora descritte dovranno quindi elaborare il dato su due byte, il che comporta qualche piccola complicazione (i riporti nelle somme, ad esempio, vanno gestiti opportunamente).Mantenere la precisione della conversione AD richiede in pratica di emulare, con il nostroprocessore a 8 bit, un’aritmetica a 16 bit.

24

Simone Buso - Microcontrollori e DSP - Lezione 22 47

Voltmetro: routine di conversioneAlla fine della trasformazione, disponiamo quindi di un dato a 16 bit che rappresenta la lettura del voltmetro in mV.Questa deve essere tradotta nella sequenza di cifre corrispondente. Ad esempio, dobbiamo passare dal numero 234510 alla stringa “2”+“3”+”4”+”5”.Per fare questo, dobbiamo in primo luogo decidere come codificare le cifre della stringa. Trattandosi solo di numeri, possiamo usare la codifica BCD.

Simone Buso - Microcontrollori e DSP - Lezione 22 48

Voltmetro: routine di conversioneQuesta permette di associare ad un numero tra 0 e 9 una codifica su quattro bit,semplicemente pari alla scrittura binaria della cifra.

BCD = Binary-Coded DecimalIl problema è allora quello di passare dal numero binario a 16 bit, che rappresenta la lettura in mV del voltmetro, ad una sequenza di byte, che rappresentano le cifre del numero in codifica BCD.Per nostra fortuna, esiste una funzione di libreria che svolge questa conversione.

25

Simone Buso - Microcontrollori e DSP - Lezione 22 49

Voltmetro: routine di conversioneLa funzione di libreria opera su un dato a 16 bit, contenuto nei registri Hbyte e Lbyte, e lo traduce in cinque nibbles (gruppi di 4 bit ospitati nei registri r0, r1 e r2), che rappresentano le cifre BCD corrispondenti. Nel nostro caso, avendo solo 4 cifre, l’ultimo byte sarà totalmente vuoto. Avremo quindi:

0 0 0 0 0 0 0 0 x x x x x x x xr2

x x x x x x x xr1r0

Cifra_1 Cifra_2 Cifra_3 Cifra_4

Simone Buso - Microcontrollori e DSP - Lezione 22 50

Voltmetro: routine di conversionePer poter pilotare il display dovremo poi estrarre le singole cifre dai registri r1 e r2 e associare a ciascuna la sequenza di bit sulla porta di uscita che corrisponde alla formazione di quella cifra sul display.Per questo usiamo una tabella. L’indice di riga per la tabella può essere la stessa codifica BCD della cifra. All’entrata nella tabella si somma al PC un incremento pari alla cifra corrente. A quella locazione dovremo aver posizionato la corrispondente sequenza di bit, da scrivere poi sulla porta del display.

26

Simone Buso - Microcontrollori e DSP - Lezione 22 51

Voltmetro: test sul simulatoreA questo punto siamo pronti per scrivere il nostro codice e testarlo sul simulatore.Il sistema di sviluppo MPLAB della Microchip incorpora infatti anche un simulatore.Si tratta di un sistema assai più semplice di quello visto per il mC LP2129. Non è dotato di interfaccia grafica per la visualizzazione dei dati elaborati e non è in grado di fornire nessun tipo di profiling.Può comunque essere utile per il debugging di un codice, permettendo di individuare quanto meno gli errori logici.