|
|
|
||||||||
| Arcade | Registrazione | Blogs | Regolamento | Feedback | FAQ | Lista Utenti | Calendario | Segna come Letti |
| Ultimi 5 blog pubblicati su PcTuner Blog | ||||||
|
||||||
![]() |
|
|
Strumenti Discussione | Modalità Visualizzazione |
|
|
#1 |
|
Registered User
|
*** Divisione aritmetica fra due dati da 16bit ***
Salve a tutti!!
Per la tesina di fine anno ho pensato di progettare e magari realizzare un termometro con un PIC16f876, una sonda LM35 e un display LCD. Per ora tutto ok. Il problema è sorto nel momento in cui stavo scrivendo il programma: l'ADC interno è impostato per funzionare a 10bit ma per poter convertire il dato dell'ADC in temperatura bisogna prima eseguire questa divisione --> 1024/+Vref=k che poi va sottratta diverse volte al dato dell'ADC finchè non diventa negativo. Alla fine la temperatura è pari alle volte in cui si è sottratto k. Il mio problema è che non riesco a fare una routine per questa sorta di divisione fra due dati da 16bit!! Qualcuno mi aiuti!!! ![]() Un saluto a tutti e GRAZIE! |
|
|
|
|
|
#2 |
|
Registered User
|
Come punto di partenza potresti dire quale sia il linguaggio in cui stai sviluppando, non credi?
Poi le sottrazioni successive di cui parli non sono altro che una divisione... Per calcolare 14 / 3 posso anche iterare la sottrazione di 3: Codice:
14 - 3 = 11 ok (1) 11 - 3 = 8 ok (2) 8 - 3 = 5 ok (3) 5 - 3 = 2 ok (4) 2 - 3 = -1 STOP Avrai allora: val_ADC : 1023 = val_scalato : 5000 quindi val_scalato = val_ADC * 5000 / 1023 Se ci pensi questo è esattamente lo stesso procedimento che segui tu (nella tua formula Vref = 5000). Ho scritto qualcosa di molto simile, con il codice in C, una decina di giorni fa. Ultima Modifica di talon75 : 19-02-2007 19.41.42. |
|
|
|
|
|
#3 |
|
Registered User
|
scusami talon ma è la prima volta che scrivo su questo forum....Cmq io utilizzo l'assembler. Mi sembra ke sia molto più semplice fare la moltiplicazione per la costante piuttosto della divisione. Ma come faccio a fare la moltiplicazione con un numero da 16 bit (risultato ADC a 10bit)?
|
|
|
|
|
|
#4 | |
|
Registered User
|
Quote:
Ciao Teo, benvenuto su PcTuner ![]() Sei sicuro di aver REALMENTE bisogno di fare la conversione (per inciso così come una divisione è una successione di sottrazioni, la moltiplicazione è una successione di addizioni)? Che caratteristiche deve avere questo termometro? ![]() ![]() ![]() Tu non sai niente, Jon Snow! |
|
|
|
|
|
|
#6 |
|
Kill the fight !
|
approccio sbagliato direi?
hai le tue N cifre significative espresse in decimale equivalenti all'LSB della conversione espresso il °C le sommi con riporto decimale tante volte quante il numero risultante dalla conversione ottieni quindi direttamente le cifre decimali della temperatura (parte intera + parte decimale) |
|
|
|
|
|
#7 | |
|
Registered User
|
Quote:
Quello che ti chiedevo è se vale realmente la pena mettersi a scrivere le rouitines per fare la somma su 16 bit. Cmq, ammesso che ne valga la pena, gestire i numeri a 16 bit è scomodo ma non impossibile. Devi semplicemente fare la somma byte a byte gestendo i riporti manualmente andando a checkare il bit di carry dello status register. A tal proposito ti faccio notare che sommando i due numeri più grandi che puoi avere su 8 bit (cioè FF+FF) otterrai al massimo un bit di riporto ![]() ![]() ![]() ![]() Tu non sai niente, Jon Snow! |
|
|
|
|
|
|
#8 | |
|
Registered User
|
Quote:
![]() ![]() ![]() ![]() Tu non sai niente, Jon Snow! |
|
|
|
|
|
|
#9 | |
|
Registered User
|
Quote:
x * y equivale a sommare x y volte. In realtà ciò che si fa per lavorare decentemente è analogo a quello che fai quando moltiplichi in base 10: parti con un "accumulatore" a 32 bit inizializzato a 0 e con il moltiplicando incapsulato in quattro byte. (*) Se la cifra meno significativa del moltiplicatore è 1 allora sommi il moltiplicando all'accumulatore, se è 0 non fai nulla. Fatto ciò esegui uno shift a destra del moltiplicatore (in modo che la "nuova" cifra meno significativa sia dell'ordine di grandezza superiore) ed uno shift a sinistra del moltiplicando (questo equivale a porre il "segnaposto" nell'incolonnamento della moltiplicazione classica, in base 10: anche qui, in base 2, ti sposti di una posizione a sinistra) e ripeti la verifica al punto (*). Prosegui finché il moltiplicatore è diverso da 0. In questo modo esegui al massimo 16 iterazioni, mentre lavorando a somme successive puoi arrivare a farne 65535 ![]() Ultima Modifica di talon75 : 19-02-2007 20.29.13. |
|
|
|
|
|
|
#10 |
|
Registered User
|
Adesso provo a completare il programma con le vostre dritte...Scusatemi per la mia ignoranza su questi argomenti ma è meno di un anno ke uso il pic e non sono molto ferrato...diciamo ke me la cavicchio...Grazie mille!
|
|
|
|
![]() |
Per le vostre immagini su questo forum potete usare PcTunerUp! Iscriviti gratuitamente alla nostra newsletter. |
| Utenti attualmente attivi che stanno leggendo questa discussione: 1 (0 utenti e 1 visitatori) | |
| Strumenti Discussione | |
| Modalità Visualizzazione | |
|
|