Newsgroup: it.hobby.elettronica.digitale
Titolo: Routine di conversione valori Hex -> Dec 6 cifre (la più rapida possibile)

Qualcuno conosce, o ha sviluppato, una routine per il micro
PIC16F84 che permette di convertire in modo rapido un valore
esadecimale a 6 cifre in decimale a 6 cifre?
Ho realizzato tale routine ma il problema č che richiede tanti
cicli di elaborazione con conseguente rallentamento del programma.
Vi faccio un esempio:
devo convertire il valore 01 A9 96h nel valore corrispondente
decimale 108950; per farlo la mia routine decrementa il valore
esadecimale e contemporeaneamente incrementa le 6 variabili
(cifre) del valore decimale; č ovvio che deve fare 108950 cicli
con molti altri cicli subroutine delle cifre, moltiplicato per il
tempo richiesto da ogni ciclo... risultato: ogni volta che deve
convertire i valori impiega poco piů di 1 secondo che nel mio
progetto č un tempo troppo lungo.
A qualcuno č capitata questa situazione?
Grazie anticipatamente.
Rossano
--
psss. togli NOGRAZIE per rispondermi!! ;]
--


Ciao mi chiamo Paride.
Dunque, non mi é mai capitata una situazione del genere.
Peró mi permetto di darti un consiglio:
non so se hai scritto il programma in C o in ASM, ma se hai usato il C 
prova a guardare il list con l'ASM prodotto dal compilatore.
Spesso i compilatori per fare 2+2 fanno eseguire al pic una infinitá di 
poerazioni intermedie che non servono a niente.
Un mio ex collega é riuscito a far fare ad un PIC16F84 una moltiplicazione 
di 2 interi a 32bit in metá istruzioni di quelle proposte dal compliatore 
(si é riscritto la routine tutta in ASM).
Spesso la mente umana riesce a trovare strade che la tecnolofia non riesce.
P.S.: non esiste un compliatore che ti produca codice ottimizzato al 100%.
Ciao Paride

 A qualcuno č capitata questa situazione?


psss. togli NOGRAZIE per rispondermi!! ;]
Se ho ben capito tu hai il valore di un numero espresso in esadecimale
sotto forma di Stringa "01 A9 96" e lo vuoi trasformare in un'altra
Stringa pero' con rappresentazione decimale "108950".
Il programma fatto non ce l'ho ma ti posso indicare l'algoritmo :
A partire dalla stringa Esadecimale ti costruisci il numero vero
e proprio a 32 bit (cosidero che il numero esadecimale sia del tipo
00 00 00 00). Questo lo puoi fare agevolmente con somme e shift
su 32 bit.
In pratica prendi la cifra piu' significativa, la shifti a sinistra di
28 bit. Poi gli sommi la cifra seguente shiftata di 24 bit e cosi' via
fino alla prima.
In questo modo devi fare 7 Shift e 7 somme.
Ora hai la cifra in binario a 32 bit.
Per trasformarla in una stringa decimale procedi cosi' :
Sottrai 1000000000 dal numero fino a quando ottieni un numero
negativo. Il numero di sottrazioni che hai dovuto fare e' la cifra
decimale piu' significativa.
Risommi 1000000000 al risultato.
Sottrai 100000000 dal numero fino a quando ottieni un numero
negativo. Il numero di sottrazioni che hai dovuto fare e' la cifra
seguente.
Risommi 100000000 al risultato.
Avanti cosi' fino alla prima cifra.
Nel caso piu' sfigato devi fare 90 sottrazioni.
In questo modo dovresti metterci pochi millisecondi a fare tutto.
Spero di essere stato sufficientemente chiaro.
Ciao, Massimo - IW1FDX
E-Mail    
max...@libero.it
Visita la pagina dedicata ai microcontrollori ST62
all'indirizzo 
http://digilander.iol.it/max4000

 been using some of the routines posted here to divide by 10 several times...
Date:	 19970630
From:	 
btr...@fh.us.bosch.com
To:	 
Mot-68H...@freeware.mcu.motsps.com
Subject: Re: Simpler method to output 24bits in decimal
.....
--------------------------------------------------
A simple algorithm to convert binary to BCD is:
1. Add 3 to every BCD nibble that's >=5
2. Shift left
Repeat until binary portion is all 0000
Example:  Convert $F9 to BCD
                    F    9
0000 0000 0000 : 1111 1001
0000 0000 0001 : 1111 0010  (shift left)
0000 0000 0011 : 1110 0100  (shift left)
0000 0000 0111 : 1100 1000  (shift left)
0000 0000 1010 : 1100 1000  (add 3)
0000 0001 0101 : 1001 0000  (shift left)
0000 0001 1000 : 1001 0000  (add 3)
0000 0011 0001 : 0010 0000  (shift left)
0000 0110 0010 : 0100 0000  (shift left)
0000 1001 0010 : 0100 0000  (add 3)
0001 0010 0100 : 1000 0000  (shift left)
0010 0100 1001 : 0000 0000  (shift left)
   2    4    9
And the left now holds BCD 249.
MUCH easier than messing with IDIV and FDIV!!!
  o o o o o o 
tutto qui. Si puo'fare perfino con quella lumaca dell' ST6: da prove
che ho fatto impiega 4.8ms per convertire 16 bit e circa 20ms per
convertirne 32. Con 6bcd cioe' 24 bit quindi servono meno di 20ms.  


Premetto che il numero esadecimale non č una stringa ma bensě 3
variabili: 01 (che rimane sempre costante con tutti i valori che
devo trattare), A9 e 96.
Fanno parte di un "treno" di 18 bit che impostano il divisore
seriale di un PLL.
Comunque mi hai dato una bella idea su come realizzare la routine:
sottrarre 100000, se il risultato č negativo passa a sottrarre
10000, poi 1000 fino a 1; ad ogni "passaggio" incrementa le
singole 6 cifre.
Grazie mille.
Ciao alla prossima.
Rossano