PIC e getione numeri negativi a 12 bit

Ciao a tutti, ho un sensore di temperatura (DS 1631) che mi fornisce una temperatura a 12 bit, organizzata in due byte in questa maniera:

1 byte: Segno 2^6 2^5 2^4 2^3 2^2 2^1 2^0 2 byte: 2^-1 2^-2 2^-3 2^-4 0 0 0 0

Ora, devo gestire la visualizzazione della temperatura su un LCD, e ho pensato di convertire il numero in BCD, utilizzando la routine presente nelle Application Notes di Microchip. Non ho problemi nella conversione di un numero positivo: S è 0, e quindi prendo il primo byte (che praticamente mi da la parte intera) e la converto in BCD. Per la parte in virgola fissa (il 2° byte quindi) ho implementato una specie di LUT, look up table, e va benone, visto che ci sono solo16 casi possibili (solo 4 byte infatti determinano la parte decimale della temperatura, ad ogni modo accetto suggerimenti).

Il problema nasce quando devo visualizzare dei numeri negativi, codificati in complemento a 2, in cui il complemento a 2 è gestito solo sui 12 bit significativi (i quattro zeri del secondo byte sono fissi, non cambiano mai). Cioè ad esempio -25.0625 è: 1110 0110 1111 0000 Ora, io ho pensato di controllare il bit di segno, e se è negativo visualizzo il - sullo schermo, dopodichè converto il dato di 12 bit nella codifica senza segno, e da qui visualizzo nuovamente il numero positivo, come già implementato. Cioè, inverto i 12 bit del negativo e sommo 1. -25.0625 diventerebbe: 0001

1001 0000 + 1 --> 0001 1001 0001 Cosa ne pensate? C'è senza dubbio un metodo migliore per visualizzare sull'LCD la temperatura...

Ad ogni modo, usando questo metodo ho un problemino: come sommo 1 ad un numero di 12 bit? Devo fare uno shift a destra di 4 bit dei due registri in cui memorizzo i 16 bit, in modo da portare gli 8 bit meno significativi in un unico byte di memoria, e gli altri 4 nell'altro? Come gestisco il riporto fra i due "pezzi"? Il riporto verso gli altri 4 bit mi salta fuori solo se i primi 8 sono tutti 1 giusto? Una volta eseguita la somma dovrei, naturalmente, shifttare di 4 posti a sinistra, per riportarmi alla situazione "standard" del mio progetto.... Funziona ?

Non c'è un metodo più elegante? Grazie a tutti! Nick

Reply to
Nick
Loading thread data ...

Bè, non è così male...

cut

Forse è possibile sommare un bit in 5° posizione (ovvero 1 0000) lasciando invariato il formato dei due byte piuttosto che shiftare + sommare 1 + rishiftare di nuovo. In ogni caso, fai la somma sul byte meno significativo, poi controlli se la somma ha generato un riporto e, in questo caso, sommi un LSB (ovvero un 1) al byte più significativo.

Saluti

--
Posted via Mailgate.ORG Server - http://www.Mailgate.ORG
Reply to
Alibaba

"Nick" ha scritto nel messaggio news:FLUVa.1116$ snipped-for-privacy@news1.tin.it...

in

riporto

i

Ciao, così, al volo, senza responsabilità!!! Non l'ho provato! Creati una macro per la somma a 16 bit tra una variabile a 16 bit e un numero a 16 bit:

----------------------------------------------------------------------------

-------------- ; Somma a 16 bit (var = var + n) (n1 parte meno pesante, n2 parte più pesante) ;---------------------------------------------------------------------------

--------------- Addlf16 macro var,n2,n1 movlw n1 addwf var,f btfsc STATUS,C incf var+1,f movlw n2 addwf var+1,f endm

in n1 metterai il binario "0001000", mentre in n2 metterai "00000000"; in var andrà la parte meno pesante della codifica a 12 bit, mentre in var+1 la parte più pesante. Eseguendo la somma in questo modo, non devi shiftare e non devi preoccuparti del riporto in quanto si aggiusta tutto. Come ti ho detto, io non ho provato, ma dovrebbe funzionare. Prova e fammi sapere

Reply to
helpic

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.