Nota non trascurabile

annuncio pubblicitario
ESEMPI D’USO DELLE ROUTINES D’UTILITA’1
Le routines di utilità viste in precedenza permettono di gestire i valori forniti dalle
periferiche interne dei processori PIC (ADC, timer,…) per convertire i numeri binari che
esse forniscono in numeri rappresentabili sui display. Questi numeri possono essere con
la virgola, positivi o negativi; però essi nascono all’interno del PIC solamente positivi, per
cui bisogna manipolarli seguendo certe regole.
Si può sperare che un linguaggio ad alto livello (BASIC, C, PASCAL) fornisca funzioni di
libreria che facciano tutto da sole, ma, ammesso che funzionino col display utilizzato, c’è
ancora il problema dell’ingombro nella memoria flash, che spesso è poca, per cui
lavorando, ad esempio, in C bisogna pure scegliere un processore che ne abbia almeno
32K.
Comunque va detto che per generare numeri con la virgola e il segno non è indispensabile
lavorare con variabili di tipo float e questo permette di diminuire lo spazio occupato in
flash.
8.1 Gli errori2
Premesso che al termine ‘errore’ associo il concetto di ‘incertezza’ usato nelle misure di
laboratorio e non quello di ‘azione sbagliata’. L’errore può essere assoluto, relativo o
relativo percentuale.
L’ errore assoluto è sempre positivo: a = |valore misurato – valore reale|.
Naturalmente non si sa qual è il valore reale ma ci sono criteri per dichiarare, comunque,
un valore massimo dell’errore assoluto, così come si può ricavare un valutazione
approssimativa del valore reale facendo la media aritmetica di molte misure.
L’errore relativo è r = a/|valore reale| dove per valore reale si intende, di solito, il
valore medio di più misure.
L’errore relativo percentuale vale: r% = 100* r
Per calcolare l’errore totale in una misura bisogna considerare tutte le sorgenti di
incertezza e applicare le regole della propagazione degli errori, che nei casi elementari
si possono riassumere in due regole:
- l’errore assoluto in una somma di grandezze è la somma degli errori assoluti di ogni
grandezza
- l’errore relativo dei prodotti o rapporti di valori è la somma dei loro errori relativi
8.2 Gestione dei valori forniti dagli ADC
Questi convertitori trasformano il valore di una tensione analogica in un numero binario.
Il valore analogico deve essere compreso in un certo intervallo che può essere 0..5V
oppure un intervallo più ridotto (per aumentare la precisione) che può essere impostato
1File
2
‘Esempi uso routines utilità .doc’
Per approfondire: J. R. Taylor - Introduzione all’analisi degli errori - Zanichelli
8.1
applicando delle tensioni di riferimento, minima e massima, a due pin dell’integrato
(tipicamente corrispondono a RA2 e RA3).
Il valore da misurare è un numero di tipo reale per cui può possedere infiniti valori mentre
il numero binario generato ha un numero limitato di valori, pari a 2 elevato al numero dei
bit del convertitore ADC. Nei PIC che usano convertitori a 10 bit, ad esempio, si hanno 210
valori compresi fra 0 e 1023 (in binario è il numero, in 2 bytes, 00000011 11111111).
E’ detta ‘risoluzione’ dell’ADC il valore di tensione in cui viene suddiviso l’intervallo tra le
tensioni minima e massima, Vimin e Vimax, dal numero dei valori binari che può generare
l’ADC. Ad esempio un convertitore a 12 bit può fornire numeri fra 0 e 2 16-1, se esso riceve
in input una tensione fra 0 e 5 Volt ha una risoluzione di (5/4095)V cioè 1,22mV, questo,
espresso con una formula dà:
[8.1]
Vimax - Vimin
R = -------------------2n-1
Dalla formula si capisce che per aumentare la risoluzione si può diminuire Vimax o
aumentare Vimin o aumentare il numero, n, di bit.
E’ chiaro che è improbabile che una certa tensione di ingresso corrisponda esattamente al
valore binario generato dal convertitore, in effetti spesso ci sarà una piccola differenza fra
il valore reale e quello teorico ottenuto, perciò si definisce ‘incertezza’ () o ‘errore di
quantizzazione’ il valore pari alla metà della risoluzione, cioè  = R/2. Naturalmente più è
alto il numero di bit dell’ADC e più si riduce questo errore.
A questi errori se ne aggiungono altri, la ‘accuratezza assoluta’ dichiarata nei dati tecnici
del processore usato e espressa in termini di ‘numero di bit meno significativi’, (ad
esempio ½ LSb). L’errore di linearità, anch’esso quando è dichiarato è espresso in
termini di ‘numero di bit’. Gli errori dovuti ai componenti del circuito esterno che
gestisce il segnale da misurare (precisione delle resistenze) che spesso supera quelli
dell’ADC.
I possibili errori di non linearità dei trasduttori (ad esempio nelle termocoppie per
misurare le temperature).
L’errore di quantizzazione, l’accuratezza assoluta e l’errore di linearità degli ADC, essendo
espressi in ‘numero di bit’, possono facilmente fornire un errore assoluto di conversione a
riconducibile a una tensione di errore di valore fisso. Invece, l’errore relativo dell’ADC (r =
= a/Vin) dipende dalla tensione di ingresso applicata per cui è variabile.
Ad esempio un ADC che ha 1LSb di accuratezza assoluta, ½ LSb di errore di linearità e
½ LSb di errore di quantizzazione ha 2 bit di incertezza totale, se questo ADC è a 10 bit e
ha Vmax=5V, Vmin=0 darà un errore assoluto a = (5/210)*2 = 9,8mV, errore il cui peso è
trascurabile se la Vin è alta, non lo è più se Vin è bassa
Altro parametro da tenere in considerazione, e sorgente di errori che possono verificarsi
con segnali rapidamente variabili, è il tempo di conversione che serve all’ADC per
generare il numero binario; ci sono tabelle che definiscono il tempo minimo per cui deve
durare la conversione per avere l’accuratezza assoluta dichiarata. D’altra parte se questo
tempo è relativamente lungo (indicativamente per i PIC è circa 20s) e la tensione di
ingresso non rimane stabile per tutto questo tempo, bisogna tenere conto anche del
circuito sample&hold (S&H) che c’è all’interno al processore, e che provvede a fissarla e
mantenerla costante per tutto il tempo della conversione. Anche il circuito S&H ha dei
8.2
tempi da rispettare precisati nei dati tecnici. Solo il rispetto di questi tempi garantisce di
ottenere l’accuratezza assoluta dichiarata dal produttore.
A questo punto bisogna anche tenere presente il teorema di Shannon che dice che
quando la frequenza massima di un segnale da campionare vale fm allora la frequenza
minima con cui devono essere effettuate le conversioni AD deve essere almeno doppia di
fm per non avere perdita del contenuto informativo del segnale.
Ad esempio se in un canale di trasmissione vocale si ha una banda lorda di frequenze del
segnale di 4KHz, le conversioni fatte dall’ADC devono ripetersi alla frequenza di 8KHz,
perciò a intervalli di tempo di (1/8000)s=125s. Va tenuto presente che in questo tempo
bisogna non solo fare la conversione ma pure gestire i numeri binari prodotti (ad es. per
salvarli in RAM) e lanciare una nuova conversione.
Di tutti gli errori che abbiamo visto bisognerebbe tenere conto per stabilire quante cifre
decimali mandare a un display. Ma, naturalmente, bisogna ancora ricordare che ci sono
errori sistematici e errori casuali.
Se un errore è casuale per aumentare la precisione basta fare ripetute misure dello stesso
valore della tensione di ingresso e, infine, calcolarne la media aritmetica.
Se un errore è sistematico (es. componenti fuori tolleranza) va ‘scovato’ e rimosso.
8.3 Esempio di calcolo delle incertezze
Trovare l’incertezza nella misura della corrente I nel seguente circuito di condizionamento
del segnale applicato a un ADC.
Tutte le resistenze hanno tolleranza dell’1%
Figura 8. 1
8.3
Incertezza data dal circuito di condizionamento
Dalla formula dell’amplificatore non invertente:
Vo=I*R1(1+(R3/R2))= I*(R1 + R1*R3/R2)
Pongo: Re1= R1*R3/R2,
Errore relativo in Re1:
valore di Re1= (0,1*11,5)/1 = 1,15 
r(Re1) = 1%+1%+1% = 3%
Errore assoluto in Re1:
a(Re1) = Re1*3% = 1,15*0,03 = 0,035
Errore assoluto in R1:
a(R1) = R1*1% = 0,1*0,01 = 10-3 
Errore assoluto in (R1 + R1*R3/R2):
Valore di
a(R1 + R1*R3/R2) =a(R1) + a(Re1) =
0,035+0,001 = 0,036
(R1 + R1*R3/R2) = 0,1 + 1,15 = 1,25
Errore relativo in (R1 + R1*R3/R2):
r(R1 + R1*R3/R2)= a(R1 + R1*R3/R2)/1,25 = 0,036/1,25
= 0,029
Errore relativo percentuale in (R1 + R1*R3/R2): r%(R1 + R1*R3/R2) =r(R1+R1*R3/R2)*100=2,9%
Essendo I = Vo/(R1 + R1*R3/R2) = Vo/1,25, ricavo l’errore relativo della corrente I come:
r(I) = r(Vo) + r(R1 + R1*R3/R2) = r(Vo) + 0,029,
dove r(Vo) è l’incertezza data dall’ADC
Incertezza data dall’ADC
La tensione Vo è applicata all’ADC che genera un errore nella creazione del numero
binario che va valutato considerando le varie cause: accuratezza assoluta, linearità,
quantizzazione. Come abbiamo visto queste permettono di determinare l’errore assoluto, e
se riconsideriamo l’esempio visto in 8.1 in cui era a=9,8mV vediamo che l’errore relativo
diminuisce all’aumentare di Vo, essendo r(Vo) = aVo)/Vo. Se, ad esempio Vo vale 0,1V
allora r(Vo)≈10mV/100mV= 0,1 = 10%. Se, invece, fosse Vo=4V allora r(Vo) ≈
10mV/4V= 0,0025 = 0,25% valore trascurabile rispetto a quello prodotto dal circuito di
condizionamento del segnale: r(R1 + R1*R3/R2) = 0,029 = 2,9%.
Si può verificare che per valori di tensioni di ingresso superiori a 1V si può arrotondare r
a 3%3.
Stabilito questo arrotondamento va detto che un valore misurato va esibito indicando,
comunque, l’errore assoluto per cui nel caso che lo strumento fornisse, ad esempio, una
tensione di 3V il valore della corrente da esibire in una relazione tecnica sarebbe:
I= (3/1,25) ± 0,03*(3/1,25) = (2,4 ± 0,07)A
3
Per tensioni inferiori sarebbe il caso di abbassare la Vmax per aumentare la precisione
8.4
Le cifre significative
Su un display di uno strumento di solito la precisione è indicata dal numero di cifre
significative esibito.
Va, perciò, osservato che se consideriamo la sola risoluzione dell’ADC potremmo esibire i
contesimi, infatti 10mV/5V=0,002 è superiore al millesimo.
Se, invece, prendiamo anche in considerazione l’incertezza data dal circuito di
condizionamento possiamo solo esibire i decimi sul display, essendo r%=3% = 0,03
8.4 Presentazione dei convertitori analogico-digitali dei PIC
Figura 8. 2
Faccio solo una presentazione della periferica, visto che cambiando il processore
cambiano anche i registri che svolgono le stesse funzioni; per maggiori dettagli vedere i
data sheet del PIC scelto.
L’ADC contenuto nei PIC (quando c’è) comprende un multiplexer analogico, un circuito
sample & hold e un convertitore analogico digitale ad approssimazioni successive.
Il multiplexer riproduce sull’unica sua uscita una tensione analogica presente su uno dei
suoi ingressi, questi ingressi fanno capo a dei pin del processore (tipicamente di RA, RB,
RC, RE) selezionabili via SW mediante dei bit del registro ADCON0 (CHS0, CHS1,… ).
8.5
I pin devono essere preimpostati come input analogici mediante dei bit del registro ANSEL
(in altri PIC è usato ADCON1).
L’uscita del multiplexer è collegata all’ingresso del convertitore che restituirà, alla fine
della conversione, un numero N in binario senza segno il cui valore segue una
proporzione diretta tra la tensione applicata Vi e un intervallo di tensione selezionabile tra
0 e 5V, oppure quello dato da una o due tensioni applicate ai pin RA3 e RA2, dette,
rispettivamente, Vref+ e Vref- .
La selezione dell’intervallo di tensioni è fatta via SW mediante due bit VCFG0 e VCFG1
del registro ADCON1.
Prendendo in considerazione un ADC a 10 bit la relazione tra la tensione di ingresso Vi, il
numero N generato e l’intervallo di tensioni è:
[8.2]
Vi – VrefN
---------------- = ------Vref+ - Vref210
Chiaramente in questa relazione Vi è l’incognita e N il dato da elaborare.
Il numero N, a fine conversione si trova in due registri ADRESL e ADRESH allineato a
destra o a sinistra4. Il tipo di allineamento si sceglie mediante il bit ADFM del registro
ADCON1.
Il circuito sample&hold ha lo scopo di mantenere fissa la tensione, presente in ingresso, ai
capi del condensatore Chold visibile in figura per consentire una corretta conversione. Chi
programma il dispositivo deve solo preoccuparsi di rispettare i tempi di acquisizione
mediante i bit ADCS0, 1 del registro ADCON0 seguendo una tabella dei data sheet.
Figura 8. 3
L’ADC per funzionare deve essere abilitato mediante il bit ADON di ADCON0, poi attivato
mettendo a 1 il bit GO/DONE. Si può prelevare il risultato o a controllo di programma o
sotto interrupt. Per farlo a controllo di programma bisogna leggere periodicamente il bit
GO/DONE per vedere quando torna a 0, questo indica il termine della conversione, allora
si può prelevare il nuovo numero generato e lanciare una nuova conversione.
Per gestire l’ADC sotto interrupt bisogna abilitarlo mediante i bit GIE e PEIE del registro
INTCON e il bit ADIE di PIE1. L’interrupt sarà lanciato dal bit ADIF del registro PIR1 e
nella routine di servizio dell’interrupt bisognerà azzerare ADIF, salvare il dato creato da
4
L’allineamento a sinistra è comodo quando si vuole già in partenza scartare i due bit meno significativi .
8.6
qualche parte in RAM, lanciare una nuova conversione col bit GO/DONE e attivare un bit
di segnalazione per il programma principale per attivare la gestione del nuovo dato.
E’ chiaro che si usano gli interrupt quando servono interventi rapidi del processore, ma
non rapidissimi. 5
8.5 Conversione di un numero binario con cambiamento di unità di misura
Vediamo come si effettua la conversione di un numero in binario senza segno in uno o più
numeri secondo una certa unità di misura.
Va tenuto presente che la determinazione dei coefficienti da usare per i calcoli è fatta
tenendo presenti le unità di misura delle grandezze, cioè le formule devono sempre essere
accompagnate dalle unità di misura che fanno da guida per questi calcoli.
Inoltre, se dovesse capitare di usare una routine di divisione, per effettuare il calcolo N/D
va tenuto presente che essa restituisce 2 numeri, un quoziente Q e un resto R, che sono
legati ai primi dalla relazione:
N
R
[8.3]
----- = Q + ----D
D
Cioè va tenuto presente che per ottenere delle cifre decimali da un resto R, esso deve
ancora essere diviso per D e che il 1° e 2° membro di questa formula, hanno la stessa
unità di misura, mentre per passare a delle cifre decimali bisogna convertire il rapporto
R/D alla unità di misura della cifra meno significativa da scrivere sul display.
Degli esempi chiariranno la situazione.
Conversione di un dato fornito da un ADC
Mi occupo solo della trattazione dell’incertezza dovuta all’ADC non di quella causata dal
condizionatore di segnale che avrebbe bisogno di una definizione precisa del circuito.
Supponiamo di dover realizzare un bilancino mediante uno strain gage (trasduttore di
forza) applicato all’ADC interno di un PIC; il convertitore fornirà al processore un dato in
binario che dovrà essere, poi, convertito in BCD o ASCII a seconda del tipo di display.
Ad esempio sarebbe pericoloso cercare di proteggere un motore da una sovracorrente causata da un blocco usando l’ADC, i
processori contengono dei comparatori di tensione che sono ancora più veloci.
5
8.7
Figura 8. 4
Supponiamo di voler fare un bilancino con una portata di 5 Kg.
Siccome l’ADC dei PIC16xx fornisce 10 bit lo strumento realizzato potrà avere al massimo
una sensibilità di 5000/210 =5000/1024 = 4,88 g.
Questo sarà da tenere presente per l’esibizione delle misure sul display: dovremo esibire
valori con 2 cifre decimali (decine di grammi). Notare che anche usando un ADC a 12 bit
non arriverei alla sensibilità del grammo ma si usa ricavare i millesimi facendo diverse
misure calcolando, poi, la media.
Dimensionamento del circuito
Il dimensionamento del circuito deve essere fatto per sfruttare al massimo la sensibilità del
convertitore. Questo si ottiene se la tensione massima di uscita dell’amplificatore Vi è
uguale a Vref+ e quella minima a Vref-.
Considero i terminali Vref+ e Vref- dell’ADC collegati a +Val e gnd, questo impone che
l’operazionale debba fornire una tensione Vi=5V per un peso applicato di 5 Kg.
Se supponiamo, ad esempio, che il trasduttore abbia un fattore di conversione K di 25v/g
l’amplificatore dovrà avere :
Vimax
5V
5
A = ------------ = -------------- = ---------------------- = 40 , dove Pmax è il peso massimo.
Vtmax
Pmax * K
5000 * 25* 10-6
Conversione del formato numerico
Fissato il valore dell’amplificazione, passiamo ora alla determinazione dei calcoli che
dovremo fare svolgere al processore per risalire dal numero binario fornito dall’ADC ai
numeri binari convertibili in BCD o ASCII da applicare al display.
I data sheet degli ADC ad approssimazioni successive (contenuti nei PIC) riportano la
proporzione che bisogna usare per effettuare i calcoli:
Vi - VrefN
------------------- = -----------  accuratezza assoluta
Vref+ - Vref210
8.8
L’accuratezza assoluta, si rileva dai dati, vale, al massimo, 1 bit meno significativo e, in
prima approssimazione, possiamo trascurarla nei nostri calcoli.
Tenendo presente che Vref- è uguale a 0 e Vimax=Vref+, possiamo passare a sostituire e
ottenere:
Vi
A*K*P
N
----------- = --------------------- = --------Vimax
A * K * Pmax
210
Essendo N il dato fornito dall’ADC, dovremo ricavare il peso reale Pr:
N
5*N
5*N
Pr = Pmax * -------- = ----------- (Kg) = --------------- (Kg)
210
210
1024
Perciò dovremo PRIMA moltiplicare il numero fornito dall’ADC per 5 e POI dividere il
prodotto per 1024.
La divisione fornirà un quoziente Q di valore compreso fra 0 e 5 (perciò è già in BCD ma
contenuto in un numero di 2bytes) rappresentante le unità di kilogrammi ed un resto R (di
2 bytes), da manipolare per ottenere le cifre decimali con la formula
Num.
R
------- (Kg) = Q (Kg) + -------- (Kg)
Den.
Den.
Uso il secondo addendo per ricavare i multipli di 10 di grammi. Considerando che in 1 Kg
ci sono 100 volte 10 grammi ottengo:
R
R * 100
R*25
-------------- (Kg) = --------------- (dag) = --------- (dag)
1024
1024
256
Perciò il resto dovrà ancora essere PRIMA moltiplicato per 25 E POI diviso per 256 e
fornirà un quoziente Q’ rappresentante le cifre decimali, in multipli di decagrammi, del
peso reale. Il formato del numero Q’ dipende dal linguaggio usato, programmando in
assembler sarà di un byte (vedi nota successiva), programmando in C o Basic sarà di 2
bytes, comunque di valore inferiore a 100.
Questo Q’ dovrà essere convertito in BCD o ASCII a seconda del tipo di display (per amor
di precisione andrebbe anche arrotondato).
Nota non trascurabile
Nel calcolo dei decimali ho volutamente cercato di avere il denominatore di valore 256
perché è potenza di 2 e questo mi permette di evitare una routine di divisione che è
sempre piuttosto lenta. Avendo il denominatore uguale a 2 8 , per dividere il prodotto dovrei
fare 8 rotazioni verso destra dello stesso, ma è evidente che è inutile, è come cambiare di
8.9
posto i 2 bytes del numero6. Basta prendere il byte più significativo per avere già il
quoziente Q’ o il meno significativo per avere il secondo resto7.
Uso delle routines di utilità per l’invio dei dati a un LCD
Dobbiamo inviare a un display la parte intera Q e quella decimale Q’ separate da un
punto.
La parte intera, Q, è numero di 2 bytes di cui non scriverei gli 0 a sinistra, perciò se si
programma in assembler si può usare la routine WRIUILCD del file utP16_1Tck1.asm; se
si programma in Basic della Oshon si può usare la routine wrinintnoz del file
utlcd80b0.bas. Entrambe queste routines faranno la conversione binario-->BCD-->ASCII e
poi invieranno i numeri al display sopprimendo gli 0 superflui
La parte decimale Q’ è un numero binario di 1 o 2 bytes a seconda del linguaggio usato,
comunque il suo valore è al massimo 99, per cui dopo la conversione in ASCII solo due
cifre saranno da inviare al display, anzi, tassativamente 2. Per farlo si può usare la routine
WRIUCHND del file utP16_1Tck1.asm, oppure la routine wrinchnc del file utlcd80b0.bas.
Per inviare il punto decimale si può usare la wriascLCD programmando in assembler, o la
wriasclcd programmando in Basic, dei soliti due files.
8.6 Il problema dei numeri negativi
Gli operatori matematici fra numeri interi ‘/’ e ‘%’ (% equivale al MOD del Basic) causano
problemi perché gestiscono i numeri come se fossero positivi anche quando dovrebbero
essere negativi. Il primo (/) dà il quoziente troncato, il secondo (% o MOD) non dà valori
negativi.
Per questo un programma ben sviluppato dopo l’effettuazione dei predetti calcoli dovrebbe
controllare se il quoziente ottenuto è negativo e, in questo caso, incrementarlo, poi,
rendere negativo anche il resto calcolandone il complemento a 10.
Un esempio, dettato dall’esperienza, per chiarezza: un programma che dovrebbe dare –
8,75 senza le correzioni dette darebbe –9,2.
Il numero –9 è in due bytes in complemento a 2, cioè FFF7H; avendo il bit più significativo
a 1 si capisce che è negativo e, come ho detto, andrebbe incrementato portandolo a
FFF8H (complemento a due di –8), valore corretto.
La parte decimale (0,2) non è corretta perché le routines di divisione gestiscono i numeri
come se fossero positivi e, una volta stabilita questa proprietà, bisognerebbe calcolare il
complemento a 10, cioè 10-2=8 (trascurando l’arrotondamento).
Va tenuto presente che se servono due cifre dopo la virgola il complemento a 10 è (100n), se le cifre sono 3 è (1000-n).
6
Notare che anche 1024 è potenza di 2 per cui potrei effettuare la divisione per 2 10 usando dieci (o anche solo due) rotazioni a destra
per ottenere il quoziente.
7
Il secondo resto, poi, permette pure di fare facilmente l’arrotondamento di Q’ infatti se il resto supera il valore 127 (cioè se ha il bit
più significativo=1) indica che bisogna incrementare Q’.
8.10
Esempio: Uso di un ADC a 12 bit per misurare una temperatura fra –10°C e
+150°C
Trascurando le incertezze introdotte dal circuito di condizionamento del segnale, la
sensibilità dello strumento sarebbe data dalla risoluzione dell’ADC: 160/4096=0,039°C;
per correttezza scelgo di esibire i decimi di grado.
Pongo Treale=Tr (valore da ricavare), e il numero fornito dall’ADC=Ni.
Gestione matematica:
Dalla [8.2] :
(Tr-Tmin)/(Tmax-Tmin) = Ni/4096
Ricavo (matematicamente) :
Tr=((Ni*(Tmax-Tmin)/4096 + Tmin
Sostituendo i valori :
Tr=Ni*160/4096+(-10)
Algoritmo di base:
Uso gli operatori del linguaggio C (per usare il Basic sostituire % con MOD):
Calcolo la parte intera:
1° moltiplico
PROD=Ni*160
//N.B. PROD vuole 3 bytes (4095*160=655200)
2° trovo il quoziente:
QUOZ=PROD/4096 //si può usare PROD>>10 oppure shiftright(PROD,10)
3° sommo (numeri in complemento a 2):
QUOZ1=QUOZ+Tmin
//QUOZ è la parte intera della temperatura,
(numero di 2 bytes senza segno) QUOZ1 è un numero con segno
4° controllo se devo incrementare
Se
QUOZ1<0 allora QUOZ1 = QUOZ1+1
//se QUOZ1 è negativo lo incremento
Calcolo la parte decimale
5° calcolo il resto
RESTO = PROD%4096 //in BASIC è PROD MOD 4096 (siccome PROD è
di 3 bytes anche RESTO è di 3 bytes)
6° calcolo i decimi
(1° parte)
RESTO = RESTO * 10
//valore max=655200*10
(2° parte)
RESTO=RESTO/4096
//resto diventa di 2 bytes (vedi punto 2°)
7° controllo se devo fare il complemento a 10:
Se
QUOZ1<0 allora RESTO=10-RESTO
8.11
Commenti:
La nota del punto 1 fa capire che se l’ADC è a 10 bit per avere un prodotto di 2 bytes si
può arrivare a una temperatura di fondoscala di 64°C (verificare8)
I calcoli eseguiti al punto 2 e 5 lanciano la stessa routine che fornisce sia quoziente che
resto contemporaneamente, per cui programmando a basso livello il programma
impiegherebbe metà tempo.
Se non si è in grado di capire qual è l’estensione degli operandi è meglio usare sempre
numeri di 3 o 4 bytes9 e un ambiente di sviluppo adeguato. Però se bisogna fare, anche,
delle moltiplicazioni è meglio usare i PIC18 che per queste sono molto più veloci.
8
9
1023*64=65472
Vedi il file 7a-Routines utilità asm
8.12
Scarica