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 20s) 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=125s. 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 25v/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