Vai Indietro   PcTuner Forum > Sezione Hardware > Programmazione PIC
Arcade Registrazione Blogs Regolamento Feedback FAQ Lista Utenti Calendario Segna come Letti

Ultimi 5 blog pubblicati su PcTuner Blog
Data Titolo

Rispondi
 
Strumenti Discussione Modalità Visualizzazione
Vecchio 19-02-2007, 19.20.50   #1
Registered User
 
L'avatar di  Teo.87
 

Iscritto da: 19-02-2007
Messaggi: 7
Feedback: (0)
*** 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!
Teo.87 Non in Linea   Rispondi Citando
Vecchio 19-02-2007, 19.39.16   #2
Registered User
 

Iscritto da: 02-02-2007
Messaggi: 421
Feedback: (0)
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
Io trovo molto più comodo ragionare sui fondoscala (a patto che non ci siano fattori moltiplicativi dovuti a scelte particolari di Vref di cui tener conto, ma anche questo è facile). Il tuo ADC ha un fondoscala di 1023 e tu vuoi un fondoscala, diciamo, di 5000 (5000 mV).

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.
talon75 Non in Linea   Rispondi Citando
Vecchio 19-02-2007, 20.07.01   #3
Registered User
 
L'avatar di  Teo.87
 

Iscritto da: 19-02-2007
Messaggi: 7
Feedback: (0)
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)?
Teo.87 Non in Linea   Rispondi Citando
Vecchio 19-02-2007, 20.12.14   #4
Registered User
 
L'avatar di  FluidGuitar
 

Iscritto da: 04-01-2001
Locazione: Torino
Messaggi: 3,592
Feedback: (0)
Quote:
Originariamente inviato da Teo.87
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)?

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!
FluidGuitar Non in Linea   Rispondi Citando
Vecchio 19-02-2007, 20.17.01   #5
Registered User
 
L'avatar di  Teo.87
 

Iscritto da: 19-02-2007
Messaggi: 7
Feedback: (0)
Grazie per il benvenuto. Il mio problema è che non riesco a scrivere una routine per eseguire una somma o una differenza con numeri a 16bit avendo a disposizione solo registri a 8bit (pic16f876).
Teo.87 Non in Linea   Rispondi Citando
Vecchio 19-02-2007, 20.20.07   #6
Kill the fight !
 
L'avatar di  Beppe82
 

Iscritto da: 07-09-2001
Messaggi: 10,251
Feedback: (0)
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)
Beppe82 Non in Linea   Rispondi Citando
Vecchio 19-02-2007, 20.22.18   #7
Registered User
 
L'avatar di  FluidGuitar
 

Iscritto da: 04-01-2001
Locazione: Torino
Messaggi: 3,592
Feedback: (0)
Quote:
Originariamente inviato da Teo.87
Grazie per il benvenuto. Il mio problema è che non riesco a scrivere una routine per eseguire una somma o una differenza con numeri a 16bit avendo a disposizione solo registri a 8bit (pic16f876).
E l'ho capito che il tuo problema è questo!
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!
FluidGuitar Non in Linea   Rispondi Citando
Vecchio 19-02-2007, 20.23.22   #8
Registered User
 
L'avatar di  FluidGuitar
 

Iscritto da: 04-01-2001
Locazione: Torino
Messaggi: 3,592
Feedback: (0)
Quote:
Originariamente inviato da Beppe82
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)
Ecco, questo è quello che intendevo quando dicevo: "potrebbe non valerne la pena"
__________________

Tu non sai niente, Jon Snow!
FluidGuitar Non in Linea   Rispondi Citando
Vecchio 19-02-2007, 20.26.13   #9
Registered User
 

Iscritto da: 02-02-2007
Messaggi: 421
Feedback: (0)
Quote:
Originariamente inviato da Teo.87
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)?
Sì, in assembly hai perfettamente ragione. Trovi molti esempi, anche nelle application notes della Microchip (sezione Algorithms > Math) su come fare. Se vuoi farti un'idea per niente ottimizzata, ma autoproducibile senza grossi sforzi, puoi lavorare per addizioni successive:
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.
talon75 Non in Linea   Rispondi Citando
Vecchio 19-02-2007, 20.57.49   #10
Registered User
 
L'avatar di  Teo.87
 

Iscritto da: 19-02-2007
Messaggi: 7
Feedback: (0)
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!
Teo.87 Non in Linea   Rispondi Citando
Rispondi 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

Regole di scrittura
non Puoi inserire messaggi
non Puoi rispondere ai messaggi
non Puoi inviare allegati
non Puoi modificare i tuoi messaggi

codice vB è Attivo
Smilies è Attivo
[IMG] il codice è Attivo
Il codice HTML è Disattivato
Trackbacks are Disattivato
Pingbacks are Disattivato
Refbacks are Disattivato
Vai al Forum


Tutti gli Orari sono GMT +2. Attualmente sono le 09.36.35.


Powered by vBulletin Versione 3.6.12
Copyright ©2000 - 2013, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.2.0
Copyright © 2010 - Master New Media S.r.l. a socio unico - P.I. 02947530784. Tutti i diritti di proprietà letteraria e artistica sono riservati- Privacy
www.pctuner.net è testata telematica registrata presso il Tribunale di Torino, n. 39 del 07.05.2008, Editore Master New Media S.r.l.